This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM625:AM62x SPI NAND 闪存错误块管理

Guru**** 2539500 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1271744/am625-am62x-spi-nand-flash-bad-block-management

器件型号:AM625

您好,

我们在客户电路板上测试了两个 Winbond SPI-NAND 闪存 W25N02 (QSPI)和 W35N02 (OSPI)、两者都遇到了坏块问题。 起初读写没有问题,但经过几天的测试,出现了许多坏块。 读取和写入命令如下

mtd erase ospi_nand.tiboot3
ext4load mmc 0:2 ${loadaddr} /home/root/tiboot3.bin
mtd write ospi_nand.tiboot3 ${loadaddr} 0 $filesize
mtd read ospi_nand.tiboot3 ${cmpaddr} 0 $filesize


W25N02中、一些块已成为坏块。

=> mtd list
List of MTD devices:
* spi-nand0
  - device: flash@0
  - parent: spi@fc40000
  - driver: spi_nand
  - path: /bus@f0000/bus@fc00000/spi@fc40000/flash@0
  - type: NAND flash
  - block size: 0x20000 bytes
  - min I/O: 0x800 bytes
  - OOB size: 64 bytes
  - OOB available: 24 bytes
  - 0x000000000000-0x000010000000 : "spi-nand0"
          - 0x000000000000-0x000000100000 : "ospi_nand.tiboot3"
          - 0x000000100000-0x000000300000 : "ospi_nand.tispl"
          - 0x000000300000-0x000000700000 : "ospi_nand.u-boot"
          - 0x000000700000-0x000000740000 : "ospi_nand.env"
......
          - 0x00000ffc0000-0x000010000000 : "ospi_nand.phypattern"
=> mtd erase ospi_nand.tiboot3
Erasing 0x00000000 ... 0x000fffff (8 eraseblock(s))
Skipping bad block at 0x00020000
Skipping bad block at 0x00040000
=> mtd erase ospi_nand.tispl
Erasing 0x00000000 ... 0x001fffff (16 eraseblock(s))
Skipping bad block at 0x00180000
Skipping bad block at 0x001a0000
Skipping bad block at 0x001c0000
Skipping bad block at 0x001e0000
=> mtd erase ospi_nand.u-boot
Erasing 0x00000000 ... 0x003fffff (32 eraseblock(s))
Skipping bad block at 0x00000000
Skipping bad block at 0x00020000
Skipping bad block at 0x00040000
Skipping bad block at 0x00060000
Skipping bad block at 0x00080000
=>

在 W35N02中,所有块都成为坏块。

=> mtd list
List of MTD devices:
* spi-nand0
  - device: flash@0
  - parent: spi@fc40000
  - driver: spi_nand
  - path: /bus@f0000/bus@fc00000/spi@fc40000/flash@0
  - type: NAND flash
  - block size: 0x40000 bytes
  - min I/O: 0x1000 bytes
  - OOB size: 128 bytes
  - OOB available: 80 bytes
  - 0x000000000000-0x000010000000 : "spi-nand0"
          - 0x000000000000-0x000000080000 : "ospi_nand.tiboot3"
          - 0x000000080000-0x000000280000 : "ospi_nand.tispl"
          - 0x000000280000-0x000000680000 : "ospi_nand.u-boot"
          - 0x000000680000-0x0000006c0000 : "ospi_nand.env"
......
          - 0x00000ffc0000-0x000010000000 : "ospi_nand.phypattern"
=> mtd erase ospi_nand.tiboot3
Erasing 0x00000000 ... 0x0007ffff (2 eraseblock(s))
Skipping bad block at 0x00000000
Skipping bad block at 0x00040000
=> mtd erase ospi_nand.tispl
Erasing 0x00000000 ... 0x001fffff (8 eraseblock(s))
Skipping bad block at 0x00000000
Skipping bad block at 0x00040000
Skipping bad block at 0x00080000
Skipping bad block at 0x000c0000
Skipping bad block at 0x00100000
Skipping bad block at 0x00140000
Skipping bad block at 0x00180000
Skipping bad block at 0x001c0000
=> mtd erase ospi_nand.u-boot
Erasing 0x00000000 ... 0x003fffff (16 eraseblock(s))
Skipping bad block at 0x00000000
Skipping bad block at 0x00040000
Skipping bad block at 0x00080000
Skipping bad block at 0x000c0000
Skipping bad block at 0x00100000
Skipping bad block at 0x00140000
Skipping bad block at 0x00180000
Skipping bad block at 0x001c0000
Skipping bad block at 0x00200000
Skipping bad block at 0x00240000
Skipping bad block at 0x00280000
Skipping bad block at 0x002c0000
Skipping bad block at 0x00300000
Skipping bad block at 0x00340000
Skipping bad block at 0x00380000
Skipping bad block at 0x003c0000
=>

