私はNAND FLASHをストレージとして使用する組み込みLinuxシステム(5.10.24)を開発しています。 NAND FLASHは内部ECCをサポートし、128Bytes OOBを持っています。
DSは、ECCがアクティブになると、最後の64バイトがECCとして使用され、128バイトのOOB全体を読み取ることができることを示しています。
そこで、以下のようにOOBを読むためにLinuxでCプログラムを作成しました。
fd = open(argv[1], O_RDWR | O_SYNC);
if (fd < 0) {
perror("Failed to open MTD device");
return -1;
}
if (ioctl(fd, MEMGETINFO, &mtd_info) < 0) {
perror("Failed to get MTD device info");
close(fd);
return -1;
}
printf("OOBSIZE: %d\n", mtd_info.oobsize);
oob_buf.start = atoi(argv[2]);
oob_buf.length = 128; // Hard code to 128B
oob_buf.ptr = malloc(oob_buf.length);
rc = ioctl(fd, MEMREADOOB, &oob_buf);
if (rc < 0) {
perror("Failed to read OOB data");
close(fd);
return -1;
}
for (int i = 0; i < oob_buf.length; i++) {
printf("%02X ", oob_buf.ptr[i]);
if ((i%0x10) == 0xf)
printf("\n");
}
printf("\n");
次に、次のようにコードを実行します。
# /tmp/nandoob /dev/mtd1 2048
OOBSIZE: 64
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
91 FF 19 A7 2E E2 62 C0 0D 36 24 42 78 86 FF FF
20 FF 53 0A 08 23 3B 06 CF BD 31 E7 B0 75 FF FF
BB FF 35 83 F3 AD 39 08 7A 9A 05 9B 98 8E FF FF
E1 FF F7 C1 23 58 A7 DD 8F 26 DC 3A 69 72 FF FF
読んでいるデータが正しいかどうかはわかりません。 u-bootを
試しましたが、nand dump.oob 0x2048
64バイトの0xFFを取得し、ECCデータを読み取ることができませんでした。
それでは、128Byte OOB全体をダンプ/読み取りするコードは正しいですか?そうでない場合、LinuxでNAND OOB全体を読み取る方法は?
答え1
ある程度分かったと思います。
まず、OOBサイズを128Bではなく64Bに設定したプライベートu-bootでバグを見つけました。 128Bに設定すると、次のようにOOBデータを取得できます。
# nand dump.oob 100000
Page 00100000 dump:
OOB:
ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff
f2 ff 58 81 ff cd d8 b8
ff ff ff ff ff ff ff ff
fa ff c1 ad 20 5f cb a8
ff ff ff ff ff ff ff ff
f8 ff 65 8d 79 61 35 1a
ff ff ff ff ff ff ff ff
ff ff 01 12 35 1d 0a 8f
ff ff ff ff ff ff ff ff
その後、Cプログラムを呼び出して同じページを読み、同じデータを取得します。
そのため、NANDのOOBを読み取ったりダンプしたりするには、Cコードが正しいと思います。 (私が間違っている場合は訂正してください)。