1: 目前比较常见NAND Flash每一页大小为(2048+64)字节(还有其他格式的NANDFlash,比如每页大小为(256+8)、(512+16)、(2048+128)等),其中的2048字节就是一般存储数据的区域,64字节称为OOB(Out OfBand)区。通常在OOB区存放坏块标记、ECC较验码、文件系统信息(yaffs)等。 而cramfs、jffs2文件系统映像文件中并没有OOB区的内容,如果将它们烧入NORFlash中,则是简单的“平铺”关系;如果将它们烧入NAND Flash中,则NANDFlash的驱动程序首先根据OOB的标记略过坏块,然后将一页数据(2048字节)写入后,还会计算这2048字节的ECC较验码,最后将它写入OOB区,如此循环。cramfs、jffs2文件系统映像文件的大小通常是512的整数倍。 而yaffs文件系统映像文件的格式则跟它们不同,文件本身就包含了OOB区的数据(里面有坏块标记、ECC较验码、其他yaffs相关的信息)。所以烧写时,不需要再计算ECC值,首先检查是否坏块(是则跳过),然后写入2048字节的数据,最后写入64字节的OOB数据,如此循环。yaffs文件系统映像文件的大小是(2048+64)的整数倍
2: 1)烧写yaffs文件系统映像时,分区上第一个可用的(不是坏块)块也要跳过。2)如果写入的数据是oxff,代表不写入数据
3: yaffs文件系统格式详细见https://yaffs.net/yaffs-2-specification
Comment
Size for 1kb chunks
Size for 2kB chunks
blockState | Block state. non-0xFF for bad block | 1 byte | 1 byte |
chunkId | 32-bit chunk Id | 4 bytes | 4 bytes |
objectId | 32-bit object Id | 4 bytes | 4 bytes
|
nBytes | Number of data bytes in this chunk | 2 bytes | 2 bytes |
blockSequence | sequence number for this block | 4 bytes | 4 bytes |
tagsEcc | ECC on tags area | 3 bytes | 3 bytes |
ecc | ECC, 3 bytes/256 bytes of data | 12 bytes | 24 bytes |
Total |
| 30 bytes | 42 bytes
|
4: 如果使用8位HWECC时,会生成52字节的ECC校验数据并写入oob,而yaffs2自身也有28字节的数据写日oob,也就是说,至少需要28+52=80字节的oob空间,而对于我们的nand flash,页大小为2048字节,oob空间为64字节,明显空间不足,进而导致了我们前面看到的问题,所以,采用8位HWECC时应该选用不使用oob空间的文件系统,如jffs2,但是jffs2文件系统在挂载时比较慢,感觉上不如yaffs2轻巧。