esp_metadata_generated/
_generated_esp32.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        "esp32"
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        "esp32"
26    };
27    ("arch") => {
28        "xtensa"
29    };
30    ("cores") => {
31        2
32    };
33    ("cores", str) => {
34        stringify!(2)
35    };
36    ("trm") => {
37        "https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf"
38    };
39    ("gpio.has_bank_1") => {
40        true
41    };
42    ("gpio.gpio_function") => {
43        2
44    };
45    ("gpio.gpio_function", str) => {
46        stringify!(2)
47    };
48    ("gpio.constant_0_input") => {
49        48
50    };
51    ("gpio.constant_0_input", str) => {
52        stringify!(48)
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        true
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        206
71    };
72    ("gpio.input_signal_max", str) => {
73        stringify!(206)
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        false
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        false
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        1048575
119    };
120    ("i2c_master.max_bus_timeout", str) => {
121        stringify!(1048575)
122    };
123    ("i2c_master.ll_intr_mask") => {
124        262143
125    };
126    ("i2c_master.ll_intr_mask", str) => {
127        stringify!(262143)
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        1073047552
143    };
144    ("rmt.ram_start", str) => {
145        stringify!(1073047552)
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        false
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        1073405952..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!((UART2, Uart2, U2RXD, U2TXD, U2CTS, U2RTS));
222        _for_each_inner!((all(UART0, Uart0, U0RXD, U0TXD, U0CTS, U0RTS), (UART1, Uart1,
223        U1RXD, U1TXD, U1CTS, U1RTS), (UART2, Uart2, U2RXD, U2TXD, U2CTS, U2RTS)));
224    };
225}
226/// This macro can be used to generate code for each peripheral instance of the SPI master driver.
227///
228/// For an explanation on the general syntax, as well as usage of individual/repeated
229/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
230///
231/// This macro has one option for its "Individual matcher" case:
232///
233/// Syntax: `($instance:ident, $sys:ident, $sclk:ident, [$($cs:ident),*] [$($sio:ident),*
234/// $($is_qspi:iteral)?])`
235///
236/// Macro fragments:
237///
238/// - `$instance`: the name of the SPI instance
239/// - `$sys`: the name of the instance as it is in the `esp_hal::system::Peripheral` enum.
240/// - `$cs`, `$sio`: chip select and SIO signal names.
241/// - `$is_qspi`: a `true` literal present if the SPI instance supports QSPI.
242///
243/// Example data:
244/// - `(SPI2, Spi2, FSPICLK [FSPICS0, FSPICS1, FSPICS2, FSPICS3, FSPICS4, FSPICS5] [FSPID, FSPIQ,
245///   FSPIWP, FSPIHD, FSPIIO4, FSPIIO5, FSPIIO6, FSPIIO7], true)`
246/// - `(SPI3, Spi3, SPI3_CLK [SPI3_CS0, SPI3_CS1, SPI3_CS2] [SPI3_D, SPI3_Q])`
247#[macro_export]
248#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
249macro_rules! for_each_spi_master {
250    ($($pattern:tt => $code:tt;)*) => {
251        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
252        _for_each_inner!((SPI2, Spi2, HSPICLK[HSPICS0, HSPICS1, HSPICS2] [HSPID, HSPIQ,
253        HSPIWP, HSPIHD], true)); _for_each_inner!((SPI3, Spi3, VSPICLK[VSPICS0, VSPICS1,
254        VSPICS2] [VSPID, VSPIQ, VSPIWP, VSPIHD], true)); _for_each_inner!((all(SPI2,
255        Spi2, HSPICLK[HSPICS0, HSPICS1, HSPICS2] [HSPID, HSPIQ, HSPIWP, HSPIHD], true),
256        (SPI3, Spi3, VSPICLK[VSPICS0, VSPICS1, VSPICS2] [VSPID, VSPIQ, VSPIWP, VSPIHD],
257        true)));
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, HSPICLK, HSPID, HSPIQ, HSPICS0));
282        _for_each_inner!((SPI3, Spi3, VSPICLK, VSPID, VSPIQ, VSPICS0));
283        _for_each_inner!((all(SPI2, Spi2, HSPICLK, HSPID, HSPIQ, HSPICS0), (SPI3, Spi3,
284        VSPICLK, VSPID, VSPIQ, VSPICS0)));
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!((GPIO22 <= virtual())); _for_each_inner!((GPIO23 <= virtual()));
304        _for_each_inner!((GPIO25 <= virtual())); _for_each_inner!((GPIO26 <= virtual()));
305        _for_each_inner!((GPIO27 <= virtual())); _for_each_inner!((GPIO32 <= virtual()));
306        _for_each_inner!((GPIO33 <= virtual())); _for_each_inner!((GPIO34 <= virtual()));
307        _for_each_inner!((GPIO35 <= virtual())); _for_each_inner!((GPIO36 <= virtual()));
308        _for_each_inner!((GPIO37 <= virtual())); _for_each_inner!((GPIO38 <= virtual()));
309        _for_each_inner!((GPIO39 <= virtual())); _for_each_inner!((AES <= AES()
310        (unstable))); _for_each_inner!((APB_CTRL <= APB_CTRL() (unstable)));
311        _for_each_inner!((BB <= BB() (unstable))); _for_each_inner!((DPORT <= DPORT()
312        (unstable))); _for_each_inner!((SYSTEM <= DPORT() (unstable)));
313        _for_each_inner!((EFUSE <= EFUSE() (unstable))); _for_each_inner!((EMAC_DMA <=
314        EMAC_DMA() (unstable))); _for_each_inner!((EMAC_EXT <= EMAC_EXT() (unstable)));
315        _for_each_inner!((EMAC_MAC <= EMAC_MAC() (unstable)));
316        _for_each_inner!((FLASH_ENCRYPTION <= FLASH_ENCRYPTION() (unstable)));
317        _for_each_inner!((FRC_TIMER <= FRC_TIMER() (unstable))); _for_each_inner!((GPIO
318        <= GPIO() (unstable))); _for_each_inner!((GPIO_SD <= GPIO_SD() (unstable)));
319        _for_each_inner!((HINF <= HINF() (unstable))); _for_each_inner!((I2C0 <=
320        I2C0(I2C_EXT0 : { bind_peri_interrupt, enable_peri_interrupt,
321        disable_peri_interrupt }))); _for_each_inner!((I2C1 <= I2C1(I2C_EXT1 : {
322        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })));
323        _for_each_inner!((I2S0 <= I2S0(I2S0 : { bind_peri_interrupt,
324        enable_peri_interrupt, disable_peri_interrupt }) (unstable)));
325        _for_each_inner!((I2S1 <= I2S1(I2S1 : { bind_peri_interrupt,
326        enable_peri_interrupt, disable_peri_interrupt }) (unstable)));
327        _for_each_inner!((IO_MUX <= IO_MUX() (unstable))); _for_each_inner!((LEDC <=
328        LEDC() (unstable))); _for_each_inner!((MCPWM0 <= MCPWM0() (unstable)));
329        _for_each_inner!((MCPWM1 <= MCPWM1() (unstable))); _for_each_inner!((NRX <= NRX()
330        (unstable))); _for_each_inner!((PCNT <= PCNT() (unstable)));
331        _for_each_inner!((RMT <= RMT() (unstable))); _for_each_inner!((RNG <= RNG()
332        (unstable))); _for_each_inner!((RSA <= RSA() (unstable))); _for_each_inner!((LPWR
333        <= RTC_CNTL() (unstable))); _for_each_inner!((RTC_I2C <= RTC_I2C() (unstable)));
334        _for_each_inner!((RTC_IO <= RTC_IO() (unstable))); _for_each_inner!((SDHOST <=
335        SDHOST() (unstable))); _for_each_inner!((SENS <= SENS() (unstable)));
336        _for_each_inner!((SHA <= SHA() (unstable))); _for_each_inner!((SLC <= SLC()
337        (unstable))); _for_each_inner!((SLCHOST <= SLCHOST() (unstable)));
338        _for_each_inner!((SPI0 <= SPI0() (unstable))); _for_each_inner!((SPI1 <= SPI1()
339        (unstable))); _for_each_inner!((SPI2 <= SPI2(SPI2_DMA : { bind_dma_interrupt,
340        enable_dma_interrupt, disable_dma_interrupt }, SPI2 : { bind_peri_interrupt,
341        enable_peri_interrupt, disable_peri_interrupt }))); _for_each_inner!((SPI3 <=
342        SPI3(SPI3_DMA : { bind_dma_interrupt, enable_dma_interrupt, disable_dma_interrupt
343        }, SPI3 : { bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt
344        }))); _for_each_inner!((TIMG0 <= TIMG0() (unstable))); _for_each_inner!((TIMG1 <=
345        TIMG1() (unstable))); _for_each_inner!((TWAI0 <= TWAI0() (unstable)));
346        _for_each_inner!((UART0 <= UART0(UART0 : { bind_peri_interrupt,
347        enable_peri_interrupt, disable_peri_interrupt }))); _for_each_inner!((UART1 <=
348        UART1(UART1 : { bind_peri_interrupt, enable_peri_interrupt,
349        disable_peri_interrupt }))); _for_each_inner!((UART2 <= UART2(UART2 : {
350        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })));
351        _for_each_inner!((UHCI0 <= UHCI0() (unstable))); _for_each_inner!((UHCI1 <=
352        UHCI1() (unstable))); _for_each_inner!((WIFI <= WIFI() (unstable)));
353        _for_each_inner!((DMA_SPI2 <= SPI2() (unstable))); _for_each_inner!((DMA_SPI3 <=
354        SPI3() (unstable))); _for_each_inner!((DMA_I2S0 <= I2S0() (unstable)));
355        _for_each_inner!((DMA_I2S1 <= I2S1() (unstable))); _for_each_inner!((ADC1 <=
356        virtual() (unstable))); _for_each_inner!((ADC2 <= virtual() (unstable)));
357        _for_each_inner!((BT <= virtual() (unstable))); _for_each_inner!((CPU_CTRL <=
358        virtual() (unstable))); _for_each_inner!((DAC1 <= virtual() (unstable)));
359        _for_each_inner!((DAC2 <= virtual() (unstable))); _for_each_inner!((PSRAM <=
360        virtual() (unstable))); _for_each_inner!((SW_INTERRUPT <= virtual() (unstable)));
361        _for_each_inner!((TOUCH <= virtual() (unstable))); _for_each_inner!((all(GPIO0 <=
362        virtual()), (GPIO1 <= virtual()), (GPIO2 <= virtual()), (GPIO3 <= virtual()),
363        (GPIO4 <= virtual()), (GPIO5 <= virtual()), (GPIO6 <= virtual()), (GPIO7 <=
364        virtual()), (GPIO8 <= virtual()), (GPIO9 <= virtual()), (GPIO10 <= virtual()),
365        (GPIO11 <= virtual()), (GPIO12 <= virtual()), (GPIO13 <= virtual()), (GPIO14 <=
366        virtual()), (GPIO15 <= virtual()), (GPIO16 <= virtual()), (GPIO17 <= virtual()),
367        (GPIO18 <= virtual()), (GPIO19 <= virtual()), (GPIO20 <= virtual()), (GPIO21 <=
368        virtual()), (GPIO22 <= virtual()), (GPIO23 <= virtual()), (GPIO25 <= virtual()),
369        (GPIO26 <= virtual()), (GPIO27 <= virtual()), (GPIO32 <= virtual()), (GPIO33 <=
370        virtual()), (GPIO34 <= virtual()), (GPIO35 <= virtual()), (GPIO36 <= virtual()),
371        (GPIO37 <= virtual()), (GPIO38 <= virtual()), (GPIO39 <= virtual()), (AES <=
372        AES() (unstable)), (APB_CTRL <= APB_CTRL() (unstable)), (BB <= BB() (unstable)),
373        (DPORT <= DPORT() (unstable)), (SYSTEM <= DPORT() (unstable)), (EFUSE <= EFUSE()
374        (unstable)), (EMAC_DMA <= EMAC_DMA() (unstable)), (EMAC_EXT <= EMAC_EXT()
375        (unstable)), (EMAC_MAC <= EMAC_MAC() (unstable)), (FLASH_ENCRYPTION <=
376        FLASH_ENCRYPTION() (unstable)), (FRC_TIMER <= FRC_TIMER() (unstable)), (GPIO <=
377        GPIO() (unstable)), (GPIO_SD <= GPIO_SD() (unstable)), (HINF <= HINF()
378        (unstable)), (I2C0 <= I2C0(I2C_EXT0 : { bind_peri_interrupt,
379        enable_peri_interrupt, disable_peri_interrupt })), (I2C1 <= I2C1(I2C_EXT1 : {
380        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })), (I2S0 <=
381        I2S0(I2S0 : { bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt
382        }) (unstable)), (I2S1 <= I2S1(I2S1 : { bind_peri_interrupt,
383        enable_peri_interrupt, disable_peri_interrupt }) (unstable)), (IO_MUX <= IO_MUX()
384        (unstable)), (LEDC <= LEDC() (unstable)), (MCPWM0 <= MCPWM0() (unstable)),
385        (MCPWM1 <= MCPWM1() (unstable)), (NRX <= NRX() (unstable)), (PCNT <= PCNT()
386        (unstable)), (RMT <= RMT() (unstable)), (RNG <= RNG() (unstable)), (RSA <= RSA()
387        (unstable)), (LPWR <= RTC_CNTL() (unstable)), (RTC_I2C <= RTC_I2C() (unstable)),
388        (RTC_IO <= RTC_IO() (unstable)), (SDHOST <= SDHOST() (unstable)), (SENS <= SENS()
389        (unstable)), (SHA <= SHA() (unstable)), (SLC <= SLC() (unstable)), (SLCHOST <=
390        SLCHOST() (unstable)), (SPI0 <= SPI0() (unstable)), (SPI1 <= SPI1() (unstable)),
391        (SPI2 <= SPI2(SPI2_DMA : { bind_dma_interrupt, enable_dma_interrupt,
392        disable_dma_interrupt }, SPI2 : { bind_peri_interrupt, enable_peri_interrupt,
393        disable_peri_interrupt })), (SPI3 <= SPI3(SPI3_DMA : { bind_dma_interrupt,
394        enable_dma_interrupt, disable_dma_interrupt }, SPI3 : { bind_peri_interrupt,
395        enable_peri_interrupt, disable_peri_interrupt })), (TIMG0 <= TIMG0() (unstable)),
396        (TIMG1 <= TIMG1() (unstable)), (TWAI0 <= TWAI0() (unstable)), (UART0 <=
397        UART0(UART0 : { bind_peri_interrupt, enable_peri_interrupt,
398        disable_peri_interrupt })), (UART1 <= UART1(UART1 : { bind_peri_interrupt,
399        enable_peri_interrupt, disable_peri_interrupt })), (UART2 <= UART2(UART2 : {
400        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })), (UHCI0 <=
401        UHCI0() (unstable)), (UHCI1 <= UHCI1() (unstable)), (WIFI <= WIFI() (unstable)),
402        (DMA_SPI2 <= SPI2() (unstable)), (DMA_SPI3 <= SPI3() (unstable)), (DMA_I2S0 <=
403        I2S0() (unstable)), (DMA_I2S1 <= I2S1() (unstable)), (ADC1 <= virtual()
404        (unstable)), (ADC2 <= virtual() (unstable)), (BT <= virtual() (unstable)),
405        (CPU_CTRL <= virtual() (unstable)), (DAC1 <= virtual() (unstable)), (DAC2 <=
406        virtual() (unstable)), (PSRAM <= virtual() (unstable)), (SW_INTERRUPT <=
407        virtual() (unstable)), (TOUCH <= 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(_5 => EMAC_TX_CLK) (_1 => CLK_OUT1 _5 => EMAC_TX_CLK)
442        ([Input] [Output]))); _for_each_inner!((1, GPIO1(_5 => EMAC_RXD2) (_0 => U0TXD _1
443        => CLK_OUT3) ([Input] [Output]))); _for_each_inner!((2, GPIO2(_1 => HSPIWP _3 =>
444        HS2_DATA0 _4 => SD_DATA0) (_1 => HSPIWP _3 => HS2_DATA0 _4 => SD_DATA0) ([Input]
445        [Output]))); _for_each_inner!((3, GPIO3(_0 => U0RXD) (_1 => CLK_OUT2) ([Input]
446        [Output]))); _for_each_inner!((4, GPIO4(_1 => HSPIHD _3 => HS2_DATA1 _4 =>
447        SD_DATA1 _5 => EMAC_TX_ER) (_1 => HSPIHD _3 => HS2_DATA1 _4 => SD_DATA1 _5 =>
448        EMAC_TX_ER) ([Input] [Output]))); _for_each_inner!((5, GPIO5(_1 => VSPICS0 _3 =>
449        HS1_DATA6 _5 => EMAC_RX_CLK) (_1 => VSPICS0 _3 => HS1_DATA6) ([Input]
450        [Output]))); _for_each_inner!((6, GPIO6(_1 => SPICLK _4 => U1CTS) (_0 => SD_CLK
451        _1 => SPICLK _3 => HS1_CLK) ([Input] [Output]))); _for_each_inner!((7, GPIO7(_0
452        => SD_DATA0 _1 => SPIQ _3 => HS1_DATA0) (_0 => SD_DATA0 _1 => SPIQ _3 =>
453        HS1_DATA0 _4 => U2RTS) ([Input] [Output]))); _for_each_inner!((8, GPIO8(_0 =>
454        SD_DATA1 _1 => SPID _3 => HS1_DATA1 _4 => U2CTS) (_0 => SD_DATA1 _1 => SPID _3 =>
455        HS1_DATA1) ([Input] [Output]))); _for_each_inner!((9, GPIO9(_0 => SD_DATA2 _1 =>
456        SPIHD _3 => HS1_DATA2 _4 => U1RXD) (_0 => SD_DATA2 _1 => SPIHD _3 => HS1_DATA2)
457        ([Input] [Output]))); _for_each_inner!((10, GPIO10(_0 => SD_DATA3 _1 => SPIWP _3
458        => HS1_DATA3) (_0 => SD_DATA3 _1 => SPIWP _3 => HS1_DATA3 _4 => U1TXD) ([Input]
459        [Output]))); _for_each_inner!((11, GPIO11(_0 => SD_CMD _1 => SPICS0) (_0 =>
460        SD_CMD _1 => SPICS0 _3 => HS1_CMD _4 => U1RTS) ([Input] [Output])));
461        _for_each_inner!((12, GPIO12(_0 => MTDI _1 => HSPIQ _3 => HS2_DATA2 _4 =>
462        SD_DATA2) (_1 => HSPIQ _3 => HS2_DATA2 _4 => SD_DATA2 _5 => EMAC_TXD3) ([Input]
463        [Output]))); _for_each_inner!((13, GPIO13(_0 => MTCK _1 => HSPID _3 => HS2_DATA3
464        _4 => SD_DATA3 _5 => EMAC_RX_ER) (_1 => HSPID _3 => HS2_DATA3 _4 => SD_DATA3 _5
465        => EMAC_RX_ER) ([Input] [Output]))); _for_each_inner!((14, GPIO14(_0 => MTMS _1
466        => HSPICLK) (_1 => HSPICLK _3 => HS2_CLK _4 => SD_CLK _5 => EMAC_TXD2) ([Input]
467        [Output]))); _for_each_inner!((15, GPIO15(_1 => HSPICS0 _4 => SD_CMD _5 =>
468        EMAC_RXD3) (_0 => MTDO _1 => HSPICS0 _3 => HS2_CMD _4 => SD_CMD) ([Input]
469        [Output]))); _for_each_inner!((16, GPIO16(_3 => HS1_DATA4 _4 => U2RXD) (_3 =>
470        HS1_DATA4 _5 => EMAC_CLK_OUT) ([Input] [Output]))); _for_each_inner!((17,
471        GPIO17(_3 => HS1_DATA5) (_3 => HS1_DATA5 _4 => U2TXD _5 => EMAC_CLK_180) ([Input]
472        [Output]))); _for_each_inner!((18, GPIO18(_1 => VSPICLK _3 => HS1_DATA7) (_1 =>
473        VSPICLK _3 => HS1_DATA7) ([Input] [Output]))); _for_each_inner!((19, GPIO19(_1 =>
474        VSPIQ _3 => U0CTS) (_1 => VSPIQ _5 => EMAC_TXD0) ([Input] [Output])));
475        _for_each_inner!((20, GPIO20() () ([Input] [Output]))); _for_each_inner!((21,
476        GPIO21(_1 => VSPIHD) (_1 => VSPIHD _5 => EMAC_TX_EN) ([Input] [Output])));
477        _for_each_inner!((22, GPIO22(_1 => VSPIWP) (_1 => VSPIWP _3 => U0RTS _5 =>
478        EMAC_TXD1) ([Input] [Output]))); _for_each_inner!((23, GPIO23(_1 => VSPID) (_1 =>
479        VSPID _3 => HS1_STROBE) ([Input] [Output]))); _for_each_inner!((25, GPIO25(_5 =>
480        EMAC_RXD0) () ([Input] [Output]))); _for_each_inner!((26, GPIO26(_5 => EMAC_RXD1)
481        () ([Input] [Output]))); _for_each_inner!((27, GPIO27(_5 => EMAC_RX_DV) ()
482        ([Input] [Output]))); _for_each_inner!((32, GPIO32() () ([Input] [Output])));
483        _for_each_inner!((33, GPIO33() () ([Input] [Output]))); _for_each_inner!((34,
484        GPIO34() () ([Input] []))); _for_each_inner!((35, GPIO35() () ([Input] [])));
485        _for_each_inner!((36, GPIO36() () ([Input] []))); _for_each_inner!((37, GPIO37()
486        () ([Input] []))); _for_each_inner!((38, GPIO38() () ([Input] [])));
487        _for_each_inner!((39, GPIO39() () ([Input] []))); _for_each_inner!((all(0,
488        GPIO0(_5 => EMAC_TX_CLK) (_1 => CLK_OUT1 _5 => EMAC_TX_CLK) ([Input] [Output])),
489        (1, GPIO1(_5 => EMAC_RXD2) (_0 => U0TXD _1 => CLK_OUT3) ([Input] [Output])), (2,
490        GPIO2(_1 => HSPIWP _3 => HS2_DATA0 _4 => SD_DATA0) (_1 => HSPIWP _3 => HS2_DATA0
491        _4 => SD_DATA0) ([Input] [Output])), (3, GPIO3(_0 => U0RXD) (_1 => CLK_OUT2)
492        ([Input] [Output])), (4, GPIO4(_1 => HSPIHD _3 => HS2_DATA1 _4 => SD_DATA1 _5 =>
493        EMAC_TX_ER) (_1 => HSPIHD _3 => HS2_DATA1 _4 => SD_DATA1 _5 => EMAC_TX_ER)
494        ([Input] [Output])), (5, GPIO5(_1 => VSPICS0 _3 => HS1_DATA6 _5 => EMAC_RX_CLK)
495        (_1 => VSPICS0 _3 => HS1_DATA6) ([Input] [Output])), (6, GPIO6(_1 => SPICLK _4 =>
496        U1CTS) (_0 => SD_CLK _1 => SPICLK _3 => HS1_CLK) ([Input] [Output])), (7,
497        GPIO7(_0 => SD_DATA0 _1 => SPIQ _3 => HS1_DATA0) (_0 => SD_DATA0 _1 => SPIQ _3 =>
498        HS1_DATA0 _4 => U2RTS) ([Input] [Output])), (8, GPIO8(_0 => SD_DATA1 _1 => SPID
499        _3 => HS1_DATA1 _4 => U2CTS) (_0 => SD_DATA1 _1 => SPID _3 => HS1_DATA1) ([Input]
500        [Output])), (9, GPIO9(_0 => SD_DATA2 _1 => SPIHD _3 => HS1_DATA2 _4 => U1RXD) (_0
501        => SD_DATA2 _1 => SPIHD _3 => HS1_DATA2) ([Input] [Output])), (10, GPIO10(_0 =>
502        SD_DATA3 _1 => SPIWP _3 => HS1_DATA3) (_0 => SD_DATA3 _1 => SPIWP _3 => HS1_DATA3
503        _4 => U1TXD) ([Input] [Output])), (11, GPIO11(_0 => SD_CMD _1 => SPICS0) (_0 =>
504        SD_CMD _1 => SPICS0 _3 => HS1_CMD _4 => U1RTS) ([Input] [Output])), (12,
505        GPIO12(_0 => MTDI _1 => HSPIQ _3 => HS2_DATA2 _4 => SD_DATA2) (_1 => HSPIQ _3 =>
506        HS2_DATA2 _4 => SD_DATA2 _5 => EMAC_TXD3) ([Input] [Output])), (13, GPIO13(_0 =>
507        MTCK _1 => HSPID _3 => HS2_DATA3 _4 => SD_DATA3 _5 => EMAC_RX_ER) (_1 => HSPID _3
508        => HS2_DATA3 _4 => SD_DATA3 _5 => EMAC_RX_ER) ([Input] [Output])), (14, GPIO14(_0
509        => MTMS _1 => HSPICLK) (_1 => HSPICLK _3 => HS2_CLK _4 => SD_CLK _5 => EMAC_TXD2)
510        ([Input] [Output])), (15, GPIO15(_1 => HSPICS0 _4 => SD_CMD _5 => EMAC_RXD3) (_0
511        => MTDO _1 => HSPICS0 _3 => HS2_CMD _4 => SD_CMD) ([Input] [Output])), (16,
512        GPIO16(_3 => HS1_DATA4 _4 => U2RXD) (_3 => HS1_DATA4 _5 => EMAC_CLK_OUT) ([Input]
513        [Output])), (17, GPIO17(_3 => HS1_DATA5) (_3 => HS1_DATA5 _4 => U2TXD _5 =>
514        EMAC_CLK_180) ([Input] [Output])), (18, GPIO18(_1 => VSPICLK _3 => HS1_DATA7) (_1
515        => VSPICLK _3 => HS1_DATA7) ([Input] [Output])), (19, GPIO19(_1 => VSPIQ _3 =>
516        U0CTS) (_1 => VSPIQ _5 => EMAC_TXD0) ([Input] [Output])), (20, GPIO20() ()
517        ([Input] [Output])), (21, GPIO21(_1 => VSPIHD) (_1 => VSPIHD _5 => EMAC_TX_EN)
518        ([Input] [Output])), (22, GPIO22(_1 => VSPIWP) (_1 => VSPIWP _3 => U0RTS _5 =>
519        EMAC_TXD1) ([Input] [Output])), (23, GPIO23(_1 => VSPID) (_1 => VSPID _3 =>
520        HS1_STROBE) ([Input] [Output])), (25, GPIO25(_5 => EMAC_RXD0) () ([Input]
521        [Output])), (26, GPIO26(_5 => EMAC_RXD1) () ([Input] [Output])), (27, GPIO27(_5
522        => EMAC_RX_DV) () ([Input] [Output])), (32, GPIO32() () ([Input] [Output])), (33,
523        GPIO33() () ([Input] [Output])), (34, GPIO34() () ([Input] [])), (35, GPIO35() ()
524        ([Input] [])), (36, GPIO36() () ([Input] [])), (37, GPIO37() () ([Input] [])),
525        (38, GPIO38() () ([Input] [])), (39, GPIO39() () ([Input] []))));
526    };
527}
528/// This macro can be used to generate code for each analog function of each GPIO.
529///
530/// For an explanation on the general syntax, as well as usage of individual/repeated
531/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
532///
533/// This macro has two options for its "Individual matcher" case:
534///
535/// - `all`: `($signal:ident, $gpio:ident)` - simple case where you only need identifiers
536/// - `all_expanded`: `(($signal:ident, $group:ident $(, $number:literal)+), $gpio:ident)` -
537///   expanded signal case, where you need the number(s) of a signal, or the general group to which
538///   the signal belongs. For example, in case of `ADC2_CH3` the expanded form looks like
539///   `(ADC2_CH3, ADCn_CHm, 2, 3)`.
540///
541/// Macro fragments:
542///
543/// - `$signal`: the name of the signal.
544/// - `$group`: the name of the signal, with numbers replaced by placeholders. For `ADC2_CH3` this
545///   is `ADCn_CHm`.
546/// - `$number`: the numbers extracted from `$signal`.
547/// - `$gpio`: the name of the GPIO.
548///
549/// Example data:
550/// - `(ADC2_CH5, GPIO12)`
551/// - `((ADC2_CH5, ADCn_CHm, 2, 5), GPIO12)`
552///
553/// The expanded syntax is only available when the signal has at least one numbered component.
554#[macro_export]
555#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
556macro_rules! for_each_analog_function {
557    ($($pattern:tt => $code:tt;)*) => {
558        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
559        _for_each_inner!((ADC2_CH1, GPIO0)); _for_each_inner!((TOUCH1, GPIO0));
560        _for_each_inner!((ADC2_CH2, GPIO2)); _for_each_inner!((TOUCH2, GPIO2));
561        _for_each_inner!((ADC2_CH0, GPIO4)); _for_each_inner!((TOUCH0, GPIO4));
562        _for_each_inner!((ADC2_CH5, GPIO12)); _for_each_inner!((TOUCH5, GPIO12));
563        _for_each_inner!((ADC2_CH4, GPIO13)); _for_each_inner!((TOUCH4, GPIO13));
564        _for_each_inner!((ADC2_CH6, GPIO14)); _for_each_inner!((TOUCH6, GPIO14));
565        _for_each_inner!((ADC2_CH3, GPIO15)); _for_each_inner!((TOUCH3, GPIO15));
566        _for_each_inner!((DAC1, GPIO25)); _for_each_inner!((ADC2_CH8, GPIO25));
567        _for_each_inner!((DAC2, GPIO26)); _for_each_inner!((ADC2_CH9, GPIO26));
568        _for_each_inner!((ADC2_CH7, GPIO27)); _for_each_inner!((TOUCH7, GPIO27));
569        _for_each_inner!((XTAL_32K_P, GPIO32)); _for_each_inner!((ADC1_CH4, GPIO32));
570        _for_each_inner!((TOUCH9, GPIO32)); _for_each_inner!((XTAL_32K_N, GPIO33));
571        _for_each_inner!((ADC1_CH5, GPIO33)); _for_each_inner!((TOUCH8, GPIO33));
572        _for_each_inner!((ADC1_CH6, GPIO34)); _for_each_inner!((ADC1_CH7, GPIO35));
573        _for_each_inner!((ADC_H, GPIO36)); _for_each_inner!((ADC1_CH0, GPIO36));
574        _for_each_inner!((ADC_H, GPIO37)); _for_each_inner!((ADC1_CH1, GPIO37));
575        _for_each_inner!((ADC_H, GPIO38)); _for_each_inner!((ADC1_CH2, GPIO38));
576        _for_each_inner!((ADC_H, GPIO39)); _for_each_inner!((ADC1_CH3, GPIO39));
577        _for_each_inner!(((ADC2_CH1, ADCn_CHm, 2, 1), GPIO0)); _for_each_inner!(((TOUCH1,
578        TOUCHn, 1), GPIO0)); _for_each_inner!(((ADC2_CH2, ADCn_CHm, 2, 2), GPIO2));
579        _for_each_inner!(((TOUCH2, TOUCHn, 2), GPIO2)); _for_each_inner!(((ADC2_CH0,
580        ADCn_CHm, 2, 0), GPIO4)); _for_each_inner!(((TOUCH0, TOUCHn, 0), GPIO4));
581        _for_each_inner!(((ADC2_CH5, ADCn_CHm, 2, 5), GPIO12));
582        _for_each_inner!(((TOUCH5, TOUCHn, 5), GPIO12)); _for_each_inner!(((ADC2_CH4,
583        ADCn_CHm, 2, 4), GPIO13)); _for_each_inner!(((TOUCH4, TOUCHn, 4), GPIO13));
584        _for_each_inner!(((ADC2_CH6, ADCn_CHm, 2, 6), GPIO14));
585        _for_each_inner!(((TOUCH6, TOUCHn, 6), GPIO14)); _for_each_inner!(((ADC2_CH3,
586        ADCn_CHm, 2, 3), GPIO15)); _for_each_inner!(((TOUCH3, TOUCHn, 3), GPIO15));
587        _for_each_inner!(((DAC1, DACn, 1), GPIO25)); _for_each_inner!(((ADC2_CH8,
588        ADCn_CHm, 2, 8), GPIO25)); _for_each_inner!(((DAC2, DACn, 2), GPIO26));
589        _for_each_inner!(((ADC2_CH9, ADCn_CHm, 2, 9), GPIO26));
590        _for_each_inner!(((ADC2_CH7, ADCn_CHm, 2, 7), GPIO27));
591        _for_each_inner!(((TOUCH7, TOUCHn, 7), GPIO27)); _for_each_inner!(((ADC1_CH4,
592        ADCn_CHm, 1, 4), GPIO32)); _for_each_inner!(((TOUCH9, TOUCHn, 9), GPIO32));
593        _for_each_inner!(((ADC1_CH5, ADCn_CHm, 1, 5), GPIO33));
594        _for_each_inner!(((TOUCH8, TOUCHn, 8), GPIO33)); _for_each_inner!(((ADC1_CH6,
595        ADCn_CHm, 1, 6), GPIO34)); _for_each_inner!(((ADC1_CH7, ADCn_CHm, 1, 7),
596        GPIO35)); _for_each_inner!(((ADC1_CH0, ADCn_CHm, 1, 0), GPIO36));
597        _for_each_inner!(((ADC1_CH1, ADCn_CHm, 1, 1), GPIO37));
598        _for_each_inner!(((ADC1_CH2, ADCn_CHm, 1, 2), GPIO38));
599        _for_each_inner!(((ADC1_CH3, ADCn_CHm, 1, 3), GPIO39));
600        _for_each_inner!((all(ADC2_CH1, GPIO0), (TOUCH1, GPIO0), (ADC2_CH2, GPIO2),
601        (TOUCH2, GPIO2), (ADC2_CH0, GPIO4), (TOUCH0, GPIO4), (ADC2_CH5, GPIO12), (TOUCH5,
602        GPIO12), (ADC2_CH4, GPIO13), (TOUCH4, GPIO13), (ADC2_CH6, GPIO14), (TOUCH6,
603        GPIO14), (ADC2_CH3, GPIO15), (TOUCH3, GPIO15), (DAC1, GPIO25), (ADC2_CH8,
604        GPIO25), (DAC2, GPIO26), (ADC2_CH9, GPIO26), (ADC2_CH7, GPIO27), (TOUCH7,
605        GPIO27), (XTAL_32K_P, GPIO32), (ADC1_CH4, GPIO32), (TOUCH9, GPIO32), (XTAL_32K_N,
606        GPIO33), (ADC1_CH5, GPIO33), (TOUCH8, GPIO33), (ADC1_CH6, GPIO34), (ADC1_CH7,
607        GPIO35), (ADC_H, GPIO36), (ADC1_CH0, GPIO36), (ADC_H, GPIO37), (ADC1_CH1,
608        GPIO37), (ADC_H, GPIO38), (ADC1_CH2, GPIO38), (ADC_H, GPIO39), (ADC1_CH3,
609        GPIO39))); _for_each_inner!((all_expanded((ADC2_CH1, ADCn_CHm, 2, 1), GPIO0),
610        ((TOUCH1, TOUCHn, 1), GPIO0), ((ADC2_CH2, ADCn_CHm, 2, 2), GPIO2), ((TOUCH2,
611        TOUCHn, 2), GPIO2), ((ADC2_CH0, ADCn_CHm, 2, 0), GPIO4), ((TOUCH0, TOUCHn, 0),
612        GPIO4), ((ADC2_CH5, ADCn_CHm, 2, 5), GPIO12), ((TOUCH5, TOUCHn, 5), GPIO12),
613        ((ADC2_CH4, ADCn_CHm, 2, 4), GPIO13), ((TOUCH4, TOUCHn, 4), GPIO13), ((ADC2_CH6,
614        ADCn_CHm, 2, 6), GPIO14), ((TOUCH6, TOUCHn, 6), GPIO14), ((ADC2_CH3, ADCn_CHm, 2,
615        3), GPIO15), ((TOUCH3, TOUCHn, 3), GPIO15), ((DAC1, DACn, 1), GPIO25),
616        ((ADC2_CH8, ADCn_CHm, 2, 8), GPIO25), ((DAC2, DACn, 2), GPIO26), ((ADC2_CH9,
617        ADCn_CHm, 2, 9), GPIO26), ((ADC2_CH7, ADCn_CHm, 2, 7), GPIO27), ((TOUCH7, TOUCHn,
618        7), GPIO27), ((ADC1_CH4, ADCn_CHm, 1, 4), GPIO32), ((TOUCH9, TOUCHn, 9), GPIO32),
619        ((ADC1_CH5, ADCn_CHm, 1, 5), GPIO33), ((TOUCH8, TOUCHn, 8), GPIO33), ((ADC1_CH6,
620        ADCn_CHm, 1, 6), GPIO34), ((ADC1_CH7, ADCn_CHm, 1, 7), GPIO35), ((ADC1_CH0,
621        ADCn_CHm, 1, 0), GPIO36), ((ADC1_CH1, ADCn_CHm, 1, 1), GPIO37), ((ADC1_CH2,
622        ADCn_CHm, 1, 2), GPIO38), ((ADC1_CH3, ADCn_CHm, 1, 3), GPIO39)));
623    };
624}
625/// This macro can be used to generate code for each LP/RTC function of each GPIO.
626///
627/// For an explanation on the general syntax, as well as usage of individual/repeated
628/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
629///
630/// This macro has two options for its "Individual matcher" case:
631///
632/// - `all`: `($signal:ident, $gpio:ident)` - simple case where you only need identifiers
633/// - `all_expanded`: `(($signal:ident, $group:ident $(, $number:literal)+), $gpio:ident)` -
634///   expanded signal case, where you need the number(s) of a signal, or the general group to which
635///   the signal belongs. For example, in case of `SAR_I2C_SCL_1` the expanded form looks like
636///   `(SAR_I2C_SCL_1, SAR_I2C_SCL_n, 1)`.
637///
638/// Macro fragments:
639///
640/// - `$signal`: the name of the signal.
641/// - `$group`: the name of the signal, with numbers replaced by placeholders. For `ADC2_CH3` this
642///   is `ADCn_CHm`.
643/// - `$number`: the numbers extracted from `$signal`.
644/// - `$gpio`: the name of the GPIO.
645///
646/// Example data:
647/// - `(RTC_GPIO15, GPIO12)`
648/// - `((RTC_GPIO15, RTC_GPIOn, 15), GPIO12)`
649///
650/// The expanded syntax is only available when the signal has at least one numbered component.
651#[macro_export]
652#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
653macro_rules! for_each_lp_function {
654    ($($pattern:tt => $code:tt;)*) => {
655        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
656        _for_each_inner!((RTC_GPIO11, GPIO0)); _for_each_inner!((SAR_I2C_SDA, GPIO0));
657        _for_each_inner!((RTC_GPIO12, GPIO2)); _for_each_inner!((SAR_I2C_SCL, GPIO2));
658        _for_each_inner!((RTC_GPIO10, GPIO4)); _for_each_inner!((SAR_I2C_SCL, GPIO4));
659        _for_each_inner!((RTC_GPIO15, GPIO12)); _for_each_inner!((RTC_GPIO14, GPIO13));
660        _for_each_inner!((RTC_GPIO16, GPIO14)); _for_each_inner!((RTC_GPIO13, GPIO15));
661        _for_each_inner!((SAR_I2C_SDA, GPIO15)); _for_each_inner!((RTC_GPIO6, GPIO25));
662        _for_each_inner!((RTC_GPIO7, GPIO26)); _for_each_inner!((RTC_GPIO17, GPIO27));
663        _for_each_inner!((RTC_GPIO9, GPIO32)); _for_each_inner!((RTC_GPIO8, GPIO33));
664        _for_each_inner!((RTC_GPIO4, GPIO34)); _for_each_inner!((RTC_GPIO5, GPIO35));
665        _for_each_inner!((RTC_GPIO0, GPIO36)); _for_each_inner!((RTC_GPIO1, GPIO37));
666        _for_each_inner!((RTC_GPIO2, GPIO38)); _for_each_inner!((RTC_GPIO3, GPIO39));
667        _for_each_inner!(((RTC_GPIO11, RTC_GPIOn, 11), GPIO0));
668        _for_each_inner!(((RTC_GPIO12, RTC_GPIOn, 12), GPIO2));
669        _for_each_inner!(((RTC_GPIO10, RTC_GPIOn, 10), GPIO4));
670        _for_each_inner!(((RTC_GPIO15, RTC_GPIOn, 15), GPIO12));
671        _for_each_inner!(((RTC_GPIO14, RTC_GPIOn, 14), GPIO13));
672        _for_each_inner!(((RTC_GPIO16, RTC_GPIOn, 16), GPIO14));
673        _for_each_inner!(((RTC_GPIO13, RTC_GPIOn, 13), GPIO15));
674        _for_each_inner!(((RTC_GPIO6, RTC_GPIOn, 6), GPIO25));
675        _for_each_inner!(((RTC_GPIO7, RTC_GPIOn, 7), GPIO26));
676        _for_each_inner!(((RTC_GPIO17, RTC_GPIOn, 17), GPIO27));
677        _for_each_inner!(((RTC_GPIO9, RTC_GPIOn, 9), GPIO32));
678        _for_each_inner!(((RTC_GPIO8, RTC_GPIOn, 8), GPIO33));
679        _for_each_inner!(((RTC_GPIO4, RTC_GPIOn, 4), GPIO34));
680        _for_each_inner!(((RTC_GPIO5, RTC_GPIOn, 5), GPIO35));
681        _for_each_inner!(((RTC_GPIO0, RTC_GPIOn, 0), GPIO36));
682        _for_each_inner!(((RTC_GPIO1, RTC_GPIOn, 1), GPIO37));
683        _for_each_inner!(((RTC_GPIO2, RTC_GPIOn, 2), GPIO38));
684        _for_each_inner!(((RTC_GPIO3, RTC_GPIOn, 3), GPIO39));
685        _for_each_inner!((all(RTC_GPIO11, GPIO0), (SAR_I2C_SDA, GPIO0), (RTC_GPIO12,
686        GPIO2), (SAR_I2C_SCL, GPIO2), (RTC_GPIO10, GPIO4), (SAR_I2C_SCL, GPIO4),
687        (RTC_GPIO15, GPIO12), (RTC_GPIO14, GPIO13), (RTC_GPIO16, GPIO14), (RTC_GPIO13,
688        GPIO15), (SAR_I2C_SDA, GPIO15), (RTC_GPIO6, GPIO25), (RTC_GPIO7, GPIO26),
689        (RTC_GPIO17, GPIO27), (RTC_GPIO9, GPIO32), (RTC_GPIO8, GPIO33), (RTC_GPIO4,
690        GPIO34), (RTC_GPIO5, GPIO35), (RTC_GPIO0, GPIO36), (RTC_GPIO1, GPIO37),
691        (RTC_GPIO2, GPIO38), (RTC_GPIO3, GPIO39)));
692        _for_each_inner!((all_expanded((RTC_GPIO11, RTC_GPIOn, 11), GPIO0), ((RTC_GPIO12,
693        RTC_GPIOn, 12), GPIO2), ((RTC_GPIO10, RTC_GPIOn, 10), GPIO4), ((RTC_GPIO15,
694        RTC_GPIOn, 15), GPIO12), ((RTC_GPIO14, RTC_GPIOn, 14), GPIO13), ((RTC_GPIO16,
695        RTC_GPIOn, 16), GPIO14), ((RTC_GPIO13, RTC_GPIOn, 13), GPIO15), ((RTC_GPIO6,
696        RTC_GPIOn, 6), GPIO25), ((RTC_GPIO7, RTC_GPIOn, 7), GPIO26), ((RTC_GPIO17,
697        RTC_GPIOn, 17), GPIO27), ((RTC_GPIO9, RTC_GPIOn, 9), GPIO32), ((RTC_GPIO8,
698        RTC_GPIOn, 8), GPIO33), ((RTC_GPIO4, RTC_GPIOn, 4), GPIO34), ((RTC_GPIO5,
699        RTC_GPIOn, 5), GPIO35), ((RTC_GPIO0, RTC_GPIOn, 0), GPIO36), ((RTC_GPIO1,
700        RTC_GPIOn, 1), GPIO37), ((RTC_GPIO2, RTC_GPIOn, 2), GPIO38), ((RTC_GPIO3,
701        RTC_GPIOn, 3), GPIO39)));
702    };
703}
704/// Defines the `InputSignal` and `OutputSignal` enums.
705///
706/// This macro is intended to be called in esp-hal only.
707#[macro_export]
708#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
709macro_rules! define_io_mux_signals {
710    () => {
711        #[allow(non_camel_case_types, clippy::upper_case_acronyms)]
712        #[derive(Debug, PartialEq, Copy, Clone)]
713        #[cfg_attr(feature = "defmt", derive(defmt::Format))]
714        #[doc(hidden)]
715        pub enum InputSignal {
716            SPICLK                = 0,
717            SPIQ                  = 1,
718            SPID                  = 2,
719            SPIHD                 = 3,
720            SPIWP                 = 4,
721            SPICS0                = 5,
722            SPICS1                = 6,
723            SPICS2                = 7,
724            HSPICLK               = 8,
725            HSPIQ                 = 9,
726            HSPID                 = 10,
727            HSPICS0               = 11,
728            HSPIHD                = 12,
729            HSPIWP                = 13,
730            U0RXD                 = 14,
731            U0CTS                 = 15,
732            U0DSR                 = 16,
733            U1RXD                 = 17,
734            U1CTS                 = 18,
735            I2S0O_BCK             = 23,
736            I2S1O_BCK             = 24,
737            I2S0O_WS              = 25,
738            I2S1O_WS              = 26,
739            I2S0I_BCK             = 27,
740            I2S0I_WS              = 28,
741            I2CEXT0_SCL           = 29,
742            I2CEXT0_SDA           = 30,
743            PWM0_SYNC0            = 31,
744            PWM0_SYNC1            = 32,
745            PWM0_SYNC2            = 33,
746            PWM0_F0               = 34,
747            PWM0_F1               = 35,
748            PWM0_F2               = 36,
749            PCNT0_SIG_CH0         = 39,
750            PCNT0_SIG_CH1         = 40,
751            PCNT0_CTRL_CH0        = 41,
752            PCNT0_CTRL_CH1        = 42,
753            PCNT1_SIG_CH0         = 43,
754            PCNT1_SIG_CH1         = 44,
755            PCNT1_CTRL_CH0        = 45,
756            PCNT1_CTRL_CH1        = 46,
757            PCNT2_SIG_CH0         = 47,
758            PCNT2_SIG_CH1         = 48,
759            PCNT2_CTRL_CH0        = 49,
760            PCNT2_CTRL_CH1        = 50,
761            PCNT3_SIG_CH0         = 51,
762            PCNT3_SIG_CH1         = 52,
763            PCNT3_CTRL_CH0        = 53,
764            PCNT3_CTRL_CH1        = 54,
765            PCNT4_SIG_CH0         = 55,
766            PCNT4_SIG_CH1         = 56,
767            PCNT4_CTRL_CH0        = 57,
768            PCNT4_CTRL_CH1        = 58,
769            HSPICS1               = 61,
770            HSPICS2               = 62,
771            VSPICLK               = 63,
772            VSPIQ                 = 64,
773            VSPID                 = 65,
774            VSPIHD                = 66,
775            VSPIWP                = 67,
776            VSPICS0               = 68,
777            VSPICS1               = 69,
778            VSPICS2               = 70,
779            PCNT5_SIG_CH0         = 71,
780            PCNT5_SIG_CH1         = 72,
781            PCNT5_CTRL_CH0        = 73,
782            PCNT5_CTRL_CH1        = 74,
783            PCNT6_SIG_CH0         = 75,
784            PCNT6_SIG_CH1         = 76,
785            PCNT6_CTRL_CH0        = 77,
786            PCNT6_CTRL_CH1        = 78,
787            PCNT7_SIG_CH0         = 79,
788            PCNT7_SIG_CH1         = 80,
789            PCNT7_CTRL_CH0        = 81,
790            PCNT7_CTRL_CH1        = 82,
791            RMT_SIG_0             = 83,
792            RMT_SIG_1             = 84,
793            RMT_SIG_2             = 85,
794            RMT_SIG_3             = 86,
795            RMT_SIG_4             = 87,
796            RMT_SIG_5             = 88,
797            RMT_SIG_6             = 89,
798            RMT_SIG_7             = 90,
799            TWAI_RX               = 94,
800            I2CEXT1_SCL           = 95,
801            I2CEXT1_SDA           = 96,
802            HOST_CARD_DETECT_N_1  = 97,
803            HOST_CARD_DETECT_N_2  = 98,
804            HOST_CARD_WRITE_PRT_1 = 99,
805            HOST_CARD_WRITE_PRT_2 = 100,
806            HOST_CARD_INT_N_1     = 101,
807            HOST_CARD_INT_N_2     = 102,
808            PWM1_SYNC0            = 103,
809            PWM1_SYNC1            = 104,
810            PWM1_SYNC2            = 105,
811            PWM1_F0               = 106,
812            PWM1_F1               = 107,
813            PWM1_F2               = 108,
814            PWM0_CAP0             = 109,
815            PWM0_CAP1             = 110,
816            PWM0_CAP2             = 111,
817            PWM1_CAP0             = 112,
818            PWM1_CAP1             = 113,
819            PWM1_CAP2             = 114,
820            I2S0I_DATA_0          = 140,
821            I2S0I_DATA_1          = 141,
822            I2S0I_DATA_2          = 142,
823            I2S0I_DATA_3          = 143,
824            I2S0I_DATA_4          = 144,
825            I2S0I_DATA_5          = 145,
826            I2S0I_DATA_6          = 146,
827            I2S0I_DATA_7          = 147,
828            I2S0I_DATA_8          = 148,
829            I2S0I_DATA_9          = 149,
830            I2S0I_DATA_10         = 150,
831            I2S0I_DATA_11         = 151,
832            I2S0I_DATA_12         = 152,
833            I2S0I_DATA_13         = 153,
834            I2S0I_DATA_14         = 154,
835            I2S0I_DATA_15         = 155,
836            I2S1I_BCK             = 164,
837            I2S1I_WS              = 165,
838            I2S1I_DATA_0          = 166,
839            I2S1I_DATA_1          = 167,
840            I2S1I_DATA_2          = 168,
841            I2S1I_DATA_3          = 169,
842            I2S1I_DATA_4          = 170,
843            I2S1I_DATA_5          = 171,
844            I2S1I_DATA_6          = 172,
845            I2S1I_DATA_7          = 173,
846            I2S1I_DATA_8          = 174,
847            I2S1I_DATA_9          = 175,
848            I2S1I_DATA_10         = 176,
849            I2S1I_DATA_11         = 177,
850            I2S1I_DATA_12         = 178,
851            I2S1I_DATA_13         = 179,
852            I2S1I_DATA_14         = 180,
853            I2S1I_DATA_15         = 181,
854            I2S0I_H_SYNC          = 190,
855            I2S0I_V_SYNC          = 191,
856            I2S0I_H_ENABLE        = 192,
857            I2S1I_H_SYNC          = 193,
858            I2S1I_V_SYNC          = 194,
859            I2S1I_H_ENABLE        = 195,
860            U2RXD                 = 198,
861            U2CTS                 = 199,
862            EMAC_MDC              = 200,
863            EMAC_MDI              = 201,
864            EMAC_CRS              = 202,
865            EMAC_COL              = 203,
866            PCMFSYNC              = 204,
867            PCMCLK                = 205,
868            PCMDIN                = 206,
869            SD_CMD,
870            SD_DATA0,
871            SD_DATA1,
872            SD_DATA2,
873            SD_DATA3,
874            HS1_DATA0,
875            HS1_DATA1,
876            HS1_DATA2,
877            HS1_DATA3,
878            HS1_DATA4,
879            HS1_DATA5,
880            HS1_DATA6,
881            HS1_DATA7,
882            HS2_DATA0,
883            HS2_DATA1,
884            HS2_DATA2,
885            HS2_DATA3,
886            EMAC_TX_CLK,
887            EMAC_RXD2,
888            EMAC_TX_ER,
889            EMAC_RX_CLK,
890            EMAC_RX_ER,
891            EMAC_RXD3,
892            EMAC_RXD0,
893            EMAC_RXD1,
894            EMAC_RX_DV,
895            MTDI,
896            MTCK,
897            MTMS,
898        }
899        #[allow(non_camel_case_types, clippy::upper_case_acronyms)]
900        #[derive(Debug, PartialEq, Copy, Clone)]
901        #[cfg_attr(feature = "defmt", derive(defmt::Format))]
902        #[doc(hidden)]
903        pub enum OutputSignal {
904            SPICLK                   = 0,
905            SPIQ                     = 1,
906            SPID                     = 2,
907            SPIHD                    = 3,
908            SPIWP                    = 4,
909            SPICS0                   = 5,
910            SPICS1                   = 6,
911            SPICS2                   = 7,
912            HSPICLK                  = 8,
913            HSPIQ                    = 9,
914            HSPID                    = 10,
915            HSPICS0                  = 11,
916            HSPIHD                   = 12,
917            HSPIWP                   = 13,
918            U0TXD                    = 14,
919            U0RTS                    = 15,
920            U0DTR                    = 16,
921            U1TXD                    = 17,
922            U1RTS                    = 18,
923            I2S0O_BCK                = 23,
924            I2S1O_BCK                = 24,
925            I2S0O_WS                 = 25,
926            I2S1O_WS                 = 26,
927            I2S0I_BCK                = 27,
928            I2S0I_WS                 = 28,
929            I2CEXT0_SCL              = 29,
930            I2CEXT0_SDA              = 30,
931            SDIO_TOHOSTT             = 31,
932            PWM0_0A                  = 32,
933            PWM0_0B                  = 33,
934            PWM0_1A                  = 34,
935            PWM0_1B                  = 35,
936            PWM0_2A                  = 36,
937            PWM0_2B                  = 37,
938            HSPICS1                  = 61,
939            HSPICS2                  = 62,
940            VSPICLK                  = 63,
941            VSPIQ                    = 64,
942            VSPID                    = 65,
943            VSPIHD                   = 66,
944            VSPIWP                   = 67,
945            VSPICS0                  = 68,
946            VSPICS1                  = 69,
947            VSPICS2                  = 70,
948            LEDC_HS_SIG0             = 71,
949            LEDC_HS_SIG1             = 72,
950            LEDC_HS_SIG2             = 73,
951            LEDC_HS_SIG3             = 74,
952            LEDC_HS_SIG4             = 75,
953            LEDC_HS_SIG5             = 76,
954            LEDC_HS_SIG6             = 77,
955            LEDC_HS_SIG7             = 78,
956            LEDC_LS_SIG0             = 79,
957            LEDC_LS_SIG1             = 80,
958            LEDC_LS_SIG2             = 81,
959            LEDC_LS_SIG3             = 82,
960            LEDC_LS_SIG4             = 83,
961            LEDC_LS_SIG5             = 84,
962            LEDC_LS_SIG6             = 85,
963            LEDC_LS_SIG7             = 86,
964            RMT_SIG_0                = 87,
965            RMT_SIG_1                = 88,
966            RMT_SIG_2                = 89,
967            RMT_SIG_3                = 90,
968            RMT_SIG_4                = 91,
969            RMT_SIG_5                = 92,
970            RMT_SIG_6                = 93,
971            RMT_SIG_7                = 94,
972            I2CEXT1_SCL              = 95,
973            I2CEXT1_SDA              = 96,
974            HOST_CCMD_OD_PULLUP_EN_N = 97,
975            HOST_RST_N_1             = 98,
976            HOST_RST_N_2             = 99,
977            GPIO_SD0                 = 100,
978            GPIO_SD1                 = 101,
979            GPIO_SD2                 = 102,
980            GPIO_SD3                 = 103,
981            GPIO_SD4                 = 104,
982            GPIO_SD5                 = 105,
983            GPIO_SD6                 = 106,
984            GPIO_SD7                 = 107,
985            PWM1_0A                  = 108,
986            PWM1_0B                  = 109,
987            PWM1_1A                  = 110,
988            PWM1_1B                  = 111,
989            PWM1_2A                  = 112,
990            PWM1_2B                  = 113,
991            TWAI_TX                  = 123,
992            TWAI_BUS_OFF_ON          = 124,
993            TWAI_CLKOUT              = 125,
994            I2S0O_DATA_0             = 140,
995            I2S0O_DATA_1             = 141,
996            I2S0O_DATA_2             = 142,
997            I2S0O_DATA_3             = 143,
998            I2S0O_DATA_4             = 144,
999            I2S0O_DATA_5             = 145,
1000            I2S0O_DATA_6             = 146,
1001            I2S0O_DATA_7             = 147,
1002            I2S0O_DATA_8             = 148,
1003            I2S0O_DATA_9             = 149,
1004            I2S0O_DATA_10            = 150,
1005            I2S0O_DATA_11            = 151,
1006            I2S0O_DATA_12            = 152,
1007            I2S0O_DATA_13            = 153,
1008            I2S0O_DATA_14            = 154,
1009            I2S0O_DATA_15            = 155,
1010            I2S0O_DATA_16            = 156,
1011            I2S0O_DATA_17            = 157,
1012            I2S0O_DATA_18            = 158,
1013            I2S0O_DATA_19            = 159,
1014            I2S0O_DATA_20            = 160,
1015            I2S0O_DATA_21            = 161,
1016            I2S0O_DATA_22            = 162,
1017            I2S0O_DATA_23            = 163,
1018            I2S1I_BCK                = 164,
1019            I2S1I_WS                 = 165,
1020            I2S1O_DATA_0             = 166,
1021            I2S1O_DATA_1             = 167,
1022            I2S1O_DATA_2             = 168,
1023            I2S1O_DATA_3             = 169,
1024            I2S1O_DATA_4             = 170,
1025            I2S1O_DATA_5             = 171,
1026            I2S1O_DATA_6             = 172,
1027            I2S1O_DATA_7             = 173,
1028            I2S1O_DATA_8             = 174,
1029            I2S1O_DATA_9             = 175,
1030            I2S1O_DATA_10            = 176,
1031            I2S1O_DATA_11            = 177,
1032            I2S1O_DATA_12            = 178,
1033            I2S1O_DATA_13            = 179,
1034            I2S1O_DATA_14            = 180,
1035            I2S1O_DATA_15            = 181,
1036            I2S1O_DATA_16            = 182,
1037            I2S1O_DATA_17            = 183,
1038            I2S1O_DATA_18            = 184,
1039            I2S1O_DATA_19            = 185,
1040            I2S1O_DATA_20            = 186,
1041            I2S1O_DATA_21            = 187,
1042            I2S1O_DATA_22            = 188,
1043            I2S1O_DATA_23            = 189,
1044            U2TXD                    = 198,
1045            U2RTS                    = 199,
1046            EMAC_MDC                 = 200,
1047            EMAC_MDO                 = 201,
1048            EMAC_CRS                 = 202,
1049            EMAC_COL                 = 203,
1050            BT_AUDIO0RQ              = 204,
1051            BT_AUDIO1RQ              = 205,
1052            BT_AUDIO2RQ              = 206,
1053            BLE_AUDIO0RQ             = 207,
1054            BLE_AUDIO1RQ             = 208,
1055            BLE_AUDIO2RQ             = 209,
1056            PCMFSYNC                 = 210,
1057            PCMCLK                   = 211,
1058            PCMDOUT                  = 212,
1059            BLE_AUDIO_SYNC0_P        = 213,
1060            BLE_AUDIO_SYNC1_P        = 214,
1061            BLE_AUDIO_SYNC2_P        = 215,
1062            ANT_SEL0                 = 216,
1063            ANT_SEL1                 = 217,
1064            ANT_SEL2                 = 218,
1065            ANT_SEL3                 = 219,
1066            ANT_SEL4                 = 220,
1067            ANT_SEL5                 = 221,
1068            ANT_SEL6                 = 222,
1069            ANT_SEL7                 = 223,
1070            SIGNAL_224               = 224,
1071            SIGNAL_225               = 225,
1072            SIGNAL_226               = 226,
1073            SIGNAL_227               = 227,
1074            SIGNAL_228               = 228,
1075            GPIO                     = 256,
1076            CLK_OUT1,
1077            CLK_OUT2,
1078            CLK_OUT3,
1079            SD_CLK,
1080            SD_CMD,
1081            SD_DATA0,
1082            SD_DATA1,
1083            SD_DATA2,
1084            SD_DATA3,
1085            HS1_CLK,
1086            HS1_CMD,
1087            HS1_DATA0,
1088            HS1_DATA1,
1089            HS1_DATA2,
1090            HS1_DATA3,
1091            HS1_DATA4,
1092            HS1_DATA5,
1093            HS1_DATA6,
1094            HS1_DATA7,
1095            HS1_STROBE,
1096            HS2_CLK,
1097            HS2_CMD,
1098            HS2_DATA0,
1099            HS2_DATA1,
1100            HS2_DATA2,
1101            HS2_DATA3,
1102            EMAC_TX_CLK,
1103            EMAC_TX_ER,
1104            EMAC_TXD3,
1105            EMAC_RX_ER,
1106            EMAC_TXD2,
1107            EMAC_CLK_OUT,
1108            EMAC_CLK_180,
1109            EMAC_TXD0,
1110            EMAC_TX_EN,
1111            EMAC_TXD1,
1112            MTDO,
1113        }
1114    };
1115}
1116/// Defines and implements the `io_mux_reg` function.
1117///
1118/// The generated function has the following signature:
1119///
1120/// ```rust,ignore
1121/// pub(crate) fn io_mux_reg(gpio_num: u8) -> &'static crate::pac::io_mux::GPIO0 {
1122///     // ...
1123/// # unimplemented!()
1124/// }
1125/// ```
1126///
1127/// This macro is intended to be called in esp-hal only.
1128#[macro_export]
1129#[expect(clippy::crate_in_macro_def)]
1130#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
1131macro_rules! define_io_mux_reg {
1132    () => {
1133        pub(crate) fn io_mux_reg(gpio_num: u8) -> &'static crate::pac::io_mux::GPIO0 {
1134            use core::mem::transmute;
1135
1136            use crate::{pac::io_mux, peripherals::IO_MUX};
1137            let iomux = IO_MUX::regs();
1138            unsafe {
1139                match gpio_num {
1140                    0 => transmute::<&'static io_mux::GPIO0, &'static io_mux::GPIO0>(iomux.gpio0()),
1141                    1 => transmute::<&'static io_mux::GPIO1, &'static io_mux::GPIO0>(iomux.gpio1()),
1142                    2 => transmute::<&'static io_mux::GPIO2, &'static io_mux::GPIO0>(iomux.gpio2()),
1143                    3 => transmute::<&'static io_mux::GPIO3, &'static io_mux::GPIO0>(iomux.gpio3()),
1144                    4 => transmute::<&'static io_mux::GPIO4, &'static io_mux::GPIO0>(iomux.gpio4()),
1145                    5 => transmute::<&'static io_mux::GPIO5, &'static io_mux::GPIO0>(iomux.gpio5()),
1146                    6 => transmute::<&'static io_mux::GPIO6, &'static io_mux::GPIO0>(iomux.gpio6()),
1147                    7 => transmute::<&'static io_mux::GPIO7, &'static io_mux::GPIO0>(iomux.gpio7()),
1148                    8 => transmute::<&'static io_mux::GPIO8, &'static io_mux::GPIO0>(iomux.gpio8()),
1149                    9 => transmute::<&'static io_mux::GPIO9, &'static io_mux::GPIO0>(iomux.gpio9()),
1150                    10 => {
1151                        transmute::<&'static io_mux::GPIO10, &'static io_mux::GPIO0>(iomux.gpio10())
1152                    }
1153                    11 => {
1154                        transmute::<&'static io_mux::GPIO11, &'static io_mux::GPIO0>(iomux.gpio11())
1155                    }
1156                    12 => {
1157                        transmute::<&'static io_mux::GPIO12, &'static io_mux::GPIO0>(iomux.gpio12())
1158                    }
1159                    13 => {
1160                        transmute::<&'static io_mux::GPIO13, &'static io_mux::GPIO0>(iomux.gpio13())
1161                    }
1162                    14 => {
1163                        transmute::<&'static io_mux::GPIO14, &'static io_mux::GPIO0>(iomux.gpio14())
1164                    }
1165                    15 => {
1166                        transmute::<&'static io_mux::GPIO15, &'static io_mux::GPIO0>(iomux.gpio15())
1167                    }
1168                    16 => {
1169                        transmute::<&'static io_mux::GPIO16, &'static io_mux::GPIO0>(iomux.gpio16())
1170                    }
1171                    17 => {
1172                        transmute::<&'static io_mux::GPIO17, &'static io_mux::GPIO0>(iomux.gpio17())
1173                    }
1174                    18 => {
1175                        transmute::<&'static io_mux::GPIO18, &'static io_mux::GPIO0>(iomux.gpio18())
1176                    }
1177                    19 => {
1178                        transmute::<&'static io_mux::GPIO19, &'static io_mux::GPIO0>(iomux.gpio19())
1179                    }
1180                    20 => {
1181                        transmute::<&'static io_mux::GPIO20, &'static io_mux::GPIO0>(iomux.gpio20())
1182                    }
1183                    21 => {
1184                        transmute::<&'static io_mux::GPIO21, &'static io_mux::GPIO0>(iomux.gpio21())
1185                    }
1186                    22 => {
1187                        transmute::<&'static io_mux::GPIO22, &'static io_mux::GPIO0>(iomux.gpio22())
1188                    }
1189                    23 => {
1190                        transmute::<&'static io_mux::GPIO23, &'static io_mux::GPIO0>(iomux.gpio23())
1191                    }
1192                    25 => {
1193                        transmute::<&'static io_mux::GPIO25, &'static io_mux::GPIO0>(iomux.gpio25())
1194                    }
1195                    26 => {
1196                        transmute::<&'static io_mux::GPIO26, &'static io_mux::GPIO0>(iomux.gpio26())
1197                    }
1198                    27 => {
1199                        transmute::<&'static io_mux::GPIO27, &'static io_mux::GPIO0>(iomux.gpio27())
1200                    }
1201                    32 => {
1202                        transmute::<&'static io_mux::GPIO32, &'static io_mux::GPIO0>(iomux.gpio32())
1203                    }
1204                    33 => {
1205                        transmute::<&'static io_mux::GPIO33, &'static io_mux::GPIO0>(iomux.gpio33())
1206                    }
1207                    34 => {
1208                        transmute::<&'static io_mux::GPIO34, &'static io_mux::GPIO0>(iomux.gpio34())
1209                    }
1210                    35 => {
1211                        transmute::<&'static io_mux::GPIO35, &'static io_mux::GPIO0>(iomux.gpio35())
1212                    }
1213                    36 => {
1214                        transmute::<&'static io_mux::GPIO36, &'static io_mux::GPIO0>(iomux.gpio36())
1215                    }
1216                    37 => {
1217                        transmute::<&'static io_mux::GPIO37, &'static io_mux::GPIO0>(iomux.gpio37())
1218                    }
1219                    38 => {
1220                        transmute::<&'static io_mux::GPIO38, &'static io_mux::GPIO0>(iomux.gpio38())
1221                    }
1222                    39 => {
1223                        transmute::<&'static io_mux::GPIO39, &'static io_mux::GPIO0>(iomux.gpio39())
1224                    }
1225                    other => panic!("GPIO {} does not exist", other),
1226                }
1227            }
1228        }
1229    };
1230}