移植Linux2.6.22.2到博创2410-S(s3c2410A)

  • 格式:doc
  • 大小:159.00 KB
  • 文档页数:24

一、将Linux2.6.22.2内核源码放到工作目录的kernel文件夹下,并解压。

#tar xzvf linux2.6.22.2.tar.gz#pwd/home/tekkaman/working/kernel# cd linux2.6.22.2进入内核解压后的目录,以后示例中,只要是相对路径全部是相对于/home/tekkaman/working/kernel/linux2.6.22.2/此目录二、修改内核源码根目录下的Makefile文件(CROSS_COMPILE=的值因个人情况而定,其他可以照做。

)#vi Makefile......#SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \#-e s/arm.*/arm/ -e s/sa110/arm/ \#-e s/s390x/s390/ -e s/parisc64/parisc/ \#-e s/ppc.*/powerpc/ -e s/mips.*/mips/ )......#ARCH ?= $(SUBARCH)#CROSS_COMPILE ?=ARCH = armCROSS_COMPILE =/home/tekkaman/working/crosstool-gcc410-k26222/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9t dmi-linux-gnu-三、修改arch/arm/plat-s3c24xx/common-smdk.c文件,修改NandFlash的分区信息和Nand Flash的硬件信息。

(LED 器件的初始化也在这个文件里,但是博创的平台没有那四个LED管,所以要不要那些程序都无所谓。

我就把它们放在那里,反正启动时不会有影响,也没有出错信息。

)注意:请不要画蛇添足地在进行自定义nand flash分区时仍然按照以前内核的移植步骤,在devs.c中自己添加分区信息,不然系统启动时会有出错信息:kobject_add failed for s3c2410-nand with -EEXIST, don't try to register things with the same name in the same directory.[<c00290a8>] (dump_stack+0x0/0x14) from [<c0110a9c>](kobject_shadow_add+0x160/0x1a8)[<c011093c>] (kobject_shadow_add+0x0/0x1a8) from [<c0110af8>] (kobject_add+0x14/0x18) [<c0110ae4>] (kobject_add+0x0/0x18) from [<c015117c>] (device_add+0xa0/0x568)[<c01510dc>] (device_add+0x0/0x568) from [<c0155180>](platform_device_add+0x100/0x150)[<c0155080>] (platform_device_add+0x0/0x150) from [<c01551f0>](platform_device_register+0x20/0x24)r7:c0022a10 r6:c0020a1c r5:00000000 r4:c02cab30[<c01551d0>] (platform_device_register+0x0/0x24) from [<c01553f8>](platform_add_devices+0x24/0x6c)r4:00000000[<c01553d4>] (platform_add_devices+0x0/0x6c) from [<c0011df4>](smdk_machine_init+0x84/0x98)r8:c03b8000 r7:00000000 r6:c0020a1c r5:00000000 r4:c0021404[<c0011d70>] (smdk_machine_init+0x0/0x98) from [<c0011178>] (smdk2410_init+0x1c/0x24) [<c001115c>] (smdk2410_init+0x0/0x24) from [<c000f0bc>] (customize_machine+0x20/0x2c) [<c000f09c>] (customize_machine+0x0/0x2c) from [<c0008914>] (kernel_init+0xb8/0x284) [<c000885c>] (kernel_init+0x0/0x284) from [<c003d688>] (do_exit+0x0/0x76c)我一开始就犯了这个毛病。

具体情况请参阅:/u/17218/showart_262438.html以及/arch/arm/plat-s3c24xx文件夹下的common-smdk.c和devs.c。

....../* NAND parititon from 2.4.18-swl5 */static struct mtd_partition smdk_default_nand_part[] = {[0] = {.name = "U-Boot-1.2.0",.size = SZ_128K,.offset = 0,},[1] = {.name = "U-Boot-1.2.0 Parameter",.offset = SZ_128K,.size = SZ_64K,},[2] = {.name = "Linux2.6.22.2 Kernel",.offset = SZ_128K+SZ_64K,.size = SZ_4M+(SZ_1M-SZ_128K-SZ_64K),},[3] = {.name = "Root-JFFS2",.offset = SZ_1M * 5,.size = SZ_1M * 5,},[4] = {.name = "Boot-Root(cramfs)",.offset = SZ_1M * 10,.size = SZ_1M * 10,},[5] = {.name = "YAFFS",.offset = SZ_1M * 20,.size = SZ_1M * 44,}/*,[6] = {.name = "S3C2410 flash partition 6",.offset = SZ_1M * 24,.size = SZ_1M * 24,},[7] = {.name = "S3C2410 flash partition 7",.offset = SZ_1M * 48,.size = SZ_16M,}*/};......static struct s3c2410_platform_nand smdk_nand_info = { .tacls = 0,.twrph0 = 30,.twrph1 = 0,.nr_sets = ARRAY_SIZE(smdk_nand_sets),.sets = smdk_nand_sets,};......四、修改drivers/mtd/nand/s3c2410.c,去掉nand flash 的ECC。

我的内核是通过U-BOOT写到Nand Flash的, U-BOOT 通过的软件ECC 算法产生ECC校验码, 这与内核校验的ECC码不一样, 内核中的ECC码是由S3C2410中Nand Flash控制器产生的。

所以,我在这里选择禁止内核ECC校验。

(不过我不了解内核中的ECC码生成原理,在查资料的过程中我看到了《成功移植最新的2.6.22.3的linux kernel到S3C2410上》,链接是/zouzheng/archive/2007/08/28/32545.html和/wangy0919/blog/item/0058652ae8c3133b5343c1cf.html,都是转载的,但都没找到原作者是谁。

其中有这样一段活:“第三步:修改ECC校验:根据kernel官方网站上的说明,从2.6.22.3已经修改了ECC校验的问题(这也是我移植2.6.22.3的一个重要原因)。

但实验下来发现,不管是用软件ECC还是硬件ECC都不行。

只好改成NAND_ECC_NONE:在driver/mtd/nand/s3c2410.c中找到s3c2410_nand_init_chip()函数,将其中的chip->ecc.mode=NAND_ECC_SOFT;改成chip->ecc.mode=NAND_ECC_NONE; ”后来我就到网上找关于2.6.22.3的ECC校验的资料,始终没找到上面所说的修改,那位高人看到了通知一声。

看来要好好看看这方面的内容了。

)搜索关键字NAND_ECC_SOFT,在s3c2410_nand_init_chip函数里,修改NAND_ECC_SOFT为NAND_ECC_NONE五、增加Yaffs2文件系统的支持对于YAFFS文件系统,我在移植时查阅了许多资料。

有的博客上说没有必要移植YAFFS2,因为它是为每页大于1024B的NAND Flash设计的。

即使移植了YAFFS2,如果你的NAND Flash是每页512+16B的那系统也会自动挂载YAFFS。

所以在这里要移植YAFFS2或是YAFFS 随你的便。

我移植的是YAFFS2。

1、下载Yaffs2URL:/cgi-bin/viewcvs.cgi/2、解压Yaffs2并将其加入Linux内核(打补丁的方式)#cd yaffs2#./patch-ker.sh c /home/tekkaman/working/kernel/linux-2.6.22.2/对于网卡驱动的移植,最好还是懂得一些网卡和网络的知识为好。

想要速成的话,我极力推荐您看看zcx3000的专栏。

他的关于RTL8019的文章总结得很好,使我受益匪浅。