u-boot-2012.04.01移植(十一)提供yaffs文件系统烧写支持

测试u-boot是否jffs2文件系统的烧写

烧写命令如下:

tftp 30000000 fs_mini_mdev.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 0x00260000 $filesize

30000000:文件系统下载的目标地址

0x00260000:文件系统应处于的flash地址

$filesize:文件系统大小

PS:写入文件系统的时候必须指定合适的文件大小,不能使用分区名来写入,否则会破坏文件系统的格式,导致文件系统无法使用

 

在尝试挂载文件系统之前,还要烧写内核,并且设置启动参数,指定文件系统格式是jffs2

参数设置如下:

set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2

 

测试结果,u-boot支持jffs2文件系统的烧写,系统成功能挂载jffs2文件系统

 

测试u-boot是否yaffs2文件系统的烧写

烧写命令如下:

tftp 30000000 fs_mini_mdev.yaffs2
nand erase.part rootfs
nand write.yaffs 30000000 0x00260000 $filesize

 

烧写失败,nand的读写命令位于common/cmd_nand.c

在common/cmd_nand.c,搜索yaffs可以定位到605行,从这里可以知道想要支持yaffs必须定义宏CONFIG_CMD_NAND_YAFFS

在include/configs/smdk2440.h中定义它:

#define CONFIG_CMD_NAND_YAFFS

 

重新烧写yaffs2文件系统,写入时不再出现错误,但挂载文件系统时失败

使用u-boot-1.1.6烧写同样的内核及yaffs2文件系统,挂载成功,说明yaffs2文件系统内容没有问题,问题应该在于u-boot-2012.04.01没有将文件系统正确写入flash


用二进制文本软件比对烧写内容和原文件系统,发现oob部分内容不一致(Notepad++添加插件HexEditor即可以二进制方式查看文本)

回到common/cmd_nand.c:605往下分析,烧写调用如下:

			ret = nand_write_skip_bad(nand, off, &rwsize,
						(u_char *)addr, WITH_YAFFS_OOB);

在nand_write_skip_bad中,

1、烧写模式设置错误

//			ops.mode = MTD_OOB_AUTO;
			ops.mode = MTD_OOB_RAW;

2、write_oob返回值判断语句错误

				rval = nand->write_oob(nand, offset, &ops);
//				if (!rval)
                                if (rval)
					break;

3、修改上面两个错误后重新试验仍无法挂载文件系统,经过调试发现,还有一个错误,修改如下:

//if (!need_skip && !(flags & WITH_DROP_FFS))   
if (need_skip && !(flags & WITH_DROP_FFS)) 

这么修改后,支持了yaffs2文件系统,但经测试,不支持jffs2文件系统,为了同时支持两种文件系统,应修改如下:

/*
	if (!need_skip && !(flags & WITH_DROP_FFS)) {
		
		rval = nand_write (nand, offset, length, buffer);
		printf("there is no bad block\r\n", __FILE__, __LINE__);
		if (rval == 0)
			return 0;

		*length = 0;
		printf ("NAND write to offset %llx failed %d\n",
			offset, rval);
		return rval;
	}
	while (left_to_write > 0) {
*/
	if(!(flags & WITH_YAFFS_OOB)){
		if(!need_skip && !(flags & WITH_DROP_FFS)) {		
			rval = nand_write (nand, offset, length, buffer);
			printf("there is no bad block\r\n", __FILE__, __LINE__);
			if (rval == 0)
				return 0;

			*length = 0;
			printf ("NAND write to offset %llx failed %d\n",
				offset, rval);
			return rval;
		}
	} else
	while (left_to_write > 0) {

 

 

修改至此,u-boot已经支持jffs2和yaffs2文件系统的烧写

 

 

你可能感兴趣的:(uboot)