一、参考资料
在嵌入式系统中,与文件系统相关的存储设备包括硬盘、Flash存储器等。Flash存储器又分为Flash芯片设备(Raw Flash device,也叫MTD设备)和带Flash控制器的设备(Flash Translation Layer device, FTL设备),两者的关键区别是是否带有Flash控制器,这也直接决定了文件系统分为不同的两类。
其中MTD设备包括NOR Flash、NAND Flash等,FTL设备包括SD、eMMC、SSD、USB大容量存储设备等。如图所示JFFS2、YAFFS2、UBIF、LogFS支持MTD设备,FAT、EXT3/4、XFS和Btrfs支持 FTL设备和硬盘(HDD)。MTD设备对应的设备文件为/dev/mtd,FTL设备对应的设备文件可为/dev/mtdblock。
二、mtd-utils 工具
mtd-utils需要预先编译进linux_rootfs中,否则没有这些命令。
1.使用 cat /proc/mtd
命令查看QSPI FLASH的分区信息
root@zedboard:~# cat /proc/mtd
dev: size erasesize name
mtd0: 00500000 00010000 "boot"
mtd1: 00020000 00010000 "bootenv"
mtd2: 00a80000 00010000 "kernel"
mtd3: 01060000 00010000 "spare"
2.使用 mtd_debug info /dev/mtd0
命令查看FLASH类型、分区大小、块大小
root@zedboard:~# mtd_debug info /dev/mtd0
mtd.type = MTD_NORFLASH
mtd.flags = MTD_CAP_NORFLASH
mtd.size = 5242880 (5M)
mtd.erasesize = 65536 (64K)
mtd.writesize = 1
mtd.oobsize = 0
regions = 0
3.使用 flash_eraseall /dev/mtd1
擦除选择的某个mtd分区。
root@zedboard:~# flash_eraseall /dev/mtd1
flash_eraseall has been replaced by `flash_erase <mtddev> 0 0`; please use it
Erasing 64 Kibyte @ 10000 -- 100 % complete
4.使用 flashcp -v BOOT.BIN /dev/mtd0
更新linux系统固件
更新U-BOOT。(对于ZYNQ,打包FSBL、BIT流、U-BOOT成BOOT.BIN,放在mtd0分区)
root@zedboard:~# flashcp -v firmware/BOOT.BIN /dev/mtd0
Erasing blocks: 7/7 (100%)
Writing data: 395k/0k (100%)
Verifying data: 395k/0k (100%)
更新image.ub内核。
root@zedboard:~# flashcp -v firmware/image.ub /dev/mtd2
Erasing blocks: 1/58 (1%)random: crng init done
Erasing blocks: 58/58 (100%)
Writing data: 3674k/0k (100%))
Verifying data: 3674k/0k (100%))
更新jffs2根文件系统。
root@zedboard:~# flashcp -v firmware/rootfs.jffs2 /dev/mtd3
Erasing blocks: 104/104 (100%)
Writing data: 6656k/0k (100%))
Verifying data: 6656k/0k (100%))
5.使用 mtd_debug read /dev/mtd0 0x0 0x20000
读取出FLASH中的数据,确认是否刷写成功
root@zedboard_jffs2:~# mtd_debug read /dev/mtd0 0x0 0x20000 ~/test
Copied 131072 bytes from address 0x00000000 in flash to /home/root/test