首先安装nandsim模块,通过模块参数可以指定要模拟的nand型号参数,这些参数决定了nand大小,page size, oob size等。
安装128MiB, 2048 bytes page的nand:
# modprobe nandsim first_id_byte=0xec second_id_byte=0xa1 third_id_byte=0x00 fourth_id_byte=0x15
安装后可以看到mtd出现了一个分区:
$ cat /proc/mtd
dev: size erasesize name
mtd0: 08000000 00020000 "NAND simulator partition 0"
mtd的名字好像是不能更改。可以指定多个分区。具体可以使用 modinfo nandsim 来查看nandsim的信息。
2 写入ubi image到mtd
2.1 先擦除mtd
# flash_eraseall /dev/mtd0
flash_eraseall has been replaced by `flash_erase <mtddev> 0 0`; please use it
Erasing 128 Kibyte @ 7fe0000 -- 100 % complete
2.2 写入image
# flashcp firmware_ubi_release_6.0.47.bin /dev/mtd0
ubi命令需要安装ubi模块。ubifs文件系统需要安装ubifs模块。
# modprobe ubi
# modprobe ubifs
# modprobe mtdblock
可以使用lsmod查看安装情况。
attach就是从mtd分区加载ubi。
# ubiattach -O 2048 -p /dev/mtd0
UBI device number 0, total 1024 LEBs (130023424 bytes, 124.0 MiB), available 998 LEBs (126722048 bytes, 120.8 MiB), LEB size 126976 bytes (124.0 KiB)
注意需要根据ubi image和nand flash的参数设置-O选项,该选项默认为512。
加载后,可以看到
# ls /sys/class/ubi/ubi0 -1
avail_eraseblocks
bad_peb_count
bgt_enabled
dev
eraseblock_size
max_ec
max_vol_count
min_io_size
mtd_num
power
reserved_for_bad
ro_mode
subsystem
total_eraseblocks
uevent
volumes_count
注意需要先安装好ubi模块,否则系统不支持ubi。attach将失败
# ubiattach -O 2048 -p /dev/mtd0
ubiattach: error!: UBI is not present in the system
attach之后,可以deattach:
# ubidetach -d 0
如果第2步写入的镜像包含ubi分区。那么attach的时候,分区也会被解析:
# ls /sys/class/ubi/
ubi0 ubi0_0 ubi0_1 version
如上ubi0有2个分区:ubi0_0/ubi0_1,可以读取分区的名字:
# cat /sys/class/ubi/ubi0_0/name
kernel
可以使用ubinfo查看ubi的信息:
# ubinfo -a /dev/ubi0
ubi0
Volumes count: 2
Logical eraseblock size: 126976 bytes, 124.0 KiB
Total amount of logical eraseblocks: 1024 (130023424 bytes, 124.0 MiB)
Amount of available logical eraseblocks: 849 (107802624 bytes, 102.8 MiB)
Maximum count of volumes 128
Count of bad physical eraseblocks: 0
Count of reserved physical eraseblocks: 20
Current maximum erase counter value: 1
Minimum input/output unit size: 2048 bytes
Character device major/minor: 239:0
Present volumes: 0, 1
Volume ID: 0 (on ubi0)
Type: dynamic
Alignment: 1
Size: 22 LEBs (2793472 bytes, 2.6 MiB)
State: OK
Name: kernel
Character device major/minor: 239:1
-----------------------------------
Volume ID: 1 (on ubi0)
Type: dynamic
Alignment: 1
Size: 127 LEBs (16125952 bytes, 15.3 MiB)
State: OK
Name: rootfs
Character device major/minor: 239:2
ubi attach之后,ubi和ubi分区将在/dev/下创建对应的char dev
# ls /dev/ubi*
/dev/ubi0 /dev/ubi0_0 /dev/ubi0_1 /dev/ubi_ctrl
但是有些文件系统,如squashfs需要块设备。使用ubiblock可以创建块设备
# ubiblock -c /dev/ubi0_1
如上分区2是一个squashfs分区,第5步创建块设备后,使用mount可以
# mount -t squashfs /dev/ubiblock0_1 rootfs/
mount: /work/test/mtkax3000flash/xiange/rootfs: WARNING: device write-protected, mounted read-only.
此时可以查看rootfs的内容:
# ls rootfs/
bin data data_ignor_reset dev etc lib lib64 mnt overlay proc readonly rom root sbin sys tmp userdisk usr var www
如果是ubifs。则不用第5步。直接mount,但是需要安装ubifs模块。
# mount -t ubifs ubi0_1 rootfs
参考:
http://www.linux-mtd.infradead.org/faq/nand.html