MTD分区指南

客户在自己的产品开发中,会需要自定义分区,比如存放一些方案的参数,保存sn号等等 在kernel启动的过程中,会打印MTD分区的情况,如下:

[ 0.391905] 0x000000000000-0x000000100000 : "scpu"

[ 0.398008] 0x000000100000-0x000000140000 : "uboot_stage1"

[ 0.404845] 0x000000140000-0x000000180000 : "uboot_env"

[ 0.411359] 0x000000180000-0x000000200000 : "uboot_stage2"

[ 0.418115] 0x000000200000-0x000000280000 : "boot_music"

[ 0.424673] 0x000000280000-0x000000300000 : "kernel_dtb"

[ 0.431200] 0x000000300000-0x000000a00000 : "kernel"

[ 0.437451] 0x000000a00000-0x000008000000 : "rootfs"

那么,我们想在分区的最后加个自己的私有分区“my”,怎么做呢?

我们想在最后新加个 my 分区,大小1m(尽量在后面增加分区)

在 uboot 中执行命令:

setenv mtdpart "mtdparts=spinand\_mcu:1m\(scpu\),256k\(uboot\_stage1\),256k\(uboot\_env\),512k\(uboot\_stage2\),512k\(boot\_music\),512k \(kernel\_dtb\),7m\(kernel\),117m\(rootfs\),1m\(my\)"


记得保存: savenv

启动linux确认

[ 0.386675] Creating 9 MTD partitions on "spinand_mcu":

[ 0.391907] 0x000000000000-0x000000100000 : "scpu"

[ 0.398010] 0x000000100000-0x000000140000 : "uboot_stage1"

[ 0.404863] 0x000000140000-0x000000180000 : "uboot_env"

[ 0.411373] 0x000000180000-0x000000200000 : "uboot_stage2"

[ 0.418126] 0x000000200000-0x000000280000 : "boot_music"

[ 0.424689] 0x000000280000-0x000000300000 : "kernel_dtb"

[ 0.431218] 0x000000300000-0x000000a00000 : "kernel"

[ 0.437467] 0x000000a00000-0x000007f00000 : "rootfs"

[ 0.443931] mtd: device 7 (rootfs) set to be root filesystem

[ 0.450117] mtdsplit: no squashfs found in "rootfs"

[ 0.455052] 0x000007f00000-0x000010000000 : "my"

可以看到,my 分区已经被kernel支持了

也可以在uboot代码中进行分区的修改

修改代码的话,uboot在:include/configs/leo_gx8010_ssd_1v.h (leo_gx8010_ssd_1v.h根据直接的板级来确认选择哪个)

#define MTDPARTS_DEFAULT "mtdparts=${mtdids_default}:" \

            "1m(mcu),"                    \
            "256k(uboot_stage1),"                \
            "256k(uboot_env),"                \
            "512k(uboot_stage2),"                \
            "512k(boot_music),"                \
            "${fdt_size}@${fdt_size}(kernel_dtb),"        \
            "${kernel_size}@${kernel_offs}(kernel),"    \
            "${rootfs_size}@${rootfs_offs}(rootfs),"    \
            "-(data)" 

另外,也可以在kernel的代码中进行修改,这个就不讨论了

下面给个例子,比如,我们想烧录sn号,存储在flash里,应用可以读取,但是不能写

那么,我们可以做个mtd分区,命名为 sn,我们再动态生成个文件系统bin文件,比如ubi文件系统,fat32文件系统等

再改文件系统内,我们有生成好的sn.txt,sn.txt保存序列号

该文件系统在linux启动后,以只读的方式挂载,这样应用就可以读sn.txt的数据了,但是无法写入 分区

按照上面的介绍做好 文件系统,以ubi文件系统为例子介绍

那么,我们要生成一个ubi文件系统,通过bootx工具烧录到指定的nand flash位置

关于ubi文件系统的生成,参考链接:https://pan.baidu.com/s/1juFUnqblF1euw4yxYX3CNw (https://pan.baidu.com/s/1juFUnqblF1euw4yxYX3CNw)密码:ygde

文档资料参考:https://www.cnblogs.com/pengdonglin137/p/4646269.html(https://www.cnblogs.com/pengdonglin137/p/4646269.html\


挂载ubi分区的例子:

ubiattach /dev/ubi_ctrl -m 8

mount -t ubifs ubi1:rootfs /mnt


制作ubifs镜像

1 mkfs.ubifs -r ../tmp/ -m 2048 -e 126976 -c 1024 -o ubifs.img

-r: 制定文件内容的位置

-m: 使用的nand flash的一个page大小

-e: 逻辑擦除块大小,对于支持subpage的flash来说ubinize的-s选项的值设置512

第一页的前512存放ECC(实际用了前64B),接下来的512B(前64B)存放UBI headers,

逻辑块的大小就是128KiB-2KiB=126KiB,转化成十进制就是129024。

对于不支持subpage的flash来说ubinize的-s选项的值设置2048,

第一页用来存放ECC(实际用了前64B),第二页用来存放(前64B)存放UBI headers,

逻辑块的大小就是128KiB-2KiB-2KiB=124KiB,转化成十进制就是126976.

-c: 最大的逻辑擦除块数量,表示可以使用的文件系统大小为小于等于 126976*1024=124M

2 ubinize -o rootfs.img -m 2048 -p 128KiB -s 2048 -O 2048 ./ubinize.cfg

-o: 输出文件

-m: 使用的nand flash的一个page大小

-p: 物理擦除块大小

-O: 指定 VID header 的偏移位置

-s: 最小的硬件输入输出页面大小,不支持subpage的应该设置成page大小,否则设置成subpage大小

3 ubinize 的配置文件:

cat ubinize.cfg

[ubifs] mode=ubi image=ubifs.img # 指定通过mkfs.ubifs生成的镜像

vol_id=0 # 表示volume的编号,一个ubi设备中可以有多个volume。(这种情况下,/dev下会出现 ubi0 和 ubi0_0)

vol_size=100MiB # 表示ubi0_0的大小,即volume0的大小,设置成分区大小减5M,如果坏块多需要减的多一些。

vol_type=dynamic # 表示volume的类型,分为dynamic和static两种,其中dynamic类型的设备表示可以读写,static类型的设备表示只读

vol_alignment=1 vol_name=rootfs # 表示volume的名称,在挂载ubi分区是会使用到,如在cmdline中的root=ubi0:rootfs vol_flags=autoresize


ubifs 文件系统在开发板内部进行烧写

ubiformat -V (如果ubiformat 版本号高于1.5.1可能不能够烧写)

等待进入系统后,ubiformat /dev/mtd7(rootfs 的分区) -f rootfs.img(根文件系统文件名)

将 mtd 设备加到 ubi 池: ubiattach /dev/ubi_ctrl -m 7(对应mtd7)

挂载文件系统: mount -t ubifs ubi0:rootfs /tmp

results matching ""

    No results matching ""