我正在努力在 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)
我的黑客是添加一个检查nandwrite,如果要写入的整个页面完全是空的(即充满0xFF),程序将跳过写入它(就像flash_erase已经完成的那样)。
另一个好处nandwrite是,由于跳过空页,整个过程变得更快。天哪!
添加:
事实证明我的 hack 并没有真正解决问题......
再次添加:(真正的解决方案)
问题实际上是 PXA310 将硬件 ECC 位填充0x00为空白页,因此如果软件写入空页,这些位就会变为0x00。这很奇怪,因为我应该已经在 的参数中禁用了 ECC nandwrite。幸运的是,跳过写入空页可以防止重写 ROM 转储时出现问题。
更多信息可以在我的博客文章中找到。
发送到 linux-mtd 列表的补丁实际上提到了这一事实。