From 4b8d8ba87ee26173b0a7743c606c76df2d171790 Mon Sep 17 00:00:00 2001 From: Dario Nieuwenhuis Date: Tue, 29 Dec 2020 01:05:28 +0100 Subject: Update RTC for owned irqs --- embassy-nrf/src/rtc.rs | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'embassy-nrf/src/rtc.rs') diff --git a/embassy-nrf/src/rtc.rs b/embassy-nrf/src/rtc.rs index 66e2f552d..d65b8d472 100644 --- a/embassy-nrf/src/rtc.rs +++ b/embassy-nrf/src/rtc.rs @@ -2,10 +2,10 @@ use core::cell::Cell; use core::ops::Deref; use core::sync::atomic::{AtomicU32, Ordering}; -use embassy::time::Clock; +use embassy::time::{Clock, Instant}; use crate::interrupt; -use crate::interrupt::{CriticalSection, Mutex}; +use crate::interrupt::{CriticalSection, Mutex, OwnedInterrupt}; use crate::pac::{rtc0, Interrupt, RTC0, RTC1}; #[cfg(any(feature = "52832", feature = "52833", feature = "52840"))] @@ -56,8 +56,9 @@ impl AlarmState { const ALARM_COUNT: usize = 3; -pub struct RTC { +pub struct RTC { rtc: T, + irq: T::Interrupt, /// Number of 2^23 periods elapsed since boot. /// @@ -75,13 +76,14 @@ pub struct RTC { alarms: Mutex<[AlarmState; ALARM_COUNT]>, } -unsafe impl Send for RTC {} -unsafe impl Sync for RTC {} +unsafe impl Send for RTC {} +unsafe impl Sync for RTC {} impl RTC { - pub fn new(rtc: T) -> Self { + pub fn new(rtc: T, irq: T::Interrupt) -> Self { Self { rtc, + irq, period: AtomicU32::new(0), alarms: Mutex::new([AlarmState::new(), AlarmState::new(), AlarmState::new()]), } @@ -103,7 +105,10 @@ impl RTC { while self.rtc.counter.read().bits() != 0 {} T::set_rtc_instance(self); - interrupt::enable(T::INTERRUPT); + self.irq + .set_handler(|| T::get_rtc_instance().on_interrupt()); + self.irq.unpend(); + self.irq.enable(); } fn on_interrupt(&self) { @@ -234,18 +239,18 @@ impl embassy::time::Alarm for Alarm { /// Implemented by all RTC instances. pub trait Instance: Deref + Sized + 'static { /// The interrupt associated with this RTC instance. - const INTERRUPT: Interrupt; + type Interrupt: OwnedInterrupt; fn set_rtc_instance(rtc: &'static RTC); fn get_rtc_instance() -> &'static RTC; } macro_rules! impl_instance { - ($name:ident, $static_name:ident) => { + ($name:ident, $irq_name:path, $static_name:ident) => { static mut $static_name: Option<&'static RTC<$name>> = None; impl Instance for $name { - const INTERRUPT: Interrupt = Interrupt::$name; + type Interrupt = $irq_name; fn set_rtc_instance(rtc: &'static RTC) { unsafe { $static_name = Some(rtc) } } @@ -253,16 +258,11 @@ macro_rules! impl_instance { unsafe { $static_name.unwrap() } } } - - #[interrupt] - fn $name() { - $name::get_rtc_instance().on_interrupt(); - } }; } -impl_instance!(RTC0, RTC0_INSTANCE); -impl_instance!(RTC1, RTC1_INSTANCE); +impl_instance!(RTC0, interrupt::RTC0Interrupt, RTC0_INSTANCE); +impl_instance!(RTC1, interrupt::RTC1Interrupt, RTC1_INSTANCE); #[cfg(any(feature = "52832", feature = "52833", feature = "52840"))] -impl_instance!(RTC2, RTC2_INSTANCE); +impl_instance!(RTC2, interrupt::RTC2Interrupt, RTC2_INSTANCE); -- cgit