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    ("uart.peripheral_controls_mem_clk") => {
253        false
254    };
255    ("wifi.has_wifi6") => {
256        false
257    };
258    ("bt.controller") => {
259        "btdm"
260    };
261    ("phy.combo_module") => {
262        true
263    };
264}
265#[macro_export]
266#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
267macro_rules! for_each_soc_xtal_options {
268    ($($pattern:tt => $code:tt;)*) => {
269        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
270        _for_each_inner!((26)); _for_each_inner!((40)); _for_each_inner!((all(26),
271        (40)));
272    };
273}
274/// Implement the `Peripheral` enum and enable/disable/reset functions.
275///
276/// This macro is intended to be placed in `esp_hal::system`.
277#[macro_export]
278#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
279macro_rules! implement_peripheral_clocks {
280    () => {
281        #[doc(hidden)]
282        #[derive(Debug, Clone, Copy, PartialEq, Eq)]
283        #[repr(u8)]
284        #[cfg_attr(feature = "defmt", derive(defmt::Format))]
285        pub enum Peripheral {
286            #[doc = "AES peripheral clock signal"]
287            Aes,
288            #[doc = "I2C_EXT0 peripheral clock signal"]
289            I2cExt0,
290            #[doc = "I2C_EXT1 peripheral clock signal"]
291            I2cExt1,
292            #[doc = "I2S0 peripheral clock signal"]
293            I2s0,
294            #[doc = "I2S1 peripheral clock signal"]
295            I2s1,
296            #[doc = "LEDC peripheral clock signal"]
297            Ledc,
298            #[doc = "MCPWM0 peripheral clock signal"]
299            Mcpwm0,
300            #[doc = "MCPWM1 peripheral clock signal"]
301            Mcpwm1,
302            #[doc = "PCNT peripheral clock signal"]
303            Pcnt,
304            #[doc = "RMT peripheral clock signal"]
305            Rmt,
306            #[doc = "RSA peripheral clock signal"]
307            Rsa,
308            #[doc = "SHA peripheral clock signal"]
309            Sha,
310            #[doc = "SPI2 peripheral clock signal"]
311            Spi2,
312            #[doc = "SPI3 peripheral clock signal"]
313            Spi3,
314            #[doc = "SPI_DMA peripheral clock signal"]
315            SpiDma,
316            #[doc = "TIMG0 peripheral clock signal"]
317            Timg0,
318            #[doc = "TIMG1 peripheral clock signal"]
319            Timg1,
320            #[doc = "TWAI0 peripheral clock signal"]
321            Twai0,
322            #[doc = "UART0 peripheral clock signal"]
323            Uart0,
324            #[doc = "UART1 peripheral clock signal"]
325            Uart1,
326            #[doc = "UART2 peripheral clock signal"]
327            Uart2,
328            #[doc = "UART_MEM peripheral clock signal"]
329            UartMem,
330            #[doc = "UHCI0 peripheral clock signal"]
331            Uhci0,
332            #[doc = "UHCI1 peripheral clock signal"]
333            Uhci1,
334        }
335        impl Peripheral {
336            const KEEP_ENABLED: &[Peripheral] = &[Self::Timg0, Self::Uart0, Self::UartMem];
337            const COUNT: usize = Self::ALL.len();
338            const ALL: &[Self] = &[
339                Self::Aes,
340                Self::I2cExt0,
341                Self::I2cExt1,
342                Self::I2s0,
343                Self::I2s1,
344                Self::Ledc,
345                Self::Mcpwm0,
346                Self::Mcpwm1,
347                Self::Pcnt,
348                Self::Rmt,
349                Self::Rsa,
350                Self::Sha,
351                Self::Spi2,
352                Self::Spi3,
353                Self::SpiDma,
354                Self::Timg0,
355                Self::Timg1,
356                Self::Twai0,
357                Self::Uart0,
358                Self::Uart1,
359                Self::Uart2,
360                Self::UartMem,
361                Self::Uhci0,
362                Self::Uhci1,
363            ];
364        }
365        unsafe fn enable_internal_racey(peripheral: Peripheral, enable: bool) {
366            match peripheral {
367                Peripheral::Aes => {
368                    crate::peripherals::SYSTEM::regs()
369                        .peri_clk_en()
370                        .modify(|_, w| w.crypto_aes_clk_en().bit(enable));
371                }
372                Peripheral::I2cExt0 => {
373                    crate::peripherals::SYSTEM::regs()
374                        .perip_clk_en()
375                        .modify(|_, w| w.i2c_ext0_clk_en().bit(enable));
376                }
377                Peripheral::I2cExt1 => {
378                    crate::peripherals::SYSTEM::regs()
379                        .perip_clk_en()
380                        .modify(|_, w| w.i2c_ext1_clk_en().bit(enable));
381                }
382                Peripheral::I2s0 => {
383                    crate::peripherals::SYSTEM::regs()
384                        .perip_clk_en()
385                        .modify(|_, w| w.i2s0_clk_en().bit(enable));
386                }
387                Peripheral::I2s1 => {
388                    crate::peripherals::SYSTEM::regs()
389                        .perip_clk_en()
390                        .modify(|_, w| w.i2s1_clk_en().bit(enable));
391                }
392                Peripheral::Ledc => {
393                    crate::peripherals::SYSTEM::regs()
394                        .perip_clk_en()
395                        .modify(|_, w| w.ledc_clk_en().bit(enable));
396                }
397                Peripheral::Mcpwm0 => {
398                    crate::peripherals::SYSTEM::regs()
399                        .perip_clk_en()
400                        .modify(|_, w| w.pwm0_clk_en().bit(enable));
401                }
402                Peripheral::Mcpwm1 => {
403                    crate::peripherals::SYSTEM::regs()
404                        .perip_clk_en()
405                        .modify(|_, w| w.pwm1_clk_en().bit(enable));
406                }
407                Peripheral::Pcnt => {
408                    crate::peripherals::SYSTEM::regs()
409                        .perip_clk_en()
410                        .modify(|_, w| w.pcnt_clk_en().bit(enable));
411                }
412                Peripheral::Rmt => {
413                    crate::peripherals::SYSTEM::regs()
414                        .perip_clk_en()
415                        .modify(|_, w| w.rmt_clk_en().bit(enable));
416                }
417                Peripheral::Rsa => {
418                    crate::peripherals::SYSTEM::regs()
419                        .peri_clk_en()
420                        .modify(|_, w| w.crypto_rsa_clk_en().bit(enable));
421                }
422                Peripheral::Sha => {
423                    crate::peripherals::SYSTEM::regs()
424                        .peri_clk_en()
425                        .modify(|_, w| w.crypto_sha_clk_en().bit(enable));
426                }
427                Peripheral::Spi2 => {
428                    crate::peripherals::SYSTEM::regs()
429                        .perip_clk_en()
430                        .modify(|_, w| w.spi2_clk_en().bit(enable));
431                }
432                Peripheral::Spi3 => {
433                    crate::peripherals::SYSTEM::regs()
434                        .perip_clk_en()
435                        .modify(|_, w| w.spi3_clk_en().bit(enable));
436                }
437                Peripheral::SpiDma => {
438                    crate::peripherals::SYSTEM::regs()
439                        .perip_clk_en()
440                        .modify(|_, w| w.spi_dma_clk_en().bit(enable));
441                }
442                Peripheral::Timg0 => {
443                    crate::peripherals::SYSTEM::regs()
444                        .perip_clk_en()
445                        .modify(|_, w| w.timergroup_clk_en().bit(enable));
446                }
447                Peripheral::Timg1 => {
448                    crate::peripherals::SYSTEM::regs()
449                        .perip_clk_en()
450                        .modify(|_, w| w.timergroup1_clk_en().bit(enable));
451                }
452                Peripheral::Twai0 => {
453                    crate::peripherals::SYSTEM::regs()
454                        .perip_clk_en()
455                        .modify(|_, w| w.twai_clk_en().bit(enable));
456                }
457                Peripheral::Uart0 => {
458                    crate::peripherals::SYSTEM::regs()
459                        .perip_clk_en()
460                        .modify(|_, w| w.uart_clk_en().bit(enable));
461                }
462                Peripheral::Uart1 => {
463                    crate::peripherals::SYSTEM::regs()
464                        .perip_clk_en()
465                        .modify(|_, w| w.uart1_clk_en().bit(enable));
466                }
467                Peripheral::Uart2 => {
468                    crate::peripherals::SYSTEM::regs()
469                        .perip_clk_en()
470                        .modify(|_, w| w.uart2_clk_en().bit(enable));
471                }
472                Peripheral::UartMem => {
473                    crate::peripherals::SYSTEM::regs()
474                        .perip_clk_en()
475                        .modify(|_, w| w.uart_mem_clk_en().bit(enable));
476                }
477                Peripheral::Uhci0 => {
478                    crate::peripherals::SYSTEM::regs()
479                        .perip_clk_en()
480                        .modify(|_, w| w.uhci0_clk_en().bit(enable));
481                }
482                Peripheral::Uhci1 => {
483                    crate::peripherals::SYSTEM::regs()
484                        .perip_clk_en()
485                        .modify(|_, w| w.uhci1_clk_en().bit(enable));
486                }
487            }
488        }
489        unsafe fn assert_peri_reset_racey(peripheral: Peripheral, reset: bool) {
490            match peripheral {
491                Peripheral::Aes => {
492                    crate::peripherals::SYSTEM::regs()
493                        .peri_rst_en()
494                        .modify(|_, w| w.crypto_aes_rst().bit(reset));
495                }
496                Peripheral::I2cExt0 => {
497                    crate::peripherals::SYSTEM::regs()
498                        .perip_rst_en()
499                        .modify(|_, w| w.i2c_ext0_rst().bit(reset));
500                }
501                Peripheral::I2cExt1 => {
502                    crate::peripherals::SYSTEM::regs()
503                        .perip_rst_en()
504                        .modify(|_, w| w.i2c_ext1_rst().bit(reset));
505                }
506                Peripheral::I2s0 => {
507                    crate::peripherals::SYSTEM::regs()
508                        .perip_rst_en()
509                        .modify(|_, w| w.i2s0_rst().bit(reset));
510                }
511                Peripheral::I2s1 => {
512                    crate::peripherals::SYSTEM::regs()
513                        .perip_rst_en()
514                        .modify(|_, w| w.i2s1_rst().bit(reset));
515                }
516                Peripheral::Ledc => {
517                    crate::peripherals::SYSTEM::regs()
518                        .perip_rst_en()
519                        .modify(|_, w| w.ledc_rst().bit(reset));
520                }
521                Peripheral::Mcpwm0 => {
522                    crate::peripherals::SYSTEM::regs()
523                        .perip_rst_en()
524                        .modify(|_, w| w.pwm0_rst().bit(reset));
525                }
526                Peripheral::Mcpwm1 => {
527                    crate::peripherals::SYSTEM::regs()
528                        .perip_rst_en()
529                        .modify(|_, w| w.pwm1_rst().bit(reset));
530                }
531                Peripheral::Pcnt => {
532                    crate::peripherals::SYSTEM::regs()
533                        .perip_rst_en()
534                        .modify(|_, w| w.pcnt_rst().bit(reset));
535                }
536                Peripheral::Rmt => {
537                    crate::peripherals::SYSTEM::regs()
538                        .perip_rst_en()
539                        .modify(|_, w| w.rmt_rst().bit(reset));
540                }
541                Peripheral::Rsa => {
542                    crate::peripherals::SYSTEM::regs()
543                        .peri_rst_en()
544                        .modify(|_, w| w.crypto_rsa_rst().bit(reset));
545                }
546                Peripheral::Sha => {
547                    crate::peripherals::SYSTEM::regs()
548                        .peri_rst_en()
549                        .modify(|_, w| w.crypto_sha_rst().bit(reset));
550                }
551                Peripheral::Spi2 => {
552                    crate::peripherals::SYSTEM::regs()
553                        .perip_rst_en()
554                        .modify(|_, w| w.spi2_rst().bit(reset));
555                }
556                Peripheral::Spi3 => {
557                    crate::peripherals::SYSTEM::regs()
558                        .perip_rst_en()
559                        .modify(|_, w| w.spi3_rst().bit(reset));
560                }
561                Peripheral::SpiDma => {
562                    crate::peripherals::SYSTEM::regs()
563                        .perip_rst_en()
564                        .modify(|_, w| w.spi_dma_rst().bit(reset));
565                }
566                Peripheral::Timg0 => {
567                    crate::peripherals::SYSTEM::regs()
568                        .perip_rst_en()
569                        .modify(|_, w| w.timergroup_rst().bit(reset));
570                }
571                Peripheral::Timg1 => {
572                    crate::peripherals::SYSTEM::regs()
573                        .perip_rst_en()
574                        .modify(|_, w| w.timergroup1_rst().bit(reset));
575                }
576                Peripheral::Twai0 => {
577                    crate::peripherals::SYSTEM::regs()
578                        .perip_rst_en()
579                        .modify(|_, w| w.twai_rst().bit(reset));
580                }
581                Peripheral::Uart0 => {
582                    crate::peripherals::SYSTEM::regs()
583                        .perip_rst_en()
584                        .modify(|_, w| w.uart_rst().bit(reset));
585                }
586                Peripheral::Uart1 => {
587                    crate::peripherals::SYSTEM::regs()
588                        .perip_rst_en()
589                        .modify(|_, w| w.uart1_rst().bit(reset));
590                }
591                Peripheral::Uart2 => {
592                    crate::peripherals::SYSTEM::regs()
593                        .perip_rst_en()
594                        .modify(|_, w| w.uart2_rst().bit(reset));
595                }
596                Peripheral::UartMem => {
597                    crate::peripherals::SYSTEM::regs()
598                        .perip_rst_en()
599                        .modify(|_, w| w.uart_mem_rst().bit(reset));
600                }
601                Peripheral::Uhci0 => {
602                    crate::peripherals::SYSTEM::regs()
603                        .perip_rst_en()
604                        .modify(|_, w| w.uhci0_rst().bit(reset));
605                }
606                Peripheral::Uhci1 => {
607                    crate::peripherals::SYSTEM::regs()
608                        .perip_rst_en()
609                        .modify(|_, w| w.uhci1_rst().bit(reset));
610                }
611            }
612        }
613    };
614}
615/// Macro to get the address range of the given memory region.
616///
617/// This macro provides two syntax options for each memory region:
618///
619/// - `memory_range!("region_name")` returns the address range as a range expression (`start..end`).
620/// - `memory_range!(size as str, "region_name")` returns the size of the region as a string
621///   literal.
622#[macro_export]
623#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
624macro_rules! memory_range {
625    ("DRAM") => {
626        1073405952..1073741824
627    };
628    (size as str, "DRAM") => {
629        "335872"
630    };
631    ("DRAM2_UNINIT") => {
632        1073643056..1073741824
633    };
634    (size as str, "DRAM2_UNINIT") => {
635        "98768"
636    };
637}
638#[macro_export]
639#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
640macro_rules! for_each_aes_key_length {
641    ($($pattern:tt => $code:tt;)*) => {
642        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
643        _for_each_inner!((128)); _for_each_inner!((192)); _for_each_inner!((256));
644        _for_each_inner!((128, 0, 4)); _for_each_inner!((192, 1, 5));
645        _for_each_inner!((256, 2, 6)); _for_each_inner!((bits(128), (192), (256)));
646        _for_each_inner!((modes(128, 0, 4), (192, 1, 5), (256, 2, 6)));
647    };
648}
649/// This macro can be used to generate code for each channel of the RMT peripheral.
650///
651/// For an explanation on the general syntax, as well as usage of individual/repeated
652/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
653///
654/// This macro has three options for its "Individual matcher" case:
655///
656/// - `all`: `($num:literal)`
657/// - `tx`: `($num:literal, $idx:literal)`
658/// - `rx`: `($num:literal, $idx:literal)`
659///
660/// Macro fragments:
661///
662/// - `$num`: number of the channel, e.g. `0`
663/// - `$idx`: index of the channel among channels of the same capability, e.g. `0`
664///
665/// Example data:
666///
667/// - `all`: `(0)`
668/// - `tx`: `(1, 1)`
669/// - `rx`: `(2, 0)`
670#[macro_export]
671#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
672macro_rules! for_each_rmt_channel {
673    ($($pattern:tt => $code:tt;)*) => {
674        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
675        _for_each_inner!((0)); _for_each_inner!((1)); _for_each_inner!((2));
676        _for_each_inner!((3)); _for_each_inner!((4)); _for_each_inner!((5));
677        _for_each_inner!((6)); _for_each_inner!((7)); _for_each_inner!((0, 0));
678        _for_each_inner!((1, 1)); _for_each_inner!((2, 2)); _for_each_inner!((3, 3));
679        _for_each_inner!((4, 4)); _for_each_inner!((5, 5)); _for_each_inner!((6, 6));
680        _for_each_inner!((7, 7)); _for_each_inner!((0, 0)); _for_each_inner!((1, 1));
681        _for_each_inner!((2, 2)); _for_each_inner!((3, 3)); _for_each_inner!((4, 4));
682        _for_each_inner!((5, 5)); _for_each_inner!((6, 6)); _for_each_inner!((7, 7));
683        _for_each_inner!((all(0), (1), (2), (3), (4), (5), (6), (7)));
684        _for_each_inner!((tx(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7,
685        7))); _for_each_inner!((rx(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6),
686        (7, 7)));
687    };
688}
689#[macro_export]
690#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
691macro_rules! for_each_rmt_clock_source {
692    ($($pattern:tt => $code:tt;)*) => {
693        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
694        _for_each_inner!((RefTick, 0)); _for_each_inner!((Apb, 1));
695        _for_each_inner!((Apb)); _for_each_inner!((all(RefTick, 0), (Apb, 1)));
696        _for_each_inner!((default(Apb))); _for_each_inner!((is_boolean));
697    };
698}
699#[macro_export]
700#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
701macro_rules! for_each_rsa_exponentiation {
702    ($($pattern:tt => $code:tt;)*) => {
703        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
704        _for_each_inner!((512)); _for_each_inner!((1024)); _for_each_inner!((1536));
705        _for_each_inner!((2048)); _for_each_inner!((2560)); _for_each_inner!((3072));
706        _for_each_inner!((3584)); _for_each_inner!((4096)); _for_each_inner!((all(512),
707        (1024), (1536), (2048), (2560), (3072), (3584), (4096)));
708    };
709}
710#[macro_export]
711#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
712macro_rules! for_each_rsa_multiplication {
713    ($($pattern:tt => $code:tt;)*) => {
714        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
715        _for_each_inner!((512)); _for_each_inner!((1024)); _for_each_inner!((1536));
716        _for_each_inner!((2048)); _for_each_inner!((all(512), (1024), (1536), (2048)));
717    };
718}
719#[macro_export]
720#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
721macro_rules! for_each_sha_algorithm {
722    ($($pattern:tt => $code:tt;)*) => {
723        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
724        _for_each_inner!((Sha1, "SHA-1"(sizes : 64, 20, 8) (insecure_against :
725        "collision", "length extension"), 0)); _for_each_inner!((Sha256, "SHA-256"(sizes
726        : 64, 32, 8) (insecure_against : "length extension"), 0));
727        _for_each_inner!((Sha384, "SHA-384"(sizes : 128, 48, 16) (insecure_against :),
728        0)); _for_each_inner!((Sha512, "SHA-512"(sizes : 128, 64, 16) (insecure_against :
729        "length extension"), 0)); _for_each_inner!((algos(Sha1, "SHA-1"(sizes : 64, 20,
730        8) (insecure_against : "collision", "length extension"), 0), (Sha256,
731        "SHA-256"(sizes : 64, 32, 8) (insecure_against : "length extension"), 0),
732        (Sha384, "SHA-384"(sizes : 128, 48, 16) (insecure_against :), 0), (Sha512,
733        "SHA-512"(sizes : 128, 64, 16) (insecure_against : "length extension"), 0)));
734    };
735}
736/// This macro can be used to generate code for each peripheral instance of the I2C master driver.
737///
738/// For an explanation on the general syntax, as well as usage of individual/repeated
739/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
740///
741/// This macro has one option for its "Individual matcher" case:
742///
743/// Syntax: `($instance:ident, $sys:ident, $scl:ident, $sda:ident)`
744///
745/// Macro fragments:
746///
747/// - `$instance`: the name of the I2C instance
748/// - `$sys`: the name of the instance as it is in the `esp_hal::system::Peripheral` enum.
749/// - `$scl`, `$sda`: peripheral signal names.
750///
751/// Example data: `(I2C0, I2cExt0, I2CEXT0_SCL, I2CEXT0_SDA)`
752#[macro_export]
753#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
754macro_rules! for_each_i2c_master {
755    ($($pattern:tt => $code:tt;)*) => {
756        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
757        _for_each_inner!((I2C0, I2cExt0, I2CEXT0_SCL, I2CEXT0_SDA));
758        _for_each_inner!((I2C1, I2cExt1, I2CEXT1_SCL, I2CEXT1_SDA));
759        _for_each_inner!((all(I2C0, I2cExt0, I2CEXT0_SCL, I2CEXT0_SDA), (I2C1, I2cExt1,
760        I2CEXT1_SCL, I2CEXT1_SDA)));
761    };
762}
763/// This macro can be used to generate code for each peripheral instance of the UART driver.
764///
765/// For an explanation on the general syntax, as well as usage of individual/repeated
766/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
767///
768/// This macro has one option for its "Individual matcher" case:
769///
770/// Syntax: `($instance:ident, $sys:ident, $rx:ident, $tx:ident, $cts:ident, $rts:ident)`
771///
772/// Macro fragments:
773///
774/// - `$instance`: the name of the UART instance
775/// - `$sys`: the name of the instance as it is in the `esp_hal::system::Peripheral` enum.
776/// - `$rx`, `$tx`, `$cts`, `$rts`: signal names.
777///
778/// Example data: `(UART0, Uart0, U0RXD, U0TXD, U0CTS, U0RTS)`
779#[macro_export]
780#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
781macro_rules! for_each_uart {
782    ($($pattern:tt => $code:tt;)*) => {
783        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
784        _for_each_inner!((UART0, Uart0, U0RXD, U0TXD, U0CTS, U0RTS));
785        _for_each_inner!((UART1, Uart1, U1RXD, U1TXD, U1CTS, U1RTS));
786        _for_each_inner!((UART2, Uart2, U2RXD, U2TXD, U2CTS, U2RTS));
787        _for_each_inner!((all(UART0, Uart0, U0RXD, U0TXD, U0CTS, U0RTS), (UART1, Uart1,
788        U1RXD, U1TXD, U1CTS, U1RTS), (UART2, Uart2, U2RXD, U2TXD, U2CTS, U2RTS)));
789    };
790}
791/// This macro can be used to generate code for each peripheral instance of the SPI master driver.
792///
793/// For an explanation on the general syntax, as well as usage of individual/repeated
794/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
795///
796/// This macro has one option for its "Individual matcher" case:
797///
798/// Syntax: `($instance:ident, $sys:ident, $sclk:ident, [$($cs:ident),*] [$($sio:ident),*
799/// $($is_qspi:iteral)?])`
800///
801/// Macro fragments:
802///
803/// - `$instance`: the name of the SPI instance
804/// - `$sys`: the name of the instance as it is in the `esp_hal::system::Peripheral` enum.
805/// - `$cs`, `$sio`: chip select and SIO signal names.
806/// - `$is_qspi`: a `true` literal present if the SPI instance supports QSPI.
807///
808/// Example data:
809/// - `(SPI2, Spi2, FSPICLK [FSPICS0, FSPICS1, FSPICS2, FSPICS3, FSPICS4, FSPICS5] [FSPID, FSPIQ,
810///   FSPIWP, FSPIHD, FSPIIO4, FSPIIO5, FSPIIO6, FSPIIO7], true)`
811/// - `(SPI3, Spi3, SPI3_CLK [SPI3_CS0, SPI3_CS1, SPI3_CS2] [SPI3_D, SPI3_Q])`
812#[macro_export]
813#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
814macro_rules! for_each_spi_master {
815    ($($pattern:tt => $code:tt;)*) => {
816        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
817        _for_each_inner!((SPI2, Spi2, HSPICLK[HSPICS0, HSPICS1, HSPICS2] [HSPID, HSPIQ,
818        HSPIWP, HSPIHD], true)); _for_each_inner!((SPI3, Spi3, VSPICLK[VSPICS0, VSPICS1,
819        VSPICS2] [VSPID, VSPIQ, VSPIWP, VSPIHD], true)); _for_each_inner!((all(SPI2,
820        Spi2, HSPICLK[HSPICS0, HSPICS1, HSPICS2] [HSPID, HSPIQ, HSPIWP, HSPIHD], true),
821        (SPI3, Spi3, VSPICLK[VSPICS0, VSPICS1, VSPICS2] [VSPID, VSPIQ, VSPIWP, VSPIHD],
822        true)));
823    };
824}
825/// This macro can be used to generate code for each peripheral instance of the SPI slave driver.
826///
827/// For an explanation on the general syntax, as well as usage of individual/repeated
828/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
829///
830/// This macro has one option for its "Individual matcher" case:
831///
832/// Syntax: `($instance:ident, $sys:ident, $sclk:ident, $mosi:ident, $miso:ident, $cs:ident)`
833///
834/// Macro fragments:
835///
836/// - `$instance`: the name of the I2C instance
837/// - `$sys`: the name of the instance as it is in the `esp_hal::system::Peripheral` enum.
838/// - `$mosi`, `$miso`, `$cs`: signal names.
839///
840/// Example data: `(SPI2, Spi2, FSPICLK, FSPID, FSPIQ, FSPICS0)`
841#[macro_export]
842#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
843macro_rules! for_each_spi_slave {
844    ($($pattern:tt => $code:tt;)*) => {
845        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
846        _for_each_inner!((SPI2, Spi2, HSPICLK, HSPID, HSPIQ, HSPICS0));
847        _for_each_inner!((SPI3, Spi3, VSPICLK, VSPID, VSPIQ, VSPICS0));
848        _for_each_inner!((all(SPI2, Spi2, HSPICLK, HSPID, HSPIQ, HSPICS0), (SPI3, Spi3,
849        VSPICLK, VSPID, VSPIQ, VSPICS0)));
850    };
851}
852#[macro_export]
853#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
854macro_rules! for_each_peripheral {
855    ($($pattern:tt => $code:tt;)*) => {
856        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
857        _for_each_inner!((GPIO0 <= virtual())); _for_each_inner!((GPIO1 <= virtual()));
858        _for_each_inner!((GPIO2 <= virtual())); _for_each_inner!((GPIO3 <= virtual()));
859        _for_each_inner!((GPIO4 <= virtual())); _for_each_inner!((GPIO5 <= virtual()));
860        _for_each_inner!((GPIO12 <= virtual())); _for_each_inner!((GPIO13 <= virtual()));
861        _for_each_inner!((GPIO14 <= virtual())); _for_each_inner!((GPIO15 <= virtual()));
862        _for_each_inner!((GPIO16 <= virtual())); _for_each_inner!((GPIO17 <= virtual()));
863        _for_each_inner!((GPIO18 <= virtual())); _for_each_inner!((GPIO19 <= virtual()));
864        _for_each_inner!((GPIO21 <= virtual())); _for_each_inner!((GPIO22 <= virtual()));
865        _for_each_inner!((GPIO23 <= virtual())); _for_each_inner!((GPIO25 <= virtual()));
866        _for_each_inner!((GPIO26 <= virtual())); _for_each_inner!((GPIO27 <= virtual()));
867        _for_each_inner!((GPIO32 <= virtual())); _for_each_inner!((GPIO33 <= virtual()));
868        _for_each_inner!((GPIO34 <= virtual())); _for_each_inner!((GPIO35 <= virtual()));
869        _for_each_inner!((GPIO36 <= virtual())); _for_each_inner!((GPIO37 <= virtual()));
870        _for_each_inner!((GPIO38 <= virtual())); _for_each_inner!((GPIO39 <= virtual()));
871        _for_each_inner!((AES <= AES() (unstable))); _for_each_inner!((APB_CTRL <=
872        APB_CTRL() (unstable))); _for_each_inner!((BB <= BB() (unstable)));
873        _for_each_inner!((DPORT <= DPORT() (unstable))); _for_each_inner!((SYSTEM <=
874        DPORT() (unstable))); _for_each_inner!((EFUSE <= EFUSE() (unstable)));
875        _for_each_inner!((EMAC_DMA <= EMAC_DMA() (unstable))); _for_each_inner!((EMAC_EXT
876        <= EMAC_EXT() (unstable))); _for_each_inner!((EMAC_MAC <= EMAC_MAC()
877        (unstable))); _for_each_inner!((FLASH_ENCRYPTION <= FLASH_ENCRYPTION()
878        (unstable))); _for_each_inner!((FRC_TIMER <= FRC_TIMER() (unstable)));
879        _for_each_inner!((GPIO <= GPIO() (unstable))); _for_each_inner!((GPIO_SD <=
880        GPIO_SD() (unstable))); _for_each_inner!((HINF <= HINF() (unstable)));
881        _for_each_inner!((I2C0 <= I2C0(I2C_EXT0 : { bind_peri_interrupt,
882        enable_peri_interrupt, disable_peri_interrupt }))); _for_each_inner!((I2C1 <=
883        I2C1(I2C_EXT1 : { bind_peri_interrupt, enable_peri_interrupt,
884        disable_peri_interrupt }))); _for_each_inner!((I2S0 <= I2S0(I2S0 : {
885        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })
886        (unstable))); _for_each_inner!((I2S1 <= I2S1(I2S1 : { bind_peri_interrupt,
887        enable_peri_interrupt, disable_peri_interrupt }) (unstable)));
888        _for_each_inner!((IO_MUX <= IO_MUX() (unstable))); _for_each_inner!((LEDC <=
889        LEDC() (unstable))); _for_each_inner!((MCPWM0 <= MCPWM0() (unstable)));
890        _for_each_inner!((MCPWM1 <= MCPWM1() (unstable))); _for_each_inner!((NRX <= NRX()
891        (unstable))); _for_each_inner!((PCNT <= PCNT() (unstable)));
892        _for_each_inner!((RMT <= RMT() (unstable))); _for_each_inner!((RNG <= RNG()
893        (unstable))); _for_each_inner!((RSA <= RSA(RSA : { bind_peri_interrupt,
894        enable_peri_interrupt, disable_peri_interrupt }) (unstable)));
895        _for_each_inner!((LPWR <= RTC_CNTL() (unstable))); _for_each_inner!((RTC_I2C <=
896        RTC_I2C() (unstable))); _for_each_inner!((RTC_IO <= RTC_IO() (unstable)));
897        _for_each_inner!((SDHOST <= SDHOST() (unstable))); _for_each_inner!((SENS <=
898        SENS() (unstable))); _for_each_inner!((SHA <= SHA() (unstable)));
899        _for_each_inner!((SLC <= SLC() (unstable))); _for_each_inner!((SLCHOST <=
900        SLCHOST() (unstable))); _for_each_inner!((SPI0 <= SPI0() (unstable)));
901        _for_each_inner!((SPI1 <= SPI1() (unstable))); _for_each_inner!((SPI2 <=
902        SPI2(SPI2_DMA : { bind_dma_interrupt, enable_dma_interrupt, disable_dma_interrupt
903        }, SPI2 : { bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt
904        }))); _for_each_inner!((SPI3 <= SPI3(SPI3_DMA : { bind_dma_interrupt,
905        enable_dma_interrupt, disable_dma_interrupt }, SPI3 : { bind_peri_interrupt,
906        enable_peri_interrupt, disable_peri_interrupt }))); _for_each_inner!((TIMG0 <=
907        TIMG0() (unstable))); _for_each_inner!((TIMG1 <= TIMG1() (unstable)));
908        _for_each_inner!((TWAI0 <= TWAI0() (unstable))); _for_each_inner!((UART0 <=
909        UART0(UART0 : { bind_peri_interrupt, enable_peri_interrupt,
910        disable_peri_interrupt }))); _for_each_inner!((UART1 <= UART1(UART1 : {
911        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })));
912        _for_each_inner!((UART2 <= UART2(UART2 : { bind_peri_interrupt,
913        enable_peri_interrupt, disable_peri_interrupt }))); _for_each_inner!((UHCI0 <=
914        UHCI0() (unstable))); _for_each_inner!((UHCI1 <= UHCI1() (unstable)));
915        _for_each_inner!((WIFI <= WIFI() (unstable))); _for_each_inner!((DMA_SPI2 <=
916        SPI2() (unstable))); _for_each_inner!((DMA_SPI3 <= SPI3() (unstable)));
917        _for_each_inner!((DMA_I2S0 <= I2S0() (unstable))); _for_each_inner!((DMA_I2S1 <=
918        I2S1() (unstable))); _for_each_inner!((ADC1 <= virtual() (unstable)));
919        _for_each_inner!((ADC2 <= virtual() (unstable))); _for_each_inner!((BT <=
920        virtual() (unstable))); _for_each_inner!((CPU_CTRL <= virtual() (unstable)));
921        _for_each_inner!((DAC1 <= virtual() (unstable))); _for_each_inner!((DAC2 <=
922        virtual() (unstable))); _for_each_inner!((FLASH <= virtual() (unstable)));
923        _for_each_inner!((PSRAM <= virtual() (unstable))); _for_each_inner!((SW_INTERRUPT
924        <= virtual() (unstable))); _for_each_inner!((TOUCH <= virtual() (unstable)));
925        _for_each_inner!((all(GPIO0 <= virtual()), (GPIO1 <= virtual()), (GPIO2 <=
926        virtual()), (GPIO3 <= virtual()), (GPIO4 <= virtual()), (GPIO5 <= virtual()),
927        (GPIO12 <= virtual()), (GPIO13 <= virtual()), (GPIO14 <= virtual()), (GPIO15 <=
928        virtual()), (GPIO16 <= virtual()), (GPIO17 <= virtual()), (GPIO18 <= virtual()),
929        (GPIO19 <= virtual()), (GPIO21 <= virtual()), (GPIO22 <= virtual()), (GPIO23 <=
930        virtual()), (GPIO25 <= virtual()), (GPIO26 <= virtual()), (GPIO27 <= virtual()),
931        (GPIO32 <= virtual()), (GPIO33 <= virtual()), (GPIO34 <= virtual()), (GPIO35 <=
932        virtual()), (GPIO36 <= virtual()), (GPIO37 <= virtual()), (GPIO38 <= virtual()),
933        (GPIO39 <= virtual()), (AES <= AES() (unstable)), (APB_CTRL <= APB_CTRL()
934        (unstable)), (BB <= BB() (unstable)), (DPORT <= DPORT() (unstable)), (SYSTEM <=
935        DPORT() (unstable)), (EFUSE <= EFUSE() (unstable)), (EMAC_DMA <= EMAC_DMA()
936        (unstable)), (EMAC_EXT <= EMAC_EXT() (unstable)), (EMAC_MAC <= EMAC_MAC()
937        (unstable)), (FLASH_ENCRYPTION <= FLASH_ENCRYPTION() (unstable)), (FRC_TIMER <=
938        FRC_TIMER() (unstable)), (GPIO <= GPIO() (unstable)), (GPIO_SD <= GPIO_SD()
939        (unstable)), (HINF <= HINF() (unstable)), (I2C0 <= I2C0(I2C_EXT0 : {
940        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })), (I2C1 <=
941        I2C1(I2C_EXT1 : { bind_peri_interrupt, enable_peri_interrupt,
942        disable_peri_interrupt })), (I2S0 <= I2S0(I2S0 : { bind_peri_interrupt,
943        enable_peri_interrupt, disable_peri_interrupt }) (unstable)), (I2S1 <= I2S1(I2S1
944        : { bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })
945        (unstable)), (IO_MUX <= IO_MUX() (unstable)), (LEDC <= LEDC() (unstable)),
946        (MCPWM0 <= MCPWM0() (unstable)), (MCPWM1 <= MCPWM1() (unstable)), (NRX <= NRX()
947        (unstable)), (PCNT <= PCNT() (unstable)), (RMT <= RMT() (unstable)), (RNG <=
948        RNG() (unstable)), (RSA <= RSA(RSA : { bind_peri_interrupt,
949        enable_peri_interrupt, disable_peri_interrupt }) (unstable)), (LPWR <= RTC_CNTL()
950        (unstable)), (RTC_I2C <= RTC_I2C() (unstable)), (RTC_IO <= RTC_IO() (unstable)),
951        (SDHOST <= SDHOST() (unstable)), (SENS <= SENS() (unstable)), (SHA <= SHA()
952        (unstable)), (SLC <= SLC() (unstable)), (SLCHOST <= SLCHOST() (unstable)), (SPI0
953        <= SPI0() (unstable)), (SPI1 <= SPI1() (unstable)), (SPI2 <= SPI2(SPI2_DMA : {
954        bind_dma_interrupt, enable_dma_interrupt, disable_dma_interrupt }, SPI2 : {
955        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })), (SPI3 <=
956        SPI3(SPI3_DMA : { bind_dma_interrupt, enable_dma_interrupt, disable_dma_interrupt
957        }, SPI3 : { bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt
958        })), (TIMG0 <= TIMG0() (unstable)), (TIMG1 <= TIMG1() (unstable)), (TWAI0 <=
959        TWAI0() (unstable)), (UART0 <= UART0(UART0 : { bind_peri_interrupt,
960        enable_peri_interrupt, disable_peri_interrupt })), (UART1 <= UART1(UART1 : {
961        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })), (UART2 <=
962        UART2(UART2 : { bind_peri_interrupt, enable_peri_interrupt,
963        disable_peri_interrupt })), (UHCI0 <= UHCI0() (unstable)), (UHCI1 <= UHCI1()
964        (unstable)), (WIFI <= WIFI() (unstable)), (DMA_SPI2 <= SPI2() (unstable)),
965        (DMA_SPI3 <= SPI3() (unstable)), (DMA_I2S0 <= I2S0() (unstable)), (DMA_I2S1 <=
966        I2S1() (unstable)), (ADC1 <= virtual() (unstable)), (ADC2 <= virtual()
967        (unstable)), (BT <= virtual() (unstable)), (CPU_CTRL <= virtual() (unstable)),
968        (DAC1 <= virtual() (unstable)), (DAC2 <= virtual() (unstable)), (FLASH <=
969        virtual() (unstable)), (PSRAM <= virtual() (unstable)), (SW_INTERRUPT <=
970        virtual() (unstable)), (TOUCH <= virtual() (unstable))));
971    };
972}
973/// This macro can be used to generate code for each `GPIOn` instance.
974///
975/// For an explanation on the general syntax, as well as usage of individual/repeated
976/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
977///
978/// This macro has one option for its "Individual matcher" case:
979///
980/// Syntax: `($n:literal, $gpio:ident ($($digital_input_function:ident =>
981/// $digital_input_signal:ident)*) ($($digital_output_function:ident =>
982/// $digital_output_signal:ident)*) ($([$pin_attribute:ident])*))`
983///
984/// Macro fragments:
985///
986/// - `$n`: the number of the GPIO. For `GPIO0`, `$n` is 0.
987/// - `$gpio`: the name of the GPIO.
988/// - `$digital_input_function`: the number of the digital function, as an identifier (i.e. for
989///   function 0 this is `_0`).
990/// - `$digital_input_function`: the name of the digital function, as an identifier.
991/// - `$digital_output_function`: the number of the digital function, as an identifier (i.e. for
992///   function 0 this is `_0`).
993/// - `$digital_output_function`: the name of the digital function, as an identifier.
994/// - `$pin_attribute`: `Input` and/or `Output`, marks the possible directions of the GPIO.
995///   Bracketed so that they can also be matched as optional fragments. Order is always Input first.
996///
997/// Example data: `(0, GPIO0 (_5 => EMAC_TX_CLK) (_1 => CLK_OUT1 _5 => EMAC_TX_CLK) ([Input]
998/// [Output]))`
999#[macro_export]
1000#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
1001macro_rules! for_each_gpio {
1002    ($($pattern:tt => $code:tt;)*) => {
1003        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
1004        _for_each_inner!((0, GPIO0(_5 => EMAC_TX_CLK) (_1 => CLK_OUT1 _5 => EMAC_TX_CLK)
1005        ([Input] [Output]))); _for_each_inner!((1, GPIO1(_5 => EMAC_RXD2) (_0 => U0TXD _1
1006        => CLK_OUT3) ([Input] [Output]))); _for_each_inner!((2, GPIO2(_1 => HSPIWP _3 =>
1007        HS2_DATA0 _4 => SD_DATA0) (_1 => HSPIWP _3 => HS2_DATA0 _4 => SD_DATA0) ([Input]
1008        [Output]))); _for_each_inner!((3, GPIO3(_0 => U0RXD) (_1 => CLK_OUT2) ([Input]
1009        [Output]))); _for_each_inner!((4, GPIO4(_1 => HSPIHD _3 => HS2_DATA1 _4 =>
1010        SD_DATA1 _5 => EMAC_TX_ER) (_1 => HSPIHD _3 => HS2_DATA1 _4 => SD_DATA1 _5 =>
1011        EMAC_TX_ER) ([Input] [Output]))); _for_each_inner!((5, GPIO5(_1 => VSPICS0 _3 =>
1012        HS1_DATA6 _5 => EMAC_RX_CLK) (_1 => VSPICS0 _3 => HS1_DATA6) ([Input]
1013        [Output]))); _for_each_inner!((12, GPIO12(_0 => MTDI _1 => HSPIQ _3 => HS2_DATA2
1014        _4 => SD_DATA2) (_1 => HSPIQ _3 => HS2_DATA2 _4 => SD_DATA2 _5 => EMAC_TXD3)
1015        ([Input] [Output]))); _for_each_inner!((13, GPIO13(_0 => MTCK _1 => HSPID _3 =>
1016        HS2_DATA3 _4 => SD_DATA3 _5 => EMAC_RX_ER) (_1 => HSPID _3 => HS2_DATA3 _4 =>
1017        SD_DATA3 _5 => EMAC_RX_ER) ([Input] [Output]))); _for_each_inner!((14, GPIO14(_0
1018        => MTMS _1 => HSPICLK) (_1 => HSPICLK _3 => HS2_CLK _4 => SD_CLK _5 => EMAC_TXD2)
1019        ([Input] [Output]))); _for_each_inner!((15, GPIO15(_1 => HSPICS0 _4 => SD_CMD _5
1020        => EMAC_RXD3) (_0 => MTDO _1 => HSPICS0 _3 => HS2_CMD _4 => SD_CMD) ([Input]
1021        [Output]))); _for_each_inner!((16, GPIO16(_3 => HS1_DATA4 _4 => U2RXD) (_3 =>
1022        HS1_DATA4 _5 => EMAC_CLK_OUT) ([Input] [Output]))); _for_each_inner!((17,
1023        GPIO17(_3 => HS1_DATA5) (_3 => HS1_DATA5 _4 => U2TXD _5 => EMAC_CLK_180) ([Input]
1024        [Output]))); _for_each_inner!((18, GPIO18(_1 => VSPICLK _3 => HS1_DATA7) (_1 =>
1025        VSPICLK _3 => HS1_DATA7) ([Input] [Output]))); _for_each_inner!((19, GPIO19(_1 =>
1026        VSPIQ _3 => U0CTS) (_1 => VSPIQ _5 => EMAC_TXD0) ([Input] [Output])));
1027        _for_each_inner!((21, GPIO21(_1 => VSPIHD) (_1 => VSPIHD _5 => EMAC_TX_EN)
1028        ([Input] [Output]))); _for_each_inner!((22, GPIO22(_1 => VSPIWP) (_1 => VSPIWP _3
1029        => U0RTS _5 => EMAC_TXD1) ([Input] [Output]))); _for_each_inner!((23, GPIO23(_1
1030        => VSPID) (_1 => VSPID _3 => HS1_STROBE) ([Input] [Output])));
1031        _for_each_inner!((25, GPIO25(_5 => EMAC_RXD0) () ([Input] [Output])));
1032        _for_each_inner!((26, GPIO26(_5 => EMAC_RXD1) () ([Input] [Output])));
1033        _for_each_inner!((27, GPIO27(_5 => EMAC_RX_DV) () ([Input] [Output])));
1034        _for_each_inner!((32, GPIO32() () ([Input] [Output]))); _for_each_inner!((33,
1035        GPIO33() () ([Input] [Output]))); _for_each_inner!((34, GPIO34() () ([Input]
1036        []))); _for_each_inner!((35, GPIO35() () ([Input] []))); _for_each_inner!((36,
1037        GPIO36() () ([Input] []))); _for_each_inner!((37, GPIO37() () ([Input] [])));
1038        _for_each_inner!((38, GPIO38() () ([Input] []))); _for_each_inner!((39, GPIO39()
1039        () ([Input] []))); _for_each_inner!((all(0, GPIO0(_5 => EMAC_TX_CLK) (_1 =>
1040        CLK_OUT1 _5 => EMAC_TX_CLK) ([Input] [Output])), (1, GPIO1(_5 => EMAC_RXD2) (_0
1041        => U0TXD _1 => CLK_OUT3) ([Input] [Output])), (2, GPIO2(_1 => HSPIWP _3 =>
1042        HS2_DATA0 _4 => SD_DATA0) (_1 => HSPIWP _3 => HS2_DATA0 _4 => SD_DATA0) ([Input]
1043        [Output])), (3, GPIO3(_0 => U0RXD) (_1 => CLK_OUT2) ([Input] [Output])), (4,
1044        GPIO4(_1 => HSPIHD _3 => HS2_DATA1 _4 => SD_DATA1 _5 => EMAC_TX_ER) (_1 => HSPIHD
1045        _3 => HS2_DATA1 _4 => SD_DATA1 _5 => EMAC_TX_ER) ([Input] [Output])), (5,
1046        GPIO5(_1 => VSPICS0 _3 => HS1_DATA6 _5 => EMAC_RX_CLK) (_1 => VSPICS0 _3 =>
1047        HS1_DATA6) ([Input] [Output])), (12, GPIO12(_0 => MTDI _1 => HSPIQ _3 =>
1048        HS2_DATA2 _4 => SD_DATA2) (_1 => HSPIQ _3 => HS2_DATA2 _4 => SD_DATA2 _5 =>
1049        EMAC_TXD3) ([Input] [Output])), (13, GPIO13(_0 => MTCK _1 => HSPID _3 =>
1050        HS2_DATA3 _4 => SD_DATA3 _5 => EMAC_RX_ER) (_1 => HSPID _3 => HS2_DATA3 _4 =>
1051        SD_DATA3 _5 => EMAC_RX_ER) ([Input] [Output])), (14, GPIO14(_0 => MTMS _1 =>
1052        HSPICLK) (_1 => HSPICLK _3 => HS2_CLK _4 => SD_CLK _5 => EMAC_TXD2) ([Input]
1053        [Output])), (15, GPIO15(_1 => HSPICS0 _4 => SD_CMD _5 => EMAC_RXD3) (_0 => MTDO
1054        _1 => HSPICS0 _3 => HS2_CMD _4 => SD_CMD) ([Input] [Output])), (16, GPIO16(_3 =>
1055        HS1_DATA4 _4 => U2RXD) (_3 => HS1_DATA4 _5 => EMAC_CLK_OUT) ([Input] [Output])),
1056        (17, GPIO17(_3 => HS1_DATA5) (_3 => HS1_DATA5 _4 => U2TXD _5 => EMAC_CLK_180)
1057        ([Input] [Output])), (18, GPIO18(_1 => VSPICLK _3 => HS1_DATA7) (_1 => VSPICLK _3
1058        => HS1_DATA7) ([Input] [Output])), (19, GPIO19(_1 => VSPIQ _3 => U0CTS) (_1 =>
1059        VSPIQ _5 => EMAC_TXD0) ([Input] [Output])), (21, GPIO21(_1 => VSPIHD) (_1 =>
1060        VSPIHD _5 => EMAC_TX_EN) ([Input] [Output])), (22, GPIO22(_1 => VSPIWP) (_1 =>
1061        VSPIWP _3 => U0RTS _5 => EMAC_TXD1) ([Input] [Output])), (23, GPIO23(_1 => VSPID)
1062        (_1 => VSPID _3 => HS1_STROBE) ([Input] [Output])), (25, GPIO25(_5 => EMAC_RXD0)
1063        () ([Input] [Output])), (26, GPIO26(_5 => EMAC_RXD1) () ([Input] [Output])), (27,
1064        GPIO27(_5 => EMAC_RX_DV) () ([Input] [Output])), (32, GPIO32() () ([Input]
1065        [Output])), (33, GPIO33() () ([Input] [Output])), (34, GPIO34() () ([Input] [])),
1066        (35, GPIO35() () ([Input] [])), (36, GPIO36() () ([Input] [])), (37, GPIO37() ()
1067        ([Input] [])), (38, GPIO38() () ([Input] [])), (39, GPIO39() () ([Input] []))));
1068    };
1069}
1070/// This macro can be used to generate code for each analog function of each GPIO.
1071///
1072/// For an explanation on the general syntax, as well as usage of individual/repeated
1073/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
1074///
1075/// This macro has two options for its "Individual matcher" case:
1076///
1077/// - `all`: `($signal:ident, $gpio:ident)` - simple case where you only need identifiers
1078/// - `all_expanded`: `(($signal:ident, $group:ident $(, $number:literal)+), $gpio:ident)` -
1079///   expanded signal case, where you need the number(s) of a signal, or the general group to which
1080///   the signal belongs. For example, in case of `ADC2_CH3` the expanded form looks like
1081///   `(ADC2_CH3, ADCn_CHm, 2, 3)`.
1082///
1083/// Macro fragments:
1084///
1085/// - `$signal`: the name of the signal.
1086/// - `$group`: the name of the signal, with numbers replaced by placeholders. For `ADC2_CH3` this
1087///   is `ADCn_CHm`.
1088/// - `$number`: the numbers extracted from `$signal`.
1089/// - `$gpio`: the name of the GPIO.
1090///
1091/// Example data:
1092/// - `(ADC2_CH5, GPIO12)`
1093/// - `((ADC2_CH5, ADCn_CHm, 2, 5), GPIO12)`
1094///
1095/// The expanded syntax is only available when the signal has at least one numbered component.
1096#[macro_export]
1097#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
1098macro_rules! for_each_analog_function {
1099    ($($pattern:tt => $code:tt;)*) => {
1100        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
1101        _for_each_inner!((ADC2_CH1, GPIO0)); _for_each_inner!((TOUCH1, GPIO0));
1102        _for_each_inner!((ADC2_CH2, GPIO2)); _for_each_inner!((TOUCH2, GPIO2));
1103        _for_each_inner!((ADC2_CH0, GPIO4)); _for_each_inner!((TOUCH0, GPIO4));
1104        _for_each_inner!((ADC2_CH5, GPIO12)); _for_each_inner!((TOUCH5, GPIO12));
1105        _for_each_inner!((ADC2_CH4, GPIO13)); _for_each_inner!((TOUCH4, GPIO13));
1106        _for_each_inner!((ADC2_CH6, GPIO14)); _for_each_inner!((TOUCH6, GPIO14));
1107        _for_each_inner!((ADC2_CH3, GPIO15)); _for_each_inner!((TOUCH3, GPIO15));
1108        _for_each_inner!((DAC1, GPIO25)); _for_each_inner!((ADC2_CH8, GPIO25));
1109        _for_each_inner!((DAC2, GPIO26)); _for_each_inner!((ADC2_CH9, GPIO26));
1110        _for_each_inner!((ADC2_CH7, GPIO27)); _for_each_inner!((TOUCH7, GPIO27));
1111        _for_each_inner!((XTAL_32K_P, GPIO32)); _for_each_inner!((ADC1_CH4, GPIO32));
1112        _for_each_inner!((TOUCH9, GPIO32)); _for_each_inner!((XTAL_32K_N, GPIO33));
1113        _for_each_inner!((ADC1_CH5, GPIO33)); _for_each_inner!((TOUCH8, GPIO33));
1114        _for_each_inner!((ADC1_CH6, GPIO34)); _for_each_inner!((ADC1_CH7, GPIO35));
1115        _for_each_inner!((ADC_H, GPIO36)); _for_each_inner!((ADC1_CH0, GPIO36));
1116        _for_each_inner!((ADC_H, GPIO37)); _for_each_inner!((ADC1_CH1, GPIO37));
1117        _for_each_inner!((ADC_H, GPIO38)); _for_each_inner!((ADC1_CH2, GPIO38));
1118        _for_each_inner!((ADC_H, GPIO39)); _for_each_inner!((ADC1_CH3, GPIO39));
1119        _for_each_inner!(((ADC2_CH1, ADCn_CHm, 2, 1), GPIO0)); _for_each_inner!(((TOUCH1,
1120        TOUCHn, 1), GPIO0)); _for_each_inner!(((ADC2_CH2, ADCn_CHm, 2, 2), GPIO2));
1121        _for_each_inner!(((TOUCH2, TOUCHn, 2), GPIO2)); _for_each_inner!(((ADC2_CH0,
1122        ADCn_CHm, 2, 0), GPIO4)); _for_each_inner!(((TOUCH0, TOUCHn, 0), GPIO4));
1123        _for_each_inner!(((ADC2_CH5, ADCn_CHm, 2, 5), GPIO12));
1124        _for_each_inner!(((TOUCH5, TOUCHn, 5), GPIO12)); _for_each_inner!(((ADC2_CH4,
1125        ADCn_CHm, 2, 4), GPIO13)); _for_each_inner!(((TOUCH4, TOUCHn, 4), GPIO13));
1126        _for_each_inner!(((ADC2_CH6, ADCn_CHm, 2, 6), GPIO14));
1127        _for_each_inner!(((TOUCH6, TOUCHn, 6), GPIO14)); _for_each_inner!(((ADC2_CH3,
1128        ADCn_CHm, 2, 3), GPIO15)); _for_each_inner!(((TOUCH3, TOUCHn, 3), GPIO15));
1129        _for_each_inner!(((DAC1, DACn, 1), GPIO25)); _for_each_inner!(((ADC2_CH8,
1130        ADCn_CHm, 2, 8), GPIO25)); _for_each_inner!(((DAC2, DACn, 2), GPIO26));
1131        _for_each_inner!(((ADC2_CH9, ADCn_CHm, 2, 9), GPIO26));
1132        _for_each_inner!(((ADC2_CH7, ADCn_CHm, 2, 7), GPIO27));
1133        _for_each_inner!(((TOUCH7, TOUCHn, 7), GPIO27)); _for_each_inner!(((ADC1_CH4,
1134        ADCn_CHm, 1, 4), GPIO32)); _for_each_inner!(((TOUCH9, TOUCHn, 9), GPIO32));
1135        _for_each_inner!(((ADC1_CH5, ADCn_CHm, 1, 5), GPIO33));
1136        _for_each_inner!(((TOUCH8, TOUCHn, 8), GPIO33)); _for_each_inner!(((ADC1_CH6,
1137        ADCn_CHm, 1, 6), GPIO34)); _for_each_inner!(((ADC1_CH7, ADCn_CHm, 1, 7),
1138        GPIO35)); _for_each_inner!(((ADC1_CH0, ADCn_CHm, 1, 0), GPIO36));
1139        _for_each_inner!(((ADC1_CH1, ADCn_CHm, 1, 1), GPIO37));
1140        _for_each_inner!(((ADC1_CH2, ADCn_CHm, 1, 2), GPIO38));
1141        _for_each_inner!(((ADC1_CH3, ADCn_CHm, 1, 3), GPIO39));
1142        _for_each_inner!((all(ADC2_CH1, GPIO0), (TOUCH1, GPIO0), (ADC2_CH2, GPIO2),
1143        (TOUCH2, GPIO2), (ADC2_CH0, GPIO4), (TOUCH0, GPIO4), (ADC2_CH5, GPIO12), (TOUCH5,
1144        GPIO12), (ADC2_CH4, GPIO13), (TOUCH4, GPIO13), (ADC2_CH6, GPIO14), (TOUCH6,
1145        GPIO14), (ADC2_CH3, GPIO15), (TOUCH3, GPIO15), (DAC1, GPIO25), (ADC2_CH8,
1146        GPIO25), (DAC2, GPIO26), (ADC2_CH9, GPIO26), (ADC2_CH7, GPIO27), (TOUCH7,
1147        GPIO27), (XTAL_32K_P, GPIO32), (ADC1_CH4, GPIO32), (TOUCH9, GPIO32), (XTAL_32K_N,
1148        GPIO33), (ADC1_CH5, GPIO33), (TOUCH8, GPIO33), (ADC1_CH6, GPIO34), (ADC1_CH7,
1149        GPIO35), (ADC_H, GPIO36), (ADC1_CH0, GPIO36), (ADC_H, GPIO37), (ADC1_CH1,
1150        GPIO37), (ADC_H, GPIO38), (ADC1_CH2, GPIO38), (ADC_H, GPIO39), (ADC1_CH3,
1151        GPIO39))); _for_each_inner!((all_expanded((ADC2_CH1, ADCn_CHm, 2, 1), GPIO0),
1152        ((TOUCH1, TOUCHn, 1), GPIO0), ((ADC2_CH2, ADCn_CHm, 2, 2), GPIO2), ((TOUCH2,
1153        TOUCHn, 2), GPIO2), ((ADC2_CH0, ADCn_CHm, 2, 0), GPIO4), ((TOUCH0, TOUCHn, 0),
1154        GPIO4), ((ADC2_CH5, ADCn_CHm, 2, 5), GPIO12), ((TOUCH5, TOUCHn, 5), GPIO12),
1155        ((ADC2_CH4, ADCn_CHm, 2, 4), GPIO13), ((TOUCH4, TOUCHn, 4), GPIO13), ((ADC2_CH6,
1156        ADCn_CHm, 2, 6), GPIO14), ((TOUCH6, TOUCHn, 6), GPIO14), ((ADC2_CH3, ADCn_CHm, 2,
1157        3), GPIO15), ((TOUCH3, TOUCHn, 3), GPIO15), ((DAC1, DACn, 1), GPIO25),
1158        ((ADC2_CH8, ADCn_CHm, 2, 8), GPIO25), ((DAC2, DACn, 2), GPIO26), ((ADC2_CH9,
1159        ADCn_CHm, 2, 9), GPIO26), ((ADC2_CH7, ADCn_CHm, 2, 7), GPIO27), ((TOUCH7, TOUCHn,
1160        7), GPIO27), ((ADC1_CH4, ADCn_CHm, 1, 4), GPIO32), ((TOUCH9, TOUCHn, 9), GPIO32),
1161        ((ADC1_CH5, ADCn_CHm, 1, 5), GPIO33), ((TOUCH8, TOUCHn, 8), GPIO33), ((ADC1_CH6,
1162        ADCn_CHm, 1, 6), GPIO34), ((ADC1_CH7, ADCn_CHm, 1, 7), GPIO35), ((ADC1_CH0,
1163        ADCn_CHm, 1, 0), GPIO36), ((ADC1_CH1, ADCn_CHm, 1, 1), GPIO37), ((ADC1_CH2,
1164        ADCn_CHm, 1, 2), GPIO38), ((ADC1_CH3, ADCn_CHm, 1, 3), GPIO39)));
1165    };
1166}
1167/// This macro can be used to generate code for each LP/RTC function of each GPIO.
1168///
1169/// For an explanation on the general syntax, as well as usage of individual/repeated
1170/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
1171///
1172/// This macro has two options for its "Individual matcher" case:
1173///
1174/// - `all`: `($signal:ident, $gpio:ident)` - simple case where you only need identifiers
1175/// - `all_expanded`: `(($signal:ident, $group:ident $(, $number:literal)+), $gpio:ident)` -
1176///   expanded signal case, where you need the number(s) of a signal, or the general group to which
1177///   the signal belongs. For example, in case of `SAR_I2C_SCL_1` the expanded form looks like
1178///   `(SAR_I2C_SCL_1, SAR_I2C_SCL_n, 1)`.
1179///
1180/// Macro fragments:
1181///
1182/// - `$signal`: the name of the signal.
1183/// - `$group`: the name of the signal, with numbers replaced by placeholders. For `ADC2_CH3` this
1184///   is `ADCn_CHm`.
1185/// - `$number`: the numbers extracted from `$signal`.
1186/// - `$gpio`: the name of the GPIO.
1187///
1188/// Example data:
1189/// - `(RTC_GPIO15, GPIO12)`
1190/// - `((RTC_GPIO15, RTC_GPIOn, 15), GPIO12)`
1191///
1192/// The expanded syntax is only available when the signal has at least one numbered component.
1193#[macro_export]
1194#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
1195macro_rules! for_each_lp_function {
1196    ($($pattern:tt => $code:tt;)*) => {
1197        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
1198        _for_each_inner!((RTC_GPIO11, GPIO0)); _for_each_inner!((SAR_I2C_SDA, GPIO0));
1199        _for_each_inner!((RTC_GPIO12, GPIO2)); _for_each_inner!((SAR_I2C_SCL, GPIO2));
1200        _for_each_inner!((RTC_GPIO10, GPIO4)); _for_each_inner!((SAR_I2C_SCL, GPIO4));
1201        _for_each_inner!((RTC_GPIO15, GPIO12)); _for_each_inner!((RTC_GPIO14, GPIO13));
1202        _for_each_inner!((RTC_GPIO16, GPIO14)); _for_each_inner!((RTC_GPIO13, GPIO15));
1203        _for_each_inner!((SAR_I2C_SDA, GPIO15)); _for_each_inner!((RTC_GPIO6, GPIO25));
1204        _for_each_inner!((RTC_GPIO7, GPIO26)); _for_each_inner!((RTC_GPIO17, GPIO27));
1205        _for_each_inner!((RTC_GPIO9, GPIO32)); _for_each_inner!((RTC_GPIO8, GPIO33));
1206        _for_each_inner!((RTC_GPIO4, GPIO34)); _for_each_inner!((RTC_GPIO5, GPIO35));
1207        _for_each_inner!((RTC_GPIO0, GPIO36)); _for_each_inner!((RTC_GPIO1, GPIO37));
1208        _for_each_inner!((RTC_GPIO2, GPIO38)); _for_each_inner!((RTC_GPIO3, GPIO39));
1209        _for_each_inner!(((RTC_GPIO11, RTC_GPIOn, 11), GPIO0));
1210        _for_each_inner!(((RTC_GPIO12, RTC_GPIOn, 12), GPIO2));
1211        _for_each_inner!(((RTC_GPIO10, RTC_GPIOn, 10), GPIO4));
1212        _for_each_inner!(((RTC_GPIO15, RTC_GPIOn, 15), GPIO12));
1213        _for_each_inner!(((RTC_GPIO14, RTC_GPIOn, 14), GPIO13));
1214        _for_each_inner!(((RTC_GPIO16, RTC_GPIOn, 16), GPIO14));
1215        _for_each_inner!(((RTC_GPIO13, RTC_GPIOn, 13), GPIO15));
1216        _for_each_inner!(((RTC_GPIO6, RTC_GPIOn, 6), GPIO25));
1217        _for_each_inner!(((RTC_GPIO7, RTC_GPIOn, 7), GPIO26));
1218        _for_each_inner!(((RTC_GPIO17, RTC_GPIOn, 17), GPIO27));
1219        _for_each_inner!(((RTC_GPIO9, RTC_GPIOn, 9), GPIO32));
1220        _for_each_inner!(((RTC_GPIO8, RTC_GPIOn, 8), GPIO33));
1221        _for_each_inner!(((RTC_GPIO4, RTC_GPIOn, 4), GPIO34));
1222        _for_each_inner!(((RTC_GPIO5, RTC_GPIOn, 5), GPIO35));
1223        _for_each_inner!(((RTC_GPIO0, RTC_GPIOn, 0), GPIO36));
1224        _for_each_inner!(((RTC_GPIO1, RTC_GPIOn, 1), GPIO37));
1225        _for_each_inner!(((RTC_GPIO2, RTC_GPIOn, 2), GPIO38));
1226        _for_each_inner!(((RTC_GPIO3, RTC_GPIOn, 3), GPIO39));
1227        _for_each_inner!((all(RTC_GPIO11, GPIO0), (SAR_I2C_SDA, GPIO0), (RTC_GPIO12,
1228        GPIO2), (SAR_I2C_SCL, GPIO2), (RTC_GPIO10, GPIO4), (SAR_I2C_SCL, GPIO4),
1229        (RTC_GPIO15, GPIO12), (RTC_GPIO14, GPIO13), (RTC_GPIO16, GPIO14), (RTC_GPIO13,
1230        GPIO15), (SAR_I2C_SDA, GPIO15), (RTC_GPIO6, GPIO25), (RTC_GPIO7, GPIO26),
1231        (RTC_GPIO17, GPIO27), (RTC_GPIO9, GPIO32), (RTC_GPIO8, GPIO33), (RTC_GPIO4,
1232        GPIO34), (RTC_GPIO5, GPIO35), (RTC_GPIO0, GPIO36), (RTC_GPIO1, GPIO37),
1233        (RTC_GPIO2, GPIO38), (RTC_GPIO3, GPIO39)));
1234        _for_each_inner!((all_expanded((RTC_GPIO11, RTC_GPIOn, 11), GPIO0), ((RTC_GPIO12,
1235        RTC_GPIOn, 12), GPIO2), ((RTC_GPIO10, RTC_GPIOn, 10), GPIO4), ((RTC_GPIO15,
1236        RTC_GPIOn, 15), GPIO12), ((RTC_GPIO14, RTC_GPIOn, 14), GPIO13), ((RTC_GPIO16,
1237        RTC_GPIOn, 16), GPIO14), ((RTC_GPIO13, RTC_GPIOn, 13), GPIO15), ((RTC_GPIO6,
1238        RTC_GPIOn, 6), GPIO25), ((RTC_GPIO7, RTC_GPIOn, 7), GPIO26), ((RTC_GPIO17,
1239        RTC_GPIOn, 17), GPIO27), ((RTC_GPIO9, RTC_GPIOn, 9), GPIO32), ((RTC_GPIO8,
1240        RTC_GPIOn, 8), GPIO33), ((RTC_GPIO4, RTC_GPIOn, 4), GPIO34), ((RTC_GPIO5,
1241        RTC_GPIOn, 5), GPIO35), ((RTC_GPIO0, RTC_GPIOn, 0), GPIO36), ((RTC_GPIO1,
1242        RTC_GPIOn, 1), GPIO37), ((RTC_GPIO2, RTC_GPIOn, 2), GPIO38), ((RTC_GPIO3,
1243        RTC_GPIOn, 3), GPIO39)));
1244    };
1245}
1246/// Defines the `InputSignal` and `OutputSignal` enums.
1247///
1248/// This macro is intended to be called in esp-hal only.
1249#[macro_export]
1250#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
1251macro_rules! define_io_mux_signals {
1252    () => {
1253        #[allow(non_camel_case_types, clippy::upper_case_acronyms)]
1254        #[derive(Debug, PartialEq, Copy, Clone)]
1255        #[cfg_attr(feature = "defmt", derive(defmt::Format))]
1256        #[doc(hidden)]
1257        pub enum InputSignal {
1258            SPICLK                = 0,
1259            SPIQ                  = 1,
1260            SPID                  = 2,
1261            SPIHD                 = 3,
1262            SPIWP                 = 4,
1263            SPICS0                = 5,
1264            SPICS1                = 6,
1265            SPICS2                = 7,
1266            HSPICLK               = 8,
1267            HSPIQ                 = 9,
1268            HSPID                 = 10,
1269            HSPICS0               = 11,
1270            HSPIHD                = 12,
1271            HSPIWP                = 13,
1272            U0RXD                 = 14,
1273            U0CTS                 = 15,
1274            U0DSR                 = 16,
1275            U1RXD                 = 17,
1276            U1CTS                 = 18,
1277            I2S0O_BCK             = 23,
1278            I2S1O_BCK             = 24,
1279            I2S0O_WS              = 25,
1280            I2S1O_WS              = 26,
1281            I2S0I_BCK             = 27,
1282            I2S0I_WS              = 28,
1283            I2CEXT0_SCL           = 29,
1284            I2CEXT0_SDA           = 30,
1285            PWM0_SYNC0            = 31,
1286            PWM0_SYNC1            = 32,
1287            PWM0_SYNC2            = 33,
1288            PWM0_F0               = 34,
1289            PWM0_F1               = 35,
1290            PWM0_F2               = 36,
1291            PCNT0_SIG_CH0         = 39,
1292            PCNT0_SIG_CH1         = 40,
1293            PCNT0_CTRL_CH0        = 41,
1294            PCNT0_CTRL_CH1        = 42,
1295            PCNT1_SIG_CH0         = 43,
1296            PCNT1_SIG_CH1         = 44,
1297            PCNT1_CTRL_CH0        = 45,
1298            PCNT1_CTRL_CH1        = 46,
1299            PCNT2_SIG_CH0         = 47,
1300            PCNT2_SIG_CH1         = 48,
1301            PCNT2_CTRL_CH0        = 49,
1302            PCNT2_CTRL_CH1        = 50,
1303            PCNT3_SIG_CH0         = 51,
1304            PCNT3_SIG_CH1         = 52,
1305            PCNT3_CTRL_CH0        = 53,
1306            PCNT3_CTRL_CH1        = 54,
1307            PCNT4_SIG_CH0         = 55,
1308            PCNT4_SIG_CH1         = 56,
1309            PCNT4_CTRL_CH0        = 57,
1310            PCNT4_CTRL_CH1        = 58,
1311            HSPICS1               = 61,
1312            HSPICS2               = 62,
1313            VSPICLK               = 63,
1314            VSPIQ                 = 64,
1315            VSPID                 = 65,
1316            VSPIHD                = 66,
1317            VSPIWP                = 67,
1318            VSPICS0               = 68,
1319            VSPICS1               = 69,
1320            VSPICS2               = 70,
1321            PCNT5_SIG_CH0         = 71,
1322            PCNT5_SIG_CH1         = 72,
1323            PCNT5_CTRL_CH0        = 73,
1324            PCNT5_CTRL_CH1        = 74,
1325            PCNT6_SIG_CH0         = 75,
1326            PCNT6_SIG_CH1         = 76,
1327            PCNT6_CTRL_CH0        = 77,
1328            PCNT6_CTRL_CH1        = 78,
1329            PCNT7_SIG_CH0         = 79,
1330            PCNT7_SIG_CH1         = 80,
1331            PCNT7_CTRL_CH0        = 81,
1332            PCNT7_CTRL_CH1        = 82,
1333            RMT_SIG_0             = 83,
1334            RMT_SIG_1             = 84,
1335            RMT_SIG_2             = 85,
1336            RMT_SIG_3             = 86,
1337            RMT_SIG_4             = 87,
1338            RMT_SIG_5             = 88,
1339            RMT_SIG_6             = 89,
1340            RMT_SIG_7             = 90,
1341            TWAI_RX               = 94,
1342            I2CEXT1_SCL           = 95,
1343            I2CEXT1_SDA           = 96,
1344            HOST_CARD_DETECT_N_1  = 97,
1345            HOST_CARD_DETECT_N_2  = 98,
1346            HOST_CARD_WRITE_PRT_1 = 99,
1347            HOST_CARD_WRITE_PRT_2 = 100,
1348            HOST_CARD_INT_N_1     = 101,
1349            HOST_CARD_INT_N_2     = 102,
1350            PWM1_SYNC0            = 103,
1351            PWM1_SYNC1            = 104,
1352            PWM1_SYNC2            = 105,
1353            PWM1_F0               = 106,
1354            PWM1_F1               = 107,
1355            PWM1_F2               = 108,
1356            PWM0_CAP0             = 109,
1357            PWM0_CAP1             = 110,
1358            PWM0_CAP2             = 111,
1359            PWM1_CAP0             = 112,
1360            PWM1_CAP1             = 113,
1361            PWM1_CAP2             = 114,
1362            I2S0I_DATA_0          = 140,
1363            I2S0I_DATA_1          = 141,
1364            I2S0I_DATA_2          = 142,
1365            I2S0I_DATA_3          = 143,
1366            I2S0I_DATA_4          = 144,
1367            I2S0I_DATA_5          = 145,
1368            I2S0I_DATA_6          = 146,
1369            I2S0I_DATA_7          = 147,
1370            I2S0I_DATA_8          = 148,
1371            I2S0I_DATA_9          = 149,
1372            I2S0I_DATA_10         = 150,
1373            I2S0I_DATA_11         = 151,
1374            I2S0I_DATA_12         = 152,
1375            I2S0I_DATA_13         = 153,
1376            I2S0I_DATA_14         = 154,
1377            I2S0I_DATA_15         = 155,
1378            I2S1I_BCK             = 164,
1379            I2S1I_WS              = 165,
1380            I2S1I_DATA_0          = 166,
1381            I2S1I_DATA_1          = 167,
1382            I2S1I_DATA_2          = 168,
1383            I2S1I_DATA_3          = 169,
1384            I2S1I_DATA_4          = 170,
1385            I2S1I_DATA_5          = 171,
1386            I2S1I_DATA_6          = 172,
1387            I2S1I_DATA_7          = 173,
1388            I2S1I_DATA_8          = 174,
1389            I2S1I_DATA_9          = 175,
1390            I2S1I_DATA_10         = 176,
1391            I2S1I_DATA_11         = 177,
1392            I2S1I_DATA_12         = 178,
1393            I2S1I_DATA_13         = 179,
1394            I2S1I_DATA_14         = 180,
1395            I2S1I_DATA_15         = 181,
1396            I2S0I_H_SYNC          = 190,
1397            I2S0I_V_SYNC          = 191,
1398            I2S0I_H_ENABLE        = 192,
1399            I2S1I_H_SYNC          = 193,
1400            I2S1I_V_SYNC          = 194,
1401            I2S1I_H_ENABLE        = 195,
1402            U2RXD                 = 198,
1403            U2CTS                 = 199,
1404            EMAC_MDC              = 200,
1405            EMAC_MDI              = 201,
1406            EMAC_CRS              = 202,
1407            EMAC_COL              = 203,
1408            PCMFSYNC              = 204,
1409            PCMCLK                = 205,
1410            PCMDIN                = 206,
1411            SD_CMD,
1412            SD_DATA0,
1413            SD_DATA1,
1414            SD_DATA2,
1415            SD_DATA3,
1416            HS1_DATA0,
1417            HS1_DATA1,
1418            HS1_DATA2,
1419            HS1_DATA3,
1420            HS1_DATA4,
1421            HS1_DATA5,
1422            HS1_DATA6,
1423            HS1_DATA7,
1424            HS2_DATA0,
1425            HS2_DATA1,
1426            HS2_DATA2,
1427            HS2_DATA3,
1428            EMAC_TX_CLK,
1429            EMAC_RXD2,
1430            EMAC_TX_ER,
1431            EMAC_RX_CLK,
1432            EMAC_RX_ER,
1433            EMAC_RXD3,
1434            EMAC_RXD0,
1435            EMAC_RXD1,
1436            EMAC_RX_DV,
1437            MTDI,
1438            MTCK,
1439            MTMS,
1440        }
1441        #[allow(non_camel_case_types, clippy::upper_case_acronyms)]
1442        #[derive(Debug, PartialEq, Copy, Clone)]
1443        #[cfg_attr(feature = "defmt", derive(defmt::Format))]
1444        #[doc(hidden)]
1445        pub enum OutputSignal {
1446            SPICLK                   = 0,
1447            SPIQ                     = 1,
1448            SPID                     = 2,
1449            SPIHD                    = 3,
1450            SPIWP                    = 4,
1451            SPICS0                   = 5,
1452            SPICS1                   = 6,
1453            SPICS2                   = 7,
1454            HSPICLK                  = 8,
1455            HSPIQ                    = 9,
1456            HSPID                    = 10,
1457            HSPICS0                  = 11,
1458            HSPIHD                   = 12,
1459            HSPIWP                   = 13,
1460            U0TXD                    = 14,
1461            U0RTS                    = 15,
1462            U0DTR                    = 16,
1463            U1TXD                    = 17,
1464            U1RTS                    = 18,
1465            I2S0O_BCK                = 23,
1466            I2S1O_BCK                = 24,
1467            I2S0O_WS                 = 25,
1468            I2S1O_WS                 = 26,
1469            I2S0I_BCK                = 27,
1470            I2S0I_WS                 = 28,
1471            I2CEXT0_SCL              = 29,
1472            I2CEXT0_SDA              = 30,
1473            SDIO_TOHOSTT             = 31,
1474            PWM0_0A                  = 32,
1475            PWM0_0B                  = 33,
1476            PWM0_1A                  = 34,
1477            PWM0_1B                  = 35,
1478            PWM0_2A                  = 36,
1479            PWM0_2B                  = 37,
1480            HSPICS1                  = 61,
1481            HSPICS2                  = 62,
1482            VSPICLK                  = 63,
1483            VSPIQ                    = 64,
1484            VSPID                    = 65,
1485            VSPIHD                   = 66,
1486            VSPIWP                   = 67,
1487            VSPICS0                  = 68,
1488            VSPICS1                  = 69,
1489            VSPICS2                  = 70,
1490            LEDC_HS_SIG0             = 71,
1491            LEDC_HS_SIG1             = 72,
1492            LEDC_HS_SIG2             = 73,
1493            LEDC_HS_SIG3             = 74,
1494            LEDC_HS_SIG4             = 75,
1495            LEDC_HS_SIG5             = 76,
1496            LEDC_HS_SIG6             = 77,
1497            LEDC_HS_SIG7             = 78,
1498            LEDC_LS_SIG0             = 79,
1499            LEDC_LS_SIG1             = 80,
1500            LEDC_LS_SIG2             = 81,
1501            LEDC_LS_SIG3             = 82,
1502            LEDC_LS_SIG4             = 83,
1503            LEDC_LS_SIG5             = 84,
1504            LEDC_LS_SIG6             = 85,
1505            LEDC_LS_SIG7             = 86,
1506            RMT_SIG_0                = 87,
1507            RMT_SIG_1                = 88,
1508            RMT_SIG_2                = 89,
1509            RMT_SIG_3                = 90,
1510            RMT_SIG_4                = 91,
1511            RMT_SIG_5                = 92,
1512            RMT_SIG_6                = 93,
1513            RMT_SIG_7                = 94,
1514            I2CEXT1_SCL              = 95,
1515            I2CEXT1_SDA              = 96,
1516            HOST_CCMD_OD_PULLUP_EN_N = 97,
1517            HOST_RST_N_1             = 98,
1518            HOST_RST_N_2             = 99,
1519            GPIO_SD0                 = 100,
1520            GPIO_SD1                 = 101,
1521            GPIO_SD2                 = 102,
1522            GPIO_SD3                 = 103,
1523            GPIO_SD4                 = 104,
1524            GPIO_SD5                 = 105,
1525            GPIO_SD6                 = 106,
1526            GPIO_SD7                 = 107,
1527            PWM1_0A                  = 108,
1528            PWM1_0B                  = 109,
1529            PWM1_1A                  = 110,
1530            PWM1_1B                  = 111,
1531            PWM1_2A                  = 112,
1532            PWM1_2B                  = 113,
1533            TWAI_TX                  = 123,
1534            TWAI_BUS_OFF_ON          = 124,
1535            TWAI_CLKOUT              = 125,
1536            I2S0O_DATA_0             = 140,
1537            I2S0O_DATA_1             = 141,
1538            I2S0O_DATA_2             = 142,
1539            I2S0O_DATA_3             = 143,
1540            I2S0O_DATA_4             = 144,
1541            I2S0O_DATA_5             = 145,
1542            I2S0O_DATA_6             = 146,
1543            I2S0O_DATA_7             = 147,
1544            I2S0O_DATA_8             = 148,
1545            I2S0O_DATA_9             = 149,
1546            I2S0O_DATA_10            = 150,
1547            I2S0O_DATA_11            = 151,
1548            I2S0O_DATA_12            = 152,
1549            I2S0O_DATA_13            = 153,
1550            I2S0O_DATA_14            = 154,
1551            I2S0O_DATA_15            = 155,
1552            I2S0O_DATA_16            = 156,
1553            I2S0O_DATA_17            = 157,
1554            I2S0O_DATA_18            = 158,
1555            I2S0O_DATA_19            = 159,
1556            I2S0O_DATA_20            = 160,
1557            I2S0O_DATA_21            = 161,
1558            I2S0O_DATA_22            = 162,
1559            I2S0O_DATA_23            = 163,
1560            I2S1I_BCK                = 164,
1561            I2S1I_WS                 = 165,
1562            I2S1O_DATA_0             = 166,
1563            I2S1O_DATA_1             = 167,
1564            I2S1O_DATA_2             = 168,
1565            I2S1O_DATA_3             = 169,
1566            I2S1O_DATA_4             = 170,
1567            I2S1O_DATA_5             = 171,
1568            I2S1O_DATA_6             = 172,
1569            I2S1O_DATA_7             = 173,
1570            I2S1O_DATA_8             = 174,
1571            I2S1O_DATA_9             = 175,
1572            I2S1O_DATA_10            = 176,
1573            I2S1O_DATA_11            = 177,
1574            I2S1O_DATA_12            = 178,
1575            I2S1O_DATA_13            = 179,
1576            I2S1O_DATA_14            = 180,
1577            I2S1O_DATA_15            = 181,
1578            I2S1O_DATA_16            = 182,
1579            I2S1O_DATA_17            = 183,
1580            I2S1O_DATA_18            = 184,
1581            I2S1O_DATA_19            = 185,
1582            I2S1O_DATA_20            = 186,
1583            I2S1O_DATA_21            = 187,
1584            I2S1O_DATA_22            = 188,
1585            I2S1O_DATA_23            = 189,
1586            U2TXD                    = 198,
1587            U2RTS                    = 199,
1588            EMAC_MDC                 = 200,
1589            EMAC_MDO                 = 201,
1590            EMAC_CRS                 = 202,
1591            EMAC_COL                 = 203,
1592            BT_AUDIO0RQ              = 204,
1593            BT_AUDIO1RQ              = 205,
1594            BT_AUDIO2RQ              = 206,
1595            BLE_AUDIO0RQ             = 207,
1596            BLE_AUDIO1RQ             = 208,
1597            BLE_AUDIO2RQ             = 209,
1598            PCMFSYNC                 = 210,
1599            PCMCLK                   = 211,
1600            PCMDOUT                  = 212,
1601            BLE_AUDIO_SYNC0_P        = 213,
1602            BLE_AUDIO_SYNC1_P        = 214,
1603            BLE_AUDIO_SYNC2_P        = 215,
1604            ANT_SEL0                 = 216,
1605            ANT_SEL1                 = 217,
1606            ANT_SEL2                 = 218,
1607            ANT_SEL3                 = 219,
1608            ANT_SEL4                 = 220,
1609            ANT_SEL5                 = 221,
1610            ANT_SEL6                 = 222,
1611            ANT_SEL7                 = 223,
1612            SIGNAL_224               = 224,
1613            SIGNAL_225               = 225,
1614            SIGNAL_226               = 226,
1615            SIGNAL_227               = 227,
1616            SIGNAL_228               = 228,
1617            GPIO                     = 256,
1618            CLK_OUT1,
1619            CLK_OUT2,
1620            CLK_OUT3,
1621            SD_CLK,
1622            SD_CMD,
1623            SD_DATA0,
1624            SD_DATA1,
1625            SD_DATA2,
1626            SD_DATA3,
1627            HS1_CLK,
1628            HS1_CMD,
1629            HS1_DATA0,
1630            HS1_DATA1,
1631            HS1_DATA2,
1632            HS1_DATA3,
1633            HS1_DATA4,
1634            HS1_DATA5,
1635            HS1_DATA6,
1636            HS1_DATA7,
1637            HS1_STROBE,
1638            HS2_CLK,
1639            HS2_CMD,
1640            HS2_DATA0,
1641            HS2_DATA1,
1642            HS2_DATA2,
1643            HS2_DATA3,
1644            EMAC_TX_CLK,
1645            EMAC_TX_ER,
1646            EMAC_TXD3,
1647            EMAC_RX_ER,
1648            EMAC_TXD2,
1649            EMAC_CLK_OUT,
1650            EMAC_CLK_180,
1651            EMAC_TXD0,
1652            EMAC_TX_EN,
1653            EMAC_TXD1,
1654            MTDO,
1655        }
1656    };
1657}
1658/// Defines and implements the `io_mux_reg` function.
1659///
1660/// The generated function has the following signature:
1661///
1662/// ```rust,ignore
1663/// pub(crate) fn io_mux_reg(gpio_num: u8) -> &'static crate::pac::io_mux::GPIO0 {
1664///     // ...
1665/// # unimplemented!()
1666/// }
1667/// ```
1668///
1669/// This macro is intended to be called in esp-hal only.
1670#[macro_export]
1671#[expect(clippy::crate_in_macro_def)]
1672#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
1673macro_rules! define_io_mux_reg {
1674    () => {
1675        pub(crate) fn io_mux_reg(gpio_num: u8) -> &'static crate::pac::io_mux::GPIO0 {
1676            let iomux = crate::peripherals::IO_MUX::regs();
1677            match gpio_num {
1678                0 => iomux.gpio0(),
1679                1 => iomux.gpio1(),
1680                2 => iomux.gpio2(),
1681                3 => iomux.gpio3(),
1682                4 => iomux.gpio4(),
1683                5 => iomux.gpio5(),
1684                12 => iomux.gpio12(),
1685                13 => iomux.gpio13(),
1686                14 => iomux.gpio14(),
1687                15 => iomux.gpio15(),
1688                16 => iomux.gpio16(),
1689                17 => iomux.gpio17(),
1690                18 => iomux.gpio18(),
1691                19 => iomux.gpio19(),
1692                21 => iomux.gpio21(),
1693                22 => iomux.gpio22(),
1694                23 => iomux.gpio23(),
1695                25 => iomux.gpio25(),
1696                26 => iomux.gpio26(),
1697                27 => iomux.gpio27(),
1698                32 => iomux.gpio32(),
1699                33 => iomux.gpio33(),
1700                34 => iomux.gpio34(),
1701                35 => iomux.gpio35(),
1702                36 => iomux.gpio36(),
1703                37 => iomux.gpio37(),
1704                38 => iomux.gpio38(),
1705                39 => iomux.gpio39(),
1706                other => panic!("GPIO {} does not exist", other),
1707            }
1708        }
1709    };
1710}