一、flash相关概念
TI COM335 升级功能,板子采用的是一个512M的nand flash,使用mtd管理分区,mtd同时提供了字符设备节点和块设备节点读写flash分区内容:
Nand flash特性:
1)每一位只能从1写0,不能从1写0
2) 虽以block为单位,真正读写按照page
当然可以借助mtd命令或者uboot阶段的flash读写命令直接擦除烧写flash,但是当系统启动以后运行文件系统,这种方式明显有问题,比如flash_erase擦除mtd下的分区时候会有部分进程使用这些flash,会有报错,回退版本以及升级失败变砖的可能都会发生。
二、ubifs文件系统
1、 生成根文件系统镜像
命令: mkfs.ubifs -q -F -r rootfs -m 2048 -e 126976 -c 1963 -o am335x_ubifs.img
参数说明:
-F: 特殊标志位,使第一次挂载文件系统时修整 Nandflash 剩余空间,以防文件系统认为 ECC 错误;
-r rootfs: 制定镜像的源文件(rootfs)也就是通过编译buildroot生成的文件系统
-m 2048: 页面大小,由 Nandflash 属性决定(evb335x 使用的 nangdflash 为 K9F2G08,其 page 大小为 2048,2KB);
-e 126976: 逻辑擦除块大小。K9F2G08 的 block size 为 131072(128KB),但每个 block 前两个 page
分别用来存放 ubi 的 EC Header 和 VID header,因此逻辑擦除块大小为:
131072-2*2048=126976;
-c 1963: 用于 ubi 的最大逻辑擦除块数量, 由 Nand 分区 rootfs 大小决定(参考本文档“2.2 Nand Flash
分区”,rootfs size = 0x0f580000,其 block 数量等于:0x0f580000/131072=1964),MTD
官
网上提到,其中一个 block 保留给 ubi,所以此处为 1963;(注:如果是 512M 的 Nandflash,
则此处应该为 4011)
-o am335x_ubifs.img: 生成的镜像文件名(可自定义)。
2、生成可以烧写的的镜像
命令: ubinize -o root.ubi -m 2048 -p 128KiB -s 512 -O 2048 ubinize.cfg
1)、ubinize.cfg文件内容
ubifs]
mode=ubi
image=am335x_ubifs.img //上一步生成的根文件系统镜像
vol_id=0
vol_size=100MiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
2)参数讲解
-o root.bin: 生成的根文件系统烧录镜像文件(名称可自定义,但用 SD 卡自动烧录时 u-boot 默认
-m 2048: 页面大小,由Nand flash属性决定(evb335x 使用的 nangdflash 为 K9F2G08,其页面大小(每个 block 大小为2048B, 2KB);
-p 128 KiB:物理擦出块大小, 属性由Nand flash决定(K9F2G08 每个 block 大小为 128KB);
-s 512: sub-page 大小,由 Nandflash 属性决定(K9F2G08 每个 page 包含 4 个 sub-page ,sub-page 为 512B);
-O 2048:存放 VID header 的起始位置,(每个 block 第 0 个 page 存放 EC header,第 1 个 page存放VID header,每个page 大小为 2048B,因此 VID header 的起始位置为 2048)。
三、烧写验证
1、查看当前系统的ubi情况
2、将sys/class/ubi/ubi0_0挂载到本地mnt目录下
3、修改增加删除mnt目录下的文件
发现文件系统根目录下的文件也发生了改变,当重启开发板以后刚才的修改被保存了下来,不需要再进行umount解除挂载