我正在开发一个嵌入式Linux系统(5.10.24),其中有一个NAND FLASH作为存储。 NAND FLASH 支持内部 ECC,并具有 128Bytes OOB。
它的 DS 表示,如果启用了 ECC,则最后 64 字节将用作 ECC,并且可以读取整个 128 字节 OOB。
所以我在Linux中编写了一个C程序来读取OOB,如下所示,
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
我不确定读取的数据是否正确。
我尝试了nand dump.oob 0x2048
u-boot,但我得到了64字节的0xFF,没有读取ECC数据。
那么我转储/读取整个 128Byte OOB 的代码正确吗?如果没有,如何在Linux中读取整个NAND OOB?
答案1
我想我在某种程度上已经明白了。
首先,我在我的私有 u-boot 中发现了一个错误,将 OOB 大小设置为 64B 而不是 128B。通过将其设置为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 程序来读取同一页,并得到相同的数据。
所以,我认为 C 代码在读取/转储 NAND 的 OOB 时是正确的。 (如果我错了,请纠正我)。