【发布时间】:2020-06-04 00:04:28
【问题描述】:
我正在尝试在 U-boot 中测试 ECC(纠错码)。为此,我想使用 U-boot 在 NAND 闪存中翻转一点而不重写 CRC。然后,当我重新启动处理器时,我希望看到 U-boot 使用 ECC 纠正该位。
问题是如何使用 U-boot 将新的位或字节或页面写入内存而不写入新的 CRC?
【问题讨论】:
标签: u-boot
我正在尝试在 U-boot 中测试 ECC(纠错码)。为此,我想使用 U-boot 在 NAND 闪存中翻转一点而不重写 CRC。然后,当我重新启动处理器时,我希望看到 U-boot 使用 ECC 纠正该位。
问题是如何使用 U-boot 将新的位或字节或页面写入内存而不写入新的 CRC?
【问题讨论】:
标签: u-boot
从来没有发现过更苦的实现的u-boot,源代码通常是这样的:
if (strcmp(cmd, "biterr") == 0) {
/* todo */
return 1;
}
在这种情况下,要走的路稍微复杂一些。由于我花了一些时间才发现如何做到这一点,我相信这里描述的手动过程可能对其他人有所帮助。
nand read ${ram_addr1} ${sector_addr} ${sector_size}
nand read.oob ${ram_addr2} ${sector_addr} ${oob_size}
nand erase ${sector_addr} ${sector_size}
nand write ${ram_addr1} ${sector_addr_plus_page_size} ${sector_size_minus_page_size}
cp ${ram_addr2} ${ram_addr1} ${oob_size}
mm ${ram_addr1_plus_biterr_offset}
#modify a single bit of the referred data
nand write.raw ${ram_addr1} ${sector_addr} 1
检查是否收到 bitflip 错误消息:
nand read ${ram_addr1} ${sector_addr} ${sector_size}
请注意,您可以将环境设置为按原样运行此命令,或将 ${} 指令替换为原始值。 ram_addr1 和 ram_addr2 可以是任何可用的内存地址,只要 ram_addr2 - ram_addr1 > sector_size
【讨论】:
使用 nand bitrr 模拟偏移处的位翻转。
例如,第 2 个块中字节 69 [0x45] 中的位 3 = 0x20000
U-Boot> nand biterr 0x20045 3
Erasing at 0x20000 -- 100% complete.
toggling bit 3 in byte 45 in block 20000 00 ->08
byte offset 0x00020045 toggled bit 3
参考:
【讨论】:
您可以使用 nand read.raw 和 nand write.raw 将写入传递给 OOB。
【讨论】:
为了简化@Jonatan-Goebel 的回答,只要您只清除位,就可以避免很多步骤,因为这不需要擦除 nand。
=> 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
elm_config: 2
nand: bit-flip corrected @data=35
262144 bytes read: OK
请确保您再次尝试使用太多位翻转以确保失败
...
=> 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
【讨论】: