aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src/flash
diff options
context:
space:
mode:
authorRasmus Melchior Jacobsen <[email protected]>2023-03-30 05:27:57 +0200
committerRasmus Melchior Jacobsen <[email protected]>2023-03-30 05:27:57 +0200
commit91d8afd371c20d21765713a45625f62ce25d97b6 (patch)
tree78b0169917caf5eb7d68e0708e2cbaa1b770b71e /embassy-stm32/src/flash
parent89129babf99c0e7087dfef6ce1ebf9d822ded6d1 (diff)
Add AltFlashLayout for supported F4 chips
Diffstat (limited to 'embassy-stm32/src/flash')
-rw-r--r--embassy-stm32/src/flash/common.rs4
-rw-r--r--embassy-stm32/src/flash/f4.rs75
-rw-r--r--embassy-stm32/src/flash/mod.rs58
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};
3use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; 3use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
4use embassy_sync::mutex::{Mutex, MutexGuard}; 4use embassy_sync::mutex::{Mutex, MutexGuard};
5 5
6use super::{family, Error, FlashRegion}; 6use super::{family, Error, FlashLayout, FlashRegion, FLASH_BASE, FLASH_SIZE, WRITE_SIZE};
7pub use crate::_generated::flash_regions::*;
8pub use crate::pac::{FLASH_BASE, FLASH_SIZE, WRITE_SIZE};
9use crate::Peripheral; 7use crate::Peripheral;
10 8
11pub struct Flash<'d> { 9pub 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;
11const LARGE_SECTOR_SIZE: u32 = 128 * 1024; 11const LARGE_SECTOR_SIZE: u32 = 128 * 1024;
12const SECOND_BANK_SECTOR_OFFSET: u8 = 12; 12const SECOND_BANK_SECTOR_OFFSET: u8 = 12;
13 13
14#[cfg(any(stm32f427, stm32f429, stm32f437, stm32f439, stm32f469, stm32f479))]
15mod 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))]
84pub use alt_regions::AltFlashLayout;
85
14fn is_dual_bank() -> bool { 86fn 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 @@
1use embedded_storage::nor_flash::{NorFlashError, NorFlashErrorKind}; 1use embedded_storage::nor_flash::{NorFlashError, NorFlashErrorKind};
2 2
3#[cfg(flash)]
4mod common;
5
6#[cfg(flash)]
7pub use common::*;
8
9pub use crate::_generated::flash_regions::*;
10pub use crate::pac::{FLASH_BASE, FLASH_SIZE, WRITE_SIZE};
11
12pub 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)]
21pub struct FlashSector {
22 pub index: u8,
23 pub start: u32,
24 pub size: u32,
25}
26
27impl 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)]
43mod common; 73pub use family::*;
44
45#[cfg(flash)]
46pub use common::*;
47
48pub 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)]
57pub struct FlashSector {
58 pub index: u8,
59 pub start: u32,
60 pub size: u32,
61}
62
63impl 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))]