如何在Linux中读取NAND OOB(包括ECC)数据?

如何在Linux中读取NAND OOB(包括ECC)数据?

我正在开发一个嵌入式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 0x2048u-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 时是正确的。 (如果我错了,请纠正我)。

相关内容