aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-boot/src/firmware_updater/asynch.rs19
1 files changed, 14 insertions, 5 deletions
diff --git a/embassy-boot/src/firmware_updater/asynch.rs b/embassy-boot/src/firmware_updater/asynch.rs
index 668f16f16..a7c360a35 100644
--- a/embassy-boot/src/firmware_updater/asynch.rs
+++ b/embassy-boot/src/firmware_updater/asynch.rs
@@ -276,16 +276,25 @@ impl<'d, STATE: NorFlash> FirmwareState<'d, STATE> {
276 async fn set_magic(&mut self, magic: u8) -> Result<(), FirmwareUpdaterError> { 276 async fn set_magic(&mut self, magic: u8) -> Result<(), FirmwareUpdaterError> {
277 self.state.read(0, &mut self.aligned).await?; 277 self.state.read(0, &mut self.aligned).await?;
278 278
279 if self.aligned.iter().any(|&b| b != magic) { 279 if self.aligned[..STATE::WRITE_SIZE].iter().any(|&b| b != magic) {
280 // Read progress validity 280 // Read progress validity
281 self.state.read(STATE::WRITE_SIZE as u32, &mut self.aligned).await?; 281 if STATE::READ_SIZE <= 2 * STATE::WRITE_SIZE {
282 self.state.read(STATE::WRITE_SIZE as u32, &mut self.aligned).await?;
283 } else {
284 self.aligned.rotate_left(STATE::WRITE_SIZE);
285 }
282 286
283 if self.aligned.iter().any(|&b| b != STATE_ERASE_VALUE) { 287 if self.aligned[..STATE::WRITE_SIZE]
288 .iter()
289 .any(|&b| b != STATE_ERASE_VALUE)
290 {
284 // The current progress validity marker is invalid 291 // The current progress validity marker is invalid
285 } else { 292 } else {
286 // Invalidate progress 293 // Invalidate progress
287 self.aligned.fill(!STATE_ERASE_VALUE); 294 self.aligned.fill(!STATE_ERASE_VALUE);
288 self.state.write(STATE::WRITE_SIZE as u32, &self.aligned).await?; 295 self.state
296 .write(STATE::WRITE_SIZE as u32, &self.aligned[..STATE::WRITE_SIZE])
297 .await?;
289 } 298 }
290 299
291 // Clear magic and progress 300 // Clear magic and progress
@@ -293,7 +302,7 @@ impl<'d, STATE: NorFlash> FirmwareState<'d, STATE> {
293 302
294 // Set magic 303 // Set magic
295 self.aligned.fill(magic); 304 self.aligned.fill(magic);
296 self.state.write(0, &self.aligned).await?; 305 self.state.write(0, &self.aligned[..STATE::WRITE_SIZE]).await?;
297 } 306 }
298 Ok(()) 307 Ok(())
299 } 308 }