我正在开发u-boot的nand闪存驱动程序。我认为它运作良好,但u-boot的环境无法正常运作。这是我所做的测试:
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();
}
我已经检查了驱动程序,我认为写操作和读操作都很好。步骤如下:
因此,您可以看到saveenv之后,CONFIG_ENV_OFFSET处的块将被标记为坏块,我真的不知道为什么
最佳答案
现在我想通了。
我设置了ecc.mode = NAND_ECC_HW_SYNDROME,但是XXX_syndrome函数无法维护ecc布局。它只是简单地在主要数据之后写ecc。最后,它将覆盖每页oob区域的第一个和第二个字节,但是u-boot将这两个字节作为坏块标记进行检查,因此这就是答案。