diff options
Diffstat (limited to 'embassy-boot')
| -rw-r--r-- | embassy-boot/src/firmware_updater/asynch.rs | 19 |
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 | } |
