esp_metadata_generated/
_generated_esp32s2.rs

1// Do NOT edit this file directly. Make your changes to esp-metadata,
2// then run `cargo xtask update-metadata`.
3
4/// The name of the chip as `&str`
5///
6/// # Example
7///
8/// ```rust, no_run
9/// use esp_hal::chip;
10/// let chip_name = chip!();
11#[doc = concat!("assert_eq!(chip_name, ", chip!(), ")")]
12/// ```
13#[macro_export]
14#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
15macro_rules! chip {
16    () => {
17        "esp32s2"
18    };
19}
20/// The properties of this chip and its drivers.
21#[macro_export]
22#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
23macro_rules! property {
24    ("chip") => {
25        "esp32s2"
26    };
27    ("arch") => {
28        "xtensa"
29    };
30    ("cores") => {
31        1
32    };
33    ("cores", str) => {
34        stringify!(1)
35    };
36    ("trm") => {
37        "https://www.espressif.com/sites/default/files/documentation/esp32-s2_technical_reference_manual_en.pdf"
38    };
39    ("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        90000
59    };
60    ("soc.rc_slow_clock", str) => {
61        stringify!(90000)
62    };
63    ("soc.xtal_frequency") => {
64        40
65    };
66    ("soc.xtal_frequency", str) => {
67        stringify!(40)
68    };
69    ("aes.dma") => {
70        true
71    };
72    ("aes.has_split_text_registers") => {
73        true
74    };
75    ("aes.endianness_configurable") => {
76        true
77    };
78    ("gpio.has_bank_1") => {
79        true
80    };
81    ("gpio.gpio_function") => {
82        1
83    };
84    ("gpio.gpio_function", str) => {
85        stringify!(1)
86    };
87    ("gpio.constant_0_input") => {
88        60
89    };
90    ("gpio.constant_0_input", str) => {
91        stringify!(60)
92    };
93    ("gpio.constant_1_input") => {
94        56
95    };
96    ("gpio.constant_1_input", str) => {
97        stringify!(56)
98    };
99    ("gpio.remap_iomux_pin_registers") => {
100        false
101    };
102    ("gpio.func_in_sel_offset") => {
103        0
104    };
105    ("gpio.func_in_sel_offset", str) => {
106        stringify!(0)
107    };
108    ("gpio.input_signal_max") => {
109        242
110    };
111    ("gpio.input_signal_max", str) => {
112        stringify!(242)
113    };
114    ("gpio.output_signal_max") => {
115        256
116    };
117    ("gpio.output_signal_max", str) => {
118        stringify!(256)
119    };
120    ("i2c_master.has_fsm_timeouts") => {
121        false
122    };
123    ("i2c_master.has_hw_bus_clear") => {
124        false
125    };
126    ("i2c_master.has_bus_timeout_enable") => {
127        true
128    };
129    ("i2c_master.separate_filter_config_registers") => {
130        true
131    };
132    ("i2c_master.can_estimate_nack_reason") => {
133        false
134    };
135    ("i2c_master.has_conf_update") => {
136        false
137    };
138    ("i2c_master.has_reliable_fsm_reset") => {
139        false
140    };
141    ("i2c_master.has_arbitration_en") => {
142        true
143    };
144    ("i2c_master.has_tx_fifo_watermark") => {
145        false
146    };
147    ("i2c_master.bus_timeout_is_exponential") => {
148        false
149    };
150    ("i2c_master.i2c0_data_register_ahb_address") => {
151        1610690588
152    };
153    ("i2c_master.i2c0_data_register_ahb_address", str) => {
154        stringify!(1610690588)
155    };
156    ("i2c_master.max_bus_timeout") => {
157        16777215
158    };
159    ("i2c_master.max_bus_timeout", str) => {
160        stringify!(16777215)
161    };
162    ("i2c_master.ll_intr_mask") => {
163        131071
164    };
165    ("i2c_master.ll_intr_mask", str) => {
166        stringify!(131071)
167    };
168    ("i2c_master.fifo_size") => {
169        32
170    };
171    ("i2c_master.fifo_size", str) => {
172        stringify!(32)
173    };
174    ("interrupts.status_registers") => {
175        3
176    };
177    ("interrupts.status_registers", str) => {
178        stringify!(3)
179    };
180    ("rmt.ram_start") => {
181        1061250048
182    };
183    ("rmt.ram_start", str) => {
184        stringify!(1061250048)
185    };
186    ("rmt.channel_ram_size") => {
187        64
188    };
189    ("rmt.channel_ram_size", str) => {
190        stringify!(64)
191    };
192    ("rmt.has_tx_immediate_stop") => {
193        true
194    };
195    ("rmt.has_tx_loop_count") => {
196        true
197    };
198    ("rmt.has_tx_loop_auto_stop") => {
199        false
200    };
201    ("rmt.has_tx_carrier_data_only") => {
202        true
203    };
204    ("rmt.has_tx_sync") => {
205        true
206    };
207    ("rmt.has_rx_wrap") => {
208        false
209    };
210    ("rmt.has_rx_demodulation") => {
211        true
212    };
213    ("rmt.has_dma") => {
214        false
215    };
216    ("rmt.has_per_channel_clock") => {
217        true
218    };
219    ("rng.apb_cycle_wait_num") => {
220        16
221    };
222    ("rng.apb_cycle_wait_num", str) => {
223        stringify!(16)
224    };
225    ("rsa.size_increment") => {
226        32
227    };
228    ("rsa.size_increment", str) => {
229        stringify!(32)
230    };
231    ("rsa.memory_size_bytes") => {
232        512
233    };
234    ("rsa.memory_size_bytes", str) => {
235        stringify!(512)
236    };
237    ("sha.dma") => {
238        true
239    };
240    ("spi_master.has_octal") => {
241        true
242    };
243    ("timergroup.timg_has_timer1") => {
244        true
245    };
246    ("timergroup.timg_has_divcnt_rst") => {
247        false
248    };
249    ("timergroup.default_clock_source") => {
250        0
251    };
252    ("timergroup.default_clock_source", str) => {
253        stringify!(0)
254    };
255    ("uart.ram_size") => {
256        128
257    };
258    ("uart.ram_size", str) => {
259        stringify!(128)
260    };
261    ("uart.peripheral_controls_mem_clk") => {
262        false
263    };
264    ("wifi.has_wifi6") => {
265        false
266    };
267    ("phy.combo_module") => {
268        false
269    };
270}
271#[macro_export]
272#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
273macro_rules! for_each_soc_xtal_options {
274    ($($pattern:tt => $code:tt;)*) => {
275        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
276        _for_each_inner!((40)); _for_each_inner!((all(40)));
277    };
278}
279/// Implement the `Peripheral` enum and enable/disable/reset functions.
280///
281/// This macro is intended to be placed in `esp_hal::system`.
282#[macro_export]
283#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
284macro_rules! implement_peripheral_clocks {
285    () => {
286        #[doc(hidden)]
287        #[derive(Debug, Clone, Copy, PartialEq, Eq)]
288        #[repr(u8)]
289        #[cfg_attr(feature = "defmt", derive(defmt::Format))]
290        pub enum Peripheral {
291            #[doc = "AES peripheral clock signal"]
292            Aes,
293            #[doc = "APB_SAR_ADC peripheral clock signal"]
294            ApbSarAdc,
295            #[doc = "COPY_DMA peripheral clock signal"]
296            CopyDma,
297            #[doc = "CRYPTO_DMA peripheral clock signal"]
298            CryptoDma,
299            #[doc = "DS peripheral clock signal"]
300            Ds,
301            #[doc = "HMAC peripheral clock signal"]
302            Hmac,
303            #[doc = "I2C_EXT0 peripheral clock signal"]
304            I2cExt0,
305            #[doc = "I2C_EXT1 peripheral clock signal"]
306            I2cExt1,
307            #[doc = "I2S0 peripheral clock signal"]
308            I2s0,
309            #[doc = "LEDC peripheral clock signal"]
310            Ledc,
311            #[doc = "MCPWM0 peripheral clock signal"]
312            Mcpwm0,
313            #[doc = "MCPWM1 peripheral clock signal"]
314            Mcpwm1,
315            #[doc = "PCNT peripheral clock signal"]
316            Pcnt,
317            #[doc = "RMT peripheral clock signal"]
318            Rmt,
319            #[doc = "RSA peripheral clock signal"]
320            Rsa,
321            #[doc = "SHA peripheral clock signal"]
322            Sha,
323            #[doc = "SPI2 peripheral clock signal"]
324            Spi2,
325            #[doc = "SPI2_DMA peripheral clock signal"]
326            Spi2Dma,
327            #[doc = "SPI3 peripheral clock signal"]
328            Spi3,
329            #[doc = "SPI3_DMA peripheral clock signal"]
330            Spi3Dma,
331            #[doc = "SYSTIMER peripheral clock signal"]
332            Systimer,
333            #[doc = "TIMG0 peripheral clock signal"]
334            Timg0,
335            #[doc = "TIMG1 peripheral clock signal"]
336            Timg1,
337            #[doc = "TWAI0 peripheral clock signal"]
338            Twai0,
339            #[doc = "UART0 peripheral clock signal"]
340            Uart0,
341            #[doc = "UART1 peripheral clock signal"]
342            Uart1,
343            #[doc = "UART_MEM peripheral clock signal"]
344            UartMem,
345            #[doc = "UHCI0 peripheral clock signal"]
346            Uhci0,
347            #[doc = "UHCI1 peripheral clock signal"]
348            Uhci1,
349            #[doc = "USB peripheral clock signal"]
350            Usb,
351            #[doc = "WDG peripheral clock signal"]
352            Wdg,
353        }
354        impl Peripheral {
355            const KEEP_ENABLED: &[Peripheral] =
356                &[Self::Systimer, Self::Timg0, Self::Uart0, Self::UartMem];
357            const COUNT: usize = Self::ALL.len();
358            const ALL: &[Self] = &[
359                Self::Aes,
360                Self::ApbSarAdc,
361                Self::CopyDma,
362                Self::CryptoDma,
363                Self::Ds,
364                Self::Hmac,
365                Self::I2cExt0,
366                Self::I2cExt1,
367                Self::I2s0,
368                Self::Ledc,
369                Self::Mcpwm0,
370                Self::Mcpwm1,
371                Self::Pcnt,
372                Self::Rmt,
373                Self::Rsa,
374                Self::Sha,
375                Self::Spi2,
376                Self::Spi2Dma,
377                Self::Spi3,
378                Self::Spi3Dma,
379                Self::Systimer,
380                Self::Timg0,
381                Self::Timg1,
382                Self::Twai0,
383                Self::Uart0,
384                Self::Uart1,
385                Self::UartMem,
386                Self::Uhci0,
387                Self::Uhci1,
388                Self::Usb,
389                Self::Wdg,
390            ];
391        }
392        unsafe fn enable_internal_racey(peripheral: Peripheral, enable: bool) {
393            match peripheral {
394                Peripheral::Aes => {
395                    crate::peripherals::SYSTEM::regs()
396                        .perip_clk_en1()
397                        .modify(|_, w| w.crypto_aes_clk_en().bit(enable));
398                }
399                Peripheral::ApbSarAdc => {
400                    crate::peripherals::SYSTEM::regs()
401                        .perip_clk_en0()
402                        .modify(|_, w| w.apb_saradc_clk_en().bit(enable));
403                }
404                Peripheral::CopyDma => {
405                    crate::peripherals::DMA_COPY::regs()
406                        .conf()
407                        .modify(|_, w| w.clk_en().bit(enable));
408                }
409                Peripheral::CryptoDma => {
410                    crate::peripherals::SYSTEM::regs()
411                        .perip_clk_en1()
412                        .modify(|_, w| w.crypto_dma_clk_en().bit(enable));
413                }
414                Peripheral::Ds => {
415                    crate::peripherals::SYSTEM::regs()
416                        .perip_clk_en1()
417                        .modify(|_, w| w.crypto_ds_clk_en().bit(enable));
418                }
419                Peripheral::Hmac => {
420                    crate::peripherals::SYSTEM::regs()
421                        .perip_clk_en1()
422                        .modify(|_, w| w.crypto_hmac_clk_en().bit(enable));
423                }
424                Peripheral::I2cExt0 => {
425                    crate::peripherals::SYSTEM::regs()
426                        .perip_clk_en0()
427                        .modify(|_, w| w.i2c_ext0_clk_en().bit(enable));
428                }
429                Peripheral::I2cExt1 => {
430                    crate::peripherals::SYSTEM::regs()
431                        .perip_clk_en0()
432                        .modify(|_, w| w.i2c_ext1_clk_en().bit(enable));
433                }
434                Peripheral::I2s0 => {
435                    crate::peripherals::SYSTEM::regs()
436                        .perip_clk_en0()
437                        .modify(|_, w| w.i2s0_clk_en().bit(enable));
438                }
439                Peripheral::Ledc => {
440                    crate::peripherals::SYSTEM::regs()
441                        .perip_clk_en0()
442                        .modify(|_, w| w.ledc_clk_en().bit(enable));
443                }
444                Peripheral::Mcpwm0 => {
445                    crate::peripherals::SYSTEM::regs()
446                        .perip_clk_en0()
447                        .modify(|_, w| w.pwm0_clk_en().bit(enable));
448                }
449                Peripheral::Mcpwm1 => {
450                    crate::peripherals::SYSTEM::regs()
451                        .perip_clk_en0()
452                        .modify(|_, w| w.pwm1_clk_en().bit(enable));
453                }
454                Peripheral::Pcnt => {
455                    crate::peripherals::SYSTEM::regs()
456                        .perip_clk_en0()
457                        .modify(|_, w| w.pcnt_clk_en().bit(enable));
458                }
459                Peripheral::Rmt => {
460                    crate::peripherals::SYSTEM::regs()
461                        .perip_clk_en0()
462                        .modify(|_, w| w.rmt_clk_en().bit(enable));
463                }
464                Peripheral::Rsa => {
465                    crate::peripherals::SYSTEM::regs()
466                        .perip_clk_en1()
467                        .modify(|_, w| w.crypto_rsa_clk_en().bit(enable));
468                }
469                Peripheral::Sha => {
470                    crate::peripherals::SYSTEM::regs()
471                        .perip_clk_en1()
472                        .modify(|_, w| w.crypto_sha_clk_en().bit(enable));
473                }
474                Peripheral::Spi2 => {
475                    crate::peripherals::SYSTEM::regs()
476                        .perip_clk_en0()
477                        .modify(|_, w| w.spi2_clk_en().bit(enable));
478                }
479                Peripheral::Spi2Dma => {
480                    crate::peripherals::SYSTEM::regs()
481                        .perip_clk_en0()
482                        .modify(|_, w| w.spi2_dma_clk_en().bit(enable));
483                }
484                Peripheral::Spi3 => {
485                    crate::peripherals::SYSTEM::regs()
486                        .perip_clk_en0()
487                        .modify(|_, w| w.spi3_clk_en().bit(enable));
488                }
489                Peripheral::Spi3Dma => {
490                    crate::peripherals::SYSTEM::regs()
491                        .perip_clk_en0()
492                        .modify(|_, w| w.spi3_dma_clk_en().bit(enable));
493                }
494                Peripheral::Systimer => {
495                    crate::peripherals::SYSTEM::regs()
496                        .perip_clk_en0()
497                        .modify(|_, w| w.systimer_clk_en().bit(enable));
498                }
499                Peripheral::Timg0 => {
500                    crate::peripherals::SYSTEM::regs()
501                        .perip_clk_en0()
502                        .modify(|_, w| w.timergroup_clk_en().bit(enable));
503                }
504                Peripheral::Timg1 => {
505                    crate::peripherals::SYSTEM::regs()
506                        .perip_clk_en0()
507                        .modify(|_, w| w.timergroup1_clk_en().bit(enable));
508                }
509                Peripheral::Twai0 => {
510                    crate::peripherals::SYSTEM::regs()
511                        .perip_clk_en0()
512                        .modify(|_, w| w.twai_clk_en().bit(enable));
513                }
514                Peripheral::Uart0 => {
515                    crate::peripherals::SYSTEM::regs()
516                        .perip_clk_en0()
517                        .modify(|_, w| w.uart_clk_en().bit(enable));
518                }
519                Peripheral::Uart1 => {
520                    crate::peripherals::SYSTEM::regs()
521                        .perip_clk_en0()
522                        .modify(|_, w| w.uart1_clk_en().bit(enable));
523                }
524                Peripheral::UartMem => {
525                    crate::peripherals::SYSTEM::regs()
526                        .perip_clk_en0()
527                        .modify(|_, w| w.uart_mem_clk_en().bit(enable));
528                }
529                Peripheral::Uhci0 => {
530                    crate::peripherals::SYSTEM::regs()
531                        .perip_clk_en0()
532                        .modify(|_, w| w.uhci0_clk_en().bit(enable));
533                }
534                Peripheral::Uhci1 => {
535                    crate::peripherals::SYSTEM::regs()
536                        .perip_clk_en0()
537                        .modify(|_, w| w.uhci1_clk_en().bit(enable));
538                }
539                Peripheral::Usb => {
540                    crate::peripherals::SYSTEM::regs()
541                        .perip_clk_en0()
542                        .modify(|_, w| w.usb_clk_en().bit(enable));
543                }
544                Peripheral::Wdg => {
545                    crate::peripherals::SYSTEM::regs()
546                        .perip_clk_en0()
547                        .modify(|_, w| w.wdg_clk_en().bit(enable));
548                }
549            }
550        }
551        unsafe fn assert_peri_reset_racey(peripheral: Peripheral, reset: bool) {
552            match peripheral {
553                Peripheral::Aes => {
554                    crate::peripherals::SYSTEM::regs()
555                        .perip_rst_en1()
556                        .modify(|_, w| w.crypto_aes_rst().bit(reset));
557                }
558                Peripheral::ApbSarAdc => {
559                    crate::peripherals::SYSTEM::regs()
560                        .perip_rst_en0()
561                        .modify(|_, w| w.apb_saradc_rst().bit(reset));
562                }
563                Peripheral::CopyDma => {
564                    crate::peripherals::DMA_COPY::regs().conf().modify(|_, w| {
565                        w.in_rst()
566                            .bit(reset)
567                            .out_rst()
568                            .bit(reset)
569                            .cmdfifo_rst()
570                            .bit(reset)
571                            .fifo_rst()
572                            .bit(reset)
573                    });
574                }
575                Peripheral::CryptoDma => {
576                    crate::peripherals::SYSTEM::regs()
577                        .perip_rst_en1()
578                        .modify(|_, w| w.crypto_dma_rst().bit(reset));
579                }
580                Peripheral::Ds => {
581                    crate::peripherals::SYSTEM::regs()
582                        .perip_rst_en1()
583                        .modify(|_, w| w.crypto_ds_rst().bit(reset));
584                }
585                Peripheral::Hmac => {
586                    crate::peripherals::SYSTEM::regs()
587                        .perip_rst_en1()
588                        .modify(|_, w| w.crypto_hmac_rst().bit(reset));
589                }
590                Peripheral::I2cExt0 => {
591                    crate::peripherals::SYSTEM::regs()
592                        .perip_rst_en0()
593                        .modify(|_, w| w.i2c_ext0_rst().bit(reset));
594                }
595                Peripheral::I2cExt1 => {
596                    crate::peripherals::SYSTEM::regs()
597                        .perip_rst_en0()
598                        .modify(|_, w| w.i2c_ext1_rst().bit(reset));
599                }
600                Peripheral::I2s0 => {
601                    crate::peripherals::SYSTEM::regs()
602                        .perip_rst_en0()
603                        .modify(|_, w| w.i2s0_rst().bit(reset));
604                }
605                Peripheral::Ledc => {
606                    crate::peripherals::SYSTEM::regs()
607                        .perip_rst_en0()
608                        .modify(|_, w| w.ledc_rst().bit(reset));
609                }
610                Peripheral::Mcpwm0 => {
611                    crate::peripherals::SYSTEM::regs()
612                        .perip_rst_en0()
613                        .modify(|_, w| w.pwm0_rst().bit(reset));
614                }
615                Peripheral::Mcpwm1 => {
616                    crate::peripherals::SYSTEM::regs()
617                        .perip_rst_en0()
618                        .modify(|_, w| w.pwm1_rst().bit(reset));
619                }
620                Peripheral::Pcnt => {
621                    crate::peripherals::SYSTEM::regs()
622                        .perip_rst_en0()
623                        .modify(|_, w| w.pcnt_rst().bit(reset));
624                }
625                Peripheral::Rmt => {
626                    crate::peripherals::SYSTEM::regs()
627                        .perip_rst_en0()
628                        .modify(|_, w| w.rmt_rst().bit(reset));
629                }
630                Peripheral::Rsa => {
631                    crate::peripherals::SYSTEM::regs()
632                        .perip_rst_en1()
633                        .modify(|_, w| w.crypto_rsa_rst().bit(reset));
634                }
635                Peripheral::Sha => {
636                    crate::peripherals::SYSTEM::regs()
637                        .perip_rst_en1()
638                        .modify(|_, w| w.crypto_sha_rst().bit(reset));
639                }
640                Peripheral::Spi2 => {
641                    crate::peripherals::SYSTEM::regs()
642                        .perip_rst_en0()
643                        .modify(|_, w| w.spi2_rst().bit(reset));
644                }
645                Peripheral::Spi2Dma => {
646                    crate::peripherals::SYSTEM::regs()
647                        .perip_rst_en0()
648                        .modify(|_, w| w.spi2_dma_rst().bit(reset));
649                }
650                Peripheral::Spi3 => {
651                    crate::peripherals::SYSTEM::regs()
652                        .perip_rst_en0()
653                        .modify(|_, w| w.spi3_rst().bit(reset));
654                }
655                Peripheral::Spi3Dma => {
656                    crate::peripherals::SYSTEM::regs()
657                        .perip_rst_en0()
658                        .modify(|_, w| w.spi3_dma_rst().bit(reset));
659                }
660                Peripheral::Systimer => {
661                    crate::peripherals::SYSTEM::regs()
662                        .perip_rst_en0()
663                        .modify(|_, w| w.systimer_rst().bit(reset));
664                }
665                Peripheral::Timg0 => {
666                    crate::peripherals::SYSTEM::regs()
667                        .perip_rst_en0()
668                        .modify(|_, w| w.timergroup_rst().bit(reset));
669                }
670                Peripheral::Timg1 => {
671                    crate::peripherals::SYSTEM::regs()
672                        .perip_rst_en0()
673                        .modify(|_, w| w.timergroup1_rst().bit(reset));
674                }
675                Peripheral::Twai0 => {
676                    crate::peripherals::SYSTEM::regs()
677                        .perip_rst_en0()
678                        .modify(|_, w| w.twai_rst().bit(reset));
679                }
680                Peripheral::Uart0 => {
681                    crate::peripherals::SYSTEM::regs()
682                        .perip_rst_en0()
683                        .modify(|_, w| w.uart_rst().bit(reset));
684                }
685                Peripheral::Uart1 => {
686                    crate::peripherals::SYSTEM::regs()
687                        .perip_rst_en0()
688                        .modify(|_, w| w.uart1_rst().bit(reset));
689                }
690                Peripheral::UartMem => {
691                    crate::peripherals::SYSTEM::regs()
692                        .perip_rst_en0()
693                        .modify(|_, w| w.uart_mem_rst().bit(reset));
694                }
695                Peripheral::Uhci0 => {
696                    crate::peripherals::SYSTEM::regs()
697                        .perip_rst_en0()
698                        .modify(|_, w| w.uhci0_rst().bit(reset));
699                }
700                Peripheral::Uhci1 => {
701                    crate::peripherals::SYSTEM::regs()
702                        .perip_rst_en0()
703                        .modify(|_, w| w.uhci1_rst().bit(reset));
704                }
705                Peripheral::Usb => {
706                    crate::peripherals::SYSTEM::regs()
707                        .perip_rst_en0()
708                        .modify(|_, w| w.usb_rst().bit(reset));
709                }
710                Peripheral::Wdg => {
711                    crate::peripherals::SYSTEM::regs()
712                        .perip_rst_en0()
713                        .modify(|_, w| w.wdg_rst().bit(reset));
714                }
715            }
716        }
717    };
718}
719/// Macro to get the address range of the given memory region.
720///
721/// This macro provides two syntax options for each memory region:
722///
723/// - `memory_range!("region_name")` returns the address range as a range expression (`start..end`).
724/// - `memory_range!(size as str, "region_name")` returns the size of the region as a string
725///   literal.
726#[macro_export]
727#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
728macro_rules! memory_range {
729    ("DRAM") => {
730        1073414144..1073741824
731    };
732    (size as str, "DRAM") => {
733        "327680"
734    };
735    ("DRAM2_UNINIT") => {
736        1073602560..1073741824
737    };
738    (size as str, "DRAM2_UNINIT") => {
739        "139264"
740    };
741}
742#[macro_export]
743#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
744macro_rules! for_each_aes_key_length {
745    ($($pattern:tt => $code:tt;)*) => {
746        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
747        _for_each_inner!((128)); _for_each_inner!((192)); _for_each_inner!((256));
748        _for_each_inner!((128, 0, 4)); _for_each_inner!((192, 1, 5));
749        _for_each_inner!((256, 2, 6)); _for_each_inner!((bits(128), (192), (256)));
750        _for_each_inner!((modes(128, 0, 4), (192, 1, 5), (256, 2, 6)));
751    };
752}
753/// This macro can be used to generate code for each channel of the RMT peripheral.
754///
755/// For an explanation on the general syntax, as well as usage of individual/repeated
756/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
757///
758/// This macro has three options for its "Individual matcher" case:
759///
760/// - `all`: `($num:literal)`
761/// - `tx`: `($num:literal, $idx:literal)`
762/// - `rx`: `($num:literal, $idx:literal)`
763///
764/// Macro fragments:
765///
766/// - `$num`: number of the channel, e.g. `0`
767/// - `$idx`: index of the channel among channels of the same capability, e.g. `0`
768///
769/// Example data:
770///
771/// - `all`: `(0)`
772/// - `tx`: `(1, 1)`
773/// - `rx`: `(2, 0)`
774#[macro_export]
775#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
776macro_rules! for_each_rmt_channel {
777    ($($pattern:tt => $code:tt;)*) => {
778        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
779        _for_each_inner!((0)); _for_each_inner!((1)); _for_each_inner!((2));
780        _for_each_inner!((3)); _for_each_inner!((0, 0)); _for_each_inner!((1, 1));
781        _for_each_inner!((2, 2)); _for_each_inner!((3, 3)); _for_each_inner!((0, 0));
782        _for_each_inner!((1, 1)); _for_each_inner!((2, 2)); _for_each_inner!((3, 3));
783        _for_each_inner!((all(0), (1), (2), (3))); _for_each_inner!((tx(0, 0), (1, 1),
784        (2, 2), (3, 3))); _for_each_inner!((rx(0, 0), (1, 1), (2, 2), (3, 3)));
785    };
786}
787#[macro_export]
788#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
789macro_rules! for_each_rmt_clock_source {
790    ($($pattern:tt => $code:tt;)*) => {
791        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
792        _for_each_inner!((RefTick, 0)); _for_each_inner!((Apb, 1));
793        _for_each_inner!((Apb)); _for_each_inner!((all(RefTick, 0), (Apb, 1)));
794        _for_each_inner!((default(Apb))); _for_each_inner!((is_boolean));
795    };
796}
797#[macro_export]
798#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
799macro_rules! for_each_rsa_exponentiation {
800    ($($pattern:tt => $code:tt;)*) => {
801        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
802        _for_each_inner!((32)); _for_each_inner!((64)); _for_each_inner!((96));
803        _for_each_inner!((128)); _for_each_inner!((160)); _for_each_inner!((192));
804        _for_each_inner!((224)); _for_each_inner!((256)); _for_each_inner!((288));
805        _for_each_inner!((320)); _for_each_inner!((352)); _for_each_inner!((384));
806        _for_each_inner!((416)); _for_each_inner!((448)); _for_each_inner!((480));
807        _for_each_inner!((512)); _for_each_inner!((544)); _for_each_inner!((576));
808        _for_each_inner!((608)); _for_each_inner!((640)); _for_each_inner!((672));
809        _for_each_inner!((704)); _for_each_inner!((736)); _for_each_inner!((768));
810        _for_each_inner!((800)); _for_each_inner!((832)); _for_each_inner!((864));
811        _for_each_inner!((896)); _for_each_inner!((928)); _for_each_inner!((960));
812        _for_each_inner!((992)); _for_each_inner!((1024)); _for_each_inner!((1056));
813        _for_each_inner!((1088)); _for_each_inner!((1120)); _for_each_inner!((1152));
814        _for_each_inner!((1184)); _for_each_inner!((1216)); _for_each_inner!((1248));
815        _for_each_inner!((1280)); _for_each_inner!((1312)); _for_each_inner!((1344));
816        _for_each_inner!((1376)); _for_each_inner!((1408)); _for_each_inner!((1440));
817        _for_each_inner!((1472)); _for_each_inner!((1504)); _for_each_inner!((1536));
818        _for_each_inner!((1568)); _for_each_inner!((1600)); _for_each_inner!((1632));
819        _for_each_inner!((1664)); _for_each_inner!((1696)); _for_each_inner!((1728));
820        _for_each_inner!((1760)); _for_each_inner!((1792)); _for_each_inner!((1824));
821        _for_each_inner!((1856)); _for_each_inner!((1888)); _for_each_inner!((1920));
822        _for_each_inner!((1952)); _for_each_inner!((1984)); _for_each_inner!((2016));
823        _for_each_inner!((2048)); _for_each_inner!((2080)); _for_each_inner!((2112));
824        _for_each_inner!((2144)); _for_each_inner!((2176)); _for_each_inner!((2208));
825        _for_each_inner!((2240)); _for_each_inner!((2272)); _for_each_inner!((2304));
826        _for_each_inner!((2336)); _for_each_inner!((2368)); _for_each_inner!((2400));
827        _for_each_inner!((2432)); _for_each_inner!((2464)); _for_each_inner!((2496));
828        _for_each_inner!((2528)); _for_each_inner!((2560)); _for_each_inner!((2592));
829        _for_each_inner!((2624)); _for_each_inner!((2656)); _for_each_inner!((2688));
830        _for_each_inner!((2720)); _for_each_inner!((2752)); _for_each_inner!((2784));
831        _for_each_inner!((2816)); _for_each_inner!((2848)); _for_each_inner!((2880));
832        _for_each_inner!((2912)); _for_each_inner!((2944)); _for_each_inner!((2976));
833        _for_each_inner!((3008)); _for_each_inner!((3040)); _for_each_inner!((3072));
834        _for_each_inner!((3104)); _for_each_inner!((3136)); _for_each_inner!((3168));
835        _for_each_inner!((3200)); _for_each_inner!((3232)); _for_each_inner!((3264));
836        _for_each_inner!((3296)); _for_each_inner!((3328)); _for_each_inner!((3360));
837        _for_each_inner!((3392)); _for_each_inner!((3424)); _for_each_inner!((3456));
838        _for_each_inner!((3488)); _for_each_inner!((3520)); _for_each_inner!((3552));
839        _for_each_inner!((3584)); _for_each_inner!((3616)); _for_each_inner!((3648));
840        _for_each_inner!((3680)); _for_each_inner!((3712)); _for_each_inner!((3744));
841        _for_each_inner!((3776)); _for_each_inner!((3808)); _for_each_inner!((3840));
842        _for_each_inner!((3872)); _for_each_inner!((3904)); _for_each_inner!((3936));
843        _for_each_inner!((3968)); _for_each_inner!((4000)); _for_each_inner!((4032));
844        _for_each_inner!((4064)); _for_each_inner!((4096)); _for_each_inner!((all(32),
845        (64), (96), (128), (160), (192), (224), (256), (288), (320), (352), (384), (416),
846        (448), (480), (512), (544), (576), (608), (640), (672), (704), (736), (768),
847        (800), (832), (864), (896), (928), (960), (992), (1024), (1056), (1088), (1120),
848        (1152), (1184), (1216), (1248), (1280), (1312), (1344), (1376), (1408), (1440),
849        (1472), (1504), (1536), (1568), (1600), (1632), (1664), (1696), (1728), (1760),
850        (1792), (1824), (1856), (1888), (1920), (1952), (1984), (2016), (2048), (2080),
851        (2112), (2144), (2176), (2208), (2240), (2272), (2304), (2336), (2368), (2400),
852        (2432), (2464), (2496), (2528), (2560), (2592), (2624), (2656), (2688), (2720),
853        (2752), (2784), (2816), (2848), (2880), (2912), (2944), (2976), (3008), (3040),
854        (3072), (3104), (3136), (3168), (3200), (3232), (3264), (3296), (3328), (3360),
855        (3392), (3424), (3456), (3488), (3520), (3552), (3584), (3616), (3648), (3680),
856        (3712), (3744), (3776), (3808), (3840), (3872), (3904), (3936), (3968), (4000),
857        (4032), (4064), (4096)));
858    };
859}
860#[macro_export]
861#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
862macro_rules! for_each_rsa_multiplication {
863    ($($pattern:tt => $code:tt;)*) => {
864        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
865        _for_each_inner!((32)); _for_each_inner!((64)); _for_each_inner!((96));
866        _for_each_inner!((128)); _for_each_inner!((160)); _for_each_inner!((192));
867        _for_each_inner!((224)); _for_each_inner!((256)); _for_each_inner!((288));
868        _for_each_inner!((320)); _for_each_inner!((352)); _for_each_inner!((384));
869        _for_each_inner!((416)); _for_each_inner!((448)); _for_each_inner!((480));
870        _for_each_inner!((512)); _for_each_inner!((544)); _for_each_inner!((576));
871        _for_each_inner!((608)); _for_each_inner!((640)); _for_each_inner!((672));
872        _for_each_inner!((704)); _for_each_inner!((736)); _for_each_inner!((768));
873        _for_each_inner!((800)); _for_each_inner!((832)); _for_each_inner!((864));
874        _for_each_inner!((896)); _for_each_inner!((928)); _for_each_inner!((960));
875        _for_each_inner!((992)); _for_each_inner!((1024)); _for_each_inner!((1056));
876        _for_each_inner!((1088)); _for_each_inner!((1120)); _for_each_inner!((1152));
877        _for_each_inner!((1184)); _for_each_inner!((1216)); _for_each_inner!((1248));
878        _for_each_inner!((1280)); _for_each_inner!((1312)); _for_each_inner!((1344));
879        _for_each_inner!((1376)); _for_each_inner!((1408)); _for_each_inner!((1440));
880        _for_each_inner!((1472)); _for_each_inner!((1504)); _for_each_inner!((1536));
881        _for_each_inner!((1568)); _for_each_inner!((1600)); _for_each_inner!((1632));
882        _for_each_inner!((1664)); _for_each_inner!((1696)); _for_each_inner!((1728));
883        _for_each_inner!((1760)); _for_each_inner!((1792)); _for_each_inner!((1824));
884        _for_each_inner!((1856)); _for_each_inner!((1888)); _for_each_inner!((1920));
885        _for_each_inner!((1952)); _for_each_inner!((1984)); _for_each_inner!((2016));
886        _for_each_inner!((2048)); _for_each_inner!((all(32), (64), (96), (128), (160),
887        (192), (224), (256), (288), (320), (352), (384), (416), (448), (480), (512),
888        (544), (576), (608), (640), (672), (704), (736), (768), (800), (832), (864),
889        (896), (928), (960), (992), (1024), (1056), (1088), (1120), (1152), (1184),
890        (1216), (1248), (1280), (1312), (1344), (1376), (1408), (1440), (1472), (1504),
891        (1536), (1568), (1600), (1632), (1664), (1696), (1728), (1760), (1792), (1824),
892        (1856), (1888), (1920), (1952), (1984), (2016), (2048)));
893    };
894}
895#[macro_export]
896#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
897macro_rules! for_each_sha_algorithm {
898    ($($pattern:tt => $code:tt;)*) => {
899        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
900        _for_each_inner!((Sha1, "SHA-1"(sizes : 64, 20, 8) (insecure_against :
901        "collision", "length extension"), 0)); _for_each_inner!((Sha224, "SHA-224"(sizes
902        : 64, 28, 8) (insecure_against : "length extension"), 1));
903        _for_each_inner!((Sha256, "SHA-256"(sizes : 64, 32, 8) (insecure_against :
904        "length extension"), 2)); _for_each_inner!((Sha384, "SHA-384"(sizes : 128, 48,
905        16) (insecure_against :), 3)); _for_each_inner!((Sha512, "SHA-512"(sizes : 128,
906        64, 16) (insecure_against : "length extension"), 4));
907        _for_each_inner!((Sha512_224, "SHA-512/224"(sizes : 128, 28, 16)
908        (insecure_against :), 5)); _for_each_inner!((Sha512_256, "SHA-512/256"(sizes :
909        128, 32, 16) (insecure_against :), 6)); _for_each_inner!((algos(Sha1,
910        "SHA-1"(sizes : 64, 20, 8) (insecure_against : "collision", "length extension"),
911        0), (Sha224, "SHA-224"(sizes : 64, 28, 8) (insecure_against :
912        "length extension"), 1), (Sha256, "SHA-256"(sizes : 64, 32, 8) (insecure_against
913        : "length extension"), 2), (Sha384, "SHA-384"(sizes : 128, 48, 16)
914        (insecure_against :), 3), (Sha512, "SHA-512"(sizes : 128, 64, 16)
915        (insecure_against : "length extension"), 4), (Sha512_224, "SHA-512/224"(sizes :
916        128, 28, 16) (insecure_against :), 5), (Sha512_256, "SHA-512/256"(sizes : 128,
917        32, 16) (insecure_against :), 6)));
918    };
919}
920/// This macro can be used to generate code for each peripheral instance of the I2C master driver.
921///
922/// For an explanation on the general syntax, as well as usage of individual/repeated
923/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
924///
925/// This macro has one option for its "Individual matcher" case:
926///
927/// Syntax: `($instance:ident, $sys:ident, $scl:ident, $sda:ident)`
928///
929/// Macro fragments:
930///
931/// - `$instance`: the name of the I2C instance
932/// - `$sys`: the name of the instance as it is in the `esp_hal::system::Peripheral` enum.
933/// - `$scl`, `$sda`: peripheral signal names.
934///
935/// Example data: `(I2C0, I2cExt0, I2CEXT0_SCL, I2CEXT0_SDA)`
936#[macro_export]
937#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
938macro_rules! for_each_i2c_master {
939    ($($pattern:tt => $code:tt;)*) => {
940        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
941        _for_each_inner!((I2C0, I2cExt0, I2CEXT0_SCL, I2CEXT0_SDA));
942        _for_each_inner!((I2C1, I2cExt1, I2CEXT1_SCL, I2CEXT1_SDA));
943        _for_each_inner!((all(I2C0, I2cExt0, I2CEXT0_SCL, I2CEXT0_SDA), (I2C1, I2cExt1,
944        I2CEXT1_SCL, I2CEXT1_SDA)));
945    };
946}
947/// This macro can be used to generate code for each peripheral instance of the UART driver.
948///
949/// For an explanation on the general syntax, as well as usage of individual/repeated
950/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
951///
952/// This macro has one option for its "Individual matcher" case:
953///
954/// Syntax: `($instance:ident, $sys:ident, $rx:ident, $tx:ident, $cts:ident, $rts:ident)`
955///
956/// Macro fragments:
957///
958/// - `$instance`: the name of the UART instance
959/// - `$sys`: the name of the instance as it is in the `esp_hal::system::Peripheral` enum.
960/// - `$rx`, `$tx`, `$cts`, `$rts`: signal names.
961///
962/// Example data: `(UART0, Uart0, U0RXD, U0TXD, U0CTS, U0RTS)`
963#[macro_export]
964#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
965macro_rules! for_each_uart {
966    ($($pattern:tt => $code:tt;)*) => {
967        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
968        _for_each_inner!((UART0, Uart0, U0RXD, U0TXD, U0CTS, U0RTS));
969        _for_each_inner!((UART1, Uart1, U1RXD, U1TXD, U1CTS, U1RTS));
970        _for_each_inner!((all(UART0, Uart0, U0RXD, U0TXD, U0CTS, U0RTS), (UART1, Uart1,
971        U1RXD, U1TXD, U1CTS, U1RTS)));
972    };
973}
974/// This macro can be used to generate code for each peripheral instance of the SPI master driver.
975///
976/// For an explanation on the general syntax, as well as usage of individual/repeated
977/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
978///
979/// This macro has one option for its "Individual matcher" case:
980///
981/// Syntax: `($instance:ident, $sys:ident, $sclk:ident, [$($cs:ident),*] [$($sio:ident),*
982/// $($is_qspi:iteral)?])`
983///
984/// Macro fragments:
985///
986/// - `$instance`: the name of the SPI instance
987/// - `$sys`: the name of the instance as it is in the `esp_hal::system::Peripheral` enum.
988/// - `$cs`, `$sio`: chip select and SIO signal names.
989/// - `$is_qspi`: a `true` literal present if the SPI instance supports QSPI.
990///
991/// Example data:
992/// - `(SPI2, Spi2, FSPICLK [FSPICS0, FSPICS1, FSPICS2, FSPICS3, FSPICS4, FSPICS5] [FSPID, FSPIQ,
993///   FSPIWP, FSPIHD, FSPIIO4, FSPIIO5, FSPIIO6, FSPIIO7], true)`
994/// - `(SPI3, Spi3, SPI3_CLK [SPI3_CS0, SPI3_CS1, SPI3_CS2] [SPI3_D, SPI3_Q])`
995#[macro_export]
996#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
997macro_rules! for_each_spi_master {
998    ($($pattern:tt => $code:tt;)*) => {
999        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
1000        _for_each_inner!((SPI2, Spi2, FSPICLK[FSPICS0, FSPICS1, FSPICS2, FSPICS3,
1001        FSPICS4, FSPICS5] [FSPID, FSPIQ, FSPIWP, FSPIHD, FSPIIO4, FSPIIO5, FSPIIO6,
1002        FSPIIO7], true)); _for_each_inner!((SPI3, Spi3, SPI3_CLK[SPI3_CS0, SPI3_CS1,
1003        SPI3_CS2] [SPI3_D, SPI3_Q])); _for_each_inner!((all(SPI2, Spi2, FSPICLK[FSPICS0,
1004        FSPICS1, FSPICS2, FSPICS3, FSPICS4, FSPICS5] [FSPID, FSPIQ, FSPIWP, FSPIHD,
1005        FSPIIO4, FSPIIO5, FSPIIO6, FSPIIO7], true), (SPI3, Spi3, SPI3_CLK[SPI3_CS0,
1006        SPI3_CS1, SPI3_CS2] [SPI3_D, SPI3_Q])));
1007    };
1008}
1009/// This macro can be used to generate code for each peripheral instance of the SPI slave driver.
1010///
1011/// For an explanation on the general syntax, as well as usage of individual/repeated
1012/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
1013///
1014/// This macro has one option for its "Individual matcher" case:
1015///
1016/// Syntax: `($instance:ident, $sys:ident, $sclk:ident, $mosi:ident, $miso:ident, $cs:ident)`
1017///
1018/// Macro fragments:
1019///
1020/// - `$instance`: the name of the I2C instance
1021/// - `$sys`: the name of the instance as it is in the `esp_hal::system::Peripheral` enum.
1022/// - `$mosi`, `$miso`, `$cs`: signal names.
1023///
1024/// Example data: `(SPI2, Spi2, FSPICLK, FSPID, FSPIQ, FSPICS0)`
1025#[macro_export]
1026#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
1027macro_rules! for_each_spi_slave {
1028    ($($pattern:tt => $code:tt;)*) => {
1029        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
1030        _for_each_inner!((SPI2, Spi2, FSPICLK, FSPID, FSPIQ, FSPICS0));
1031        _for_each_inner!((SPI3, Spi3, SPI3_CLK, SPI3_D, SPI3_Q, SPI3_CS0));
1032        _for_each_inner!((all(SPI2, Spi2, FSPICLK, FSPID, FSPIQ, FSPICS0), (SPI3, Spi3,
1033        SPI3_CLK, SPI3_D, SPI3_Q, SPI3_CS0)));
1034    };
1035}
1036#[macro_export]
1037#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
1038macro_rules! for_each_peripheral {
1039    ($($pattern:tt => $code:tt;)*) => {
1040        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
1041        _for_each_inner!((GPIO0 <= virtual())); _for_each_inner!((GPIO1 <= virtual()));
1042        _for_each_inner!((GPIO2 <= virtual())); _for_each_inner!((GPIO3 <= virtual()));
1043        _for_each_inner!((GPIO4 <= virtual())); _for_each_inner!((GPIO5 <= virtual()));
1044        _for_each_inner!((GPIO6 <= virtual())); _for_each_inner!((GPIO7 <= virtual()));
1045        _for_each_inner!((GPIO8 <= virtual())); _for_each_inner!((GPIO9 <= virtual()));
1046        _for_each_inner!((GPIO10 <= virtual())); _for_each_inner!((GPIO11 <= virtual()));
1047        _for_each_inner!((GPIO12 <= virtual())); _for_each_inner!((GPIO13 <= virtual()));
1048        _for_each_inner!((GPIO14 <= virtual())); _for_each_inner!((GPIO15 <= virtual()));
1049        _for_each_inner!((GPIO16 <= virtual())); _for_each_inner!((GPIO17 <= virtual()));
1050        _for_each_inner!((GPIO18 <= virtual())); _for_each_inner!((GPIO19 <= virtual()));
1051        _for_each_inner!((GPIO20 <= virtual())); _for_each_inner!((GPIO21 <= virtual()));
1052        _for_each_inner!((GPIO33 <= virtual())); _for_each_inner!((GPIO34 <= virtual()));
1053        _for_each_inner!((GPIO35 <= virtual())); _for_each_inner!((GPIO36 <= virtual()));
1054        _for_each_inner!((GPIO37 <= virtual())); _for_each_inner!((GPIO38 <= virtual()));
1055        _for_each_inner!((GPIO39 <= virtual())); _for_each_inner!((GPIO40 <= virtual()));
1056        _for_each_inner!((GPIO41 <= virtual())); _for_each_inner!((GPIO42 <= virtual()));
1057        _for_each_inner!((GPIO43 <= virtual())); _for_each_inner!((GPIO44 <= virtual()));
1058        _for_each_inner!((GPIO45 <= virtual())); _for_each_inner!((GPIO46 <= virtual()));
1059        _for_each_inner!((AES <= AES(AES : { bind_peri_interrupt, enable_peri_interrupt,
1060        disable_peri_interrupt }) (unstable))); _for_each_inner!((APB_SARADC <=
1061        APB_SARADC() (unstable))); _for_each_inner!((DEDICATED_GPIO <= DEDICATED_GPIO()
1062        (unstable))); _for_each_inner!((DS <= DS() (unstable))); _for_each_inner!((EFUSE
1063        <= EFUSE() (unstable))); _for_each_inner!((EXTMEM <= EXTMEM() (unstable)));
1064        _for_each_inner!((FE <= FE() (unstable))); _for_each_inner!((FE2 <= FE2()
1065        (unstable))); _for_each_inner!((GPIO <= GPIO() (unstable)));
1066        _for_each_inner!((GPIO_SD <= GPIO_SD() (unstable))); _for_each_inner!((HMAC <=
1067        HMAC() (unstable))); _for_each_inner!((I2C_ANA_MST <= I2C_ANA_MST() (unstable)));
1068        _for_each_inner!((I2C0 <= I2C0(I2C_EXT0 : { bind_peri_interrupt,
1069        enable_peri_interrupt, disable_peri_interrupt }))); _for_each_inner!((I2C1 <=
1070        I2C1(I2C_EXT1 : { bind_peri_interrupt, enable_peri_interrupt,
1071        disable_peri_interrupt }))); _for_each_inner!((I2S0 <= I2S0(I2S0 : {
1072        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })
1073        (unstable))); _for_each_inner!((INTERRUPT_CORE0 <= INTERRUPT_CORE0()
1074        (unstable))); _for_each_inner!((IO_MUX <= IO_MUX() (unstable)));
1075        _for_each_inner!((LEDC <= LEDC() (unstable))); _for_each_inner!((NRX <= NRX()
1076        (unstable))); _for_each_inner!((PCNT <= PCNT() (unstable)));
1077        _for_each_inner!((PMS <= PMS() (unstable))); _for_each_inner!((RMT <= RMT()
1078        (unstable))); _for_each_inner!((RNG <= RNG() (unstable))); _for_each_inner!((RSA
1079        <= RSA(RSA : { bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt
1080        }) (unstable))); _for_each_inner!((LPWR <= RTC_CNTL() (unstable)));
1081        _for_each_inner!((RTC_I2C <= RTC_I2C() (unstable))); _for_each_inner!((RTC_IO <=
1082        RTC_IO() (unstable))); _for_each_inner!((SENS <= SENS() (unstable)));
1083        _for_each_inner!((SHA <= SHA(SHA : { bind_peri_interrupt, enable_peri_interrupt,
1084        disable_peri_interrupt }) (unstable))); _for_each_inner!((SPI0 <= SPI0()
1085        (unstable))); _for_each_inner!((SPI1 <= SPI1() (unstable)));
1086        _for_each_inner!((SPI2 <= SPI2(SPI2_DMA : { bind_dma_interrupt,
1087        enable_dma_interrupt, disable_dma_interrupt }, SPI2 : { bind_peri_interrupt,
1088        enable_peri_interrupt, disable_peri_interrupt }))); _for_each_inner!((SPI3 <=
1089        SPI3(SPI3_DMA : { bind_dma_interrupt, enable_dma_interrupt, disable_dma_interrupt
1090        }, SPI3 : { bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt
1091        }))); _for_each_inner!((SYSCON <= SYSCON() (unstable))); _for_each_inner!((SYSTEM
1092        <= SYSTEM() (unstable))); _for_each_inner!((SYSTIMER <= SYSTIMER() (unstable)));
1093        _for_each_inner!((TIMG0 <= TIMG0() (unstable))); _for_each_inner!((TIMG1 <=
1094        TIMG1() (unstable))); _for_each_inner!((TWAI0 <= TWAI0() (unstable)));
1095        _for_each_inner!((UART0 <= UART0(UART0 : { bind_peri_interrupt,
1096        enable_peri_interrupt, disable_peri_interrupt }))); _for_each_inner!((UART1 <=
1097        UART1(UART1 : { bind_peri_interrupt, enable_peri_interrupt,
1098        disable_peri_interrupt }))); _for_each_inner!((UHCI0 <= UHCI0() (unstable)));
1099        _for_each_inner!((USB0 <= USB0() (unstable))); _for_each_inner!((USB_WRAP <=
1100        USB_WRAP() (unstable))); _for_each_inner!((XTS_AES <= XTS_AES() (unstable)));
1101        _for_each_inner!((WIFI <= WIFI() (unstable))); _for_each_inner!((DMA_SPI2 <=
1102        SPI2() (unstable))); _for_each_inner!((DMA_SPI3 <= SPI3() (unstable)));
1103        _for_each_inner!((DMA_I2S0 <= I2S0() (unstable))); _for_each_inner!((DMA_CRYPTO
1104        <= CRYPTO_DMA() (unstable))); _for_each_inner!((DMA_COPY <= COPY_DMA()
1105        (unstable))); _for_each_inner!((ADC1 <= virtual() (unstable)));
1106        _for_each_inner!((ADC2 <= virtual() (unstable))); _for_each_inner!((DAC1 <=
1107        virtual() (unstable))); _for_each_inner!((DAC2 <= virtual() (unstable)));
1108        _for_each_inner!((FLASH <= virtual() (unstable))); _for_each_inner!((PSRAM <=
1109        virtual() (unstable))); _for_each_inner!((SW_INTERRUPT <= virtual() (unstable)));
1110        _for_each_inner!((ULP_RISCV_CORE <= virtual() (unstable)));
1111        _for_each_inner!((all(GPIO0 <= virtual()), (GPIO1 <= virtual()), (GPIO2 <=
1112        virtual()), (GPIO3 <= virtual()), (GPIO4 <= virtual()), (GPIO5 <= virtual()),
1113        (GPIO6 <= virtual()), (GPIO7 <= virtual()), (GPIO8 <= virtual()), (GPIO9 <=
1114        virtual()), (GPIO10 <= virtual()), (GPIO11 <= virtual()), (GPIO12 <= virtual()),
1115        (GPIO13 <= virtual()), (GPIO14 <= virtual()), (GPIO15 <= virtual()), (GPIO16 <=
1116        virtual()), (GPIO17 <= virtual()), (GPIO18 <= virtual()), (GPIO19 <= virtual()),
1117        (GPIO20 <= virtual()), (GPIO21 <= virtual()), (GPIO33 <= virtual()), (GPIO34 <=
1118        virtual()), (GPIO35 <= virtual()), (GPIO36 <= virtual()), (GPIO37 <= virtual()),
1119        (GPIO38 <= virtual()), (GPIO39 <= virtual()), (GPIO40 <= virtual()), (GPIO41 <=
1120        virtual()), (GPIO42 <= virtual()), (GPIO43 <= virtual()), (GPIO44 <= virtual()),
1121        (GPIO45 <= virtual()), (GPIO46 <= virtual()), (AES <= AES(AES : {
1122        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })
1123        (unstable)), (APB_SARADC <= APB_SARADC() (unstable)), (DEDICATED_GPIO <=
1124        DEDICATED_GPIO() (unstable)), (DS <= DS() (unstable)), (EFUSE <= EFUSE()
1125        (unstable)), (EXTMEM <= EXTMEM() (unstable)), (FE <= FE() (unstable)), (FE2 <=
1126        FE2() (unstable)), (GPIO <= GPIO() (unstable)), (GPIO_SD <= GPIO_SD()
1127        (unstable)), (HMAC <= HMAC() (unstable)), (I2C_ANA_MST <= I2C_ANA_MST()
1128        (unstable)), (I2C0 <= I2C0(I2C_EXT0 : { bind_peri_interrupt,
1129        enable_peri_interrupt, disable_peri_interrupt })), (I2C1 <= I2C1(I2C_EXT1 : {
1130        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })), (I2S0 <=
1131        I2S0(I2S0 : { bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt
1132        }) (unstable)), (INTERRUPT_CORE0 <= INTERRUPT_CORE0() (unstable)), (IO_MUX <=
1133        IO_MUX() (unstable)), (LEDC <= LEDC() (unstable)), (NRX <= NRX() (unstable)),
1134        (PCNT <= PCNT() (unstable)), (PMS <= PMS() (unstable)), (RMT <= RMT()
1135        (unstable)), (RNG <= RNG() (unstable)), (RSA <= RSA(RSA : { bind_peri_interrupt,
1136        enable_peri_interrupt, disable_peri_interrupt }) (unstable)), (LPWR <= RTC_CNTL()
1137        (unstable)), (RTC_I2C <= RTC_I2C() (unstable)), (RTC_IO <= RTC_IO() (unstable)),
1138        (SENS <= SENS() (unstable)), (SHA <= SHA(SHA : { bind_peri_interrupt,
1139        enable_peri_interrupt, disable_peri_interrupt }) (unstable)), (SPI0 <= SPI0()
1140        (unstable)), (SPI1 <= SPI1() (unstable)), (SPI2 <= SPI2(SPI2_DMA : {
1141        bind_dma_interrupt, enable_dma_interrupt, disable_dma_interrupt }, SPI2 : {
1142        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })), (SPI3 <=
1143        SPI3(SPI3_DMA : { bind_dma_interrupt, enable_dma_interrupt, disable_dma_interrupt
1144        }, SPI3 : { bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt
1145        })), (SYSCON <= SYSCON() (unstable)), (SYSTEM <= SYSTEM() (unstable)), (SYSTIMER
1146        <= SYSTIMER() (unstable)), (TIMG0 <= TIMG0() (unstable)), (TIMG1 <= TIMG1()
1147        (unstable)), (TWAI0 <= TWAI0() (unstable)), (UART0 <= UART0(UART0 : {
1148        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })), (UART1 <=
1149        UART1(UART1 : { bind_peri_interrupt, enable_peri_interrupt,
1150        disable_peri_interrupt })), (UHCI0 <= UHCI0() (unstable)), (USB0 <= USB0()
1151        (unstable)), (USB_WRAP <= USB_WRAP() (unstable)), (XTS_AES <= XTS_AES()
1152        (unstable)), (WIFI <= WIFI() (unstable)), (DMA_SPI2 <= SPI2() (unstable)),
1153        (DMA_SPI3 <= SPI3() (unstable)), (DMA_I2S0 <= I2S0() (unstable)), (DMA_CRYPTO <=
1154        CRYPTO_DMA() (unstable)), (DMA_COPY <= COPY_DMA() (unstable)), (ADC1 <= virtual()
1155        (unstable)), (ADC2 <= virtual() (unstable)), (DAC1 <= virtual() (unstable)),
1156        (DAC2 <= virtual() (unstable)), (FLASH <= virtual() (unstable)), (PSRAM <=
1157        virtual() (unstable)), (SW_INTERRUPT <= virtual() (unstable)), (ULP_RISCV_CORE <=
1158        virtual() (unstable))));
1159    };
1160}
1161/// This macro can be used to generate code for each `GPIOn` instance.
1162///
1163/// For an explanation on the general syntax, as well as usage of individual/repeated
1164/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
1165///
1166/// This macro has one option for its "Individual matcher" case:
1167///
1168/// Syntax: `($n:literal, $gpio:ident ($($digital_input_function:ident =>
1169/// $digital_input_signal:ident)*) ($($digital_output_function:ident =>
1170/// $digital_output_signal:ident)*) ($([$pin_attribute:ident])*))`
1171///
1172/// Macro fragments:
1173///
1174/// - `$n`: the number of the GPIO. For `GPIO0`, `$n` is 0.
1175/// - `$gpio`: the name of the GPIO.
1176/// - `$digital_input_function`: the number of the digital function, as an identifier (i.e. for
1177///   function 0 this is `_0`).
1178/// - `$digital_input_function`: the name of the digital function, as an identifier.
1179/// - `$digital_output_function`: the number of the digital function, as an identifier (i.e. for
1180///   function 0 this is `_0`).
1181/// - `$digital_output_function`: the name of the digital function, as an identifier.
1182/// - `$pin_attribute`: `Input` and/or `Output`, marks the possible directions of the GPIO.
1183///   Bracketed so that they can also be matched as optional fragments. Order is always Input first.
1184///
1185/// Example data: `(0, GPIO0 (_5 => EMAC_TX_CLK) (_1 => CLK_OUT1 _5 => EMAC_TX_CLK) ([Input]
1186/// [Output]))`
1187#[macro_export]
1188#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
1189macro_rules! for_each_gpio {
1190    ($($pattern:tt => $code:tt;)*) => {
1191        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
1192        _for_each_inner!((0, GPIO0() () ([Input] [Output]))); _for_each_inner!((1,
1193        GPIO1() () ([Input] [Output]))); _for_each_inner!((2, GPIO2() () ([Input]
1194        [Output]))); _for_each_inner!((3, GPIO3() () ([Input] [Output])));
1195        _for_each_inner!((4, GPIO4() () ([Input] [Output]))); _for_each_inner!((5,
1196        GPIO5() () ([Input] [Output]))); _for_each_inner!((6, GPIO6() () ([Input]
1197        [Output]))); _for_each_inner!((7, GPIO7() () ([Input] [Output])));
1198        _for_each_inner!((8, GPIO8() (_3 => SUBSPICS1) ([Input] [Output])));
1199        _for_each_inner!((9, GPIO9(_3 => SUBSPIHD _4 => FSPIHD) (_3 => SUBSPIHD _4 =>
1200        FSPIHD) ([Input] [Output]))); _for_each_inner!((10, GPIO10(_2 => FSPIIO4 _4 =>
1201        FSPICS0) (_2 => FSPIIO4 _3 => SUBSPICS0 _4 => FSPICS0) ([Input] [Output])));
1202        _for_each_inner!((11, GPIO11(_2 => FSPIIO5 _3 => SUBSPID _4 => FSPID) (_2 =>
1203        FSPIIO5 _3 => SUBSPID _4 => FSPID) ([Input] [Output]))); _for_each_inner!((12,
1204        GPIO12(_2 => FSPIIO6 _4 => FSPICLK) (_2 => FSPIIO6 _3 => SUBSPICLK _4 => FSPICLK)
1205        ([Input] [Output]))); _for_each_inner!((13, GPIO13(_2 => FSPIIO7 _3 => SUBSPIQ _4
1206        => FSPIQ) (_2 => FSPIIO7 _3 => SUBSPIQ _4 => FSPIQ) ([Input] [Output])));
1207        _for_each_inner!((14, GPIO14(_3 => SUBSPIWP _4 => FSPIWP) (_2 => FSPIDQS _3 =>
1208        SUBSPIWP _4 => FSPIWP) ([Input] [Output]))); _for_each_inner!((15, GPIO15() (_2
1209        => U0RTS) ([Input] [Output]))); _for_each_inner!((16, GPIO16(_2 => U0CTS) ()
1210        ([Input] [Output]))); _for_each_inner!((17, GPIO17() (_2 => U1TXD) ([Input]
1211        [Output]))); _for_each_inner!((18, GPIO18(_2 => U1RXD) (_3 => CLK_OUT3) ([Input]
1212        [Output]))); _for_each_inner!((19, GPIO19() (_2 => U1RTS _3 => CLK_OUT2) ([Input]
1213        [Output]))); _for_each_inner!((20, GPIO20(_2 => U1CTS) (_3 => CLK_OUT1) ([Input]
1214        [Output]))); _for_each_inner!((21, GPIO21() () ([Input] [Output])));
1215        _for_each_inner!((33, GPIO33(_2 => FSPIHD _3 => SUBSPIHD) (_2 => FSPIHD _3 =>
1216        SUBSPIHD) ([Input] [Output]))); _for_each_inner!((34, GPIO34(_2 => FSPICS0) (_2
1217        => FSPICS0 _3 => SUBSPICS0) ([Input] [Output]))); _for_each_inner!((35, GPIO35(_2
1218        => FSPID _3 => SUBSPID) (_2 => FSPID _3 => SUBSPID) ([Input] [Output])));
1219        _for_each_inner!((36, GPIO36(_2 => FSPICLK) (_2 => FSPICLK _3 => SUBSPICLK)
1220        ([Input] [Output]))); _for_each_inner!((37, GPIO37(_2 => FSPIQ _3 => SUBSPIQ _4
1221        => SPIDQS) (_2 => FSPIQ _3 => SUBSPIQ _4 => SPIDQS) ([Input] [Output])));
1222        _for_each_inner!((38, GPIO38(_2 => FSPIWP _3 => SUBSPIWP) (_2 => FSPIWP _3 =>
1223        SUBSPIWP) ([Input] [Output]))); _for_each_inner!((39, GPIO39(_0 => MTCK) (_2 =>
1224        CLK_OUT3 _3 => SUBSPICS1) ([Input] [Output]))); _for_each_inner!((40, GPIO40()
1225        (_0 => MTDO _2 => CLK_OUT2) ([Input] [Output]))); _for_each_inner!((41, GPIO41(_0
1226        => MTDI) (_2 => CLK_OUT1) ([Input] [Output]))); _for_each_inner!((42, GPIO42(_0
1227        => MTMS) () ([Input] [Output]))); _for_each_inner!((43, GPIO43() (_0 => U0TXD _2
1228        => CLK_OUT1) ([Input] [Output]))); _for_each_inner!((44, GPIO44(_0 => U0RXD) (_2
1229        => CLK_OUT2) ([Input] [Output]))); _for_each_inner!((45, GPIO45() () ([Input]
1230        [Output]))); _for_each_inner!((46, GPIO46() () ([Input] [Output])));
1231        _for_each_inner!((all(0, GPIO0() () ([Input] [Output])), (1, GPIO1() () ([Input]
1232        [Output])), (2, GPIO2() () ([Input] [Output])), (3, GPIO3() () ([Input]
1233        [Output])), (4, GPIO4() () ([Input] [Output])), (5, GPIO5() () ([Input]
1234        [Output])), (6, GPIO6() () ([Input] [Output])), (7, GPIO7() () ([Input]
1235        [Output])), (8, GPIO8() (_3 => SUBSPICS1) ([Input] [Output])), (9, GPIO9(_3 =>
1236        SUBSPIHD _4 => FSPIHD) (_3 => SUBSPIHD _4 => FSPIHD) ([Input] [Output])), (10,
1237        GPIO10(_2 => FSPIIO4 _4 => FSPICS0) (_2 => FSPIIO4 _3 => SUBSPICS0 _4 => FSPICS0)
1238        ([Input] [Output])), (11, GPIO11(_2 => FSPIIO5 _3 => SUBSPID _4 => FSPID) (_2 =>
1239        FSPIIO5 _3 => SUBSPID _4 => FSPID) ([Input] [Output])), (12, GPIO12(_2 => FSPIIO6
1240        _4 => FSPICLK) (_2 => FSPIIO6 _3 => SUBSPICLK _4 => FSPICLK) ([Input] [Output])),
1241        (13, GPIO13(_2 => FSPIIO7 _3 => SUBSPIQ _4 => FSPIQ) (_2 => FSPIIO7 _3 => SUBSPIQ
1242        _4 => FSPIQ) ([Input] [Output])), (14, GPIO14(_3 => SUBSPIWP _4 => FSPIWP) (_2 =>
1243        FSPIDQS _3 => SUBSPIWP _4 => FSPIWP) ([Input] [Output])), (15, GPIO15() (_2 =>
1244        U0RTS) ([Input] [Output])), (16, GPIO16(_2 => U0CTS) () ([Input] [Output])), (17,
1245        GPIO17() (_2 => U1TXD) ([Input] [Output])), (18, GPIO18(_2 => U1RXD) (_3 =>
1246        CLK_OUT3) ([Input] [Output])), (19, GPIO19() (_2 => U1RTS _3 => CLK_OUT2)
1247        ([Input] [Output])), (20, GPIO20(_2 => U1CTS) (_3 => CLK_OUT1) ([Input]
1248        [Output])), (21, GPIO21() () ([Input] [Output])), (33, GPIO33(_2 => FSPIHD _3 =>
1249        SUBSPIHD) (_2 => FSPIHD _3 => SUBSPIHD) ([Input] [Output])), (34, GPIO34(_2 =>
1250        FSPICS0) (_2 => FSPICS0 _3 => SUBSPICS0) ([Input] [Output])), (35, GPIO35(_2 =>
1251        FSPID _3 => SUBSPID) (_2 => FSPID _3 => SUBSPID) ([Input] [Output])), (36,
1252        GPIO36(_2 => FSPICLK) (_2 => FSPICLK _3 => SUBSPICLK) ([Input] [Output])), (37,
1253        GPIO37(_2 => FSPIQ _3 => SUBSPIQ _4 => SPIDQS) (_2 => FSPIQ _3 => SUBSPIQ _4 =>
1254        SPIDQS) ([Input] [Output])), (38, GPIO38(_2 => FSPIWP _3 => SUBSPIWP) (_2 =>
1255        FSPIWP _3 => SUBSPIWP) ([Input] [Output])), (39, GPIO39(_0 => MTCK) (_2 =>
1256        CLK_OUT3 _3 => SUBSPICS1) ([Input] [Output])), (40, GPIO40() (_0 => MTDO _2 =>
1257        CLK_OUT2) ([Input] [Output])), (41, GPIO41(_0 => MTDI) (_2 => CLK_OUT1) ([Input]
1258        [Output])), (42, GPIO42(_0 => MTMS) () ([Input] [Output])), (43, GPIO43() (_0 =>
1259        U0TXD _2 => CLK_OUT1) ([Input] [Output])), (44, GPIO44(_0 => U0RXD) (_2 =>
1260        CLK_OUT2) ([Input] [Output])), (45, GPIO45() () ([Input] [Output])), (46,
1261        GPIO46() () ([Input] [Output]))));
1262    };
1263}
1264/// This macro can be used to generate code for each analog function of each GPIO.
1265///
1266/// For an explanation on the general syntax, as well as usage of individual/repeated
1267/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
1268///
1269/// This macro has two options for its "Individual matcher" case:
1270///
1271/// - `all`: `($signal:ident, $gpio:ident)` - simple case where you only need identifiers
1272/// - `all_expanded`: `(($signal:ident, $group:ident $(, $number:literal)+), $gpio:ident)` -
1273///   expanded signal case, where you need the number(s) of a signal, or the general group to which
1274///   the signal belongs. For example, in case of `ADC2_CH3` the expanded form looks like
1275///   `(ADC2_CH3, ADCn_CHm, 2, 3)`.
1276///
1277/// Macro fragments:
1278///
1279/// - `$signal`: the name of the signal.
1280/// - `$group`: the name of the signal, with numbers replaced by placeholders. For `ADC2_CH3` this
1281///   is `ADCn_CHm`.
1282/// - `$number`: the numbers extracted from `$signal`.
1283/// - `$gpio`: the name of the GPIO.
1284///
1285/// Example data:
1286/// - `(ADC2_CH5, GPIO12)`
1287/// - `((ADC2_CH5, ADCn_CHm, 2, 5), GPIO12)`
1288///
1289/// The expanded syntax is only available when the signal has at least one numbered component.
1290#[macro_export]
1291#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
1292macro_rules! for_each_analog_function {
1293    ($($pattern:tt => $code:tt;)*) => {
1294        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
1295        _for_each_inner!((TOUCH1, GPIO1)); _for_each_inner!((ADC1_CH0, GPIO1));
1296        _for_each_inner!((TOUCH2, GPIO2)); _for_each_inner!((ADC1_CH1, GPIO2));
1297        _for_each_inner!((TOUCH3, GPIO3)); _for_each_inner!((ADC1_CH2, GPIO3));
1298        _for_each_inner!((TOUCH4, GPIO4)); _for_each_inner!((ADC1_CH3, GPIO4));
1299        _for_each_inner!((TOUCH5, GPIO5)); _for_each_inner!((ADC1_CH4, GPIO5));
1300        _for_each_inner!((TOUCH6, GPIO6)); _for_each_inner!((ADC1_CH5, GPIO6));
1301        _for_each_inner!((TOUCH7, GPIO7)); _for_each_inner!((ADC1_CH6, GPIO7));
1302        _for_each_inner!((TOUCH8, GPIO8)); _for_each_inner!((ADC1_CH7, GPIO8));
1303        _for_each_inner!((TOUCH9, GPIO9)); _for_each_inner!((ADC1_CH8, GPIO9));
1304        _for_each_inner!((TOUCH10, GPIO10)); _for_each_inner!((ADC1_CH9, GPIO10));
1305        _for_each_inner!((TOUCH11, GPIO11)); _for_each_inner!((ADC2_CH0, GPIO11));
1306        _for_each_inner!((TOUCH12, GPIO12)); _for_each_inner!((ADC2_CH1, GPIO12));
1307        _for_each_inner!((TOUCH13, GPIO13)); _for_each_inner!((ADC2_CH2, GPIO13));
1308        _for_each_inner!((TOUCH14, GPIO14)); _for_each_inner!((ADC2_CH3, GPIO14));
1309        _for_each_inner!((XTAL_32K_P, GPIO15)); _for_each_inner!((ADC2_CH4, GPIO15));
1310        _for_each_inner!((XTAL_32K_N, GPIO16)); _for_each_inner!((ADC2_CH5, GPIO16));
1311        _for_each_inner!((DAC_1, GPIO17)); _for_each_inner!((ADC2_CH6, GPIO17));
1312        _for_each_inner!((DAC_2, GPIO18)); _for_each_inner!((ADC2_CH7, GPIO18));
1313        _for_each_inner!((USB_DM, GPIO19)); _for_each_inner!((ADC2_CH8, GPIO19));
1314        _for_each_inner!((USB_DP, GPIO20)); _for_each_inner!((ADC2_CH9, GPIO20));
1315        _for_each_inner!(((TOUCH1, TOUCHn, 1), GPIO1)); _for_each_inner!(((ADC1_CH0,
1316        ADCn_CHm, 1, 0), GPIO1)); _for_each_inner!(((TOUCH2, TOUCHn, 2), GPIO2));
1317        _for_each_inner!(((ADC1_CH1, ADCn_CHm, 1, 1), GPIO2)); _for_each_inner!(((TOUCH3,
1318        TOUCHn, 3), GPIO3)); _for_each_inner!(((ADC1_CH2, ADCn_CHm, 1, 2), GPIO3));
1319        _for_each_inner!(((TOUCH4, TOUCHn, 4), GPIO4)); _for_each_inner!(((ADC1_CH3,
1320        ADCn_CHm, 1, 3), GPIO4)); _for_each_inner!(((TOUCH5, TOUCHn, 5), GPIO5));
1321        _for_each_inner!(((ADC1_CH4, ADCn_CHm, 1, 4), GPIO5)); _for_each_inner!(((TOUCH6,
1322        TOUCHn, 6), GPIO6)); _for_each_inner!(((ADC1_CH5, ADCn_CHm, 1, 5), GPIO6));
1323        _for_each_inner!(((TOUCH7, TOUCHn, 7), GPIO7)); _for_each_inner!(((ADC1_CH6,
1324        ADCn_CHm, 1, 6), GPIO7)); _for_each_inner!(((TOUCH8, TOUCHn, 8), GPIO8));
1325        _for_each_inner!(((ADC1_CH7, ADCn_CHm, 1, 7), GPIO8)); _for_each_inner!(((TOUCH9,
1326        TOUCHn, 9), GPIO9)); _for_each_inner!(((ADC1_CH8, ADCn_CHm, 1, 8), GPIO9));
1327        _for_each_inner!(((TOUCH10, TOUCHn, 10), GPIO10)); _for_each_inner!(((ADC1_CH9,
1328        ADCn_CHm, 1, 9), GPIO10)); _for_each_inner!(((TOUCH11, TOUCHn, 11), GPIO11));
1329        _for_each_inner!(((ADC2_CH0, ADCn_CHm, 2, 0), GPIO11));
1330        _for_each_inner!(((TOUCH12, TOUCHn, 12), GPIO12)); _for_each_inner!(((ADC2_CH1,
1331        ADCn_CHm, 2, 1), GPIO12)); _for_each_inner!(((TOUCH13, TOUCHn, 13), GPIO13));
1332        _for_each_inner!(((ADC2_CH2, ADCn_CHm, 2, 2), GPIO13));
1333        _for_each_inner!(((TOUCH14, TOUCHn, 14), GPIO14)); _for_each_inner!(((ADC2_CH3,
1334        ADCn_CHm, 2, 3), GPIO14)); _for_each_inner!(((ADC2_CH4, ADCn_CHm, 2, 4),
1335        GPIO15)); _for_each_inner!(((ADC2_CH5, ADCn_CHm, 2, 5), GPIO16));
1336        _for_each_inner!(((DAC_1, DAC_n, 1), GPIO17)); _for_each_inner!(((ADC2_CH6,
1337        ADCn_CHm, 2, 6), GPIO17)); _for_each_inner!(((DAC_2, DAC_n, 2), GPIO18));
1338        _for_each_inner!(((ADC2_CH7, ADCn_CHm, 2, 7), GPIO18));
1339        _for_each_inner!(((ADC2_CH8, ADCn_CHm, 2, 8), GPIO19));
1340        _for_each_inner!(((ADC2_CH9, ADCn_CHm, 2, 9), GPIO20));
1341        _for_each_inner!((all(TOUCH1, GPIO1), (ADC1_CH0, GPIO1), (TOUCH2, GPIO2),
1342        (ADC1_CH1, GPIO2), (TOUCH3, GPIO3), (ADC1_CH2, GPIO3), (TOUCH4, GPIO4),
1343        (ADC1_CH3, GPIO4), (TOUCH5, GPIO5), (ADC1_CH4, GPIO5), (TOUCH6, GPIO6),
1344        (ADC1_CH5, GPIO6), (TOUCH7, GPIO7), (ADC1_CH6, GPIO7), (TOUCH8, GPIO8),
1345        (ADC1_CH7, GPIO8), (TOUCH9, GPIO9), (ADC1_CH8, GPIO9), (TOUCH10, GPIO10),
1346        (ADC1_CH9, GPIO10), (TOUCH11, GPIO11), (ADC2_CH0, GPIO11), (TOUCH12, GPIO12),
1347        (ADC2_CH1, GPIO12), (TOUCH13, GPIO13), (ADC2_CH2, GPIO13), (TOUCH14, GPIO14),
1348        (ADC2_CH3, GPIO14), (XTAL_32K_P, GPIO15), (ADC2_CH4, GPIO15), (XTAL_32K_N,
1349        GPIO16), (ADC2_CH5, GPIO16), (DAC_1, GPIO17), (ADC2_CH6, GPIO17), (DAC_2,
1350        GPIO18), (ADC2_CH7, GPIO18), (USB_DM, GPIO19), (ADC2_CH8, GPIO19), (USB_DP,
1351        GPIO20), (ADC2_CH9, GPIO20))); _for_each_inner!((all_expanded((TOUCH1, TOUCHn,
1352        1), GPIO1), ((ADC1_CH0, ADCn_CHm, 1, 0), GPIO1), ((TOUCH2, TOUCHn, 2), GPIO2),
1353        ((ADC1_CH1, ADCn_CHm, 1, 1), GPIO2), ((TOUCH3, TOUCHn, 3), GPIO3), ((ADC1_CH2,
1354        ADCn_CHm, 1, 2), GPIO3), ((TOUCH4, TOUCHn, 4), GPIO4), ((ADC1_CH3, ADCn_CHm, 1,
1355        3), GPIO4), ((TOUCH5, TOUCHn, 5), GPIO5), ((ADC1_CH4, ADCn_CHm, 1, 4), GPIO5),
1356        ((TOUCH6, TOUCHn, 6), GPIO6), ((ADC1_CH5, ADCn_CHm, 1, 5), GPIO6), ((TOUCH7,
1357        TOUCHn, 7), GPIO7), ((ADC1_CH6, ADCn_CHm, 1, 6), GPIO7), ((TOUCH8, TOUCHn, 8),
1358        GPIO8), ((ADC1_CH7, ADCn_CHm, 1, 7), GPIO8), ((TOUCH9, TOUCHn, 9), GPIO9),
1359        ((ADC1_CH8, ADCn_CHm, 1, 8), GPIO9), ((TOUCH10, TOUCHn, 10), GPIO10), ((ADC1_CH9,
1360        ADCn_CHm, 1, 9), GPIO10), ((TOUCH11, TOUCHn, 11), GPIO11), ((ADC2_CH0, ADCn_CHm,
1361        2, 0), GPIO11), ((TOUCH12, TOUCHn, 12), GPIO12), ((ADC2_CH1, ADCn_CHm, 2, 1),
1362        GPIO12), ((TOUCH13, TOUCHn, 13), GPIO13), ((ADC2_CH2, ADCn_CHm, 2, 2), GPIO13),
1363        ((TOUCH14, TOUCHn, 14), GPIO14), ((ADC2_CH3, ADCn_CHm, 2, 3), GPIO14),
1364        ((ADC2_CH4, ADCn_CHm, 2, 4), GPIO15), ((ADC2_CH5, ADCn_CHm, 2, 5), GPIO16),
1365        ((DAC_1, DAC_n, 1), GPIO17), ((ADC2_CH6, ADCn_CHm, 2, 6), GPIO17), ((DAC_2,
1366        DAC_n, 2), GPIO18), ((ADC2_CH7, ADCn_CHm, 2, 7), GPIO18), ((ADC2_CH8, ADCn_CHm,
1367        2, 8), GPIO19), ((ADC2_CH9, ADCn_CHm, 2, 9), GPIO20)));
1368    };
1369}
1370/// This macro can be used to generate code for each LP/RTC function of each GPIO.
1371///
1372/// For an explanation on the general syntax, as well as usage of individual/repeated
1373/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
1374///
1375/// This macro has two options for its "Individual matcher" case:
1376///
1377/// - `all`: `($signal:ident, $gpio:ident)` - simple case where you only need identifiers
1378/// - `all_expanded`: `(($signal:ident, $group:ident $(, $number:literal)+), $gpio:ident)` -
1379///   expanded signal case, where you need the number(s) of a signal, or the general group to which
1380///   the signal belongs. For example, in case of `SAR_I2C_SCL_1` the expanded form looks like
1381///   `(SAR_I2C_SCL_1, SAR_I2C_SCL_n, 1)`.
1382///
1383/// Macro fragments:
1384///
1385/// - `$signal`: the name of the signal.
1386/// - `$group`: the name of the signal, with numbers replaced by placeholders. For `ADC2_CH3` this
1387///   is `ADCn_CHm`.
1388/// - `$number`: the numbers extracted from `$signal`.
1389/// - `$gpio`: the name of the GPIO.
1390///
1391/// Example data:
1392/// - `(RTC_GPIO15, GPIO12)`
1393/// - `((RTC_GPIO15, RTC_GPIOn, 15), GPIO12)`
1394///
1395/// The expanded syntax is only available when the signal has at least one numbered component.
1396#[macro_export]
1397#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
1398macro_rules! for_each_lp_function {
1399    ($($pattern:tt => $code:tt;)*) => {
1400        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
1401        _for_each_inner!((RTC_GPIO0, GPIO0)); _for_each_inner!((RTC_GPIO1, GPIO1));
1402        _for_each_inner!((RTC_GPIO2, GPIO2)); _for_each_inner!((RTC_GPIO3, GPIO3));
1403        _for_each_inner!((RTC_GPIO4, GPIO4)); _for_each_inner!((RTC_GPIO5, GPIO5));
1404        _for_each_inner!((RTC_GPIO6, GPIO6)); _for_each_inner!((RTC_GPIO7, GPIO7));
1405        _for_each_inner!((RTC_GPIO8, GPIO8)); _for_each_inner!((RTC_GPIO9, GPIO9));
1406        _for_each_inner!((RTC_GPIO10, GPIO10)); _for_each_inner!((RTC_GPIO11, GPIO11));
1407        _for_each_inner!((RTC_GPIO12, GPIO12)); _for_each_inner!((RTC_GPIO13, GPIO13));
1408        _for_each_inner!((RTC_GPIO14, GPIO14)); _for_each_inner!((RTC_GPIO15, GPIO15));
1409        _for_each_inner!((RTC_GPIO16, GPIO16)); _for_each_inner!((RTC_GPIO17, GPIO17));
1410        _for_each_inner!((RTC_GPIO18, GPIO18)); _for_each_inner!((RTC_GPIO19, GPIO19));
1411        _for_each_inner!((RTC_GPIO20, GPIO20)); _for_each_inner!((RTC_GPIO21, GPIO21));
1412        _for_each_inner!(((RTC_GPIO0, RTC_GPIOn, 0), GPIO0));
1413        _for_each_inner!(((RTC_GPIO1, RTC_GPIOn, 1), GPIO1));
1414        _for_each_inner!(((RTC_GPIO2, RTC_GPIOn, 2), GPIO2));
1415        _for_each_inner!(((RTC_GPIO3, RTC_GPIOn, 3), GPIO3));
1416        _for_each_inner!(((RTC_GPIO4, RTC_GPIOn, 4), GPIO4));
1417        _for_each_inner!(((RTC_GPIO5, RTC_GPIOn, 5), GPIO5));
1418        _for_each_inner!(((RTC_GPIO6, RTC_GPIOn, 6), GPIO6));
1419        _for_each_inner!(((RTC_GPIO7, RTC_GPIOn, 7), GPIO7));
1420        _for_each_inner!(((RTC_GPIO8, RTC_GPIOn, 8), GPIO8));
1421        _for_each_inner!(((RTC_GPIO9, RTC_GPIOn, 9), GPIO9));
1422        _for_each_inner!(((RTC_GPIO10, RTC_GPIOn, 10), GPIO10));
1423        _for_each_inner!(((RTC_GPIO11, RTC_GPIOn, 11), GPIO11));
1424        _for_each_inner!(((RTC_GPIO12, RTC_GPIOn, 12), GPIO12));
1425        _for_each_inner!(((RTC_GPIO13, RTC_GPIOn, 13), GPIO13));
1426        _for_each_inner!(((RTC_GPIO14, RTC_GPIOn, 14), GPIO14));
1427        _for_each_inner!(((RTC_GPIO15, RTC_GPIOn, 15), GPIO15));
1428        _for_each_inner!(((RTC_GPIO16, RTC_GPIOn, 16), GPIO16));
1429        _for_each_inner!(((RTC_GPIO17, RTC_GPIOn, 17), GPIO17));
1430        _for_each_inner!(((RTC_GPIO18, RTC_GPIOn, 18), GPIO18));
1431        _for_each_inner!(((RTC_GPIO19, RTC_GPIOn, 19), GPIO19));
1432        _for_each_inner!(((RTC_GPIO20, RTC_GPIOn, 20), GPIO20));
1433        _for_each_inner!(((RTC_GPIO21, RTC_GPIOn, 21), GPIO21));
1434        _for_each_inner!((all(RTC_GPIO0, GPIO0), (RTC_GPIO1, GPIO1), (RTC_GPIO2, GPIO2),
1435        (RTC_GPIO3, GPIO3), (RTC_GPIO4, GPIO4), (RTC_GPIO5, GPIO5), (RTC_GPIO6, GPIO6),
1436        (RTC_GPIO7, GPIO7), (RTC_GPIO8, GPIO8), (RTC_GPIO9, GPIO9), (RTC_GPIO10, GPIO10),
1437        (RTC_GPIO11, GPIO11), (RTC_GPIO12, GPIO12), (RTC_GPIO13, GPIO13), (RTC_GPIO14,
1438        GPIO14), (RTC_GPIO15, GPIO15), (RTC_GPIO16, GPIO16), (RTC_GPIO17, GPIO17),
1439        (RTC_GPIO18, GPIO18), (RTC_GPIO19, GPIO19), (RTC_GPIO20, GPIO20), (RTC_GPIO21,
1440        GPIO21))); _for_each_inner!((all_expanded((RTC_GPIO0, RTC_GPIOn, 0), GPIO0),
1441        ((RTC_GPIO1, RTC_GPIOn, 1), GPIO1), ((RTC_GPIO2, RTC_GPIOn, 2), GPIO2),
1442        ((RTC_GPIO3, RTC_GPIOn, 3), GPIO3), ((RTC_GPIO4, RTC_GPIOn, 4), GPIO4),
1443        ((RTC_GPIO5, RTC_GPIOn, 5), GPIO5), ((RTC_GPIO6, RTC_GPIOn, 6), GPIO6),
1444        ((RTC_GPIO7, RTC_GPIOn, 7), GPIO7), ((RTC_GPIO8, RTC_GPIOn, 8), GPIO8),
1445        ((RTC_GPIO9, RTC_GPIOn, 9), GPIO9), ((RTC_GPIO10, RTC_GPIOn, 10), GPIO10),
1446        ((RTC_GPIO11, RTC_GPIOn, 11), GPIO11), ((RTC_GPIO12, RTC_GPIOn, 12), GPIO12),
1447        ((RTC_GPIO13, RTC_GPIOn, 13), GPIO13), ((RTC_GPIO14, RTC_GPIOn, 14), GPIO14),
1448        ((RTC_GPIO15, RTC_GPIOn, 15), GPIO15), ((RTC_GPIO16, RTC_GPIOn, 16), GPIO16),
1449        ((RTC_GPIO17, RTC_GPIOn, 17), GPIO17), ((RTC_GPIO18, RTC_GPIOn, 18), GPIO18),
1450        ((RTC_GPIO19, RTC_GPIOn, 19), GPIO19), ((RTC_GPIO20, RTC_GPIOn, 20), GPIO20),
1451        ((RTC_GPIO21, RTC_GPIOn, 21), GPIO21)));
1452    };
1453}
1454/// Defines the `InputSignal` and `OutputSignal` enums.
1455///
1456/// This macro is intended to be called in esp-hal only.
1457#[macro_export]
1458#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
1459macro_rules! define_io_mux_signals {
1460    () => {
1461        #[allow(non_camel_case_types, clippy::upper_case_acronyms)]
1462        #[derive(Debug, PartialEq, Copy, Clone)]
1463        #[cfg_attr(feature = "defmt", derive(defmt::Format))]
1464        #[doc(hidden)]
1465        pub enum InputSignal {
1466            SPIQ              = 0,
1467            SPID              = 1,
1468            SPIHD             = 2,
1469            SPIWP             = 3,
1470            SPID4             = 7,
1471            SPID5             = 8,
1472            SPID6             = 9,
1473            SPID7             = 10,
1474            SPIDQS            = 11,
1475            U0RXD             = 14,
1476            U0CTS             = 15,
1477            U0DSR             = 16,
1478            U1RXD             = 17,
1479            U1CTS             = 18,
1480            U1DSR             = 21,
1481            I2S0O_BCK         = 23,
1482            I2S0O_WS          = 25,
1483            I2S0I_BCK         = 27,
1484            I2S0I_WS          = 28,
1485            I2CEXT0_SCL       = 29,
1486            I2CEXT0_SDA       = 30,
1487            PCNT0_SIG_CH0     = 39,
1488            PCNT0_SIG_CH1     = 40,
1489            PCNT0_CTRL_CH0    = 41,
1490            PCNT0_CTRL_CH1    = 42,
1491            PCNT1_SIG_CH0     = 43,
1492            PCNT1_SIG_CH1     = 44,
1493            PCNT1_CTRL_CH0    = 45,
1494            PCNT1_CTRL_CH1    = 46,
1495            PCNT2_SIG_CH0     = 47,
1496            PCNT2_SIG_CH1     = 48,
1497            PCNT2_CTRL_CH0    = 49,
1498            PCNT2_CTRL_CH1    = 50,
1499            PCNT3_SIG_CH0     = 51,
1500            PCNT3_SIG_CH1     = 52,
1501            PCNT3_CTRL_CH0    = 53,
1502            PCNT3_CTRL_CH1    = 54,
1503            USB_EXTPHY_VP     = 61,
1504            USB_EXTPHY_VM     = 62,
1505            USB_EXTPHY_RCV    = 63,
1506            USB_OTG_IDDIG     = 64,
1507            USB_OTG_AVALID    = 65,
1508            USB_SRP_BVALID    = 66,
1509            USB_OTG_VBUSVALID = 67,
1510            USB_SRP_SESSEND   = 68,
1511            SPI3_CLK          = 72,
1512            SPI3_Q            = 73,
1513            SPI3_D            = 74,
1514            SPI3_HD           = 75,
1515            SPI3_CS0          = 76,
1516            RMT_SIG_0         = 83,
1517            RMT_SIG_1         = 84,
1518            RMT_SIG_2         = 85,
1519            RMT_SIG_3         = 86,
1520            I2CEXT1_SCL       = 95,
1521            I2CEXT1_SDA       = 96,
1522            FSPICLK           = 108,
1523            FSPIQ             = 109,
1524            FSPID             = 110,
1525            FSPIHD            = 111,
1526            FSPIWP            = 112,
1527            FSPIIO4           = 113,
1528            FSPIIO5           = 114,
1529            FSPIIO6           = 115,
1530            FSPIIO7           = 116,
1531            FSPICS0           = 117,
1532            TWAI_RX           = 123,
1533            SUBSPIQ           = 127,
1534            SUBSPID           = 128,
1535            SUBSPIHD          = 129,
1536            SUBSPIWP          = 130,
1537            I2S0I_DATA_IN15   = 158,
1538            SUBSPID4          = 167,
1539            SUBSPID5          = 168,
1540            SUBSPID6          = 169,
1541            SUBSPID7          = 170,
1542            SUBSPIDQS         = 171,
1543            PCMFSYNC          = 203,
1544            PCMCLK            = 204,
1545            PRO_ALONEGPIO_IN0 = 235,
1546            PRO_ALONEGPIO_IN1 = 236,
1547            PRO_ALONEGPIO_IN2 = 237,
1548            PRO_ALONEGPIO_IN3 = 238,
1549            PRO_ALONEGPIO_IN4 = 239,
1550            PRO_ALONEGPIO_IN5 = 240,
1551            PRO_ALONEGPIO_IN6 = 241,
1552            PRO_ALONEGPIO_IN7 = 242,
1553            MTDI,
1554            MTCK,
1555            MTMS,
1556        }
1557        #[allow(non_camel_case_types, clippy::upper_case_acronyms)]
1558        #[derive(Debug, PartialEq, Copy, Clone)]
1559        #[cfg_attr(feature = "defmt", derive(defmt::Format))]
1560        #[doc(hidden)]
1561        pub enum OutputSignal {
1562            SPIQ               = 0,
1563            SPID               = 1,
1564            SPIHD              = 2,
1565            SPIWP              = 3,
1566            SPICLK             = 4,
1567            SPICS0             = 5,
1568            SPICS1             = 6,
1569            SPID4              = 7,
1570            SPID5              = 8,
1571            SPID6              = 9,
1572            SPID7              = 10,
1573            SPIDQS             = 11,
1574            U0TXD              = 14,
1575            U0RTS              = 15,
1576            U0DTR              = 16,
1577            U1TXD              = 17,
1578            U1RTS              = 18,
1579            U1DTR              = 21,
1580            I2S0O_BCK          = 23,
1581            I2S0O_WS           = 25,
1582            I2S0I_BCK          = 27,
1583            I2S0I_WS           = 28,
1584            I2CEXT0_SCL        = 29,
1585            I2CEXT0_SDA        = 30,
1586            SDIO_TOHOST_INT    = 31,
1587            USB_EXTPHY_OEN     = 61,
1588            USB_EXTPHY_VPO     = 63,
1589            USB_EXTPHY_VMO     = 64,
1590            SPI3_CLK           = 72,
1591            SPI3_Q             = 73,
1592            SPI3_D             = 74,
1593            SPI3_HD            = 75,
1594            SPI3_CS0           = 76,
1595            SPI3_CS1           = 77,
1596            SPI3_CS2           = 78,
1597            LEDC_LS_SIG0       = 79,
1598            LEDC_LS_SIG1       = 80,
1599            LEDC_LS_SIG2       = 81,
1600            LEDC_LS_SIG3       = 82,
1601            LEDC_LS_SIG4       = 83,
1602            LEDC_LS_SIG5       = 84,
1603            LEDC_LS_SIG6       = 85,
1604            LEDC_LS_SIG7       = 86,
1605            RMT_SIG_0          = 87,
1606            RMT_SIG_1          = 88,
1607            RMT_SIG_2          = 89,
1608            RMT_SIG_3          = 90,
1609            I2CEXT1_SCL        = 95,
1610            I2CEXT1_SDA        = 96,
1611            GPIO_SD0           = 100,
1612            GPIO_SD1           = 101,
1613            GPIO_SD2           = 102,
1614            GPIO_SD3           = 103,
1615            GPIO_SD4           = 104,
1616            GPIO_SD5           = 105,
1617            GPIO_SD6           = 106,
1618            GPIO_SD7           = 107,
1619            FSPICLK            = 108,
1620            FSPIQ              = 109,
1621            FSPID              = 110,
1622            FSPIHD             = 111,
1623            FSPIWP             = 112,
1624            FSPIIO4            = 113,
1625            FSPIIO5            = 114,
1626            FSPIIO6            = 115,
1627            FSPIIO7            = 116,
1628            FSPICS0            = 117,
1629            FSPICS1            = 118,
1630            FSPICS2            = 119,
1631            FSPICS3            = 120,
1632            FSPICS4            = 121,
1633            FSPICS5            = 122,
1634            TWAI_TX            = 123,
1635            SUBSPICLK          = 126,
1636            SUBSPIQ            = 127,
1637            SUBSPID            = 128,
1638            SUBSPIHD           = 129,
1639            SUBSPIWP           = 130,
1640            SUBSPICS0          = 131,
1641            SUBSPICS1          = 132,
1642            FSPIDQS            = 133,
1643            FSPI_HSYNC         = 134,
1644            FSPI_VSYNC         = 135,
1645            FSPI_DE            = 136,
1646            FSPICD             = 137,
1647            SPI3_CD            = 139,
1648            SPI3_DQS           = 140,
1649            I2S0O_DATA_OUT23   = 166,
1650            SUBSPID4           = 167,
1651            SUBSPID5           = 168,
1652            SUBSPID6           = 169,
1653            SUBSPID7           = 170,
1654            SUBSPIDQS          = 171,
1655            PCMFSYNC           = 209,
1656            PCMCLK             = 210,
1657            PRO_ALONEGPIO_OUT0 = 235,
1658            PRO_ALONEGPIO_OUT1 = 236,
1659            PRO_ALONEGPIO_OUT2 = 237,
1660            PRO_ALONEGPIO_OUT3 = 238,
1661            PRO_ALONEGPIO_OUT4 = 239,
1662            PRO_ALONEGPIO_OUT5 = 240,
1663            PRO_ALONEGPIO_OUT6 = 241,
1664            PRO_ALONEGPIO_OUT7 = 242,
1665            CLK_I2S            = 251,
1666            GPIO               = 256,
1667            CLK_OUT1,
1668            CLK_OUT2,
1669            CLK_OUT3,
1670            MTDO,
1671        }
1672    };
1673}
1674/// Defines and implements the `io_mux_reg` function.
1675///
1676/// The generated function has the following signature:
1677///
1678/// ```rust,ignore
1679/// pub(crate) fn io_mux_reg(gpio_num: u8) -> &'static crate::pac::io_mux::GPIO0 {
1680///     // ...
1681/// # unimplemented!()
1682/// }
1683/// ```
1684///
1685/// This macro is intended to be called in esp-hal only.
1686#[macro_export]
1687#[expect(clippy::crate_in_macro_def)]
1688#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
1689macro_rules! define_io_mux_reg {
1690    () => {
1691        pub(crate) fn io_mux_reg(gpio_num: u8) -> &'static crate::pac::io_mux::GPIO {
1692            crate::peripherals::IO_MUX::regs().gpio(gpio_num as usize)
1693        }
1694    };
1695}