nandflash烧录文件制作(ubi文件系统)

问题分析:

为了将IPRAN平台的APP烧录到nandflash,需要解决如下问题:

  1. linux内核启动后,挂载nandflash设备时,采用的ubi的文件系统。所以,烧录到nandflash的必须是一个ubi格式的文件系统。
  2. 挂载后的nandflash,有home和data两个卷,所有,烧录的ubi格式的文件系统必须已经包含home和data两个卷(以下方式不适用与创建两个或者多个分区的情况)
  3. Nandflash不像norflash可以字节编程,nandflash是块设备且在生产和使用过程中会产生坏块,nandflash通过ECC校验解决该问题,校验信息存在OOB数据区。这就需要在制作烧录文件时,追加这部分信息。

 

为了解决上述3个问题,按如下步骤逐步解决以上问题:

1、创建工作目录,目录结构如下:

                /home

                          /bin

                /data

                        /dat

                        /ver

将IPRAN平台APP解压到 /hom/bin 目录下。

2、将IPRAN平台APP制作成可烧录到nandflash的ubi格式的文件系统镜像。/home 目录制作成 home.img,大小为80M,/data 目录制作成 data.img,大小为160M。命令如下:

mkfs.ubifs -r ./bin/home -m 2048 -e 126976  -c  640 -o home.img

mkfs.ubifs -r ./bin/data -m 2048 -e 126976  -c  1280 -o data.img

选项说明:

-r:创建文件系统镜像的原目录;

-m:最小I/O单元,即NAND FLASH一个page的大小;

-e:逻辑擦除块大小,即leb-size;

-c:最大逻辑擦除块的;

-o:输出文件名称;

3、制作成ubi格式的文件系统可烧录程序

ubinize -o ubifs  -m 2048 -p 128KiB -s 2048 -O 2048 ubi.cfg

选项说明:

-o:输出文件名称;

-m:最小I/O单元,即nandflash一个page的大小;

-p:物理擦除块的大小(强制参数);

-s:最小的硬件输入输出页面大小,即:--sub-page-size;

-O: VID头相对物理擦除块起始地址的偏移量(默认是下一个EC之后的最小I / O单元或子页面头);

 

Ubinize的配置文件ubi.cfg内容如下:

[home]
mode=ubi--------------------------------固定值
image=home.img----------------------镜像源文件
vol_id=0----------------------------------卷ID
vol_size=83886080--------------------卷的大小
vol_type=dynamic
vol_alignment=1
vol_name=home------------------------卷名

[data]
mode=ubi
image=data.img
vol_id=1
vol_size=167772160
vol_type=dynamic
vol_alignment=1
vol_name=data
vol_flags=autoresize

 

3、添加OOB数据(位于nandflash的spare区)。

通过软件的方式计算从EEC校验值,然后添加到ubi镜像文件中。

(nandflash的驱动程序采用的是软件ECC方式,本人未测试过硬件ECC的情况)

串行nandflash芯片MX35LF2GE4AB的ECC校验代码是linux内核源码中的 drivers/mtd/nand/nand_ecc.c 中的,代码详见 nand_calculate_ecc() 函数。算法说明详见内核源码 documentation/mtd/nand_ecc.txt 文件。在此不赘述。

对于MX35LF2GE4AB芯片,通过实验得知,OOB数据位于spare区的最后24字节中。如下如图所示(XX表示OOB数据):

 

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

XX

XX

XX

XX

XX

XX

XX

XX

XX

XX

XX

XX

XX

XX

XX

XX

XX

XX

XX

XX

XX

XX

XX

XX

注意:

如果是spare区为128字节,则剩余部分需要用0xFF补全,即:每页需要添加128字节的OOB数据。例如:镁光的串行flash MT29F2G01ABAGDWB,每页有2176字节(2048+128),当添加OOB数据的时候,需要填充128字节到烧录文件中。

 

相关代码及编译脚本见如下链接(Linux version 4.9.65):nandflash烧录文件制作

 

 

你可能感兴趣的:(nandflash)