esp_metadata_generated/
_generated_esp32s2.rs

1// Do NOT edit this file directly. Make your changes to esp-metadata,
2// then run `cargo xtask update-metadata`.
3
4/// The name of the chip as `&str`
5///
6/// # Example
7///
8/// ```rust, no_run
9/// use esp_hal::chip;
10/// let chip_name = chip!();
11#[doc = concat!("assert_eq!(chip_name, ", chip!(), ")")]
12/// ```
13#[macro_export]
14#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
15macro_rules! chip {
16    () => {
17        "esp32s2"
18    };
19}
20/// The properties of this chip and its drivers.
21#[macro_export]
22#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
23macro_rules! property {
24    ("chip") => {
25        "esp32s2"
26    };
27    ("arch") => {
28        "xtensa"
29    };
30    ("cores") => {
31        1
32    };
33    ("cores", str) => {
34        stringify!(1)
35    };
36    ("trm") => {
37        "https://www.espressif.com/sites/default/files/documentation/esp32-s2_technical_reference_manual_en.pdf"
38    };
39    ("gpio.has_bank_1") => {
40        true
41    };
42    ("gpio.gpio_function") => {
43        1
44    };
45    ("gpio.gpio_function", str) => {
46        stringify!(1)
47    };
48    ("gpio.constant_0_input") => {
49        60
50    };
51    ("gpio.constant_0_input", str) => {
52        stringify!(60)
53    };
54    ("gpio.constant_1_input") => {
55        56
56    };
57    ("gpio.constant_1_input", str) => {
58        stringify!(56)
59    };
60    ("gpio.remap_iomux_pin_registers") => {
61        false
62    };
63    ("gpio.func_in_sel_offset") => {
64        0
65    };
66    ("gpio.func_in_sel_offset", str) => {
67        stringify!(0)
68    };
69    ("gpio.input_signal_max") => {
70        242
71    };
72    ("gpio.input_signal_max", str) => {
73        stringify!(242)
74    };
75    ("gpio.output_signal_max") => {
76        256
77    };
78    ("gpio.output_signal_max", str) => {
79        stringify!(256)
80    };
81    ("i2c_master.has_fsm_timeouts") => {
82        false
83    };
84    ("i2c_master.has_hw_bus_clear") => {
85        false
86    };
87    ("i2c_master.has_bus_timeout_enable") => {
88        true
89    };
90    ("i2c_master.separate_filter_config_registers") => {
91        true
92    };
93    ("i2c_master.can_estimate_nack_reason") => {
94        false
95    };
96    ("i2c_master.has_conf_update") => {
97        false
98    };
99    ("i2c_master.has_reliable_fsm_reset") => {
100        false
101    };
102    ("i2c_master.has_arbitration_en") => {
103        true
104    };
105    ("i2c_master.has_tx_fifo_watermark") => {
106        false
107    };
108    ("i2c_master.bus_timeout_is_exponential") => {
109        false
110    };
111    ("i2c_master.i2c0_data_register_ahb_address") => {
112        1610690588
113    };
114    ("i2c_master.i2c0_data_register_ahb_address", str) => {
115        stringify!(1610690588)
116    };
117    ("i2c_master.max_bus_timeout") => {
118        16777215
119    };
120    ("i2c_master.max_bus_timeout", str) => {
121        stringify!(16777215)
122    };
123    ("i2c_master.ll_intr_mask") => {
124        131071
125    };
126    ("i2c_master.ll_intr_mask", str) => {
127        stringify!(131071)
128    };
129    ("i2c_master.fifo_size") => {
130        32
131    };
132    ("i2c_master.fifo_size", str) => {
133        stringify!(32)
134    };
135    ("interrupts.status_registers") => {
136        3
137    };
138    ("interrupts.status_registers", str) => {
139        stringify!(3)
140    };
141    ("rmt.ram_start") => {
142        1061250048
143    };
144    ("rmt.ram_start", str) => {
145        stringify!(1061250048)
146    };
147    ("rmt.channel_ram_size") => {
148        64
149    };
150    ("rmt.channel_ram_size", str) => {
151        stringify!(64)
152    };
153    ("spi_master.has_octal") => {
154        true
155    };
156    ("timergroup.timg_has_timer1") => {
157        true
158    };
159    ("wifi.has_wifi6") => {
160        false
161    };
162}
163/// Macro to get the address range of the given memory region.
164#[macro_export]
165#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
166macro_rules! memory_range {
167    ("DRAM") => {
168        1073414144..1073741824
169    };
170}
171/// This macro can be used to generate code for each peripheral instance of the I2C master driver.
172///
173/// For an explanation on the general syntax, as well as usage of individual/repeated
174/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
175///
176/// This macro has one option for its "Individual matcher" case:
177///
178/// Syntax: `($instance:ident, $sys:ident, $scl:ident, $sda:ident)`
179///
180/// Macro fragments:
181///
182/// - `$instance`: the name of the I2C instance
183/// - `$sys`: the name of the instance as it is in the `esp_hal::system::Peripheral` enum.
184/// - `$scl`, `$sda`: peripheral signal names.
185///
186/// Example data: `(I2C0, I2cExt0, I2CEXT0_SCL, I2CEXT0_SDA)`
187#[macro_export]
188#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
189macro_rules! for_each_i2c_master {
190    ($($pattern:tt => $code:tt;)*) => {
191        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
192        _for_each_inner!((I2C0, I2cExt0, I2CEXT0_SCL, I2CEXT0_SDA));
193        _for_each_inner!((I2C1, I2cExt1, I2CEXT1_SCL, I2CEXT1_SDA));
194        _for_each_inner!((all(I2C0, I2cExt0, I2CEXT0_SCL, I2CEXT0_SDA), (I2C1, I2cExt1,
195        I2CEXT1_SCL, I2CEXT1_SDA)));
196    };
197}
198/// This macro can be used to generate code for each peripheral instance of the UART driver.
199///
200/// For an explanation on the general syntax, as well as usage of individual/repeated
201/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
202///
203/// This macro has one option for its "Individual matcher" case:
204///
205/// Syntax: `($instance:ident, $sys:ident, $rx:ident, $tx:ident, $cts:ident, $rts:ident)`
206///
207/// Macro fragments:
208///
209/// - `$instance`: the name of the UART instance
210/// - `$sys`: the name of the instance as it is in the `esp_hal::system::Peripheral` enum.
211/// - `$rx`, `$tx`, `$cts`, `$rts`: signal names.
212///
213/// Example data: `(UART0, Uart0, U0RXD, U0TXD, U0CTS, U0RTS)`
214#[macro_export]
215#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
216macro_rules! for_each_uart {
217    ($($pattern:tt => $code:tt;)*) => {
218        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
219        _for_each_inner!((UART0, Uart0, U0RXD, U0TXD, U0CTS, U0RTS));
220        _for_each_inner!((UART1, Uart1, U1RXD, U1TXD, U1CTS, U1RTS));
221        _for_each_inner!((all(UART0, Uart0, U0RXD, U0TXD, U0CTS, U0RTS), (UART1, Uart1,
222        U1RXD, U1TXD, U1CTS, U1RTS)));
223    };
224}
225/// This macro can be used to generate code for each peripheral instance of the SPI master driver.
226///
227/// For an explanation on the general syntax, as well as usage of individual/repeated
228/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
229///
230/// This macro has one option for its "Individual matcher" case:
231///
232/// Syntax: `($instance:ident, $sys:ident, $sclk:ident, [$($cs:ident),*] [$($sio:ident),*
233/// $($is_qspi:iteral)?])`
234///
235/// Macro fragments:
236///
237/// - `$instance`: the name of the SPI instance
238/// - `$sys`: the name of the instance as it is in the `esp_hal::system::Peripheral` enum.
239/// - `$cs`, `$sio`: chip select and SIO signal names.
240/// - `$is_qspi`: a `true` literal present if the SPI instance supports QSPI.
241///
242/// Example data:
243/// - `(SPI2, Spi2, FSPICLK [FSPICS0, FSPICS1, FSPICS2, FSPICS3, FSPICS4, FSPICS5] [FSPID, FSPIQ,
244///   FSPIWP, FSPIHD, FSPIIO4, FSPIIO5, FSPIIO6, FSPIIO7], true)`
245/// - `(SPI3, Spi3, SPI3_CLK [SPI3_CS0, SPI3_CS1, SPI3_CS2] [SPI3_D, SPI3_Q])`
246#[macro_export]
247#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
248macro_rules! for_each_spi_master {
249    ($($pattern:tt => $code:tt;)*) => {
250        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
251        _for_each_inner!((SPI2, Spi2, FSPICLK[FSPICS0, FSPICS1, FSPICS2, FSPICS3,
252        FSPICS4, FSPICS5] [FSPID, FSPIQ, FSPIWP, FSPIHD, FSPIIO4, FSPIIO5, FSPIIO6,
253        FSPIIO7], true)); _for_each_inner!((SPI3, Spi3, SPI3_CLK[SPI3_CS0, SPI3_CS1,
254        SPI3_CS2] [SPI3_D, SPI3_Q])); _for_each_inner!((all(SPI2, Spi2, FSPICLK[FSPICS0,
255        FSPICS1, FSPICS2, FSPICS3, FSPICS4, FSPICS5] [FSPID, FSPIQ, FSPIWP, FSPIHD,
256        FSPIIO4, FSPIIO5, FSPIIO6, FSPIIO7], true), (SPI3, Spi3, SPI3_CLK[SPI3_CS0,
257        SPI3_CS1, SPI3_CS2] [SPI3_D, SPI3_Q])));
258    };
259}
260/// This macro can be used to generate code for each peripheral instance of the SPI slave driver.
261///
262/// For an explanation on the general syntax, as well as usage of individual/repeated
263/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
264///
265/// This macro has one option for its "Individual matcher" case:
266///
267/// Syntax: `($instance:ident, $sys:ident, $sclk:ident, $mosi:ident, $miso:ident, $cs:ident)`
268///
269/// Macro fragments:
270///
271/// - `$instance`: the name of the I2C instance
272/// - `$sys`: the name of the instance as it is in the `esp_hal::system::Peripheral` enum.
273/// - `$mosi`, `$miso`, `$cs`: signal names.
274///
275/// Example data: `(SPI2, Spi2, FSPICLK, FSPID, FSPIQ, FSPICS0)`
276#[macro_export]
277#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
278macro_rules! for_each_spi_slave {
279    ($($pattern:tt => $code:tt;)*) => {
280        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
281        _for_each_inner!((SPI2, Spi2, FSPICLK, FSPID, FSPIQ, FSPICS0));
282        _for_each_inner!((SPI3, Spi3, SPI3_CLK, SPI3_D, SPI3_Q, SPI3_CS0));
283        _for_each_inner!((all(SPI2, Spi2, FSPICLK, FSPID, FSPIQ, FSPICS0), (SPI3, Spi3,
284        SPI3_CLK, SPI3_D, SPI3_Q, SPI3_CS0)));
285    };
286}
287#[macro_export]
288#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
289macro_rules! for_each_peripheral {
290    ($($pattern:tt => $code:tt;)*) => {
291        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
292        _for_each_inner!((GPIO0 <= virtual())); _for_each_inner!((GPIO1 <= virtual()));
293        _for_each_inner!((GPIO2 <= virtual())); _for_each_inner!((GPIO3 <= virtual()));
294        _for_each_inner!((GPIO4 <= virtual())); _for_each_inner!((GPIO5 <= virtual()));
295        _for_each_inner!((GPIO6 <= virtual())); _for_each_inner!((GPIO7 <= virtual()));
296        _for_each_inner!((GPIO8 <= virtual())); _for_each_inner!((GPIO9 <= virtual()));
297        _for_each_inner!((GPIO10 <= virtual())); _for_each_inner!((GPIO11 <= virtual()));
298        _for_each_inner!((GPIO12 <= virtual())); _for_each_inner!((GPIO13 <= virtual()));
299        _for_each_inner!((GPIO14 <= virtual())); _for_each_inner!((GPIO15 <= virtual()));
300        _for_each_inner!((GPIO16 <= virtual())); _for_each_inner!((GPIO17 <= virtual()));
301        _for_each_inner!((GPIO18 <= virtual())); _for_each_inner!((GPIO19 <= virtual()));
302        _for_each_inner!((GPIO20 <= virtual())); _for_each_inner!((GPIO21 <= virtual()));
303        _for_each_inner!((GPIO26 <= virtual())); _for_each_inner!((GPIO27 <= virtual()));
304        _for_each_inner!((GPIO28 <= virtual())); _for_each_inner!((GPIO29 <= virtual()));
305        _for_each_inner!((GPIO30 <= virtual())); _for_each_inner!((GPIO31 <= virtual()));
306        _for_each_inner!((GPIO32 <= virtual())); _for_each_inner!((GPIO33 <= virtual()));
307        _for_each_inner!((GPIO34 <= virtual())); _for_each_inner!((GPIO35 <= virtual()));
308        _for_each_inner!((GPIO36 <= virtual())); _for_each_inner!((GPIO37 <= virtual()));
309        _for_each_inner!((GPIO38 <= virtual())); _for_each_inner!((GPIO39 <= virtual()));
310        _for_each_inner!((GPIO40 <= virtual())); _for_each_inner!((GPIO41 <= virtual()));
311        _for_each_inner!((GPIO42 <= virtual())); _for_each_inner!((GPIO43 <= virtual()));
312        _for_each_inner!((GPIO44 <= virtual())); _for_each_inner!((GPIO45 <= virtual()));
313        _for_each_inner!((GPIO46 <= virtual())); _for_each_inner!((AES <= AES()
314        (unstable))); _for_each_inner!((APB_SARADC <= APB_SARADC() (unstable)));
315        _for_each_inner!((DEDICATED_GPIO <= DEDICATED_GPIO() (unstable)));
316        _for_each_inner!((DS <= DS() (unstable))); _for_each_inner!((EFUSE <= EFUSE()
317        (unstable))); _for_each_inner!((EXTMEM <= EXTMEM() (unstable)));
318        _for_each_inner!((FE <= FE() (unstable))); _for_each_inner!((FE2 <= FE2()
319        (unstable))); _for_each_inner!((GPIO <= GPIO() (unstable)));
320        _for_each_inner!((GPIO_SD <= GPIO_SD() (unstable))); _for_each_inner!((HMAC <=
321        HMAC() (unstable))); _for_each_inner!((I2C_ANA_MST <= I2C_ANA_MST() (unstable)));
322        _for_each_inner!((I2C0 <= I2C0(I2C_EXT0 : { bind_peri_interrupt,
323        enable_peri_interrupt, disable_peri_interrupt }))); _for_each_inner!((I2C1 <=
324        I2C1(I2C_EXT1 : { bind_peri_interrupt, enable_peri_interrupt,
325        disable_peri_interrupt }))); _for_each_inner!((I2S0 <= I2S0(I2S0 : {
326        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })
327        (unstable))); _for_each_inner!((INTERRUPT_CORE0 <= INTERRUPT_CORE0()
328        (unstable))); _for_each_inner!((IO_MUX <= IO_MUX() (unstable)));
329        _for_each_inner!((LEDC <= LEDC() (unstable))); _for_each_inner!((NRX <= NRX()
330        (unstable))); _for_each_inner!((PCNT <= PCNT() (unstable)));
331        _for_each_inner!((PMS <= PMS() (unstable))); _for_each_inner!((RMT <= RMT()
332        (unstable))); _for_each_inner!((RNG <= RNG() (unstable))); _for_each_inner!((RSA
333        <= RSA() (unstable))); _for_each_inner!((LPWR <= RTC_CNTL() (unstable)));
334        _for_each_inner!((RTC_I2C <= RTC_I2C() (unstable))); _for_each_inner!((RTC_IO <=
335        RTC_IO() (unstable))); _for_each_inner!((SENS <= SENS() (unstable)));
336        _for_each_inner!((SHA <= SHA() (unstable))); _for_each_inner!((SPI0 <= SPI0()
337        (unstable))); _for_each_inner!((SPI1 <= SPI1() (unstable)));
338        _for_each_inner!((SPI2 <= SPI2(SPI2_DMA : { bind_dma_interrupt,
339        enable_dma_interrupt, disable_dma_interrupt }, SPI2 : { bind_peri_interrupt,
340        enable_peri_interrupt, disable_peri_interrupt }))); _for_each_inner!((SPI3 <=
341        SPI3(SPI3_DMA : { bind_dma_interrupt, enable_dma_interrupt, disable_dma_interrupt
342        }, SPI3 : { bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt
343        }))); _for_each_inner!((SYSCON <= SYSCON() (unstable))); _for_each_inner!((SYSTEM
344        <= SYSTEM() (unstable))); _for_each_inner!((SYSTIMER <= SYSTIMER() (unstable)));
345        _for_each_inner!((TIMG0 <= TIMG0() (unstable))); _for_each_inner!((TIMG1 <=
346        TIMG1() (unstable))); _for_each_inner!((TWAI0 <= TWAI0() (unstable)));
347        _for_each_inner!((UART0 <= UART0(UART0 : { bind_peri_interrupt,
348        enable_peri_interrupt, disable_peri_interrupt }))); _for_each_inner!((UART1 <=
349        UART1(UART1 : { bind_peri_interrupt, enable_peri_interrupt,
350        disable_peri_interrupt }))); _for_each_inner!((UHCI0 <= UHCI0() (unstable)));
351        _for_each_inner!((USB0 <= USB0() (unstable))); _for_each_inner!((USB_WRAP <=
352        USB_WRAP() (unstable))); _for_each_inner!((XTS_AES <= XTS_AES() (unstable)));
353        _for_each_inner!((WIFI <= WIFI() (unstable))); _for_each_inner!((DMA_SPI2 <=
354        SPI2() (unstable))); _for_each_inner!((DMA_SPI3 <= SPI3() (unstable)));
355        _for_each_inner!((DMA_I2S0 <= I2S0() (unstable))); _for_each_inner!((DMA_CRYPTO
356        <= CRYPTO_DMA() (unstable))); _for_each_inner!((DMA_COPY <= COPY_DMA()
357        (unstable))); _for_each_inner!((ADC1 <= virtual() (unstable)));
358        _for_each_inner!((ADC2 <= virtual() (unstable))); _for_each_inner!((DAC1 <=
359        virtual() (unstable))); _for_each_inner!((DAC2 <= virtual() (unstable)));
360        _for_each_inner!((PSRAM <= virtual() (unstable))); _for_each_inner!((SW_INTERRUPT
361        <= virtual() (unstable))); _for_each_inner!((ULP_RISCV_CORE <= virtual()
362        (unstable))); _for_each_inner!((all(GPIO0 <= virtual()), (GPIO1 <= virtual()),
363        (GPIO2 <= virtual()), (GPIO3 <= virtual()), (GPIO4 <= virtual()), (GPIO5 <=
364        virtual()), (GPIO6 <= virtual()), (GPIO7 <= virtual()), (GPIO8 <= virtual()),
365        (GPIO9 <= virtual()), (GPIO10 <= virtual()), (GPIO11 <= virtual()), (GPIO12 <=
366        virtual()), (GPIO13 <= virtual()), (GPIO14 <= virtual()), (GPIO15 <= virtual()),
367        (GPIO16 <= virtual()), (GPIO17 <= virtual()), (GPIO18 <= virtual()), (GPIO19 <=
368        virtual()), (GPIO20 <= virtual()), (GPIO21 <= virtual()), (GPIO26 <= virtual()),
369        (GPIO27 <= virtual()), (GPIO28 <= virtual()), (GPIO29 <= virtual()), (GPIO30 <=
370        virtual()), (GPIO31 <= virtual()), (GPIO32 <= virtual()), (GPIO33 <= virtual()),
371        (GPIO34 <= virtual()), (GPIO35 <= virtual()), (GPIO36 <= virtual()), (GPIO37 <=
372        virtual()), (GPIO38 <= virtual()), (GPIO39 <= virtual()), (GPIO40 <= virtual()),
373        (GPIO41 <= virtual()), (GPIO42 <= virtual()), (GPIO43 <= virtual()), (GPIO44 <=
374        virtual()), (GPIO45 <= virtual()), (GPIO46 <= virtual()), (AES <= AES()
375        (unstable)), (APB_SARADC <= APB_SARADC() (unstable)), (DEDICATED_GPIO <=
376        DEDICATED_GPIO() (unstable)), (DS <= DS() (unstable)), (EFUSE <= EFUSE()
377        (unstable)), (EXTMEM <= EXTMEM() (unstable)), (FE <= FE() (unstable)), (FE2 <=
378        FE2() (unstable)), (GPIO <= GPIO() (unstable)), (GPIO_SD <= GPIO_SD()
379        (unstable)), (HMAC <= HMAC() (unstable)), (I2C_ANA_MST <= I2C_ANA_MST()
380        (unstable)), (I2C0 <= I2C0(I2C_EXT0 : { bind_peri_interrupt,
381        enable_peri_interrupt, disable_peri_interrupt })), (I2C1 <= I2C1(I2C_EXT1 : {
382        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })), (I2S0 <=
383        I2S0(I2S0 : { bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt
384        }) (unstable)), (INTERRUPT_CORE0 <= INTERRUPT_CORE0() (unstable)), (IO_MUX <=
385        IO_MUX() (unstable)), (LEDC <= LEDC() (unstable)), (NRX <= NRX() (unstable)),
386        (PCNT <= PCNT() (unstable)), (PMS <= PMS() (unstable)), (RMT <= RMT()
387        (unstable)), (RNG <= RNG() (unstable)), (RSA <= RSA() (unstable)), (LPWR <=
388        RTC_CNTL() (unstable)), (RTC_I2C <= RTC_I2C() (unstable)), (RTC_IO <= RTC_IO()
389        (unstable)), (SENS <= SENS() (unstable)), (SHA <= SHA() (unstable)), (SPI0 <=
390        SPI0() (unstable)), (SPI1 <= SPI1() (unstable)), (SPI2 <= SPI2(SPI2_DMA : {
391        bind_dma_interrupt, enable_dma_interrupt, disable_dma_interrupt }, SPI2 : {
392        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })), (SPI3 <=
393        SPI3(SPI3_DMA : { bind_dma_interrupt, enable_dma_interrupt, disable_dma_interrupt
394        }, SPI3 : { bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt
395        })), (SYSCON <= SYSCON() (unstable)), (SYSTEM <= SYSTEM() (unstable)), (SYSTIMER
396        <= SYSTIMER() (unstable)), (TIMG0 <= TIMG0() (unstable)), (TIMG1 <= TIMG1()
397        (unstable)), (TWAI0 <= TWAI0() (unstable)), (UART0 <= UART0(UART0 : {
398        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })), (UART1 <=
399        UART1(UART1 : { bind_peri_interrupt, enable_peri_interrupt,
400        disable_peri_interrupt })), (UHCI0 <= UHCI0() (unstable)), (USB0 <= USB0()
401        (unstable)), (USB_WRAP <= USB_WRAP() (unstable)), (XTS_AES <= XTS_AES()
402        (unstable)), (WIFI <= WIFI() (unstable)), (DMA_SPI2 <= SPI2() (unstable)),
403        (DMA_SPI3 <= SPI3() (unstable)), (DMA_I2S0 <= I2S0() (unstable)), (DMA_CRYPTO <=
404        CRYPTO_DMA() (unstable)), (DMA_COPY <= COPY_DMA() (unstable)), (ADC1 <= virtual()
405        (unstable)), (ADC2 <= virtual() (unstable)), (DAC1 <= virtual() (unstable)),
406        (DAC2 <= virtual() (unstable)), (PSRAM <= virtual() (unstable)), (SW_INTERRUPT <=
407        virtual() (unstable)), (ULP_RISCV_CORE <= virtual() (unstable))));
408    };
409}
410/// This macro can be used to generate code for each `GPIOn` instance.
411///
412/// For an explanation on the general syntax, as well as usage of individual/repeated
413/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
414///
415/// This macro has one option for its "Individual matcher" case:
416///
417/// Syntax: `($n:literal, $gpio:ident ($($digital_input_function:ident =>
418/// $digital_input_signal:ident)*) ($($digital_output_function:ident =>
419/// $digital_output_signal:ident)*) ($([$pin_attribute:ident])*))`
420///
421/// Macro fragments:
422///
423/// - `$n`: the number of the GPIO. For `GPIO0`, `$n` is 0.
424/// - `$gpio`: the name of the GPIO.
425/// - `$digital_input_function`: the number of the digital function, as an identifier (i.e. for
426///   function 0 this is `_0`).
427/// - `$digital_input_function`: the name of the digital function, as an identifier.
428/// - `$digital_output_function`: the number of the digital function, as an identifier (i.e. for
429///   function 0 this is `_0`).
430/// - `$digital_output_function`: the name of the digital function, as an identifier.
431/// - `$pin_attribute`: `Input` and/or `Output`, marks the possible directions of the GPIO.
432///   Bracketed so that they can also be matched as optional fragments. Order is always Input first.
433///
434/// Example data: `(0, GPIO0 (_5 => EMAC_TX_CLK) (_1 => CLK_OUT1 _5 => EMAC_TX_CLK) ([Input]
435/// [Output]))`
436#[macro_export]
437#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
438macro_rules! for_each_gpio {
439    ($($pattern:tt => $code:tt;)*) => {
440        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
441        _for_each_inner!((0, GPIO0() () ([Input] [Output]))); _for_each_inner!((1,
442        GPIO1() () ([Input] [Output]))); _for_each_inner!((2, GPIO2() () ([Input]
443        [Output]))); _for_each_inner!((3, GPIO3() () ([Input] [Output])));
444        _for_each_inner!((4, GPIO4() () ([Input] [Output]))); _for_each_inner!((5,
445        GPIO5() () ([Input] [Output]))); _for_each_inner!((6, GPIO6() () ([Input]
446        [Output]))); _for_each_inner!((7, GPIO7() () ([Input] [Output])));
447        _for_each_inner!((8, GPIO8() (_3 => SUBSPICS1) ([Input] [Output])));
448        _for_each_inner!((9, GPIO9(_3 => SUBSPIHD _4 => FSPIHD) (_3 => SUBSPIHD _4 =>
449        FSPIHD) ([Input] [Output]))); _for_each_inner!((10, GPIO10(_2 => FSPIIO4 _4 =>
450        FSPICS0) (_2 => FSPIIO4 _3 => SUBSPICS0 _4 => FSPICS0) ([Input] [Output])));
451        _for_each_inner!((11, GPIO11(_2 => FSPIIO5 _3 => SUBSPID _4 => FSPID) (_2 =>
452        FSPIIO5 _3 => SUBSPID _4 => FSPID) ([Input] [Output]))); _for_each_inner!((12,
453        GPIO12(_2 => FSPIIO6 _4 => FSPICLK) (_2 => FSPIIO6 _3 => SUBSPICLK _4 => FSPICLK)
454        ([Input] [Output]))); _for_each_inner!((13, GPIO13(_2 => FSPIIO7 _3 => SUBSPIQ _4
455        => FSPIQ) (_2 => FSPIIO7 _3 => SUBSPIQ _4 => FSPIQ) ([Input] [Output])));
456        _for_each_inner!((14, GPIO14(_3 => SUBSPIWP _4 => FSPIWP) (_2 => FSPIDQS _3 =>
457        SUBSPIWP _4 => FSPIWP) ([Input] [Output]))); _for_each_inner!((15, GPIO15() (_2
458        => U0RTS) ([Input] [Output]))); _for_each_inner!((16, GPIO16(_2 => U0CTS) ()
459        ([Input] [Output]))); _for_each_inner!((17, GPIO17() (_2 => U1TXD) ([Input]
460        [Output]))); _for_each_inner!((18, GPIO18(_2 => U1RXD) (_3 => CLK_OUT3) ([Input]
461        [Output]))); _for_each_inner!((19, GPIO19() (_2 => U1RTS _3 => CLK_OUT2) ([Input]
462        [Output]))); _for_each_inner!((20, GPIO20(_2 => U1CTS) (_3 => CLK_OUT1) ([Input]
463        [Output]))); _for_each_inner!((21, GPIO21() () ([Input] [Output])));
464        _for_each_inner!((26, GPIO26() (_0 => SPICS1) ([Input] [Output])));
465        _for_each_inner!((27, GPIO27(_0 => SPIHD) (_0 => SPIHD) ([Input] [Output])));
466        _for_each_inner!((28, GPIO28(_0 => SPIWP) (_0 => SPIWP) ([Input] [Output])));
467        _for_each_inner!((29, GPIO29() (_0 => SPICS0) ([Input] [Output])));
468        _for_each_inner!((30, GPIO30() (_0 => SPICLK) ([Input] [Output])));
469        _for_each_inner!((31, GPIO31(_0 => SPIQ) (_0 => SPIQ) ([Input] [Output])));
470        _for_each_inner!((32, GPIO32(_0 => SPID) (_0 => SPID) ([Input] [Output])));
471        _for_each_inner!((33, GPIO33(_2 => FSPIHD _3 => SUBSPIHD) (_2 => FSPIHD _3 =>
472        SUBSPIHD) ([Input] [Output]))); _for_each_inner!((34, GPIO34(_2 => FSPICS0) (_2
473        => FSPICS0 _3 => SUBSPICS0) ([Input] [Output]))); _for_each_inner!((35, GPIO35(_2
474        => FSPID _3 => SUBSPID) (_2 => FSPID _3 => SUBSPID) ([Input] [Output])));
475        _for_each_inner!((36, GPIO36(_2 => FSPICLK) (_2 => FSPICLK _3 => SUBSPICLK)
476        ([Input] [Output]))); _for_each_inner!((37, GPIO37(_2 => FSPIQ _3 => SUBSPIQ _4
477        => SPIDQS) (_2 => FSPIQ _3 => SUBSPIQ _4 => SPIDQS) ([Input] [Output])));
478        _for_each_inner!((38, GPIO38(_2 => FSPIWP _3 => SUBSPIWP) (_2 => FSPIWP _3 =>
479        SUBSPIWP) ([Input] [Output]))); _for_each_inner!((39, GPIO39(_0 => MTCK) (_2 =>
480        CLK_OUT3 _3 => SUBSPICS1) ([Input] [Output]))); _for_each_inner!((40, GPIO40()
481        (_0 => MTDO _2 => CLK_OUT2) ([Input] [Output]))); _for_each_inner!((41, GPIO41(_0
482        => MTDI) (_2 => CLK_OUT1) ([Input] [Output]))); _for_each_inner!((42, GPIO42(_0
483        => MTMS) () ([Input] [Output]))); _for_each_inner!((43, GPIO43() (_0 => U0TXD _2
484        => CLK_OUT1) ([Input] [Output]))); _for_each_inner!((44, GPIO44(_0 => U0RXD) (_2
485        => CLK_OUT2) ([Input] [Output]))); _for_each_inner!((45, GPIO45() () ([Input]
486        [Output]))); _for_each_inner!((46, GPIO46() () ([Input] [Output])));
487        _for_each_inner!((all(0, GPIO0() () ([Input] [Output])), (1, GPIO1() () ([Input]
488        [Output])), (2, GPIO2() () ([Input] [Output])), (3, GPIO3() () ([Input]
489        [Output])), (4, GPIO4() () ([Input] [Output])), (5, GPIO5() () ([Input]
490        [Output])), (6, GPIO6() () ([Input] [Output])), (7, GPIO7() () ([Input]
491        [Output])), (8, GPIO8() (_3 => SUBSPICS1) ([Input] [Output])), (9, GPIO9(_3 =>
492        SUBSPIHD _4 => FSPIHD) (_3 => SUBSPIHD _4 => FSPIHD) ([Input] [Output])), (10,
493        GPIO10(_2 => FSPIIO4 _4 => FSPICS0) (_2 => FSPIIO4 _3 => SUBSPICS0 _4 => FSPICS0)
494        ([Input] [Output])), (11, GPIO11(_2 => FSPIIO5 _3 => SUBSPID _4 => FSPID) (_2 =>
495        FSPIIO5 _3 => SUBSPID _4 => FSPID) ([Input] [Output])), (12, GPIO12(_2 => FSPIIO6
496        _4 => FSPICLK) (_2 => FSPIIO6 _3 => SUBSPICLK _4 => FSPICLK) ([Input] [Output])),
497        (13, GPIO13(_2 => FSPIIO7 _3 => SUBSPIQ _4 => FSPIQ) (_2 => FSPIIO7 _3 => SUBSPIQ
498        _4 => FSPIQ) ([Input] [Output])), (14, GPIO14(_3 => SUBSPIWP _4 => FSPIWP) (_2 =>
499        FSPIDQS _3 => SUBSPIWP _4 => FSPIWP) ([Input] [Output])), (15, GPIO15() (_2 =>
500        U0RTS) ([Input] [Output])), (16, GPIO16(_2 => U0CTS) () ([Input] [Output])), (17,
501        GPIO17() (_2 => U1TXD) ([Input] [Output])), (18, GPIO18(_2 => U1RXD) (_3 =>
502        CLK_OUT3) ([Input] [Output])), (19, GPIO19() (_2 => U1RTS _3 => CLK_OUT2)
503        ([Input] [Output])), (20, GPIO20(_2 => U1CTS) (_3 => CLK_OUT1) ([Input]
504        [Output])), (21, GPIO21() () ([Input] [Output])), (26, GPIO26() (_0 => SPICS1)
505        ([Input] [Output])), (27, GPIO27(_0 => SPIHD) (_0 => SPIHD) ([Input] [Output])),
506        (28, GPIO28(_0 => SPIWP) (_0 => SPIWP) ([Input] [Output])), (29, GPIO29() (_0 =>
507        SPICS0) ([Input] [Output])), (30, GPIO30() (_0 => SPICLK) ([Input] [Output])),
508        (31, GPIO31(_0 => SPIQ) (_0 => SPIQ) ([Input] [Output])), (32, GPIO32(_0 => SPID)
509        (_0 => SPID) ([Input] [Output])), (33, GPIO33(_2 => FSPIHD _3 => SUBSPIHD) (_2 =>
510        FSPIHD _3 => SUBSPIHD) ([Input] [Output])), (34, GPIO34(_2 => FSPICS0) (_2 =>
511        FSPICS0 _3 => SUBSPICS0) ([Input] [Output])), (35, GPIO35(_2 => FSPID _3 =>
512        SUBSPID) (_2 => FSPID _3 => SUBSPID) ([Input] [Output])), (36, GPIO36(_2 =>
513        FSPICLK) (_2 => FSPICLK _3 => SUBSPICLK) ([Input] [Output])), (37, GPIO37(_2 =>
514        FSPIQ _3 => SUBSPIQ _4 => SPIDQS) (_2 => FSPIQ _3 => SUBSPIQ _4 => SPIDQS)
515        ([Input] [Output])), (38, GPIO38(_2 => FSPIWP _3 => SUBSPIWP) (_2 => FSPIWP _3 =>
516        SUBSPIWP) ([Input] [Output])), (39, GPIO39(_0 => MTCK) (_2 => CLK_OUT3 _3 =>
517        SUBSPICS1) ([Input] [Output])), (40, GPIO40() (_0 => MTDO _2 => CLK_OUT2)
518        ([Input] [Output])), (41, GPIO41(_0 => MTDI) (_2 => CLK_OUT1) ([Input]
519        [Output])), (42, GPIO42(_0 => MTMS) () ([Input] [Output])), (43, GPIO43() (_0 =>
520        U0TXD _2 => CLK_OUT1) ([Input] [Output])), (44, GPIO44(_0 => U0RXD) (_2 =>
521        CLK_OUT2) ([Input] [Output])), (45, GPIO45() () ([Input] [Output])), (46,
522        GPIO46() () ([Input] [Output]))));
523    };
524}
525/// This macro can be used to generate code for each analog function of each GPIO.
526///
527/// For an explanation on the general syntax, as well as usage of individual/repeated
528/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
529///
530/// This macro has two options for its "Individual matcher" case:
531///
532/// - `all`: `($signal:ident, $gpio:ident)` - simple case where you only need identifiers
533/// - `all_expanded`: `(($signal:ident, $group:ident $(, $number:literal)+), $gpio:ident)` -
534///   expanded signal case, where you need the number(s) of a signal, or the general group to which
535///   the signal belongs. For example, in case of `ADC2_CH3` the expanded form looks like
536///   `(ADC2_CH3, ADCn_CHm, 2, 3)`.
537///
538/// Macro fragments:
539///
540/// - `$signal`: the name of the signal.
541/// - `$group`: the name of the signal, with numbers replaced by placeholders. For `ADC2_CH3` this
542///   is `ADCn_CHm`.
543/// - `$number`: the numbers extracted from `$signal`.
544/// - `$gpio`: the name of the GPIO.
545///
546/// Example data:
547/// - `(ADC2_CH5, GPIO12)`
548/// - `((ADC2_CH5, ADCn_CHm, 2, 5), GPIO12)`
549///
550/// The expanded syntax is only available when the signal has at least one numbered component.
551#[macro_export]
552#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
553macro_rules! for_each_analog_function {
554    ($($pattern:tt => $code:tt;)*) => {
555        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
556        _for_each_inner!((TOUCH1, GPIO1)); _for_each_inner!((ADC1_CH0, GPIO1));
557        _for_each_inner!((TOUCH2, GPIO2)); _for_each_inner!((ADC1_CH1, GPIO2));
558        _for_each_inner!((TOUCH3, GPIO3)); _for_each_inner!((ADC1_CH2, GPIO3));
559        _for_each_inner!((TOUCH4, GPIO4)); _for_each_inner!((ADC1_CH3, GPIO4));
560        _for_each_inner!((TOUCH5, GPIO5)); _for_each_inner!((ADC1_CH4, GPIO5));
561        _for_each_inner!((TOUCH6, GPIO6)); _for_each_inner!((ADC1_CH5, GPIO6));
562        _for_each_inner!((TOUCH7, GPIO7)); _for_each_inner!((ADC1_CH6, GPIO7));
563        _for_each_inner!((TOUCH8, GPIO8)); _for_each_inner!((ADC1_CH7, GPIO8));
564        _for_each_inner!((TOUCH9, GPIO9)); _for_each_inner!((ADC1_CH8, GPIO9));
565        _for_each_inner!((TOUCH10, GPIO10)); _for_each_inner!((ADC1_CH9, GPIO10));
566        _for_each_inner!((TOUCH11, GPIO11)); _for_each_inner!((ADC2_CH0, GPIO11));
567        _for_each_inner!((TOUCH12, GPIO12)); _for_each_inner!((ADC2_CH1, GPIO12));
568        _for_each_inner!((TOUCH13, GPIO13)); _for_each_inner!((ADC2_CH2, GPIO13));
569        _for_each_inner!((TOUCH14, GPIO14)); _for_each_inner!((ADC2_CH3, GPIO14));
570        _for_each_inner!((XTAL_32K_P, GPIO15)); _for_each_inner!((ADC2_CH4, GPIO15));
571        _for_each_inner!((XTAL_32K_N, GPIO16)); _for_each_inner!((ADC2_CH5, GPIO16));
572        _for_each_inner!((DAC_1, GPIO17)); _for_each_inner!((ADC2_CH6, GPIO17));
573        _for_each_inner!((DAC_2, GPIO18)); _for_each_inner!((ADC2_CH7, GPIO18));
574        _for_each_inner!((USB_DM, GPIO19)); _for_each_inner!((ADC2_CH8, GPIO19));
575        _for_each_inner!((USB_DP, GPIO20)); _for_each_inner!((ADC2_CH9, GPIO20));
576        _for_each_inner!(((TOUCH1, TOUCHn, 1), GPIO1)); _for_each_inner!(((ADC1_CH0,
577        ADCn_CHm, 1, 0), GPIO1)); _for_each_inner!(((TOUCH2, TOUCHn, 2), GPIO2));
578        _for_each_inner!(((ADC1_CH1, ADCn_CHm, 1, 1), GPIO2)); _for_each_inner!(((TOUCH3,
579        TOUCHn, 3), GPIO3)); _for_each_inner!(((ADC1_CH2, ADCn_CHm, 1, 2), GPIO3));
580        _for_each_inner!(((TOUCH4, TOUCHn, 4), GPIO4)); _for_each_inner!(((ADC1_CH3,
581        ADCn_CHm, 1, 3), GPIO4)); _for_each_inner!(((TOUCH5, TOUCHn, 5), GPIO5));
582        _for_each_inner!(((ADC1_CH4, ADCn_CHm, 1, 4), GPIO5)); _for_each_inner!(((TOUCH6,
583        TOUCHn, 6), GPIO6)); _for_each_inner!(((ADC1_CH5, ADCn_CHm, 1, 5), GPIO6));
584        _for_each_inner!(((TOUCH7, TOUCHn, 7), GPIO7)); _for_each_inner!(((ADC1_CH6,
585        ADCn_CHm, 1, 6), GPIO7)); _for_each_inner!(((TOUCH8, TOUCHn, 8), GPIO8));
586        _for_each_inner!(((ADC1_CH7, ADCn_CHm, 1, 7), GPIO8)); _for_each_inner!(((TOUCH9,
587        TOUCHn, 9), GPIO9)); _for_each_inner!(((ADC1_CH8, ADCn_CHm, 1, 8), GPIO9));
588        _for_each_inner!(((TOUCH10, TOUCHn, 10), GPIO10)); _for_each_inner!(((ADC1_CH9,
589        ADCn_CHm, 1, 9), GPIO10)); _for_each_inner!(((TOUCH11, TOUCHn, 11), GPIO11));
590        _for_each_inner!(((ADC2_CH0, ADCn_CHm, 2, 0), GPIO11));
591        _for_each_inner!(((TOUCH12, TOUCHn, 12), GPIO12)); _for_each_inner!(((ADC2_CH1,
592        ADCn_CHm, 2, 1), GPIO12)); _for_each_inner!(((TOUCH13, TOUCHn, 13), GPIO13));
593        _for_each_inner!(((ADC2_CH2, ADCn_CHm, 2, 2), GPIO13));
594        _for_each_inner!(((TOUCH14, TOUCHn, 14), GPIO14)); _for_each_inner!(((ADC2_CH3,
595        ADCn_CHm, 2, 3), GPIO14)); _for_each_inner!(((ADC2_CH4, ADCn_CHm, 2, 4),
596        GPIO15)); _for_each_inner!(((ADC2_CH5, ADCn_CHm, 2, 5), GPIO16));
597        _for_each_inner!(((DAC_1, DAC_n, 1), GPIO17)); _for_each_inner!(((ADC2_CH6,
598        ADCn_CHm, 2, 6), GPIO17)); _for_each_inner!(((DAC_2, DAC_n, 2), GPIO18));
599        _for_each_inner!(((ADC2_CH7, ADCn_CHm, 2, 7), GPIO18));
600        _for_each_inner!(((ADC2_CH8, ADCn_CHm, 2, 8), GPIO19));
601        _for_each_inner!(((ADC2_CH9, ADCn_CHm, 2, 9), GPIO20));
602        _for_each_inner!((all(TOUCH1, GPIO1), (ADC1_CH0, GPIO1), (TOUCH2, GPIO2),
603        (ADC1_CH1, GPIO2), (TOUCH3, GPIO3), (ADC1_CH2, GPIO3), (TOUCH4, GPIO4),
604        (ADC1_CH3, GPIO4), (TOUCH5, GPIO5), (ADC1_CH4, GPIO5), (TOUCH6, GPIO6),
605        (ADC1_CH5, GPIO6), (TOUCH7, GPIO7), (ADC1_CH6, GPIO7), (TOUCH8, GPIO8),
606        (ADC1_CH7, GPIO8), (TOUCH9, GPIO9), (ADC1_CH8, GPIO9), (TOUCH10, GPIO10),
607        (ADC1_CH9, GPIO10), (TOUCH11, GPIO11), (ADC2_CH0, GPIO11), (TOUCH12, GPIO12),
608        (ADC2_CH1, GPIO12), (TOUCH13, GPIO13), (ADC2_CH2, GPIO13), (TOUCH14, GPIO14),
609        (ADC2_CH3, GPIO14), (XTAL_32K_P, GPIO15), (ADC2_CH4, GPIO15), (XTAL_32K_N,
610        GPIO16), (ADC2_CH5, GPIO16), (DAC_1, GPIO17), (ADC2_CH6, GPIO17), (DAC_2,
611        GPIO18), (ADC2_CH7, GPIO18), (USB_DM, GPIO19), (ADC2_CH8, GPIO19), (USB_DP,
612        GPIO20), (ADC2_CH9, GPIO20))); _for_each_inner!((all_expanded((TOUCH1, TOUCHn,
613        1), GPIO1), ((ADC1_CH0, ADCn_CHm, 1, 0), GPIO1), ((TOUCH2, TOUCHn, 2), GPIO2),
614        ((ADC1_CH1, ADCn_CHm, 1, 1), GPIO2), ((TOUCH3, TOUCHn, 3), GPIO3), ((ADC1_CH2,
615        ADCn_CHm, 1, 2), GPIO3), ((TOUCH4, TOUCHn, 4), GPIO4), ((ADC1_CH3, ADCn_CHm, 1,
616        3), GPIO4), ((TOUCH5, TOUCHn, 5), GPIO5), ((ADC1_CH4, ADCn_CHm, 1, 4), GPIO5),
617        ((TOUCH6, TOUCHn, 6), GPIO6), ((ADC1_CH5, ADCn_CHm, 1, 5), GPIO6), ((TOUCH7,
618        TOUCHn, 7), GPIO7), ((ADC1_CH6, ADCn_CHm, 1, 6), GPIO7), ((TOUCH8, TOUCHn, 8),
619        GPIO8), ((ADC1_CH7, ADCn_CHm, 1, 7), GPIO8), ((TOUCH9, TOUCHn, 9), GPIO9),
620        ((ADC1_CH8, ADCn_CHm, 1, 8), GPIO9), ((TOUCH10, TOUCHn, 10), GPIO10), ((ADC1_CH9,
621        ADCn_CHm, 1, 9), GPIO10), ((TOUCH11, TOUCHn, 11), GPIO11), ((ADC2_CH0, ADCn_CHm,
622        2, 0), GPIO11), ((TOUCH12, TOUCHn, 12), GPIO12), ((ADC2_CH1, ADCn_CHm, 2, 1),
623        GPIO12), ((TOUCH13, TOUCHn, 13), GPIO13), ((ADC2_CH2, ADCn_CHm, 2, 2), GPIO13),
624        ((TOUCH14, TOUCHn, 14), GPIO14), ((ADC2_CH3, ADCn_CHm, 2, 3), GPIO14),
625        ((ADC2_CH4, ADCn_CHm, 2, 4), GPIO15), ((ADC2_CH5, ADCn_CHm, 2, 5), GPIO16),
626        ((DAC_1, DAC_n, 1), GPIO17), ((ADC2_CH6, ADCn_CHm, 2, 6), GPIO17), ((DAC_2,
627        DAC_n, 2), GPIO18), ((ADC2_CH7, ADCn_CHm, 2, 7), GPIO18), ((ADC2_CH8, ADCn_CHm,
628        2, 8), GPIO19), ((ADC2_CH9, ADCn_CHm, 2, 9), GPIO20)));
629    };
630}
631/// This macro can be used to generate code for each LP/RTC function of each GPIO.
632///
633/// For an explanation on the general syntax, as well as usage of individual/repeated
634/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
635///
636/// This macro has two options for its "Individual matcher" case:
637///
638/// - `all`: `($signal:ident, $gpio:ident)` - simple case where you only need identifiers
639/// - `all_expanded`: `(($signal:ident, $group:ident $(, $number:literal)+), $gpio:ident)` -
640///   expanded signal case, where you need the number(s) of a signal, or the general group to which
641///   the signal belongs. For example, in case of `SAR_I2C_SCL_1` the expanded form looks like
642///   `(SAR_I2C_SCL_1, SAR_I2C_SCL_n, 1)`.
643///
644/// Macro fragments:
645///
646/// - `$signal`: the name of the signal.
647/// - `$group`: the name of the signal, with numbers replaced by placeholders. For `ADC2_CH3` this
648///   is `ADCn_CHm`.
649/// - `$number`: the numbers extracted from `$signal`.
650/// - `$gpio`: the name of the GPIO.
651///
652/// Example data:
653/// - `(RTC_GPIO15, GPIO12)`
654/// - `((RTC_GPIO15, RTC_GPIOn, 15), GPIO12)`
655///
656/// The expanded syntax is only available when the signal has at least one numbered component.
657#[macro_export]
658#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
659macro_rules! for_each_lp_function {
660    ($($pattern:tt => $code:tt;)*) => {
661        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
662        _for_each_inner!((RTC_GPIO0, GPIO0)); _for_each_inner!((RTC_GPIO1, GPIO1));
663        _for_each_inner!((RTC_GPIO2, GPIO2)); _for_each_inner!((RTC_GPIO3, GPIO3));
664        _for_each_inner!((RTC_GPIO4, GPIO4)); _for_each_inner!((RTC_GPIO5, GPIO5));
665        _for_each_inner!((RTC_GPIO6, GPIO6)); _for_each_inner!((RTC_GPIO7, GPIO7));
666        _for_each_inner!((RTC_GPIO8, GPIO8)); _for_each_inner!((RTC_GPIO9, GPIO9));
667        _for_each_inner!((RTC_GPIO10, GPIO10)); _for_each_inner!((RTC_GPIO11, GPIO11));
668        _for_each_inner!((RTC_GPIO12, GPIO12)); _for_each_inner!((RTC_GPIO13, GPIO13));
669        _for_each_inner!((RTC_GPIO14, GPIO14)); _for_each_inner!((RTC_GPIO15, GPIO15));
670        _for_each_inner!((RTC_GPIO16, GPIO16)); _for_each_inner!((RTC_GPIO17, GPIO17));
671        _for_each_inner!((RTC_GPIO18, GPIO18)); _for_each_inner!((RTC_GPIO19, GPIO19));
672        _for_each_inner!((RTC_GPIO20, GPIO20)); _for_each_inner!((RTC_GPIO21, GPIO21));
673        _for_each_inner!(((RTC_GPIO0, RTC_GPIOn, 0), GPIO0));
674        _for_each_inner!(((RTC_GPIO1, RTC_GPIOn, 1), GPIO1));
675        _for_each_inner!(((RTC_GPIO2, RTC_GPIOn, 2), GPIO2));
676        _for_each_inner!(((RTC_GPIO3, RTC_GPIOn, 3), GPIO3));
677        _for_each_inner!(((RTC_GPIO4, RTC_GPIOn, 4), GPIO4));
678        _for_each_inner!(((RTC_GPIO5, RTC_GPIOn, 5), GPIO5));
679        _for_each_inner!(((RTC_GPIO6, RTC_GPIOn, 6), GPIO6));
680        _for_each_inner!(((RTC_GPIO7, RTC_GPIOn, 7), GPIO7));
681        _for_each_inner!(((RTC_GPIO8, RTC_GPIOn, 8), GPIO8));
682        _for_each_inner!(((RTC_GPIO9, RTC_GPIOn, 9), GPIO9));
683        _for_each_inner!(((RTC_GPIO10, RTC_GPIOn, 10), GPIO10));
684        _for_each_inner!(((RTC_GPIO11, RTC_GPIOn, 11), GPIO11));
685        _for_each_inner!(((RTC_GPIO12, RTC_GPIOn, 12), GPIO12));
686        _for_each_inner!(((RTC_GPIO13, RTC_GPIOn, 13), GPIO13));
687        _for_each_inner!(((RTC_GPIO14, RTC_GPIOn, 14), GPIO14));
688        _for_each_inner!(((RTC_GPIO15, RTC_GPIOn, 15), GPIO15));
689        _for_each_inner!(((RTC_GPIO16, RTC_GPIOn, 16), GPIO16));
690        _for_each_inner!(((RTC_GPIO17, RTC_GPIOn, 17), GPIO17));
691        _for_each_inner!(((RTC_GPIO18, RTC_GPIOn, 18), GPIO18));
692        _for_each_inner!(((RTC_GPIO19, RTC_GPIOn, 19), GPIO19));
693        _for_each_inner!(((RTC_GPIO20, RTC_GPIOn, 20), GPIO20));
694        _for_each_inner!(((RTC_GPIO21, RTC_GPIOn, 21), GPIO21));
695        _for_each_inner!((all(RTC_GPIO0, GPIO0), (RTC_GPIO1, GPIO1), (RTC_GPIO2, GPIO2),
696        (RTC_GPIO3, GPIO3), (RTC_GPIO4, GPIO4), (RTC_GPIO5, GPIO5), (RTC_GPIO6, GPIO6),
697        (RTC_GPIO7, GPIO7), (RTC_GPIO8, GPIO8), (RTC_GPIO9, GPIO9), (RTC_GPIO10, GPIO10),
698        (RTC_GPIO11, GPIO11), (RTC_GPIO12, GPIO12), (RTC_GPIO13, GPIO13), (RTC_GPIO14,
699        GPIO14), (RTC_GPIO15, GPIO15), (RTC_GPIO16, GPIO16), (RTC_GPIO17, GPIO17),
700        (RTC_GPIO18, GPIO18), (RTC_GPIO19, GPIO19), (RTC_GPIO20, GPIO20), (RTC_GPIO21,
701        GPIO21))); _for_each_inner!((all_expanded((RTC_GPIO0, RTC_GPIOn, 0), GPIO0),
702        ((RTC_GPIO1, RTC_GPIOn, 1), GPIO1), ((RTC_GPIO2, RTC_GPIOn, 2), GPIO2),
703        ((RTC_GPIO3, RTC_GPIOn, 3), GPIO3), ((RTC_GPIO4, RTC_GPIOn, 4), GPIO4),
704        ((RTC_GPIO5, RTC_GPIOn, 5), GPIO5), ((RTC_GPIO6, RTC_GPIOn, 6), GPIO6),
705        ((RTC_GPIO7, RTC_GPIOn, 7), GPIO7), ((RTC_GPIO8, RTC_GPIOn, 8), GPIO8),
706        ((RTC_GPIO9, RTC_GPIOn, 9), GPIO9), ((RTC_GPIO10, RTC_GPIOn, 10), GPIO10),
707        ((RTC_GPIO11, RTC_GPIOn, 11), GPIO11), ((RTC_GPIO12, RTC_GPIOn, 12), GPIO12),
708        ((RTC_GPIO13, RTC_GPIOn, 13), GPIO13), ((RTC_GPIO14, RTC_GPIOn, 14), GPIO14),
709        ((RTC_GPIO15, RTC_GPIOn, 15), GPIO15), ((RTC_GPIO16, RTC_GPIOn, 16), GPIO16),
710        ((RTC_GPIO17, RTC_GPIOn, 17), GPIO17), ((RTC_GPIO18, RTC_GPIOn, 18), GPIO18),
711        ((RTC_GPIO19, RTC_GPIOn, 19), GPIO19), ((RTC_GPIO20, RTC_GPIOn, 20), GPIO20),
712        ((RTC_GPIO21, RTC_GPIOn, 21), GPIO21)));
713    };
714}
715/// Defines the `InputSignal` and `OutputSignal` enums.
716///
717/// This macro is intended to be called in esp-hal only.
718#[macro_export]
719#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
720macro_rules! define_io_mux_signals {
721    () => {
722        #[allow(non_camel_case_types, clippy::upper_case_acronyms)]
723        #[derive(Debug, PartialEq, Copy, Clone)]
724        #[cfg_attr(feature = "defmt", derive(defmt::Format))]
725        #[doc(hidden)]
726        pub enum InputSignal {
727            SPIQ              = 0,
728            SPID              = 1,
729            SPIHD             = 2,
730            SPIWP             = 3,
731            SPID4             = 7,
732            SPID5             = 8,
733            SPID6             = 9,
734            SPID7             = 10,
735            SPIDQS            = 11,
736            U0RXD             = 14,
737            U0CTS             = 15,
738            U0DSR             = 16,
739            U1RXD             = 17,
740            U1CTS             = 18,
741            U1DSR             = 21,
742            I2S0O_BCK         = 23,
743            I2S0O_WS          = 25,
744            I2S0I_BCK         = 27,
745            I2S0I_WS          = 28,
746            I2CEXT0_SCL       = 29,
747            I2CEXT0_SDA       = 30,
748            PCNT0_SIG_CH0     = 39,
749            PCNT0_SIG_CH1     = 40,
750            PCNT0_CTRL_CH0    = 41,
751            PCNT0_CTRL_CH1    = 42,
752            PCNT1_SIG_CH0     = 43,
753            PCNT1_SIG_CH1     = 44,
754            PCNT1_CTRL_CH0    = 45,
755            PCNT1_CTRL_CH1    = 46,
756            PCNT2_SIG_CH0     = 47,
757            PCNT2_SIG_CH1     = 48,
758            PCNT2_CTRL_CH0    = 49,
759            PCNT2_CTRL_CH1    = 50,
760            PCNT3_SIG_CH0     = 51,
761            PCNT3_SIG_CH1     = 52,
762            PCNT3_CTRL_CH0    = 53,
763            PCNT3_CTRL_CH1    = 54,
764            USB_EXTPHY_VP     = 61,
765            USB_EXTPHY_VM     = 62,
766            USB_EXTPHY_RCV    = 63,
767            USB_OTG_IDDIG     = 64,
768            USB_OTG_AVALID    = 65,
769            USB_SRP_BVALID    = 66,
770            USB_OTG_VBUSVALID = 67,
771            USB_SRP_SESSEND   = 68,
772            SPI3_CLK          = 72,
773            SPI3_Q            = 73,
774            SPI3_D            = 74,
775            SPI3_HD           = 75,
776            SPI3_CS0          = 76,
777            RMT_SIG_0         = 83,
778            RMT_SIG_1         = 84,
779            RMT_SIG_2         = 85,
780            RMT_SIG_3         = 86,
781            I2CEXT1_SCL       = 95,
782            I2CEXT1_SDA       = 96,
783            FSPICLK           = 108,
784            FSPIQ             = 109,
785            FSPID             = 110,
786            FSPIHD            = 111,
787            FSPIWP            = 112,
788            FSPIIO4           = 113,
789            FSPIIO5           = 114,
790            FSPIIO6           = 115,
791            FSPIIO7           = 116,
792            FSPICS0           = 117,
793            TWAI_RX           = 123,
794            SUBSPIQ           = 127,
795            SUBSPID           = 128,
796            SUBSPIHD          = 129,
797            SUBSPIWP          = 130,
798            I2S0I_DATA_IN15   = 158,
799            SUBSPID4          = 167,
800            SUBSPID5          = 168,
801            SUBSPID6          = 169,
802            SUBSPID7          = 170,
803            SUBSPIDQS         = 171,
804            PCMFSYNC          = 203,
805            PCMCLK            = 204,
806            PRO_ALONEGPIO_IN0 = 235,
807            PRO_ALONEGPIO_IN1 = 236,
808            PRO_ALONEGPIO_IN2 = 237,
809            PRO_ALONEGPIO_IN3 = 238,
810            PRO_ALONEGPIO_IN4 = 239,
811            PRO_ALONEGPIO_IN5 = 240,
812            PRO_ALONEGPIO_IN6 = 241,
813            PRO_ALONEGPIO_IN7 = 242,
814            MTDI,
815            MTCK,
816            MTMS,
817        }
818        #[allow(non_camel_case_types, clippy::upper_case_acronyms)]
819        #[derive(Debug, PartialEq, Copy, Clone)]
820        #[cfg_attr(feature = "defmt", derive(defmt::Format))]
821        #[doc(hidden)]
822        pub enum OutputSignal {
823            SPIQ               = 0,
824            SPID               = 1,
825            SPIHD              = 2,
826            SPIWP              = 3,
827            SPICLK             = 4,
828            SPICS0             = 5,
829            SPICS1             = 6,
830            SPID4              = 7,
831            SPID5              = 8,
832            SPID6              = 9,
833            SPID7              = 10,
834            SPIDQS             = 11,
835            U0TXD              = 14,
836            U0RTS              = 15,
837            U0DTR              = 16,
838            U1TXD              = 17,
839            U1RTS              = 18,
840            U1DTR              = 21,
841            I2S0O_BCK          = 23,
842            I2S0O_WS           = 25,
843            I2S0I_BCK          = 27,
844            I2S0I_WS           = 28,
845            I2CEXT0_SCL        = 29,
846            I2CEXT0_SDA        = 30,
847            SDIO_TOHOST_INT    = 31,
848            USB_EXTPHY_OEN     = 61,
849            USB_EXTPHY_VPO     = 63,
850            USB_EXTPHY_VMO     = 64,
851            SPI3_CLK           = 72,
852            SPI3_Q             = 73,
853            SPI3_D             = 74,
854            SPI3_HD            = 75,
855            SPI3_CS0           = 76,
856            SPI3_CS1           = 77,
857            SPI3_CS2           = 78,
858            LEDC_LS_SIG0       = 79,
859            LEDC_LS_SIG1       = 80,
860            LEDC_LS_SIG2       = 81,
861            LEDC_LS_SIG3       = 82,
862            LEDC_LS_SIG4       = 83,
863            LEDC_LS_SIG5       = 84,
864            LEDC_LS_SIG6       = 85,
865            LEDC_LS_SIG7       = 86,
866            RMT_SIG_0          = 87,
867            RMT_SIG_1          = 88,
868            RMT_SIG_2          = 89,
869            RMT_SIG_3          = 90,
870            I2CEXT1_SCL        = 95,
871            I2CEXT1_SDA        = 96,
872            GPIO_SD0           = 100,
873            GPIO_SD1           = 101,
874            GPIO_SD2           = 102,
875            GPIO_SD3           = 103,
876            GPIO_SD4           = 104,
877            GPIO_SD5           = 105,
878            GPIO_SD6           = 106,
879            GPIO_SD7           = 107,
880            FSPICLK            = 108,
881            FSPIQ              = 109,
882            FSPID              = 110,
883            FSPIHD             = 111,
884            FSPIWP             = 112,
885            FSPIIO4            = 113,
886            FSPIIO5            = 114,
887            FSPIIO6            = 115,
888            FSPIIO7            = 116,
889            FSPICS0            = 117,
890            FSPICS1            = 118,
891            FSPICS2            = 119,
892            FSPICS3            = 120,
893            FSPICS4            = 121,
894            FSPICS5            = 122,
895            TWAI_TX            = 123,
896            SUBSPICLK          = 126,
897            SUBSPIQ            = 127,
898            SUBSPID            = 128,
899            SUBSPIHD           = 129,
900            SUBSPIWP           = 130,
901            SUBSPICS0          = 131,
902            SUBSPICS1          = 132,
903            FSPIDQS            = 133,
904            FSPI_HSYNC         = 134,
905            FSPI_VSYNC         = 135,
906            FSPI_DE            = 136,
907            FSPICD             = 137,
908            SPI3_CD            = 139,
909            SPI3_DQS           = 140,
910            I2S0O_DATA_OUT23   = 166,
911            SUBSPID4           = 167,
912            SUBSPID5           = 168,
913            SUBSPID6           = 169,
914            SUBSPID7           = 170,
915            SUBSPIDQS          = 171,
916            PCMFSYNC           = 209,
917            PCMCLK             = 210,
918            PRO_ALONEGPIO_OUT0 = 235,
919            PRO_ALONEGPIO_OUT1 = 236,
920            PRO_ALONEGPIO_OUT2 = 237,
921            PRO_ALONEGPIO_OUT3 = 238,
922            PRO_ALONEGPIO_OUT4 = 239,
923            PRO_ALONEGPIO_OUT5 = 240,
924            PRO_ALONEGPIO_OUT6 = 241,
925            PRO_ALONEGPIO_OUT7 = 242,
926            CLK_I2S            = 251,
927            GPIO               = 256,
928            CLK_OUT1,
929            CLK_OUT2,
930            CLK_OUT3,
931            MTDO,
932        }
933    };
934}
935/// Defines and implements the `io_mux_reg` function.
936///
937/// The generated function has the following signature:
938///
939/// ```rust,ignore
940/// pub(crate) fn io_mux_reg(gpio_num: u8) -> &'static crate::pac::io_mux::GPIO0 {
941///     // ...
942/// # unimplemented!()
943/// }
944/// ```
945///
946/// This macro is intended to be called in esp-hal only.
947#[macro_export]
948#[expect(clippy::crate_in_macro_def)]
949#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
950macro_rules! define_io_mux_reg {
951    () => {
952        pub(crate) fn io_mux_reg(gpio_num: u8) -> &'static crate::pac::io_mux::GPIO {
953            crate::peripherals::IO_MUX::regs().gpio(gpio_num as usize)
954        }
955    };
956}