GD5F页读回归主线单发令(settle与二次发令移除、3.1V误判更正归一Trap05)、新增Phase11复现用例(16轮零复现)、附台架环境与审计文档

This commit is contained in:
2026-09-21 16:55:05 +08:00
parent f86cb8824b
commit ee206ab688
11 changed files with 965 additions and 145 deletions
+5 -17
View File
@@ -226,13 +226,11 @@ static void gd5f_page_read_issue(uint32_t page_addr) {
* 入口参数:page_addr - 页地址 uint32_t 0 ~ GD5F_TOTAL_BLOCKS*64-1
* 返回值:0 - 成功,其它 - 错误
* 限定条件:SPI 已初始化
* 函数说明:13h 二次发令 + 固定沉降延时 GD5F_PAGE_READ_SETTLE_MS。
* 台架实证(2026-09-20,VDD 3.1V 欠压工况):① 就绪信号可早于
* array→buffer 整页装载完成 → 0Bh 读到"前段新、后段旧"混合页;
* ② 13h 命令在编程/擦除风暴后可不被芯片锁存(空操作)→ 0Bh
* 读到上一操作残留 buffer(编程数据)→ 后续文件/BBT/journal
* 读取全部"虚假成功",阵列实际未更新 → 复位后数据丢失。
* 二次发令覆盖②(重发必被锁存),固定沉降覆盖①(整页装载完成)。
* 函数说明:13h 单次发令 + WIP 轮询(与 Linux 主线 / GigaDevice 厂商驱动
* 形状完全一致:13h×1 → OIP 轮询 → 0Bh)。
* 2026-09-20 台架异常史实(归因、证伪、沉降/二次发令的加与除)
* 统一记于 docs/问题记录/GD5F2GQ5UE_Trap_Records.md Trap 05,
* 复现手段见测试 Phase 11 用例。
*/
int gd5f_page_read(uint32_t page_addr) {
int ret;
@@ -243,16 +241,6 @@ int gd5f_page_read(uint32_t page_addr) {
return ret;
}
/* 二次发令:首条 13h 未被锁存(空操作)时由重发兜底 */
gd5f_page_read_issue(page_addr);
ret = gd5f_wait_busy(100);
if (ret != GD5F_OK) {
return ret;
}
/* 固定沉降:等待 array→buffer 整页装载完成 */
HAL_Delay(GD5F_PAGE_READ_SETTLE_MS);
return GD5F_OK;
}
+3 -8
View File
@@ -60,15 +60,10 @@ extern "C" {
#define GD5F_BLOCK_SIZE (GD5F_PAGES_PER_BLOCK * GD5F_PAGE_SIZE)
/*
* 页读取固定沉降延时(2026-09-20 台架实证):13h 发出后 array→buffer
* 的整页装载完成前,就绪信号可能提前清零(低 VDD 下内部传输速率下降,
* 确定性早于 0Bh 读完成)→ 0Bh 流式读到"前段新、后段旧"的混合页
* (journal checkpoint header 有效而 meta 残留旧数据 → 复位后 resume
* 锚定新 checkpoint 却读到旧树 → 数据静默丢失)。13h 之后、0Bh 之前
* 强制等待该时长,保证整页新鲜。取值须覆盖低 VDD 下 t_RR 最慢工况,
* 同时受开机 BBT 全片扫描(2048 次页读)耗时约束:2ms 实测两可。
* 页读取就绪判定 = WIP 轮询(与 Linux 主线 / GigaDevice 厂商驱动完全一致,
* 单发令形状)。2026-09-20 沉降 / 13h 二次发令史实统一记于
* GD5F2GQ5UE_Trap_Records.md Trap 05。
*/
#define GD5F_PAGE_READ_SETTLE_MS 2
#define GD5F_TOTAL_BLOCKS 2048
#define GD5F_TOTAL_SIZE (GD5F_TOTAL_BLOCKS * GD5F_BLOCK_SIZE)