NAND simulator の使用方法
NAND simulator の使用方法
NAND simulator(nandsim) という RAMディスク上で NAND フラッシュをエミュレートするドライバがある。
modprobe nandsim
で nandsim をロードできるが、パラメータを指定してロードする。
以下のページで説明されているが、first_id_byte, second_id_byte, third_id_byte, fourth_id_byte の引数を指定してロードするが、何を指定すべきなのかわからない。
どのような値を指定するのか説明する。
nandsim は "Read ID" command に対する応答を指定する。
コマンド応答の一バイト目を first_id_byte(=Manufacturer ID) で指定し
コマンド応答の二バイト目を second_id_byte(=Chip ID) で指定し
コマンド応答の三バイト目を third_id_byte (意味は Manufacturer 依存)で指定し
コマンド応答の四バイト目を fourth_id_byte (意味は Manufacturer 依存)で指定する。
以下の P17
指定する値 (first_id_byte, ... fourth_id_byte)
first_id_byte
例えば Samsung は NAND_MFR_SAMSUNG(0xec)
NAND フラッシュの Manufacturer ID は以下で定義されている。
second_id_byte
nand_flash_ids
で定義された Chip Id 値を second_id_byte で指定する。
EXTENDED_ID_NAND("NAND 64MiB 1,8V 8-bit", 0xA2, 64, LP_OPTIONS),
例えば、上記の定義で second_id_byte
として 0xA2
を指定すると、NAND 64MiB 1,8V 8-bit
と認識する。
third_id_byte
以下の P17
Samsung の場合、don't care なので何でも良い。
fourth_id_byte
以下の P17
0x95 または 0x15
例1
EXTENDED_ID_NAND("NAND 64MiB 1,8V 8-bit", 0xA2, 64, LP_OPTIONS),
modprobe nandsim first_id_byte=0xec \
second_id_byte=0xa2 \
third_id_byte=0x51 \
fourth_id_byte=0x95
⇒
nand: Samsung NAND 64MiB 1,8V 8-bit
例2
EXTENDED_ID_NAND("NAND 256MiB 1,8V 8-bit", 0xAA, 256, LP_OPTIONS),
modprobe nandsim first_id_byte=0xec \
second_id_byte=0xaa \
third_id_byte=0x51 \
fourth_id_byte=0x95
⇒
nand: Samsung NAND 256MiB 1,8V 8-bit
指定する値 (parts)
first_id_byte, ... fourth_id_byte を指定した上で、parts
引数で MTD partition を指定する。カンマ区切りで MTD Partition のサイズを Erase Size 単位で指定する。
ここでは Erase Size は 128 KB だと想定する。
例えば以下のように parts=8,8,8
と指定したとする。
modprobe nandsim first_id_byte=0xec \
second_id_byte=0xaa \
third_id_byte=0x51 \
fourth_id_byte=0x95 \
parts=8,8,8
NAND 256MiB 1,8V 8-bit
と認識されて、mtd0, mtd1, mtd2 は 1MB の領域として認識されて残りの領域が mtd3 と認識される。
# dmesg | tail
[ 8549.758754] page address bytes: 5
[ 8549.758766] sector address bytes: 3
[ 8549.758779] options: 0x8
[ 8549.759881] Scanning device for bad blocks
[ 8549.780791] Creating 4 MTD partitions on "NAND 256MiB 1,8V 8-bit":
[ 8549.780826] 0x000000000000-0x000000100000 : "NAND simulator partition 0"
[ 8549.781472] 0x000000100000-0x000000200000 : "NAND simulator partition 1"
[ 8549.782150] 0x000000200000-0x000000300000 : "NAND simulator partition 2"
[ 8549.782659] 0x000000300000-0x000010000000 : "NAND simulator partition 3"
[ 8549.784765] [nandsim] warning: CONFIG_MTD_PARTITIONED_MASTER must be enabled to expose debugfs stuff
# cat /proc/mtd
dev: size erasesize name
mtd0: 00100000 00020000 "NAND simulator partition 0"
mtd1: 00100000 00020000 "NAND simulator partition 1"
mtd2: 00100000 00020000 "NAND simulator partition 2"
mtd3: 0fd00000 00020000 "NAND simulator partition 3"
巨大な NAND のエミュレート
EXTENDED_ID_NAND("NAND 16GiB 1,8V 8-bit", 0x1A, 16384, LP_OPTIONS),
16GB の NAND をエミュレートしたい場合、16GB の RAM が必要になる。
32GB とかの RAM を積んでいれば問題ないが、16GB しか積んでないとできないし
さらに大きな NAND をエミュレートする場合には不可能になる。
cache_file
引数を指定することで RAM の代わりにファイル上に NAND をエミュレートできる。
cache_file 引数を指定してロードする。
# modprobe nandsim first_id_byte=0xec \
second_id_byte=0x1A \
third_id_byte=0x51 \
fourth_id_byte=0x95 \
cache_file=nandfile \
parts=8,8,8
NAND が認識されている。
# dmesg | tail
[50521.664480] page address bytes: 5
[50521.664481] sector address bytes: 3
[50521.664481] options: 0x8
[50521.664697] Scanning device for bad blocks
[50521.737064] Creating 4 MTD partitions on "NAND 16GiB 1,8V 8-bit":
[50521.737071] 0x000000000000-0x000000100000 : "NAND simulator partition 0"
[50521.738814] 0x000000100000-0x000000200000 : "NAND simulator partition 1"
[50521.740299] 0x000000200000-0x000000300000 : "NAND simulator partition 2"
[50521.741339] 0x000000300000-0x000400000000 : "NAND simulator partition 3"
[50521.748288] [nandsim] warning: CONFIG_MTD_PARTITIONED_MASTER must be enabled to expose debugfs stuff
指定したファイルを確認する。指定したファイルは空ファイル。
# ls
nandfile snap
# ls -l
合計 4
-rw------- 1 root root 0 8月 15 08:09 nandfile
drwx------ 5 root root 4096 7月 17 23:05 snap
mtd-tools をインストールする
# apt install -y mtd-tools
/dev/mtd3
を format する
# ubiformat /dev/mtd3
ubiformat: mtd3 (nand), size 17176723456 bytes (15.9 GiB), 131048 eraseblocks of 131072 bytes (128.0 KiB), min. I/O size 2048 bytes
libscan: scanning eraseblock 131047 -- 100 % complete
ubiformat: 131048 eraseblocks are supposedly empty
ubiformat: formatting eraseblock 131047 -- 100 % complete
指定したファイルを確認する。指定したファイルは 16GiB になった。
# ls -lh
合計 514M
-rw------- 1 root root 17G 8月 15 08:16 nandfile
drwx------ 5 root root 4.0K 7月 17 23:05 snap
# ls -l
合計 524476
-rw------- 1 root root 17716607040 8月 15 08:16 nandfile
drwx------ 5 root root 4096 7月 17 23:05 snap
Discussion