diff options
| author | Ulf Lilleengen <[email protected]> | 2023-08-03 20:56:04 +0200 |
|---|---|---|
| committer | Ulf Lilleengen <[email protected]> | 2023-08-06 19:46:53 +0200 |
| commit | a34331ae5fbf76a61bb2f65dbb13af4d34fcb176 (patch) | |
| tree | eddfa2b200b206923a91b9aae1474156c04e40fa /embassy-boot/boot/src/lib.rs | |
| parent | a40daa923ba031b543ce402f8bd83c2ec41329d8 (diff) | |
Refactor firmware updater
* Allow manipulating state without accessing DFU partition.
* Provide aligned buffer when creating updater to reduce potential wrong parameters passed.
Diffstat (limited to 'embassy-boot/boot/src/lib.rs')
| -rw-r--r-- | embassy-boot/boot/src/lib.rs | 79 |
1 files changed, 47 insertions, 32 deletions
diff --git a/embassy-boot/boot/src/lib.rs b/embassy-boot/boot/src/lib.rs index 016362b86..47f7c1797 100644 --- a/embassy-boot/boot/src/lib.rs +++ b/embassy-boot/boot/src/lib.rs | |||
| @@ -16,9 +16,11 @@ mod test_flash; | |||
| 16 | // TODO: Use the value provided by NorFlash when available | 16 | // TODO: Use the value provided by NorFlash when available |
| 17 | pub(crate) const STATE_ERASE_VALUE: u8 = 0xFF; | 17 | pub(crate) const STATE_ERASE_VALUE: u8 = 0xFF; |
| 18 | pub use boot_loader::{BootError, BootLoader, BootLoaderConfig}; | 18 | pub use boot_loader::{BootError, BootLoader, BootLoaderConfig}; |
| 19 | pub use firmware_updater::{ | ||
| 20 | BlockingFirmwareState, BlockingFirmwareUpdater, FirmwareUpdaterConfig, FirmwareUpdaterError, | ||
| 21 | }; | ||
| 19 | #[cfg(feature = "nightly")] | 22 | #[cfg(feature = "nightly")] |
| 20 | pub use firmware_updater::FirmwareUpdater; | 23 | pub use firmware_updater::{FirmwareState, FirmwareUpdater}; |
| 21 | pub use firmware_updater::{BlockingFirmwareUpdater, FirmwareUpdaterConfig, FirmwareUpdaterError}; | ||
| 22 | 24 | ||
| 23 | pub(crate) const BOOT_MAGIC: u8 = 0xD0; | 25 | pub(crate) const BOOT_MAGIC: u8 = 0xD0; |
| 24 | pub(crate) const SWAP_MAGIC: u8 = 0xF0; | 26 | pub(crate) const SWAP_MAGIC: u8 = 0xF0; |
| @@ -118,15 +120,18 @@ mod tests { | |||
| 118 | block_on(flash.active().erase(0, ORIGINAL.len() as u32)).unwrap(); | 120 | block_on(flash.active().erase(0, ORIGINAL.len() as u32)).unwrap(); |
| 119 | block_on(flash.active().write(0, &ORIGINAL)).unwrap(); | 121 | block_on(flash.active().write(0, &ORIGINAL)).unwrap(); |
| 120 | 122 | ||
| 121 | let mut updater = FirmwareUpdater::new(FirmwareUpdaterConfig { | 123 | let mut updater = FirmwareUpdater::new( |
| 122 | dfu: flash.dfu(), | 124 | FirmwareUpdaterConfig { |
| 123 | state: flash.state(), | 125 | dfu: flash.dfu(), |
| 124 | }); | 126 | state: flash.state(), |
| 125 | block_on(updater.write_firmware(&mut aligned, 0, &UPDATE)).unwrap(); | 127 | }, |
| 126 | block_on(updater.mark_updated(&mut aligned)).unwrap(); | 128 | &mut aligned, |
| 129 | ); | ||
| 130 | block_on(updater.write_firmware(0, &UPDATE)).unwrap(); | ||
| 131 | block_on(updater.mark_updated()).unwrap(); | ||
| 127 | 132 | ||
| 128 | // Writing after marking updated is not allowed until marked as booted. | 133 | // Writing after marking updated is not allowed until marked as booted. |
| 129 | let res: Result<(), FirmwareUpdaterError> = block_on(updater.write_firmware(&mut aligned, 0, &UPDATE)); | 134 | let res: Result<(), FirmwareUpdaterError> = block_on(updater.write_firmware(0, &UPDATE)); |
| 130 | assert!(matches!(res, Err::<(), _>(FirmwareUpdaterError::BadState))); | 135 | assert!(matches!(res, Err::<(), _>(FirmwareUpdaterError::BadState))); |
| 131 | 136 | ||
| 132 | let flash = flash.into_blocking(); | 137 | let flash = flash.into_blocking(); |
| @@ -158,11 +163,14 @@ mod tests { | |||
| 158 | 163 | ||
| 159 | // Mark as booted | 164 | // Mark as booted |
| 160 | let flash = flash.into_async(); | 165 | let flash = flash.into_async(); |
| 161 | let mut updater = FirmwareUpdater::new(FirmwareUpdaterConfig { | 166 | let mut updater = FirmwareUpdater::new( |
| 162 | dfu: flash.dfu(), | 167 | FirmwareUpdaterConfig { |
| 163 | state: flash.state(), | 168 | dfu: flash.dfu(), |
| 164 | }); | 169 | state: flash.state(), |
| 165 | block_on(updater.mark_booted(&mut aligned)).unwrap(); | 170 | }, |
| 171 | &mut aligned, | ||
| 172 | ); | ||
| 173 | block_on(updater.mark_booted()).unwrap(); | ||
| 166 | 174 | ||
| 167 | let flash = flash.into_blocking(); | 175 | let flash = flash.into_blocking(); |
| 168 | let mut bootloader = BootLoader::new(BootLoaderConfig { | 176 | let mut bootloader = BootLoader::new(BootLoaderConfig { |
| @@ -190,12 +198,15 @@ mod tests { | |||
| 190 | block_on(flash.active().erase(0, ORIGINAL.len() as u32)).unwrap(); | 198 | block_on(flash.active().erase(0, ORIGINAL.len() as u32)).unwrap(); |
| 191 | block_on(flash.active().write(0, &ORIGINAL)).unwrap(); | 199 | block_on(flash.active().write(0, &ORIGINAL)).unwrap(); |
| 192 | 200 | ||
| 193 | let mut updater = FirmwareUpdater::new(FirmwareUpdaterConfig { | 201 | let mut updater = FirmwareUpdater::new( |
| 194 | dfu: flash.dfu(), | 202 | FirmwareUpdaterConfig { |
| 195 | state: flash.state(), | 203 | dfu: flash.dfu(), |
| 196 | }); | 204 | state: flash.state(), |
| 197 | block_on(updater.write_firmware(&mut aligned, 0, &UPDATE)).unwrap(); | 205 | }, |
| 198 | block_on(updater.mark_updated(&mut aligned)).unwrap(); | 206 | &mut aligned, |
| 207 | ); | ||
| 208 | block_on(updater.write_firmware(0, &UPDATE)).unwrap(); | ||
| 209 | block_on(updater.mark_updated()).unwrap(); | ||
| 199 | 210 | ||
| 200 | let flash = flash.into_blocking(); | 211 | let flash = flash.into_blocking(); |
| 201 | let mut bootloader = BootLoader::new(BootLoaderConfig { | 212 | let mut bootloader = BootLoader::new(BootLoaderConfig { |
| @@ -232,12 +243,15 @@ mod tests { | |||
| 232 | block_on(flash.active().erase(0, ORIGINAL.len() as u32)).unwrap(); | 243 | block_on(flash.active().erase(0, ORIGINAL.len() as u32)).unwrap(); |
| 233 | block_on(flash.active().write(0, &ORIGINAL)).unwrap(); | 244 | block_on(flash.active().write(0, &ORIGINAL)).unwrap(); |
| 234 | 245 | ||
| 235 | let mut updater = FirmwareUpdater::new(FirmwareUpdaterConfig { | 246 | let mut updater = FirmwareUpdater::new( |
| 236 | dfu: flash.dfu(), | 247 | FirmwareUpdaterConfig { |
| 237 | state: flash.state(), | 248 | dfu: flash.dfu(), |
| 238 | }); | 249 | state: flash.state(), |
| 239 | block_on(updater.write_firmware(&mut aligned, 0, &UPDATE)).unwrap(); | 250 | }, |
| 240 | block_on(updater.mark_updated(&mut aligned)).unwrap(); | 251 | &mut aligned, |
| 252 | ); | ||
| 253 | block_on(updater.write_firmware(0, &UPDATE)).unwrap(); | ||
| 254 | block_on(updater.mark_updated()).unwrap(); | ||
| 241 | 255 | ||
| 242 | let flash = flash.into_blocking(); | 256 | let flash = flash.into_blocking(); |
| 243 | let mut bootloader = BootLoader::new(BootLoaderConfig { | 257 | let mut bootloader = BootLoader::new(BootLoaderConfig { |
| @@ -293,18 +307,19 @@ mod tests { | |||
| 293 | 307 | ||
| 294 | // On with the test | 308 | // On with the test |
| 295 | let flash = flash.into_async(); | 309 | let flash = flash.into_async(); |
| 296 | let mut updater = FirmwareUpdater::new(FirmwareUpdaterConfig { | ||
| 297 | dfu: flash.dfu(), | ||
| 298 | state: flash.state(), | ||
| 299 | }); | ||
| 300 | |||
| 301 | let mut aligned = [0; 4]; | 310 | let mut aligned = [0; 4]; |
| 311 | let mut updater = FirmwareUpdater::new( | ||
| 312 | FirmwareUpdaterConfig { | ||
| 313 | dfu: flash.dfu(), | ||
| 314 | state: flash.state(), | ||
| 315 | }, | ||
| 316 | &mut aligned, | ||
| 317 | ); | ||
| 302 | 318 | ||
| 303 | assert!(block_on(updater.verify_and_mark_updated( | 319 | assert!(block_on(updater.verify_and_mark_updated( |
| 304 | &public_key.to_bytes(), | 320 | &public_key.to_bytes(), |
| 305 | &signature.to_bytes(), | 321 | &signature.to_bytes(), |
| 306 | firmware_len as u32, | 322 | firmware_len as u32, |
| 307 | &mut aligned, | ||
| 308 | )) | 323 | )) |
| 309 | .is_ok()); | 324 | .is_ok()); |
| 310 | } | 325 | } |
