aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRasmus Melchior Jacobsen <[email protected]>2023-03-25 05:52:48 +0100
committerRasmus Melchior Jacobsen <[email protected]>2023-03-25 05:52:48 +0100
commitd8b265856f73ae0e7985a6c2fe1a8f0fb811328d (patch)
tree1a3f222b9dc808dff6f440bcc80e3f945b8d1e4b
parent299689dfa2a5e160dbd6aa474772a9317a219084 (diff)
Add f4 flash sector computation to hal-common to allow for tests
-rw-r--r--embassy-hal-common/src/lib.rs1
-rw-r--r--embassy-hal-common/src/stm32/flash.rs113
-rw-r--r--embassy-hal-common/src/stm32/mod.rs1
3 files changed, 115 insertions, 0 deletions
diff --git a/embassy-hal-common/src/lib.rs b/embassy-hal-common/src/lib.rs
index b2a35cd35..1b253719e 100644
--- a/embassy-hal-common/src/lib.rs
+++ b/embassy-hal-common/src/lib.rs
@@ -10,4 +10,5 @@ mod macros;
10mod peripheral; 10mod peripheral;
11pub mod ratio; 11pub mod ratio;
12pub mod ring_buffer; 12pub mod ring_buffer;
13pub mod stm32;
13pub use peripheral::{Peripheral, PeripheralRef}; 14pub use peripheral::{Peripheral, PeripheralRef};
diff --git a/embassy-hal-common/src/stm32/flash.rs b/embassy-hal-common/src/stm32/flash.rs
new file mode 100644
index 000000000..46c42aff9
--- /dev/null
+++ b/embassy-hal-common/src/stm32/flash.rs
@@ -0,0 +1,113 @@
1pub mod f4 {
2 const FLASH_BASE: u32 = 0x08_00_00_00;
3 pub(crate) const SMALL_SECTOR_SIZE: u32 = 16 * 1024;
4 pub(crate) const MEDIUM_SECTOR_SIZE: u32 = 64 * 1024;
5 pub(crate) const LARGE_SECTOR_SIZE: u32 = 128 * 1024;
6 pub const SECOND_BANK_SECTOR_OFFSET: u8 = 12;
7
8 #[derive(Debug, PartialEq)]
9 pub struct FlashSector {
10 pub index: u8,
11 pub size: u32,
12 }
13
14 pub fn get_sector(addr: u32, dual_bank: bool, flash_size: u32) -> FlashSector {
15 let offset = addr - FLASH_BASE;
16 if !dual_bank {
17 get_single_bank_sector(offset)
18 } else {
19 let bank_size = flash_size / 2;
20 if offset < bank_size {
21 get_single_bank_sector(offset)
22 } else {
23 let sector = get_single_bank_sector(offset - bank_size);
24 FlashSector {
25 index: SECOND_BANK_SECTOR_OFFSET + sector.index,
26 ..sector
27 }
28 }
29 }
30 }
31
32 fn get_single_bank_sector(offset: u32) -> FlashSector {
33 // First 4 sectors are 16KB, then one 64KB, and rest are 128KB
34
35 match offset / LARGE_SECTOR_SIZE {
36 0 => {
37 if offset < 4 * SMALL_SECTOR_SIZE {
38 FlashSector {
39 index: (offset / SMALL_SECTOR_SIZE) as u8,
40 size: SMALL_SECTOR_SIZE,
41 }
42 } else {
43 FlashSector {
44 index: 4,
45 size: MEDIUM_SECTOR_SIZE,
46 }
47 }
48 }
49 i => FlashSector {
50 index: 4 + i as u8,
51 size: LARGE_SECTOR_SIZE,
52 },
53 }
54 }
55}
56
57#[cfg(test)]
58mod tests {
59 use super::f4::*;
60
61 #[test]
62 fn can_get_sector_single_bank() {
63 let assert_sector = |index: u8, size: u32, addr: u32| {
64 assert_eq!(FlashSector { index, size }, get_sector(addr, false, 1024 * 1024))
65 };
66
67 assert_sector(0, SMALL_SECTOR_SIZE, 0x0800_0000);
68 assert_sector(0, SMALL_SECTOR_SIZE, 0x0800_3FFF);
69 assert_sector(3, SMALL_SECTOR_SIZE, 0x0800_C000);
70 assert_sector(3, SMALL_SECTOR_SIZE, 0x0800_FFFF);
71
72 assert_sector(4, MEDIUM_SECTOR_SIZE, 0x0801_0000);
73 assert_sector(4, MEDIUM_SECTOR_SIZE, 0x0801_FFFF);
74
75 assert_sector(5, LARGE_SECTOR_SIZE, 0x0802_0000);
76 assert_sector(5, LARGE_SECTOR_SIZE, 0x0803_FFFF);
77 assert_sector(11, LARGE_SECTOR_SIZE, 0x080E_0000);
78 assert_sector(11, LARGE_SECTOR_SIZE, 0x080F_FFFF);
79 }
80
81 #[test]
82 fn can_get_sector_dual_bank() {
83 let assert_sector = |index: u8, size: u32, addr: u32| {
84 assert_eq!(FlashSector { index, size }, get_sector(addr, true, 1024 * 1024))
85 };
86
87 assert_sector(0, SMALL_SECTOR_SIZE, 0x0800_0000);
88 assert_sector(0, SMALL_SECTOR_SIZE, 0x0800_3FFF);
89 assert_sector(3, SMALL_SECTOR_SIZE, 0x0800_C000);
90 assert_sector(3, SMALL_SECTOR_SIZE, 0x0800_FFFF);
91
92 assert_sector(4, MEDIUM_SECTOR_SIZE, 0x0801_0000);
93 assert_sector(4, MEDIUM_SECTOR_SIZE, 0x0801_FFFF);
94
95 assert_sector(5, LARGE_SECTOR_SIZE, 0x0802_0000);
96 assert_sector(5, LARGE_SECTOR_SIZE, 0x0803_FFFF);
97 assert_sector(7, LARGE_SECTOR_SIZE, 0x0806_0000);
98 assert_sector(7, LARGE_SECTOR_SIZE, 0x0807_FFFF);
99
100 assert_sector(12, SMALL_SECTOR_SIZE, 0x0808_0000);
101 assert_sector(12, SMALL_SECTOR_SIZE, 0x0808_3FFF);
102 assert_sector(15, SMALL_SECTOR_SIZE, 0x0808_C000);
103 assert_sector(15, SMALL_SECTOR_SIZE, 0x0808_FFFF);
104
105 assert_sector(16, MEDIUM_SECTOR_SIZE, 0x0809_0000);
106 assert_sector(16, MEDIUM_SECTOR_SIZE, 0x0809_FFFF);
107
108 assert_sector(17, LARGE_SECTOR_SIZE, 0x080A_0000);
109 assert_sector(17, LARGE_SECTOR_SIZE, 0x080B_FFFF);
110 assert_sector(19, LARGE_SECTOR_SIZE, 0x080E_0000);
111 assert_sector(19, LARGE_SECTOR_SIZE, 0x080F_FFFF);
112 }
113}
diff --git a/embassy-hal-common/src/stm32/mod.rs b/embassy-hal-common/src/stm32/mod.rs
new file mode 100644
index 000000000..2e50f82b3
--- /dev/null
+++ b/embassy-hal-common/src/stm32/mod.rs
@@ -0,0 +1 @@
pub mod flash;