如何将YAFFS文件系统镜像烧入Nand Flash

和普通文件系统不同,YAFFS文件系统专门为Nand Flash设计,可以使用mkyaffsimage生成文件系统的镜像,但如果要将此镜像烧入Flash,那么有些地方需要注意。

 

硬件上,Nand Flash的设计已考虑到包含坏块的情况,对于每扇区512字节的Nand Flash,每扇区都有一个16字节额外的扩展区,通常用以存储此扇区的校验数据以及坏块标记等信息(WinCE则使用了其中4字节存储逻辑扇区编号),所以我们看Nand Flash的Data Sheet时,经常会发现其容量以“64M + 2048K”这样的格式进行描述,后面的数字就用来表示扩展区的容量。

 

YAFFS文件系统既然专为Nand Flash设计,它在生成文件系统镜像时,已经考虑到对扩展区的利用,并将扩展区的数据包含在扇区数据后,其结构定义如下:

 

bytes 0-511: Data

 

bytes 512-515: YAFFS TAG

bytes 516: Data status

bytes 517: Block status

bytes 518-519: YAFFS TAG

bytes 520-522: ECC for bytes 256-511

bytes 523-524: YAFFS TAG

bytes 525-527: ECC for bytes 0-255

 

可以看出,YAFFS使用了8字节(YAFFS TAG)存储文件系统相关信息,并使用4字节(ECC)存储校验数据,而此校验数据算法与Nand Flash控制器的硬件算法并不一致,对于很多Boot Loader,可能会校验失败。

 

另外,由于YAFFS文件系统需要使用分区上的第一个块来存储一个名为Yaffs_ObjectHeader的结构体。该结构体记录了该分区中的文件、路径以及相关的链接,该块无法在生成镜像的时候产生,所以在烧写时还需要跳过第一个可用的块。比如,我们在MTD分区中划分一个YAFFS分区,占用Nand Flash空间为块1000-4095,那么,第1000块我们必须留空,镜像文件要从1001块开始烧写。

 

了解了YAFFS镜像文件的特点,我们现在清楚如何将YAFFS镜像烧入Nand Flash:

1、将镜像文件载入内存

2、根据MTD分区信息,定位到首块Nand Flash并跳过,从下一块开始烧录

3、擦除块,如果擦除失败,标志为坏块,继续操作下一块

4、从镜像文件读出512字节,写入Nand Flash扇区

5、继续从镜像文件读出16字节,写入Nand Flash扩展数据区(注意不要写入硬件ECC,否则YAFFS分区无法mount)

6、重复步骤4,直到整块数据写入完成

7、重复步骤3,直到整个影像文件写入完成

 

你可能感兴趣的:(算法,Flash,存储,扩展,WinCE)