在正常情况下、在过去几天的测试中、闪存中不应有太多坏块。  
1.是否使用 MTD 读取/写入命令在 uboot 下操作闪存? 我可以使用其他指令吗?
2.有这么多的坏块,特别是在 W35N02,分区已经成为坏块。 它被怀疑是错误的标记。 是否有办法清除坏块标记?
3.是否有任何建议的用于调试闪存的工具? uboot 和 Linux 均可用

此致、
斯蒂芬

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [quote userid="565320" url="~/support/processors-group/processors/f/processors-forum/1271744/am625-am62x-spi-nand-flash-bad-block-management 我们在客户主板上测试了两个 Winbond SPI-NAND 闪存:W25N02 (QSPI)和 W35N02 (OSPI)、两者都遇到了坏块问题。 起初读写没有问题,但经过几天的测试,出现了许多坏块。 读取和写入命令如下[/引号]

    您说的是在无限循环中执行这些原始命令吗?? 有多频繁?

    通常、OSPI/QSPI NAND/NOR 等原始闪存 与某种磨损矫正驱动器(例如 UBIS 子系统、供 UBIFS 使用)结合使用、而不是以原始方式"跳动"、因为这种方式可能导致过早磨损。

    此致、Andreas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Andreas:
    此测试未处于环路中。 我们操作的目的是测试闪存 引导模式、 将 uboot 映像和 ubif 写入闪存、然后测试启动函数。 如果写入后的启动出现问题、我们将重新配置 uboot 或 ubif、然后再次写入它。 写入次数不是很大、不超过10次/天。

    此致、
    斯蒂芬

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    写入次数不是很大,不超过10次/天。

    好的、您应该能够毫无问题地执行此类原始闪存操作数百次。 你不能持续这么做。 闪存数据表将包含针对一个给定块的最小擦除/写入周期的详细信息、但是这可能不是你的问题。

    这里可能还存在其他一些软件问题、不小心将块标记为坏了。 您可以通过执行`nand scrub`命令来重置 U-Boot 中错误的块信息、以查看此操作是否可以修复此问题。 您将需要打开  配置 CMD_NAND 关键字、以便访问该命令。

    https://git.ti.com/cgit/ti-u-boot/ti-u-boot/tree/doc/README.nand?h=ti-u-boot-2023.04#n215

    "擦除[偏移长度]"
    比如"擦除"、但不要跳过坏块。 而是擦除它们。
    危险!!! 出厂设置坏块将丢失。 仅供使用
    删除使用"markbad"命令创建的人工坏块。

    如果这修复了问题,我们仍然需要先找出出了什么问题。

    此致、Andreas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您将需要打开  配置 CMD_NAND 以获取该命令的访问权限。

     CMD_NAND 只能用于并行 NAND 闪存、而不能用于 SPI NAND 闪存?

    我以前尝试过在 uboot 中启用 nand cmd、但无法操作器件。

    已启用 CONFIG_CMD_NAND CONFIG_MTD_RAW_NAND、链接期间遇到的错误如下所示。

      CC      drivers/mtd/nand/raw/nand.o
      CC      drivers/mtd/nand/raw/nand_bbt.o
      CC      drivers/mtd/nand/raw/nand_ids.o
      CC      drivers/mtd/nand/raw/nand_util.o
      CC      drivers/mtd/nand/raw/nand_ecc.o
      CC      drivers/mtd/nand/raw/nand_base.o
      CC      drivers/mtd/nand/raw/nand_amd.o
      CC      drivers/mtd/nand/raw/nand_hynix.o
      CC      drivers/mtd/nand/raw/nand_macronix.o
      CC      drivers/mtd/nand/raw/nand_micron.o
      CC      drivers/mtd/nand/raw/nand_samsung.o
      CC      drivers/mtd/nand/raw/nand_toshiba.o
      CC      drivers/mtd/nand/raw/nand_timings.o
      AR      drivers/mtd/nand/raw/built-in.o
      CC      drivers/mtd/nand/spi/core.o
      CC      drivers/mtd/nand/spi/gigadevice.o
      CC      drivers/mtd/nand/spi/macronix.o
      CC      drivers/mtd/nand/spi/micron.o
      CC      drivers/mtd/nand/spi/toshiba.o
      CC      drivers/mtd/nand/spi/winbond.o
      AR      drivers/mtd/nand/spi/spinand.o
      AR      drivers/mtd/nand/spi/built-in.o
      CC      drivers/mtd/nand/core.o
      CC      drivers/mtd/nand/bbt.o
      AR      drivers/mtd/nand/nandcore.o
      AR      drivers/mtd/nand/built-in.o
      AR      drivers/mtd/onenand/built-in.o
      CC      drivers/mtd/spi/sf-uclass.o
      CC      drivers/mtd/spi/sf_probe.o
      CC      drivers/mtd/spi/spi-nor-ids.o
      CC      drivers/mtd/spi/spi-nor-core.o
      AR      drivers/mtd/spi/spi-nor.o
      AR      drivers/mtd/spi/built-in.o
      LDS     u-boot.lds
      LD      u-boot
    aarch64-none-linux-gnu-ld.bfd: drivers/mtd/nand/raw/nand.o: in function `nand_init_chip':
    /home/z98999/am62x/ti-u-boot/drivers/mtd/nand/raw/nand.c:92: undefined reference to `board_nand_init'
    /bin/sh: line 1: 23223 Segmentation fault      (core dumped) aarch64-none-linux-gnu-ld.bfd -z noexecstack -pie --gc-sections -Bstatic --no-dynamic-linker -z notext --build-id=none -Ttext 0x80800000 -o u-boot -T u-boot.lds arch/arm/cpu/armv8/start.o --whole-archive arch/arm/cpu/built-in.o arch/arm/cpu/armv8/built-in.o arch/arm/lib/built-in.o arch/arm/mach-k3/built-in.o board/ti/am62x/built-in.o board/ti/common/built-in.o boot/built-in.o cmd/built-in.o common/built-in.o disk/built-in.o drivers/built-in.o drivers/usb/cdns3/built-in.o drivers/usb/common/built-in.o drivers/usb/dwc3/built-in.o drivers/usb/emul/built-in.o drivers/usb/eth/built-in.o drivers/usb/gadget/built-in.o drivers/usb/gadget/udc/built-in.o drivers/usb/host/built-in.o drivers/usb/isp1760/built-in.o drivers/usb/mtu3/built-in.o drivers/usb/musb-new/built-in.o drivers/usb/musb/built-in.o drivers/usb/phy/built-in.o drivers/usb/ulpi/built-in.o env/built-in.o fs/built-in.o lib/built-in.o net/built-in.o --no-whole-archive -L /home/z98999/cross_compile/arm-gnu-toolchain-11.3.rel1-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/11.3.1 -lgcc -Map u-boot.map
    /home/z98999/am62x/ti-u-boot/Makefile:1754: recipe for target 'u-boot' failed
    make[1]: *** [u-boot] Error 139
    make[1]: *** Deleting file 'u-boot'
    make[1]: Leaving directory '/home/z98999/am62x/ti-u-boot/out/a53'
    Makefile:177: recipe for target 'sub-make' failed
    make: *** [sub-make] Error 2
    

    看来应该启用 Raw NAND 驱动程序。 在"原始 NAND 器件支持"中没有 Winbond 驱动程序、因此我启用了 CONFIG_NAND_OMAP_GPMC 和一些相关配置、编译通过了、但使用 nand 命令时找不到器件。  

    => nand info
    
    => nand bad
    
    no devices available
    => nand scrub
    
    no devices available

    我使用的是 SDK9.0、uboot 版本2023.04。

    此致、
    斯蒂芬

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是否有办法清除 Linux 中的坏块? 我没有找到类似 Scrub 的命令。 MTD-utils 可以读取和写入闪存、但无法擦除坏块。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Stephen:

    我需要进一步研究这一点、请留出几天时间给出回复。 感谢您的耐心等待。

    此致、 Andreas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Andreas M ü:

      到目前为止是否有任何进展?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不幸的是、由于其他优先事项、我还无法查看这一点。