Testing ECC bitflip correction¶
The ECC algorithm for the 256MB nand part is BCH8, which means it can repair 8 bitflips per page. The 512MB and 1GB nand parts use BCH16, and so can repair 16 bitflips per page.
https://processors.wiki.ti.com/index.php/Raw_NAND_ECC#What_are_the_various_algorithms_and_the_differences_used_to_implement_ECC.3F
Manually creating bitflips in U-boot¶
Note: This requires a U-boot version with nand read.raw/write.raw, u-boot 2018 works
Reference: https://stackoverflow.com/a/44245633/780194
Below shows an example for the 512MB nand, but should work for other nand sizes if we leave page_addr at 0:
=> setenv ram_addr1 $loadaddr
=> setenv page_addr 0
=> setenv page_size 1000
# Make sure there is actually something in nand
=> nand erase.chip && mw.b $loadaddr ff 40000 && load mmc 0 $loadaddr MLO && nand write.i $loadaddr $page_addr $filesize
# Read one raw page
=> nand read.raw ${ram_addr1} ${page_addr} 1
# Clear x number of bits
=> mm $ram_addr1
83000000: 00000040 ?
...
83000018: 4e495454 ?
8300001c: 00005347 ?
83000020: ffffffff ? efffffff
83000024: ffffffff ? => <INTERRUPT>
# Write back page
=> nand write.raw ${ram_addr1} ${page_addr} 1
# Read the page
=> nand read ${ram_addr1} ${page_addr} ${page_size}
NAND read: device 0 offset 0x0, size 0x40000
262144 bytes read: OK
# Verify flipped bit was corrected
=> md.l $ram_addr1 40
83000000: 00000040 0000000c 00000000 00000000 @...............
83000010: 00000000 45534843 4e495454 00005347 ....CHSETTINGS..
83000020: ffffffff ffffffff ffffffff ffffffff ................
83000030: ffffffff ffffffff ffffffff ffffffff ................
Make sure you try again with too many bitflips to make sure it fails
...
=> mm $ram_addr1
...
83000020: cccccccc ? 8ccccccc
83000024: ffffffff ? => <INTERRUPT>
=> nand write.raw ${ram_addr1} ${page_addr} 1
NAND write: 4320 bytes written: OK
=> nand read ${ram_addr1} ${page_addr} ${page_size}
NAND read: device 0 offset 0x0, size 0x40000
elm_config: 2
omap-elm: uncorrectable ECC errors
NAND read from offset 0 failed -74
0 bytes read: ERROR
Manually creating bitflips in Linux¶
Below shows an example for the 512MB nand, but should work for other nand sizes:
# Ensure nand page is programmed with something root@mitysom-335x:~# flash_erase /dev/mtd1 0 0 Erasing 256 Kibyte @ 0 -- 100 % complete root@mitysom-335x:~# nandwrite -p /dev/mtd1 /run/media/mmcblk0p1/MLO Writing data to block 0 at offset 0x0 # Test there are no bitflips to start root@mitysom-335x:~# nanddump /dev/mtd1 -l 4096 > /dev/null ECC failed: 0 ECC corrected: 0 Number of bad blocks: 0 Number of bbt blocks: 0 Block size 262144, page size 4096, OOB size 224 Dumping data starting at 0x00000000 and ending at 0x00001000... # Dump raw nand page, length may change depending on page size of nand root@mitysom-335x:~# nanddump --oob /dev/mtd0 -l 4096 -f nandpage.raw ECC failed: 0 ECC corrected: 0 Number of bad blocks: 1 Number of bbt blocks: 0 Block size 262144, page size 4096, OOB size 224 Dumping data starting at 0x00000000 and ending at 0x00001000... # Convert to hex root@mitysom-335x:~# xxd nandpage.raw > nandpage.xxd # Clear one or more bits in the hex output # Note we are not doing a nand erase so it's not possible to change a bit from a zero to a one, so make sure to only clear bits root@mitysom-335x:~# vi nandpage.xxd # Convert back to binary root@mitysom-335x:~# xxd -r nandpage.xxd nandpage.flipped # Write back to nand root@mitysom-335x:~# nandwrite --oob -noecc /dev/mtd1 nandpage.flipped Writing data to block 0 at offset 0x0 root@mitysom-335x:~# nanddump /dev/mtd1 -l 4096 > /dev/null ECC failed: 1 ECC corrected: 0 Number of bad blocks: 0 Number of bbt blocks: 0 Block size 262144, page size 4096, OOB size 224 Dumping data starting at 0x00000000 and ending at 0x00001000... ECC: 1 corrected bitflip(s) at offset 0x00000000
Go to top