diff --git a/mongoose.c b/mongoose.c index b62e8101..edd51ca3 100644 --- a/mongoose.c +++ b/mongoose.c @@ -12435,11 +12435,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; } } @@ -12686,13 +12684,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; } } @@ -12872,17 +12871,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 } }