diff options
| author | Ulf Lilleengen <[email protected]> | 2024-09-19 09:15:08 +0200 |
|---|---|---|
| committer | Ulf Lilleengen <[email protected]> | 2024-09-19 09:16:19 +0200 |
| commit | ab0a227e4c02137bc3a621907d17ede0ace4cb1d (patch) | |
| tree | 93e7b4e82f113283fa1b136871d48416968d52f3 | |
| parent | b1897c58fa617dbab02b39e7f5e399ed1c9d54b4 (diff) | |
Ensure bootloader state is parsed correctly
| -rw-r--r-- | embassy-boot/src/firmware_updater/asynch.rs | 7 | ||||
| -rw-r--r-- | embassy-boot/src/firmware_updater/blocking.rs | 9 | ||||
| -rw-r--r-- | embassy-boot/src/lib.rs | 18 |
3 files changed, 20 insertions, 14 deletions
diff --git a/embassy-boot/src/firmware_updater/asynch.rs b/embassy-boot/src/firmware_updater/asynch.rs index b23857e2f..d9d15b004 100644 --- a/embassy-boot/src/firmware_updater/asynch.rs +++ b/embassy-boot/src/firmware_updater/asynch.rs | |||
| @@ -304,12 +304,7 @@ impl<'d, STATE: NorFlash> FirmwareState<'d, STATE> { | |||
| 304 | /// `mark_booted`. | 304 | /// `mark_booted`. |
| 305 | pub async fn get_state(&mut self) -> Result<State, FirmwareUpdaterError> { | 305 | pub async fn get_state(&mut self) -> Result<State, FirmwareUpdaterError> { |
| 306 | self.state.read(0, &mut self.aligned).await?; | 306 | self.state.read(0, &mut self.aligned).await?; |
| 307 | 307 | Ok(State::from(&self.aligned)) | |
| 308 | if !self.aligned.iter().any(|&b| b != SWAP_MAGIC) { | ||
| 309 | Ok(State::Swap) | ||
| 310 | } else { | ||
| 311 | Ok(State::Boot) | ||
| 312 | } | ||
| 313 | } | 308 | } |
| 314 | 309 | ||
| 315 | /// Mark to trigger firmware swap on next boot. | 310 | /// Mark to trigger firmware swap on next boot. |
diff --git a/embassy-boot/src/firmware_updater/blocking.rs b/embassy-boot/src/firmware_updater/blocking.rs index 5f64b4be9..08062b0d0 100644 --- a/embassy-boot/src/firmware_updater/blocking.rs +++ b/embassy-boot/src/firmware_updater/blocking.rs | |||
| @@ -339,14 +339,7 @@ impl<'d, STATE: NorFlash> BlockingFirmwareState<'d, STATE> { | |||
| 339 | /// `mark_booted`. | 339 | /// `mark_booted`. |
| 340 | pub fn get_state(&mut self) -> Result<State, FirmwareUpdaterError> { | 340 | pub fn get_state(&mut self) -> Result<State, FirmwareUpdaterError> { |
| 341 | self.state.read(0, &mut self.aligned)?; | 341 | self.state.read(0, &mut self.aligned)?; |
| 342 | 342 | Ok(State::from(&self.aligned)) | |
| 343 | if !self.aligned.iter().any(|&b| b != SWAP_MAGIC) { | ||
| 344 | Ok(State::Swap) | ||
| 345 | } else if !self.aligned.iter().any(|&b| b != DFU_DETACH_MAGIC) { | ||
| 346 | Ok(State::DfuDetach) | ||
| 347 | } else { | ||
| 348 | Ok(State::Boot) | ||
| 349 | } | ||
| 350 | } | 343 | } |
| 351 | 344 | ||
| 352 | /// Mark to trigger firmware swap on next boot. | 345 | /// Mark to trigger firmware swap on next boot. |
diff --git a/embassy-boot/src/lib.rs b/embassy-boot/src/lib.rs index 7d5cc58f9..e2c4cf771 100644 --- a/embassy-boot/src/lib.rs +++ b/embassy-boot/src/lib.rs | |||
| @@ -44,6 +44,24 @@ pub enum State { | |||
| 44 | DfuDetach, | 44 | DfuDetach, |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | impl<T> From<T> for State | ||
| 48 | where | ||
| 49 | T: AsRef<[u8]>, | ||
| 50 | { | ||
| 51 | fn from(magic: T) -> State { | ||
| 52 | let magic = magic.as_ref(); | ||
| 53 | if !magic.iter().any(|&b| b != SWAP_MAGIC) { | ||
| 54 | State::Swap | ||
| 55 | } else if !magic.iter().any(|&b| b != REVERT_MAGIC) { | ||
| 56 | State::Revert | ||
| 57 | } else if !magic.iter().any(|&b| b != DFU_DETACH_MAGIC) { | ||
| 58 | State::DfuDetach | ||
| 59 | } else { | ||
| 60 | State::Boot | ||
| 61 | } | ||
| 62 | } | ||
| 63 | } | ||
| 64 | |||
| 47 | /// Buffer aligned to 32 byte boundary, largest known alignment requirement for embassy-boot. | 65 | /// Buffer aligned to 32 byte boundary, largest known alignment requirement for embassy-boot. |
| 48 | #[repr(align(32))] | 66 | #[repr(align(32))] |
| 49 | pub struct AlignedBuffer<const N: usize>(pub [u8; N]); | 67 | pub struct AlignedBuffer<const N: usize>(pub [u8; N]); |
