tiny6410内核移植

  • 格式:doc
  • 大小:342.50 KB
  • 文档页数:32

Tiny6410 的内核移植(拿来主义)开发环境宿主机: vista+VMware+ fedoral13(win7下虚拟机)编译器: 友善自带arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz开发板: tiny6410,核心板号1106 N AND 2G RAM 256M注意:移植内核时,确保引导文件为u-boot类型,否则到后面下载到开发板使会出现乱码以及不必要的错误移植nand_flash1 下载linux-2.6.38的源码ftp:///pub/linux/kernel/v2.6/linux-2.6.38.tar.bz22 解压#tar xvfj /mnt/ubuntu/linux-2.6.38.tar.bz2 -C .3 修改根下的Makefile#vi Makefile191行改为ARCH ?= armCROSS_COMPILE ?= arm-linux- (找到其交叉编译环境)4 生成默认配置文件#cp arch/arm/configs/s3c6400_defconfig .config(如果省略的话,后面会找不到System Type)5 修改配置项(基本配置)#make menuconfigGeneral setup->(/usr/4.5.1/bin/arm-linux-) Cross-compiler tool prefix 我将编译器解压到了/opt/Friendly/ toolschain/4.5.1/bin目录(如果第三步中以修改“plier ? = 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.carch/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 覆盖掉当然如果想手动修改的话见附件1drivers/mtd/nand/Kconfig 覆盖掉详细请见附件27 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.foelseobj-$(CONFIG_MTD_NAND_S3C) += s3c_nand_mlc.oendif这步要是不愿意改的话,直接拷贝覆盖即可覆盖掉8 然后再make menuconfigDevice 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 ECC9 编译Make如果顺利通过则出现如下信息:OBJCOPY arch/arm/boot/ImageKernel: arch/arm/boot/Image is readyAS arch/arm/boot/compressed/head.oGZIP arch/arm/boot/compressed/piggy.gzipAS arch/arm/boot/compressed/piggy.gzip.oCC arch/arm/boot/compressed/misc.oCC arch/arm/boot/compressed/decompress.oSHIPPED arch/arm/boot/compressed/lib1funcs.SAS arch/arm/boot/compressed/lib1funcs.oLD arch/arm/boot/compressed/vmlinuxOBJCOPY arch/arm/boot/zImageKernel: arch/arm/boot/zImage is readyBuilding modules, stage 2.MODPOST 16 modules10 下载到开发板Make后生成的内核文件(zimage)在/arch/arm/boot/ 下。

将其共享或者通过其他方式放到window 下并将开发板与pc连接利用dns工具下载至开发板,按b重起开发板,测试内核是否正确编译、移植。

此时可能出现如下问题:usbcore: registered new interface driver usbhidusbhid: USB HID core driverVFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5drivers/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驱动配置内核支持UBIFSDevice 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 usbhidusbhid: USB HID core driverVFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5drivers/rtc/hctosys.c: unable to open rtc device (rtc0)mmc0: mmc_rescan_try_freq: trying to init card at 300000 Hzmmc0: mmc_rescan_try_freq: trying to init card at 200000 HzUBIFS: recovery neededusb 1-1: new full speed USB device using s3c2410-ohci and address 2mmc0: mmc_rescan_try_freq: trying to init card at 100000 HzUBIFS: recovery completedUBIFS: 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: lzoUBIFS: 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 implementedopen device leds: No such file or directory/usr/sbin/alsactl: load_state:1610: No soundcards found...ifconfig: socket: Function not implementedTry to bring eth0 interface up......cat: can't open '/sys/class/net/eth0/address': No such file or directoryifconfig: socket: Function not implementedroute: socket: Function not implementedDone(此时ifconfig等命令不能用,以及lcd)移植网卡驱动修改的dm9000网卡头文件#vi include/linux/dm9000.h28行增加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 0mac_src = "platform data";memcpy(ndev->dev_addr, pdata->dev_addr, 6);#endifmac_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 supportDevice Drivers --->[*] Network device support --->[*] Ethernet (10 or 100Mbit) ---><*> DM9000 support[ ] Ethernet (1000 Mbit) ---> 去掉执行make编译#make如果顺利便利,结果会有如下信息:OBJCOPY arch/arm/boot/ImageKernel: arch/arm/boot/Image is readyGZIP arch/arm/boot/compressed/piggy.gzipAS arch/arm/boot/compressed/piggy.gzip.oSHIPPED arch/arm/boot/compressed/lib1funcs.SAS arch/arm/boot/compressed/lib1funcs.oLD arch/arm/boot/compressed/vmlinuxOBJCOPY arch/arm/boot/zImageKernel: arch/arm/boot/zImage is readyBuilding 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 80open device leds: No such file or directory/usr/sbin/alsactl: load_state:1610: No soundcards found...Try to bring eth0 interface up......eth0: link downDone(此时网卡驱动已移植成功)移植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/Makefile120行增加obj-$(CONFIG_FB_S3C_EXT) += samsung/vi arch/arm/mach-s3c64xx/mach-mini6410.c48行增加#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()这个函数中的一个函数引用改成如下。