1、 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/li
2、nux-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
3、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/m
4、ach-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 = "Kern
5、el", .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, } }; //upd
6、ate 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友善没有开源的一个驱动之一,所以不用研究了,拷
7、过来就是了。》 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
8、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 partitioni
9、ng 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 Fla
10、sh 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.gzi
11、p.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
12、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: impleme
13、ntor 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 (drive
14、r?)
1f01 8192 mtdblock1 (driver?)
1f02 2084864 mtdblock2 (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[
15、mount_block_root+0x238/0x288)
[
16、 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 fi
17、le 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 i
18、nit 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
19、 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
20、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/
21、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 no
22、t 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 da
23、ta"; 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)
24、 && 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); //===========================================
25、 } //================================hai-added============== if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) { mac_src = "platform data"; memcpy(ndev->dev_addr, pdata->dev_addr, 6); } //=====================================
26、 再次配置内核 #make menuconfig [*] Networking support ---> Networking options ---> <*> Packet socket <*> Unix domain sockets [*] TCP/IP networking [*] IP: kernel level autocon
27、figuration [*] IP: DHCP support [*] IP: BOOTP support [*] IP: RARP support Device Drivers ---> [*] Network device support ---> [
28、] 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/b
29、oot/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 下载到开
30、发板 如果成功,如下图: 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
31、 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/
32、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/sams
33、ung/Kconfig"
vi drivers/video/Makefile
120行增加
obj-$(CONFIG_FB_S3C_EXT) += samsung/
vi arch/arm/mach-s3c64xx/mach-mini6410.c
48行增加
#include
34、PF13是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);
35、 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_de
36、sc 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()这
37、个函数中的一个函数引用改成如下。 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 --->
38、 [ ] 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
39、 <*> S3CFramebufferSupport (eXtended) Select LCD Type (4.3 inch 480x272 TFT LCD) ---> <*> Advanced options for S3C Framebuffer Select BPP(Bits Per Pixel) (16 BPP) ---> (
40、4) Number of Framebuffers (ctrl+<-修改) [ ] Enable Virtual Screen (NEW) [*] Enable Double Buffering //这个找不到,但是此为双缓冲, 也可以不选择,编译仍然可以通过。 [ ] Backlight & LCD device support
41、> 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
42、 [ ] 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
43、 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 f
44、rame 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: s3c
45、fb 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
46、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/touchs
47、creen/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 v
48、i 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)
49、 += 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/
50、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






