ZHDA203 June   2026 AM2752-Q1 , AM2754-Q1 , AM620-Q1 , AM623 , AM625 , AM625-Q1 , AM62A1-Q1 , AM62A3 , AM62A3-Q1 , AM62A7 , AM62A7-Q1 , AM62D-Q1 , AM62P , AM62P-Q1

 

  1.   1
  2.   摘要
  3.   商标
  4. 1简介
  5. 2坏块管理
    1. 2.1 块故障
    2. 2.2 修复坏块的可行性
  6. 3ROM 引导加载程序中的坏块管理
  7. 4TITM MCU+ SDK 中的坏块管理
    1. 4.1 闪存读取操作流程
    2. 4.2 闪存写入操作流程
    3. 4.3 闪存擦除操作流程
  8. 5TITM 处理器 SDK 中的坏块管理
    1. 5.1 闪存读取操作流程
    2. 5.2 闪存写入操作流程
    3. 5.3 闪存擦除操作流程
  9. 6总结
  10. 7参考资料

TITM 处理器 SDK 中的坏块管理

Linux Kernel 通过内存技术器件 (MTD) 子系统和未排序的块映像 (UBI) 实现坏块管理,其具有以下主要功能:

  1. 坏块表格初始化
    • 在闪存驱动程序初始化期间、系统使用位图结构创建一个内存中的坏块表格:
      • 读取每个块第一页的带外区域。

      • 坏块标记由 2 个字节组成,通常位于 OOB 区域的开头。

      • 两个字节的标记值均为 0xFF,则表示该块正常。

      • 任何非 0xFF 的值(通常为 0x00)均表示工厂标记的坏块或运行时坏块。

    • 在内存中构建坏块表格,每块使用 2 位对状态进行编码:
      • 00b =正常块,表示该块可供使用。
      • 01b =磨损或运行时坏块,表示在运行时擦除或写入操作失败。
      • 10b =保留块。
      • 11b =制造商标记的工厂坏块。
    • 每次系统启动时,都会通过扫描闪存中所有块的 OOB 标记来重建坏块表格。

  2. 跳过坏块
    • 在访问物理块之前,所有读取、写入和擦除操作都会自动参阅存储器内的坏块表格。
    • UBI 层使用三棵红黑树维护物理擦除块 (PEB) 组织结构:
      • 空闲树:包含已擦除、可供分配的正常 PEB,按擦除次数排序以实现磨损均衡。
      • 已用树:包含当前存储卷数据的 PEB。
      • 错误树:包含标记为“不良”或“不可靠”的 PEB。
    • 当 UBI 层需要为写入操作分配一个块时:
      • 从空闲树中选择 PEB。绝不会从错误树中选择 PEB。
      • 通过 MTD 层查询 BBT 来验证坏块状态。
      • 如果该块被标记为坏块,则将其从空闲树中移除,添加到错误树中,并选择另一个 PEB。
    • BBT 查找使用高效位操作以实现快速访问:
      • BBT 数组中的字节偏移量= PEB 编号÷ 4(因为每个字节包含四个 2 位条目)
      • 字节内的位位置=(PEB 编号 mod 4)× 2
    • 2 位状态码是使用以下实现方式提取的:(BBT_byte >> bit_position) & 0x03
    • 在逻辑地址到物理地址的转换过程中遇到坏块时,操作会自动跳转到下一个正常块,从而使上层对坏块的规避过程透明。
  3. 运行时坏块标记
    • 通过多种机制持续监控编程、擦除和读取操作是否存在故障情况:
      • 编程和擦除操作后检查 NAND 控制器状态寄存器。
      • 在读取操作期间由纠错码 (ECC) 引擎进行监控。
      • 通过磨损均衡算法跟踪临界块的行为。
    • 当操作失败时,将通过以下顺序立即将受影响的块标记为坏块:
      • 编程失败:每次编程操作后,将检查 NAND 控制器状态寄存器的 P-FAIL 位。如果 P-FAIL=1,则表明编程操作超时或失败,从而触发坏块标记。
      • 擦除失败:每次擦除操作后,将检查 NAND 控制器状态寄存器的 E-FAIL 位。如果 E-FAIL = 1,则表示擦除操作失败,从而触发坏块标记。
      • ECC 不可纠正的错误:当一页中的位错误数量超过 ECC 纠错能力时,即 BCH-8 超过 8 位或 BCH-16 超过 16 位,该块被标记为故障。
    • 在坏块标记过程中,会执行以下步骤:
      • 更新内存中的 BBT:将故障块的 2 位状态码从表示正常块的 00b 更改为表示运行时坏块的 01b。
      • 将坏块标记写入 OOB:坏块标记字节 (0x00,0x00) 被写入故障块第一页的备用区域或 OOB。
      • 这可确保数据在电源循环中持久保存,因为下次启动时,内存中的 BBT 将根据这些标记重新构建。

    • UBI 层更新其数据结构:

      • 根据该故障 PEB 所在的位置,将其从空闲树或已用树中移除。

      • 该故障 PEB 被添加到错误树中,以防止未来对其进行分配。

      • 如果该故障 PEB 曾存储卷数据,则更新 LEB 到 PEB 的映射关系,以使受影响的逻辑擦除块失效。

    • 后续操作会自动避开该新标记的块,因为它现在位于错误树中,且在 BBT 中状态为 01b。