lpc55s6x_hal/drivers/
pins.rs

1use crate::{
2    peripherals::{
3        gpio::Gpio,
4        iocon::Iocon,
5        flexcomm,
6    },
7    typestates::{
8        init_state,
9        pin::{
10            function,
11            state::{
12                self,
13                Special,
14            },
15            // All the I2cSclPin etc. are here
16            flexcomm as fc,
17            flexcomm::ChipSelect,
18        },
19    },
20};
21
22pub use crate::typestates::pin::gpio::{
23    direction,
24    Level,
25};
26
27// Implements GPIO pins
28pub mod gpio;
29
30pub use crate::typestates::pin::{
31    PinId,
32    PinType,
33};
34
35use crate::typestates::reg_proxy::RegClusterProxy;
36
37
38/// Main API to control for controlling pins:w
39pub struct Pin<T: PinId, S: state::PinState> {
40    pub(crate) id: T,
41    #[allow(dead_code)]
42    pub(crate) state: S,
43}
44
45impl Pin<Pio0_22, state::Unused> {
46    pub fn into_usb0_vbus_pin(
47        self,
48        iocon: &mut Iocon<init_state::Enabled>,
49    ) -> Pin<Pio0_22, state::Special<function::USB0_VBUS>> {
50        iocon.raw.pio0_22.modify(|_, w|
51            w
52            .func().alt7() // FUNC7, pin configured as USB0_VBUS
53            .mode().inactive() // MODE_INACT, no additional pin function
54            .slew().standard() // SLEW_STANDARD, standard mode, slew rate control is enabled
55            .invert().disabled() // INV_DI, input function is not inverted
56            .digimode().digital() // DIGITAL_EN, enable digital fucntion
57            .od().normal() // OPENDRAIN_DI, open drain is disabled
58        );
59
60        Pin {
61            id: self.id,
62            state: state::Special {
63                _function: function::USB0_VBUS,
64            },
65        }
66    }
67}
68
69
70// seems a bit inefficient, but want to be able to safely
71// take individual pins instead of the whole bunch
72static mut PIN_TAKEN: [[bool; 32]; 2] = [[false; 32]; 2];
73
74macro_rules! pins {
75    ($(
76        $field:ident,
77        $pin:ident,
78        $port:expr,
79        $number:expr,
80        $type:expr,
81        $default_state_ty:ty,
82        $default_state_val:expr;
83    )*) => {
84        /// Provides access to all pins
85        #[allow(missing_docs)]
86        pub struct Pins {
87            $(pub $field: Pin<$pin, $default_state_ty>,)*
88        }
89
90        impl Pins {
91
92            fn any_taken() -> bool {
93                unsafe {
94                    let any_port_0 = PIN_TAKEN[0].iter().any(|x| *x);
95                    let any_port_1 = PIN_TAKEN[1].iter().any(|x| *x);
96                    any_port_0 || any_port_1
97                }
98            }
99
100            fn set_all_taken() {
101                unsafe {
102                    for entry in PIN_TAKEN[0].iter_mut() { *entry = true; }
103                    for entry in PIN_TAKEN[1].iter_mut() { *entry = true; }
104                }
105            }
106
107            fn set_all_released() {
108                unsafe {
109                    for entry in PIN_TAKEN[0].iter_mut() { *entry = false; }
110                    for entry in PIN_TAKEN[1].iter_mut() { *entry = false; }
111                }
112            }
113
114            pub fn take() -> Option<Self> {
115                if Self::any_taken() {
116                    None
117                } else {
118                    Some(unsafe {
119                        Self::set_all_taken();
120                        Self::steal()
121                    } )
122                }
123            }
124
125            pub fn release(self) {
126                Self::set_all_released();
127            }
128
129            pub unsafe fn steal() -> Self {
130                Self {
131                    $(
132                        $field: $pin::steal(),
133                    )*
134                }
135            }
136        }
137
138
139        $(
140            /// Identifies a specific pin
141            ///
142            /// Pins can be `take`n individually, or en bloc via `Pins`.
143            #[allow(non_camel_case_types)]
144            pub struct $pin(());
145
146            impl Pin<$pin, state::Unused>  {
147                /// Transition pin to GPIO state
148                pub fn into_gpio_pin(
149                    self,
150                    iocon: &mut Iocon<init_state::Enabled>,
151                    _: &mut Gpio<init_state::Enabled>,
152                ) -> Pin<$pin, state::Gpio<direction::Unknown>> {
153                    // TODO: need to set FUNC to 0 at minimum
154                    iocon.raw.$field.modify(|_, w| w
155                        .func().alt0() // FUNC $i, pin configured as $FUNCTION
156                        .mode().inactive() // MODE_INACT, no additional pin function
157                        .slew().standard() // SLEW_STANDARD, standard mode, slew rate control is enabled
158                        .invert().disabled() // INV_DI, input function is not inverted
159                        .digimode().digital() // DIGITAL_EN, enable digital fucntion
160                        .od().normal() // OPENDRAIN_DI, open drain is disabled
161                    );
162                    Pin {
163                        id: self.id,
164                        state: state::Gpio {
165                            dirset: RegClusterProxy::new(),
166                            pin: RegClusterProxy::new(),
167                            set: RegClusterProxy::new(),
168                            clr: RegClusterProxy::new(),
169
170                            _direction: direction::Unknown,
171                        },
172                    }
173                }
174            }
175
176            impl $pin {
177                pub fn take() -> Option<Pin<Self, $default_state_ty>> {
178                    if unsafe { PIN_TAKEN[$port][$number] } {
179                        None
180                    } else {
181                        Some(unsafe {
182                            Self::steal()
183                        } )
184                    }
185                }
186
187                pub fn release(self) {
188                    unsafe { PIN_TAKEN[$port][$number] = false; }
189                }
190
191                pub unsafe fn steal() -> Pin<Self, $default_state_ty> {
192                    PIN_TAKEN[$port][$number] = true;
193                    Pin {
194                        id: Self(()),
195                        state: $default_state_val,
196                    }
197                }
198            }
199
200            impl PinId for $pin {
201                const PORT: usize = $port;
202                const NUMBER: u8    = $number;
203                const MASK: u32   = 0x1 << $number;
204                const TYPE: PinType = $type;
205            }
206        )*
207    }
208}
209
210pins!(
211    pio0_0 , Pio0_0 , 0,  0, PinType::A, state::Unused, state::Unused;
212    pio0_1 , Pio0_1 , 0,  1, PinType::D, state::Unused, state::Unused;
213    pio0_2 , Pio0_2 , 0,  2, PinType::D, state::Unused, state::Unused;
214    pio0_3 , Pio0_3 , 0,  3, PinType::D, state::Unused, state::Unused;
215    pio0_4 , Pio0_4 , 0,  4, PinType::D, state::Unused, state::Unused;
216    pio0_5 , Pio0_5 , 0,  5, PinType::D, state::Unused, state::Unused;
217    pio0_6 , Pio0_6 , 0,  6, PinType::D, state::Unused, state::Unused;
218    pio0_7 , Pio0_7 , 0,  7, PinType::D, state::Unused, state::Unused;
219    pio0_8 , Pio0_8 , 0,  8, PinType::D, state::Unused, state::Unused;
220    pio0_9 , Pio0_9 , 0,  9, PinType::A, state::Unused, state::Unused;
221    pio0_10, Pio0_10, 0, 10, PinType::A, state::Unused, state::Unused;
222    pio0_11, Pio0_11, 0, 11, PinType::A, state::Special<function::SWCLK>,
223        state::Special{ _function: function::SWCLK {} };
224    pio0_12, Pio0_12, 0, 12, PinType::A, state::Special<function::SWDIO>,
225        state::Special{ _function: function::SWDIO {} };
226    pio0_13, Pio0_13, 0, 13, PinType::I, state::Unused, state::Unused;
227    pio0_14, Pio0_14, 0, 14, PinType::I, state::Unused, state::Unused;
228    pio0_15, Pio0_15, 0, 15, PinType::A, state::Unused, state::Unused;
229    pio0_16, Pio0_16, 0, 16, PinType::A, state::Unused, state::Unused;
230    pio0_17, Pio0_17, 0, 17, PinType::D, state::Unused, state::Unused;
231    pio0_18, Pio0_18, 0, 18, PinType::A, state::Unused, state::Unused;
232    pio0_19, Pio0_19, 0, 19, PinType::D, state::Unused, state::Unused;
233    pio0_20, Pio0_20, 0, 20, PinType::D, state::Unused, state::Unused;
234    pio0_21, Pio0_21, 0, 21, PinType::D, state::Unused, state::Unused;
235    pio0_22, Pio0_22, 0, 22, PinType::D, state::Unused, state::Unused;
236    pio0_23, Pio0_23, 0, 23, PinType::A, state::Unused, state::Unused;
237    pio0_24, Pio0_24, 0, 24, PinType::D, state::Unused, state::Unused;
238    pio0_25, Pio0_25, 0, 25, PinType::D, state::Unused, state::Unused;
239    pio0_26, Pio0_26, 0, 26, PinType::D, state::Unused, state::Unused;
240    pio0_27, Pio0_27, 0, 27, PinType::D, state::Unused, state::Unused;
241    pio0_28, Pio0_28, 0, 28, PinType::D, state::Unused, state::Unused;
242    pio0_29, Pio0_29, 0, 29, PinType::D, state::Unused, state::Unused;
243    pio0_30, Pio0_30, 0, 30, PinType::D, state::Unused, state::Unused;
244    pio0_31, Pio0_31, 0, 31, PinType::A, state::Unused, state::Unused;
245
246    pio1_0 , Pio1_0 , 1,  0, PinType::A, state::Unused, state::Unused;
247    pio1_1 , Pio1_1 , 1,  1, PinType::D, state::Unused, state::Unused;
248    pio1_2 , Pio1_2 , 1,  2, PinType::D, state::Unused, state::Unused;
249    pio1_3 , Pio1_3 , 1,  3, PinType::D, state::Unused, state::Unused;
250    pio1_4 , Pio1_4 , 1,  4, PinType::D, state::Unused, state::Unused;
251    pio1_5 , Pio1_5 , 1,  5, PinType::D, state::Unused, state::Unused;
252    pio1_6 , Pio1_6 , 1,  6, PinType::D, state::Unused, state::Unused;
253    pio1_7 , Pio1_7 , 1,  7, PinType::D, state::Unused, state::Unused;
254    pio1_8 , Pio1_8 , 1,  8, PinType::A, state::Unused, state::Unused;
255    pio1_9 , Pio1_9 , 1,  9, PinType::A, state::Unused, state::Unused;
256    pio1_10, Pio1_10, 1, 10, PinType::D, state::Unused, state::Unused;
257    pio1_11, Pio1_11, 1, 11, PinType::D, state::Unused, state::Unused;
258    pio1_12, Pio1_12, 1, 12, PinType::D, state::Unused, state::Unused;
259    pio1_13, Pio1_13, 1, 13, PinType::D, state::Unused, state::Unused;
260    pio1_14, Pio1_14, 1, 14, PinType::A, state::Unused, state::Unused;
261    pio1_15, Pio1_15, 1, 15, PinType::D, state::Unused, state::Unused;
262    pio1_16, Pio1_16, 1, 16, PinType::D, state::Unused, state::Unused;
263    pio1_17, Pio1_17, 1, 17, PinType::D, state::Unused, state::Unused;
264    pio1_18, Pio1_18, 1, 18, PinType::D, state::Unused, state::Unused;
265    pio1_19, Pio1_19, 1, 19, PinType::A, state::Unused, state::Unused;
266    pio1_20, Pio1_20, 1, 20, PinType::D, state::Unused, state::Unused;
267    pio1_21, Pio1_21, 1, 21, PinType::D, state::Unused, state::Unused;
268    pio1_22, Pio1_22, 1, 22, PinType::D, state::Unused, state::Unused;
269    pio1_23, Pio1_23, 1, 23, PinType::D, state::Unused, state::Unused;
270    pio1_24, Pio1_24, 1, 24, PinType::D, state::Unused, state::Unused;
271    pio1_25, Pio1_25, 1, 25, PinType::D, state::Unused, state::Unused;
272    pio1_26, Pio1_26, 1, 26, PinType::D, state::Unused, state::Unused;
273    pio1_27, Pio1_27, 1, 27, PinType::D, state::Unused, state::Unused;
274    pio1_28, Pio1_28, 1, 28, PinType::D, state::Unused, state::Unused;
275    pio1_29, Pio1_29, 1, 29, PinType::D, state::Unused, state::Unused;
276    pio1_30, Pio1_30, 1, 30, PinType::D, state::Unused, state::Unused;
277    pio1_31, Pio1_31, 1, 31, PinType::D, state::Unused, state::Unused;
278);
279
280
281macro_rules! special_pins {
282    ($(
283        ($Pin:ty,$pin:ident): {
284            $(
285                ($alt_func:expr, $SPECIAL_FUNCTION:ident): [
286                    $(
287                        ($method:ident,$Peripheral:ty,$Marker:ident),
288                    )*
289                ]
290            )+
291    })*) => {
292
293    $($($(
294        impl Pin<$Pin, state::Unused> {
295            pub fn $method(
296                self,
297                iocon: &mut Iocon<init_state::Enabled>,
298            ) ->Pin<$Pin, state::Special<function::$SPECIAL_FUNCTION>> {
299                // unfortunately, data sheet has more FUNCs than SVD has alts
300                // otherwise, it would be safe
301                iocon.raw.$pin.modify(|_, w| unsafe {
302                    w
303                    .func().bits($alt_func) // FUNC $i, pin configured as $FUNCTION
304                    .mode().inactive() // MODE_INACT, no additional pin function
305                    .slew().standard() // SLEW_STANDARD, standard mode, slew rate control is enabled
306                    .invert().disabled() // INV_DI, input function is not inverted
307                    .digimode().digital() // DIGITAL_EN, enable digital function
308                    .od().normal() // OPENDRAIN_DI, open drain is disabled
309                });
310
311                Pin {
312                    id: self.id,
313                    state: Special {
314                        _function: function::$SPECIAL_FUNCTION {},
315
316                    },
317                }
318            }
319        }
320    )*)+)*
321    }
322}
323
324///////////////////////////////////////////////////////////////////////////////
325// all that follows is generated with `scripts/extract-flexcomm-data.py`
326// NB: Pio0_13 and Pio0_14 have a repetition of methods, manually commented out
327// Note also that these two are precisely the specialized I2C pins.
328///////////////////////////////////////////////////////////////////////////////
329
330// TODO: remove the $Marker argument
331
332special_pins! {
333    (Pio0_0, pio0_0): {
334        (2, FC3_SCK): [
335            (into_usart3_sclk_pin, Usart3, UsartSclkPin),
336        ]
337    }
338    (Pio0_1, pio0_1): {
339        (2, FC3_CTS_SDA_SSEL0): [
340            (into_usart3_cts_pin, Usart3, UsartCtsPin),
341            (into_i2c3_sda_pin, I2c3, I2cSdaPin),
342            (into_spi3_cs_pin, Spi3, SpiCsPin),
343        ]
344    }
345    (Pio0_2, pio0_2): {
346        (1, FC3_TXD_SCL_MISO_WS): [
347            (into_usart3_tx_pin, Usart3, UsartTxPin),
348            (into_i2c3_scl_pin, I2c3, I2cSclPin),
349            (into_spi3_miso_pin, Spi3, SpiMisoPin),
350            (into_i2s3_ws_pin, I2s3, I2sWsPin),
351        ]
352    }
353    (Pio0_3, pio0_3): {
354        (1, FC3_RXD_SDA_MOSI_DATA): [
355            (into_usart3_rx_pin, Usart3, UsartRxPin),
356            (into_i2c3_sda_pin, I2c3, I2cSdaPin),
357            (into_spi3_mosi_pin, Spi3, SpiMosiPin),
358            (into_i2s3_sda_pin, I2s3, I2sSdaPin),
359        ]
360    }
361    (Pio0_4, pio0_4): {
362        (2, FC4_SCK): [
363            (into_usart4_sclk_pin, Usart4, UsartSclkPin),
364        ]
365    }
366    (Pio0_5, pio0_5): {
367        (2, FC4_RXD_SDA_MOSI_DATA): [
368            (into_usart4_rx_pin, Usart4, UsartRxPin),
369            (into_i2c4_sda_pin, I2c4, I2cSdaPin),
370            (into_spi4_mosi_pin, Spi4, SpiMosiPin),
371            (into_i2s4_sda_pin, I2s4, I2sSdaPin),
372        ]
373    }
374    (Pio0_5, pio0_5): {
375        (8, FC3_RTS_SCL_SSEL1): [
376            (into_usart3_rts_pin, Usart3, UsartRtsPin),
377            (into_i2c3_scl_pin, I2c3, I2cSclPin),
378            (into_spi3_cs_pin, Spi3, SpiCsPin),
379        ]
380    }
381    (Pio0_6, pio0_6): {
382        (1, FC3_SCK): [
383            (into_usart3_sclk_pin, Usart3, UsartSclkPin),
384        ]
385    }
386    (Pio0_7, pio0_7): {
387        (1, FC3_RTS_SCL_SSEL1): [
388            (into_usart3_rts_pin, Usart3, UsartRtsPin),
389            (into_i2c3_scl_pin, I2c3, I2cSclPin),
390            (into_spi3_cs_pin, Spi3, SpiCsPin),
391        ]
392    }
393    (Pio0_7, pio0_7): {
394        (3, FC5_SCK): [
395            (into_usart5_sclk_pin, Usart5, UsartSclkPin),
396        ]
397    }
398    (Pio0_7, pio0_7): {
399        (4, FC1_SCK): [
400            (into_usart1_sclk_pin, Usart1, UsartSclkPin),
401        ]
402    }
403    (Pio0_8, pio0_8): {
404        (1, FC3_SSEL3): [
405            (into_spi3_cs_pin, Spi3, SpiCsPin),
406        ]
407    }
408    (Pio0_8, pio0_8): {
409        (3, FC5_RXD_SDA_MOSI_DATA): [
410            (into_usart5_rx_pin, Usart5, UsartRxPin),
411            (into_i2c5_sda_pin, I2c5, I2cSdaPin),
412            (into_spi5_mosi_pin, Spi5, SpiMosiPin),
413            (into_i2s5_sda_pin, I2s5, I2sSdaPin),
414        ]
415    }
416    (Pio0_9, pio0_9): {
417        (1, FC3_SSEL2): [
418            (into_spi3_cs_pin, Spi3, SpiCsPin),
419        ]
420    }
421    (Pio0_9, pio0_9): {
422        (3, FC5_TXD_SCL_MISO_WS): [
423            (into_usart5_tx_pin, Usart5, UsartTxPin),
424            (into_i2c5_scl_pin, I2c5, I2cSclPin),
425            (into_spi5_miso_pin, Spi5, SpiMisoPin),
426            (into_i2s5_ws_pin, I2s5, I2sWsPin),
427        ]
428    }
429    (Pio0_10, pio0_10): {
430        (1, FC6_SCK): [
431            (into_usart6_sclk_pin, Usart6, UsartSclkPin),
432        ]
433    }
434    (Pio0_10, pio0_10): {
435        (4, FC1_TXD_SCL_MISO_WS): [
436            (into_usart1_tx_pin, Usart1, UsartTxPin),
437            (into_i2c1_scl_pin, I2c1, I2cSclPin),
438            (into_spi1_miso_pin, Spi1, SpiMisoPin),
439            (into_i2s1_ws_pin, I2s1, I2sWsPin),
440        ]
441    }
442    (Pio0_11, pio0_11): {
443        (1, FC6_RXD_SDA_MOSI_DATA): [
444            (into_usart6_rx_pin, Usart6, UsartRxPin),
445            (into_i2c6_sda_pin, I2c6, I2cSdaPin),
446            (into_spi6_mosi_pin, Spi6, SpiMosiPin),
447            (into_i2s6_sda_pin, I2s6, I2sSdaPin),
448        ]
449    }
450    (Pio0_12, pio0_12): {
451        (1, FC3_TXD_SCL_MISO_WS): [
452            (into_usart3_tx_pin, Usart3, UsartTxPin),
453            (into_i2c3_scl_pin, I2c3, I2cSclPin),
454            (into_spi3_miso_pin, Spi3, SpiMisoPin),
455            (into_i2s3_ws_pin, I2s3, I2sWsPin),
456        ]
457    }
458    (Pio0_12, pio0_12): {
459        (7, FC6_TXD_SCL_MISO_WS): [
460            (into_usart6_tx_pin, Usart6, UsartTxPin),
461            (into_i2c6_scl_pin, I2c6, I2cSclPin),
462            (into_spi6_miso_pin, Spi6, SpiMisoPin),
463            (into_i2s6_ws_pin, I2s6, I2sWsPin),
464        ]
465    }
466    (Pio0_13, pio0_13): {
467        (1, FC1_CTS_SDA_SSEL0): [
468            (into_usart1_cts_pin, Usart1, UsartCtsPin),
469            (into_i2c1_sda_pin, I2c1, I2cSdaPin),
470            (into_spi1_cs_pin, Spi1, SpiCsPin),
471        ]
472    }
473    (Pio0_13, pio0_13): {
474        (5, FC1_RXD_SDA_MOSI_DATA): [
475            (into_usart1_rx_pin, Usart1, UsartRxPin),
476            // (into_i2c1_sda_pin, I2c1, I2cSdaPin),
477            (into_spi1_mosi_pin, Spi1, SpiMosiPin),
478            (into_i2s1_sda_pin, I2s1, I2sSdaPin),
479        ]
480    }
481    (Pio0_14, pio0_14): {
482        (1, FC1_RTS_SCL_SSEL1): [
483            (into_usart1_rts_pin, Usart1, UsartRtsPin),
484            (into_i2c1_scl_pin, I2c1, I2cSclPin),
485            (into_spi1_cs_pin, Spi1, SpiCsPin),
486        ]
487    }
488    (Pio0_14, pio0_14): {
489        (6, FC1_TXD_SCL_MISO_WS): [
490            (into_usart1_tx_pin, Usart1, UsartTxPin),
491            // (into_i2c1_scl_pin, I2c1, I2cSclPin),
492            (into_spi1_miso_pin, Spi1, SpiMisoPin),
493            (into_i2s1_ws_pin, I2s1, I2sWsPin),
494        ]
495    }
496    (Pio0_15, pio0_15): {
497        (1, FC6_CTS_SDA_SSEL0): [
498            (into_usart6_cts_pin, Usart6, UsartCtsPin),
499            (into_i2c6_sda_pin, I2c6, I2cSdaPin),
500            (into_spi6_cs_pin, Spi6, SpiCsPin),
501        ]
502    }
503    (Pio0_16, pio0_16): {
504        (1, FC4_TXD_SCL_MISO_WS): [
505            (into_usart4_tx_pin, Usart4, UsartTxPin),
506            (into_i2c4_scl_pin, I2c4, I2cSclPin),
507            (into_spi4_miso_pin, Spi4, SpiMisoPin),
508            (into_i2s4_ws_pin, I2s4, I2sWsPin),
509        ]
510    }
511    (Pio0_17, pio0_17): {
512        (1, FC4_SSEL2): [
513            (into_spi4_cs_pin, Spi4, SpiCsPin),
514        ]
515    }
516    (Pio0_18, pio0_18): {
517        (1, FC4_CTS_SDA_SSEL0): [
518            (into_usart4_cts_pin, Usart4, UsartCtsPin),
519            (into_i2c4_sda_pin, I2c4, I2cSdaPin),
520            (into_spi4_cs_pin, Spi4, SpiCsPin),
521        ]
522    }
523    (Pio0_19, pio0_19): {
524        (1, FC4_RTS_SCL_SSEL1): [
525            (into_usart4_rts_pin, Usart4, UsartRtsPin),
526            (into_i2c4_scl_pin, I2c4, I2cSclPin),
527            (into_spi4_cs_pin, Spi4, SpiCsPin),
528        ]
529    }
530    (Pio0_19, pio0_19): {
531        (7, FC7_TXD_SCL_MISO_WS): [
532            (into_usart7_tx_pin, Usart7, UsartTxPin),
533            (into_i2c7_scl_pin, I2c7, I2cSclPin),
534            (into_spi7_miso_pin, Spi7, SpiMisoPin),
535            (into_i2s7_ws_pin, I2s7, I2sWsPin),
536        ]
537    }
538    (Pio0_20, pio0_20): {
539        (1, FC3_CTS_SDA_SSEL0): [
540            (into_usart3_cts_pin, Usart3, UsartCtsPin),
541            (into_i2c3_sda_pin, I2c3, I2cSdaPin),
542            (into_spi3_cs_pin, Spi3, SpiCsPin),
543        ]
544    }
545    (Pio0_20, pio0_20): {
546        (7, FC7_RXD_SDA_MOSI_DATA): [
547            (into_usart7_rx_pin, Usart7, UsartRxPin),
548            (into_i2c7_sda_pin, I2c7, I2cSdaPin),
549            (into_spi7_mosi_pin, Spi7, SpiMosiPin),
550            (into_i2s7_sda_pin, I2s7, I2sSdaPin),
551        ]
552    }
553    (Pio0_20, pio0_20): {
554        (8, HS_SPI_SSEL0): [
555            (into_spi8_cs_pin, Spi8, SpiCsPin),
556        ]
557    }
558    (Pio0_21, pio0_21): {
559        (1, FC3_RTS_SCL_SSEL1): [
560            (into_usart3_rts_pin, Usart3, UsartRtsPin),
561            (into_i2c3_scl_pin, I2c3, I2cSclPin),
562            (into_spi3_cs_pin, Spi3, SpiCsPin),
563        ]
564    }
565    (Pio0_21, pio0_21): {
566        (7, FC7_SCK): [
567            (into_usart7_sclk_pin, Usart7, UsartSclkPin),
568        ]
569    }
570    (Pio0_22, pio0_22): {
571        (1, FC6_TXD_SCL_MISO_WS): [
572            (into_usart6_tx_pin, Usart6, UsartTxPin),
573            (into_i2c6_scl_pin, I2c6, I2cSclPin),
574            (into_spi6_miso_pin, Spi6, SpiMisoPin),
575            (into_i2s6_ws_pin, I2s6, I2sWsPin),
576        ]
577    }
578    (Pio0_23, pio0_23): {
579        (5, FC0_CTS_SDA_SSEL0): [
580            (into_usart0_cts_pin, Usart0, UsartCtsPin),
581            (into_i2c0_sda_pin, I2c0, I2cSdaPin),
582            (into_spi0_cs_pin, Spi0, SpiCsPin),
583        ]
584    }
585    (Pio0_24, pio0_24): {
586        (1, FC0_RXD_SDA_MOSI_DATA): [
587            (into_usart0_rx_pin, Usart0, UsartRxPin),
588            (into_i2c0_sda_pin, I2c0, I2cSdaPin),
589            (into_spi0_mosi_pin, Spi0, SpiMosiPin),
590            (into_i2s0_sda_pin, I2s0, I2sSdaPin),
591        ]
592    }
593    (Pio0_25, pio0_25): {
594        (1, FC0_TXD_SCL_MISO_WS): [
595            (into_usart0_tx_pin, Usart0, UsartTxPin),
596            (into_i2c0_scl_pin, I2c0, I2cSclPin),
597            (into_spi0_miso_pin, Spi0, SpiMisoPin),
598            (into_i2s0_ws_pin, I2s0, I2sWsPin),
599        ]
600    }
601    (Pio0_26, pio0_26): {
602        (1, FC2_RXD_SDA_MOSI_DATA): [
603            (into_usart2_rx_pin, Usart2, UsartRxPin),
604            (into_i2c2_sda_pin, I2c2, I2cSdaPin),
605            (into_spi2_mosi_pin, Spi2, SpiMosiPin),
606            (into_i2s2_sda_pin, I2s2, I2sSdaPin),
607        ]
608    }
609    (Pio0_26, pio0_26): {
610        (8, FC0_SCK): [
611            (into_usart0_sclk_pin, Usart0, UsartSclkPin),
612        ]
613    }
614    (Pio0_26, pio0_26): {
615        (9, HS_SPI_MOSI): [
616            (into_spi8_mosi_pin, Spi8, SpiMosiPin),
617        ]
618    }
619    (Pio0_27, pio0_27): {
620        (1, FC2_TXD_SCL_MISO_WS): [
621            (into_usart2_tx_pin, Usart2, UsartTxPin),
622            (into_i2c2_scl_pin, I2c2, I2cSclPin),
623            (into_spi2_miso_pin, Spi2, SpiMisoPin),
624            (into_i2s2_ws_pin, I2s2, I2sWsPin),
625        ]
626    }
627    (Pio0_27, pio0_27): {
628        (7, FC7_RXD_SDA_MOSI_DATA): [
629            (into_usart7_rx_pin, Usart7, UsartRxPin),
630            (into_i2c7_sda_pin, I2c7, I2cSdaPin),
631            (into_spi7_mosi_pin, Spi7, SpiMosiPin),
632            (into_i2s7_sda_pin, I2s7, I2sSdaPin),
633        ]
634    }
635    (Pio0_28, pio0_28): {
636        (1, FC0_SCK): [
637            (into_usart0_sclk_pin, Usart0, UsartSclkPin),
638        ]
639    }
640    (Pio0_29, pio0_29): {
641        (1, FC0_RXD_SDA_MOSI_DATA): [
642            (into_usart0_rx_pin, Usart0, UsartRxPin),
643            (into_i2c0_sda_pin, I2c0, I2cSdaPin),
644            (into_spi0_mosi_pin, Spi0, SpiMosiPin),
645            (into_i2s0_sda_pin, I2s0, I2sSdaPin),
646        ]
647    }
648    (Pio0_30, pio0_30): {
649        (1, FC0_TXD_SCL_MISO_WS): [
650            (into_usart0_tx_pin, Usart0, UsartTxPin),
651            (into_i2c0_scl_pin, I2c0, I2cSclPin),
652            (into_spi0_miso_pin, Spi0, SpiMisoPin),
653            (into_i2s0_ws_pin, I2s0, I2sWsPin),
654        ]
655    }
656    (Pio0_31, pio0_31): {
657        (1, FC0_CTS_SDA_SSEL0): [
658            (into_usart0_cts_pin, Usart0, UsartCtsPin),
659            (into_i2c0_sda_pin, I2c0, I2cSdaPin),
660            (into_spi0_cs_pin, Spi0, SpiCsPin),
661        ]
662    }
663    (Pio1_0, pio1_0): {
664        (1, FC0_RTS_SCL_SSEL1): [
665            (into_usart0_rts_pin, Usart0, UsartRtsPin),
666            (into_i2c0_scl_pin, I2c0, I2cSclPin),
667            (into_spi0_cs_pin, Spi0, SpiCsPin),
668        ]
669    }
670    (Pio1_1, pio1_1): {
671        (1, FC3_RXD_SDA_MOSI_DATA): [
672            (into_usart3_rx_pin, Usart3, UsartRxPin),
673            (into_i2c3_sda_pin, I2c3, I2cSdaPin),
674            (into_spi3_mosi_pin, Spi3, SpiMosiPin),
675            (into_i2s3_sda_pin, I2s3, I2sSdaPin),
676        ]
677    }
678    (Pio1_1, pio1_1): {
679        (5, HS_SPI_SSEL1): [
680            (into_spi8_cs_pin, Spi8, SpiCsPin),
681        ]
682    }
683    (Pio1_2, pio1_2): {
684        (6, HS_SPI_SCK): [
685            (into_spi8_sck_pin, Spi8, SpiSckPin),
686        ]
687    }
688    (Pio1_3, pio1_3): {
689        (6, HS_SPI_MISO): [
690            (into_spi8_miso_pin, Spi8, SpiMisoPin),
691        ]
692    }
693    (Pio1_4, pio1_4): {
694        (1, FC0_SCK): [
695            (into_usart0_sclk_pin, Usart0, UsartSclkPin),
696        ]
697    }
698    (Pio1_5, pio1_5): {
699        (1, FC0_RXD_SDA_MOSI_DATA): [
700            (into_usart0_rx_pin, Usart0, UsartRxPin),
701            (into_i2c0_sda_pin, I2c0, I2cSdaPin),
702            (into_spi0_mosi_pin, Spi0, SpiMosiPin),
703            (into_i2s0_sda_pin, I2s0, I2sSdaPin),
704        ]
705    }
706    (Pio1_6, pio1_6): {
707        (1, FC0_TXD_SCL_MISO_WS): [
708            (into_usart0_tx_pin, Usart0, UsartTxPin),
709            (into_i2c0_scl_pin, I2c0, I2cSclPin),
710            (into_spi0_miso_pin, Spi0, SpiMisoPin),
711            (into_i2s0_ws_pin, I2s0, I2sWsPin),
712        ]
713    }
714    (Pio1_7, pio1_7): {
715        (1, FC0_RTS_SCL_SSEL1): [
716            (into_usart0_rts_pin, Usart0, UsartRtsPin),
717            (into_i2c0_scl_pin, I2c0, I2cSclPin),
718            (into_spi0_cs_pin, Spi0, SpiCsPin),
719        ]
720    }
721    (Pio1_8, pio1_8): {
722        (1, FC0_CTS_SDA_SSEL0): [
723            (into_usart0_cts_pin, Usart0, UsartCtsPin),
724            (into_i2c0_sda_pin, I2c0, I2cSdaPin),
725            (into_spi0_cs_pin, Spi0, SpiCsPin),
726        ]
727    }
728    (Pio1_8, pio1_8): {
729        (5, FC4_SSEL2): [
730            (into_spi4_cs_pin, Spi4, SpiCsPin),
731        ]
732    }
733    (Pio1_9, pio1_9): {
734        (2, FC1_SCK): [
735            (into_usart1_sclk_pin, Usart1, UsartSclkPin),
736        ]
737    }
738    (Pio1_9, pio1_9): {
739        (5, FC4_CTS_SDA_SSEL0): [
740            (into_usart4_cts_pin, Usart4, UsartCtsPin),
741            (into_i2c4_sda_pin, I2c4, I2cSdaPin),
742            (into_spi4_cs_pin, Spi4, SpiCsPin),
743        ]
744    }
745    (Pio1_10, pio1_10): {
746        (2, FC1_RXD_SDA_MOSI_DATA): [
747            (into_usart1_rx_pin, Usart1, UsartRxPin),
748            (into_i2c1_sda_pin, I2c1, I2cSdaPin),
749            (into_spi1_mosi_pin, Spi1, SpiMosiPin),
750            (into_i2s1_sda_pin, I2s1, I2sSdaPin),
751        ]
752    }
753    (Pio1_11, pio1_11): {
754        (2, FC1_TXD_SCL_MISO_WS): [
755            (into_usart1_tx_pin, Usart1, UsartTxPin),
756            (into_i2c1_scl_pin, I2c1, I2cSclPin),
757            (into_spi1_miso_pin, Spi1, SpiMisoPin),
758            (into_i2s1_ws_pin, I2s1, I2sWsPin),
759        ]
760    }
761    (Pio1_12, pio1_12): {
762        (2, FC6_SCK): [
763            (into_usart6_sclk_pin, Usart6, UsartSclkPin),
764        ]
765    }
766    (Pio1_12, pio1_12): {
767        (5, HS_SPI_SSEL2): [
768            (into_spi8_cs_pin, Spi8, SpiCsPin),
769        ]
770    }
771    (Pio1_13, pio1_13): {
772        (2, FC6_RXD_SDA_MOSI_DATA): [
773            (into_usart6_rx_pin, Usart6, UsartRxPin),
774            (into_i2c6_sda_pin, I2c6, I2cSdaPin),
775            (into_spi6_mosi_pin, Spi6, SpiMosiPin),
776            (into_i2s6_sda_pin, I2s6, I2sSdaPin),
777        ]
778    }
779    (Pio1_14, pio1_14): {
780        (4, FC5_CTS_SDA_SSEL0): [
781            (into_usart5_cts_pin, Usart5, UsartCtsPin),
782            (into_i2c5_sda_pin, I2c5, I2cSdaPin),
783            (into_spi5_cs_pin, Spi5, SpiCsPin),
784        ]
785    }
786    (Pio1_15, pio1_15): {
787        (4, FC5_RTS_SCL_SSEL1): [
788            (into_usart5_rts_pin, Usart5, UsartRtsPin),
789            (into_i2c5_scl_pin, I2c5, I2cSclPin),
790            (into_spi5_cs_pin, Spi5, SpiCsPin),
791        ]
792    }
793    (Pio1_15, pio1_15): {
794        (5, FC4_RTS_SCL_SSEL1): [
795            (into_usart4_rts_pin, Usart4, UsartRtsPin),
796            (into_i2c4_scl_pin, I2c4, I2cSclPin),
797            (into_spi4_cs_pin, Spi4, SpiCsPin),
798        ]
799    }
800    (Pio1_16, pio1_16): {
801        (2, FC6_TXD_SCL_MISO_WS): [
802            (into_usart6_tx_pin, Usart6, UsartTxPin),
803            (into_i2c6_scl_pin, I2c6, I2cSclPin),
804            (into_spi6_miso_pin, Spi6, SpiMisoPin),
805            (into_i2s6_ws_pin, I2s6, I2sWsPin),
806        ]
807    }
808    (Pio1_17, pio1_17): {
809        (3, FC6_RTS_SCL_SSEL1): [
810            (into_usart6_rts_pin, Usart6, UsartRtsPin),
811            (into_i2c6_scl_pin, I2c6, I2cSclPin),
812            (into_spi6_cs_pin, Spi6, SpiCsPin),
813        ]
814    }
815    (Pio1_19, pio1_19): {
816        (5, FC4_SCK): [
817            (into_usart4_sclk_pin, Usart4, UsartSclkPin),
818        ]
819    }
820    (Pio1_20, pio1_20): {
821        (1, FC7_RTS_SCL_SSEL1): [
822            (into_usart7_rts_pin, Usart7, UsartRtsPin),
823            (into_i2c7_scl_pin, I2c7, I2cSclPin),
824            (into_spi7_cs_pin, Spi7, SpiCsPin),
825        ]
826    }
827    (Pio1_20, pio1_20): {
828        (5, FC4_TXD_SCL_MISO_WS): [
829            (into_usart4_tx_pin, Usart4, UsartTxPin),
830            (into_i2c4_scl_pin, I2c4, I2cSclPin),
831            (into_spi4_miso_pin, Spi4, SpiMisoPin),
832            (into_i2s4_ws_pin, I2s4, I2sWsPin),
833        ]
834    }
835    (Pio1_21, pio1_21): {
836        (1, FC7_CTS_SDA_SSEL0): [
837            (into_usart7_cts_pin, Usart7, UsartCtsPin),
838            (into_i2c7_sda_pin, I2c7, I2cSdaPin),
839            (into_spi7_cs_pin, Spi7, SpiCsPin),
840        ]
841    }
842    (Pio1_21, pio1_21): {
843        (5, FC4_RXD_SDA_MOSI_DATA): [
844            (into_usart4_rx_pin, Usart4, UsartRxPin),
845            (into_i2c4_sda_pin, I2c4, I2cSdaPin),
846            (into_spi4_mosi_pin, Spi4, SpiMosiPin),
847            (into_i2s4_sda_pin, I2s4, I2sSdaPin),
848        ]
849    }
850    (Pio1_22, pio1_22): {
851        (5, FC4_SSEL3): [
852            (into_spi4_cs_pin, Spi4, SpiCsPin),
853        ]
854    }
855    (Pio1_23, pio1_23): {
856        (1, FC2_SCK): [
857            (into_usart2_sclk_pin, Usart2, UsartSclkPin),
858        ]
859    }
860    (Pio1_23, pio1_23): {
861        (5, FC3_SSEL2): [
862            (into_spi3_cs_pin, Spi3, SpiCsPin),
863        ]
864    }
865    (Pio1_24, pio1_24): {
866        (1, FC2_RXD_SDA_MOSI_DATA): [
867            (into_usart2_rx_pin, Usart2, UsartRxPin),
868            (into_i2c2_sda_pin, I2c2, I2cSdaPin),
869            (into_spi2_mosi_pin, Spi2, SpiMosiPin),
870            (into_i2s2_sda_pin, I2s2, I2sSdaPin),
871        ]
872    }
873    (Pio1_24, pio1_24): {
874        (5, FC3_SSEL3): [
875            (into_spi3_cs_pin, Spi3, SpiCsPin),
876        ]
877    }
878    (Pio1_25, pio1_25): {
879        (1, FC2_TXD_SCL_MISO_WS): [
880            (into_usart2_tx_pin, Usart2, UsartTxPin),
881            (into_i2c2_scl_pin, I2c2, I2cSclPin),
882            (into_spi2_miso_pin, Spi2, SpiMisoPin),
883            (into_i2s2_ws_pin, I2s2, I2sWsPin),
884        ]
885    }
886    (Pio1_26, pio1_26): {
887        (1, FC2_CTS_SDA_SSEL0): [
888            (into_usart2_cts_pin, Usart2, UsartCtsPin),
889            (into_i2c2_sda_pin, I2c2, I2cSdaPin),
890            (into_spi2_cs_pin, Spi2, SpiCsPin),
891        ]
892    }
893    (Pio1_26, pio1_26): {
894        (5, HS_SPI_SSEL3): [
895            (into_spi8_cs_pin, Spi8, SpiCsPin),
896        ]
897    }
898    (Pio1_27, pio1_27): {
899        (1, FC2_RTS_SCL_SSEL1): [
900            (into_usart2_rts_pin, Usart2, UsartRtsPin),
901            (into_i2c2_scl_pin, I2c2, I2cSclPin),
902            (into_spi2_cs_pin, Spi2, SpiCsPin),
903        ]
904    }
905    (Pio1_28, pio1_28): {
906        (1, FC7_SCK): [
907            (into_usart7_sclk_pin, Usart7, UsartSclkPin),
908        ]
909    }
910    (Pio1_29, pio1_29): {
911        (1, FC7_RXD_SDA_MOSI_DATA): [
912            (into_usart7_rx_pin, Usart7, UsartRxPin),
913            (into_i2c7_sda_pin, I2c7, I2cSdaPin),
914            (into_spi7_mosi_pin, Spi7, SpiMosiPin),
915            (into_i2s7_sda_pin, I2s7, I2sSdaPin),
916        ]
917    }
918    (Pio1_30, pio1_30): {
919        (1, FC7_TXD_SCL_MISO_WS): [
920            (into_usart7_tx_pin, Usart7, UsartTxPin),
921            (into_i2c7_scl_pin, I2c7, I2cSclPin),
922            (into_spi7_miso_pin, Spi7, SpiMisoPin),
923            (into_i2s7_ws_pin, I2s7, I2sWsPin),
924        ]
925    }
926}
927
928impl<PIO: PinId> fc::I2cSclPin<PIO, flexcomm::I2c0> for Pin<PIO, Special<function::FC0_RTS_SCL_SSEL1>> {}
929impl<PIO: PinId> fc::I2cSclPin<PIO, flexcomm::I2c0> for Pin<PIO, Special<function::FC0_TXD_SCL_MISO_WS>> {}
930impl<PIO: PinId> fc::I2cSclPin<PIO, flexcomm::I2c1> for Pin<PIO, Special<function::FC1_RTS_SCL_SSEL1>> {}
931impl<PIO: PinId> fc::I2cSclPin<PIO, flexcomm::I2c1> for Pin<PIO, Special<function::FC1_TXD_SCL_MISO_WS>> {}
932impl<PIO: PinId> fc::I2cSclPin<PIO, flexcomm::I2c2> for Pin<PIO, Special<function::FC2_RTS_SCL_SSEL1>> {}
933impl<PIO: PinId> fc::I2cSclPin<PIO, flexcomm::I2c2> for Pin<PIO, Special<function::FC2_TXD_SCL_MISO_WS>> {}
934impl<PIO: PinId> fc::I2cSclPin<PIO, flexcomm::I2c3> for Pin<PIO, Special<function::FC3_RTS_SCL_SSEL1>> {}
935impl<PIO: PinId> fc::I2cSclPin<PIO, flexcomm::I2c3> for Pin<PIO, Special<function::FC3_TXD_SCL_MISO_WS>> {}
936impl<PIO: PinId> fc::I2cSclPin<PIO, flexcomm::I2c4> for Pin<PIO, Special<function::FC4_RTS_SCL_SSEL1>> {}
937impl<PIO: PinId> fc::I2cSclPin<PIO, flexcomm::I2c4> for Pin<PIO, Special<function::FC4_TXD_SCL_MISO_WS>> {}
938impl<PIO: PinId> fc::I2cSclPin<PIO, flexcomm::I2c5> for Pin<PIO, Special<function::FC5_RTS_SCL_SSEL1>> {}
939impl<PIO: PinId> fc::I2cSclPin<PIO, flexcomm::I2c5> for Pin<PIO, Special<function::FC5_TXD_SCL_MISO_WS>> {}
940impl<PIO: PinId> fc::I2cSclPin<PIO, flexcomm::I2c6> for Pin<PIO, Special<function::FC6_RTS_SCL_SSEL1>> {}
941impl<PIO: PinId> fc::I2cSclPin<PIO, flexcomm::I2c6> for Pin<PIO, Special<function::FC6_TXD_SCL_MISO_WS>> {}
942impl<PIO: PinId> fc::I2cSclPin<PIO, flexcomm::I2c7> for Pin<PIO, Special<function::FC7_RTS_SCL_SSEL1>> {}
943impl<PIO: PinId> fc::I2cSclPin<PIO, flexcomm::I2c7> for Pin<PIO, Special<function::FC7_TXD_SCL_MISO_WS>> {}
944impl<PIO: PinId> fc::I2cSdaPin<PIO, flexcomm::I2c0> for Pin<PIO, Special<function::FC0_CTS_SDA_SSEL0>> {}
945impl<PIO: PinId> fc::I2cSdaPin<PIO, flexcomm::I2c0> for Pin<PIO, Special<function::FC0_RXD_SDA_MOSI_DATA>> {}
946impl<PIO: PinId> fc::I2cSdaPin<PIO, flexcomm::I2c1> for Pin<PIO, Special<function::FC1_CTS_SDA_SSEL0>> {}
947impl<PIO: PinId> fc::I2cSdaPin<PIO, flexcomm::I2c1> for Pin<PIO, Special<function::FC1_RXD_SDA_MOSI_DATA>> {}
948impl<PIO: PinId> fc::I2cSdaPin<PIO, flexcomm::I2c2> for Pin<PIO, Special<function::FC2_CTS_SDA_SSEL0>> {}
949impl<PIO: PinId> fc::I2cSdaPin<PIO, flexcomm::I2c2> for Pin<PIO, Special<function::FC2_RXD_SDA_MOSI_DATA>> {}
950impl<PIO: PinId> fc::I2cSdaPin<PIO, flexcomm::I2c3> for Pin<PIO, Special<function::FC3_CTS_SDA_SSEL0>> {}
951impl<PIO: PinId> fc::I2cSdaPin<PIO, flexcomm::I2c3> for Pin<PIO, Special<function::FC3_RXD_SDA_MOSI_DATA>> {}
952impl<PIO: PinId> fc::I2cSdaPin<PIO, flexcomm::I2c4> for Pin<PIO, Special<function::FC4_CTS_SDA_SSEL0>> {}
953impl<PIO: PinId> fc::I2cSdaPin<PIO, flexcomm::I2c4> for Pin<PIO, Special<function::FC4_RXD_SDA_MOSI_DATA>> {}
954impl<PIO: PinId> fc::I2cSdaPin<PIO, flexcomm::I2c5> for Pin<PIO, Special<function::FC5_CTS_SDA_SSEL0>> {}
955impl<PIO: PinId> fc::I2cSdaPin<PIO, flexcomm::I2c5> for Pin<PIO, Special<function::FC5_RXD_SDA_MOSI_DATA>> {}
956impl<PIO: PinId> fc::I2cSdaPin<PIO, flexcomm::I2c6> for Pin<PIO, Special<function::FC6_CTS_SDA_SSEL0>> {}
957impl<PIO: PinId> fc::I2cSdaPin<PIO, flexcomm::I2c6> for Pin<PIO, Special<function::FC6_RXD_SDA_MOSI_DATA>> {}
958impl<PIO: PinId> fc::I2cSdaPin<PIO, flexcomm::I2c7> for Pin<PIO, Special<function::FC7_CTS_SDA_SSEL0>> {}
959impl<PIO: PinId> fc::I2cSdaPin<PIO, flexcomm::I2c7> for Pin<PIO, Special<function::FC7_RXD_SDA_MOSI_DATA>> {}
960impl<PIO: PinId> fc::I2sSdaPin<PIO, flexcomm::I2s0> for Pin<PIO, Special<function::FC0_RXD_SDA_MOSI_DATA>> {}
961impl<PIO: PinId> fc::I2sSdaPin<PIO, flexcomm::I2s1> for Pin<PIO, Special<function::FC1_RXD_SDA_MOSI_DATA>> {}
962impl<PIO: PinId> fc::I2sSdaPin<PIO, flexcomm::I2s2> for Pin<PIO, Special<function::FC2_RXD_SDA_MOSI_DATA>> {}
963impl<PIO: PinId> fc::I2sSdaPin<PIO, flexcomm::I2s3> for Pin<PIO, Special<function::FC3_RXD_SDA_MOSI_DATA>> {}
964impl<PIO: PinId> fc::I2sSdaPin<PIO, flexcomm::I2s4> for Pin<PIO, Special<function::FC4_RXD_SDA_MOSI_DATA>> {}
965impl<PIO: PinId> fc::I2sSdaPin<PIO, flexcomm::I2s5> for Pin<PIO, Special<function::FC5_RXD_SDA_MOSI_DATA>> {}
966impl<PIO: PinId> fc::I2sSdaPin<PIO, flexcomm::I2s6> for Pin<PIO, Special<function::FC6_RXD_SDA_MOSI_DATA>> {}
967impl<PIO: PinId> fc::I2sSdaPin<PIO, flexcomm::I2s7> for Pin<PIO, Special<function::FC7_RXD_SDA_MOSI_DATA>> {}
968impl<PIO: PinId> fc::I2sWsPin<PIO, flexcomm::I2s0> for Pin<PIO, Special<function::FC0_TXD_SCL_MISO_WS>> {}
969impl<PIO: PinId> fc::I2sWsPin<PIO, flexcomm::I2s1> for Pin<PIO, Special<function::FC1_TXD_SCL_MISO_WS>> {}
970impl<PIO: PinId> fc::I2sWsPin<PIO, flexcomm::I2s2> for Pin<PIO, Special<function::FC2_TXD_SCL_MISO_WS>> {}
971impl<PIO: PinId> fc::I2sWsPin<PIO, flexcomm::I2s3> for Pin<PIO, Special<function::FC3_TXD_SCL_MISO_WS>> {}
972impl<PIO: PinId> fc::I2sWsPin<PIO, flexcomm::I2s4> for Pin<PIO, Special<function::FC4_TXD_SCL_MISO_WS>> {}
973impl<PIO: PinId> fc::I2sWsPin<PIO, flexcomm::I2s5> for Pin<PIO, Special<function::FC5_TXD_SCL_MISO_WS>> {}
974impl<PIO: PinId> fc::I2sWsPin<PIO, flexcomm::I2s6> for Pin<PIO, Special<function::FC6_TXD_SCL_MISO_WS>> {}
975impl<PIO: PinId> fc::I2sWsPin<PIO, flexcomm::I2s7> for Pin<PIO, Special<function::FC7_TXD_SCL_MISO_WS>> {}
976impl<PIO: PinId> fc::SpiMisoPin<PIO, flexcomm::Spi0> for Pin<PIO, Special<function::FC0_TXD_SCL_MISO_WS>> {}
977impl<PIO: PinId> fc::SpiMisoPin<PIO, flexcomm::Spi1> for Pin<PIO, Special<function::FC1_TXD_SCL_MISO_WS>> {}
978impl<PIO: PinId> fc::SpiMisoPin<PIO, flexcomm::Spi2> for Pin<PIO, Special<function::FC2_TXD_SCL_MISO_WS>> {}
979impl<PIO: PinId> fc::SpiMisoPin<PIO, flexcomm::Spi3> for Pin<PIO, Special<function::FC3_TXD_SCL_MISO_WS>> {}
980impl<PIO: PinId> fc::SpiMisoPin<PIO, flexcomm::Spi4> for Pin<PIO, Special<function::FC4_TXD_SCL_MISO_WS>> {}
981impl<PIO: PinId> fc::SpiMisoPin<PIO, flexcomm::Spi5> for Pin<PIO, Special<function::FC5_TXD_SCL_MISO_WS>> {}
982impl<PIO: PinId> fc::SpiMisoPin<PIO, flexcomm::Spi6> for Pin<PIO, Special<function::FC6_TXD_SCL_MISO_WS>> {}
983impl<PIO: PinId> fc::SpiMisoPin<PIO, flexcomm::Spi7> for Pin<PIO, Special<function::FC7_TXD_SCL_MISO_WS>> {}
984impl<PIO: PinId> fc::SpiMisoPin<PIO, flexcomm::Spi8> for Pin<PIO, Special<function::HS_SPI_MISO>> {}
985impl<PIO: PinId> fc::SpiMosiPin<PIO, flexcomm::Spi0> for Pin<PIO, Special<function::FC0_RXD_SDA_MOSI_DATA>> {}
986impl<PIO: PinId> fc::SpiMosiPin<PIO, flexcomm::Spi1> for Pin<PIO, Special<function::FC1_RXD_SDA_MOSI_DATA>> {}
987impl<PIO: PinId> fc::SpiMosiPin<PIO, flexcomm::Spi2> for Pin<PIO, Special<function::FC2_RXD_SDA_MOSI_DATA>> {}
988impl<PIO: PinId> fc::SpiMosiPin<PIO, flexcomm::Spi3> for Pin<PIO, Special<function::FC3_RXD_SDA_MOSI_DATA>> {}
989impl<PIO: PinId> fc::SpiMosiPin<PIO, flexcomm::Spi4> for Pin<PIO, Special<function::FC4_RXD_SDA_MOSI_DATA>> {}
990impl<PIO: PinId> fc::SpiMosiPin<PIO, flexcomm::Spi5> for Pin<PIO, Special<function::FC5_RXD_SDA_MOSI_DATA>> {}
991impl<PIO: PinId> fc::SpiMosiPin<PIO, flexcomm::Spi6> for Pin<PIO, Special<function::FC6_RXD_SDA_MOSI_DATA>> {}
992impl<PIO: PinId> fc::SpiMosiPin<PIO, flexcomm::Spi7> for Pin<PIO, Special<function::FC7_RXD_SDA_MOSI_DATA>> {}
993impl<PIO: PinId> fc::SpiMosiPin<PIO, flexcomm::Spi8> for Pin<PIO, Special<function::HS_SPI_MOSI>> {}
994impl<PIO: PinId> fc::SpiSckPin<PIO, flexcomm::Spi8> for Pin<PIO, Special<function::HS_SPI_SCK>> {}
995impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi0> for Pin<PIO, Special<function::FC0_CTS_SDA_SSEL0>> {
996    const CS: ChipSelect = ChipSelect::Chip0;
997}
998impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi0> for Pin<PIO, Special<function::FC0_RTS_SCL_SSEL1>> {
999    const CS: ChipSelect = ChipSelect::Chip1;
1000}
1001impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi1> for Pin<PIO, Special<function::FC1_CTS_SDA_SSEL0>> {
1002    const CS: ChipSelect = ChipSelect::Chip0;
1003}
1004impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi1> for Pin<PIO, Special<function::FC1_RTS_SCL_SSEL1>> {
1005    const CS: ChipSelect = ChipSelect::Chip1;
1006}
1007impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi2> for Pin<PIO, Special<function::FC2_CTS_SDA_SSEL0>> {
1008    const CS: ChipSelect = ChipSelect::Chip0;
1009}
1010impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi2> for Pin<PIO, Special<function::FC2_RTS_SCL_SSEL1>> {
1011    const CS: ChipSelect = ChipSelect::Chip1;
1012}
1013impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi3> for Pin<PIO, Special<function::FC3_CTS_SDA_SSEL0>> {
1014    const CS: ChipSelect = ChipSelect::Chip0;
1015}
1016impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi3> for Pin<PIO, Special<function::FC3_RTS_SCL_SSEL1>> {
1017    const CS: ChipSelect = ChipSelect::Chip1;
1018}
1019impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi3> for Pin<PIO, Special<function::FC3_SSEL2>> {
1020    const CS: ChipSelect = ChipSelect::Chip2;
1021}
1022impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi3> for Pin<PIO, Special<function::FC3_SSEL3>> {
1023    const CS: ChipSelect = ChipSelect::Chip3;
1024}
1025impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi4> for Pin<PIO, Special<function::FC4_CTS_SDA_SSEL0>> {
1026    const CS: ChipSelect = ChipSelect::Chip0;
1027}
1028impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi4> for Pin<PIO, Special<function::FC4_RTS_SCL_SSEL1>> {
1029    const CS: ChipSelect = ChipSelect::Chip1;
1030}
1031impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi4> for Pin<PIO, Special<function::FC4_SSEL2>> {
1032    const CS: ChipSelect = ChipSelect::Chip2;
1033}
1034impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi4> for Pin<PIO, Special<function::FC4_SSEL3>> {
1035    const CS: ChipSelect = ChipSelect::Chip3;
1036}
1037impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi5> for Pin<PIO, Special<function::FC5_CTS_SDA_SSEL0>> {
1038    const CS: ChipSelect = ChipSelect::Chip0;
1039}
1040impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi5> for Pin<PIO, Special<function::FC5_RTS_SCL_SSEL1>> {
1041    const CS: ChipSelect = ChipSelect::Chip1;
1042}
1043impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi6> for Pin<PIO, Special<function::FC6_CTS_SDA_SSEL0>> {
1044    const CS: ChipSelect = ChipSelect::Chip0;
1045}
1046impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi6> for Pin<PIO, Special<function::FC6_RTS_SCL_SSEL1>> {
1047    const CS: ChipSelect = ChipSelect::Chip1;
1048}
1049impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi7> for Pin<PIO, Special<function::FC7_CTS_SDA_SSEL0>> {
1050    const CS: ChipSelect = ChipSelect::Chip0;
1051}
1052impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi7> for Pin<PIO, Special<function::FC7_RTS_SCL_SSEL1>> {
1053    const CS: ChipSelect = ChipSelect::Chip1;
1054}
1055impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi8> for Pin<PIO, Special<function::HS_SPI_SSEL0>> {
1056    const CS: ChipSelect = ChipSelect::Chip0;
1057}
1058impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi8> for Pin<PIO, Special<function::HS_SPI_SSEL1>> {
1059    const CS: ChipSelect = ChipSelect::Chip1;
1060}
1061impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi8> for Pin<PIO, Special<function::HS_SPI_SSEL2>> {
1062    const CS: ChipSelect = ChipSelect::Chip2;
1063}
1064impl<PIO: PinId> fc::SpiCsPin<PIO, flexcomm::Spi8> for Pin<PIO, Special<function::HS_SPI_SSEL3>> {
1065    const CS: ChipSelect = ChipSelect::Chip3;
1066}
1067impl<PIO: PinId> fc::UsartCtsPin<PIO, flexcomm::Usart0> for Pin<PIO, Special<function::FC0_CTS_SDA_SSEL0>> {}
1068impl<PIO: PinId> fc::UsartCtsPin<PIO, flexcomm::Usart1> for Pin<PIO, Special<function::FC1_CTS_SDA_SSEL0>> {}
1069impl<PIO: PinId> fc::UsartCtsPin<PIO, flexcomm::Usart2> for Pin<PIO, Special<function::FC2_CTS_SDA_SSEL0>> {}
1070impl<PIO: PinId> fc::UsartCtsPin<PIO, flexcomm::Usart3> for Pin<PIO, Special<function::FC3_CTS_SDA_SSEL0>> {}
1071impl<PIO: PinId> fc::UsartCtsPin<PIO, flexcomm::Usart4> for Pin<PIO, Special<function::FC4_CTS_SDA_SSEL0>> {}
1072impl<PIO: PinId> fc::UsartCtsPin<PIO, flexcomm::Usart5> for Pin<PIO, Special<function::FC5_CTS_SDA_SSEL0>> {}
1073impl<PIO: PinId> fc::UsartCtsPin<PIO, flexcomm::Usart6> for Pin<PIO, Special<function::FC6_CTS_SDA_SSEL0>> {}
1074impl<PIO: PinId> fc::UsartCtsPin<PIO, flexcomm::Usart7> for Pin<PIO, Special<function::FC7_CTS_SDA_SSEL0>> {}
1075impl<PIO: PinId> fc::UsartRtsPin<PIO, flexcomm::Usart0> for Pin<PIO, Special<function::FC0_RTS_SCL_SSEL1>> {}
1076impl<PIO: PinId> fc::UsartRtsPin<PIO, flexcomm::Usart1> for Pin<PIO, Special<function::FC1_RTS_SCL_SSEL1>> {}
1077impl<PIO: PinId> fc::UsartRtsPin<PIO, flexcomm::Usart2> for Pin<PIO, Special<function::FC2_RTS_SCL_SSEL1>> {}
1078impl<PIO: PinId> fc::UsartRtsPin<PIO, flexcomm::Usart3> for Pin<PIO, Special<function::FC3_RTS_SCL_SSEL1>> {}
1079impl<PIO: PinId> fc::UsartRtsPin<PIO, flexcomm::Usart4> for Pin<PIO, Special<function::FC4_RTS_SCL_SSEL1>> {}
1080impl<PIO: PinId> fc::UsartRtsPin<PIO, flexcomm::Usart5> for Pin<PIO, Special<function::FC5_RTS_SCL_SSEL1>> {}
1081impl<PIO: PinId> fc::UsartRtsPin<PIO, flexcomm::Usart6> for Pin<PIO, Special<function::FC6_RTS_SCL_SSEL1>> {}
1082impl<PIO: PinId> fc::UsartRtsPin<PIO, flexcomm::Usart7> for Pin<PIO, Special<function::FC7_RTS_SCL_SSEL1>> {}
1083impl<PIO: PinId> fc::UsartRxPin<PIO, flexcomm::Usart0> for Pin<PIO, Special<function::FC0_RXD_SDA_MOSI_DATA>> {}
1084impl<PIO: PinId> fc::UsartRxPin<PIO, flexcomm::Usart1> for Pin<PIO, Special<function::FC1_RXD_SDA_MOSI_DATA>> {}
1085impl<PIO: PinId> fc::UsartRxPin<PIO, flexcomm::Usart2> for Pin<PIO, Special<function::FC2_RXD_SDA_MOSI_DATA>> {}
1086impl<PIO: PinId> fc::UsartRxPin<PIO, flexcomm::Usart3> for Pin<PIO, Special<function::FC3_RXD_SDA_MOSI_DATA>> {}
1087impl<PIO: PinId> fc::UsartRxPin<PIO, flexcomm::Usart4> for Pin<PIO, Special<function::FC4_RXD_SDA_MOSI_DATA>> {}
1088impl<PIO: PinId> fc::UsartRxPin<PIO, flexcomm::Usart5> for Pin<PIO, Special<function::FC5_RXD_SDA_MOSI_DATA>> {}
1089impl<PIO: PinId> fc::UsartRxPin<PIO, flexcomm::Usart6> for Pin<PIO, Special<function::FC6_RXD_SDA_MOSI_DATA>> {}
1090impl<PIO: PinId> fc::UsartRxPin<PIO, flexcomm::Usart7> for Pin<PIO, Special<function::FC7_RXD_SDA_MOSI_DATA>> {}
1091impl<PIO: PinId> fc::UsartSclkPin<PIO, flexcomm::Usart0> for Pin<PIO, Special<function::FC0_SCK>> {}
1092impl<PIO: PinId> fc::UsartSclkPin<PIO, flexcomm::Usart1> for Pin<PIO, Special<function::FC1_SCK>> {}
1093impl<PIO: PinId> fc::UsartSclkPin<PIO, flexcomm::Usart2> for Pin<PIO, Special<function::FC2_SCK>> {}
1094impl<PIO: PinId> fc::UsartSclkPin<PIO, flexcomm::Usart3> for Pin<PIO, Special<function::FC3_SCK>> {}
1095impl<PIO: PinId> fc::UsartSclkPin<PIO, flexcomm::Usart4> for Pin<PIO, Special<function::FC4_SCK>> {}
1096impl<PIO: PinId> fc::UsartSclkPin<PIO, flexcomm::Usart5> for Pin<PIO, Special<function::FC5_SCK>> {}
1097impl<PIO: PinId> fc::UsartSclkPin<PIO, flexcomm::Usart6> for Pin<PIO, Special<function::FC6_SCK>> {}
1098impl<PIO: PinId> fc::UsartSclkPin<PIO, flexcomm::Usart7> for Pin<PIO, Special<function::FC7_SCK>> {}
1099impl<PIO: PinId> fc::UsartTxPin<PIO, flexcomm::Usart0> for Pin<PIO, Special<function::FC0_TXD_SCL_MISO_WS>> {}
1100impl<PIO: PinId> fc::UsartTxPin<PIO, flexcomm::Usart1> for Pin<PIO, Special<function::FC1_TXD_SCL_MISO_WS>> {}
1101impl<PIO: PinId> fc::UsartTxPin<PIO, flexcomm::Usart2> for Pin<PIO, Special<function::FC2_TXD_SCL_MISO_WS>> {}
1102impl<PIO: PinId> fc::UsartTxPin<PIO, flexcomm::Usart3> for Pin<PIO, Special<function::FC3_TXD_SCL_MISO_WS>> {}
1103impl<PIO: PinId> fc::UsartTxPin<PIO, flexcomm::Usart4> for Pin<PIO, Special<function::FC4_TXD_SCL_MISO_WS>> {}
1104impl<PIO: PinId> fc::UsartTxPin<PIO, flexcomm::Usart5> for Pin<PIO, Special<function::FC5_TXD_SCL_MISO_WS>> {}
1105impl<PIO: PinId> fc::UsartTxPin<PIO, flexcomm::Usart6> for Pin<PIO, Special<function::FC6_TXD_SCL_MISO_WS>> {}
1106impl<PIO: PinId> fc::UsartTxPin<PIO, flexcomm::Usart7> for Pin<PIO, Special<function::FC7_TXD_SCL_MISO_WS>> {}