aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-hal-common/src/stm32/flash/f4.rs90
-rw-r--r--embassy-hal-common/src/stm32/flash/f7.rs42
2 files changed, 75 insertions, 57 deletions
diff --git a/embassy-hal-common/src/stm32/flash/f4.rs b/embassy-hal-common/src/stm32/flash/f4.rs
index 44d6c08c4..a8069dddf 100644
--- a/embassy-hal-common/src/stm32/flash/f4.rs
+++ b/embassy-hal-common/src/stm32/flash/f4.rs
@@ -7,6 +7,7 @@ pub const SECOND_BANK_SECTOR_OFFSET: u8 = 12;
7#[derive(Debug, PartialEq)] 7#[derive(Debug, PartialEq)]
8pub struct FlashSector { 8pub struct FlashSector {
9 pub index: u8, 9 pub index: u8,
10 pub start: u32,
10 pub size: u32, 11 pub size: u32,
11} 12}
12 13
@@ -22,7 +23,8 @@ pub fn get_sector(address: u32, dual_bank: bool, flash_size: u32) -> FlashSector
22 let sector = get_single_bank_sector(offset - bank_size); 23 let sector = get_single_bank_sector(offset - bank_size);
23 FlashSector { 24 FlashSector {
24 index: SECOND_BANK_SECTOR_OFFSET + sector.index, 25 index: SECOND_BANK_SECTOR_OFFSET + sector.index,
25 ..sector 26 start: sector.start + bank_size,
27 size: sector.size,
26 } 28 }
27 } 29 }
28 } 30 }
@@ -30,25 +32,31 @@ pub fn get_sector(address: u32, dual_bank: bool, flash_size: u32) -> FlashSector
30 32
31fn get_single_bank_sector(offset: u32) -> FlashSector { 33fn get_single_bank_sector(offset: u32) -> FlashSector {
32 // First 4 sectors are 16KB, then one 64KB, and rest are 128KB 34 // First 4 sectors are 16KB, then one 64KB, and rest are 128KB
33
34 match offset / LARGE_SECTOR_SIZE { 35 match offset / LARGE_SECTOR_SIZE {
35 0 => { 36 0 => {
36 if offset < 4 * SMALL_SECTOR_SIZE { 37 if offset < 4 * SMALL_SECTOR_SIZE {
38 let small_sector_index = offset / SMALL_SECTOR_SIZE;
37 FlashSector { 39 FlashSector {
38 index: (offset / SMALL_SECTOR_SIZE) as u8, 40 index: small_sector_index as u8,
41 start: FLASH_BASE + small_sector_index * SMALL_SECTOR_SIZE,
39 size: SMALL_SECTOR_SIZE, 42 size: SMALL_SECTOR_SIZE,
40 } 43 }
41 } else { 44 } else {
42 FlashSector { 45 FlashSector {
43 index: 4, 46 index: 4,
47 start: FLASH_BASE + 4 * SMALL_SECTOR_SIZE,
44 size: MEDIUM_SECTOR_SIZE, 48 size: MEDIUM_SECTOR_SIZE,
45 } 49 }
46 } 50 }
47 } 51 }
48 i => FlashSector { 52 i => {
49 index: 4 + i as u8, 53 let large_sector_index = i - 1;
50 size: LARGE_SECTOR_SIZE, 54 FlashSector {
51 }, 55 index: (5 + large_sector_index) as u8,
56 start: FLASH_BASE + 4 * SMALL_SECTOR_SIZE + MEDIUM_SECTOR_SIZE + large_sector_index * LARGE_SECTOR_SIZE,
57 size: LARGE_SECTOR_SIZE,
58 }
59 }
52 } 60 }
53} 61}
54 62
@@ -58,54 +66,54 @@ mod tests {
58 66
59 #[test] 67 #[test]
60 fn can_get_sector_single_bank() { 68 fn can_get_sector_single_bank() {
61 let assert_sector = |index: u8, size: u32, addr: u32| { 69 let assert_sector = |index: u8, start: u32, size: u32, addr: u32| {
62 assert_eq!(FlashSector { index, size }, get_sector(addr, false, 1024 * 1024)) 70 assert_eq!(FlashSector { index, start, size }, get_sector(addr, false, 1024 * 1024))
63 }; 71 };
64 72
65 assert_sector(0, SMALL_SECTOR_SIZE, 0x0800_0000); 73 assert_sector(0, 0x0800_0000, SMALL_SECTOR_SIZE, 0x0800_0000);
66 assert_sector(0, SMALL_SECTOR_SIZE, 0x0800_3FFF); 74 assert_sector(0, 0x0800_0000, SMALL_SECTOR_SIZE, 0x0800_3FFF);
67 assert_sector(3, SMALL_SECTOR_SIZE, 0x0800_C000); 75 assert_sector(3, 0x0800_C000, SMALL_SECTOR_SIZE, 0x0800_C000);
68 assert_sector(3, SMALL_SECTOR_SIZE, 0x0800_FFFF); 76 assert_sector(3, 0x0800_C000, SMALL_SECTOR_SIZE, 0x0800_FFFF);
69 77
70 assert_sector(4, MEDIUM_SECTOR_SIZE, 0x0801_0000); 78 assert_sector(4, 0x0801_0000, MEDIUM_SECTOR_SIZE, 0x0801_0000);
71 assert_sector(4, MEDIUM_SECTOR_SIZE, 0x0801_FFFF); 79 assert_sector(4, 0x0801_0000, MEDIUM_SECTOR_SIZE, 0x0801_FFFF);
72 80
73 assert_sector(5, LARGE_SECTOR_SIZE, 0x0802_0000); 81 assert_sector(5, 0x0802_0000, LARGE_SECTOR_SIZE, 0x0802_0000);
74 assert_sector(5, LARGE_SECTOR_SIZE, 0x0803_FFFF); 82 assert_sector(5, 0x0802_0000, LARGE_SECTOR_SIZE, 0x0803_FFFF);
75 assert_sector(11, LARGE_SECTOR_SIZE, 0x080E_0000); 83 assert_sector(11, 0x080E_0000, LARGE_SECTOR_SIZE, 0x080E_0000);
76 assert_sector(11, LARGE_SECTOR_SIZE, 0x080F_FFFF); 84 assert_sector(11, 0x080E_0000, LARGE_SECTOR_SIZE, 0x080F_FFFF);
77 } 85 }
78 86
79 #[test] 87 #[test]
80 fn can_get_sector_dual_bank() { 88 fn can_get_sector_dual_bank() {
81 let assert_sector = |index: u8, size: u32, addr: u32| { 89 let assert_sector = |index: u8, start: u32, size: u32, addr: u32| {
82 assert_eq!(FlashSector { index, size }, get_sector(addr, true, 1024 * 1024)) 90 assert_eq!(FlashSector { index, start, size }, get_sector(addr, true, 1024 * 1024))
83 }; 91 };
84 92
85 assert_sector(0, SMALL_SECTOR_SIZE, 0x0800_0000); 93 assert_sector(0, 0x0800_0000, SMALL_SECTOR_SIZE, 0x0800_0000);
86 assert_sector(0, SMALL_SECTOR_SIZE, 0x0800_3FFF); 94 assert_sector(0, 0x0800_0000, SMALL_SECTOR_SIZE, 0x0800_3FFF);
87 assert_sector(3, SMALL_SECTOR_SIZE, 0x0800_C000); 95 assert_sector(3, 0x0800_C000, SMALL_SECTOR_SIZE, 0x0800_C000);
88 assert_sector(3, SMALL_SECTOR_SIZE, 0x0800_FFFF); 96 assert_sector(3, 0x0800_C000, SMALL_SECTOR_SIZE, 0x0800_FFFF);
89 97
90 assert_sector(4, MEDIUM_SECTOR_SIZE, 0x0801_0000); 98 assert_sector(4, 0x0801_0000, MEDIUM_SECTOR_SIZE, 0x0801_0000);
91 assert_sector(4, MEDIUM_SECTOR_SIZE, 0x0801_FFFF); 99 assert_sector(4, 0x0801_0000, MEDIUM_SECTOR_SIZE, 0x0801_FFFF);
92 100
93 assert_sector(5, LARGE_SECTOR_SIZE, 0x0802_0000); 101 assert_sector(5, 0x0802_0000, LARGE_SECTOR_SIZE, 0x0802_0000);
94 assert_sector(5, LARGE_SECTOR_SIZE, 0x0803_FFFF); 102 assert_sector(5, 0x0802_0000, LARGE_SECTOR_SIZE, 0x0803_FFFF);
95 assert_sector(7, LARGE_SECTOR_SIZE, 0x0806_0000); 103 assert_sector(7, 0x0806_0000, LARGE_SECTOR_SIZE, 0x0806_0000);
96 assert_sector(7, LARGE_SECTOR_SIZE, 0x0807_FFFF); 104 assert_sector(7, 0x0806_0000, LARGE_SECTOR_SIZE, 0x0807_FFFF);
97 105
98 assert_sector(12, SMALL_SECTOR_SIZE, 0x0808_0000); 106 assert_sector(12, 0x0808_0000, SMALL_SECTOR_SIZE, 0x0808_0000);
99 assert_sector(12, SMALL_SECTOR_SIZE, 0x0808_3FFF); 107 assert_sector(12, 0x0808_0000, SMALL_SECTOR_SIZE, 0x0808_3FFF);
100 assert_sector(15, SMALL_SECTOR_SIZE, 0x0808_C000); 108 assert_sector(15, 0x0808_C000, SMALL_SECTOR_SIZE, 0x0808_C000);
101 assert_sector(15, SMALL_SECTOR_SIZE, 0x0808_FFFF); 109 assert_sector(15, 0x0808_C000, SMALL_SECTOR_SIZE, 0x0808_FFFF);
102 110
103 assert_sector(16, MEDIUM_SECTOR_SIZE, 0x0809_0000); 111 assert_sector(16, 0x0809_0000, MEDIUM_SECTOR_SIZE, 0x0809_0000);
104 assert_sector(16, MEDIUM_SECTOR_SIZE, 0x0809_FFFF); 112 assert_sector(16, 0x0809_0000, MEDIUM_SECTOR_SIZE, 0x0809_FFFF);
105 113
106 assert_sector(17, LARGE_SECTOR_SIZE, 0x080A_0000); 114 assert_sector(17, 0x080A_0000, LARGE_SECTOR_SIZE, 0x080A_0000);
107 assert_sector(17, LARGE_SECTOR_SIZE, 0x080B_FFFF); 115 assert_sector(17, 0x080A_0000, LARGE_SECTOR_SIZE, 0x080B_FFFF);
108 assert_sector(19, LARGE_SECTOR_SIZE, 0x080E_0000); 116 assert_sector(19, 0x080E_0000, LARGE_SECTOR_SIZE, 0x080E_0000);
109 assert_sector(19, LARGE_SECTOR_SIZE, 0x080F_FFFF); 117 assert_sector(19, 0x080E_0000, LARGE_SECTOR_SIZE, 0x080F_FFFF);
110 } 118 }
111} 119}
diff --git a/embassy-hal-common/src/stm32/flash/f7.rs b/embassy-hal-common/src/stm32/flash/f7.rs
index 90938e6ab..2f586adee 100644
--- a/embassy-hal-common/src/stm32/flash/f7.rs
+++ b/embassy-hal-common/src/stm32/flash/f7.rs
@@ -6,6 +6,7 @@ pub(crate) const LARGE_SECTOR_SIZE: u32 = 256 * 1024;
6#[derive(Debug, PartialEq)] 6#[derive(Debug, PartialEq)]
7pub struct FlashSector { 7pub struct FlashSector {
8 pub index: u8, 8 pub index: u8,
9 pub start: u32,
9 pub size: u32, 10 pub size: u32,
10} 11}
11 12
@@ -15,21 +16,28 @@ pub fn get_sector(address: u32) -> FlashSector {
15 match offset / LARGE_SECTOR_SIZE { 16 match offset / LARGE_SECTOR_SIZE {
16 0 => { 17 0 => {
17 if offset < 4 * SMALL_SECTOR_SIZE { 18 if offset < 4 * SMALL_SECTOR_SIZE {
19 let small_sector_index = offset / SMALL_SECTOR_SIZE;
18 FlashSector { 20 FlashSector {
19 index: (offset / SMALL_SECTOR_SIZE) as u8, 21 index: small_sector_index as u8,
22 start: FLASH_BASE + small_sector_index * SMALL_SECTOR_SIZE,
20 size: SMALL_SECTOR_SIZE, 23 size: SMALL_SECTOR_SIZE,
21 } 24 }
22 } else { 25 } else {
23 FlashSector { 26 FlashSector {
24 index: 4, 27 index: 4,
28 start: FLASH_BASE + 4 * SMALL_SECTOR_SIZE,
25 size: MEDIUM_SECTOR_SIZE, 29 size: MEDIUM_SECTOR_SIZE,
26 } 30 }
27 } 31 }
28 } 32 }
29 i => FlashSector { 33 i => {
30 index: 4 + i as u8, 34 let large_sector_index = i - 1;
31 size: LARGE_SECTOR_SIZE, 35 FlashSector {
32 }, 36 index: (5 + large_sector_index) as u8,
37 start: FLASH_BASE + 4 * SMALL_SECTOR_SIZE + MEDIUM_SECTOR_SIZE + large_sector_index * LARGE_SECTOR_SIZE,
38 size: LARGE_SECTOR_SIZE,
39 }
40 }
33 } 41 }
34} 42}
35 43
@@ -39,19 +47,21 @@ mod tests {
39 47
40 #[test] 48 #[test]
41 fn can_get_sector() { 49 fn can_get_sector() {
42 let assert_sector = |index: u8, size: u32, addr: u32| assert_eq!(FlashSector { index, size }, get_sector(addr)); 50 let assert_sector = |index: u8, start: u32, size: u32, addr: u32| {
51 assert_eq!(FlashSector { index, start, size }, get_sector(addr))
52 };
43 53
44 assert_sector(0, SMALL_SECTOR_SIZE, 0x0800_0000); 54 assert_sector(0, 0x0800_0000, SMALL_SECTOR_SIZE, 0x0800_0000);
45 assert_sector(0, SMALL_SECTOR_SIZE, 0x0800_7FFF); 55 assert_sector(0, 0x0800_0000, SMALL_SECTOR_SIZE, 0x0800_7FFF);
46 assert_sector(3, SMALL_SECTOR_SIZE, 0x0801_8000); 56 assert_sector(3, 0x0801_8000, SMALL_SECTOR_SIZE, 0x0801_8000);
47 assert_sector(3, SMALL_SECTOR_SIZE, 0x0801_FFFF); 57 assert_sector(3, 0x0801_8000, SMALL_SECTOR_SIZE, 0x0801_FFFF);
48 58
49 assert_sector(4, MEDIUM_SECTOR_SIZE, 0x0802_0000); 59 assert_sector(4, 0x0802_0000, MEDIUM_SECTOR_SIZE, 0x0802_0000);
50 assert_sector(4, MEDIUM_SECTOR_SIZE, 0x0803_FFFF); 60 assert_sector(4, 0x0802_0000, MEDIUM_SECTOR_SIZE, 0x0803_FFFF);
51 61
52 assert_sector(5, LARGE_SECTOR_SIZE, 0x0804_0000); 62 assert_sector(5, 0x0804_0000, LARGE_SECTOR_SIZE, 0x0804_0000);
53 assert_sector(5, LARGE_SECTOR_SIZE, 0x0807_FFFF); 63 assert_sector(5, 0x0804_0000, LARGE_SECTOR_SIZE, 0x0807_FFFF);
54 assert_sector(7, LARGE_SECTOR_SIZE, 0x080C_0000); 64 assert_sector(7, 0x080C_0000, LARGE_SECTOR_SIZE, 0x080C_0000);
55 assert_sector(7, LARGE_SECTOR_SIZE, 0x080F_FFFF); 65 assert_sector(7, 0x080C_0000, LARGE_SECTOR_SIZE, 0x080F_FFFF);
56 } 66 }
57} 67}