今天,我们来移植U-BOOT让其支持YAFFS文件系统映像的烧写,以及最后的终极目标,制作Uboot补丁,因为我们信心苦苦移植好了Uboot,如果换一个地方的或者换一台电脑之类的,我们也不想再浪费时间从头开始移植,毕竟重复造轮子,并不是一件高明的事,所以我们制作Uboot补丁,方便以后的使用。

前一阵子已经花费了巨大的功夫,将Uboot支持了串口,nand flash,nor flash,网络下载文件等功能,今天我们来实现最后一个功能,实现Uboot烧写YAFFS文件系统。点击查看之前的文章:点击查看之前的文章

该Uboot已经支持JFFS2文件系统的烧写了,我们先来烧写JFFS2文件系统:
tftp 30000000 fs_mini_mdev.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 0x00260000 5b89a8 (这里因为文件系统的东西比较多,所以就直接烧写它固定的大小,而不用上一篇文章说的用rootfs这个字符代替烧写的区域)

烧写完成后,还需要先设置一下文件系统的类型,在Uboot命令行:
set bootargs console=ttySAC0 root=/dev/mtdblock3 rootfstype=jffs2
然后启动:
boot
显示如下:

果然可以正常启动挂载文件系统了。
那么我们的Uboot可以下载YAFFS文件系统么?
我们来试验一下:
reboot(重启)
tftp 30000000 fs_mini_mdev.yaffs2
nand erase.part rootfs
nand write.yaffs 30000000 260000 889bc0
显示:

这说明我们的Uboot源码没有支持烧写YAFFS文件系统。
我们去源码中看,在cmd_nand.c中,有函数:

#ifdef CONFIG_CMD_NAND_YAFFS
		} else if (!strcmp(s, ".yaffs")) {
			if (read) {
				printf("Unknown nand command suffix '%s'.\n", s);
				return 1;
			}
			ret = nand_write_skip_bad(nand, off, &rwsize,
						(u_char *)addr, WITH_YAFFS_OOB);
#endif

说明要支持烧写YAFFS类型的文件系统,必须定义这个宏:CONFIG_CMD_NAND_YAFFS。那么我们就去配置文件中定义这个宏:

#define CONFIG_CMD_NAND_YAFFS

然后重新编译烧写Uboot:tftp 30000000 u-boot.bin; protect off all; erase 0 3ffff; cp.b 30000000 0 40000 (分号隔开相关命令)
然后烧写文件系统:
tftp 30000000 fs_mini_mdev.yaffs2
nand erase.part rootfs
nand write.yaffs 30000000 260000 889bc0
启动之前设置:
set bootargs console=ttySAC0 root=/dev/mtdblock3 rootfstype=yaffs
set bootargs console=ttySAC0 root=/dev/mtdblock3 rootfstype=yaffs2
重启后:

很显然,没有完全挂载上。

yaffs文件系统包含两部分数据,页数据,和OOB数据。我们现在来对比一下我们少烧写的yaffs文件系统的数据与原有的数据的差别:
在uboot命令行输入:
nand dump 260000
显示的就是yaffs文件系统的的16进制数据。通过对比,发现OOB数据区的数据不一样。

修改源码:
在drivers/mtd/nand/nand_util.c中的nand_write_skip_bad函数中:

	if (!rval)  
		break;

这个地方写错了,导致只写了一页的OOB数据,应该是:

	if (rval)   /*lyy*/
		break;

还有一个地方需要修改:
drivers/mtd/nand/nand_util.c中
if (!need_skip && !(flags & WITH_DROP_FFS)) {
改为:
if (!need_skip && !(flags & WITH_DROP_FFS) && !(flags & WITH_YAFFS_OOB)) {
否则:如果分区中没有坏块(need_skip=0)时, 将执行这个分支, 导致oob区烧写不正确

最后编译uboot,更新uboot,下载文件系统,启动,一切OK啦!!!

最后,我们的文件系统就完整移植完了,现在我们来制作U-BOOTY的补丁文件:

分别输入:
make distclean
rm u-boot.dis
cd …
mv u-boot-2012.04.01 u-boot-2012.04.01_100ask
tar jxf u-boot-2012.04.01.tar.bz2 (解压未经修改的uboot源文件)
diff -urN u-boot-2012.04.01 u-boot-2012.04.01_100ask > u-boot-2012.04.01_100ask.patch (生成补丁)

补丁文件生成后,以后换电脑或者换系统之类的,就可以直接打补丁给U-boot了:
cd u-boot-2012.04.01
patch -p1 < …/u-boot-2012.04.01_100ask.patch

想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。