aboutsummaryrefslogtreecommitdiff
path: root/embassy-boot
diff options
context:
space:
mode:
authorUlf Lilleengen <[email protected]>2024-09-19 09:15:08 +0200
committerUlf Lilleengen <[email protected]>2024-09-19 09:16:19 +0200
commitab0a227e4c02137bc3a621907d17ede0ace4cb1d (patch)
tree93e7b4e82f113283fa1b136871d48416968d52f3 /embassy-boot
parentb1897c58fa617dbab02b39e7f5e399ed1c9d54b4 (diff)
Ensure bootloader state is parsed correctly
Diffstat (limited to 'embassy-boot')
-rw-r--r--embassy-boot/src/firmware_updater/asynch.rs7
-rw-r--r--embassy-boot/src/firmware_updater/blocking.rs9
-rw-r--r--embassy-boot/src/lib.rs18
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
47impl<T> From<T> for State
48where
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))]
49pub struct AlignedBuffer<const N: usize>(pub [u8; N]); 67pub struct AlignedBuffer<const N: usize>(pub [u8; N]);