LinuxでNAND OOB(ECCを含む)データを読み取るには?

LinuxでNAND OOB(ECCを含む)データを読み取るには?

私は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 0x204864バイトの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コードが正しいと思います。 (私が間違っている場合は訂正してください)。

関連情報