From fa4a2563e57a053828b5de12250125f9c3592360 Mon Sep 17 00:00:00 2001 From: robert Date: Tue, 11 Aug 2026 11:48:19 +0300 Subject: [PATCH] Flash unlock validation on STM32 --- mongoose.c | 35 +++++++++++++++++------------------ src/ota_stm32f.c | 4 +--- src/ota_stm32h5.c | 9 +++++---- src/ota_stm32h7.c | 22 +++++++++++----------- 4 files changed, 34 insertions(+), 36 deletions(-) diff --git a/mongoose.c b/mongoose.c index d61a5e4e..c3006bf6 100644 --- a/mongoose.c +++ b/mongoose.c @@ -12433,11 +12433,9 @@ MG_IRAM static int is_dualbank(void) { } MG_IRAM static void flash_unlock(void) { - static bool unlocked = false; - if (unlocked == false) { + if (MG_REG(MG_FLASH_BASE + MG_FLASH_CR) & MG_BIT(31)) { MG_REG(MG_FLASH_BASE + MG_FLASH_KEYR) = 0x45670123; MG_REG(MG_FLASH_BASE + MG_FLASH_KEYR) = 0xcdef89ab; - unlocked = true; } } @@ -12684,13 +12682,14 @@ static uint32_t sectors_per_bank(void) { } static void flash_unlock(void) { - static bool unlocked = false; - if (unlocked == false) { + if (MG_REG(FLASH_NSCR) & MG_BIT(0)) { MG_REG(FLASH_KEYR) = 0x45670123; - MG_REG(FLASH_KEYR) = 0Xcdef89ab; + MG_REG(FLASH_KEYR) = 0xcdef89ab; + } + + if (MG_REG(FLASH_OPTCR) & MG_BIT(0)) { MG_REG(FLASH_OPTKEYR) = 0x08192a3b; MG_REG(FLASH_OPTKEYR) = 0x4c5d6e7f; - unlocked = true; } } @@ -12870,17 +12869,17 @@ MG_IRAM static bool is_dualbank(void) { } MG_IRAM static void flash_unlock(void) { - static bool unlocked = false; - if (unlocked == false) { - MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0x45670123; - MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0xcdef89ab; - if (is_dualbank()) { - MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0x45670123; - MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0xcdef89ab; - } - MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x08192a3b; // opt reg is "shared" - MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x4c5d6e7f; // thus unlock once - unlocked = true; + if (MG_REG(FLASH_BASE1 + FLASH_CR) & MG_BIT(0)) { + MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0x45670123; + MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0xcdef89ab; + } + if (is_dualbank() && MG_REG(FLASH_BASE2 + FLASH_CR) & MG_BIT(0)) { + MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0x45670123; + MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0xcdef89ab; + } + if (MG_REG(FLASH_BASE1 + FLASH_OPTCR) & MG_BIT(0)) { + MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x08192a3b; // opt reg is "shared" + MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x4c5d6e7f; // thus unlock once } } diff --git a/src/ota_stm32f.c b/src/ota_stm32f.c index 61cbb9ff..a353f70a 100644 --- a/src/ota_stm32f.c +++ b/src/ota_stm32f.c @@ -45,11 +45,9 @@ MG_IRAM static int is_dualbank(void) { } MG_IRAM static void flash_unlock(void) { - static bool unlocked = false; - if (unlocked == false) { + if (MG_REG(MG_FLASH_BASE + MG_FLASH_CR) & MG_BIT(31)) { MG_REG(MG_FLASH_BASE + MG_FLASH_KEYR) = 0x45670123; MG_REG(MG_FLASH_BASE + MG_FLASH_KEYR) = 0xcdef89ab; - unlocked = true; } } diff --git a/src/ota_stm32h5.c b/src/ota_stm32h5.c index 59835109..0ad3dcab 100644 --- a/src/ota_stm32h5.c +++ b/src/ota_stm32h5.c @@ -39,13 +39,14 @@ static uint32_t sectors_per_bank(void) { } static void flash_unlock(void) { - static bool unlocked = false; - if (unlocked == false) { + if (MG_REG(FLASH_NSCR) & MG_BIT(0)) { MG_REG(FLASH_KEYR) = 0x45670123; - MG_REG(FLASH_KEYR) = 0Xcdef89ab; + MG_REG(FLASH_KEYR) = 0xcdef89ab; + } + + if (MG_REG(FLASH_OPTCR) & MG_BIT(0)) { MG_REG(FLASH_OPTKEYR) = 0x08192a3b; MG_REG(FLASH_OPTKEYR) = 0x4c5d6e7f; - unlocked = true; } } diff --git a/src/ota_stm32h7.c b/src/ota_stm32h7.c index 95fa40cc..026ae6b4 100644 --- a/src/ota_stm32h7.c +++ b/src/ota_stm32h7.c @@ -53,17 +53,17 @@ MG_IRAM static bool is_dualbank(void) { } MG_IRAM static void flash_unlock(void) { - static bool unlocked = false; - if (unlocked == false) { - MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0x45670123; - MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0xcdef89ab; - if (is_dualbank()) { - MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0x45670123; - MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0xcdef89ab; - } - MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x08192a3b; // opt reg is "shared" - MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x4c5d6e7f; // thus unlock once - unlocked = true; + if (MG_REG(FLASH_BASE1 + FLASH_CR) & MG_BIT(0)) { + MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0x45670123; + MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0xcdef89ab; + } + if (is_dualbank() && MG_REG(FLASH_BASE2 + FLASH_CR) & MG_BIT(0)) { + MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0x45670123; + MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0xcdef89ab; + } + if (MG_REG(FLASH_BASE1 + FLASH_OPTCR) & MG_BIT(0)) { + MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x08192a3b; // opt reg is "shared" + MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x4c5d6e7f; // thus unlock once } }