aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-nrf/src/lib.rs63
-rw-r--r--embassy-rp/src/lib.rs15
-rw-r--r--embassy-stm32/src/lib.rs11
3 files changed, 58 insertions, 31 deletions
diff --git a/embassy-nrf/src/lib.rs b/embassy-nrf/src/lib.rs
index 03d3ca5f7..430b6fae7 100644
--- a/embassy-nrf/src/lib.rs
+++ b/embassy-nrf/src/lib.rs
@@ -177,34 +177,43 @@ mod chip;
177// developer note: this macro can't be in `embassy-hal-internal` due to the use of `$crate`. 177// developer note: this macro can't be in `embassy-hal-internal` due to the use of `$crate`.
178#[macro_export] 178#[macro_export]
179macro_rules! bind_interrupts { 179macro_rules! bind_interrupts {
180 ($vis:vis struct $name:ident { 180 ($vis:vis struct $name:ident {
181 $( 181 $(
182 $(#[cfg($cond_irq:meta)])? 182 $(#[cfg($cond_irq:meta)])?
183 $irq:ident => $( 183 $irq:ident => $(
184 $(#[cfg($cond_handler:meta)])? 184 $(#[cfg($cond_handler:meta)])?
185 $handler:ty 185 $handler:ty
186 ),*; 186 ),*;
187 )* 187 )*
188 }) => { 188 }) => {
189 #[derive(Copy, Clone)] 189 #[derive(Copy, Clone)]
190 $vis struct $name; 190 $vis struct $name;
191 191
192 $( 192 $(
193 #[allow(non_snake_case)] 193 #[allow(non_snake_case)]
194 #[no_mangle] 194 #[no_mangle]
195 $(#[cfg($cond_irq)])? 195 $(#[cfg($cond_irq)])?
196 unsafe extern "C" fn $irq() { 196 unsafe extern "C" fn $irq() {
197 $( 197 $(
198 $(#[cfg($cond_handler)])? 198 $(#[cfg($cond_handler)])?
199 <$handler as $crate::interrupt::typelevel::Handler<$crate::interrupt::typelevel::$irq>>::on_interrupt(); 199 <$handler as $crate::interrupt::typelevel::Handler<$crate::interrupt::typelevel::$irq>>::on_interrupt();
200 200
201 $(#[cfg($cond_handler)])? 201 )*
202 unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {} 202 }
203 )* 203
204 } 204 $(#[cfg($cond_irq)])?
205 )* 205 $crate::bind_interrupts!(@inner
206 }; 206 $(
207 $(#[cfg($cond_handler)])?
208 unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {}
209 )*
210 );
211 )*
212 };
213 (@inner $($t:tt)*) => {
214 $($t)*
207 } 215 }
216}
208 217
209// Reexports 218// Reexports
210 219
diff --git a/embassy-rp/src/lib.rs b/embassy-rp/src/lib.rs
index 51f6ed7f8..f0893b5a0 100644
--- a/embassy-rp/src/lib.rs
+++ b/embassy-rp/src/lib.rs
@@ -175,8 +175,8 @@ macro_rules! bind_interrupts {
175 ),*; 175 ),*;
176 )* 176 )*
177 }) => { 177 }) => {
178 #[derive(Copy, Clone)] 178 #[derive(Copy, Clone)]
179 $vis struct $name; 179 $vis struct $name;
180 180
181 $( 181 $(
182 #[allow(non_snake_case)] 182 #[allow(non_snake_case)]
@@ -187,12 +187,21 @@ macro_rules! bind_interrupts {
187 $(#[cfg($cond_handler)])? 187 $(#[cfg($cond_handler)])?
188 <$handler as $crate::interrupt::typelevel::Handler<$crate::interrupt::typelevel::$irq>>::on_interrupt(); 188 <$handler as $crate::interrupt::typelevel::Handler<$crate::interrupt::typelevel::$irq>>::on_interrupt();
189 189
190 )*
191 }
192
193 $(#[cfg($cond_irq)])?
194 $crate::bind_interrupts!(@inner
195 $(
190 $(#[cfg($cond_handler)])? 196 $(#[cfg($cond_handler)])?
191 unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {} 197 unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {}
192 )* 198 )*
193 } 199 );
194 )* 200 )*
195 }; 201 };
202 (@inner $($t:tt)*) => {
203 $($t)*
204 }
196} 205}
197 206
198#[cfg(feature = "rp2040")] 207#[cfg(feature = "rp2040")]
diff --git a/embassy-stm32/src/lib.rs b/embassy-stm32/src/lib.rs
index 1e6185bc1..286a18da2 100644
--- a/embassy-stm32/src/lib.rs
+++ b/embassy-stm32/src/lib.rs
@@ -186,12 +186,21 @@ macro_rules! bind_interrupts {
186 $(#[cfg($cond_handler)])? 186 $(#[cfg($cond_handler)])?
187 <$handler as $crate::interrupt::typelevel::Handler<$crate::interrupt::typelevel::$irq>>::on_interrupt(); 187 <$handler as $crate::interrupt::typelevel::Handler<$crate::interrupt::typelevel::$irq>>::on_interrupt();
188 188
189 )*
190 }
191
192 $(#[cfg($cond_irq)])?
193 $crate::bind_interrupts!(@inner
194 $(
189 $(#[cfg($cond_handler)])? 195 $(#[cfg($cond_handler)])?
190 unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {} 196 unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {}
191 )* 197 )*
192 } 198 );
193 )* 199 )*
194 }; 200 };
201 (@inner $($t:tt)*) => {
202 $($t)*
203 }
195} 204}
196 205
197// Reexports 206// Reexports