【问题标题】:Use U-boot to change a bit in NAND flash memory使用 U-boot 改变 NAND 闪存中的位
【发布时间】:2020-06-04 00:04:28
【问题描述】:

我正在尝试在 U-boot 中测试 ECC(纠错码)。为此,我想使用 U-boot 在 NAND 闪存中翻转一点而不重写 CRC。然后,当我重新启动处理器时,我希望看到 U-boot 使用 ECC 纠正该位。

问题是如何使用 U-boot 将新的位或字节或页面写入内存而不写入新的 CRC?

【问题讨论】:

    标签: u-boot


    【解决方案1】:

    从来没有发现过更苦的实现的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_addr1ram_addr2 可以是任何可用的内存地址,只要 ram_addr2 - ram_addr1 > sector_size

    【讨论】:

      【解决方案2】:

      使用 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
      

      参考:

      http://www.infopoort.nl/index.php/Software:U-Boot

      【讨论】:

        【解决方案3】:

        您可以使用 nand read.raw 和 nand write.raw 将写入传递给 OOB。

        【讨论】:

          【解决方案4】:

          为了简化@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
          

          【讨论】:

            猜你喜欢
            • 2012-01-25
            • 1970-01-01
            • 2020-08-24
            • 2016-11-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-10
            • 1970-01-01
            相关资源
            最近更新 更多