From 86fa1e01de19a70131cc855b96ff6e4edb09c634 Mon Sep 17 00:00:00 2001 From: Gwenhael Goavec-Merou Date: Sat, 26 Feb 2022 19:10:18 +0100 Subject: [PATCH] spiFlash: force subsector only for SST26VF032B --- src/spiFlash.cpp | 16 ++++++++++++++-- src/spiFlashdb.hpp | 4 ++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/spiFlash.cpp b/src/spiFlash.cpp index fb8b17c..93a6893 100644 --- a/src/spiFlash.cpp +++ b/src/spiFlash.cpp @@ -121,15 +121,26 @@ int SPIFlash::block64_erase(int addr) int SPIFlash::sectors_erase(int base_addr, int size) { + + // check if chip support sector and subsector erase + bool subsector_rdy = false, sector_rdy = true; + if (_flash_model) { + if (_flash_model->subsector_erase) + subsector_rdy = true; + if (!_flash_model->sector_erase) + sector_rdy = false; + } int ret = 0; int start_addr = base_addr; /* compute end_addr to be multiple of 4Kb */ int end_addr = (base_addr + size + 0xfff) & ~0xfff; - if (!_flash_model->subsector_erase) + if (!subsector_rdy) end_addr = (base_addr + size + 0xffff) & ~0xffff; ProgressBar progress("Erasing", end_addr, 50, _verbose < 0); /* start with block size (64Kb) */ int step = 0x10000; + if (!sector_rdy) + step = 0x1000; for (int addr = start_addr; addr < end_addr; addr += step) { if (write_enable() == -1) { @@ -138,7 +149,7 @@ int SPIFlash::sectors_erase(int base_addr, int size) } /* if block erase + addr end out of end_addr -> use sector_erase (4Kb) */ - if (addr + 0x10000 > end_addr && _flash_model && _flash_model->subsector_erase) { + if (!sector_rdy || (addr + step > end_addr && subsector_rdy)) { step = 0x1000; ret = sector_erase(addr); } else { @@ -359,6 +370,7 @@ bool SPIFlash::verify(const int &base_addr, const uint8_t *data, return false; } + for (int ii = 0; ii < rd_burst; ii++) { if ((uint8_t)verify_data[ii] != data[i+ii]) { progress.fail(); diff --git a/src/spiFlashdb.hpp b/src/spiFlashdb.hpp index 1dc9f53..077a6d9 100644 --- a/src/spiFlashdb.hpp +++ b/src/spiFlashdb.hpp @@ -129,8 +129,8 @@ static std::map flash_list = { .manufacturer = "microchip", .model = "SST26VF032B", .nr_sector = 64, - .sector_erase = true, - .subsector_erase = false, + .sector_erase = false, + .subsector_erase = true, .has_extended = false, .tb_otp = false, .tb_offset = 0,