spiFlash: add no block protect use case

This commit is contained in:
Gwenhael Goavec-Merou 2022-02-26 16:15:50 +01:00
parent c737347089
commit 655f2c61ec
1 changed files with 44 additions and 26 deletions

View File

@ -262,6 +262,8 @@ int SPIFlash::erase_and_prog(int base_addr, uint8_t *data, int len)
printError("flash overflow"); printError("flash overflow");
return -1; return -1;
} }
// if device has block protect
if (_flash_model->bp_len != 0) {
/* compute protected area */ /* compute protected area */
int8_t tb = get_tb(); int8_t tb = get_tb();
if (tb == -1) if (tb == -1)
@ -290,6 +292,7 @@ int SPIFlash::erase_and_prog(int base_addr, uint8_t *data, int len)
_unprotect = true; _unprotect = true;
must_relock = true; must_relock = true;
} }
}
} else { // unknown chip: basic test } else { // unknown chip: basic test
printWarn("flash chip unknown: use basic protection detection"); printWarn("flash chip unknown: use basic protection detection");
if ((status & 0x1c) != 0) if ((status & 0x1c) != 0)
@ -437,7 +440,7 @@ void SPIFlash::display_status_reg(uint8_t reg)
if (!_flash_model) { if (!_flash_model) {
tb = (reg >> 5) & 0x01; tb = (reg >> 5) & 0x01;
bp = (((reg >> 6) & 0x01) << 3) | ((reg >> 2) & 0x07); bp = (((reg >> 6) & 0x01) << 3) | ((reg >> 2) & 0x07);
} else { } else if (_flash_model->bp_len == 0) {
tb = (reg & _flash_model->tb_offset) ? 1 : 0; tb = (reg & _flash_model->tb_offset) ? 1 : 0;
bp = 0; bp = 0;
for (int i = 0; i < _flash_model->bp_len; i++) for (int i = 0; i < _flash_model->bp_len; i++)
@ -542,6 +545,9 @@ int SPIFlash::write_disable()
int SPIFlash::disable_protection() int SPIFlash::disable_protection()
{ {
// nothing to do
if (_flash_model && _flash_model->bp_len == 0)
return 0;
uint8_t data = 0x00; uint8_t data = 0x00;
if (write_enable() == -1) if (write_enable() == -1)
return -1; return -1;
@ -563,6 +569,12 @@ int SPIFlash::disable_protection()
*/ */
int SPIFlash::enable_protection(uint8_t protect_code) int SPIFlash::enable_protection(uint8_t protect_code)
{ {
// known device but no bp
if (_flash_model && _flash_model->bp_len == 0) {
printWarn("device has no block protection");
return -1;
}
/* enable write (required to access WRSR) */ /* enable write (required to access WRSR) */
if (write_enable() == -1) { if (write_enable() == -1) {
printError("Error: can't enable write"); printError("Error: can't enable write");
@ -596,6 +608,12 @@ int SPIFlash::enable_protection(uint32_t length)
return -1; return -1;
} }
// if device has no block protect
if (_flash_model->bp_len == 0) {
printWarn("device has no block protection");
return -1;
}
/* convert number of sectors to bp[3:0] mask */ /* convert number of sectors to bp[3:0] mask */
uint8_t bp = len_to_bp(length); uint8_t bp = len_to_bp(length);