aboutsummaryrefslogtreecommitdiff
path: root/embassy-boot/boot/src/lib.rs
diff options
context:
space:
mode:
authorRasmus Melchior Jacobsen <[email protected]>2023-04-04 21:09:30 +0200
committerRasmus Melchior Jacobsen <[email protected]>2023-04-04 21:09:30 +0200
commit25577e0eafd8a3d4ffaa4b8f17cb55399fd58038 (patch)
tree8e465872041cd22d1f15c2fd81cd43063d1d1a58 /embassy-boot/boot/src/lib.rs
parent9242ad89d436422fd5abdafadb2faf845e730a16 (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.rs32
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
8mod boot_loader; 8mod boot_loader;
9mod firmware_updater; 9mod firmware_updater;
10mod large_erase;
10mod mem_flash; 11mod mem_flash;
11mod partition; 12mod 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