SD卡实现全启动及烧录nand与跳过ECC效验冲突
算是笔记、以为本人忘形比较好。其中有如有理解变差或表述错误的地方请各位高手见谅和指正。
起因和大部分人相同,项目需求。我们需要完成一套能启动的u-boot、kernel与fs(filesystem)。这点已经基本完成。因为需要批量烧录所以必须满足:操作简单、windows下可完成烧录、等。
环境:s3c6410的核心板。
在这里多嘴一下,我们遇到了u-boot与kernel的ECC效验冲突的问题(因为我的nand 烧录全部由u-boot完成),本来想通过修改u-boot中的ECC效验与kernel对应,但发现实在太麻烦,所以想这有没有其它方法可以避免u-boot与kernel的ECC效验冲突。其实细想一下这是完全可以实现的,只要你能通过nfs启动fs,就说明kernel与fs本身是没问题的,而用u-boot烧录nand以后kernel读出的数据间出了问题,那么我们就可以不用u-boot烧录fs,这样就跳过了u-boot、避免了u-boot写入nand的数据kernel读出来错误的问题。不用u-boot写fs到nand,还不能用网络的方式即不能用tftp、nfs了(因为操作繁琐、不适合批量生产),jtag之类的就更不用说了,dnw倒是可以用,只是不能用u-boot写入那就计较麻烦。其实sd卡和dnw都可以完成fs的烧写,但是我们是用sd卡一次性完成u-boot、kernel、fs的数据全部烧写到nand中,这样的话当然是用sd卡最方便快捷。
闲话多了点、入正题吧。
1、准备两个版面可正常工作的u-boot,一个nand启动、一个sd卡启动;
2、kernel;
3、fs(有些加工、具体修改下述)。
注:有关它们的启动和传参网上的说明已经很丰富了、所以跳过。
sd卡的数据读写格式:直接help movi吧,不过不是每个版本的u-boot都有movi子系统的支持,我用的是u-boot-1.1.6。
首先、修改u-boot与fs。将nand启动的u-boot的参数设置为正常的nand启动参数:
bootargs root=/dev/mtdblock2 init=/linuxrc rootfstype=yaffs2 console=ttySAC0,115200
bootcmd nand read 0x50008000 0x40000 0x300000\\;bootm 0x50008000
SD卡启动的u-boot的参数:
bootagrs \"noinitrd root=179:2 rw console=ttySAC0\"
bootcmd \"movi read 3600000 40000 50000000;nand write 50000000 0 40000;movi read kernel 50008000;nand write 50008000 40000 300000;bootm 50008000\"
因为需要全自动的烧录、所以我加入了\"movi read 3600000 40000 50000000\",因为我把u-boot的nand启动版本事先用tftp烧到了sd卡的3600000扇区,如果用movi write u-boot 50000000的话会覆盖掉sd卡本身启动用的u-boot。
其次、在制作sd启动的fs时,先把fs打包放到sd卡启动的文件系统根目录下,比如yaffs2.tar.bz2。在启动自动执行的文件(/etc/init.d/rcS)里加入:
mount -t yaffs /dev/mtdblock2 /mnt
tar jxvf /yaffs2.tar.bz2 -C /mnt
对于sd卡的烧写制作我是参照
http://www.linuxidc.com/Linux/2011-11/47796.htm
这样只需要放入sd卡拨码的到sd卡启动,等到启动和解压都完成,在拨到nand启动、就ok了。
用这种方法可以跳过u-boot烧写fs、直接用内核的ECC写入和读取fs的数据(当然、我想这有可能会和你本机的内核版本与编译进内核的模块选取有关,毕竟fs写入sd卡用的是你本机),而且简单方便,我测试过,烧写完成需要1分多点的时间。
以上只是个人思路、不一定是最简便的方法、仅供参考,本人水平有限。希望能和大家一起谈论、学习。
因篇幅问题不能全部显示,请点此查看更多更全内容