diff --git a/Drivers/BSP/GD5F2GQ5UE/nand_ftl.c b/Drivers/BSP/GD5F2GQ5UE/nand_ftl.c index 995f811a..f7ed20f7 100644 --- a/Drivers/BSP/GD5F2GQ5UE/nand_ftl.c +++ b/Drivers/BSP/GD5F2GQ5UE/nand_ftl.c @@ -52,6 +52,9 @@ static uint8_t s_copy_buf[FTL_PAGE_SIZE]; /* 初始化状态 */ static uint8_t s_initialized; +/* resume 搜索探针日志窗口(诊断:逐探测记录判定输入) */ +static uint8_t s_probe_log; + /* ======================== 私有函数声明 ======================== */ static int ftl_flush_cache(void); @@ -94,7 +97,12 @@ static int ftl_read_page(dhara_sector_t lpn) { int dhara_nand_is_bad(const struct dhara_nand *n, dhara_block_t b) { (void)n; - return gd5f2gq5ue_is_block_bad(ftl_phy_block(b)); + const int bad = gd5f2gq5ue_is_block_bad(ftl_phy_block(b)); + if (s_probe_log) { + DBG_INFO("probe blk %lu: bbt_bad=%u", (unsigned long)b, + (unsigned int)bad); + } + return bad; } void dhara_nand_mark_bad(const struct dhara_nand *n, dhara_block_t b) { @@ -187,18 +195,42 @@ int dhara_nand_is_free(const struct dhara_nand *n, dhara_page_t p) { int dhara_nand_read(const struct dhara_nand *n, dhara_page_t p, size_t offset, size_t length, uint8_t *data, dhara_error_t *err) { (void)n; uint32_t phy_pg = ftl_phy_page(p); + int rret; + int eret; - if (gd5f_page_read(phy_pg) != GD5F_OK) { + if ((rret = gd5f_page_read(phy_pg)) != GD5F_OK) { + if (s_probe_log) { + DBG_INFO("probe pg %lu blk %lu: page_read=%d", + (unsigned long)phy_pg, (unsigned long)(p >> 6), + rret); + } dhara_set_error(err, DHARA_E_ECC); return -1; } - if (gd5f_check_ecc() != GD5F_OK) { + if ((eret = gd5f_check_ecc()) != GD5F_OK) { + if (s_probe_log) { + DBG_INFO("probe pg %lu blk %lu: ecc=%d", + (unsigned long)phy_pg, (unsigned long)(p >> 6), + eret); + } dhara_set_error(err, DHARA_E_ECC); return -1; } gd5f_read_from_cache((uint16_t)offset, data, length); + + if (s_probe_log && offset == 0 && length == FTL_PAGE_SIZE) { + /* 组末页(组内偏移 15)= checkpoint 页:记录 magic/epoch 判定 */ + if ((p & 63u) == 15u) { + const uint8_t *m = data; + DBG_INFO("probe pg %lu blk %lu chk: magic=%u epoch=%u", + (unsigned long)phy_pg, (unsigned long)(p >> 6), + (unsigned int)((m[0] == 'D' && m[1] == 'h' && + m[2] == 'a') ? 1 : 0), + (unsigned int)m[3]); + } + } return 0; } @@ -248,6 +280,7 @@ DSTATUS disk_initialize(BYTE pdrv) { { dhara_error_t err; + s_probe_log = 1; if (dhara_map_resume(&s_map, &err) < 0) { DBG_INFO("No valid map found, creating fresh (err=%d)", err); dhara_map_clear(&s_map); @@ -255,6 +288,7 @@ DSTATUS disk_initialize(BYTE pdrv) { DBG_INFO("Map resumed: %lu/%lu sectors used", dhara_map_size(&s_map), dhara_map_capacity(&s_map)); } + s_probe_log = 0; } s_initialized = 1;