由于工作原因,需要用到这款芯片,但是官方提供的dameo是从文件系统中烧写U-boot,设备树,内核,文件系统等操作。这种方式很不方便生产,于是打算走最常规的思路,从u- boot中去烧写,于是需要制作Ubi文件系统镜像。制作流程如下:
首先看一下mtd分区情况
0: NAND.SPL 0x00040000 0x00000000 0
1: NAND.SPL.backup1 0x00040000 0x00040000 0
2: NAND.SPL.backup2 0x00040000 0x00080000 0
3: NAND.SPL.backup3 0x00040000 0x000c0000 0
4: NAND.u-boot-spl-os 0x00080000 0x00100000 0
5: NAND.u-boot 0x00100000 0x00180000 0
6: NAND.u-boot-env 0x00040000 0x00280000 0
7: NAND.u-boot-env.backup10x00040000 0x002c0000 0
8: NAND.kernel 0x00700000 0x00300000 0
9: NAND.file-system 0x1f600000 0x00a00000 0 #文件系统用了502M
nand flash的物理性质
总大小 512M
擦除block size 128K
最小读写 2K
Sub-page size: 512 byte
mkfs.ubifs -F -r /home/zl/nfs/rootfs -m 2048 -e 126976 -c 4015 -o ubifs.img
-c:文件系统所占用的最大 block 数,一般小于等于 block count -1(nand 为 256M 的为2047,512M 的为 4095,这里需要根据U-boot给文件系统分了多大空间去计算)。
-F:使能"white-space-fixup",如果是通过 u-boot 烧写需要使能此功能。
-e:LEB size,对于 AM437x 的 NAND driver,为 block size-2x(page size)。
-r:待制作的文件系统目录。
-m:NAND FLASH 的最小读写单元,一般为 page size
ubinize.cfg文件如下:
[ubifs]
mode=ubi
image=ubifs.img
vol_id=0
vol_size=400MiB #这里不能太大,会出现问题,后面说
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
ubinize -o ubi.img -m 2048 -p 128KiB ubinize.cfg
-p:block size。
-m:NAND FLASH 的最小读写单元,一般为 page size。
-o:输出的 ubi.img 文件
这样正常情况ubi.img Ubi文件系统就制作完成了。
如果制作过程出现了如下错误:
这个是是由于偏移问题导致,我开发板中u-boot启动参数配置如下:console=ttyO0,115200n8 root=ubi0:rootfs rw ubi.mtd=NAND.file-system,4096 rootfstype=ubifs rootwait=1
这个预留了4096,将这里修改成2048就完事。
或者参考:http://www.linux-mtd.infradead.org/faq/ubi.html#L_vid_offset_mismatch
如果出现:too large reserved_pebs %d, good PEBs %d 类似错误
就需要修改ubinize.cfg 中的页表,将vol_size大小设置小一点