aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThales Fragoso <[email protected]>2021-06-24 20:00:51 -0300
committerThales Fragoso <[email protected]>2021-06-24 20:28:06 -0300
commit013792b9442b4ef6ca4d6ddc6ee631d4491dbfbd (patch)
tree6dc183d0885fb65a07e636ee18a5ca60702b056e
parent1c33a3b94cf60af99af81ad8966c81ebd8fc3166 (diff)
Separate exti into v1 and v2
-rw-r--r--embassy-stm32/src/exti/mod.rs111
-rw-r--r--embassy-stm32/src/exti/v1.rs (renamed from embassy-stm32/src/exti.rs)103
-rw-r--r--embassy-stm32/src/exti/v2.rs1
-rw-r--r--embassy-stm32/src/lib.rs4
4 files changed, 114 insertions, 105 deletions
diff --git a/embassy-stm32/src/exti/mod.rs b/embassy-stm32/src/exti/mod.rs
new file mode 100644
index 000000000..126a6fb64
--- /dev/null
+++ b/embassy-stm32/src/exti/mod.rs
@@ -0,0 +1,111 @@
1#![macro_use]
2
3macro_rules! foreach_exti_irq {
4 ($action:ident) => {
5 crate::pac::interrupts!(
6 (EXTI0) => { $action!(EXTI0); };
7 (EXTI1) => { $action!(EXTI1); };
8 (EXTI2) => { $action!(EXTI2); };
9 (EXTI3) => { $action!(EXTI3); };
10 (EXTI4) => { $action!(EXTI4); };
11 (EXTI5) => { $action!(EXTI5); };
12 (EXTI6) => { $action!(EXTI6); };
13 (EXTI7) => { $action!(EXTI7); };
14 (EXTI8) => { $action!(EXTI8); };
15 (EXTI9) => { $action!(EXTI9); };
16 (EXTI10) => { $action!(EXTI10); };
17 (EXTI11) => { $action!(EXTI11); };
18 (EXTI12) => { $action!(EXTI12); };
19 (EXTI13) => { $action!(EXTI13); };
20 (EXTI14) => { $action!(EXTI14); };
21 (EXTI15) => { $action!(EXTI15); };
22
23 // plus the weird ones
24 (EXTI0_1) => { $action!( EXTI0_1 ); };
25 (EXTI15_10) => { $action!(EXTI15_10); };
26 (EXTI15_4) => { $action!(EXTI15_4); };
27 (EXTI1_0) => { $action!(EXTI1_0); };
28 (EXTI2_3) => { $action!(EXTI2_3); };
29 (EXTI2_TSC) => { $action!(EXTI2_TSC); };
30 (EXTI3_2) => { $action!(EXTI3_2); };
31 (EXTI4_15) => { $action!(EXTI4_15); };
32 (EXTI9_5) => { $action!(EXTI9_5); };
33 );
34 };
35}
36
37#[cfg_attr(exti_v1, path = "v1.rs")]
38#[cfg_attr(exti_wb55, path = "v2.rs")]
39mod _version;
40
41#[allow(unused)]
42pub use _version::*;
43
44use crate::peripherals;
45use embassy_extras::unsafe_impl_unborrow;
46
47pub(crate) mod sealed {
48 pub trait Channel {}
49}
50
51pub trait Channel: sealed::Channel + Sized {
52 fn number(&self) -> usize;
53 fn degrade(self) -> AnyChannel {
54 AnyChannel {
55 number: self.number() as u8,
56 }
57 }
58}
59
60pub struct AnyChannel {
61 number: u8,
62}
63unsafe_impl_unborrow!(AnyChannel);
64impl sealed::Channel for AnyChannel {}
65impl Channel for AnyChannel {
66 fn number(&self) -> usize {
67 self.number as usize
68 }
69}
70
71macro_rules! impl_exti {
72 ($type:ident, $number:expr) => {
73 impl sealed::Channel for peripherals::$type {}
74 impl Channel for peripherals::$type {
75 fn number(&self) -> usize {
76 $number as usize
77 }
78 }
79 };
80}
81
82impl_exti!(EXTI0, 0);
83impl_exti!(EXTI1, 1);
84impl_exti!(EXTI2, 2);
85impl_exti!(EXTI3, 3);
86impl_exti!(EXTI4, 4);
87impl_exti!(EXTI5, 5);
88impl_exti!(EXTI6, 6);
89impl_exti!(EXTI7, 7);
90impl_exti!(EXTI8, 8);
91impl_exti!(EXTI9, 9);
92impl_exti!(EXTI10, 10);
93impl_exti!(EXTI11, 11);
94impl_exti!(EXTI12, 12);
95impl_exti!(EXTI13, 13);
96impl_exti!(EXTI14, 14);
97impl_exti!(EXTI15, 15);
98
99macro_rules! enable_irq {
100 ($e:ident) => {
101 crate::interrupt::$e::steal().enable();
102 };
103}
104
105/// safety: must be called only once
106pub(crate) unsafe fn init() {
107 use embassy::interrupt::Interrupt;
108 use embassy::interrupt::InterruptExt;
109
110 foreach_exti_irq!(enable_irq);
111}
diff --git a/embassy-stm32/src/exti.rs b/embassy-stm32/src/exti/v1.rs
index 90d4afd56..caf457605 100644
--- a/embassy-stm32/src/exti.rs
+++ b/embassy-stm32/src/exti/v1.rs
@@ -1,4 +1,3 @@
1#![macro_use]
2use core::convert::Infallible; 1use core::convert::Infallible;
3use core::future::Future; 2use core::future::Future;
4use core::marker::PhantomData; 3use core::marker::PhantomData;
@@ -6,14 +5,12 @@ use core::pin::Pin;
6use core::task::{Context, Poll}; 5use core::task::{Context, Poll};
7use embassy::traits::gpio::{WaitForAnyEdge, WaitForFallingEdge, WaitForRisingEdge}; 6use embassy::traits::gpio::{WaitForAnyEdge, WaitForFallingEdge, WaitForRisingEdge};
8use embassy::util::{AtomicWaker, Unborrow}; 7use embassy::util::{AtomicWaker, Unborrow};
9use embassy_extras::unsafe_impl_unborrow;
10use embedded_hal::digital::v2::InputPin; 8use embedded_hal::digital::v2::InputPin;
11use pac::exti::{regs, vals}; 9use pac::exti::{regs, vals};
12 10
13use crate::gpio::{AnyPin, Input, Pin as GpioPin}; 11use crate::gpio::{AnyPin, Input, Pin as GpioPin};
14use crate::pac; 12use crate::pac;
15use crate::pac::{EXTI, SYSCFG}; 13use crate::pac::{EXTI, SYSCFG};
16use crate::peripherals;
17 14
18const EXTI_COUNT: usize = 16; 15const EXTI_COUNT: usize = 16;
19const NEW_AW: AtomicWaker = AtomicWaker::new(); 16const NEW_AW: AtomicWaker = AtomicWaker::new();
@@ -160,106 +157,6 @@ impl<'a> Future for ExtiInputFuture<'a> {
160 } 157 }
161} 158}
162 159
163pub(crate) mod sealed {
164 pub trait Channel {}
165}
166
167pub trait Channel: sealed::Channel + Sized {
168 fn number(&self) -> usize;
169 fn degrade(self) -> AnyChannel {
170 AnyChannel {
171 number: self.number() as u8,
172 }
173 }
174}
175
176pub struct AnyChannel {
177 number: u8,
178}
179unsafe_impl_unborrow!(AnyChannel);
180impl sealed::Channel for AnyChannel {}
181impl Channel for AnyChannel {
182 fn number(&self) -> usize {
183 self.number as usize
184 }
185}
186
187macro_rules! impl_exti {
188 ($type:ident, $number:expr) => {
189 impl sealed::Channel for peripherals::$type {}
190 impl Channel for peripherals::$type {
191 fn number(&self) -> usize {
192 $number as usize
193 }
194 }
195 };
196}
197
198impl_exti!(EXTI0, 0);
199impl_exti!(EXTI1, 1);
200impl_exti!(EXTI2, 2);
201impl_exti!(EXTI3, 3);
202impl_exti!(EXTI4, 4);
203impl_exti!(EXTI5, 5);
204impl_exti!(EXTI6, 6);
205impl_exti!(EXTI7, 7);
206impl_exti!(EXTI8, 8);
207impl_exti!(EXTI9, 9);
208impl_exti!(EXTI10, 10);
209impl_exti!(EXTI11, 11);
210impl_exti!(EXTI12, 12);
211impl_exti!(EXTI13, 13);
212impl_exti!(EXTI14, 14);
213impl_exti!(EXTI15, 15);
214
215macro_rules! foreach_exti_irq {
216 ($action:ident) => {
217 crate::pac::interrupts!(
218 (EXTI0) => { $action!(EXTI0); };
219 (EXTI1) => { $action!(EXTI1); };
220 (EXTI2) => { $action!(EXTI2); };
221 (EXTI3) => { $action!(EXTI3); };
222 (EXTI4) => { $action!(EXTI4); };
223 (EXTI5) => { $action!(EXTI5); };
224 (EXTI6) => { $action!(EXTI6); };
225 (EXTI7) => { $action!(EXTI7); };
226 (EXTI8) => { $action!(EXTI8); };
227 (EXTI9) => { $action!(EXTI9); };
228 (EXTI10) => { $action!(EXTI10); };
229 (EXTI11) => { $action!(EXTI11); };
230 (EXTI12) => { $action!(EXTI12); };
231 (EXTI13) => { $action!(EXTI13); };
232 (EXTI14) => { $action!(EXTI14); };
233 (EXTI15) => { $action!(EXTI15); };
234
235 // plus the weird ones
236 (EXTI0_1) => { $action!( EXTI0_1 ); };
237 (EXTI15_10) => { $action!(EXTI15_10); };
238 (EXTI15_4) => { $action!(EXTI15_4); };
239 (EXTI1_0) => { $action!(EXTI1_0); };
240 (EXTI2_3) => { $action!(EXTI2_3); };
241 (EXTI2_TSC) => { $action!(EXTI2_TSC); };
242 (EXTI3_2) => { $action!(EXTI3_2); };
243 (EXTI4_15) => { $action!(EXTI4_15); };
244 (EXTI9_5) => { $action!(EXTI9_5); };
245 );
246 };
247}
248
249macro_rules! enable_irq {
250 ($e:ident) => {
251 crate::interrupt::$e::steal().enable();
252 };
253}
254
255/// safety: must be called only once
256pub(crate) unsafe fn init() {
257 use embassy::interrupt::Interrupt;
258 use embassy::interrupt::InterruptExt;
259
260 foreach_exti_irq!(enable_irq);
261}
262
263use crate::interrupt; 160use crate::interrupt;
264 161
265macro_rules! impl_irq { 162macro_rules! impl_irq {
diff --git a/embassy-stm32/src/exti/v2.rs b/embassy-stm32/src/exti/v2.rs
new file mode 100644
index 000000000..8b1378917
--- /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 383843d04..9ba7bbe4c 100644
--- a/embassy-stm32/src/lib.rs
+++ b/embassy-stm32/src/lib.rs
@@ -30,7 +30,7 @@ pub mod dac;
30pub mod dma; 30pub mod dma;
31#[cfg(all(eth, feature = "net"))] 31#[cfg(all(eth, feature = "net"))]
32pub mod eth; 32pub mod eth;
33#[cfg(exti_v1)] 33#[cfg(exti)]
34pub mod exti; 34pub mod exti;
35#[cfg(i2c)] 35#[cfg(i2c)]
36pub mod i2c; 36pub mod i2c;
@@ -86,7 +86,7 @@ pub fn init(config: Config) -> Peripherals {
86 unsafe { 86 unsafe {
87 #[cfg(dma)] 87 #[cfg(dma)]
88 dma::init(); 88 dma::init();
89 #[cfg(exti_v1)] 89 #[cfg(exti)]
90 exti::init(); 90 exti::init();
91 rcc::init(config.rcc); 91 rcc::init(config.rcc);
92 } 92 }