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