如何将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 statusim

bytes 517: Block status数据

bytes 518-519: YAFFS TAG文件

bytes 520-522: ECC for bytes 256-511文件系统

bytes 523-524: YAFFS TAGyaf

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:

一、将镜像文件载入内存

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

三、擦除块,若是擦除失败,标志为坏块,继续操做下一块

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

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

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

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