接上一篇,完成UBL,U-Boot和kernel烧写以后,还剩下文件系统烧写,就完成了Nand Flash的系统启动。
根据DM36x所支持的文件系统格式,我们选择了jffs2格式。
在Ubuntu10.04系统上,并没有安装jffs2文件系统的镜像生成工具。
使用U-Boot烧写文件系统,nand write/nand read等等命令,能操作文件是特定的,需要上述工具来制作。
一,安装制作镜像的工具命令:
sudo apt-get install mtd-utils
二,制作文件系统的镜像命令:
sudo mkfs.jffs2 -x lzo -r=rootfs/ --faketime -o=rootfs.jffs2 --little-endian --eraseblock=0x20000 -n
使用 mkfs.jffs2的help查看这个具体参数的配置。
三,准备一个sd卡,把刚刚制作好的镜像文件rootfs.jffs2拷贝到sd卡中
四,给开发版上电启动,进入U-boot命令行模式,插入sd卡
五,执行如下命令:
mmc init
mmc rescan 0
nand erase clean 0x900000 0xc900000
mw.b 0x81000000 0xFF 0x6400000
fatload mmc 0 0x81000000 rootfs.jffs2
nand write.jffs2 0x81000000 0x900000 0x4D20000
依次完成的作用:
sd卡初始化;
sd卡的序号为0;
擦写nand flash从地址0x900000开始大小为0xc900000的区域,也就是将值变成1;
将文件系统镜像加载到DDR内存的0x81000000地址处;
将DDR内存0x81000000处的镜像内容写到nand flash的0x900000地址处,往后大小为0x4D20000
在这里,需要说明0x4D20000是怎么计算得到的?
由于fs_root.jffs2镜像的实际大小为80859312bytes,换算成十六进制为0x4D1D0B0;在就是因为烧写的时候块对齐,现在每块大小为128K,换算成十六进制是0x20000,按照向上对齐,也就是0x4D20000。
做到这里,如果没有任何错误,就代表linux系统启动的所有需要步骤全部完成了。
下面,我们还需要完成最后一步,设置启动参数:
接下来就是修改bootargs和bootcmd的启动参数:
//(只列出了需要修改的)
setenv bootargs root=/dev/mtdblock3 rw rootfstype=jffs2
setenv bootcmd "read 0x81000000 0x500000 0x1b1aac;bootm 0x81000000"
setenv bootdelay 6 //设置等待进入加载内核的秒数
最后,记得saveenv,然后断电上电重新启动。
注意:在烧写文件系统完成以后,系统怎么也启动不起来,并且每次都会报下面错误:
mtd->read(0x400 bytes from 0x0) returned ECC error
这表示Nand Flash芯片的ECC校验没有通过,如果为了快速测试,只需要把ECC校验关闭即可。但是,关闭会有其他什么问题,都是未知的。。。。。。。。