diff options
| author | Rasmus Melchior Jacobsen <[email protected]> | 2023-03-30 05:27:57 +0200 |
|---|---|---|
| committer | Rasmus Melchior Jacobsen <[email protected]> | 2023-03-30 05:27:57 +0200 |
| commit | 91d8afd371c20d21765713a45625f62ce25d97b6 (patch) | |
| tree | 78b0169917caf5eb7d68e0708e2cbaa1b770b71e /embassy-stm32/src/flash | |
| parent | 89129babf99c0e7087dfef6ce1ebf9d822ded6d1 (diff) | |
Add AltFlashLayout for supported F4 chips
Diffstat (limited to 'embassy-stm32/src/flash')
| -rw-r--r-- | embassy-stm32/src/flash/common.rs | 4 | ||||
| -rw-r--r-- | embassy-stm32/src/flash/f4.rs | 75 | ||||
| -rw-r--r-- | embassy-stm32/src/flash/mod.rs | 58 |
3 files changed, 108 insertions, 29 deletions
diff --git a/embassy-stm32/src/flash/common.rs b/embassy-stm32/src/flash/common.rs index b190a5a07..c239d9673 100644 --- a/embassy-stm32/src/flash/common.rs +++ b/embassy-stm32/src/flash/common.rs | |||
| @@ -3,9 +3,7 @@ use embassy_hal_common::{into_ref, PeripheralRef}; | |||
| 3 | use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; | 3 | use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; |
| 4 | use embassy_sync::mutex::{Mutex, MutexGuard}; | 4 | use embassy_sync::mutex::{Mutex, MutexGuard}; |
| 5 | 5 | ||
| 6 | use super::{family, Error, FlashRegion}; | 6 | use super::{family, Error, FlashLayout, FlashRegion, FLASH_BASE, FLASH_SIZE, WRITE_SIZE}; |
| 7 | pub use crate::_generated::flash_regions::*; | ||
| 8 | pub use crate::pac::{FLASH_BASE, FLASH_SIZE, WRITE_SIZE}; | ||
| 9 | use crate::Peripheral; | 7 | use crate::Peripheral; |
| 10 | 8 | ||
| 11 | pub struct Flash<'d> { | 9 | pub struct Flash<'d> { |
diff --git a/embassy-stm32/src/flash/f4.rs b/embassy-stm32/src/flash/f4.rs index cb420c69f..257aae2d0 100644 --- a/embassy-stm32/src/flash/f4.rs +++ b/embassy-stm32/src/flash/f4.rs | |||
| @@ -11,7 +11,82 @@ const MEDIUM_SECTOR_SIZE: u32 = 64 * 1024; | |||
| 11 | const LARGE_SECTOR_SIZE: u32 = 128 * 1024; | 11 | const LARGE_SECTOR_SIZE: u32 = 128 * 1024; |
| 12 | const SECOND_BANK_SECTOR_OFFSET: u8 = 12; | 12 | const SECOND_BANK_SECTOR_OFFSET: u8 = 12; |
| 13 | 13 | ||
| 14 | #[cfg(any(stm32f427, stm32f429, stm32f437, stm32f439, stm32f469, stm32f479))] | ||
| 15 | mod alt_regions { | ||
| 16 | use embassy_hal_common::PeripheralRef; | ||
| 17 | use stm32_metapac::FLASH_SIZE; | ||
| 18 | |||
| 19 | use crate::_generated::flash_regions::{BANK1_REGION1, BANK1_REGION2, BANK1_REGION3}; | ||
| 20 | use crate::flash::{Bank1Region1, Bank1Region2, Flash, FlashRegion}; | ||
| 21 | use crate::peripherals::FLASH; | ||
| 22 | |||
| 23 | pub const ALT_BANK1_REGION3: FlashRegion = FlashRegion { | ||
| 24 | size: 3 * BANK1_REGION3.erase_size, | ||
| 25 | ..BANK1_REGION3 | ||
| 26 | }; | ||
| 27 | pub const ALT_BANK2_REGION1: FlashRegion = FlashRegion { | ||
| 28 | base: BANK1_REGION1.base + FLASH_SIZE as u32 / 2, | ||
| 29 | ..BANK1_REGION1 | ||
| 30 | }; | ||
| 31 | pub const ALT_BANK2_REGION2: FlashRegion = FlashRegion { | ||
| 32 | base: BANK1_REGION2.base + FLASH_SIZE as u32 / 2, | ||
| 33 | ..BANK1_REGION2 | ||
| 34 | }; | ||
| 35 | pub const ALT_BANK2_REGION3: FlashRegion = FlashRegion { | ||
| 36 | base: BANK1_REGION3.base + FLASH_SIZE as u32 / 2, | ||
| 37 | size: 3 * BANK1_REGION3.erase_size, | ||
| 38 | ..BANK1_REGION3 | ||
| 39 | }; | ||
| 40 | |||
| 41 | pub type AltBank1Region1 = Bank1Region1; | ||
| 42 | pub type AltBank1Region2 = Bank1Region2; | ||
| 43 | pub struct AltBank1Region3(&'static FlashRegion); | ||
| 44 | pub struct AltBank2Region1(&'static FlashRegion); | ||
| 45 | pub struct AltBank2Region2(&'static FlashRegion); | ||
| 46 | pub struct AltBank2Region3(&'static FlashRegion); | ||
| 47 | |||
| 48 | pub struct AltFlashLayout<'d> { | ||
| 49 | _inner: PeripheralRef<'d, FLASH>, | ||
| 50 | pub bank1_region1: AltBank1Region1, | ||
| 51 | pub bank1_region2: AltBank1Region2, | ||
| 52 | pub bank1_region3: AltBank1Region3, | ||
| 53 | pub bank2_region1: AltBank2Region1, | ||
| 54 | pub bank2_region2: AltBank2Region2, | ||
| 55 | pub bank2_region3: AltBank2Region3, | ||
| 56 | } | ||
| 57 | |||
| 58 | impl<'d> Flash<'d> { | ||
| 59 | pub fn into_alt_regions(self) -> AltFlashLayout<'d> { | ||
| 60 | unsafe { crate::pac::FLASH.optcr().modify(|r| r.set_db1m(true)) }; | ||
| 61 | AltFlashLayout { | ||
| 62 | _inner: self.release(), | ||
| 63 | bank1_region1: Bank1Region1(&BANK1_REGION1), | ||
| 64 | bank1_region2: Bank1Region2(&BANK1_REGION2), | ||
| 65 | bank1_region3: AltBank1Region3(&ALT_BANK1_REGION3), | ||
| 66 | bank2_region1: AltBank2Region1(&ALT_BANK2_REGION1), | ||
| 67 | bank2_region2: AltBank2Region2(&ALT_BANK2_REGION2), | ||
| 68 | bank2_region3: AltBank2Region3(&ALT_BANK2_REGION3), | ||
| 69 | } | ||
| 70 | } | ||
| 71 | } | ||
| 72 | |||
| 73 | impl Drop for AltFlashLayout<'_> { | ||
| 74 | fn drop(&mut self) { | ||
| 75 | unsafe { | ||
| 76 | super::lock(); | ||
| 77 | crate::pac::FLASH.optcr().modify(|r| r.set_db1m(false)) | ||
| 78 | }; | ||
| 79 | } | ||
| 80 | } | ||
| 81 | } | ||
| 82 | |||
| 83 | #[cfg(any(stm32f427, stm32f429, stm32f437, stm32f439, stm32f469, stm32f479))] | ||
| 84 | pub use alt_regions::AltFlashLayout; | ||
| 85 | |||
| 14 | fn is_dual_bank() -> bool { | 86 | fn is_dual_bank() -> bool { |
| 87 | // let asd: super::Bank1Region1; | ||
| 88 | // let sad = &super::BANK_1_REGION_1; | ||
| 89 | |||
| 15 | match FLASH_SIZE / 1024 { | 90 | match FLASH_SIZE / 1024 { |
| 16 | // 1 MB devices depend on configuration | 91 | // 1 MB devices depend on configuration |
| 17 | 1024 => { | 92 | 1024 => { |
diff --git a/embassy-stm32/src/flash/mod.rs b/embassy-stm32/src/flash/mod.rs index 1e7d4c657..7dc714715 100644 --- a/embassy-stm32/src/flash/mod.rs +++ b/embassy-stm32/src/flash/mod.rs | |||
| @@ -1,5 +1,35 @@ | |||
| 1 | use embedded_storage::nor_flash::{NorFlashError, NorFlashErrorKind}; | 1 | use embedded_storage::nor_flash::{NorFlashError, NorFlashErrorKind}; |
| 2 | 2 | ||
| 3 | #[cfg(flash)] | ||
| 4 | mod common; | ||
| 5 | |||
| 6 | #[cfg(flash)] | ||
| 7 | pub use common::*; | ||
| 8 | |||
| 9 | pub use crate::_generated::flash_regions::*; | ||
| 10 | pub use crate::pac::{FLASH_BASE, FLASH_SIZE, WRITE_SIZE}; | ||
| 11 | |||
| 12 | pub struct FlashRegion { | ||
| 13 | pub base: u32, | ||
| 14 | pub size: u32, | ||
| 15 | pub erase_size: u32, | ||
| 16 | pub write_size: u32, | ||
| 17 | pub erase_value: u8, | ||
| 18 | } | ||
| 19 | |||
| 20 | #[derive(Debug, PartialEq)] | ||
| 21 | pub struct FlashSector { | ||
| 22 | pub index: u8, | ||
| 23 | pub start: u32, | ||
| 24 | pub size: u32, | ||
| 25 | } | ||
| 26 | |||
| 27 | impl Drop for FlashLayout<'_> { | ||
| 28 | fn drop(&mut self) { | ||
| 29 | unsafe { family::lock() }; | ||
| 30 | } | ||
| 31 | } | ||
| 32 | |||
| 3 | #[cfg_attr(any(flash_l0, flash_l1, flash_l4, flash_wl, flash_wb), path = "l.rs")] | 33 | #[cfg_attr(any(flash_l0, flash_l1, flash_l4, flash_wl, flash_wb), path = "l.rs")] |
| 4 | #[cfg_attr(flash_f3, path = "f3.rs")] | 34 | #[cfg_attr(flash_f3, path = "f3.rs")] |
| 5 | #[cfg_attr(flash_f4, path = "f4.rs")] | 35 | #[cfg_attr(flash_f4, path = "f4.rs")] |
| @@ -39,32 +69,8 @@ mod family { | |||
| 39 | } | 69 | } |
| 40 | } | 70 | } |
| 41 | 71 | ||
| 42 | #[cfg(flash)] | 72 | #[allow(unused_imports)] |
| 43 | mod common; | 73 | pub use family::*; |
| 44 | |||
| 45 | #[cfg(flash)] | ||
| 46 | pub use common::*; | ||
| 47 | |||
| 48 | pub struct FlashRegion { | ||
| 49 | pub base: u32, | ||
| 50 | pub size: u32, | ||
| 51 | pub erase_size: u32, | ||
| 52 | pub write_size: u32, | ||
| 53 | pub erase_value: u8, | ||
| 54 | } | ||
| 55 | |||
| 56 | #[derive(Debug, PartialEq)] | ||
| 57 | pub struct FlashSector { | ||
| 58 | pub index: u8, | ||
| 59 | pub start: u32, | ||
| 60 | pub size: u32, | ||
| 61 | } | ||
| 62 | |||
| 63 | impl Drop for FlashLayout<'_> { | ||
| 64 | fn drop(&mut self) { | ||
| 65 | unsafe { family::lock() }; | ||
| 66 | } | ||
| 67 | } | ||
| 68 | 74 | ||
| 69 | #[derive(Debug, Copy, Clone, PartialEq, Eq)] | 75 | #[derive(Debug, Copy, Clone, PartialEq, Eq)] |
| 70 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 76 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
