gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:22:06 30 4
gpt4 key购买 nike

我正在开发u-boot的nand flash驱动。我认为它工作得很好,但 u-boot 的环境不能正常工作。这是我为测试所做的:

  1. 通过自己纯写的代码删除整个nand flash,这些代码与u-boot无关。也没有发现坏 block 。 (nand flash有没有可能没有坏 block ?)。这是代码

    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,提示"bad CRC ,using default environment"。

  3. 现在我用“setenv test 100”和“printenv test”,效果很好,“saveenv”也提示“OK”。

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

  5. 重启板子和u-boot

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

  7. 然后我“printenv 测试”,它失败了。然后我检查了“nand bad”,它显示一个坏 block 恰好在“CONFIG_ENV_OFFSET”

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

我检查了我的驱动程序,我认为写操作和读操作都很好。步骤在这里:

  1. "nand dump 0", 显示全0xff

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

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

所以,可以看到saveenv之后,CONFIG_ENV_OFFSET处的block会被标记为bad,真不知道为什么

最佳答案

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

关于c - 为什么 u-boot 总是将写入的 block 标记为坏 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26629016/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com