From 7702c4d98db06b9c54f1345975a453f1661aed77 Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Sun, 20 Sep 2026 04:33:01 +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=A0=E9=80=90=E5=9D=97ECC?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E7=BB=9F=E8=AE=A1=EF=BC=88=E5=8C=BA=E5=88=86?= =?UTF-8?q?=E7=BC=96=E7=A8=8B=E8=B4=A8=E9=87=8F=E4=B8=8E=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Drivers/BSP/GD5F2GQ5UE/nand_ftl.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Drivers/BSP/GD5F2GQ5UE/nand_ftl.c b/Drivers/BSP/GD5F2GQ5UE/nand_ftl.c index 4df7f20c..2c0d5442 100644 --- a/Drivers/BSP/GD5F2GQ5UE/nand_ftl.c +++ b/Drivers/BSP/GD5F2GQ5UE/nand_ftl.c @@ -493,6 +493,9 @@ static void ftl_scan_checks_raw(void) uint32_t run_start = 0; uint32_t run_prev = 0; uint32_t run_len = 0; + uint32_t run_ecc_fail = 0; + uint32_t run_ecc_first = 0; + uint32_t run_ecc_last = 0; uint8_t run_epoch = 0; uint8_t run_open = 0; @@ -506,18 +509,34 @@ static void ftl_scan_checks_raw(void) 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) { + run_ecc_first = i; + } + run_ecc_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)", (unsigned long)run_start, (unsigned long)run_prev, (unsigned int)run_epoch, (unsigned long)run_len); + if (run_ecc_fail) { + DBG_INFO(" run ecc-fail: %lu blocks (blk %lu..%lu)", + (unsigned long)run_ecc_fail, + (unsigned long)run_ecc_first, + (unsigned long)run_ecc_last); + } ftl_dump_checkheader(run_start); } run_start = i; run_epoch = ep; run_len = 0; + run_ecc_fail = 0; run_open = 1; } run_prev = i; @@ -528,6 +547,12 @@ static void ftl_scan_checks_raw(void) DBG_INFO("check run: blk %lu..%lu epoch=%u (%lu blocks)", (unsigned long)run_start, (unsigned long)run_prev, (unsigned int)run_epoch, (unsigned long)run_len); + if (run_ecc_fail) { + DBG_INFO(" run ecc-fail: %lu blocks (blk %lu..%lu)", + (unsigned long)run_ecc_fail, + (unsigned long)run_ecc_first, + (unsigned long)run_ecc_last); + } ftl_dump_checkheader(run_start); } DBG_INFO("check scan done: %lu checkpoint blocks", (unsigned long)total);