aboutsummaryrefslogtreecommitdiff
path: root/embassy-boot
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2023-01-03 23:25:52 +0000
committerGitHub <[email protected]>2023-01-03 23:25:52 +0000
commit35afb60dd490d95a972ad64db8a38652538bceba (patch)
tree299eeb3483cf6ecce67e651a66d8bf13378de8e2 /embassy-boot
parent0aa2a9ac2705ead5186d4c1d53bba55064c33db7 (diff)
parent413f33948927b4b82a7a9cdd835d226a69fdcefc (diff)
Merge #1138
1138: embassy-boot (rp): Add WatchdogFlash r=Dirbaio a=kalkyl Co-authored-by: kalkyl <[email protected]>
Diffstat (limited to 'embassy-boot')
-rw-r--r--embassy-boot/rp/Cargo.toml2
-rw-r--r--embassy-boot/rp/src/lib.rs51
2 files changed, 52 insertions, 1 deletions
diff --git a/embassy-boot/rp/Cargo.toml b/embassy-boot/rp/Cargo.toml
index 93099b233..ffc36a4e0 100644
--- a/embassy-boot/rp/Cargo.toml
+++ b/embassy-boot/rp/Cargo.toml
@@ -20,6 +20,8 @@ log = { version = "0.4", optional = true }
20embassy-sync = { path = "../../embassy-sync" } 20embassy-sync = { path = "../../embassy-sync" }
21embassy-rp = { path = "../../embassy-rp", default-features = false, features = ["nightly"] } 21embassy-rp = { path = "../../embassy-rp", default-features = false, features = ["nightly"] }
22embassy-boot = { path = "../boot", default-features = false } 22embassy-boot = { path = "../boot", default-features = false }
23embassy-time = { path = "../../embassy-time", features = ["nightly"] }
24
23cortex-m = { version = "0.7.6" } 25cortex-m = { version = "0.7.6" }
24cortex-m-rt = { version = "0.7" } 26cortex-m-rt = { version = "0.7" }
25embedded-storage = "0.3.0" 27embedded-storage = "0.3.0"
diff --git a/embassy-boot/rp/src/lib.rs b/embassy-boot/rp/src/lib.rs
index 85fc81827..6df34133e 100644
--- a/embassy-boot/rp/src/lib.rs
+++ b/embassy-boot/rp/src/lib.rs
@@ -5,7 +5,11 @@
5mod fmt; 5mod fmt;
6 6
7pub use embassy_boot::{AlignedBuffer, BootFlash, FirmwareUpdater, FlashConfig, Partition, SingleFlashConfig, State}; 7pub use embassy_boot::{AlignedBuffer, BootFlash, FirmwareUpdater, FlashConfig, Partition, SingleFlashConfig, State};
8use embassy_rp::flash::{ERASE_SIZE, WRITE_SIZE}; 8use embassy_rp::flash::{Flash, ERASE_SIZE, WRITE_SIZE};
9use embassy_rp::peripherals::{FLASH, WATCHDOG};
10use embassy_rp::watchdog::Watchdog;
11use embassy_time::Duration;
12use embedded_storage::nor_flash::{ErrorType, NorFlash, ReadNorFlash};
9 13
10/// A bootloader for RP2040 devices. 14/// A bootloader for RP2040 devices.
11pub struct BootLoader { 15pub struct BootLoader {
@@ -88,3 +92,48 @@ impl Default for BootLoader {
88 Self::new(active, dfu, state) 92 Self::new(active, dfu, state)
89 } 93 }
90} 94}
95
96/// A flash implementation that will feed a watchdog when touching flash.
97pub struct WatchdogFlash<'d, const SIZE: usize> {
98 flash: Flash<'d, FLASH, SIZE>,
99 watchdog: Watchdog,
100}
101
102impl<'d, const SIZE: usize> WatchdogFlash<'d, SIZE> {
103 /// Start a new watchdog with a given flash and watchdog peripheral and a timeout
104 pub fn start(flash: FLASH, watchdog: WATCHDOG, timeout: Duration) -> Self {
105 let flash: Flash<'_, FLASH, SIZE> = Flash::new(flash);
106 let mut watchdog = Watchdog::new(watchdog);
107 watchdog.start(timeout);
108 Self { flash, watchdog }
109 }
110}
111
112impl<'d, const SIZE: usize> ErrorType for WatchdogFlash<'d, SIZE> {
113 type Error = <Flash<'d, FLASH, SIZE> as ErrorType>::Error;
114}
115
116impl<'d, const SIZE: usize> NorFlash for WatchdogFlash<'d, SIZE> {
117 const WRITE_SIZE: usize = <Flash<'d, FLASH, SIZE> as NorFlash>::WRITE_SIZE;
118 const ERASE_SIZE: usize = <Flash<'d, FLASH, SIZE> as NorFlash>::ERASE_SIZE;
119
120 fn erase(&mut self, from: u32, to: u32) -> Result<(), Self::Error> {
121 self.watchdog.feed();
122 self.flash.erase(from, to)
123 }
124 fn write(&mut self, offset: u32, data: &[u8]) -> Result<(), Self::Error> {
125 self.watchdog.feed();
126 self.flash.write(offset, data)
127 }
128}
129
130impl<'d, const SIZE: usize> ReadNorFlash for WatchdogFlash<'d, SIZE> {
131 const READ_SIZE: usize = <Flash<'d, FLASH, SIZE> as ReadNorFlash>::READ_SIZE;
132 fn read(&mut self, offset: u32, data: &mut [u8]) -> Result<(), Self::Error> {
133 self.watchdog.feed();
134 self.flash.read(offset, data)
135 }
136 fn capacity(&self) -> usize {
137 self.flash.capacity()
138 }
139}