nrf/timer: add instance traits

This commit is contained in:
Dario Nieuwenhuis 2021-03-28 22:40:41 +02:00
parent aa0341056e
commit 31b817ed27
2 changed files with 53 additions and 0 deletions

View File

@ -103,6 +103,7 @@ pub mod qspi;
pub mod rtc;
pub mod saadc;
pub mod spim;
pub mod timer;
pub mod uarte;
embassy_extras::peripherals! {
@ -135,6 +136,15 @@ embassy_extras::peripherals! {
// SAADC
SAADC,
// TIMER
TIMER0,
TIMER1,
TIMER2,
#[cfg(any(feature = "52832", feature = "52833", feature = "52840"))]
TIMER3,
#[cfg(any(feature = "52832", feature = "52833", feature = "52840"))]
TIMER4,
// GPIOTE
GPIOTE,
GPIOTE_CH0,

43
embassy-nrf/src/timer.rs Normal file
View File

@ -0,0 +1,43 @@
use embassy::interrupt::Interrupt;
use crate::{interrupt, pac, peripherals};
mod sealed {
use super::*;
pub trait Instance {
fn regs(&self) -> &pac::timer0::RegisterBlock;
}
pub trait ExtendedInstance {}
}
pub trait Instance: sealed::Instance + 'static {
type Interrupt: Interrupt;
}
pub trait ExtendedInstance: Instance + sealed::ExtendedInstance {}
macro_rules! make_impl {
($type:ident, $irq:ident) => {
impl sealed::Instance for peripherals::$type {
fn regs(&self) -> &pac::timer0::RegisterBlock {
unsafe { &*(pac::$type::ptr() as *const pac::timer0::RegisterBlock) }
}
}
impl Instance for peripherals::$type {
type Interrupt = interrupt::$irq;
}
};
($type:ident, $irq:ident, extended) => {
make_impl!($type, $irq);
impl sealed::ExtendedInstance for peripherals::$type {}
impl ExtendedInstance for peripherals::$type {}
};
}
make_impl!(TIMER0, TIMER0);
make_impl!(TIMER1, TIMER1);
make_impl!(TIMER2, TIMER2);
#[cfg(any(feature = "52832", feature = "52833", feature = "52840"))]
make_impl!(TIMER3, TIMER3, extended);
#[cfg(any(feature = "52832", feature = "52833", feature = "52840"))]
make_impl!(TIMER4, TIMER4, extended);