硬件平台:勤研2410开发板
开发平台:FC6+kernel 2.6.22.3+arm-linux-gcc-3.4.1
参考资料:panjet大侠的帖子《Linux 2.6.10 以后版本对 S3C2410 的支持》(在此特别感谢panjet大侠和所有参与过那个帖子的朋友)
由于kernel 2.6.22.3对s3c2410中文件的组织风格有了一些变化且删除了对devfs的支持,所以移植过程中遇到了一些《Linux 2.6.10 以后版本对 S3C2410 的支持》中没有提到的问题,但基本思路是一致的。
第一步:根据自己nand flash的分区情况,修改kernel中的相关参数:
由于kernel 2.6.22.3对s3c2410中文件的组织风格有了变化,所以要修改的文件不再是 arch/arm/mach-s3c2410/devs.c,而是arch/arm/plat_s3c24xx/common-smdk.c。在其中找到分区的定义
smdk_default_nand_part[] = {
...
}
根据自己的分区情况修改其中的内容(分区情况可以通过bootloader查看)
第二步:修改nand flash的参数:
在同一个文件中找到
smdk_nand_info = {
.tacls=20,
.twrph0=60,
.twrph1=20,
...
}
改成
smdk_nand_info = {
.tacls=0,
.twrph0=30,
.twrph1=0,
...
}
第三步:修改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;
第四步:修改Makefile文件:
修改其中的目标平台和交叉编译器为:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
第五步:配置内核:
make menuconfig
注意,要将tmpfs选上,否则kernel找不到root分区。
第六步:编译内核:
make
到此内核的移植已经完成,但由于2.6.22.3中已经不包含devfs,所以还需要在root filesystem中配置console设备,否则将不能进入交互界面(不会出现提示符#)
第七步:配置console设备:
在root filesystem的/dev中,生成console设备:
mknod -m 600 console c 5 1
最后将kernel和root filesystem烧到nand flash中,kernel的移植即大功告成!^_^
由于2.6.22.3中用udev代替了devfs,下一步将进行udev的移植和配置。
成功移植busybox-1.7.0并加载mdev(udev的嵌入式版本)
上次成功移植完2.6.22.3后,由于没有启动udev,造成/dev下没有设备文件。也就是说所有的设备都没有挂接进来。
用google在网上搜了一把。发现最新的busybox已经包含了udev的简化版本即mdev,且使用非常简单。
于是下载移植:
第一步:修改Makefile
将Makefile中的ARCH和CROSS_COMPILE修改为arm系列:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
第二步:meke menuconfig
运行make menuconfig,选择你需要的选项。
在此选择
mdev
第三步:编译、安装
#make
#make install
这时会在你的编译目录下生成一个_install的目录,里面包含了生成的所有文件和目录结构。
第四步:查找所依赖的共享库
#cd _install/bin
#arm-linux-readelf -a ./busybox | grep "Shared library"
用上面的命令可以查到当前的busybox依赖哪些共享库(这些共享库一般可以在你的交叉编译器所在目录的lib下找到)
第五步:将生成的文件和共享库拷贝到你的root filesystem中
将_install中的目录结构和文件完全拷贝到你的root filesystem中。
然后将共享库拷贝到root filesystem的lib目录中,并建立相关的链接文件
第六步:为mdev的运行准备环境
mdev需要改写/dev和/sys两个目录。所以必须保证这两个目录是可写的(一般会用到sysfs,tmpfs。所以要重新编译内核)。
然后在你的启动脚本文件中加入
/bin/mdev -s
最后:将新的内核、新的root filesystem烧到nand flash中就行了。
呵呵,下面要开始调试usb host了。进度一步一步的推进,好开心啊......
记得以前这里的哪位大侠提到2.6.21上已经解决了cramfs做rootfs必须禁用ECC的问题,不过我暂时还不用cramfs,所以没去研究。
另外,我在2.6.14和2.6.18上使用yaffs/ramfs+yaffs可是保留着这个NAND_ECC_SOFT的,也没发现有什么问题。