测试工具版本:PetaLinux 2018.2
测试单板: ZCU106
UBIFS是更强壮的FLash文件系统。很多嵌入式系统都使用了UBIFS。
Xilinx PetaLinux 2018.2也支持UBIFS。只需要在Linux/U-Boot里添加相关配置选项,就能为QSPI Flash创建UBIFS。
第1步,为Linux Kernel添加UBIFS配置选项。
需要注意的是,需要去掉SPI_NOR_USE_4K_SECTORS。
CONFIG_MTD_UBI=y
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MTD_UBI_BEB_LIMIT=20
# CONFIG_MTD_UBI_FASTMAP is not set
# CONFIG_MTD_UBI_GLUEBI is not set
# CONFIG_MTD_UBI_BLOCK is not set
CONFIG_UBIFS_FS=y
# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
CONFIG_UBIFS_FS_LZO=y
CONFIG_UBIFS_FS_ZLIB=y
CONFIG_UBIFS_ATIME_SUPPORT=y
# CONFIG_UBIFS_FS_ENCRYPTION is not set
CONFIG_UBIFS_FS_SECURITY=y
CONFIG_CRYPTO_DEFLATE=y
CONFIG_CRYPTO_LZO=y
# CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set
第2步,为U-Boot添加UBIFS配置选项。
CONFIG_CMD_MTDPARTS=y
CONFIG_MTDIDS_DEFAULT=""
CONFIG_MTDPARTS_DEFAULT=""
CONFIG_CMD_MTDPARTS_SPREAD=y
CONFIG_CMD_UBI=y
CONFIG_CMD_UBIFS=y
CONFIG_MTD=y
# CONFIG_CFI_FLASH is not set
# CONFIG_ALTERA_QSPI is not set
CONFIG_MTD_UBI=y
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MTD_UBI_BEB_LIMIT=20
# CONFIG_MTD_UBI_FASTMAP is not set
CONFIG_RBTREE=y
CONFIG_LZO=y
第3步,根据单板需要,定义Flash分区。
启动后,在Linux里可以通过命令 cat /proc/mtd检查。
root@zcu106_vcu_trd:/qspi_fs# cat /proc/mtd
dev: size erasesize name
mtd0: 01e00000 00020000 "boot"
mtd1: 00040000 00020000 "bootenv"
mtd2: 00c00000 00020000 "kernel"
mtd3: 055c0000 00020000 "spare"
第4步,在Linux里创建和挂载UBIFS分区。
如果是第一次启动,在Linux里创建和挂载UBIFS分区。
mkdir -p /qspi_fs
ubiformat /dev/mtd3
ubiattach /dev/ubi_ctrl -m 3
ubimkvol /dev/ubi0 -N qspi_ubi0 -m
mount -t ubifs ubi0:qspi_ubi0 /qspi_fs
如果不是第一次启动,直接在Linux里挂载UBIFS分区。
ubiattach /dev/ubi_ctrl -m 3
mount -t ubifs ubi0:qspi_ubi0 /qspi_fs
第5步,创建分区后,在U-Boot里使用UBIFS。
sf probe 0 50000000 0
setenv partition "nor0,3" # Activate mtd3.
setenv mtdids "nor0=spi0.0"
setenv mtdparts "mtdparts=spi0.0:30m(boot),256k(bootenv),12m(kernel),87808k(spare)"
mtdparts
ubi part spare # Select mtd3.
mtd
ubifsmount ubi0:qspi_ubi0
ubifsls
ubifsload 0x2000000 qspi_fs_ready__do_not_remove.bin.md5
更详细的在U-Boot里使用UBIFS的记录。
ZynqMP> sf probe 0 50000000 0
SF: Detected n25q512a with page size 512 Bytes, erase size 128 KiB, total 128 MiB
ZynqMP> setenv partition "nor0,3"
ZynqMP> setenv mtdids "nor0=spi0.0"
ZynqMP> setenv mtdparts "mtdparts=spi0.0:30m(boot),256k(bootenv),12m(kernel),87808k(spare)"
ZynqMP> mtdparts
device nor0
#: name size offset mask_flags
0: boot 0x01e00000 0x00000000 0
1: bootenv 0x00040000 0x01e00000 0
2: kernel 0x00c00000 0x01e40000 0
3: spare 0x055c0000 0x02a40000 0
active partition: nor0,3 - (spare) 0x055c0000 @ 0x02a40000
defaults:
mtdids :
mtdparts:
ZynqMP> ubi part spare
ubi0: attaching mtd2
ubi0: scanning is finished
ubi0: attached mtd2 (name "mtd=3", size 85 MiB)
ubi0: PEB size: 131072 bytes (128 KiB), LEB size: 130944 bytes
ubi0: min./max. I/O unit sizes: 1/512, sub-page size 1
ubi0: VID header offset: 64 (aligned 64), data offset: 128
ubi0: good PEBs: 686, bad PEBs: 0, corrupted PEBs: 0
ubi0: user volume: 1, internal volumes: 1, max. volumes count: 128
ubi0: max/mean erase counter: 1/0, WL threshold: 4096, image sequence number: 1968612066
ubi0: available PEBs: 0, total reserved PEBs: 686, PEBs reserved for bad PEB handling: 0
ZynqMP> ubifsmount ubi0:qspi_ubi0
UBIFS assert failed in ubifs_change_lp at 540
UBIFS assert failed in ubifs_release_lprops at 278
UBIFS assert failed in ubifs_change_lp at 540
UBIFS assert failed in ubifs_release_lprops at 278
UBIFS assert failed in ubifs_change_lp at 540
UBIFS assert failed in ubifs_release_lprops at 278
UBIFS assert failed in ubifs_change_lp at 540
UBIFS assert failed in ubifs_release_lprops at 278
ZynqMP> ubifsls
1024 Fri Feb 01 09:57:29 2019 qspi_fs_ready__do_not_remove.bin
76 Fri Feb 01 09:57:29 2019 qspi_fs_ready__do_not_remove.bin.md5
ZynqMP> ubifsload 0x2000000 qspi_fs_ready__do_not_remove.bin.md5
Loading file 'qspi_fs_ready__do_not_remove.bin.md5' to addr 0x02000000...
Done
ZynqMP> md 0x2000000
02000000: 63336432 36336334 35333664 33316537 2d3c4c36d6357e13
02000010: 65636164 31303032 61626234 62393632 dace20014bba269b
文章转载自:赛灵思中文社区论坛