diff options
| author | Dario Nieuwenhuis <[email protected]> | 2023-10-10 10:12:55 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-10-10 10:12:55 +0000 |
| commit | eff73d6dfa4c5920a55a5ee2bf5c0b2ef68fbae1 (patch) | |
| tree | d97e2f77fa47b368ccdc6d44706758c8d4aec50e | |
| parent | 904f1cfc7a8065b2dc794342b2d2cc401ded9b41 (diff) | |
| parent | 3616d68aaa0d41bd489295942c57e29a43338dac (diff) | |
Merge pull request #2032 from andresv/stm32-check-flash-lock-before-unlocking
stm32 flash: check lock bit before unlocking
| -rw-r--r-- | embassy-stm32/src/flash/f0.rs | 6 | ||||
| -rw-r--r-- | embassy-stm32/src/flash/f3.rs | 6 | ||||
| -rw-r--r-- | embassy-stm32/src/flash/f4.rs | 6 | ||||
| -rw-r--r-- | embassy-stm32/src/flash/f7.rs | 6 | ||||
| -rw-r--r-- | embassy-stm32/src/flash/g0.rs | 6 | ||||
| -rw-r--r-- | embassy-stm32/src/flash/h7.rs | 12 | ||||
| -rw-r--r-- | embassy-stm32/src/flash/l.rs | 18 |
7 files changed, 40 insertions, 20 deletions
diff --git a/embassy-stm32/src/flash/f0.rs b/embassy-stm32/src/flash/f0.rs index d011522be..1ab8435a0 100644 --- a/embassy-stm32/src/flash/f0.rs +++ b/embassy-stm32/src/flash/f0.rs | |||
| @@ -19,8 +19,10 @@ pub(crate) unsafe fn lock() { | |||
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | pub(crate) unsafe fn unlock() { | 21 | pub(crate) unsafe fn unlock() { |
| 22 | pac::FLASH.keyr().write(|w| w.set_fkeyr(0x4567_0123)); | 22 | if pac::FLASH.cr().read().lock() { |
| 23 | pac::FLASH.keyr().write(|w| w.set_fkeyr(0xCDEF_89AB)); | 23 | pac::FLASH.keyr().write(|w| w.set_fkeyr(0x4567_0123)); |
| 24 | pac::FLASH.keyr().write(|w| w.set_fkeyr(0xCDEF_89AB)); | ||
| 25 | } | ||
| 24 | } | 26 | } |
| 25 | 27 | ||
| 26 | pub(crate) unsafe fn enable_blocking_write() { | 28 | pub(crate) unsafe fn enable_blocking_write() { |
diff --git a/embassy-stm32/src/flash/f3.rs b/embassy-stm32/src/flash/f3.rs index 065369f64..7e6d7ca26 100644 --- a/embassy-stm32/src/flash/f3.rs +++ b/embassy-stm32/src/flash/f3.rs | |||
| @@ -19,8 +19,10 @@ pub(crate) unsafe fn lock() { | |||
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | pub(crate) unsafe fn unlock() { | 21 | pub(crate) unsafe fn unlock() { |
| 22 | pac::FLASH.keyr().write(|w| w.set_fkeyr(0x4567_0123)); | 22 | if pac::FLASH.cr().read().lock() { |
| 23 | pac::FLASH.keyr().write(|w| w.set_fkeyr(0xCDEF_89AB)); | 23 | pac::FLASH.keyr().write(|w| w.set_fkeyr(0x4567_0123)); |
| 24 | pac::FLASH.keyr().write(|w| w.set_fkeyr(0xCDEF_89AB)); | ||
| 25 | } | ||
| 24 | } | 26 | } |
| 25 | 27 | ||
| 26 | pub(crate) unsafe fn enable_blocking_write() { | 28 | pub(crate) unsafe fn enable_blocking_write() { |
diff --git a/embassy-stm32/src/flash/f4.rs b/embassy-stm32/src/flash/f4.rs index 913950fe5..81deaa179 100644 --- a/embassy-stm32/src/flash/f4.rs +++ b/embassy-stm32/src/flash/f4.rs | |||
| @@ -228,8 +228,10 @@ pub(crate) unsafe fn lock() { | |||
| 228 | } | 228 | } |
| 229 | 229 | ||
| 230 | pub(crate) unsafe fn unlock() { | 230 | pub(crate) unsafe fn unlock() { |
| 231 | pac::FLASH.keyr().write(|w| w.set_key(0x45670123)); | 231 | if pac::FLASH.cr().read().lock() { |
| 232 | pac::FLASH.keyr().write(|w| w.set_key(0xCDEF89AB)); | 232 | pac::FLASH.keyr().write(|w| w.set_key(0x45670123)); |
| 233 | pac::FLASH.keyr().write(|w| w.set_key(0xCDEF89AB)); | ||
| 234 | } | ||
| 233 | } | 235 | } |
| 234 | 236 | ||
| 235 | pub(crate) unsafe fn enable_write() { | 237 | pub(crate) unsafe fn enable_write() { |
diff --git a/embassy-stm32/src/flash/f7.rs b/embassy-stm32/src/flash/f7.rs index 3a5bdf9c5..b52231ca8 100644 --- a/embassy-stm32/src/flash/f7.rs +++ b/embassy-stm32/src/flash/f7.rs | |||
| @@ -19,8 +19,10 @@ pub(crate) unsafe fn lock() { | |||
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | pub(crate) unsafe fn unlock() { | 21 | pub(crate) unsafe fn unlock() { |
| 22 | pac::FLASH.keyr().write(|w| w.set_key(0x4567_0123)); | 22 | if pac::FLASH.cr().read().lock() { |
| 23 | pac::FLASH.keyr().write(|w| w.set_key(0xCDEF_89AB)); | 23 | pac::FLASH.keyr().write(|w| w.set_key(0x4567_0123)); |
| 24 | pac::FLASH.keyr().write(|w| w.set_key(0xCDEF_89AB)); | ||
| 25 | } | ||
| 24 | } | 26 | } |
| 25 | 27 | ||
| 26 | pub(crate) unsafe fn enable_blocking_write() { | 28 | pub(crate) unsafe fn enable_blocking_write() { |
diff --git a/embassy-stm32/src/flash/g0.rs b/embassy-stm32/src/flash/g0.rs index 3a4576016..19a388970 100644 --- a/embassy-stm32/src/flash/g0.rs +++ b/embassy-stm32/src/flash/g0.rs | |||
| @@ -24,8 +24,10 @@ pub(crate) unsafe fn unlock() { | |||
| 24 | while pac::FLASH.sr().read().bsy() {} | 24 | while pac::FLASH.sr().read().bsy() {} |
| 25 | 25 | ||
| 26 | // Unlock flash | 26 | // Unlock flash |
| 27 | pac::FLASH.keyr().write(|w| w.set_keyr(0x4567_0123)); | 27 | if pac::FLASH.cr().read().lock() { |
| 28 | pac::FLASH.keyr().write(|w| w.set_keyr(0xCDEF_89AB)); | 28 | pac::FLASH.keyr().write(|w| w.set_keyr(0x4567_0123)); |
| 29 | pac::FLASH.keyr().write(|w| w.set_keyr(0xCDEF_89AB)); | ||
| 30 | } | ||
| 29 | } | 31 | } |
| 30 | 32 | ||
| 31 | pub(crate) unsafe fn enable_blocking_write() { | 33 | pub(crate) unsafe fn enable_blocking_write() { |
diff --git a/embassy-stm32/src/flash/h7.rs b/embassy-stm32/src/flash/h7.rs index 625bf13fc..b064fd6ea 100644 --- a/embassy-stm32/src/flash/h7.rs +++ b/embassy-stm32/src/flash/h7.rs | |||
| @@ -26,11 +26,15 @@ pub(crate) unsafe fn lock() { | |||
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | pub(crate) unsafe fn unlock() { | 28 | pub(crate) unsafe fn unlock() { |
| 29 | pac::FLASH.bank(0).keyr().write(|w| w.set_keyr(0x4567_0123)); | 29 | if pac::FLASH.bank(0).cr().read().lock() { |
| 30 | pac::FLASH.bank(0).keyr().write(|w| w.set_keyr(0xCDEF_89AB)); | 30 | pac::FLASH.bank(0).keyr().write(|w| w.set_keyr(0x4567_0123)); |
| 31 | pac::FLASH.bank(0).keyr().write(|w| w.set_keyr(0xCDEF_89AB)); | ||
| 32 | } | ||
| 31 | if is_dual_bank() { | 33 | if is_dual_bank() { |
| 32 | pac::FLASH.bank(1).keyr().write(|w| w.set_keyr(0x4567_0123)); | 34 | if pac::FLASH.bank(1).cr().read().lock() { |
| 33 | pac::FLASH.bank(1).keyr().write(|w| w.set_keyr(0xCDEF_89AB)); | 35 | pac::FLASH.bank(1).keyr().write(|w| w.set_keyr(0x4567_0123)); |
| 36 | pac::FLASH.bank(1).keyr().write(|w| w.set_keyr(0xCDEF_89AB)); | ||
| 37 | } | ||
| 34 | } | 38 | } |
| 35 | } | 39 | } |
| 36 | 40 | ||
diff --git a/embassy-stm32/src/flash/l.rs b/embassy-stm32/src/flash/l.rs index 24dcf99bc..1db0da923 100644 --- a/embassy-stm32/src/flash/l.rs +++ b/embassy-stm32/src/flash/l.rs | |||
| @@ -28,17 +28,23 @@ pub(crate) unsafe fn lock() { | |||
| 28 | pub(crate) unsafe fn unlock() { | 28 | pub(crate) unsafe fn unlock() { |
| 29 | #[cfg(any(flash_wl, flash_wb, flash_l4))] | 29 | #[cfg(any(flash_wl, flash_wb, flash_l4))] |
| 30 | { | 30 | { |
| 31 | pac::FLASH.keyr().write(|w| w.set_keyr(0x4567_0123)); | 31 | if pac::FLASH.cr().read().lock() { |
| 32 | pac::FLASH.keyr().write(|w| w.set_keyr(0xCDEF_89AB)); | 32 | pac::FLASH.keyr().write(|w| w.set_keyr(0x4567_0123)); |
| 33 | pac::FLASH.keyr().write(|w| w.set_keyr(0xCDEF_89AB)); | ||
| 34 | } | ||
| 33 | } | 35 | } |
| 34 | 36 | ||
| 35 | #[cfg(any(flash_l0, flash_l1))] | 37 | #[cfg(any(flash_l0, flash_l1))] |
| 36 | { | 38 | { |
| 37 | pac::FLASH.pekeyr().write(|w| w.set_pekeyr(0x89ABCDEF)); | 39 | if pac::FLASH.pecr().read().pelock() { |
| 38 | pac::FLASH.pekeyr().write(|w| w.set_pekeyr(0x02030405)); | 40 | pac::FLASH.pekeyr().write(|w| w.set_pekeyr(0x89ABCDEF)); |
| 41 | pac::FLASH.pekeyr().write(|w| w.set_pekeyr(0x02030405)); | ||
| 42 | } | ||
| 39 | 43 | ||
| 40 | pac::FLASH.prgkeyr().write(|w| w.set_prgkeyr(0x8C9DAEBF)); | 44 | if pac::FLASH.pecr().read().prglock() { |
| 41 | pac::FLASH.prgkeyr().write(|w| w.set_prgkeyr(0x13141516)); | 45 | pac::FLASH.prgkeyr().write(|w| w.set_prgkeyr(0x8C9DAEBF)); |
| 46 | pac::FLASH.prgkeyr().write(|w| w.set_prgkeyr(0x13141516)); | ||
| 47 | } | ||
| 42 | } | 48 | } |
| 43 | } | 49 | } |
| 44 | 50 | ||
