我正在开发一个u-boot的nand flash驱动程序。我认为它运行良好,但u-boot环境无法正常工作。以下是我为测试所做的工作:
用我自己编码的代码擦除整个nand flash,这些代码与u-boot无关。并没有发现坏块。 (nand flash是否可能没有坏块?)。这是代码
void nand_erase(u32 addr)
{
if (addr & (BLOCK_SIZE - 1))
{
printf("not block align\n");
return;
}
u32 row = addr / 2048;
nand_select_chip();
nand_cmd(0x60);
NFADDR = row & 0xFF;
NFADDR = (row >> 8) & 0xFF;
NFADDR = (row >> 16) & 0x07;
nand_cmd(0xD0);
nand_wait_ready();
nand_cmd(0x70);
u8 status = nand_read();
if (status & 0x01)
{
printf("block 0x%x is bad", addr);
}
nand_deselect_chip();
}
启动u-boot,提示“错误的CRC,使用默认环境”。
现在我使用“setenv test 100”和“printenv test”,它运行良好,并且“saveenv”,它也提示“OK”。
我使用“nand bad”,它什么也没显示。
重启电路板并使用u-boot
现在它说“readenv()使用默认环境失败”。
而我“printenv test”,它失败了。然后我贬低了“nand bad”,它在“CONFIG_ENV_OFFSET”中显示了一个坏块
然后我将CONFIG_ENV_OFFSET更改为另一个值。并重复步骤1-7。它将在新的CONFIG_ENV_OFFSET处再次显示坏块。
我已经检查了我的驱动程序,我认为写入操作和读取操作都很好。步骤如下:
“nand dump 0”,它显示所有0xff
“nand写入20000000 0 800”将内存写入nand flash。
然后“nand dump 0”,它显示与“md 20000000 100”相同的值。
所以,你可以看到在saveenv之后,CONFIG_ENV_OFFSET的块会被标记为坏,我真的不知道为什么
答案 0 :(得分:0)
现在我明白了。 我设置了ecc.mode = NAND_ECC_HW_SYNDROME,但是XXX_syndrome功能并没有保持ecc布局。它只是简单地在主数据之后写ecc。最后它将覆盖每个页面中oob区域的第一个和第二个字节,但是u-boot将这两个字节检查为坏块标记,所以这是答案。