最近买了一块s3c2416开发板,想自己完完全全移植一个linux系统,我打算移植2.3.35,因为我下载了几个版本发现它是第一个开始支持s3c2416的内核版本,有这个在移植工作轻松很多,要不然我这个菜鸟估计搞不定。
其实步骤和移植2440很类似。make menuconfig 选中SMDK2416(把其他的平台统统去掉),还有像串口的支持,NANDFLASH的支持一定要选上。make menuconfig完毕,make 一下,报错。说什么s3c_nand找不到,搜一下原因,很简单就是因为make menuconfig 没配好,不去改那玩意,直接在arch/arm/plat-s3c的makefile上改,把它改成-y就行,很粗鲁很有效,类似的问题同样解决,再MAKE后烧写zImage到开发板,提示找不到nand,很正常,还有yaffs和nand分区表没有修改,但是串口输出是正常的,默认的smdk2416里的串口时钟和平台号都是正确的不同修改(当然是由开发板的晶振还有Uboot传来的参数决定的)。
接着,我下载Yaffs2,打补丁,修改NANDFLASH分区表,一切很easy,重新make后烧写,问题来了,依然提示找不到NAND,没有办法了找了很多资料无法解决。我无奈下又尝试了2.6.36,2.6.39和3.1。其中2.6.36和2.6.35现象一模一样都是先开始都编译不过,然后同样的步骤同样的问题。但是到了linux3.1和2.6.39问题不一样了,内核启动出现了:
Creating 4 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x000000000000-0x000000100000 : "Bootloader"
0x000000100000-0x000000300000 : "LOGO"
0x000000300000-0x000000700000 : "Kernel"
0x000000700000-0x000010000000 : "ROOTFS"
但是后面的信息让我崩溃:
挂载根文件系统的时候出现:(为了避免不必要的错误我用了厂家的根文件系统)
Modules linked in:
CPU: 0 Not tainted (2.6.39 #2)
PC is at yaffs_del_dir_contents+0x1c/0x90
LR is at yaffs_del_dir_contents+0x48/0x90
pc : [<c012f508>] lr : [<c012f534>] psr: 60000013
sp : c3819ce0 ip : c3819cfc fp : c3819cf8
r10: c3a73174 r9 : c3993d3c r8 : 00000100
r7 : c39c0990 r6 : c39d1de0 r5 : c39d1da0 r4 : c39d1d38
r3 : 00000003 r2 : 00040002 r1 : c3993e00 r0 : 00006f92
Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel
Control: 0005317f Table: 30004000 DAC: 00000017
Process swapper (pid: 1, stack limit = 0xc3818260)
此处省略很多,查了很多资料,换了很多yaff2版本擦除了nandflash N次没有效果。
我分析下来认为是nandflash驱动的问题(原谅我菜),然后我对比厂家的driver/mtd/nand目录和我自己的,发现它多了一个s3c_nand.c,大喜过望我把它拷贝过来,修改makefile,make通过,然后烧写,内核启动正常了,真是太开心了,虽然是简单得不能再简单但还是感觉收获不小。接着我把它复制到2.6.35下,make报错,内核不同驱动也有所不同,但是非常有限,我稍微修改下就OK了, make 下载linux2.6.35也同样成功启动了。