summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2023-11-29 17:20:03 +1100
committerDamien George <damien@micropython.org>2024-01-08 12:29:19 +1100
commit7002a19be2bbc598b6dcdef4db2dd37e7e7753c5 (patch)
tree6b9e1d80fa2e6228ba6fd96434303a6f7f8b375d
parentb7b99522e4fb6ccf46d996c5ee52e8aceb1f7439 (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.c25
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)) {