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 分区大小¶
cd build/boards/default/partition/
修改 partition_spinand.xml 中各分区的大小,并重新编译 bsp (建议
将 partition_spinand.xml 中 最后一个分区的 size_in_kb 删除,
如此会自动根据 nand 的大小将剩余的空间分配到最后一个扇区)
备注:分区大小需按照 nand flash 的 erase size 对齐,erase size 可 查阅 nand flash 的 spec 手册,当前有 128/256k erase size,若无法获 取到 nand flash 的 erase size 大小可默认按照 256k 大小对齐