我正在开发u-boot的nand闪存驱动程序。我认为它运作良好,但u-boot的环境无法正常运作。这是我所做的测试:

  • 通过纯粹由我自己编写的代码擦除整个nand flash,这些代码与u-boot无关。并没有发现坏块。 (nand闪光灯是否可能没有坏块?)。这是代码
    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”,它也提示“确定”。
  • 而且我使用“nand bad”,它什么也没显示。
  • 重新启动开发板并u-boot
  • 现在它说“使用默认环境,readenv()失败”。
  • 而我“printenv测试”,则失败。然后我检查了“nand bad”,它恰好在“CONFIG_ENV_OFFSET”
  • 处显示了一个坏块
  • 然后我将CONFIG_ENV_OFFSET更改为另一个值。并重复步骤1-7。它将在新的CONFIG_ENV_OFFSET处再次显示不良块。

  • 我已经检查了驱动程序,我认为写操作和读操作都很好。步骤如下:
  • “nand dump 0”,它显示所有0xff
  • “nand write 20000000 0 800”将内存写入nand flash。
  • 然后,“nand dump 0”显示与“md 20000000 100”相同的值。

  • 因此,您可以看到saveenv之后,CONFIG_ENV_OFFSET处的块将被标记为坏块,我真的不知道为什么

    最佳答案

    现在我想通了。
    我设置了ecc.mode = NAND_ECC_HW_SYNDROME,但是XXX_syndrome函数无法维护ecc布局。它只是简单地在主要数据之后写ecc。最后,它将覆盖每页oob区域的第一个和第二个字节,但是u-boot将这两个字节作为坏块标记进行检查,因此这就是答案。

    10-08 15:12