Merge pull request #3662 from cesanta/flash-unlock

Flash unlock validation on STM32
This commit is contained in:
robertc2000 authored and GitHub committed 2026-08-11 16:41:57 +03:00
commit 84553d06a0
4 files changed
+34 -36

No files matched your search

+17 -18
View File
@@ -12435,11 +12435,9 @@ MG_IRAM static int is_dualbank(void) {
} }
MG_IRAM static void flash_unlock(void) { MG_IRAM static void flash_unlock(void) {
static bool unlocked = false; if (MG_REG(MG_FLASH_BASE + MG_FLASH_CR) & MG_BIT(31)) {
if (unlocked == false) {
MG_REG(MG_FLASH_BASE + MG_FLASH_KEYR) = 0x45670123; MG_REG(MG_FLASH_BASE + MG_FLASH_KEYR) = 0x45670123;
MG_REG(MG_FLASH_BASE + MG_FLASH_KEYR) = 0xcdef89ab; 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 void flash_unlock(void) {
static bool unlocked = false; if (MG_REG(FLASH_NSCR) & MG_BIT(0)) {
if (unlocked == false) {
MG_REG(FLASH_KEYR) = 0x45670123; 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) = 0x08192a3b;
MG_REG(FLASH_OPTKEYR) = 0x4c5d6e7f; 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) { MG_IRAM static void flash_unlock(void) {
static bool unlocked = false; if (MG_REG(FLASH_BASE1 + FLASH_CR) & MG_BIT(0)) {
if (unlocked == false) { MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0x45670123;
MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0x45670123; MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0xcdef89ab;
MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0xcdef89ab; }
if (is_dualbank()) { 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) = 0x45670123;
MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0xcdef89ab; MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0xcdef89ab;
} }
MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x08192a3b; // opt reg is "shared" if (MG_REG(FLASH_BASE1 + FLASH_OPTCR) & MG_BIT(0)) {
MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x4c5d6e7f; // thus unlock once MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x08192a3b; // opt reg is "shared"
unlocked = true; MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x4c5d6e7f; // thus unlock once
} }
} }
+1 -3
View File
@@ -45,11 +45,9 @@ MG_IRAM static int is_dualbank(void) {
} }
MG_IRAM static void flash_unlock(void) { MG_IRAM static void flash_unlock(void) {
static bool unlocked = false; if (MG_REG(MG_FLASH_BASE + MG_FLASH_CR) & MG_BIT(31)) {
if (unlocked == false) {
MG_REG(MG_FLASH_BASE + MG_FLASH_KEYR) = 0x45670123; MG_REG(MG_FLASH_BASE + MG_FLASH_KEYR) = 0x45670123;
MG_REG(MG_FLASH_BASE + MG_FLASH_KEYR) = 0xcdef89ab; MG_REG(MG_FLASH_BASE + MG_FLASH_KEYR) = 0xcdef89ab;
unlocked = true;
} }
} }
+5 -4
View File
@@ -39,13 +39,14 @@ static uint32_t sectors_per_bank(void) {
} }
static void flash_unlock(void) { static void flash_unlock(void) {
static bool unlocked = false; if (MG_REG(FLASH_NSCR) & MG_BIT(0)) {
if (unlocked == false) {
MG_REG(FLASH_KEYR) = 0x45670123; 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) = 0x08192a3b;
MG_REG(FLASH_OPTKEYR) = 0x4c5d6e7f; MG_REG(FLASH_OPTKEYR) = 0x4c5d6e7f;
unlocked = true;
} }
} }
+11 -11
View File
@@ -53,17 +53,17 @@ MG_IRAM static bool is_dualbank(void) {
} }
MG_IRAM static void flash_unlock(void) { MG_IRAM static void flash_unlock(void) {
static bool unlocked = false; if (MG_REG(FLASH_BASE1 + FLASH_CR) & MG_BIT(0)) {
if (unlocked == false) { MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0x45670123;
MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0x45670123; MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0xcdef89ab;
MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0xcdef89ab; }
if (is_dualbank()) { 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) = 0x45670123;
MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0xcdef89ab; MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0xcdef89ab;
} }
MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x08192a3b; // opt reg is "shared" if (MG_REG(FLASH_BASE1 + FLASH_OPTCR) & MG_BIT(0)) {
MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x4c5d6e7f; // thus unlock once MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x08192a3b; // opt reg is "shared"
unlocked = true; MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x4c5d6e7f; // thus unlock once
} }
} }