资源描述
Tiny6410 的内核移植(拿来主义)
开发环境
宿主机: vista+VMware+ fedoral13(win7下虚拟机)
编译器: 友善自带arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz
开发板: tiny6410,核心板号1106 NAND 2G RAM 256M
注意:移植内核时,确保引导文件为u-boot类型,否则到后面下载到开发板使会出现乱码以及不必要的错误
移植nand_flash
1 下载linux-2.6.38的源码
ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.38.tar.bz2
2 解压
#tar xvfj /mnt/ubuntu/linux-2.6.38.tar.bz2 -C .
3 修改根下的Makefile
#vi Makefile
191行改为
ARCH ?= arm
CROSS_COMPILE ?= arm-linux- (找到其交叉编译环境)
4 生成默认配置文件
#cp arch/arm/configs/s3c6400_defconfig .config
(如果省略的话,后面会找不到System Type)
5 修改配置项(基本配置)
#make menuconfig
General setup->(/usr/4.5.1/bin/arm-linux-) Cross-compiler tool prefix 我将编译器解压到了/opt/Friendly/ toolschain/4.5.1/bin目录(如果第三步中以修改“CROSS.complier ? = arm-linux- ”此项,这步可以不作)
System Type->[*] MINI6410 选上,其他的可以去掉,不确定的可以参考友善之臂的(这样编译出来的内核是可以被uboot引导的,然后是增加nand flash支持)
vi arch/arm/mach-s3c64xx/mach-mini6410.c
第117行
struct mtd_partition mini6410_nand_part[] = {
{
.name = "Bootloader",
.offset = 0,
.size = (4 * 128 *SZ_1K),
.mask_flags = MTD_CAP_NANDFLASH,
},
{
.name = "Kernel",
.offset = (4 * 128 *SZ_1K),
.size = (5*SZ_1M) ,
.mask_flags = MTD_CAP_NANDFLASH,
},
{
.name = "File System",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
}; //update at 2011-8-26 经过测试发现,这里改完后根本不起作用,甚至将整个注释也无妨,估计分区已经固死在后面的s3c_nand_mlc.fo中
6 拷贝NAND FLASH驱动
(将6410内核中的如下文件拷到相应的目录下)
需拷贝文件:
drivers/mtd/nand/s3c_nand.c
arch/arm/plat-samsung/include/plat/regs-nand.h 覆盖掉
drivers/mtd/nand/s3c_nand_mlc.fo
《s3c_nand_mlc.fo友善没有开源的一个驱动之一,所以不用研究了,拷过来就是了。》
drivers/mtd/nand/nand_base.c 覆盖掉
当然如果想手动修改的话见附件1
drivers/mtd/nand/Kconfig 覆盖掉
详细请见附件2
7 drivers/mtd/nand/Makefile中20行增加
obj-$(CONFIG_MTD_NAND_S3C) += s3c_nand.o
末尾再增加
S3C_NAND_MLC_SRC = $(shell ls drivers/mtd/nand/s3c_nand_mlc.c 2>/dev/null)
ifeq ($(S3C_NAND_MLC_SRC),)
obj-$(CONFIG_MTD_NAND_S3C) += s3c_nand_mlc.fo
else
obj-$(CONFIG_MTD_NAND_S3C) += s3c_nand_mlc.o
endif
这步要是不愿意改的话,直接拷贝覆盖即可覆盖掉
8 然后再make menuconfig
Device Drivers--->
<*> Memory Technology Device (MTD) support --->
[*] MTD partitioning support
[*] Command line partition table parsing
<*> Direct char device access to MTD devices
<*> Caching block device access to MTD devices
<*> NAND Device Support --->
< > NAND Flash support for Samsung S3C SoCs 去掉不要选
<*> NAND Flash support for S3C SoC
[*] S3C NAND Hardware ECC
9 编译
Make
如果顺利通过则出现如下信息:
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
AS arch/arm/boot/compressed/head.o
GZIP arch/arm/boot/compressed/piggy.gzip
AS arch/arm/boot/compressed/piggy.gzip.o
CC arch/arm/boot/compressed/misc.o
CC arch/arm/boot/compressed/decompress.o
SHIPPED arch/arm/boot/compressed/lib1funcs.S
AS arch/arm/boot/compressed/lib1funcs.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
Building modules, stage 2.
MODPOST 16 modules
10 下载到开发板
Make后生成的内核文件(zimage)在/arch/arm/boot/ 下。将其共享或者通过其他方式放到window下并将开发板与pc连接利用dns工具下载至开发板,按b重起开发板,测试内核是否正确编译、移植。
此时可能出现如下问题:
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
VFS: Cannot open root device "ubi0:FriendlyARM-root" or unknown-block(0,0)
Please append a correct "root=" boot option; here are the available partitions:
1f00 4096 mtdblock0 (driver?)
1f01 8192 mtdblock1 (driver?)
1f02 2084864 mtdblock2 (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[<c002bc04>] (unwind_backtrace+0x0/0xe4) from [<c01aca28>] (panic+0x50/0x16c)
[<c01aca28>] (panic+0x50/0x16c) from [<c0008ea8>] (mount_block_root+0x238/0x288)
[<c0008ea8>] (mount_block_root+0x238/0x288) from [<c00090e0>] (prepare_namespace+0x88/0x1b4)
[<c00090e0>] (prepare_namespace+0x88/0x1b4) from [<c0008b2c>] (kernel_init+0x108/0x148)
[<c0008b2c>] (kernel_init+0x108/0x148) from [<c0027508>] (kernel_thread_exit+0x0/0x8)
OK //在此卡住不动了
其中红色部分表示找不着系统文件,因为tiny6410 的系统文件为ubifs格式,所以下面我们要将ubifs系统文件驱动移植到内核中
移植UBIFS驱动
配置内核支持UBIFS
Device Drivers --->
Memory Technology Device (MTD) support --->
UBI - Unsorted block images --->
Enable UBI
配置mtd支持UBI接口
File systems --->
Miscellaneous filesystems --->
UBIFS file system support
再次Make
#make
下载到开发板
如果成功,如下图:
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
mmc0: mmc_rescan_try_freq: trying to init card at 300000 Hz
mmc0: mmc_rescan_try_freq: trying to init card at 200000 Hz
UBIFS: recovery needed
usb 1-1: new full speed USB device using s3c2410-ohci and address 2
mmc0: mmc_rescan_try_freq: trying to init card at 100000 Hz
UBIFS: recovery completed
UBIFS: mounted UBI device 0, volume 0, name "FriendlyARM-root"
UBIFS: file system size: 2061287424 bytes (2012976 KiB, 1965 MiB, 1997 LEBs)
UBIFS: journal size: 12517376 bytes (12224 KiB, 11 MiB, 13 LEBs)
UBIFS: media format: w4/r0 (latest is w4/r0)
UBIFS: default compressor: lzo
UBIFS: reserved for root: 0 bytes (0 KiB)
VFS: Mounted root (ubifs filesystem) on device 0:10.
hwclock: can't open '/dev/misc/rtc': No such file or directory
[01/Jan/1970:00:00:18 +0000] boa.c:173 - unable to create socket: Function not implemented
open device leds: No such file or directory
/usr/sbin/alsactl: load_state:1610: No soundcards found...
ifconfig: socket: Function not implemented
Try to bring eth0 interface up......cat: can't open '/sys/class/net/eth0/address': No such file or directory
ifconfig: socket: Function not implemented
route: socket: Function not implemented
Done
(此时ifconfig等命令不能用,以及lcd)
移植网卡驱动
修改的dm9000网卡头文件
#vi include/linux/dm9000.h
28行增加
unsigned char param_addr[6];
修改dm9000的驱动文件
#vi drivers/net/dm9000.c
大概1586行
将mac_src = "platform data";
memcpy(ndev->dev_addr, pdata->dev_addr, 6);
改成
mac_src = "param data";
memcpy(ndev->dev_addr, pdata->param_addr, 6);
大概1598行
增加
if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) {
mac_src = "platform data";
memcpy(ndev->dev_addr, pdata->dev_addr, 6);
}
修改后如下图:
if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) {
//=======================hai-modified======================
#if 0
mac_src = "platform data";
memcpy(ndev->dev_addr, pdata->dev_addr, 6);
#endif
mac_src = "param data";
memcpy(ndev->dev_addr, pdata->param_addr, 6);
//============================================================
}
//================================hai-added==============
if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) {
mac_src = "platform data";
memcpy(ndev->dev_addr, pdata->dev_addr, 6);
}
//=============================================================
再次配置内核
#make menuconfig
[*] Networking support --->
Networking options --->
<*> Packet socket
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: kernel level autoconfiguration
[*] IP: DHCP support
[*] IP: BOOTP support
[*] IP: RARP support
Device Drivers --->
[*] Network device support --->
[*] Ethernet (10 or 100Mbit) --->
<*> DM9000 support
[ ] Ethernet (1000 Mbit) ---> 去掉
执行make编译
#make
如果顺利便利,结果会有如下信息:
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
GZIP arch/arm/boot/compressed/piggy.gzip
AS arch/arm/boot/compressed/piggy.gzip.o
SHIPPED arch/arm/boot/compressed/lib1funcs.S
AS arch/arm/boot/compressed/lib1funcs.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
Building modules, stage 2.
MODPOST 26 modules
下载到开发板
如果成功,如下图:
hwclock: can't open '/dev/misc/rtc': No such file or directory
[01/Jan/1970:00:00:18 +0000] boa: server version Boa/0.94.13
[01/Jan/1970:00:00:18 +0000] boa: server built Dec 30 2010 at 11:18:35.
[01/Jan/1970:00:00:18 +0000] boa: starting server pid=965, port 80
open device leds: No such file or directory
/usr/sbin/alsactl: load_state:1610: No soundcards found...
Try to bring eth0 interface up......eth0: link down
Done(此时网卡驱动已移植成功)
移植lcd屏驱动
增加行(如果用vi/gedit命令打不开或出现乱码则可能是解压文件错误,请重新减压)
vi arch/arm/plat-samsung/include/plat/map-base.h
第39行增加
#define S3C_VA_LCD S3C_ADDR(0x01100000) /* LCD */
复制
从友善的源码中将arch/arm/mach-s3c64xx/include/mach/regs-lcd.h拷贝过来
从友善的源码中将drivers/video/samsung整个文件夹拷贝过来
复制文件方法:#cp -arf 友善samsung路径 目的samsung路径
增加行
vi drivers/video/Kconfig
第2368行增加
source "drivers/video/samsung/Kconfig"
vi drivers/video/Makefile
120行增加
obj-$(CONFIG_FB_S3C_EXT) += samsung/
vi arch/arm/mach-s3c64xx/mach-mini6410.c
48行增加
#include <linux/delay.h>
191行mini6410_lcd_power_set函数里的内容改成
if (power) {
gpio_direction_output(S3C64XX_GPF(13), 1); //GPF13是USBpower用的,与lcd无关
gpio_direction_output(S3C64XX_GPF(15), 1); //GPF15是是真正的一线控制线连PWM1
/* fire nRESET on power up */
gpio_direction_output(S3C64XX_GPN(5), 0); //GPN5好像与lcd也无关,先copy吧
msleep(10);
gpio_direction_output(S3C64XX_GPN(5), 1);
msleep(1);
} else {
gpio_direction_output(S3C64XX_GPF(15), 0);
gpio_direction_output(S3C64XX_GPF(13), 0);
}
190行增加函数-------------default_bpp = 16,}, 的后面增加结构体:
static struct map_desc mini6410_lcd_iodesc[] = {
{
/* LCD support */
.virtual = (unsigned long)S3C_VA_LCD,
.pfn = __phys_to_pfn(S3C_PA_FB),
.length = SZ_16K,
.type = MT_DEVICE,
},
};
将mini6410_map_io()这个函数中的一个函数引用改成如下。
s3c64xx_init_io(mini6410_lcd_iodesc, ARRAY_SIZE(mini6410_lcd_iodesc));
378行增加
gpio_request(S3C64XX_GPN(5), "LCD power");
gpio_request(S3C64XX_GPF(13), "LCD power");
去掉gpio_request(S3C64XX_GPE(0), "LCD power");
#make menuconfig
Power management options --->
[ ] Power Management support 一定要去掉,不然会有drivers/video/samsung/s3cfb_fimd4x.c:1440:2: error: implicit declaration of function 's3c6410_pm_do_save'的错误。
Device Drivers --->
Graphics support --->
<*> Support for frame buffer devices --->
< > Samsung S3C framebuffer support
<*> S3CFramebufferSupport (eXtended)
Select LCD Type (4.3 inch 480x272 TFT LCD) --->
<*> Advanced options for S3C Framebuffer
Select BPP(Bits Per Pixel) (16 BPP) --->
(4) Number of Framebuffers (ctrl+<-修改)
[ ] Enable Virtual Screen (NEW)
[*] Enable Double Buffering //这个找不到,但是此为双缓冲, 也可以不选择,编译仍然可以通过。
[ ] Backlight & LCD device support --->
Console display driver support --->
<*> Framebuffer Console support 这个也一定要选,不然会有drivers/built-in.o:(.data+0x174): undefined reference to `soft_cursor'的错误、
[*] Bootup logo --->
[ ] Standard black and white Linux logo
[ ] Standard 16-color Linux logo
[*] Standard 224-color Linux logo
其他的默认就行
这时lcd的驱动其实已经移植好了,引导信息也正常,如
S3C_LCD clock got enabled :: 133.000 Mhz
LCD TYPE :: N43 will be initialized
Window[0] - FB1: map_video_memory: clear ff600000:0007f800
FB1: map_video_memory: dma=5d780000 cpu=ff600000 size=0007f800
Window[0] - FB2: map_video_memory: clear ff63fc00:0003fc00
FB2: map_video_memory: dma=5d7bfc00 cpu=ff63fc00 size=0003fc00
Console: switching to colour frame buffer device 60x34
fb0: s3cfb frame buffer device
Window[1] - FB1: map_video_memory: clear ff680000:0007f800
FB1: map_video_memory: dma=5cc00000 cpu=ff680000 size=0007f800
Window[1] - FB2: map_video_memory: clear ff6bfc00:0003fc00
FB2: map_video_memory: dma=5cc3fc00 cpu=ff6bfc00 size=0003fc00
fb1: s3cfb frame buffer device
Window[2] - FB1: map_video_memory: clear ff700000:0003fc00
FB1: map_video_memory: dma=5d740000 cpu=ff700000 size=0003fc00
fb2: s3cfb frame buffer device
Window[3] - FB1: map_video_memory: clear ff740000:0003fc00
FB1: map_video_memory: dma=5cc80000 cpu=ff740000 size=0003fc00
fb3: s3cfb frame buffer device
但lcd屏却没有反应,百思不得其解。后来终于发现了,过程明天在说
一线触摸的驱动移植
1.从友善的配套内核中复制一下文件到新内核的对应文件夹:
arch/arm/mach-s3c64xx/dev-ts-mini6410.c
arch/arm/mach-s3c64xx/include/mach/ts.h
arch/arm/plat-samsung/include/plat/regs-adc.h //覆盖
drivers/input/touchscreen/mini6410_1wire_host.c
drivers/input/touchscreen/mini6410-ts.c
drivers/input/touchscreen/ts-if.c
到相应目录
2.修改文件arch/arm/mach-s3c64xx/Makefile
vi arch/arm/mach-s3c64xx/Makefile
末尾增加
obj-$(CONFIG_TOUCHSCREEN_MINI6410) += dev-ts-mini6410.o
3. 修改文件drivers/input/touchscreen/Makefile
vi drivers/input/touchscreen/Makefile
末尾加入
obj-$(CONFIG_TOUCHSCREEN_MINI6410) += mini6410-ts.o
obj-$(CONFIG_TOUCHSCREEN_1WIRE) += mini6410_1wire_host.o
obj-$(CONFIG_FB_S3C_EXT_TFT800480) += ts-if.o
obj-$(CONFIG_FB_S3C_EXT_TFT480272) += ts-if.o
obj-$(CONFIG_FB_S3C_EXT_X240320) += ts-if.o
4. 修改drivers/input/touchscreen/Kconfig
vi drivers/input/touchscreen/Kconfig
190行左右加入(在190行左右config TOUCHSCREEN_S3C2410的配置项后面加入如下代码(菜单项):
注意!!!下面有缩进行当最左边的缩进至少需要一个TAB缩进。
错误如:[root@syd168 linux-2.6.38.des]# make menuconfig
scripts/kconfig/mconf Kconfig
drivers/input/touchscreen/Kconfig:204: unknown option "module"
make[1]: *** [menuconfig] Error 1
make: *** [menuconfig] Error 2
[root@syd168 linux-2.6.38.des]# gedit drivers/input/touchscreen/Kconfig
#=============hai================
config TOUCHSCREEN_MINI6410
tristate "S3C touchscreen driver for Mini6410"
depe
展开阅读全文