1#[doc = r"Enumeration of all the interrupts."]
2#[derive(Copy, Clone, Debug, PartialEq, Eq)]
3#[repr(u16)]
4pub enum Interrupt {
5 #[doc = "18 - UART0"]
6 UART0 = 18,
7 #[doc = "19 - UART1"]
8 UART1 = 19,
9 #[doc = "20 - UART2"]
10 UART2 = 20,
11 #[doc = "21 - UART3"]
12 UART3 = 21,
13 #[doc = "22 - UART4"]
14 UART4 = 22,
15 #[doc = "23 - UART5"]
16 UART5 = 23,
17 #[doc = "25 - TWI0"]
18 TWI0 = 25,
19 #[doc = "26 - TWI1"]
20 TWI1 = 26,
21 #[doc = "27 - TWI2"]
22 TWI2 = 27,
23 #[doc = "28 - TWI3"]
24 TWI3 = 28,
25 #[doc = "31 - SPI0"]
26 SPI0 = 31,
27 #[doc = "32 - SPI1"]
28 SPI1 = 32,
29 #[doc = "34 - PWM"]
30 PWM = 34,
31 #[doc = "35 - IR_TX"]
32 IR_TX = 35,
33 #[doc = "36 - LEDC"]
34 LEDC = 36,
35 #[doc = "39 - OWA"]
36 OWA = 39,
37 #[doc = "40 - DMIC"]
38 DMIC = 40,
39 #[doc = "41 - AUDIO_CODEC"]
40 AUDIO_CODEC = 41,
41 #[doc = "42 - I2S_PCM0"]
42 I2S_PCM0 = 42,
43 #[doc = "43 - I2S_PCM1"]
44 I2S_PCM1 = 43,
45 #[doc = "44 - I2S_PCM2"]
46 I2S_PCM2 = 44,
47 #[doc = "45 - USB0_DEVICE"]
48 USB0_DEVICE = 45,
49 #[doc = "46 - USB0_EHCI"]
50 USB0_EHCI = 46,
51 #[doc = "47 - USB0_OHCI"]
52 USB0_OHCI = 47,
53 #[doc = "49 - USB1_EHCI"]
54 USB1_EHCI = 49,
55 #[doc = "50 - USB1_OHCI"]
56 USB1_OHCI = 50,
57 #[doc = "56 - SMHC0"]
58 SMHC0 = 56,
59 #[doc = "57 - SMHC1"]
60 SMHC1 = 57,
61 #[doc = "58 - SMHC2"]
62 SMHC2 = 58,
63 #[doc = "62 - EMAC"]
64 EMAC = 62,
65 #[doc = "66 - DMAC_NS"]
66 DMAC_NS = 66,
67 #[doc = "68 - CE_NS"]
68 CE_NS = 68,
69 #[doc = "70 - SPINLOCK"]
70 SPINLOCK = 70,
71 #[doc = "71 - HSTIMER0"]
72 HSTIMER0 = 71,
73 #[doc = "72 - HSTIMER1"]
74 HSTIMER1 = 72,
75 #[doc = "73 - GPADC"]
76 GPADC = 73,
77 #[doc = "74 - THS"]
78 THS = 74,
79 #[doc = "75 - TIMER0"]
80 TIMER0 = 75,
81 #[doc = "76 - TIMER1"]
82 TIMER1 = 76,
83 #[doc = "77 - LRADC"]
84 LRADC = 77,
85 #[doc = "78 - TPADC"]
86 TPADC = 78,
87 #[doc = "79 - WATCHDOG"]
88 WATCHDOG = 79,
89 #[doc = "80 - IOMMU"]
90 IOMMU = 80,
91 #[doc = "85 - GPIOB_NS"]
92 GPIOB_NS = 85,
93 #[doc = "87 - GPIOC_NS"]
94 GPIOC_NS = 87,
95 #[doc = "89 - GPIOD_NS"]
96 GPIOD_NS = 89,
97 #[doc = "91 - GPIOE_NS"]
98 GPIOE_NS = 91,
99 #[doc = "93 - GPIOF_NS"]
100 GPIOF_NS = 93,
101 #[doc = "111 - CSI_DMA0"]
102 CSI_DMA0 = 111,
103 #[doc = "112 - CSI_DMA1"]
104 CSI_DMA1 = 112,
105 #[doc = "122 - CSI_TOP_PKT"]
106 CSI_TOP_PKT = 122,
107 #[doc = "123 - TVD"]
108 TVD = 123,
109 #[doc = "140 - DSP_MBOX_RV_W"]
110 DSP_MBOX_RV_W = 140,
111 #[doc = "144 - RV_MBOX_RV"]
112 RV_MBOX_RV = 144,
113 #[doc = "145 - RV_MBOX_DSP"]
114 RV_MBOX_DSP = 145,
115 #[doc = "167 - IR_RX"]
116 IR_RX = 167,
117}
118#[doc = r" TryFromInterruptError"]
119#[derive(Debug, Copy, Clone)]
120pub struct TryFromInterruptError(());
121impl Interrupt {
122 #[doc = r" Attempt to convert a given value into an `Interrupt`"]
123 #[inline]
124 pub fn try_from(value: u8) -> Result<Self, TryFromInterruptError> {
125 match value {
126 18 => Ok(Interrupt::UART0),
127 19 => Ok(Interrupt::UART1),
128 20 => Ok(Interrupt::UART2),
129 21 => Ok(Interrupt::UART3),
130 22 => Ok(Interrupt::UART4),
131 23 => Ok(Interrupt::UART5),
132 25 => Ok(Interrupt::TWI0),
133 26 => Ok(Interrupt::TWI1),
134 27 => Ok(Interrupt::TWI2),
135 28 => Ok(Interrupt::TWI3),
136 31 => Ok(Interrupt::SPI0),
137 32 => Ok(Interrupt::SPI1),
138 34 => Ok(Interrupt::PWM),
139 35 => Ok(Interrupt::IR_TX),
140 36 => Ok(Interrupt::LEDC),
141 39 => Ok(Interrupt::OWA),
142 40 => Ok(Interrupt::DMIC),
143 41 => Ok(Interrupt::AUDIO_CODEC),
144 42 => Ok(Interrupt::I2S_PCM0),
145 43 => Ok(Interrupt::I2S_PCM1),
146 44 => Ok(Interrupt::I2S_PCM2),
147 45 => Ok(Interrupt::USB0_DEVICE),
148 46 => Ok(Interrupt::USB0_EHCI),
149 47 => Ok(Interrupt::USB0_OHCI),
150 49 => Ok(Interrupt::USB1_EHCI),
151 50 => Ok(Interrupt::USB1_OHCI),
152 56 => Ok(Interrupt::SMHC0),
153 57 => Ok(Interrupt::SMHC1),
154 58 => Ok(Interrupt::SMHC2),
155 62 => Ok(Interrupt::EMAC),
156 66 => Ok(Interrupt::DMAC_NS),
157 68 => Ok(Interrupt::CE_NS),
158 70 => Ok(Interrupt::SPINLOCK),
159 71 => Ok(Interrupt::HSTIMER0),
160 72 => Ok(Interrupt::HSTIMER1),
161 73 => Ok(Interrupt::GPADC),
162 74 => Ok(Interrupt::THS),
163 75 => Ok(Interrupt::TIMER0),
164 76 => Ok(Interrupt::TIMER1),
165 77 => Ok(Interrupt::LRADC),
166 78 => Ok(Interrupt::TPADC),
167 79 => Ok(Interrupt::WATCHDOG),
168 80 => Ok(Interrupt::IOMMU),
169 85 => Ok(Interrupt::GPIOB_NS),
170 87 => Ok(Interrupt::GPIOC_NS),
171 89 => Ok(Interrupt::GPIOD_NS),
172 91 => Ok(Interrupt::GPIOE_NS),
173 93 => Ok(Interrupt::GPIOF_NS),
174 111 => Ok(Interrupt::CSI_DMA0),
175 112 => Ok(Interrupt::CSI_DMA1),
176 122 => Ok(Interrupt::CSI_TOP_PKT),
177 123 => Ok(Interrupt::TVD),
178 140 => Ok(Interrupt::DSP_MBOX_RV_W),
179 144 => Ok(Interrupt::RV_MBOX_RV),
180 145 => Ok(Interrupt::RV_MBOX_DSP),
181 167 => Ok(Interrupt::IR_RX),
182 _ => Err(TryFromInterruptError(())),
183 }
184 }
185}
186#[cfg(feature = "rt")]
187#[macro_export]
188#[doc = r" Assigns a handler to an interrupt"]
189#[doc = r""]
190#[doc = r" This macro takes two arguments: the name of an interrupt and the path to the"]
191#[doc = r" function that will be used as the handler of that interrupt. That function"]
192#[doc = r" must have signature `fn()`."]
193#[doc = r""]
194#[doc = r" Optionally, a third argument may be used to declare interrupt local data."]
195#[doc = r" The handler will have exclusive access to these *local* variables on each"]
196#[doc = r" invocation. If the third argument is used then the signature of the handler"]
197#[doc = r" function must be `fn(&mut $NAME::Locals)` where `$NAME` is the first argument"]
198#[doc = r" passed to the macro."]
199#[doc = r""]
200#[doc = r" # Example"]
201#[doc = r""]
202#[doc = r" ``` ignore"]
203#[doc = r" interrupt!(TIM2, periodic);"]
204#[doc = r""]
205#[doc = r" fn periodic() {"]
206#[doc = r#" print!(".");"#]
207#[doc = r" }"]
208#[doc = r""]
209#[doc = r" interrupt!(TIM3, tick, locals: {"]
210#[doc = r" tick: bool = false;"]
211#[doc = r" });"]
212#[doc = r""]
213#[doc = r" fn tick(locals: &mut TIM3::Locals) {"]
214#[doc = r" locals.tick = !locals.tick;"]
215#[doc = r""]
216#[doc = r" if locals.tick {"]
217#[doc = r#" println!("Tick");"#]
218#[doc = r" } else {"]
219#[doc = r#" println!("Tock");"#]
220#[doc = r" }"]
221#[doc = r" }"]
222#[doc = r" ```"]
223macro_rules ! interrupt { ($ NAME : ident , $ path : path , locals : { $ ($ lvar : ident : $ lty : ty = $ lval : expr ;) * }) => { # [allow (non_snake_case)] mod $ NAME { pub struct Locals { $ (pub $ lvar : $ lty ,) * } } # [allow (non_snake_case)] # [no_mangle] pub extern "C" fn $ NAME () { let _ = $ crate :: interrupt :: Interrupt :: $ NAME ; static mut LOCALS : self :: $ NAME :: Locals = self :: $ NAME :: Locals { $ ($ lvar : $ lval ,) * } ; let f : fn (& mut self :: $ NAME :: Locals) = $ path ; f (unsafe { & mut LOCALS }) ; } } ; ($ NAME : ident , $ path : path) => { # [allow (non_snake_case)] # [no_mangle] pub extern "C" fn $ NAME () { let _ = $ crate :: interrupt :: Interrupt :: $ NAME ; let f : fn () = $ path ; f () ; } } }