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 코드가 맞다고 생각합니다. (내가 틀렸다면 정정해주세요).

관련 정보