spiFlash: force subsector only for SST26VF032B
This commit is contained in:
parent
02e93ffec6
commit
86fa1e01de
|
|
@ -121,15 +121,26 @@ int SPIFlash::block64_erase(int addr)
|
||||||
|
|
||||||
int SPIFlash::sectors_erase(int base_addr, int size)
|
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 ret = 0;
|
||||||
int start_addr = base_addr;
|
int start_addr = base_addr;
|
||||||
/* compute end_addr to be multiple of 4Kb */
|
/* compute end_addr to be multiple of 4Kb */
|
||||||
int end_addr = (base_addr + size + 0xfff) & ~0xfff;
|
int end_addr = (base_addr + size + 0xfff) & ~0xfff;
|
||||||
if (!_flash_model->subsector_erase)
|
if (!subsector_rdy)
|
||||||
end_addr = (base_addr + size + 0xffff) & ~0xffff;
|
end_addr = (base_addr + size + 0xffff) & ~0xffff;
|
||||||
ProgressBar progress("Erasing", end_addr, 50, _verbose < 0);
|
ProgressBar progress("Erasing", end_addr, 50, _verbose < 0);
|
||||||
/* start with block size (64Kb) */
|
/* start with block size (64Kb) */
|
||||||
int step = 0x10000;
|
int step = 0x10000;
|
||||||
|
if (!sector_rdy)
|
||||||
|
step = 0x1000;
|
||||||
|
|
||||||
for (int addr = start_addr; addr < end_addr; addr += step) {
|
for (int addr = start_addr; addr < end_addr; addr += step) {
|
||||||
if (write_enable() == -1) {
|
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 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;
|
step = 0x1000;
|
||||||
ret = sector_erase(addr);
|
ret = sector_erase(addr);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -359,6 +370,7 @@ bool SPIFlash::verify(const int &base_addr, const uint8_t *data,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (int ii = 0; ii < rd_burst; ii++) {
|
for (int ii = 0; ii < rd_burst; ii++) {
|
||||||
if ((uint8_t)verify_data[ii] != data[i+ii]) {
|
if ((uint8_t)verify_data[ii] != data[i+ii]) {
|
||||||
progress.fail();
|
progress.fail();
|
||||||
|
|
|
||||||
|
|
@ -129,8 +129,8 @@ static std::map <uint32_t, flash_t> flash_list = {
|
||||||
.manufacturer = "microchip",
|
.manufacturer = "microchip",
|
||||||
.model = "SST26VF032B",
|
.model = "SST26VF032B",
|
||||||
.nr_sector = 64,
|
.nr_sector = 64,
|
||||||
.sector_erase = true,
|
.sector_erase = false,
|
||||||
.subsector_erase = false,
|
.subsector_erase = true,
|
||||||
.has_extended = false,
|
.has_extended = false,
|
||||||
.tb_otp = false,
|
.tb_otp = false,
|
||||||
.tb_offset = 0,
|
.tb_offset = 0,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue