aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhuntc <[email protected]>2023-01-04 11:07:07 +1100
committerhuntc <[email protected]>2023-01-04 12:13:44 +1100
commit8497f98de244f0f8800df78d6e83a2fb886016bf (patch)
treec1d2f5cf95da18d5af76a7a42602ab65fbc15f0a
parent6e6c3cbebcf0cfdb07622df803584f3fbc6a491a (diff)
Provides a means of obtaining the current WDT config
Obtaining the current WDT config is important so that we do not have to duplication configuration around the place. A constructor method has been introduced that returns WDT config in accordance with how the register is presently configured. The bootloader example has also been updated to show the watchdog can be obtained and used.
-rw-r--r--embassy-nrf/src/wdt.rs24
-rw-r--r--examples/boot/application/nrf/src/bin/a.rs18
2 files changed, 42 insertions, 0 deletions
diff --git a/embassy-nrf/src/wdt.rs b/embassy-nrf/src/wdt.rs
index 8760aa301..330ca98bf 100644
--- a/embassy-nrf/src/wdt.rs
+++ b/embassy-nrf/src/wdt.rs
@@ -23,6 +23,30 @@ pub struct Config {
23 pub run_during_debug_halt: bool, 23 pub run_during_debug_halt: bool,
24} 24}
25 25
26impl Config {
27 /// Create a config structure from the current configuration of the WDT
28 /// peripheral.
29 pub fn try_new(_wdt: &peripherals::WDT) -> Option<Self> {
30 let r = unsafe { &*WDT::ptr() };
31
32 #[cfg(not(feature = "_nrf9160"))]
33 let runstatus = r.runstatus.read().runstatus().bit();
34 #[cfg(feature = "_nrf9160")]
35 let runstatus = r.runstatus.read().runstatuswdt().bit();
36
37 if runstatus {
38 let config = r.config.read();
39 Some(Self {
40 timeout_ticks: r.crv.read().bits(),
41 run_during_sleep: config.sleep().bit(),
42 run_during_debug_halt: config.halt().bit(),
43 })
44 } else {
45 None
46 }
47 }
48}
49
26impl Default for Config { 50impl Default for Config {
27 fn default() -> Self { 51 fn default() -> Self {
28 Self { 52 Self {
diff --git a/examples/boot/application/nrf/src/bin/a.rs b/examples/boot/application/nrf/src/bin/a.rs
index 7a404a914..83191f388 100644
--- a/examples/boot/application/nrf/src/bin/a.rs
+++ b/examples/boot/application/nrf/src/bin/a.rs
@@ -8,6 +8,7 @@ use embassy_embedded_hal::adapter::BlockingAsync;
8use embassy_executor::Spawner; 8use embassy_executor::Spawner;
9use embassy_nrf::gpio::{Input, Level, Output, OutputDrive, Pull}; 9use embassy_nrf::gpio::{Input, Level, Output, OutputDrive, Pull};
10use embassy_nrf::nvmc::Nvmc; 10use embassy_nrf::nvmc::Nvmc;
11use embassy_nrf::wdt::{self, Watchdog};
11use panic_reset as _; 12use panic_reset as _;
12 13
13static APP_B: &[u8] = include_bytes!("../../b.bin"); 14static APP_B: &[u8] = include_bytes!("../../b.bin");
@@ -20,6 +21,23 @@ async fn main(_spawner: Spawner) {
20 //let mut led = Output::new(p.P1_10, Level::Low, OutputDrive::Standard); 21 //let mut led = Output::new(p.P1_10, Level::Low, OutputDrive::Standard);
21 //let mut button = Input::new(p.P1_02, Pull::Up); 22 //let mut button = Input::new(p.P1_02, Pull::Up);
22 23
24 // The following code block illustrates how to obtain a watchdog that is configured
25 // as per the existing watchdog. Ordinarily, we'd use the handle returned to "pet" the
26 // watchdog periodically. If we don't, and we're not going to for this example, then
27 // the watchdog will cause the device to reset as per its configured timeout in the bootloader.
28 // This helps is avoid a situation where new firmware might be bad and block our executor.
29 // If firmware is bad in this way then the bootloader will revert to any previous version.
30 let wdt_config = wdt::Config::try_new(&p.WDT).unwrap();
31 let (_wdt, [_wdt_handle]) = match Watchdog::try_new(p.WDT, wdt_config) {
32 Ok(x) => x,
33 Err(_) => {
34 // Watchdog already active with the wrong number of handles, waiting for it to timeout...
35 loop {
36 cortex_m::asm::wfe();
37 }
38 }
39 };
40
23 let nvmc = Nvmc::new(p.NVMC); 41 let nvmc = Nvmc::new(p.NVMC);
24 let mut nvmc = BlockingAsync::new(nvmc); 42 let mut nvmc = BlockingAsync::new(nvmc);
25 43