测试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文件系统的烧写