spiFlash: added erase_and_prog method with vector of FlashDataSection

This commit is contained in:
Gwenhael Goavec-Merou 2025-12-17 19:56:16 +01:00
parent 4a593c258c
commit f2c013daab
2 changed files with 63 additions and 0 deletions

View File

@ -461,6 +461,68 @@ bool SPIFlash::prepare_flash(const int base_addr, const int len)
return true; return true;
} }
bool SPIFlash::erase_and_prog(const std::vector<FlashDataSection> &sections, bool full_erase)
{
uint32_t len = 0, flash_len;
uint32_t base_addr = 0;
/* For full erase and to check BP: consider the full flash size */
if (full_erase) {
flash_len = _flash_model->nr_sector * 0x10000;
} else { /* not a full erase: consider bottom base_addr and upper address */
base_addr = sections.front().getStartAddr();
flash_len = sections.back().getCurrentAddr() - base_addr;
}
/* Compute real length to be written */
for (const FlashDataSection &sec: sections)
len += sec.getLength();
/* Sanity check / disables protection */
if (!prepare_flash(base_addr, flash_len))
return false;
/* instead of sector erase => perform a full flash erase */
if (full_erase) {
if (bulk_erase(true, true) == -1)
return false;
} else {
printInfo("Erase Flash: ", false);
if (sectors_erase(base_addr, len) == -1) {
printError("FAIL");
return -1;
} else {
printSuccess("DONE");
}
}
ProgressBar progress("Writing", len, 50, _verbose < 0);
uint32_t len_done = 0;
for (const FlashDataSection &sec: sections) {
int size = 0;
/* prepare section write */
const uint32_t base_addr = sec.getStartAddr(); // start address
const uint32_t sec_len = sec.getLength(); // section length
const uint8_t *ptr = sec.getRecord().data(); // data
for (uint32_t addr = 0; addr < sec_len; addr += size, ptr+=size, len_done+=size) {
size = (addr + 256 > sec_len) ? (sec_len - addr) : 256;
if ((_jedec_id >> 8) == 0xbf258d) {
size = 1;
}
if (write_page(base_addr + addr, ptr, size) == -1)
return -1;
progress.display(len_done);
}
}
progress.done();
/* and if required: relock blocks */
if (_must_relock) {
enable_protection(_status);
if (_verbose > 0)
display_status_reg(read_status_reg());
}
return true;
}
int SPIFlash::erase_and_prog(int base_addr, const uint8_t *data, int len) int SPIFlash::erase_and_prog(int base_addr, const uint8_t *data, int len)
{ {

View File

@ -111,6 +111,7 @@ class SPIFlash {
bool dump(const std::string &filename, const int &base_addr, bool dump(const std::string &filename, const int &base_addr,
const int &len, int rd_burst = 0); const int &len, int rd_burst = 0);
/* combo flash + erase */ /* combo flash + erase */
bool erase_and_prog(const std::vector<FlashDataSection> &sections, bool full_erase=false);
int erase_and_prog(int base_addr, const uint8_t *data, int len); int erase_and_prog(int base_addr, const uint8_t *data, int len);
/*! /*!
* \brief check if area base_addr to base_addr + len match * \brief check if area base_addr to base_addr + len match