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