NAND Flash中的OOB区
NAND Flash由NAND Flash控制器和NAND Flash芯片(例如K 9F1208U0A)两大部分组成。当要访问NAND Flash芯片中的数据时,必须通过NAND Flash控制器发送命令才能完成。所以, NAND Flash相当于MCU的一个外设,并不位于MCU的内存地址区。
一片NAND Flash就是一个设备(device),
1设备(Device)
1块(Block)
1块(Page)
现在也有数据块大小为1024字节或2048字节的NAND Flash。在NAND Flash中每一页中,最后16个字节(又称OOB)存放ECC(Error Correction Code)检验码和文件系统的组织信息,用于错误检测和坏块处理。当文件系统被挂载时,只须扫描存储器的OOB区就能将文件系统信息读入内存,并且驻留在内存中,这样不仅加快了文件系统的加载速度,也提高了文件的访问速度,但是增加了内存的消耗。前面的512个数据字节又分为前半部分和后半部分。可以通过NAND Flash的命令对前半部、后半部、OOB区进行定位,使NAND Flash内置的指针指向各自的首地址。
通过以上的对OOB区的结构的分析,可以得出我们需要修改YAFFS文件系统代码的两处:一是ECC校验码的位置,把校验码从OOB区中第8、9、10、13、14和15移到第0、1、2、3、6、和7字节。二是可用空间的数据结构的定义,上文提到新的数据结构的定义已经包含在yaffs_packedtags1.h中了,所以可以直接利用这段代码,而不需要重新去定义了。
下面将具体的讲述如何去修改这些代码,以使makeyaffsimage工具能够生成新格式的YAFFS文件系统。
(1)
修改makeyaffsimage.c,增加上这一行。
#include “yaffs_packedtags1.h”
在yaffs_packedtags1.h文件中定义了新格式的YAFFS可用空间的数据结构。
(2)
修改makeyaffsimage.c文件中的write_chunk函数为:
etags.chunkDeleted
yaffs_PackTags1(&pt1, &etags);
OOBbuf[6] = ecc_code[4];
OOBbuf[7] = ecc_code[5];
#endif
在新的代码中,设置新tag结构中增加了chunkDeleted成员,并将计算出来的ECC校验码填入新的ECC的位置,它正是nand_OOB_16结构中的eccpos数组定义的位置。其中nand_calculate_ecc函数是从内核文件drivers/mtd/nand/nand_ecc.c修改而来的。在本文中,内核和文件系统采用的ECC校验为MTD设备层的NAND_ECC_SOFT。在原来的代码中,YAFFS文件系统使用的是yaffs2/yaffs_ecc.c文件中的yaffs_ECC_Calculate函数来计算ECC校验码,但是在本文中配置内核时使用的是ECC校验为MTD设备层的NAND_ECC_SOFT,为了使映像文件和内核保持一致,我们修改了mkyafsimage代码,使用了nand_calculate_ecc函数。
(3) 添加文件,修改Makefile.
在上面的write_chunk函数中的yaffs_PackTags1是在yaffs_packedtags1.h中定义的,所以需要将这个文件复制到当前的目录。
$ cp
另外nand_calculate_ecc函数是新加的nand_ecc.c中定义的,所以要修改Makefile,把yaffs_packedtags1.c和nand_ecc.c也编译进mkyaffsimage工具中。
找到Makefile中的这样一行:
MKYAFFSSOURCES = mkyaffsimage.c
修改为:
MKYAFFSSOURCES = mkyaffsimage.c
现在,在YAFFS的代码yaffs2/utils目录下执行“make”命令生成的mkyaffsimage工具,就可以制作出支持linux-2.6.22.6版本的文件系统了。