diff options
| author | James Munns <[email protected]> | 2025-11-14 18:43:27 +0100 |
|---|---|---|
| committer | James Munns <[email protected]> | 2025-11-14 18:43:27 +0100 |
| commit | 8cdccae3c6c4a805cf5003b1a859734c105d76e8 (patch) | |
| tree | 7c605a58aa7e124bbed658dfc5f6822a25a83e98 /src/rtc.rs | |
| parent | e799d6c8956ed3ea5ced65d58c3065a22927ad10 (diff) | |
Continue working on examples
Diffstat (limited to 'src/rtc.rs')
| -rw-r--r-- | src/rtc.rs | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/src/rtc.rs b/src/rtc.rs index facb9cf8c..f526e82ac 100644 --- a/src/rtc.rs +++ b/src/rtc.rs | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | //! RTC DateTime driver. | 1 | //! RTC DateTime driver. |
| 2 | use core::sync::atomic::{AtomicBool, Ordering}; | 2 | use core::sync::atomic::{AtomicBool, Ordering}; |
| 3 | 3 | ||
| 4 | use embassy_hal_internal::{Peri, PeripheralType}; | ||
| 5 | |||
| 6 | use crate::clocks::with_clocks; | ||
| 4 | use crate::pac; | 7 | use crate::pac; |
| 5 | use crate::pac::rtc0::cr::Um; | 8 | use crate::pac::rtc0::cr::Um; |
| 6 | 9 | ||
| @@ -9,7 +12,7 @@ type Regs = pac::rtc0::RegisterBlock; | |||
| 9 | static ALARM_TRIGGERED: AtomicBool = AtomicBool::new(false); | 12 | static ALARM_TRIGGERED: AtomicBool = AtomicBool::new(false); |
| 10 | 13 | ||
| 11 | // Token-based instance pattern like embassy-imxrt | 14 | // Token-based instance pattern like embassy-imxrt |
| 12 | pub trait Instance { | 15 | pub trait Instance: PeripheralType { |
| 13 | fn ptr() -> *const Regs; | 16 | fn ptr() -> *const Regs; |
| 14 | } | 17 | } |
| 15 | 18 | ||
| @@ -22,14 +25,6 @@ impl Instance for crate::peripherals::RTC0 { | |||
| 22 | } | 25 | } |
| 23 | } | 26 | } |
| 24 | 27 | ||
| 25 | // Also implement Instance for the Peri wrapper type | ||
| 26 | impl Instance for embassy_hal_internal::Peri<'_, crate::peripherals::RTC0> { | ||
| 27 | #[inline(always)] | ||
| 28 | fn ptr() -> *const Regs { | ||
| 29 | pac::Rtc0::ptr() | ||
| 30 | } | ||
| 31 | } | ||
| 32 | |||
| 33 | const DAYS_IN_A_YEAR: u32 = 365; | 28 | const DAYS_IN_A_YEAR: u32 = 365; |
| 34 | const SECONDS_IN_A_DAY: u32 = 86400; | 29 | const SECONDS_IN_A_DAY: u32 = 86400; |
| 35 | const SECONDS_IN_A_HOUR: u32 = 3600; | 30 | const SECONDS_IN_A_HOUR: u32 = 3600; |
| @@ -157,15 +152,26 @@ pub fn get_default_config() -> RtcConfig { | |||
| 157 | } | 152 | } |
| 158 | } | 153 | } |
| 159 | /// Minimal RTC handle for a specific instance I (store the zero-sized token like embassy) | 154 | /// Minimal RTC handle for a specific instance I (store the zero-sized token like embassy) |
| 160 | pub struct Rtc<I: Instance> { | 155 | pub struct Rtc<'a, I: Instance> { |
| 161 | _inst: core::marker::PhantomData<I>, | 156 | _inst: core::marker::PhantomData<&'a mut I>, |
| 162 | } | 157 | } |
| 163 | 158 | ||
| 164 | impl<I: Instance> Rtc<I> { | 159 | impl<'a, I: Instance> Rtc<'a, I> { |
| 165 | /// initialize RTC | 160 | /// initialize RTC |
| 166 | pub fn new(_inst: impl Instance, config: RtcConfig) -> Self { | 161 | pub fn new(_inst: Peri<'a, I>, config: RtcConfig) -> Self { |
| 167 | let rtc = unsafe { &*I::ptr() }; | 162 | let rtc = unsafe { &*I::ptr() }; |
| 168 | 163 | ||
| 164 | // The RTC is NOT gated by the MRCC, but we DO need to make sure the 16k clock | ||
| 165 | // on the vsys domain is active | ||
| 166 | let clocks = with_clocks(|c| { | ||
| 167 | c.clk_16k_vsys.clone() | ||
| 168 | }); | ||
| 169 | match clocks { | ||
| 170 | None => panic!("Clocks have not been initialized"), | ||
| 171 | Some(None) => panic!("Clocks initialized, but clk_16k_vsys not active"), | ||
| 172 | Some(Some(_)) => {} | ||
| 173 | } | ||
| 174 | |||
| 169 | /* RTC reset */ | 175 | /* RTC reset */ |
| 170 | rtc.cr().modify(|_, w| w.swr().set_bit()); | 176 | rtc.cr().modify(|_, w| w.swr().set_bit()); |
| 171 | rtc.cr().modify(|_, w| w.swr().clear_bit()); | 177 | rtc.cr().modify(|_, w| w.swr().clear_bit()); |
