diff options
| author | Rasmus Melchior Jacobsen <[email protected]> | 2023-04-04 21:09:30 +0200 |
|---|---|---|
| committer | Rasmus Melchior Jacobsen <[email protected]> | 2023-04-04 21:09:30 +0200 |
| commit | 25577e0eafd8a3d4ffaa4b8f17cb55399fd58038 (patch) | |
| tree | 8e465872041cd22d1f15c2fd81cd43063d1d1a58 /embassy-boot/boot/src/lib.rs | |
| parent | 9242ad89d436422fd5abdafadb2faf845e730a16 (diff) | |
Assert active and dfu have same erase size and copy in smaller chunks
The copy from active to dfu (and vice versa) is now done in smaller portions depending on aligned_buf, which now does not need to be erase_size big.
Diffstat (limited to 'embassy-boot/boot/src/lib.rs')
| -rw-r--r-- | embassy-boot/boot/src/lib.rs | 32 |
1 files changed, 11 insertions, 21 deletions
diff --git a/embassy-boot/boot/src/lib.rs b/embassy-boot/boot/src/lib.rs index 896498c0b..79759124b 100644 --- a/embassy-boot/boot/src/lib.rs +++ b/embassy-boot/boot/src/lib.rs | |||
| @@ -7,6 +7,7 @@ mod fmt; | |||
| 7 | 7 | ||
| 8 | mod boot_loader; | 8 | mod boot_loader; |
| 9 | mod firmware_updater; | 9 | mod firmware_updater; |
| 10 | mod large_erase; | ||
| 10 | mod mem_flash; | 11 | mod mem_flash; |
| 11 | mod partition; | 12 | mod partition; |
| 12 | 13 | ||
| @@ -48,6 +49,7 @@ mod tests { | |||
| 48 | use futures::executor::block_on; | 49 | use futures::executor::block_on; |
| 49 | 50 | ||
| 50 | use super::*; | 51 | use super::*; |
| 52 | use crate::large_erase::LargeErase; | ||
| 51 | use crate::mem_flash::MemFlash; | 53 | use crate::mem_flash::MemFlash; |
| 52 | 54 | ||
| 53 | /* | 55 | /* |
| @@ -99,14 +101,10 @@ mod tests { | |||
| 99 | 101 | ||
| 100 | let mut bootloader: BootLoader = BootLoader::new(ACTIVE, DFU, STATE); | 102 | let mut bootloader: BootLoader = BootLoader::new(ACTIVE, DFU, STATE); |
| 101 | let mut updater = FirmwareUpdater::new(DFU, STATE); | 103 | let mut updater = FirmwareUpdater::new(DFU, STATE); |
| 102 | let mut offset = 0; | 104 | block_on(updater.write_firmware(0, &update, &mut flash)).unwrap(); |
| 103 | for chunk in update.chunks(4096) { | ||
| 104 | block_on(updater.write_firmware(offset, chunk, &mut flash)).unwrap(); | ||
| 105 | offset += chunk.len(); | ||
| 106 | } | ||
| 107 | block_on(updater.mark_updated(&mut flash, &mut aligned)).unwrap(); | 105 | block_on(updater.mark_updated(&mut flash, &mut aligned)).unwrap(); |
| 108 | 106 | ||
| 109 | let mut page = [0; 4096]; | 107 | let mut page = [0; 1024]; |
| 110 | assert_eq!( | 108 | assert_eq!( |
| 111 | State::Swap, | 109 | State::Swap, |
| 112 | bootloader | 110 | bootloader |
| @@ -158,7 +156,7 @@ mod tests { | |||
| 158 | const DFU: Partition = Partition::new(0, 16384); | 156 | const DFU: Partition = Partition::new(0, 16384); |
| 159 | 157 | ||
| 160 | let mut active = MemFlash::<16384, 4096, 8>::random(); | 158 | let mut active = MemFlash::<16384, 4096, 8>::random(); |
| 161 | let mut dfu = MemFlash::<16384, 2048, 8>::random(); | 159 | let mut dfu = LargeErase::<_, 4096>::new(MemFlash::<16384, 2048, 8>::random()); |
| 162 | let mut state = MemFlash::<4096, 128, 4>::random(); | 160 | let mut state = MemFlash::<4096, 128, 4>::random(); |
| 163 | let mut aligned = [0; 4]; | 161 | let mut aligned = [0; 4]; |
| 164 | 162 | ||
| @@ -171,11 +169,7 @@ mod tests { | |||
| 171 | 169 | ||
| 172 | let mut updater = FirmwareUpdater::new(DFU, STATE); | 170 | let mut updater = FirmwareUpdater::new(DFU, STATE); |
| 173 | 171 | ||
| 174 | let mut offset = 0; | 172 | block_on(updater.write_firmware(0, &update, &mut dfu)).unwrap(); |
| 175 | for chunk in update.chunks(2048) { | ||
| 176 | block_on(updater.write_firmware(offset, chunk, &mut dfu)).unwrap(); | ||
| 177 | offset += chunk.len(); | ||
| 178 | } | ||
| 179 | block_on(updater.mark_updated(&mut state, &mut aligned)).unwrap(); | 173 | block_on(updater.mark_updated(&mut state, &mut aligned)).unwrap(); |
| 180 | 174 | ||
| 181 | let mut bootloader: BootLoader = BootLoader::new(ACTIVE, DFU, STATE); | 175 | let mut bootloader: BootLoader = BootLoader::new(ACTIVE, DFU, STATE); |
| @@ -194,7 +188,7 @@ mod tests { | |||
| 194 | 188 | ||
| 195 | // First DFU page is untouched | 189 | // First DFU page is untouched |
| 196 | for i in DFU.from + 4096..DFU.to { | 190 | for i in DFU.from + 4096..DFU.to { |
| 197 | assert_eq!(dfu.mem[i], original[i - DFU.from - 4096], "Index {}", i); | 191 | assert_eq!(dfu.0.mem[i], original[i - DFU.from - 4096], "Index {}", i); |
| 198 | } | 192 | } |
| 199 | } | 193 | } |
| 200 | 194 | ||
| @@ -206,7 +200,7 @@ mod tests { | |||
| 206 | const DFU: Partition = Partition::new(0, 16384); | 200 | const DFU: Partition = Partition::new(0, 16384); |
| 207 | 201 | ||
| 208 | let mut aligned = [0; 4]; | 202 | let mut aligned = [0; 4]; |
| 209 | let mut active = MemFlash::<16384, 2048, 4>::random(); | 203 | let mut active = LargeErase::<_, 4096>::new(MemFlash::<16384, 2048, 4>::random()); |
| 210 | let mut dfu = MemFlash::<16384, 4096, 8>::random(); | 204 | let mut dfu = MemFlash::<16384, 4096, 8>::random(); |
| 211 | let mut state = MemFlash::<4096, 128, 4>::random(); | 205 | let mut state = MemFlash::<4096, 128, 4>::random(); |
| 212 | 206 | ||
| @@ -214,16 +208,12 @@ mod tests { | |||
| 214 | let update: [u8; DFU.len()] = [rand::random::<u8>(); DFU.len()]; | 208 | let update: [u8; DFU.len()] = [rand::random::<u8>(); DFU.len()]; |
| 215 | 209 | ||
| 216 | for i in ACTIVE.from..ACTIVE.to { | 210 | for i in ACTIVE.from..ACTIVE.to { |
| 217 | active.mem[i] = original[i - ACTIVE.from]; | 211 | active.0.mem[i] = original[i - ACTIVE.from]; |
| 218 | } | 212 | } |
| 219 | 213 | ||
| 220 | let mut updater = FirmwareUpdater::new(DFU, STATE); | 214 | let mut updater = FirmwareUpdater::new(DFU, STATE); |
| 221 | 215 | ||
| 222 | let mut offset = 0; | 216 | block_on(updater.write_firmware(0, &update, &mut dfu)).unwrap(); |
| 223 | for chunk in update.chunks(4096) { | ||
| 224 | block_on(updater.write_firmware(offset, chunk, &mut dfu)).unwrap(); | ||
| 225 | offset += chunk.len(); | ||
| 226 | } | ||
| 227 | block_on(updater.mark_updated(&mut state, &mut aligned)).unwrap(); | 217 | block_on(updater.mark_updated(&mut state, &mut aligned)).unwrap(); |
| 228 | 218 | ||
| 229 | let mut bootloader: BootLoader = BootLoader::new(ACTIVE, DFU, STATE); | 219 | let mut bootloader: BootLoader = BootLoader::new(ACTIVE, DFU, STATE); |
| @@ -239,7 +229,7 @@ mod tests { | |||
| 239 | ); | 229 | ); |
| 240 | 230 | ||
| 241 | for i in ACTIVE.from..ACTIVE.to { | 231 | for i in ACTIVE.from..ACTIVE.to { |
| 242 | assert_eq!(active.mem[i], update[i - ACTIVE.from], "Index {}", i); | 232 | assert_eq!(active.0.mem[i], update[i - ACTIVE.from], "Index {}", i); |
| 243 | } | 233 | } |
| 244 | 234 | ||
| 245 | // First DFU page is untouched | 235 | // First DFU page is untouched |
