📘

NAND simulator の使用方法

2022/08/14に公開

NAND simulator の使用方法

NAND simulator(nandsim) という RAMディスク上で NAND フラッシュをエミュレートするドライバがある。

modprobe nandsim で nandsim をロードできるが、パラメータを指定してロードする。

以下のページで説明されているが、first_id_byte, second_id_byte, third_id_byte, fourth_id_byte の引数を指定してロードするが、何を指定すべきなのかわからない。
http://www.linux-mtd.infradead.org/faq/nand.html#L_nand_nandsim

どのような値を指定するのか説明する。

nandsim は "Read ID" command に対する応答を指定する。

コマンド応答の一バイト目を first_id_byte(=Manufacturer ID) で指定し
コマンド応答の二バイト目を second_id_byte(=Chip ID) で指定し
コマンド応答の三バイト目を third_id_byte (意味は Manufacturer 依存)で指定し
コマンド応答の四バイト目を fourth_id_byte (意味は Manufacturer 依存)で指定する。

https://github.com/raspberrypi/linux/blob/a90c1b9c7da585b818e677cbd8c0b083bed42c4d/drivers/mtd/nand/raw/nandsim.c#L108-L111

以下の P17

https://media-www.micron.com/-/media/client/onfi/pdfs/idf_s06_mems005_rev_h_usa.pdf?la=en&rev=b021e11bea7d454798841442acf33937

指定する値 (first_id_byte, ... fourth_id_byte)

first_id_byte

例えば Samsung は NAND_MFR_SAMSUNG(0xec)

NAND フラッシュの Manufacturer ID は以下で定義されている。
https://github.com/raspberrypi/linux/blob/a90c1b9c7da585b818e677cbd8c0b083bed42c4d/drivers/mtd/nand/raw/internals.h#L19-L35

second_id_byte

nand_flash_ids で定義された Chip Id 値を second_id_byte で指定する。

https://github.com/raspberrypi/linux/blob/rpi-5.15.y/drivers/mtd/nand/raw/nand_ids.c#L23-L168

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

https://media-www.micron.com/-/media/client/onfi/pdfs/idf_s06_mems005_rev_h_usa.pdf?la=en&rev=b021e11bea7d454798841442acf33937

Samsung の場合、don't care なので何でも良い。

fourth_id_byte

以下の P17

https://media-www.micron.com/-/media/client/onfi/pdfs/idf_s06_mems005_rev_h_usa.pdf?la=en&rev=b021e11bea7d454798841442acf33937

0x95 または 0x15

例1

https://github.com/raspberrypi/linux/blob/rpi-5.15.y/drivers/mtd/nand/raw/nand_ids.c#L95

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

https://github.com/raspberrypi/linux/blob/rpi-5.15.y/drivers/mtd/nand/raw/nand_ids.c#L114

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 単位で指定する。

https://github.com/raspberrypi/linux/blob/a90c1b9c7da585b818e677cbd8c0b083bed42c4d/drivers/mtd/nand/raw/nandsim.c#L121

https://github.com/raspberrypi/linux/blob/a90c1b9c7da585b818e677cbd8c0b083bed42c4d/drivers/mtd/nand/raw/nandsim.c#L146

ここでは 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 をエミュレートできる。

https://github.com/raspberrypi/linux/blob/a90c1b9c7da585b818e677cbd8c0b083bed42c4d/drivers/mtd/nand/raw/nandsim.c#L128

https://github.com/raspberrypi/linux/blob/a90c1b9c7da585b818e677cbd8c0b083bed42c4d/drivers/mtd/nand/raw/nandsim.c#L162

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