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    ("wifi.has_wifi6") => {
256        false
257    };
258    ("bt.controller") => {
259        "btdm"
260    };
261    ("phy.combo_module") => {
262        true
263    };
264    ("phy.backed_up_digital_register_count") => {
265        21
266    };
267    ("phy.backed_up_digital_register_count", str) => {
268        stringify!(21)
269    };
270}
271/// Macro to get the address range of the given memory region.
272#[macro_export]
273#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
274macro_rules! memory_range {
275    ("DRAM") => {
276        1070104576..1070596096
277    };
278}
279#[macro_export]
280#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
281macro_rules! for_each_soc_xtal_options {
282    ($($pattern:tt => $code:tt;)*) => {
283        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
284        _for_each_inner!((40)); _for_each_inner!((all(40)));
285    };
286}
287#[macro_export]
288#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
289macro_rules! for_each_aes_key_length {
290    ($($pattern:tt => $code:tt;)*) => {
291        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
292        _for_each_inner!((128)); _for_each_inner!((256)); _for_each_inner!((128, 0, 4));
293        _for_each_inner!((256, 2, 6)); _for_each_inner!((bits(128), (256)));
294        _for_each_inner!((modes(128, 0, 4), (256, 2, 6)));
295    };
296}
297/// This macro can be used to generate code for each channel of the RMT peripheral.
298///
299/// For an explanation on the general syntax, as well as usage of individual/repeated
300/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
301///
302/// This macro has three options for its "Individual matcher" case:
303///
304/// - `all`: `($num:literal)`
305/// - `tx`: `($num:literal, $idx:literal)`
306/// - `rx`: `($num:literal, $idx:literal)`
307///
308/// Macro fragments:
309///
310/// - `$num`: number of the channel, e.g. `0`
311/// - `$idx`: index of the channel among channels of the same capability, e.g. `0`
312///
313/// Example data:
314///
315/// - `all`: `(0)`
316/// - `tx`: `(1, 1)`
317/// - `rx`: `(2, 0)`
318#[macro_export]
319#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
320macro_rules! for_each_rmt_channel {
321    ($($pattern:tt => $code:tt;)*) => {
322        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
323        _for_each_inner!((0)); _for_each_inner!((1)); _for_each_inner!((2));
324        _for_each_inner!((3)); _for_each_inner!((4)); _for_each_inner!((5));
325        _for_each_inner!((6)); _for_each_inner!((7)); _for_each_inner!((0, 0));
326        _for_each_inner!((1, 1)); _for_each_inner!((2, 2)); _for_each_inner!((3, 3));
327        _for_each_inner!((4, 0)); _for_each_inner!((5, 1)); _for_each_inner!((6, 2));
328        _for_each_inner!((7, 3)); _for_each_inner!((all(0), (1), (2), (3), (4), (5), (6),
329        (7))); _for_each_inner!((tx(0, 0), (1, 1), (2, 2), (3, 3)));
330        _for_each_inner!((rx(4, 0), (5, 1), (6, 2), (7, 3)));
331    };
332}
333#[macro_export]
334#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
335macro_rules! for_each_rmt_clock_source {
336    ($($pattern:tt => $code:tt;)*) => {
337        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
338        _for_each_inner!((Apb, 1)); _for_each_inner!((RcFast, 2));
339        _for_each_inner!((Xtal, 3)); _for_each_inner!((Apb)); _for_each_inner!((all(Apb,
340        1), (RcFast, 2), (Xtal, 3))); _for_each_inner!((default(Apb)));
341    };
342}
343#[macro_export]
344#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
345macro_rules! for_each_rsa_exponentiation {
346    ($($pattern:tt => $code:tt;)*) => {
347        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
348        _for_each_inner!((32)); _for_each_inner!((64)); _for_each_inner!((96));
349        _for_each_inner!((128)); _for_each_inner!((160)); _for_each_inner!((192));
350        _for_each_inner!((224)); _for_each_inner!((256)); _for_each_inner!((288));
351        _for_each_inner!((320)); _for_each_inner!((352)); _for_each_inner!((384));
352        _for_each_inner!((416)); _for_each_inner!((448)); _for_each_inner!((480));
353        _for_each_inner!((512)); _for_each_inner!((544)); _for_each_inner!((576));
354        _for_each_inner!((608)); _for_each_inner!((640)); _for_each_inner!((672));
355        _for_each_inner!((704)); _for_each_inner!((736)); _for_each_inner!((768));
356        _for_each_inner!((800)); _for_each_inner!((832)); _for_each_inner!((864));
357        _for_each_inner!((896)); _for_each_inner!((928)); _for_each_inner!((960));
358        _for_each_inner!((992)); _for_each_inner!((1024)); _for_each_inner!((1056));
359        _for_each_inner!((1088)); _for_each_inner!((1120)); _for_each_inner!((1152));
360        _for_each_inner!((1184)); _for_each_inner!((1216)); _for_each_inner!((1248));
361        _for_each_inner!((1280)); _for_each_inner!((1312)); _for_each_inner!((1344));
362        _for_each_inner!((1376)); _for_each_inner!((1408)); _for_each_inner!((1440));
363        _for_each_inner!((1472)); _for_each_inner!((1504)); _for_each_inner!((1536));
364        _for_each_inner!((1568)); _for_each_inner!((1600)); _for_each_inner!((1632));
365        _for_each_inner!((1664)); _for_each_inner!((1696)); _for_each_inner!((1728));
366        _for_each_inner!((1760)); _for_each_inner!((1792)); _for_each_inner!((1824));
367        _for_each_inner!((1856)); _for_each_inner!((1888)); _for_each_inner!((1920));
368        _for_each_inner!((1952)); _for_each_inner!((1984)); _for_each_inner!((2016));
369        _for_each_inner!((2048)); _for_each_inner!((2080)); _for_each_inner!((2112));
370        _for_each_inner!((2144)); _for_each_inner!((2176)); _for_each_inner!((2208));
371        _for_each_inner!((2240)); _for_each_inner!((2272)); _for_each_inner!((2304));
372        _for_each_inner!((2336)); _for_each_inner!((2368)); _for_each_inner!((2400));
373        _for_each_inner!((2432)); _for_each_inner!((2464)); _for_each_inner!((2496));
374        _for_each_inner!((2528)); _for_each_inner!((2560)); _for_each_inner!((2592));
375        _for_each_inner!((2624)); _for_each_inner!((2656)); _for_each_inner!((2688));
376        _for_each_inner!((2720)); _for_each_inner!((2752)); _for_each_inner!((2784));
377        _for_each_inner!((2816)); _for_each_inner!((2848)); _for_each_inner!((2880));
378        _for_each_inner!((2912)); _for_each_inner!((2944)); _for_each_inner!((2976));
379        _for_each_inner!((3008)); _for_each_inner!((3040)); _for_each_inner!((3072));
380        _for_each_inner!((3104)); _for_each_inner!((3136)); _for_each_inner!((3168));
381        _for_each_inner!((3200)); _for_each_inner!((3232)); _for_each_inner!((3264));
382        _for_each_inner!((3296)); _for_each_inner!((3328)); _for_each_inner!((3360));
383        _for_each_inner!((3392)); _for_each_inner!((3424)); _for_each_inner!((3456));
384        _for_each_inner!((3488)); _for_each_inner!((3520)); _for_each_inner!((3552));
385        _for_each_inner!((3584)); _for_each_inner!((3616)); _for_each_inner!((3648));
386        _for_each_inner!((3680)); _for_each_inner!((3712)); _for_each_inner!((3744));
387        _for_each_inner!((3776)); _for_each_inner!((3808)); _for_each_inner!((3840));
388        _for_each_inner!((3872)); _for_each_inner!((3904)); _for_each_inner!((3936));
389        _for_each_inner!((3968)); _for_each_inner!((4000)); _for_each_inner!((4032));
390        _for_each_inner!((4064)); _for_each_inner!((4096)); _for_each_inner!((all(32),
391        (64), (96), (128), (160), (192), (224), (256), (288), (320), (352), (384), (416),
392        (448), (480), (512), (544), (576), (608), (640), (672), (704), (736), (768),
393        (800), (832), (864), (896), (928), (960), (992), (1024), (1056), (1088), (1120),
394        (1152), (1184), (1216), (1248), (1280), (1312), (1344), (1376), (1408), (1440),
395        (1472), (1504), (1536), (1568), (1600), (1632), (1664), (1696), (1728), (1760),
396        (1792), (1824), (1856), (1888), (1920), (1952), (1984), (2016), (2048), (2080),
397        (2112), (2144), (2176), (2208), (2240), (2272), (2304), (2336), (2368), (2400),
398        (2432), (2464), (2496), (2528), (2560), (2592), (2624), (2656), (2688), (2720),
399        (2752), (2784), (2816), (2848), (2880), (2912), (2944), (2976), (3008), (3040),
400        (3072), (3104), (3136), (3168), (3200), (3232), (3264), (3296), (3328), (3360),
401        (3392), (3424), (3456), (3488), (3520), (3552), (3584), (3616), (3648), (3680),
402        (3712), (3744), (3776), (3808), (3840), (3872), (3904), (3936), (3968), (4000),
403        (4032), (4064), (4096)));
404    };
405}
406#[macro_export]
407#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
408macro_rules! for_each_rsa_multiplication {
409    ($($pattern:tt => $code:tt;)*) => {
410        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
411        _for_each_inner!((32)); _for_each_inner!((64)); _for_each_inner!((96));
412        _for_each_inner!((128)); _for_each_inner!((160)); _for_each_inner!((192));
413        _for_each_inner!((224)); _for_each_inner!((256)); _for_each_inner!((288));
414        _for_each_inner!((320)); _for_each_inner!((352)); _for_each_inner!((384));
415        _for_each_inner!((416)); _for_each_inner!((448)); _for_each_inner!((480));
416        _for_each_inner!((512)); _for_each_inner!((544)); _for_each_inner!((576));
417        _for_each_inner!((608)); _for_each_inner!((640)); _for_each_inner!((672));
418        _for_each_inner!((704)); _for_each_inner!((736)); _for_each_inner!((768));
419        _for_each_inner!((800)); _for_each_inner!((832)); _for_each_inner!((864));
420        _for_each_inner!((896)); _for_each_inner!((928)); _for_each_inner!((960));
421        _for_each_inner!((992)); _for_each_inner!((1024)); _for_each_inner!((1056));
422        _for_each_inner!((1088)); _for_each_inner!((1120)); _for_each_inner!((1152));
423        _for_each_inner!((1184)); _for_each_inner!((1216)); _for_each_inner!((1248));
424        _for_each_inner!((1280)); _for_each_inner!((1312)); _for_each_inner!((1344));
425        _for_each_inner!((1376)); _for_each_inner!((1408)); _for_each_inner!((1440));
426        _for_each_inner!((1472)); _for_each_inner!((1504)); _for_each_inner!((1536));
427        _for_each_inner!((1568)); _for_each_inner!((1600)); _for_each_inner!((1632));
428        _for_each_inner!((1664)); _for_each_inner!((1696)); _for_each_inner!((1728));
429        _for_each_inner!((1760)); _for_each_inner!((1792)); _for_each_inner!((1824));
430        _for_each_inner!((1856)); _for_each_inner!((1888)); _for_each_inner!((1920));
431        _for_each_inner!((1952)); _for_each_inner!((1984)); _for_each_inner!((2016));
432        _for_each_inner!((2048)); _for_each_inner!((all(32), (64), (96), (128), (160),
433        (192), (224), (256), (288), (320), (352), (384), (416), (448), (480), (512),
434        (544), (576), (608), (640), (672), (704), (736), (768), (800), (832), (864),
435        (896), (928), (960), (992), (1024), (1056), (1088), (1120), (1152), (1184),
436        (1216), (1248), (1280), (1312), (1344), (1376), (1408), (1440), (1472), (1504),
437        (1536), (1568), (1600), (1632), (1664), (1696), (1728), (1760), (1792), (1824),
438        (1856), (1888), (1920), (1952), (1984), (2016), (2048)));
439    };
440}
441#[macro_export]
442#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
443macro_rules! for_each_sha_algorithm {
444    ($($pattern:tt => $code:tt;)*) => {
445        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
446        _for_each_inner!((Sha1, "SHA-1"(sizes : 64, 20, 8) (insecure_against :
447        "collision", "length extension"), 0)); _for_each_inner!((Sha224, "SHA-224"(sizes
448        : 64, 28, 8) (insecure_against : "length extension"), 1));
449        _for_each_inner!((Sha256, "SHA-256"(sizes : 64, 32, 8) (insecure_against :
450        "length extension"), 2)); _for_each_inner!((Sha384, "SHA-384"(sizes : 128, 48,
451        16) (insecure_against :), 3)); _for_each_inner!((Sha512, "SHA-512"(sizes : 128,
452        64, 16) (insecure_against : "length extension"), 4));
453        _for_each_inner!((Sha512_224, "SHA-512/224"(sizes : 128, 28, 16)
454        (insecure_against :), 5)); _for_each_inner!((Sha512_256, "SHA-512/256"(sizes :
455        128, 32, 16) (insecure_against :), 6)); _for_each_inner!((algos(Sha1,
456        "SHA-1"(sizes : 64, 20, 8) (insecure_against : "collision", "length extension"),
457        0), (Sha224, "SHA-224"(sizes : 64, 28, 8) (insecure_against :
458        "length extension"), 1), (Sha256, "SHA-256"(sizes : 64, 32, 8) (insecure_against
459        : "length extension"), 2), (Sha384, "SHA-384"(sizes : 128, 48, 16)
460        (insecure_against :), 3), (Sha512, "SHA-512"(sizes : 128, 64, 16)
461        (insecure_against : "length extension"), 4), (Sha512_224, "SHA-512/224"(sizes :
462        128, 28, 16) (insecure_against :), 5), (Sha512_256, "SHA-512/256"(sizes : 128,
463        32, 16) (insecure_against :), 6)));
464    };
465}
466/// This macro can be used to generate code for each peripheral instance of the I2C master driver.
467///
468/// For an explanation on the general syntax, as well as usage of individual/repeated
469/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
470///
471/// This macro has one option for its "Individual matcher" case:
472///
473/// Syntax: `($instance:ident, $sys:ident, $scl:ident, $sda:ident)`
474///
475/// Macro fragments:
476///
477/// - `$instance`: the name of the I2C instance
478/// - `$sys`: the name of the instance as it is in the `esp_hal::system::Peripheral` enum.
479/// - `$scl`, `$sda`: peripheral signal names.
480///
481/// Example data: `(I2C0, I2cExt0, I2CEXT0_SCL, I2CEXT0_SDA)`
482#[macro_export]
483#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
484macro_rules! for_each_i2c_master {
485    ($($pattern:tt => $code:tt;)*) => {
486        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
487        _for_each_inner!((I2C0, I2cExt0, I2CEXT0_SCL, I2CEXT0_SDA));
488        _for_each_inner!((I2C1, I2cExt1, I2CEXT1_SCL, I2CEXT1_SDA));
489        _for_each_inner!((all(I2C0, I2cExt0, I2CEXT0_SCL, I2CEXT0_SDA), (I2C1, I2cExt1,
490        I2CEXT1_SCL, I2CEXT1_SDA)));
491    };
492}
493/// This macro can be used to generate code for each peripheral instance of the UART driver.
494///
495/// For an explanation on the general syntax, as well as usage of individual/repeated
496/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
497///
498/// This macro has one option for its "Individual matcher" case:
499///
500/// Syntax: `($instance:ident, $sys:ident, $rx:ident, $tx:ident, $cts:ident, $rts:ident)`
501///
502/// Macro fragments:
503///
504/// - `$instance`: the name of the UART instance
505/// - `$sys`: the name of the instance as it is in the `esp_hal::system::Peripheral` enum.
506/// - `$rx`, `$tx`, `$cts`, `$rts`: signal names.
507///
508/// Example data: `(UART0, Uart0, U0RXD, U0TXD, U0CTS, U0RTS)`
509#[macro_export]
510#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
511macro_rules! for_each_uart {
512    ($($pattern:tt => $code:tt;)*) => {
513        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
514        _for_each_inner!((UART0, Uart0, U0RXD, U0TXD, U0CTS, U0RTS));
515        _for_each_inner!((UART1, Uart1, U1RXD, U1TXD, U1CTS, U1RTS));
516        _for_each_inner!((UART2, Uart2, U2RXD, U2TXD, U2CTS, U2RTS));
517        _for_each_inner!((all(UART0, Uart0, U0RXD, U0TXD, U0CTS, U0RTS), (UART1, Uart1,
518        U1RXD, U1TXD, U1CTS, U1RTS), (UART2, Uart2, U2RXD, U2TXD, U2CTS, U2RTS)));
519    };
520}
521/// This macro can be used to generate code for each peripheral instance of the SPI master driver.
522///
523/// For an explanation on the general syntax, as well as usage of individual/repeated
524/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
525///
526/// This macro has one option for its "Individual matcher" case:
527///
528/// Syntax: `($instance:ident, $sys:ident, $sclk:ident, [$($cs:ident),*] [$($sio:ident),*
529/// $($is_qspi:iteral)?])`
530///
531/// Macro fragments:
532///
533/// - `$instance`: the name of the SPI instance
534/// - `$sys`: the name of the instance as it is in the `esp_hal::system::Peripheral` enum.
535/// - `$cs`, `$sio`: chip select and SIO signal names.
536/// - `$is_qspi`: a `true` literal present if the SPI instance supports QSPI.
537///
538/// Example data:
539/// - `(SPI2, Spi2, FSPICLK [FSPICS0, FSPICS1, FSPICS2, FSPICS3, FSPICS4, FSPICS5] [FSPID, FSPIQ,
540///   FSPIWP, FSPIHD, FSPIIO4, FSPIIO5, FSPIIO6, FSPIIO7], true)`
541/// - `(SPI3, Spi3, SPI3_CLK [SPI3_CS0, SPI3_CS1, SPI3_CS2] [SPI3_D, SPI3_Q])`
542#[macro_export]
543#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
544macro_rules! for_each_spi_master {
545    ($($pattern:tt => $code:tt;)*) => {
546        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
547        _for_each_inner!((SPI2, Spi2, FSPICLK[FSPICS0, FSPICS1, FSPICS2, FSPICS3,
548        FSPICS4, FSPICS5] [FSPID, FSPIQ, FSPIWP, FSPIHD, FSPIIO4, FSPIIO5, FSPIIO6,
549        FSPIIO7], true)); _for_each_inner!((SPI3, Spi3, SPI3_CLK[SPI3_CS0, SPI3_CS1,
550        SPI3_CS2] [SPI3_D, SPI3_Q, SPI3_WP, SPI3_HD], true)); _for_each_inner!((all(SPI2,
551        Spi2, FSPICLK[FSPICS0, FSPICS1, FSPICS2, FSPICS3, FSPICS4, FSPICS5] [FSPID,
552        FSPIQ, FSPIWP, FSPIHD, FSPIIO4, FSPIIO5, FSPIIO6, FSPIIO7], true), (SPI3, Spi3,
553        SPI3_CLK[SPI3_CS0, SPI3_CS1, SPI3_CS2] [SPI3_D, SPI3_Q, SPI3_WP, SPI3_HD],
554        true)));
555    };
556}
557/// This macro can be used to generate code for each peripheral instance of the SPI slave driver.
558///
559/// For an explanation on the general syntax, as well as usage of individual/repeated
560/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
561///
562/// This macro has one option for its "Individual matcher" case:
563///
564/// Syntax: `($instance:ident, $sys:ident, $sclk:ident, $mosi:ident, $miso:ident, $cs:ident)`
565///
566/// Macro fragments:
567///
568/// - `$instance`: the name of the I2C instance
569/// - `$sys`: the name of the instance as it is in the `esp_hal::system::Peripheral` enum.
570/// - `$mosi`, `$miso`, `$cs`: signal names.
571///
572/// Example data: `(SPI2, Spi2, FSPICLK, FSPID, FSPIQ, FSPICS0)`
573#[macro_export]
574#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
575macro_rules! for_each_spi_slave {
576    ($($pattern:tt => $code:tt;)*) => {
577        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
578        _for_each_inner!((SPI2, Spi2, FSPICLK, FSPID, FSPIQ, FSPICS0));
579        _for_each_inner!((SPI3, Spi3, SPI3_CLK, SPI3_D, SPI3_Q, SPI3_CS0));
580        _for_each_inner!((all(SPI2, Spi2, FSPICLK, FSPID, FSPIQ, FSPICS0), (SPI3, Spi3,
581        SPI3_CLK, SPI3_D, SPI3_Q, SPI3_CS0)));
582    };
583}
584#[macro_export]
585#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
586macro_rules! for_each_peripheral {
587    ($($pattern:tt => $code:tt;)*) => {
588        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
589        _for_each_inner!((GPIO0 <= virtual())); _for_each_inner!((GPIO1 <= virtual()));
590        _for_each_inner!((GPIO2 <= virtual())); _for_each_inner!((GPIO3 <= virtual()));
591        _for_each_inner!((GPIO4 <= virtual())); _for_each_inner!((GPIO5 <= virtual()));
592        _for_each_inner!((GPIO6 <= virtual())); _for_each_inner!((GPIO7 <= virtual()));
593        _for_each_inner!((GPIO8 <= virtual())); _for_each_inner!((GPIO9 <= virtual()));
594        _for_each_inner!((GPIO10 <= virtual())); _for_each_inner!((GPIO11 <= virtual()));
595        _for_each_inner!((GPIO12 <= virtual())); _for_each_inner!((GPIO13 <= virtual()));
596        _for_each_inner!((GPIO14 <= virtual())); _for_each_inner!((GPIO15 <= virtual()));
597        _for_each_inner!((GPIO16 <= virtual())); _for_each_inner!((GPIO17 <= virtual()));
598        _for_each_inner!((GPIO18 <= virtual())); _for_each_inner!((GPIO19 <= virtual()));
599        _for_each_inner!((GPIO20 <= virtual())); _for_each_inner!((GPIO21 <= virtual()));
600        _for_each_inner!((GPIO33 <= virtual())); _for_each_inner!((GPIO34 <= virtual()));
601        _for_each_inner!((GPIO35 <= virtual())); _for_each_inner!((GPIO36 <= virtual()));
602        _for_each_inner!((GPIO37 <= virtual())); _for_each_inner!((GPIO38 <= virtual()));
603        _for_each_inner!((GPIO39 <= virtual())); _for_each_inner!((GPIO40 <= virtual()));
604        _for_each_inner!((GPIO41 <= virtual())); _for_each_inner!((GPIO42 <= virtual()));
605        _for_each_inner!((GPIO43 <= virtual())); _for_each_inner!((GPIO44 <= virtual()));
606        _for_each_inner!((GPIO45 <= virtual())); _for_each_inner!((GPIO46 <= virtual()));
607        _for_each_inner!((GPIO47 <= virtual())); _for_each_inner!((GPIO48 <= virtual()));
608        _for_each_inner!((AES <= AES(AES : { bind_peri_interrupt, enable_peri_interrupt,
609        disable_peri_interrupt }) (unstable))); _for_each_inner!((APB_CTRL <= APB_CTRL()
610        (unstable))); _for_each_inner!((APB_SARADC <= APB_SARADC() (unstable)));
611        _for_each_inner!((ASSIST_DEBUG <= ASSIST_DEBUG() (unstable)));
612        _for_each_inner!((DMA <= DMA() (unstable))); _for_each_inner!((DS <= DS()
613        (unstable))); _for_each_inner!((EFUSE <= EFUSE() (unstable)));
614        _for_each_inner!((EXTMEM <= EXTMEM() (unstable))); _for_each_inner!((GPIO <=
615        GPIO() (unstable))); _for_each_inner!((GPIO_SD <= GPIO_SD() (unstable)));
616        _for_each_inner!((HMAC <= HMAC() (unstable))); _for_each_inner!((I2C0 <=
617        I2C0(I2C_EXT0 : { bind_peri_interrupt, enable_peri_interrupt,
618        disable_peri_interrupt }))); _for_each_inner!((I2C1 <= I2C1(I2C_EXT1 : {
619        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })));
620        _for_each_inner!((I2S0 <= I2S0(I2S0 : { bind_peri_interrupt,
621        enable_peri_interrupt, disable_peri_interrupt }) (unstable)));
622        _for_each_inner!((I2S1 <= I2S1(I2S1 : { bind_peri_interrupt,
623        enable_peri_interrupt, disable_peri_interrupt }) (unstable)));
624        _for_each_inner!((INTERRUPT_CORE0 <= INTERRUPT_CORE0() (unstable)));
625        _for_each_inner!((INTERRUPT_CORE1 <= INTERRUPT_CORE1() (unstable)));
626        _for_each_inner!((IO_MUX <= IO_MUX() (unstable))); _for_each_inner!((LCD_CAM <=
627        LCD_CAM() (unstable))); _for_each_inner!((LEDC <= LEDC() (unstable)));
628        _for_each_inner!((LPWR <= RTC_CNTL() (unstable))); _for_each_inner!((MCPWM0 <=
629        MCPWM0() (unstable))); _for_each_inner!((MCPWM1 <= MCPWM1() (unstable)));
630        _for_each_inner!((PCNT <= PCNT() (unstable))); _for_each_inner!((PERI_BACKUP <=
631        PERI_BACKUP() (unstable))); _for_each_inner!((RMT <= RMT() (unstable)));
632        _for_each_inner!((RNG <= RNG() (unstable))); _for_each_inner!((RSA <= RSA(RSA : {
633        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })
634        (unstable))); _for_each_inner!((RTC_CNTL <= RTC_CNTL() (unstable)));
635        _for_each_inner!((RTC_I2C <= RTC_I2C() (unstable))); _for_each_inner!((RTC_IO <=
636        RTC_IO() (unstable))); _for_each_inner!((SDHOST <= SDHOST() (unstable)));
637        _for_each_inner!((SENS <= SENS() (unstable))); _for_each_inner!((SENSITIVE <=
638        SENSITIVE() (unstable))); _for_each_inner!((SHA <= SHA(SHA : {
639        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })
640        (unstable))); _for_each_inner!((SPI0 <= SPI0() (unstable)));
641        _for_each_inner!((SPI1 <= SPI1() (unstable))); _for_each_inner!((SPI2 <=
642        SPI2(SPI2 : { bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt
643        }))); _for_each_inner!((SPI3 <= SPI3(SPI3 : { bind_peri_interrupt,
644        enable_peri_interrupt, disable_peri_interrupt }))); _for_each_inner!((SYSTEM <=
645        SYSTEM() (unstable))); _for_each_inner!((SYSTIMER <= SYSTIMER() (unstable)));
646        _for_each_inner!((TIMG0 <= TIMG0() (unstable))); _for_each_inner!((TIMG1 <=
647        TIMG1() (unstable))); _for_each_inner!((TWAI0 <= TWAI0() (unstable)));
648        _for_each_inner!((UART0 <= UART0(UART0 : { bind_peri_interrupt,
649        enable_peri_interrupt, disable_peri_interrupt }))); _for_each_inner!((UART1 <=
650        UART1(UART1 : { bind_peri_interrupt, enable_peri_interrupt,
651        disable_peri_interrupt }))); _for_each_inner!((UART2 <= UART2(UART2 : {
652        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })));
653        _for_each_inner!((UHCI0 <= UHCI0() (unstable))); _for_each_inner!((USB0 <= USB0()
654        (unstable))); _for_each_inner!((USB_DEVICE <= USB_DEVICE(USB_DEVICE : {
655        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })
656        (unstable))); _for_each_inner!((USB_WRAP <= USB_WRAP() (unstable)));
657        _for_each_inner!((WCL <= WCL() (unstable))); _for_each_inner!((XTS_AES <=
658        XTS_AES() (unstable))); _for_each_inner!((DMA_CH0 <= virtual() (unstable)));
659        _for_each_inner!((DMA_CH1 <= virtual() (unstable))); _for_each_inner!((DMA_CH2 <=
660        virtual() (unstable))); _for_each_inner!((DMA_CH3 <= virtual() (unstable)));
661        _for_each_inner!((DMA_CH4 <= virtual() (unstable))); _for_each_inner!((ADC1 <=
662        virtual() (unstable))); _for_each_inner!((ADC2 <= virtual() (unstable)));
663        _for_each_inner!((BT <= virtual() (unstable))); _for_each_inner!((CPU_CTRL <=
664        virtual() (unstable))); _for_each_inner!((FLASH <= virtual() (unstable)));
665        _for_each_inner!((PSRAM <= virtual() (unstable))); _for_each_inner!((SW_INTERRUPT
666        <= virtual() (unstable))); _for_each_inner!((ULP_RISCV_CORE <= virtual()
667        (unstable))); _for_each_inner!((WIFI <= virtual() (unstable)));
668        _for_each_inner!((all(GPIO0 <= virtual()), (GPIO1 <= virtual()), (GPIO2 <=
669        virtual()), (GPIO3 <= virtual()), (GPIO4 <= virtual()), (GPIO5 <= virtual()),
670        (GPIO6 <= virtual()), (GPIO7 <= virtual()), (GPIO8 <= virtual()), (GPIO9 <=
671        virtual()), (GPIO10 <= virtual()), (GPIO11 <= virtual()), (GPIO12 <= virtual()),
672        (GPIO13 <= virtual()), (GPIO14 <= virtual()), (GPIO15 <= virtual()), (GPIO16 <=
673        virtual()), (GPIO17 <= virtual()), (GPIO18 <= virtual()), (GPIO19 <= virtual()),
674        (GPIO20 <= virtual()), (GPIO21 <= virtual()), (GPIO33 <= virtual()), (GPIO34 <=
675        virtual()), (GPIO35 <= virtual()), (GPIO36 <= virtual()), (GPIO37 <= virtual()),
676        (GPIO38 <= virtual()), (GPIO39 <= virtual()), (GPIO40 <= virtual()), (GPIO41 <=
677        virtual()), (GPIO42 <= virtual()), (GPIO43 <= virtual()), (GPIO44 <= virtual()),
678        (GPIO45 <= virtual()), (GPIO46 <= virtual()), (GPIO47 <= virtual()), (GPIO48 <=
679        virtual()), (AES <= AES(AES : { bind_peri_interrupt, enable_peri_interrupt,
680        disable_peri_interrupt }) (unstable)), (APB_CTRL <= APB_CTRL() (unstable)),
681        (APB_SARADC <= APB_SARADC() (unstable)), (ASSIST_DEBUG <= ASSIST_DEBUG()
682        (unstable)), (DMA <= DMA() (unstable)), (DS <= DS() (unstable)), (EFUSE <=
683        EFUSE() (unstable)), (EXTMEM <= EXTMEM() (unstable)), (GPIO <= GPIO()
684        (unstable)), (GPIO_SD <= GPIO_SD() (unstable)), (HMAC <= HMAC() (unstable)),
685        (I2C0 <= I2C0(I2C_EXT0 : { bind_peri_interrupt, enable_peri_interrupt,
686        disable_peri_interrupt })), (I2C1 <= I2C1(I2C_EXT1 : { bind_peri_interrupt,
687        enable_peri_interrupt, disable_peri_interrupt })), (I2S0 <= I2S0(I2S0 : {
688        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })
689        (unstable)), (I2S1 <= I2S1(I2S1 : { bind_peri_interrupt, enable_peri_interrupt,
690        disable_peri_interrupt }) (unstable)), (INTERRUPT_CORE0 <= INTERRUPT_CORE0()
691        (unstable)), (INTERRUPT_CORE1 <= INTERRUPT_CORE1() (unstable)), (IO_MUX <=
692        IO_MUX() (unstable)), (LCD_CAM <= LCD_CAM() (unstable)), (LEDC <= LEDC()
693        (unstable)), (LPWR <= RTC_CNTL() (unstable)), (MCPWM0 <= MCPWM0() (unstable)),
694        (MCPWM1 <= MCPWM1() (unstable)), (PCNT <= PCNT() (unstable)), (PERI_BACKUP <=
695        PERI_BACKUP() (unstable)), (RMT <= RMT() (unstable)), (RNG <= RNG() (unstable)),
696        (RSA <= RSA(RSA : { bind_peri_interrupt, enable_peri_interrupt,
697        disable_peri_interrupt }) (unstable)), (RTC_CNTL <= RTC_CNTL() (unstable)),
698        (RTC_I2C <= RTC_I2C() (unstable)), (RTC_IO <= RTC_IO() (unstable)), (SDHOST <=
699        SDHOST() (unstable)), (SENS <= SENS() (unstable)), (SENSITIVE <= SENSITIVE()
700        (unstable)), (SHA <= SHA(SHA : { bind_peri_interrupt, enable_peri_interrupt,
701        disable_peri_interrupt }) (unstable)), (SPI0 <= SPI0() (unstable)), (SPI1 <=
702        SPI1() (unstable)), (SPI2 <= SPI2(SPI2 : { bind_peri_interrupt,
703        enable_peri_interrupt, disable_peri_interrupt })), (SPI3 <= SPI3(SPI3 : {
704        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })), (SYSTEM
705        <= SYSTEM() (unstable)), (SYSTIMER <= SYSTIMER() (unstable)), (TIMG0 <= TIMG0()
706        (unstable)), (TIMG1 <= TIMG1() (unstable)), (TWAI0 <= TWAI0() (unstable)), (UART0
707        <= UART0(UART0 : { bind_peri_interrupt, enable_peri_interrupt,
708        disable_peri_interrupt })), (UART1 <= UART1(UART1 : { bind_peri_interrupt,
709        enable_peri_interrupt, disable_peri_interrupt })), (UART2 <= UART2(UART2 : {
710        bind_peri_interrupt, enable_peri_interrupt, disable_peri_interrupt })), (UHCI0 <=
711        UHCI0() (unstable)), (USB0 <= USB0() (unstable)), (USB_DEVICE <=
712        USB_DEVICE(USB_DEVICE : { bind_peri_interrupt, enable_peri_interrupt,
713        disable_peri_interrupt }) (unstable)), (USB_WRAP <= USB_WRAP() (unstable)), (WCL
714        <= WCL() (unstable)), (XTS_AES <= XTS_AES() (unstable)), (DMA_CH0 <= virtual()
715        (unstable)), (DMA_CH1 <= virtual() (unstable)), (DMA_CH2 <= virtual()
716        (unstable)), (DMA_CH3 <= virtual() (unstable)), (DMA_CH4 <= virtual()
717        (unstable)), (ADC1 <= virtual() (unstable)), (ADC2 <= virtual() (unstable)), (BT
718        <= virtual() (unstable)), (CPU_CTRL <= virtual() (unstable)), (FLASH <= virtual()
719        (unstable)), (PSRAM <= virtual() (unstable)), (SW_INTERRUPT <= virtual()
720        (unstable)), (ULP_RISCV_CORE <= virtual() (unstable)), (WIFI <= virtual()
721        (unstable))));
722    };
723}
724/// This macro can be used to generate code for each `GPIOn` instance.
725///
726/// For an explanation on the general syntax, as well as usage of individual/repeated
727/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
728///
729/// This macro has one option for its "Individual matcher" case:
730///
731/// Syntax: `($n:literal, $gpio:ident ($($digital_input_function:ident =>
732/// $digital_input_signal:ident)*) ($($digital_output_function:ident =>
733/// $digital_output_signal:ident)*) ($([$pin_attribute:ident])*))`
734///
735/// Macro fragments:
736///
737/// - `$n`: the number of the GPIO. For `GPIO0`, `$n` is 0.
738/// - `$gpio`: the name of the GPIO.
739/// - `$digital_input_function`: the number of the digital function, as an identifier (i.e. for
740///   function 0 this is `_0`).
741/// - `$digital_input_function`: the name of the digital function, as an identifier.
742/// - `$digital_output_function`: the number of the digital function, as an identifier (i.e. for
743///   function 0 this is `_0`).
744/// - `$digital_output_function`: the name of the digital function, as an identifier.
745/// - `$pin_attribute`: `Input` and/or `Output`, marks the possible directions of the GPIO.
746///   Bracketed so that they can also be matched as optional fragments. Order is always Input first.
747///
748/// Example data: `(0, GPIO0 (_5 => EMAC_TX_CLK) (_1 => CLK_OUT1 _5 => EMAC_TX_CLK) ([Input]
749/// [Output]))`
750#[macro_export]
751#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
752macro_rules! for_each_gpio {
753    ($($pattern:tt => $code:tt;)*) => {
754        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
755        _for_each_inner!((0, GPIO0() () ([Input] [Output]))); _for_each_inner!((1,
756        GPIO1() () ([Input] [Output]))); _for_each_inner!((2, GPIO2() () ([Input]
757        [Output]))); _for_each_inner!((3, GPIO3() () ([Input] [Output])));
758        _for_each_inner!((4, GPIO4() () ([Input] [Output]))); _for_each_inner!((5,
759        GPIO5() () ([Input] [Output]))); _for_each_inner!((6, GPIO6() () ([Input]
760        [Output]))); _for_each_inner!((7, GPIO7() () ([Input] [Output])));
761        _for_each_inner!((8, GPIO8() (_3 => SUBSPICS1) ([Input] [Output])));
762        _for_each_inner!((9, GPIO9(_3 => SUBSPIHD _4 => FSPIHD) (_3 => SUBSPIHD _4 =>
763        FSPIHD) ([Input] [Output]))); _for_each_inner!((10, GPIO10(_2 => FSPIIO4 _4 =>
764        FSPICS0) (_2 => FSPIIO4 _3 => SUBSPICS0 _4 => FSPICS0) ([Input] [Output])));
765        _for_each_inner!((11, GPIO11(_2 => FSPIIO5 _3 => SUBSPID _4 => FSPID) (_2 =>
766        FSPIIO5 _3 => SUBSPID _4 => FSPID) ([Input] [Output]))); _for_each_inner!((12,
767        GPIO12(_2 => FSPIIO6 _4 => FSPICLK) (_2 => FSPIIO6 _3 => SUBSPICLK _4 => FSPICLK)
768        ([Input] [Output]))); _for_each_inner!((13, GPIO13(_2 => FSPIIO7 _3 => SUBSPIQ _4
769        => FSPIQ) (_2 => FSPIIO7 _3 => SUBSPIQ _4 => FSPIQ) ([Input] [Output])));
770        _for_each_inner!((14, GPIO14(_3 => SUBSPIWP _4 => FSPIWP) (_2 => FSPIDQS _3 =>
771        SUBSPIWP _4 => FSPIWP) ([Input] [Output]))); _for_each_inner!((15, GPIO15() (_2
772        => U0RTS) ([Input] [Output]))); _for_each_inner!((16, GPIO16(_2 => U0CTS) ()
773        ([Input] [Output]))); _for_each_inner!((17, GPIO17() (_2 => U1TXD) ([Input]
774        [Output]))); _for_each_inner!((18, GPIO18(_2 => U1RXD) (_3 => CLK_OUT3) ([Input]
775        [Output]))); _for_each_inner!((19, GPIO19() (_2 => U1RTS _3 => CLK_OUT2) ([Input]
776        [Output]))); _for_each_inner!((20, GPIO20(_2 => U1CTS) (_3 => CLK_OUT1) ([Input]
777        [Output]))); _for_each_inner!((21, GPIO21() () ([Input] [Output])));
778        _for_each_inner!((33, GPIO33(_2 => FSPIHD _3 => SUBSPIHD _4 => SPIIO4) (_2 =>
779        FSPIHD _3 => SUBSPIHD _4 => SPIIO4) ([Input] [Output]))); _for_each_inner!((34,
780        GPIO34(_2 => FSPICS0 _4 => SPIIO5) (_2 => FSPICS0 _3 => SUBSPICS0 _4 => SPIIO5)
781        ([Input] [Output]))); _for_each_inner!((35, GPIO35(_2 => FSPID _3 => SUBSPID _4
782        => SPIIO6) (_2 => FSPID _3 => SUBSPID _4 => SPIIO6) ([Input] [Output])));
783        _for_each_inner!((36, GPIO36(_2 => FSPICLK _4 => SPIIO7) (_2 => FSPICLK _3 =>
784        SUBSPICLK _4 => SPIIO7) ([Input] [Output]))); _for_each_inner!((37, GPIO37(_2 =>
785        FSPIQ _3 => SUBSPIQ _4 => SPIDQS) (_2 => FSPIQ _3 => SUBSPIQ _4 => SPIDQS)
786        ([Input] [Output]))); _for_each_inner!((38, GPIO38(_2 => FSPIWP _3 => SUBSPIWP)
787        (_2 => FSPIWP _3 => SUBSPIWP) ([Input] [Output]))); _for_each_inner!((39,
788        GPIO39() (_2 => CLK_OUT3 _3 => SUBSPICS1) ([Input] [Output])));
789        _for_each_inner!((40, GPIO40() (_2 => CLK_OUT2) ([Input] [Output])));
790        _for_each_inner!((41, GPIO41() (_2 => CLK_OUT1) ([Input] [Output])));
791        _for_each_inner!((42, GPIO42() () ([Input] [Output]))); _for_each_inner!((43,
792        GPIO43() (_0 => U0TXD _2 => CLK_OUT1) ([Input] [Output]))); _for_each_inner!((44,
793        GPIO44(_0 => U0RXD) (_2 => CLK_OUT2) ([Input] [Output]))); _for_each_inner!((45,
794        GPIO45() () ([Input] [Output]))); _for_each_inner!((46, GPIO46() () ([Input]
795        [Output]))); _for_each_inner!((47, GPIO47() (_0 => SPICLK_P_DIFF _2 =>
796        SUBSPICLK_P_DIFF) ([Input] [Output]))); _for_each_inner!((48, GPIO48() (_0 =>
797        SPICLK_N_DIFF _2 => SUBSPICLK_N_DIFF) ([Input] [Output])));
798        _for_each_inner!((all(0, GPIO0() () ([Input] [Output])), (1, GPIO1() () ([Input]
799        [Output])), (2, GPIO2() () ([Input] [Output])), (3, GPIO3() () ([Input]
800        [Output])), (4, GPIO4() () ([Input] [Output])), (5, GPIO5() () ([Input]
801        [Output])), (6, GPIO6() () ([Input] [Output])), (7, GPIO7() () ([Input]
802        [Output])), (8, GPIO8() (_3 => SUBSPICS1) ([Input] [Output])), (9, GPIO9(_3 =>
803        SUBSPIHD _4 => FSPIHD) (_3 => SUBSPIHD _4 => FSPIHD) ([Input] [Output])), (10,
804        GPIO10(_2 => FSPIIO4 _4 => FSPICS0) (_2 => FSPIIO4 _3 => SUBSPICS0 _4 => FSPICS0)
805        ([Input] [Output])), (11, GPIO11(_2 => FSPIIO5 _3 => SUBSPID _4 => FSPID) (_2 =>
806        FSPIIO5 _3 => SUBSPID _4 => FSPID) ([Input] [Output])), (12, GPIO12(_2 => FSPIIO6
807        _4 => FSPICLK) (_2 => FSPIIO6 _3 => SUBSPICLK _4 => FSPICLK) ([Input] [Output])),
808        (13, GPIO13(_2 => FSPIIO7 _3 => SUBSPIQ _4 => FSPIQ) (_2 => FSPIIO7 _3 => SUBSPIQ
809        _4 => FSPIQ) ([Input] [Output])), (14, GPIO14(_3 => SUBSPIWP _4 => FSPIWP) (_2 =>
810        FSPIDQS _3 => SUBSPIWP _4 => FSPIWP) ([Input] [Output])), (15, GPIO15() (_2 =>
811        U0RTS) ([Input] [Output])), (16, GPIO16(_2 => U0CTS) () ([Input] [Output])), (17,
812        GPIO17() (_2 => U1TXD) ([Input] [Output])), (18, GPIO18(_2 => U1RXD) (_3 =>
813        CLK_OUT3) ([Input] [Output])), (19, GPIO19() (_2 => U1RTS _3 => CLK_OUT2)
814        ([Input] [Output])), (20, GPIO20(_2 => U1CTS) (_3 => CLK_OUT1) ([Input]
815        [Output])), (21, GPIO21() () ([Input] [Output])), (33, GPIO33(_2 => FSPIHD _3 =>
816        SUBSPIHD _4 => SPIIO4) (_2 => FSPIHD _3 => SUBSPIHD _4 => SPIIO4) ([Input]
817        [Output])), (34, GPIO34(_2 => FSPICS0 _4 => SPIIO5) (_2 => FSPICS0 _3 =>
818        SUBSPICS0 _4 => SPIIO5) ([Input] [Output])), (35, GPIO35(_2 => FSPID _3 =>
819        SUBSPID _4 => SPIIO6) (_2 => FSPID _3 => SUBSPID _4 => SPIIO6) ([Input]
820        [Output])), (36, GPIO36(_2 => FSPICLK _4 => SPIIO7) (_2 => FSPICLK _3 =>
821        SUBSPICLK _4 => SPIIO7) ([Input] [Output])), (37, GPIO37(_2 => FSPIQ _3 =>
822        SUBSPIQ _4 => SPIDQS) (_2 => FSPIQ _3 => SUBSPIQ _4 => SPIDQS) ([Input]
823        [Output])), (38, GPIO38(_2 => FSPIWP _3 => SUBSPIWP) (_2 => FSPIWP _3 =>
824        SUBSPIWP) ([Input] [Output])), (39, GPIO39() (_2 => CLK_OUT3 _3 => SUBSPICS1)
825        ([Input] [Output])), (40, GPIO40() (_2 => CLK_OUT2) ([Input] [Output])), (41,
826        GPIO41() (_2 => CLK_OUT1) ([Input] [Output])), (42, GPIO42() () ([Input]
827        [Output])), (43, GPIO43() (_0 => U0TXD _2 => CLK_OUT1) ([Input] [Output])), (44,
828        GPIO44(_0 => U0RXD) (_2 => CLK_OUT2) ([Input] [Output])), (45, GPIO45() ()
829        ([Input] [Output])), (46, GPIO46() () ([Input] [Output])), (47, GPIO47() (_0 =>
830        SPICLK_P_DIFF _2 => SUBSPICLK_P_DIFF) ([Input] [Output])), (48, GPIO48() (_0 =>
831        SPICLK_N_DIFF _2 => SUBSPICLK_N_DIFF) ([Input] [Output]))));
832    };
833}
834/// This macro can be used to generate code for each analog function of each GPIO.
835///
836/// For an explanation on the general syntax, as well as usage of individual/repeated
837/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
838///
839/// This macro has two options for its "Individual matcher" case:
840///
841/// - `all`: `($signal:ident, $gpio:ident)` - simple case where you only need identifiers
842/// - `all_expanded`: `(($signal:ident, $group:ident $(, $number:literal)+), $gpio:ident)` -
843///   expanded signal case, where you need the number(s) of a signal, or the general group to which
844///   the signal belongs. For example, in case of `ADC2_CH3` the expanded form looks like
845///   `(ADC2_CH3, ADCn_CHm, 2, 3)`.
846///
847/// Macro fragments:
848///
849/// - `$signal`: the name of the signal.
850/// - `$group`: the name of the signal, with numbers replaced by placeholders. For `ADC2_CH3` this
851///   is `ADCn_CHm`.
852/// - `$number`: the numbers extracted from `$signal`.
853/// - `$gpio`: the name of the GPIO.
854///
855/// Example data:
856/// - `(ADC2_CH5, GPIO12)`
857/// - `((ADC2_CH5, ADCn_CHm, 2, 5), GPIO12)`
858///
859/// The expanded syntax is only available when the signal has at least one numbered component.
860#[macro_export]
861#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
862macro_rules! for_each_analog_function {
863    ($($pattern:tt => $code:tt;)*) => {
864        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
865        _for_each_inner!((TOUCH1, GPIO1)); _for_each_inner!((ADC1_CH0, GPIO1));
866        _for_each_inner!((TOUCH2, GPIO2)); _for_each_inner!((ADC1_CH1, GPIO2));
867        _for_each_inner!((TOUCH3, GPIO3)); _for_each_inner!((ADC1_CH2, GPIO3));
868        _for_each_inner!((TOUCH4, GPIO4)); _for_each_inner!((ADC1_CH3, GPIO4));
869        _for_each_inner!((TOUCH5, GPIO5)); _for_each_inner!((ADC1_CH4, GPIO5));
870        _for_each_inner!((TOUCH6, GPIO6)); _for_each_inner!((ADC1_CH5, GPIO6));
871        _for_each_inner!((TOUCH7, GPIO7)); _for_each_inner!((ADC1_CH6, GPIO7));
872        _for_each_inner!((TOUCH8, GPIO8)); _for_each_inner!((ADC1_CH7, GPIO8));
873        _for_each_inner!((TOUCH9, GPIO9)); _for_each_inner!((ADC1_CH8, GPIO9));
874        _for_each_inner!((TOUCH10, GPIO10)); _for_each_inner!((ADC1_CH9, GPIO10));
875        _for_each_inner!((TOUCH11, GPIO11)); _for_each_inner!((ADC2_CH0, GPIO11));
876        _for_each_inner!((TOUCH12, GPIO12)); _for_each_inner!((ADC2_CH1, GPIO12));
877        _for_each_inner!((TOUCH13, GPIO13)); _for_each_inner!((ADC2_CH2, GPIO13));
878        _for_each_inner!((TOUCH14, GPIO14)); _for_each_inner!((ADC2_CH3, GPIO14));
879        _for_each_inner!((XTAL_32K_P, GPIO15)); _for_each_inner!((ADC2_CH4, GPIO15));
880        _for_each_inner!((XTAL_32K_N, GPIO16)); _for_each_inner!((ADC2_CH5, GPIO16));
881        _for_each_inner!((ADC2_CH6, GPIO17)); _for_each_inner!((ADC2_CH7, GPIO18));
882        _for_each_inner!((USB_DM, GPIO19)); _for_each_inner!((ADC2_CH8, GPIO19));
883        _for_each_inner!((USB_DP, GPIO20)); _for_each_inner!((ADC2_CH9, GPIO20));
884        _for_each_inner!(((TOUCH1, TOUCHn, 1), GPIO1)); _for_each_inner!(((ADC1_CH0,
885        ADCn_CHm, 1, 0), GPIO1)); _for_each_inner!(((TOUCH2, TOUCHn, 2), GPIO2));
886        _for_each_inner!(((ADC1_CH1, ADCn_CHm, 1, 1), GPIO2)); _for_each_inner!(((TOUCH3,
887        TOUCHn, 3), GPIO3)); _for_each_inner!(((ADC1_CH2, ADCn_CHm, 1, 2), GPIO3));
888        _for_each_inner!(((TOUCH4, TOUCHn, 4), GPIO4)); _for_each_inner!(((ADC1_CH3,
889        ADCn_CHm, 1, 3), GPIO4)); _for_each_inner!(((TOUCH5, TOUCHn, 5), GPIO5));
890        _for_each_inner!(((ADC1_CH4, ADCn_CHm, 1, 4), GPIO5)); _for_each_inner!(((TOUCH6,
891        TOUCHn, 6), GPIO6)); _for_each_inner!(((ADC1_CH5, ADCn_CHm, 1, 5), GPIO6));
892        _for_each_inner!(((TOUCH7, TOUCHn, 7), GPIO7)); _for_each_inner!(((ADC1_CH6,
893        ADCn_CHm, 1, 6), GPIO7)); _for_each_inner!(((TOUCH8, TOUCHn, 8), GPIO8));
894        _for_each_inner!(((ADC1_CH7, ADCn_CHm, 1, 7), GPIO8)); _for_each_inner!(((TOUCH9,
895        TOUCHn, 9), GPIO9)); _for_each_inner!(((ADC1_CH8, ADCn_CHm, 1, 8), GPIO9));
896        _for_each_inner!(((TOUCH10, TOUCHn, 10), GPIO10)); _for_each_inner!(((ADC1_CH9,
897        ADCn_CHm, 1, 9), GPIO10)); _for_each_inner!(((TOUCH11, TOUCHn, 11), GPIO11));
898        _for_each_inner!(((ADC2_CH0, ADCn_CHm, 2, 0), GPIO11));
899        _for_each_inner!(((TOUCH12, TOUCHn, 12), GPIO12)); _for_each_inner!(((ADC2_CH1,
900        ADCn_CHm, 2, 1), GPIO12)); _for_each_inner!(((TOUCH13, TOUCHn, 13), GPIO13));
901        _for_each_inner!(((ADC2_CH2, ADCn_CHm, 2, 2), GPIO13));
902        _for_each_inner!(((TOUCH14, TOUCHn, 14), GPIO14)); _for_each_inner!(((ADC2_CH3,
903        ADCn_CHm, 2, 3), GPIO14)); _for_each_inner!(((ADC2_CH4, ADCn_CHm, 2, 4),
904        GPIO15)); _for_each_inner!(((ADC2_CH5, ADCn_CHm, 2, 5), GPIO16));
905        _for_each_inner!(((ADC2_CH6, ADCn_CHm, 2, 6), GPIO17));
906        _for_each_inner!(((ADC2_CH7, ADCn_CHm, 2, 7), GPIO18));
907        _for_each_inner!(((ADC2_CH8, ADCn_CHm, 2, 8), GPIO19));
908        _for_each_inner!(((ADC2_CH9, ADCn_CHm, 2, 9), GPIO20));
909        _for_each_inner!((all(TOUCH1, GPIO1), (ADC1_CH0, GPIO1), (TOUCH2, GPIO2),
910        (ADC1_CH1, GPIO2), (TOUCH3, GPIO3), (ADC1_CH2, GPIO3), (TOUCH4, GPIO4),
911        (ADC1_CH3, GPIO4), (TOUCH5, GPIO5), (ADC1_CH4, GPIO5), (TOUCH6, GPIO6),
912        (ADC1_CH5, GPIO6), (TOUCH7, GPIO7), (ADC1_CH6, GPIO7), (TOUCH8, GPIO8),
913        (ADC1_CH7, GPIO8), (TOUCH9, GPIO9), (ADC1_CH8, GPIO9), (TOUCH10, GPIO10),
914        (ADC1_CH9, GPIO10), (TOUCH11, GPIO11), (ADC2_CH0, GPIO11), (TOUCH12, GPIO12),
915        (ADC2_CH1, GPIO12), (TOUCH13, GPIO13), (ADC2_CH2, GPIO13), (TOUCH14, GPIO14),
916        (ADC2_CH3, GPIO14), (XTAL_32K_P, GPIO15), (ADC2_CH4, GPIO15), (XTAL_32K_N,
917        GPIO16), (ADC2_CH5, GPIO16), (ADC2_CH6, GPIO17), (ADC2_CH7, GPIO18), (USB_DM,
918        GPIO19), (ADC2_CH8, GPIO19), (USB_DP, GPIO20), (ADC2_CH9, GPIO20)));
919        _for_each_inner!((all_expanded((TOUCH1, TOUCHn, 1), GPIO1), ((ADC1_CH0, ADCn_CHm,
920        1, 0), GPIO1), ((TOUCH2, TOUCHn, 2), GPIO2), ((ADC1_CH1, ADCn_CHm, 1, 1), GPIO2),
921        ((TOUCH3, TOUCHn, 3), GPIO3), ((ADC1_CH2, ADCn_CHm, 1, 2), GPIO3), ((TOUCH4,
922        TOUCHn, 4), GPIO4), ((ADC1_CH3, ADCn_CHm, 1, 3), GPIO4), ((TOUCH5, TOUCHn, 5),
923        GPIO5), ((ADC1_CH4, ADCn_CHm, 1, 4), GPIO5), ((TOUCH6, TOUCHn, 6), GPIO6),
924        ((ADC1_CH5, ADCn_CHm, 1, 5), GPIO6), ((TOUCH7, TOUCHn, 7), GPIO7), ((ADC1_CH6,
925        ADCn_CHm, 1, 6), GPIO7), ((TOUCH8, TOUCHn, 8), GPIO8), ((ADC1_CH7, ADCn_CHm, 1,
926        7), GPIO8), ((TOUCH9, TOUCHn, 9), GPIO9), ((ADC1_CH8, ADCn_CHm, 1, 8), GPIO9),
927        ((TOUCH10, TOUCHn, 10), GPIO10), ((ADC1_CH9, ADCn_CHm, 1, 9), GPIO10), ((TOUCH11,
928        TOUCHn, 11), GPIO11), ((ADC2_CH0, ADCn_CHm, 2, 0), GPIO11), ((TOUCH12, TOUCHn,
929        12), GPIO12), ((ADC2_CH1, ADCn_CHm, 2, 1), GPIO12), ((TOUCH13, TOUCHn, 13),
930        GPIO13), ((ADC2_CH2, ADCn_CHm, 2, 2), GPIO13), ((TOUCH14, TOUCHn, 14), GPIO14),
931        ((ADC2_CH3, ADCn_CHm, 2, 3), GPIO14), ((ADC2_CH4, ADCn_CHm, 2, 4), GPIO15),
932        ((ADC2_CH5, ADCn_CHm, 2, 5), GPIO16), ((ADC2_CH6, ADCn_CHm, 2, 6), GPIO17),
933        ((ADC2_CH7, ADCn_CHm, 2, 7), GPIO18), ((ADC2_CH8, ADCn_CHm, 2, 8), GPIO19),
934        ((ADC2_CH9, ADCn_CHm, 2, 9), GPIO20)));
935    };
936}
937/// This macro can be used to generate code for each LP/RTC function of each GPIO.
938///
939/// For an explanation on the general syntax, as well as usage of individual/repeated
940/// matchers, refer to [the crate-level documentation][crate#for_each-macros].
941///
942/// This macro has two options for its "Individual matcher" case:
943///
944/// - `all`: `($signal:ident, $gpio:ident)` - simple case where you only need identifiers
945/// - `all_expanded`: `(($signal:ident, $group:ident $(, $number:literal)+), $gpio:ident)` -
946///   expanded signal case, where you need the number(s) of a signal, or the general group to which
947///   the signal belongs. For example, in case of `SAR_I2C_SCL_1` the expanded form looks like
948///   `(SAR_I2C_SCL_1, SAR_I2C_SCL_n, 1)`.
949///
950/// Macro fragments:
951///
952/// - `$signal`: the name of the signal.
953/// - `$group`: the name of the signal, with numbers replaced by placeholders. For `ADC2_CH3` this
954///   is `ADCn_CHm`.
955/// - `$number`: the numbers extracted from `$signal`.
956/// - `$gpio`: the name of the GPIO.
957///
958/// Example data:
959/// - `(RTC_GPIO15, GPIO12)`
960/// - `((RTC_GPIO15, RTC_GPIOn, 15), GPIO12)`
961///
962/// The expanded syntax is only available when the signal has at least one numbered component.
963#[macro_export]
964#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
965macro_rules! for_each_lp_function {
966    ($($pattern:tt => $code:tt;)*) => {
967        macro_rules! _for_each_inner { $(($pattern) => $code;)* ($other : tt) => {} }
968        _for_each_inner!((RTC_GPIO0, GPIO0)); _for_each_inner!((SAR_I2C_SCL_0, GPIO0));
969        _for_each_inner!((RTC_GPIO1, GPIO1)); _for_each_inner!((SAR_I2C_SDA_0, GPIO1));
970        _for_each_inner!((RTC_GPIO2, GPIO2)); _for_each_inner!((SAR_I2C_SCL_1, GPIO2));
971        _for_each_inner!((RTC_GPIO3, GPIO3)); _for_each_inner!((SAR_I2C_SDA_1, GPIO3));
972        _for_each_inner!((RTC_GPIO4, GPIO4)); _for_each_inner!((RTC_GPIO5, GPIO5));
973        _for_each_inner!((RTC_GPIO6, GPIO6)); _for_each_inner!((RTC_GPIO7, GPIO7));
974        _for_each_inner!((RTC_GPIO8, GPIO8)); _for_each_inner!((RTC_GPIO9, GPIO9));
975        _for_each_inner!((RTC_GPIO10, GPIO10)); _for_each_inner!((RTC_GPIO11, GPIO11));
976        _for_each_inner!((RTC_GPIO12, GPIO12)); _for_each_inner!((RTC_GPIO13, GPIO13));
977        _for_each_inner!((RTC_GPIO14, GPIO14)); _for_each_inner!((RTC_GPIO15, GPIO15));
978        _for_each_inner!((RTC_GPIO16, GPIO16)); _for_each_inner!((RTC_GPIO17, GPIO17));
979        _for_each_inner!((RTC_GPIO18, GPIO18)); _for_each_inner!((RTC_GPIO19, GPIO19));
980        _for_each_inner!((RTC_GPIO20, GPIO20)); _for_each_inner!((RTC_GPIO21, GPIO21));
981        _for_each_inner!(((RTC_GPIO0, RTC_GPIOn, 0), GPIO0));
982        _for_each_inner!(((SAR_I2C_SCL_0, SAR_I2C_SCL_n, 0), GPIO0));
983        _for_each_inner!(((RTC_GPIO1, RTC_GPIOn, 1), GPIO1));
984        _for_each_inner!(((SAR_I2C_SDA_0, SAR_I2C_SDA_n, 0), GPIO1));
985        _for_each_inner!(((RTC_GPIO2, RTC_GPIOn, 2), GPIO2));
986        _for_each_inner!(((SAR_I2C_SCL_1, SAR_I2C_SCL_n, 1), GPIO2));
987        _for_each_inner!(((RTC_GPIO3, RTC_GPIOn, 3), GPIO3));
988        _for_each_inner!(((SAR_I2C_SDA_1, SAR_I2C_SDA_n, 1), GPIO3));
989        _for_each_inner!(((RTC_GPIO4, RTC_GPIOn, 4), GPIO4));
990        _for_each_inner!(((RTC_GPIO5, RTC_GPIOn, 5), GPIO5));
991        _for_each_inner!(((RTC_GPIO6, RTC_GPIOn, 6), GPIO6));
992        _for_each_inner!(((RTC_GPIO7, RTC_GPIOn, 7), GPIO7));
993        _for_each_inner!(((RTC_GPIO8, RTC_GPIOn, 8), GPIO8));
994        _for_each_inner!(((RTC_GPIO9, RTC_GPIOn, 9), GPIO9));
995        _for_each_inner!(((RTC_GPIO10, RTC_GPIOn, 10), GPIO10));
996        _for_each_inner!(((RTC_GPIO11, RTC_GPIOn, 11), GPIO11));
997        _for_each_inner!(((RTC_GPIO12, RTC_GPIOn, 12), GPIO12));
998        _for_each_inner!(((RTC_GPIO13, RTC_GPIOn, 13), GPIO13));
999        _for_each_inner!(((RTC_GPIO14, RTC_GPIOn, 14), GPIO14));
1000        _for_each_inner!(((RTC_GPIO15, RTC_GPIOn, 15), GPIO15));
1001        _for_each_inner!(((RTC_GPIO16, RTC_GPIOn, 16), GPIO16));
1002        _for_each_inner!(((RTC_GPIO17, RTC_GPIOn, 17), GPIO17));
1003        _for_each_inner!(((RTC_GPIO18, RTC_GPIOn, 18), GPIO18));
1004        _for_each_inner!(((RTC_GPIO19, RTC_GPIOn, 19), GPIO19));
1005        _for_each_inner!(((RTC_GPIO20, RTC_GPIOn, 20), GPIO20));
1006        _for_each_inner!(((RTC_GPIO21, RTC_GPIOn, 21), GPIO21));
1007        _for_each_inner!((all(RTC_GPIO0, GPIO0), (SAR_I2C_SCL_0, GPIO0), (RTC_GPIO1,
1008        GPIO1), (SAR_I2C_SDA_0, GPIO1), (RTC_GPIO2, GPIO2), (SAR_I2C_SCL_1, GPIO2),
1009        (RTC_GPIO3, GPIO3), (SAR_I2C_SDA_1, GPIO3), (RTC_GPIO4, GPIO4), (RTC_GPIO5,
1010        GPIO5), (RTC_GPIO6, GPIO6), (RTC_GPIO7, GPIO7), (RTC_GPIO8, GPIO8), (RTC_GPIO9,
1011        GPIO9), (RTC_GPIO10, GPIO10), (RTC_GPIO11, GPIO11), (RTC_GPIO12, GPIO12),
1012        (RTC_GPIO13, GPIO13), (RTC_GPIO14, GPIO14), (RTC_GPIO15, GPIO15), (RTC_GPIO16,
1013        GPIO16), (RTC_GPIO17, GPIO17), (RTC_GPIO18, GPIO18), (RTC_GPIO19, GPIO19),
1014        (RTC_GPIO20, GPIO20), (RTC_GPIO21, GPIO21)));
1015        _for_each_inner!((all_expanded((RTC_GPIO0, RTC_GPIOn, 0), GPIO0),
1016        ((SAR_I2C_SCL_0, SAR_I2C_SCL_n, 0), GPIO0), ((RTC_GPIO1, RTC_GPIOn, 1), GPIO1),
1017        ((SAR_I2C_SDA_0, SAR_I2C_SDA_n, 0), GPIO1), ((RTC_GPIO2, RTC_GPIOn, 2), GPIO2),
1018        ((SAR_I2C_SCL_1, SAR_I2C_SCL_n, 1), GPIO2), ((RTC_GPIO3, RTC_GPIOn, 3), GPIO3),
1019        ((SAR_I2C_SDA_1, SAR_I2C_SDA_n, 1), GPIO3), ((RTC_GPIO4, RTC_GPIOn, 4), GPIO4),
1020        ((RTC_GPIO5, RTC_GPIOn, 5), GPIO5), ((RTC_GPIO6, RTC_GPIOn, 6), GPIO6),
1021        ((RTC_GPIO7, RTC_GPIOn, 7), GPIO7), ((RTC_GPIO8, RTC_GPIOn, 8), GPIO8),
1022        ((RTC_GPIO9, RTC_GPIOn, 9), GPIO9), ((RTC_GPIO10, RTC_GPIOn, 10), GPIO10),
1023        ((RTC_GPIO11, RTC_GPIOn, 11), GPIO11), ((RTC_GPIO12, RTC_GPIOn, 12), GPIO12),
1024        ((RTC_GPIO13, RTC_GPIOn, 13), GPIO13), ((RTC_GPIO14, RTC_GPIOn, 14), GPIO14),
1025        ((RTC_GPIO15, RTC_GPIOn, 15), GPIO15), ((RTC_GPIO16, RTC_GPIOn, 16), GPIO16),
1026        ((RTC_GPIO17, RTC_GPIOn, 17), GPIO17), ((RTC_GPIO18, RTC_GPIOn, 18), GPIO18),
1027        ((RTC_GPIO19, RTC_GPIOn, 19), GPIO19), ((RTC_GPIO20, RTC_GPIOn, 20), GPIO20),
1028        ((RTC_GPIO21, RTC_GPIOn, 21), GPIO21)));
1029    };
1030}
1031/// Defines the `InputSignal` and `OutputSignal` enums.
1032///
1033/// This macro is intended to be called in esp-hal only.
1034#[macro_export]
1035#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
1036macro_rules! define_io_mux_signals {
1037    () => {
1038        #[allow(non_camel_case_types, clippy::upper_case_acronyms)]
1039        #[derive(Debug, PartialEq, Copy, Clone)]
1040        #[cfg_attr(feature = "defmt", derive(defmt::Format))]
1041        #[doc(hidden)]
1042        pub enum InputSignal {
1043            SPIQ                    = 0,
1044            SPID                    = 1,
1045            SPIHD                   = 2,
1046            SPIWP                   = 3,
1047            SPID4                   = 7,
1048            SPID5                   = 8,
1049            SPID6                   = 9,
1050            SPID7                   = 10,
1051            SPIDQS                  = 11,
1052            U0RXD                   = 12,
1053            U0CTS                   = 13,
1054            U0DSR                   = 14,
1055            U1RXD                   = 15,
1056            U1CTS                   = 16,
1057            U1DSR                   = 17,
1058            U2RXD                   = 18,
1059            U2CTS                   = 19,
1060            U2DSR                   = 20,
1061            I2S1_MCLK               = 21,
1062            I2S0O_BCK               = 22,
1063            I2S0_MCLK               = 23,
1064            I2S0O_WS                = 24,
1065            I2S0I_SD                = 25,
1066            I2S0I_BCK               = 26,
1067            I2S0I_WS                = 27,
1068            I2S1O_BCK               = 28,
1069            I2S1O_WS                = 29,
1070            I2S1I_SD                = 30,
1071            I2S1I_BCK               = 31,
1072            I2S1I_WS                = 32,
1073            PCNT0_SIG_CH0           = 33,
1074            PCNT0_SIG_CH1           = 34,
1075            PCNT0_CTRL_CH0          = 35,
1076            PCNT0_CTRL_CH1          = 36,
1077            PCNT1_SIG_CH0           = 37,
1078            PCNT1_SIG_CH1           = 38,
1079            PCNT1_CTRL_CH0          = 39,
1080            PCNT1_CTRL_CH1          = 40,
1081            PCNT2_SIG_CH0           = 41,
1082            PCNT2_SIG_CH1           = 42,
1083            PCNT2_CTRL_CH0          = 43,
1084            PCNT2_CTRL_CH1          = 44,
1085            PCNT3_SIG_CH0           = 45,
1086            PCNT3_SIG_CH1           = 46,
1087            PCNT3_CTRL_CH0          = 47,
1088            PCNT3_CTRL_CH1          = 48,
1089            I2S0I_SD1               = 51,
1090            I2S0I_SD2               = 52,
1091            I2S0I_SD3               = 53,
1092            USB_EXTPHY_VP           = 55,
1093            USB_EXTPHY_VM           = 56,
1094            USB_EXTPHY_RCV          = 57,
1095            USB_OTG_IDDIG           = 58,
1096            USB_OTG_AVALID          = 59,
1097            USB_SRP_BVALID          = 60,
1098            USB_OTG_VBUSVALID       = 61,
1099            USB_SRP_SESSEND         = 62,
1100            SPI3_CLK                = 66,
1101            SPI3_Q                  = 67,
1102            SPI3_D                  = 68,
1103            SPI3_HD                 = 69,
1104            SPI3_WP                 = 70,
1105            SPI3_CS0                = 71,
1106            RMT_SIG_0               = 81,
1107            RMT_SIG_1               = 82,
1108            RMT_SIG_2               = 83,
1109            RMT_SIG_3               = 84,
1110            I2CEXT0_SCL             = 89,
1111            I2CEXT0_SDA             = 90,
1112            I2CEXT1_SCL             = 91,
1113            I2CEXT1_SDA             = 92,
1114            FSPICLK                 = 101,
1115            FSPIQ                   = 102,
1116            FSPID                   = 103,
1117            FSPIHD                  = 104,
1118            FSPIWP                  = 105,
1119            FSPIIO4                 = 106,
1120            FSPIIO5                 = 107,
1121            FSPIIO6                 = 108,
1122            FSPIIO7                 = 109,
1123            FSPICS0                 = 110,
1124            TWAI_RX                 = 116,
1125            SUBSPIQ                 = 120,
1126            SUBSPID                 = 121,
1127            SUBSPIHD                = 122,
1128            SUBSPIWP                = 123,
1129            CAM_DATA_0              = 133,
1130            CAM_DATA_1              = 134,
1131            CAM_DATA_2              = 135,
1132            CAM_DATA_3              = 136,
1133            CAM_DATA_4              = 137,
1134            CAM_DATA_5              = 138,
1135            CAM_DATA_6              = 139,
1136            CAM_DATA_7              = 140,
1137            CAM_DATA_8              = 141,
1138            CAM_DATA_9              = 142,
1139            CAM_DATA_10             = 143,
1140            CAM_DATA_11             = 144,
1141            CAM_DATA_12             = 145,
1142            CAM_DATA_13             = 146,
1143            CAM_DATA_14             = 147,
1144            CAM_DATA_15             = 148,
1145            CAM_PCLK                = 149,
1146            CAM_H_ENABLE            = 150,
1147            CAM_H_SYNC              = 151,
1148            CAM_V_SYNC              = 152,
1149            SUBSPID4                = 155,
1150            SUBSPID5                = 156,
1151            SUBSPID6                = 157,
1152            SUBSPID7                = 158,
1153            SUBSPIDQS               = 159,
1154            PWM0_SYNC0              = 160,
1155            PWM0_SYNC1              = 161,
1156            PWM0_SYNC2              = 162,
1157            PWM0_F0                 = 163,
1158            PWM0_F1                 = 164,
1159            PWM0_F2                 = 165,
1160            PWM0_CAP0               = 166,
1161            PWM0_CAP1               = 167,
1162            PWM0_CAP2               = 168,
1163            PWM1_SYNC0              = 169,
1164            PWM1_SYNC1              = 170,
1165            PWM1_SYNC2              = 171,
1166            PWM1_F0                 = 172,
1167            PWM1_F1                 = 173,
1168            PWM1_F2                 = 174,
1169            PWM1_CAP0               = 175,
1170            PWM1_CAP1               = 176,
1171            PWM1_CAP2               = 177,
1172            SDHOST_CCMD_IN_1        = 178,
1173            SDHOST_CCMD_IN_2        = 179,
1174            SDHOST_CDATA_IN_10      = 180,
1175            SDHOST_CDATA_IN_11      = 181,
1176            SDHOST_CDATA_IN_12      = 182,
1177            SDHOST_CDATA_IN_13      = 183,
1178            SDHOST_CDATA_IN_14      = 184,
1179            SDHOST_CDATA_IN_15      = 185,
1180            SDHOST_CDATA_IN_16      = 186,
1181            SDHOST_CDATA_IN_17      = 187,
1182            SDHOST_DATA_STROBE_1    = 192,
1183            SDHOST_DATA_STROBE_2    = 193,
1184            SDHOST_CARD_DETECT_N_1  = 194,
1185            SDHOST_CARD_DETECT_N_2  = 195,
1186            SDHOST_CARD_WRITE_PRT_1 = 196,
1187            SDHOST_CARD_WRITE_PRT_2 = 197,
1188            SDHOST_CARD_INT_N_1     = 198,
1189            SDHOST_CARD_INT_N_2     = 199,
1190            SDHOST_CDATA_IN_20      = 213,
1191            SDHOST_CDATA_IN_21      = 214,
1192            SDHOST_CDATA_IN_22      = 215,
1193            SDHOST_CDATA_IN_23      = 216,
1194            SDHOST_CDATA_IN_24      = 217,
1195            SDHOST_CDATA_IN_25      = 218,
1196            SDHOST_CDATA_IN_26      = 219,
1197            SDHOST_CDATA_IN_27      = 220,
1198            PRO_ALONEGPIO_IN0       = 221,
1199            PRO_ALONEGPIO_IN1       = 222,
1200            PRO_ALONEGPIO_IN2       = 223,
1201            PRO_ALONEGPIO_IN3       = 224,
1202            PRO_ALONEGPIO_IN4       = 225,
1203            PRO_ALONEGPIO_IN5       = 226,
1204            PRO_ALONEGPIO_IN6       = 227,
1205            PRO_ALONEGPIO_IN7       = 228,
1206            USB_JTAG_TDO_BRIDGE     = 251,
1207            CORE1_GPIO_IN3          = 252,
1208            CORE1_GPIO_IN4          = 253,
1209            CORE1_GPIO_IN5          = 254,
1210            CORE1_GPIO_IN6          = 255,
1211            SPIIO4,
1212            SPIIO5,
1213            SPIIO6,
1214            SPIIO7,
1215            MTDI,
1216            MTCK,
1217            MTMS,
1218        }
1219        #[allow(non_camel_case_types, clippy::upper_case_acronyms)]
1220        #[derive(Debug, PartialEq, Copy, Clone)]
1221        #[cfg_attr(feature = "defmt", derive(defmt::Format))]
1222        #[doc(hidden)]
1223        pub enum OutputSignal {
1224            SPIQ                       = 0,
1225            SPID                       = 1,
1226            SPIHD                      = 2,
1227            SPIWP                      = 3,
1228            SPICLK                     = 4,
1229            SPICS0                     = 5,
1230            SPICS1                     = 6,
1231            SPID4                      = 7,
1232            SPID5                      = 8,
1233            SPID6                      = 9,
1234            SPID7                      = 10,
1235            SPIDQS                     = 11,
1236            U0TXD                      = 12,
1237            U0RTS                      = 13,
1238            U0DTR                      = 14,
1239            U1TXD                      = 15,
1240            U1RTS                      = 16,
1241            U1DTR                      = 17,
1242            U2TXD                      = 18,
1243            U2RTS                      = 19,
1244            U2DTR                      = 20,
1245            I2S1_MCLK                  = 21,
1246            I2S0O_BCK                  = 22,
1247            I2S0_MCLK                  = 23,
1248            I2S0O_WS                   = 24,
1249            I2S0O_SD                   = 25,
1250            I2S0I_BCK                  = 26,
1251            I2S0I_WS                   = 27,
1252            I2S1O_BCK                  = 28,
1253            I2S1O_WS                   = 29,
1254            I2S1O_SD                   = 30,
1255            I2S1I_BCK                  = 31,
1256            I2S1I_WS                   = 32,
1257            USB_EXTPHY_OEN             = 55,
1258            USB_EXTPHY_VPO             = 57,
1259            USB_EXTPHY_VMO             = 58,
1260            SPI3_CLK                   = 66,
1261            SPI3_Q                     = 67,
1262            SPI3_D                     = 68,
1263            SPI3_HD                    = 69,
1264            SPI3_WP                    = 70,
1265            SPI3_CS0                   = 71,
1266            SPI3_CS1                   = 72,
1267            LEDC_LS_SIG0               = 73,
1268            LEDC_LS_SIG1               = 74,
1269            LEDC_LS_SIG2               = 75,
1270            LEDC_LS_SIG3               = 76,
1271            LEDC_LS_SIG4               = 77,
1272            LEDC_LS_SIG5               = 78,
1273            LEDC_LS_SIG6               = 79,
1274            LEDC_LS_SIG7               = 80,
1275            RMT_SIG_0                  = 81,
1276            RMT_SIG_1                  = 82,
1277            RMT_SIG_2                  = 83,
1278            RMT_SIG_3                  = 84,
1279            I2CEXT0_SCL                = 89,
1280            I2CEXT0_SDA                = 90,
1281            I2CEXT1_SCL                = 91,
1282            I2CEXT1_SDA                = 92,
1283            GPIO_SD0                   = 93,
1284            GPIO_SD1                   = 94,
1285            GPIO_SD2                   = 95,
1286            GPIO_SD3                   = 96,
1287            GPIO_SD4                   = 97,
1288            GPIO_SD5                   = 98,
1289            GPIO_SD6                   = 99,
1290            GPIO_SD7                   = 100,
1291            FSPICLK                    = 101,
1292            FSPIQ                      = 102,
1293            FSPID                      = 103,
1294            FSPIHD                     = 104,
1295            FSPIWP                     = 105,
1296            FSPIIO4                    = 106,
1297            FSPIIO5                    = 107,
1298            FSPIIO6                    = 108,
1299            FSPIIO7                    = 109,
1300            FSPICS0                    = 110,
1301            FSPICS1                    = 111,
1302            FSPICS2                    = 112,
1303            FSPICS3                    = 113,
1304            FSPICS4                    = 114,
1305            FSPICS5                    = 115,
1306            TWAI_TX                    = 116,
1307            SUBSPICLK                  = 119,
1308            SUBSPIQ                    = 120,
1309            SUBSPID                    = 121,
1310            SUBSPIHD                   = 122,
1311            SUBSPIWP                   = 123,
1312            SUBSPICS0                  = 124,
1313            SUBSPICS1                  = 125,
1314            FSPIDQS                    = 126,
1315            SPI3_CS2                   = 127,
1316            I2S0O_SD1                  = 128,
1317            LCD_CS                     = 132,
1318            LCD_DATA_0                 = 133,
1319            LCD_DATA_1                 = 134,
1320            LCD_DATA_2                 = 135,
1321            LCD_DATA_3                 = 136,
1322            LCD_DATA_4                 = 137,
1323            LCD_DATA_5                 = 138,
1324            LCD_DATA_6                 = 139,
1325            LCD_DATA_7                 = 140,
1326            LCD_DATA_8                 = 141,
1327            LCD_DATA_9                 = 142,
1328            LCD_DATA_10                = 143,
1329            LCD_DATA_11                = 144,
1330            LCD_DATA_12                = 145,
1331            LCD_DATA_13                = 146,
1332            LCD_DATA_14                = 147,
1333            LCD_DATA_15                = 148,
1334            CAM_CLK                    = 149,
1335            LCD_H_ENABLE               = 150,
1336            LCD_H_SYNC                 = 151,
1337            LCD_V_SYNC                 = 152,
1338            LCD_DC                     = 153,
1339            LCD_PCLK                   = 154,
1340            SUBSPID4                   = 155,
1341            SUBSPID5                   = 156,
1342            SUBSPID6                   = 157,
1343            SUBSPID7                   = 158,
1344            SUBSPIDQS                  = 159,
1345            PWM0_0A                    = 160,
1346            PWM0_0B                    = 161,
1347            PWM0_1A                    = 162,
1348            PWM0_1B                    = 163,
1349            PWM0_2A                    = 164,
1350            PWM0_2B                    = 165,
1351            PWM1_0A                    = 166,
1352            PWM1_0B                    = 167,
1353            PWM1_1A                    = 168,
1354            PWM1_1B                    = 169,
1355            PWM1_2A                    = 170,
1356            PWM1_2B                    = 171,
1357            SDHOST_CCLK_OUT_1          = 172,
1358            SDHOST_CCLK_OUT_2          = 173,
1359            SDHOST_RST_N_1             = 174,
1360            SDHOST_RST_N_2             = 175,
1361            SDHOST_CCMD_OD_PULLUP_EN_N = 176,
1362            SDIO_TOHOST_INT            = 177,
1363            SDHOST_CCMD_OUT_1          = 178,
1364            SDHOST_CCMD_OUT_2          = 179,
1365            SDHOST_CDATA_OUT_10        = 180,
1366            SDHOST_CDATA_OUT_11        = 181,
1367            SDHOST_CDATA_OUT_12        = 182,
1368            SDHOST_CDATA_OUT_13        = 183,
1369            SDHOST_CDATA_OUT_14        = 184,
1370            SDHOST_CDATA_OUT_15        = 185,
1371            SDHOST_CDATA_OUT_16        = 186,
1372            SDHOST_CDATA_OUT_17        = 187,
1373            SDHOST_CDATA_OUT_20        = 213,
1374            SDHOST_CDATA_OUT_21        = 214,
1375            SDHOST_CDATA_OUT_22        = 215,
1376            SDHOST_CDATA_OUT_23        = 216,
1377            SDHOST_CDATA_OUT_24        = 217,
1378            SDHOST_CDATA_OUT_25        = 218,
1379            SDHOST_CDATA_OUT_26        = 219,
1380            SDHOST_CDATA_OUT_27        = 220,
1381            PRO_ALONEGPIO_OUT0         = 221,
1382            PRO_ALONEGPIO_OUT1         = 222,
1383            PRO_ALONEGPIO_OUT2         = 223,
1384            PRO_ALONEGPIO_OUT3         = 224,
1385            PRO_ALONEGPIO_OUT4         = 225,
1386            PRO_ALONEGPIO_OUT5         = 226,
1387            PRO_ALONEGPIO_OUT6         = 227,
1388            PRO_ALONEGPIO_OUT7         = 228,
1389            USB_JTAG_TRST              = 251,
1390            CORE1_GPIO_OUT3            = 252,
1391            CORE1_GPIO_OUT4            = 253,
1392            CORE1_GPIO_OUT5            = 254,
1393            CORE1_GPIO_OUT6            = 255,
1394            GPIO                       = 256,
1395            SPIIO4,
1396            SPIIO5,
1397            SPIIO6,
1398            SPIIO7,
1399            CLK_OUT1,
1400            CLK_OUT2,
1401            CLK_OUT3,
1402            SPICLK_P_DIFF,
1403            SPICLK_N_DIFF,
1404            SUBSPICLK_P_DIFF,
1405            SUBSPICLK_N_DIFF,
1406            MTDO,
1407        }
1408    };
1409}
1410/// Defines and implements the `io_mux_reg` function.
1411///
1412/// The generated function has the following signature:
1413///
1414/// ```rust,ignore
1415/// pub(crate) fn io_mux_reg(gpio_num: u8) -> &'static crate::pac::io_mux::GPIO0 {
1416///     // ...
1417/// # unimplemented!()
1418/// }
1419/// ```
1420///
1421/// This macro is intended to be called in esp-hal only.
1422#[macro_export]
1423#[expect(clippy::crate_in_macro_def)]
1424#[cfg_attr(docsrs, doc(cfg(feature = "_device-selected")))]
1425macro_rules! define_io_mux_reg {
1426    () => {
1427        pub(crate) fn io_mux_reg(gpio_num: u8) -> &'static crate::pac::io_mux::GPIO {
1428            crate::peripherals::IO_MUX::regs().gpio(gpio_num as usize)
1429        }
1430    };
1431}