diff options
| author | Rasmus Melchior Jacobsen <[email protected]> | 2023-03-25 16:03:06 +0100 |
|---|---|---|
| committer | Rasmus Melchior Jacobsen <[email protected]> | 2023-03-25 16:03:06 +0100 |
| commit | 245147634bfbdcd325eea20be19286708bb29c9f (patch) | |
| tree | 2e23873a72fd6ec48a592a1c6fdd45117b13bfe3 | |
| parent | 73ccc04231adb4c4e2f00c3ecaea8481afb218d4 (diff) | |
Add region start to flash sectors
| -rw-r--r-- | embassy-hal-common/src/stm32/flash/f4.rs | 90 | ||||
| -rw-r--r-- | embassy-hal-common/src/stm32/flash/f7.rs | 42 |
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)] |
| 8 | pub struct FlashSector { | 8 | pub 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 | ||
| 31 | fn get_single_bank_sector(offset: u32) -> FlashSector { | 33 | fn 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)] |
| 7 | pub struct FlashSector { | 7 | pub 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 | } |
