From b0a53610ba935379320c4ace5f6a4557de04e810 Mon Sep 17 00:00:00 2001 From: Ulf Lilleengen Date: Thu, 31 Mar 2022 15:23:06 +0200 Subject: [PATCH] Avoid writing bootloader flash if not needed --- embassy-boot/boot/src/lib.rs | 60 +++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/embassy-boot/boot/src/lib.rs b/embassy-boot/boot/src/lib.rs index f58432410..6f31e280d 100644 --- a/embassy-boot/boot/src/lib.rs +++ b/embassy-boot/boot/src/lib.rs @@ -318,21 +318,27 @@ impl FirmwareUpdater { #[repr(align(4))] struct Aligned([u8; 4]); - flash - .write(self.state.from as u32, &Aligned([0; 4]).0) - .await?; - flash - .erase(self.state.from as u32, self.state.to as u32) - .await?; - trace!( - "Setting swap magic at {} to 0x{:x}, LE: 0x{:x}", - self.state.from, - &SWAP_MAGIC, - &SWAP_MAGIC.to_le_bytes() - ); - flash - .write(self.state.from as u32, &SWAP_MAGIC.to_le_bytes()) - .await?; + let mut magic = Aligned([0; 4]); + flash.read(self.state.from as u32, &mut magic.0).await?; + let magic = u32::from_le_bytes(magic.0); + + if magic != SWAP_MAGIC { + flash + .write(self.state.from as u32, &Aligned([0; 4]).0) + .await?; + flash + .erase(self.state.from as u32, self.state.to as u32) + .await?; + trace!( + "Setting swap magic at {} to 0x{:x}, LE: 0x{:x}", + self.state.from, + &SWAP_MAGIC, + &SWAP_MAGIC.to_le_bytes() + ); + flash + .write(self.state.from as u32, &SWAP_MAGIC.to_le_bytes()) + .await?; + } Ok(()) } @@ -341,15 +347,21 @@ impl FirmwareUpdater { #[repr(align(4))] struct Aligned([u8; 4]); - flash - .write(self.state.from as u32, &Aligned([0; 4]).0) - .await?; - flash - .erase(self.state.from as u32, self.state.to as u32) - .await?; - flash - .write(self.state.from as u32, &BOOT_MAGIC.to_le_bytes()) - .await?; + let mut magic = Aligned([0; 4]); + flash.read(self.state.from as u32, &mut magic.0).await?; + let magic = u32::from_le_bytes(magic.0); + + if magic != BOOT_MAGIC { + flash + .write(self.state.from as u32, &Aligned([0; 4]).0) + .await?; + flash + .erase(self.state.from as u32, self.state.to as u32) + .await?; + flash + .write(self.state.from as u32, &BOOT_MAGIC.to_le_bytes()) + .await?; + } Ok(()) }