如何使用oob正确nandwrite一个nanddump的转储?

Alv*_*ong 5 linux embedded

我正在努力在 Linux 中刷新嵌入式设备的先前 ROM 转储。我以前的转储包含 oob 数据。我用 写了它nandwrite -n -N -o /dev/mtd0 backup.bin,然后再次进行 ROM 转储。

通过比较新旧 ROM 转储,我看到了一些无法解释的情况:任何空块(填充 0xFF)的 oob(ecc 字节)的最后 24 个字节也应该是 0xFF,但新 ROM 中的那些dump 填充了 0x00,导致以后的写入失败。

oob 应该是:

FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
Run Code Online (Sandbox Code Playgroud)

但对于nandwrite:

FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF 00000000 00000000
00000000 00000000 00000000 00000000
Run Code Online (Sandbox Code Playgroud)

任何人都知道为什么?


我在nandwrite代码中添加了一个 hack,如果要写入的内容是0xFF,则跳过写入 NAND ,并且它起作用了。那么在尝试将空页写入 NAND 时会出现问题吗?


添加:

现在我在编写引导加载程序映像时也遇到了这个问题。图像不是页面对齐的,所以nandwrite用0xFF. 但是对于只有0xFFecc 字节的页面仍然0x00像上面一样受到污染。似乎我的黑客并没有完全解决我的问题。任何人都可以帮忙吗?也许它可能是内核 2.6.35 中的错误?

这是我的黑客:

int i;
int needwrite=0;
for (i = 0 ; i < len ; ++i){
    if(((uint8_t*)data)[i]!=0xff){
        needwrite=1;
        break;
    }
}
if(!needwrite)
    return 0;
Run Code Online (Sandbox Code Playgroud)

Alv*_*ong 0

我的黑客是添加一个检查nandwrite,如果要写入的整个页面完全是空的(即充满0xFF),程序将跳过写入它(就像flash_erase已经完成的那样)。

另一个好处nandwrite是,由于跳过空页,整个过程变得更快。天哪!


添加:

事实证明我的 hack 并没有真正解决问题......


再次添加:(真正的解决方案)

问题实际上是 PXA310 将硬件 ECC 位填充0x00为空白页,因此如果软件写入空页,这些位就会变为0x00。这很奇怪,因为我应该已经在 的参数中禁用了 ECC nandwrite。幸运的是,跳过写入空页可以防止重写 ROM 转储时出现问题。

更多信息可以在我的博客文章中找到。

发送到 linux-mtd 列表的补丁实际上提到了这一事实。