From 573bf6264a3e7193f4a9077e09907596ea6caaf5 Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Sun, 20 Sep 2026 04:36:38 +0800 Subject: [PATCH] =?UTF-8?q?FTL=E8=AF=8A=E6=96=AD=EF=BC=9Acheckpoint?= =?UTF-8?q?=E6=89=AB=E6=8F=8F=E5=A2=9E=E5=8A=A0BBT=E5=9D=8F=E5=9D=97?= =?UTF-8?q?=E6=A0=87=E8=AE=B0=E6=9F=A5=E8=AF=A2+ECC=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E9=A1=BA=E5=BA=8F=E5=AF=B9=E9=BD=90dhara=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Drivers/BSP/GD5F2GQ5UE/nand_ftl.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/Drivers/BSP/GD5F2GQ5UE/nand_ftl.c b/Drivers/BSP/GD5F2GQ5UE/nand_ftl.c index 2c0d5442..995f811a 100644 --- a/Drivers/BSP/GD5F2GQ5UE/nand_ftl.c +++ b/Drivers/BSP/GD5F2GQ5UE/nand_ftl.c @@ -496,6 +496,9 @@ static void ftl_scan_checks_raw(void) uint32_t run_ecc_fail = 0; uint32_t run_ecc_first = 0; uint32_t run_ecc_last = 0; + uint32_t run_bbt_bad = 0; + uint32_t run_bbt_first = 0; + uint32_t run_bbt_last = 0; uint8_t run_epoch = 0; uint8_t run_open = 0; @@ -506,13 +509,14 @@ static void ftl_scan_checks_raw(void) if (gd5f_page_read(pg) != GD5F_OK) { continue; } + /* ECC 状态在 0Bh 之前检查(与 dhara_nand_read 的读取顺序一致, + * 排除 read-from-cache 对状态的干扰) */ + int ecc = gd5f_check_ecc(); gd5f_read_from_cache(0, buf, sizeof(buf)); if (buf[0] == 'D' && buf[1] == 'h' && buf[2] == 'a') { const uint8_t ep = buf[3]; - int ecc = 0; total++; - ecc = gd5f_check_ecc(); if (ecc != GD5F_OK) { run_ecc_fail++; if (!run_ecc_fail) { @@ -520,6 +524,13 @@ static void ftl_scan_checks_raw(void) } run_ecc_last = i; } + if (gd5f2gq5ue_is_block_bad(ftl_phy_block(i))) { + run_bbt_bad++; + if (!run_bbt_bad) { + run_bbt_first = i; + } + run_bbt_last = i; + } if (!run_open || (i != run_prev + 1) || (ep != run_epoch)) { if (run_open) { DBG_INFO("check run: blk %lu..%lu epoch=%u (%lu blocks)", @@ -531,12 +542,19 @@ static void ftl_scan_checks_raw(void) (unsigned long)run_ecc_first, (unsigned long)run_ecc_last); } + if (run_bbt_bad) { + DBG_INFO(" run bbt-bad: %lu blocks (blk %lu..%lu)", + (unsigned long)run_bbt_bad, + (unsigned long)run_bbt_first, + (unsigned long)run_bbt_last); + } ftl_dump_checkheader(run_start); } run_start = i; run_epoch = ep; run_len = 0; run_ecc_fail = 0; + run_bbt_bad = 0; run_open = 1; } run_prev = i; @@ -553,6 +571,12 @@ static void ftl_scan_checks_raw(void) (unsigned long)run_ecc_first, (unsigned long)run_ecc_last); } + if (run_bbt_bad) { + DBG_INFO(" run bbt-bad: %lu blocks (blk %lu..%lu)", + (unsigned long)run_bbt_bad, + (unsigned long)run_bbt_first, + (unsigned long)run_bbt_last); + } ftl_dump_checkheader(run_start); } DBG_INFO("check scan done: %lu checkpoint blocks", (unsigned long)total);