学习目标:jz2440移植实践-制作yaffs2根文件系统
提示:已经移植好了uboot-2016.9,linux-4.14,然后需要构建文件系统
目标:
1. uboot支持yaffs2文件烧录
2. kernel支持yaffs2文件系统
3. 手动制作根文件系统
学习内容:
1. uboot支持yaffs2烧录
<1> 文件:cmd/nand.c
更改目的:增加对nand write.yaffs2命令的支持
<2> 文件:driver/mtd/nand/nand_util.c
更改目的:增加nand write对yaffs2文件系统的支持
<3> 文件:include/configs/jz2440.h
更改目的:增加对YAFFS编译选项,使增加的改动代码编译入uboot
<4> 文件:include/nand.h
2. kernel支持yaffs2
{
<1> kernel更改mtd分区
https://blog.csdn.net/qq_36576792/article/details/86526796
<2> kernel增加对yaffs2支持
https://blog.csdn.net/gatieme/article/details/53157829
<3> yaffs2编译问题
https://blog.csdn.net/hanpca/article/details/80220929
<1>f_dentry错误
frank@ubuntu:~/workSpace/linux-4.1.4/fs/yaffs2$ diff yaffs_vfs.c yaffs_vfsbak.c
258c258
< #define Y_GET_DENTRY(f) ((f)->f_dentry)
---
> #define Y_GET_DENTRY(f) ((f)->f_path.dentry)
1927c1927
< (int)f->f_dentry->d_parent->d_inode->i_ino);
---
> (int)f->f_path.dentry->d_parent->d_inode->i_ino);
1930c1930
< f->f_dentry->d_parent->d_inode->i_ino,
---
> f->f_path.dentry->d_parent->d_inode->i_ino,
}
3. 制作根文件系统
https://www.cnblogs.com/electronic/p/11146614.html
遇到的问题bug:
1. 每次烧录文件系统后uboot下命令nand bad会新增坏块?uboot和kernel识别的坏块不一致?
问题定论:mkyaffs2image生成的yaffs2文件系统会将oob数据的第1,2字节写成0x00 0x01,而uboot和kernel判定坏块原则是第1,2字节只要不是[0xff,0xff]就是坏块,所以每次烧录文件系统后,重启uboot后nand识别的坏块会增加。
问题定位过程:控制变量法,由于根文件系统是新制作的,所以先采用韦东山教程中给的yaffs2进行烧录,发现可以正常启动。后来下载hex16阅读器,发现确实是oob数据区错误。
问题定位中的收获:
<1> 认知nandflash结构
<2> oob有什么作用?
oob存放标记坏块,和ecc,uboot和kernel都是通过识别第1,2字节非[0xff,0xff]则是坏块。
<2> yaffs2如何利用oob数据
yaffs2会在oob中存放坏块标记,ecc校验,以及yaffs2相关信息,制作好的yaffs2文件包含oob数据,在写入时一起写入nand,所以可能会在成认为坏块的出现
<3> 伪坏块处理
nand scrub -y 擦除起始地址 总共擦除的大小
2.问题解决
mkyaffs2image工具的问题
最终发现,由于Jz2440使用256M nandflash,所以应该使用mkyaffs2image-128M工具,后续我会贴上资源。
学习产出:
1.yaffs2文件系统支持