为什么u-boot总是将写入的块标记为坏?

时间:2014-10-29 11:20:13

标签: c linux gcc u-boot

我正在开发一个u-boot的nand flash驱动程序。我认为它运行良好,但u-boot环境无法正常工作。以下是我为测试所做的工作:

  1. 用我自己编码的代码擦除整个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();
    }
    
  2. 启动u-boot,提示“错误的CRC,使用默认环境”。

  3. 现在我使用“setenv test 100”和“printenv test”,它运行良好,并且“saveenv”,它也提示“OK”。

  4. 我使用“nand bad”,它什么也没显示。

  5. 重启电路板并使用u-boot

  6. 现在它说“readenv()使用默认环境失败”。

  7. 而我“printenv test”,它失败了。然后我贬低了“nand bad”,它在“CONFIG_ENV_OFFSET”中显示了一个坏块

  8. 然后我将CONFIG_ENV_OFFSET更改为另一个值。并重复步骤1-7。它将在新的CONFIG_ENV_OFFSET处再次显示坏块。

  9. 我已经检查了我的驱动程序,我认为写入操作和读取操作都很好。步骤如下:

    1. “nand dump 0”,它显示所有0xff

    2. “nand写入20000000 0 800”将内存写入nand flash。

    3. 然后“nand dump 0”,它显示与“md 20000000 100”相同的值。

    4. 所以,你可以看到在saveenv之后,CONFIG_ENV_OFFSET的块会被标记为坏,我真的不知道为什么

1 个答案:

答案 0 :(得分:0)

现在我明白了。 我设置了ecc.mode = NAND_ECC_HW_SYNDROME,但是XXX_syndrome功能并没有保持ecc布局。它只是简单地在主数据之后写ecc。最后它将覆盖每个页面中oob区域的第一个和第二个字节,但是u-boot将这两个字节检查为坏块标记,所以这是答案。