4. Nand Flash 分区

4.1. 关于 mtd

内存技术设备即 MTD(Memory Technology Device,缩写为 MTD),是 Linux 系统中 设备文件系统的一个类别,主要用于闪存的应用,是一种闪存转换层(Flash Transl ation Layer,FTL)。创造 MTD 子系统的主要目的是提供一个介于闪存硬件驱动程序 与应用程序之间的抽象层。

4.2. 分区表

CVITEK 方案Flash分区表以xml格式定义,细节请参考《Flash 分区工具使用指南》。

Flash分区以xml格式定义,以boards/default/partition/partition_spinand_page_2k.xml为例:

<physical_partition type="spinand">
    <partition label="fip" size_in_kb="2560" file="fip.bin"/>
    <partition label="BOOT" size_in_kb="8192" file="boot.spinand"/>
    <partition label="MISC" size_in_kb="384" file="logo.jpg" />
    <partition label="ENV" size_in_kb="128" file="" />
    <partition label="ROOTFS" size_in_kb="71680" file="rootfs.spinand" />
    <partition label="SYSTEM" size_in_kb="20480" file="system.spinand" mountpoint="" type="ubifs" />
    <partition label="CFG" size_in_kb="4096" file="cfg.spinand" mountpoint="/mnt/cfg" type="ubifs" />
    <partition label="DATA" file="" mountpoint="/mnt/data" type="ubifs" />
</physical_partition>

以 2KB page size 128KB blocksize 的 NAND flash 为例:由xml文件上数据,将各分区大小换算成block大小后(公式:block个数 = 分区大小 / 单一block大小),如下所示:

Partition

Start block offset

Number of blocks

Binary files

FIP

0

20

fip.bin

BOOT

24

64

boot.spinand

MISC

顺排(遇坏块则跳过)

3

logo.jpg

ENV

顺排(遇坏块则跳过)

1

Null (无内容)

ENV_BAK

顺排(遇坏块则跳过)

1

Null (无内容)

ROOTFS

顺排(遇坏块则跳过)

560

rootfs.spinand

SYSTEM

顺排(遇坏块则跳过)

160

system.spinand

CFG

顺排(遇坏块则跳过)

32

cfg.spinand

DATA

顺排(遇坏块则跳过)

Don’t Care

Null (无内容)

4.3. 烧写规则

4.3.1. SV 分区

SV分区跟处理器绑定,用户只需选择2KB或4KB page size的bin并将其烧写,请勿自行修改分区内容。以2KB page size为例,请将block 0, 1, 2, 3都烧写182x_sv_2k_pg.bin,如遇坏块则略过该block。如果前四个block都是坏块,请勿使用该SPI NAND flash。

4.3.2. FIP 分区

FIP 分区包含两个部分:

处理器相关的Bootloader(无开源), u-boot. CVITEK 编译流程会自动将两者打包成一个 fip.bin nand 烧录时烧录逻辑从 block 0~19 之间依序挑选好块,总共烧写两份,第一份会写在 block 0~9, 第二份会烧写在 block 10~19,互为备份。

fip.bin本身烧入进spinand 大概会使用到 3~4个 blocks,但因 spinand 特性问题, block 可能会出现坏块状况,所以剩余未使用的 block 预留用于出现坏块时使用。

例一

没有坏块的话,将第一份 fip.bin 烧写至block 0, 1, 2, 3, 4;第二份fip.bin烧写至block 9, 10, 11, 12, 13。

例二

若block 4, 11为坏块,请将第一份 fip.bin 烧写至block 0, 1, 2, 3, 5; 第二份 fip.bin 烧写至block 9, 10, 12, 13, 14

4.3.3. 其他分区

照分区表配置,依序烧写,遇到坏块则略过,跳下一个好块再烧写。

4.4. 如何修改 Nand 分区大小

  1. cd build/boards/default/partition/

  2. 修改 partition_spinand.xml 中各分区的大小,并重新编译 bsp (建议

  3. 将 partition_spinand.xml 中 最后一个分区的 size_in_kb 删除,

  4. 如此会自动根据 nand 的大小将剩余的空间分配到最后一个扇区)

备注:分区大小需按照 nand flash 的 erase size 对齐,erase size 可 查阅 nand flash 的 spec 手册,当前有 128/256k erase size,若无法获 取到 nand flash 的 erase size 大小可默认按照 256k 大小对齐