6

我正在努力在 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

但对于nandwrite

FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF 00000000 00000000
00000000 00000000 00000000 00000000

有人知道为什么吗?


我在代码中添加了一个 hack,nandwrite如果要写入的内容是 ,则跳过写入 NAND 0xFF,并且它有效。那么在尝试将空页写入 NAND 时是否存在问题?


添加:

现在我在编写引导加载程序映像时也遇到了这个问题。图片不是页面对齐的,所以nandwrite0xFF. 但是对于只有0xFFecc 字节的页面仍然0x00像上面一样被污染。似乎我的 hack 并没有完全解决我的问题。任何人都可以帮忙吗?也许它可能是内核 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;
4

4 回答 4

2

对不起,Alvin,但备份真的不会“只在那个特定的闪存上工作”,因为你无法知道某个特定位何时会从好到边缘或边缘到坏您可能会以一种状态读取它,尝试以完全相同的状态写入它,但在任何给定的一天,任何给定的备份都会失败。

安全备份 NAND 设备中数据的唯一方法是打开 ECC。您从具有 ECC 更正的设备中读取数据以获得良好的数据。然后,您在 ECC 开启的情况下将已知良好的数据写回 NAND,以便使用新的 ECC 值更正您之前读取时现在边缘或坏的任何位。

于 2013-03-16T22:12:30.943 回答
0

这是因为它是对你的警告。它不会可靠地工作。

考虑这样一种情况,您的块 (1) 在位置 0 有错误。Nand-flash 设备的“控制器”放置纠错码来纠正此错误。

您使用ECC从块 1 中复制数据,但是当您将数据写入的Nand-flash 设备时,您正在克隆数据。如果那个新的 nand-flash 设备在位置 1 有错误。那么你写回的数据在接下来的读取中将是错误的,因为位置 1 是错误的。但是系统会认为是对的,因为ECC在位置1没有显示错误

您不能可靠地将 1 个 nand-flash 直接克隆到另一个,因为硬/软错误位置不相同。

可靠地做到这一点的唯一方法是读出数据,使用系统 ECC 算法来纠正任何错误。将数据写入新设备,使用系统算法纠正任何位错误。

您可能认为设备是相同的,但结果是由于误码映射不匹配导致的数据/程序损坏。

回应阿尔文的评论:

我非常有信心我正在克隆完全相同的 NAND,即我备份了那个特定的芯片,然后将它写回那个特定的芯片。不是我觉得是一样的,但是从头到尾只有一个单芯片。这很奇怪,但是其他一些人说它可以在他们自己的设备上运行,而我的却没有,驱动程序中可能有错误吗?– Alvin Wong 8 月 5 日 5:16

抱歉不可能(除非你真的..真的..真的很幸运并且得到0缺陷的芯片)

每个 Nand-Flash 芯片都有自己的一组缺陷位,它们是唯一的。用户绕过它的方法是生成一个文件系统,一旦坏位超出 CRC 的能力,就会屏蔽掉坏块。当您将一个 nand 芯片复制到另一个设备时,CRC 映射与主芯片匹配。当您对设备进行 1:1 克隆时,一些数据位会在写入后翻转(坏单元格),并且由于您正在进行克隆,因此您不会在 CRC 中考虑这些位已翻转(因为您正在逐字复制)。

它对某些人“有效”的事实并不意味着它是正确的,就像我会开车一样,但我只发现刹车在我需要的时候不起作用。更糟糕的是,网上许多所谓的“专家”实际上是在“克隆”设备时擦除制造商提供的缺陷图,或者在保存缺陷图之前执行“芯片擦除”。

这就是 ebay 上出现的许多“狡猾”的 nand-flash USB 棒所发生的情况,它们实际上是“缺陷图”被擦除的芯片,因此它们看起来像是好的设备,直到你尝试将内容保存到它们.

于 2012-08-05T03:30:41.320 回答
0

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

一个额外的好处nandwrite是,由于跳过了空白页面,整个过程变得更快。万岁!


添加:

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


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

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

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

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

于 2012-09-28T14:51:46.050 回答
0

在我的嵌入式世界中,您首先使用flash_erase爆炸所有内容,然后nandwrite -p使用 0xFF 填充数据之外的页面其余部分。

Usage: nandwrite [OPTION] MTD_DEVICE [INPUTFILE|-]
Writes to the specified MTD device.

  -m, --markbad           Mark blocks bad if write fails
  -N, --noskipbad         Write without bad block skipping
  -o, --oob               Image contains oob data
  -O, --onlyoob           Image contains oob data and only write the oob part
  -r, --raw               Image contains the raw oob data dumped by nanddump
  -s addr, --start=addr   Set start address (default is 0)
  -p, --pad               Pad to page size
  -b, --blockalign=1|2|4  Set multiple of eraseblocks to align to
  -q, --quiet             Don't display progress messages
      --help              Display this help and exit
      --version           Output version information and exit
于 2013-03-09T05:48:38.887 回答