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