From 013792b9442b4ef6ca4d6ddc6ee631d4491dbfbd Mon Sep 17 00:00:00 2001 From: Thales Fragoso Date: Thu, 24 Jun 2021 20:00:51 -0300 Subject: [PATCH] Separate exti into v1 and v2 --- embassy-stm32/src/exti/mod.rs | 111 ++++++++++++++++++++++ embassy-stm32/src/{exti.rs => exti/v1.rs} | 103 -------------------- embassy-stm32/src/exti/v2.rs | 1 + embassy-stm32/src/lib.rs | 4 +- 4 files changed, 114 insertions(+), 105 deletions(-) create mode 100644 embassy-stm32/src/exti/mod.rs rename embassy-stm32/src/{exti.rs => exti/v1.rs} (60%) create mode 100644 embassy-stm32/src/exti/v2.rs diff --git a/embassy-stm32/src/exti/mod.rs b/embassy-stm32/src/exti/mod.rs new file mode 100644 index 00000000..126a6fb6 --- /dev/null +++ b/embassy-stm32/src/exti/mod.rs @@ -0,0 +1,111 @@ +#![macro_use] + +macro_rules! foreach_exti_irq { + ($action:ident) => { + crate::pac::interrupts!( + (EXTI0) => { $action!(EXTI0); }; + (EXTI1) => { $action!(EXTI1); }; + (EXTI2) => { $action!(EXTI2); }; + (EXTI3) => { $action!(EXTI3); }; + (EXTI4) => { $action!(EXTI4); }; + (EXTI5) => { $action!(EXTI5); }; + (EXTI6) => { $action!(EXTI6); }; + (EXTI7) => { $action!(EXTI7); }; + (EXTI8) => { $action!(EXTI8); }; + (EXTI9) => { $action!(EXTI9); }; + (EXTI10) => { $action!(EXTI10); }; + (EXTI11) => { $action!(EXTI11); }; + (EXTI12) => { $action!(EXTI12); }; + (EXTI13) => { $action!(EXTI13); }; + (EXTI14) => { $action!(EXTI14); }; + (EXTI15) => { $action!(EXTI15); }; + + // plus the weird ones + (EXTI0_1) => { $action!( EXTI0_1 ); }; + (EXTI15_10) => { $action!(EXTI15_10); }; + (EXTI15_4) => { $action!(EXTI15_4); }; + (EXTI1_0) => { $action!(EXTI1_0); }; + (EXTI2_3) => { $action!(EXTI2_3); }; + (EXTI2_TSC) => { $action!(EXTI2_TSC); }; + (EXTI3_2) => { $action!(EXTI3_2); }; + (EXTI4_15) => { $action!(EXTI4_15); }; + (EXTI9_5) => { $action!(EXTI9_5); }; + ); + }; +} + +#[cfg_attr(exti_v1, path = "v1.rs")] +#[cfg_attr(exti_wb55, path = "v2.rs")] +mod _version; + +#[allow(unused)] +pub use _version::*; + +use crate::peripherals; +use embassy_extras::unsafe_impl_unborrow; + +pub(crate) mod sealed { + pub trait Channel {} +} + +pub trait Channel: sealed::Channel + Sized { + fn number(&self) -> usize; + fn degrade(self) -> AnyChannel { + AnyChannel { + number: self.number() as u8, + } + } +} + +pub struct AnyChannel { + number: u8, +} +unsafe_impl_unborrow!(AnyChannel); +impl sealed::Channel for AnyChannel {} +impl Channel for AnyChannel { + fn number(&self) -> usize { + self.number as usize + } +} + +macro_rules! impl_exti { + ($type:ident, $number:expr) => { + impl sealed::Channel for peripherals::$type {} + impl Channel for peripherals::$type { + fn number(&self) -> usize { + $number as usize + } + } + }; +} + +impl_exti!(EXTI0, 0); +impl_exti!(EXTI1, 1); +impl_exti!(EXTI2, 2); +impl_exti!(EXTI3, 3); +impl_exti!(EXTI4, 4); +impl_exti!(EXTI5, 5); +impl_exti!(EXTI6, 6); +impl_exti!(EXTI7, 7); +impl_exti!(EXTI8, 8); +impl_exti!(EXTI9, 9); +impl_exti!(EXTI10, 10); +impl_exti!(EXTI11, 11); +impl_exti!(EXTI12, 12); +impl_exti!(EXTI13, 13); +impl_exti!(EXTI14, 14); +impl_exti!(EXTI15, 15); + +macro_rules! enable_irq { + ($e:ident) => { + crate::interrupt::$e::steal().enable(); + }; +} + +/// safety: must be called only once +pub(crate) unsafe fn init() { + use embassy::interrupt::Interrupt; + use embassy::interrupt::InterruptExt; + + foreach_exti_irq!(enable_irq); +} diff --git a/embassy-stm32/src/exti.rs b/embassy-stm32/src/exti/v1.rs similarity index 60% rename from embassy-stm32/src/exti.rs rename to embassy-stm32/src/exti/v1.rs index 90d4afd5..caf45760 100644 --- a/embassy-stm32/src/exti.rs +++ b/embassy-stm32/src/exti/v1.rs @@ -1,4 +1,3 @@ -#![macro_use] use core::convert::Infallible; use core::future::Future; use core::marker::PhantomData; @@ -6,14 +5,12 @@ use core::pin::Pin; use core::task::{Context, Poll}; use embassy::traits::gpio::{WaitForAnyEdge, WaitForFallingEdge, WaitForRisingEdge}; use embassy::util::{AtomicWaker, Unborrow}; -use embassy_extras::unsafe_impl_unborrow; use embedded_hal::digital::v2::InputPin; use pac::exti::{regs, vals}; use crate::gpio::{AnyPin, Input, Pin as GpioPin}; use crate::pac; use crate::pac::{EXTI, SYSCFG}; -use crate::peripherals; const EXTI_COUNT: usize = 16; const NEW_AW: AtomicWaker = AtomicWaker::new(); @@ -160,106 +157,6 @@ impl<'a> Future for ExtiInputFuture<'a> { } } -pub(crate) mod sealed { - pub trait Channel {} -} - -pub trait Channel: sealed::Channel + Sized { - fn number(&self) -> usize; - fn degrade(self) -> AnyChannel { - AnyChannel { - number: self.number() as u8, - } - } -} - -pub struct AnyChannel { - number: u8, -} -unsafe_impl_unborrow!(AnyChannel); -impl sealed::Channel for AnyChannel {} -impl Channel for AnyChannel { - fn number(&self) -> usize { - self.number as usize - } -} - -macro_rules! impl_exti { - ($type:ident, $number:expr) => { - impl sealed::Channel for peripherals::$type {} - impl Channel for peripherals::$type { - fn number(&self) -> usize { - $number as usize - } - } - }; -} - -impl_exti!(EXTI0, 0); -impl_exti!(EXTI1, 1); -impl_exti!(EXTI2, 2); -impl_exti!(EXTI3, 3); -impl_exti!(EXTI4, 4); -impl_exti!(EXTI5, 5); -impl_exti!(EXTI6, 6); -impl_exti!(EXTI7, 7); -impl_exti!(EXTI8, 8); -impl_exti!(EXTI9, 9); -impl_exti!(EXTI10, 10); -impl_exti!(EXTI11, 11); -impl_exti!(EXTI12, 12); -impl_exti!(EXTI13, 13); -impl_exti!(EXTI14, 14); -impl_exti!(EXTI15, 15); - -macro_rules! foreach_exti_irq { - ($action:ident) => { - crate::pac::interrupts!( - (EXTI0) => { $action!(EXTI0); }; - (EXTI1) => { $action!(EXTI1); }; - (EXTI2) => { $action!(EXTI2); }; - (EXTI3) => { $action!(EXTI3); }; - (EXTI4) => { $action!(EXTI4); }; - (EXTI5) => { $action!(EXTI5); }; - (EXTI6) => { $action!(EXTI6); }; - (EXTI7) => { $action!(EXTI7); }; - (EXTI8) => { $action!(EXTI8); }; - (EXTI9) => { $action!(EXTI9); }; - (EXTI10) => { $action!(EXTI10); }; - (EXTI11) => { $action!(EXTI11); }; - (EXTI12) => { $action!(EXTI12); }; - (EXTI13) => { $action!(EXTI13); }; - (EXTI14) => { $action!(EXTI14); }; - (EXTI15) => { $action!(EXTI15); }; - - // plus the weird ones - (EXTI0_1) => { $action!( EXTI0_1 ); }; - (EXTI15_10) => { $action!(EXTI15_10); }; - (EXTI15_4) => { $action!(EXTI15_4); }; - (EXTI1_0) => { $action!(EXTI1_0); }; - (EXTI2_3) => { $action!(EXTI2_3); }; - (EXTI2_TSC) => { $action!(EXTI2_TSC); }; - (EXTI3_2) => { $action!(EXTI3_2); }; - (EXTI4_15) => { $action!(EXTI4_15); }; - (EXTI9_5) => { $action!(EXTI9_5); }; - ); - }; -} - -macro_rules! enable_irq { - ($e:ident) => { - crate::interrupt::$e::steal().enable(); - }; -} - -/// safety: must be called only once -pub(crate) unsafe fn init() { - use embassy::interrupt::Interrupt; - use embassy::interrupt::InterruptExt; - - foreach_exti_irq!(enable_irq); -} - use crate::interrupt; macro_rules! impl_irq { diff --git a/embassy-stm32/src/exti/v2.rs b/embassy-stm32/src/exti/v2.rs new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/embassy-stm32/src/exti/v2.rs @@ -0,0 +1 @@ + diff --git a/embassy-stm32/src/lib.rs b/embassy-stm32/src/lib.rs index 383843d0..9ba7bbe4 100644 --- a/embassy-stm32/src/lib.rs +++ b/embassy-stm32/src/lib.rs @@ -30,7 +30,7 @@ pub mod dac; pub mod dma; #[cfg(all(eth, feature = "net"))] pub mod eth; -#[cfg(exti_v1)] +#[cfg(exti)] pub mod exti; #[cfg(i2c)] pub mod i2c; @@ -86,7 +86,7 @@ pub fn init(config: Config) -> Peripherals { unsafe { #[cfg(dma)] dma::init(); - #[cfg(exti_v1)] + #[cfg(exti)] exti::init(); rcc::init(config.rcc); }