aboutsummaryrefslogtreecommitdiff
path: root/embassy-rp/src/interrupt.rs
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-06-08 16:08:40 +0200
committerDario Nieuwenhuis <[email protected]>2023-06-08 18:00:48 +0200
commit921780e6bfb9bcb2cd087b8aa8b094d792c99fa2 (patch)
treebd21fba9800471b860ca44e05567588dcc1afef7 /embassy-rp/src/interrupt.rs
parent87ad66f2b4a5bfd36dfc8d8aad5492e9e3f915e6 (diff)
Make interrupt module more standard.
- Move typelevel interrupts to a special-purpose mod: `embassy_xx::interrupt::typelevel`. - Reexport the PAC interrupt enum in `embassy_xx::interrupt`. This has a few advantages: - The `embassy_xx::interrupt` module is now more "standard". - It works with `cortex-m` functions for manipulating interrupts, for example. - It works with RTIC. - the interrupt enum allows holding value that can be "any interrupt at runtime", this can't be done with typelevel irqs. - When "const-generics on enums" is stable, we can remove the typelevel interrupts without disruptive changes to `embassy_xx::interrupt`.
Diffstat (limited to 'embassy-rp/src/interrupt.rs')
-rw-r--r--embassy-rp/src/interrupt.rs65
1 files changed, 0 insertions, 65 deletions
diff --git a/embassy-rp/src/interrupt.rs b/embassy-rp/src/interrupt.rs
deleted file mode 100644
index c9298644d..000000000
--- a/embassy-rp/src/interrupt.rs
+++ /dev/null
@@ -1,65 +0,0 @@
1//! Interrupt definitions and macros to bind them.
2pub use cortex_m::interrupt::{CriticalSection, Mutex};
3use embassy_cortex_m::interrupt::_export::declare;
4pub use embassy_cortex_m::interrupt::{Binding, Handler, Interrupt, Priority};
5
6use crate::pac::Interrupt as InterruptEnum;
7declare!(TIMER_IRQ_0);
8declare!(TIMER_IRQ_1);
9declare!(TIMER_IRQ_2);
10declare!(TIMER_IRQ_3);
11declare!(PWM_IRQ_WRAP);
12declare!(USBCTRL_IRQ);
13declare!(XIP_IRQ);
14declare!(PIO0_IRQ_0);
15declare!(PIO0_IRQ_1);
16declare!(PIO1_IRQ_0);
17declare!(PIO1_IRQ_1);
18declare!(DMA_IRQ_0);
19declare!(DMA_IRQ_1);
20declare!(IO_IRQ_BANK0);
21declare!(IO_IRQ_QSPI);
22declare!(SIO_IRQ_PROC0);
23declare!(SIO_IRQ_PROC1);
24declare!(CLOCKS_IRQ);
25declare!(SPI0_IRQ);
26declare!(SPI1_IRQ);
27declare!(UART0_IRQ);
28declare!(UART1_IRQ);
29declare!(ADC_IRQ_FIFO);
30declare!(I2C0_IRQ);
31declare!(I2C1_IRQ);
32declare!(RTC_IRQ);
33declare!(SWI_IRQ_0);
34declare!(SWI_IRQ_1);
35declare!(SWI_IRQ_2);
36declare!(SWI_IRQ_3);
37declare!(SWI_IRQ_4);
38declare!(SWI_IRQ_5);
39
40/// Macro to bind interrupts to handlers.
41///
42/// This defines the right interrupt handlers, and creates a unit struct (like `struct Irqs;`)
43/// and implements the right [`Binding`]s for it. You can pass this struct to drivers to
44/// prove at compile-time that the right interrupts have been bound.
45// developer note: this macro can't be in `embassy-cortex-m` due to the use of `$crate`.
46#[macro_export]
47macro_rules! bind_interrupts {
48 ($vis:vis struct $name:ident { $($irq:ident => $($handler:ty),*;)* }) => {
49 $vis struct $name;
50
51 $(
52 #[allow(non_snake_case)]
53 #[no_mangle]
54 unsafe extern "C" fn $irq() {
55 $(
56 <$handler as $crate::interrupt::Handler<$crate::interrupt::$irq>>::on_interrupt();
57 )*
58 }
59
60 $(
61 unsafe impl $crate::interrupt::Binding<$crate::interrupt::$irq, $handler> for $name {}
62 )*
63 )*
64 };
65}