diff options
| author | Damien George <damien@micropython.org> | 2023-11-29 17:20:03 +1100 |
|---|---|---|
| committer | Damien George <damien@micropython.org> | 2024-01-08 12:29:19 +1100 |
| commit | 7002a19be2bbc598b6dcdef4db2dd37e7e7753c5 (patch) | |
| tree | 6b9e1d80fa2e6228ba6fd96434303a6f7f8b375d | |
| parent | b7b99522e4fb6ccf46d996c5ee52e8aceb1f7439 (diff) | |
stm32/mboot: Improve mass erase to erase all non-protected pages.
Signed-off-by: Damien George <damien@micropython.org>
| -rw-r--r-- | ports/stm32/mboot/main.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/ports/stm32/mboot/main.c b/ports/stm32/mboot/main.c index 079118287..117553087 100644 --- a/ports/stm32/mboot/main.c +++ b/ports/stm32/mboot/main.c @@ -449,14 +449,6 @@ static bool flash_is_modifiable_addr_range(uint32_t addr, uint32_t len) { || addr >= (uint32_t)&_mboot_protected_flash_end_exclusive; } -static int mboot_flash_mass_erase(void) { - // Erase all flash pages after mboot. - uint32_t start_addr = (uint32_t)&_mboot_protected_flash_end_exclusive; - uint32_t num_words = (FLASH_END + 1 - start_addr) / sizeof(uint32_t); - int ret = flash_erase(start_addr, num_words); - return ret; -} - static int mboot_flash_page_erase(uint32_t addr, uint32_t *next_addr) { // Compute start and end address of the sector being erased. uint32_t sector_size = 0; @@ -488,6 +480,23 @@ static int mboot_flash_page_erase(uint32_t addr, uint32_t *next_addr) { return 0; } +static int mboot_flash_mass_erase(void) { + // Erase all flash pages except those disallowed because they overlap with mboot. + uint32_t addr = FLASH_START; + while (addr <= FLASH_END) { + int ret = mboot_flash_page_erase(addr, &addr); + if (ret != 0 && ret != -MBOOT_ERRNO_FLASH_ERASE_DISALLOWED) { + return ret; + } + } + + // Reset any errors from disallowed page erases. + dfu_context.status = DFU_STATUS_OK; + dfu_context.error = 0; + + return 0; +} + static int mboot_flash_write(uint32_t addr, const uint8_t *src8, size_t len) { bool valid = flash_is_valid_addr(addr); if (!valid || !flash_is_modifiable_addr_range(addr, len)) { |
