atsamd_hal/sercom/pad/
impl_pad_thumbv6m.rs

1//! Implementations of the [`IsPad`], [`IsI2cPad`], [`GetPad`] traits
2
3use atsamd_hal_macros::{hal_cfg, hal_macro_helper};
4
5use crate::gpio::*;
6use crate::sercom::*;
7
8//==============================================================================
9//  Pad definitions
10//==============================================================================
11
12macro_rules! pad_info {
13    // This is the entry pattern when the pad is not I2C enabled.
14    (
15        $PinId:ident,
16        $Cfg:ident,
17        $Sercom:ident,
18        $PadNum:ident
19    ) => {
20        pad_info!(@impl_pad, $PinId, $Cfg, $Sercom, $PadNum);
21    };
22
23    // This is the entry pattern when the pad is I2C enabled.
24    (
25        $PinId:ident,
26        $Cfg:ident,
27        $Sercom:ident,
28        $PadNum:ident
29        + I2C
30    ) => {
31        impl IsI2cPad for Pin<$PinId, Alternate<$Cfg>> {}
32        pad_info!(@impl_pad, $PinId, $Cfg, $Sercom, $PadNum);
33    };
34
35    (
36        @impl_pad,
37        $PinId:ident,
38        $Cfg:ident,
39        $Sercom:ident,
40        $PadNum:ident
41    ) => {
42        #[hal_cfg("sercom0-d11")]
43        impl GetPad<$Sercom, $PadNum> for $PinId {
44            type PinMode = Alternate<$Cfg>;
45        }
46
47        #[hal_cfg("sercom0-d21")]
48        impl GetPad<$Sercom> for $PinId {
49            type PadNum = $PadNum;
50            type PinMode = Alternate<$Cfg>;
51        }
52
53        impl IsPad for Pin<$PinId, Alternate<$Cfg>> {
54            type Sercom = $Sercom;
55            type PadNum = $PadNum;
56        }
57    };
58}
59
60// Feature gates can be placed on individual configurations or on the entire pin
61macro_rules! pad_table {
62    (
63        #[$id_cfg:meta]
64        $PinId:ident {
65            $(
66                $( #[$sercom_cfg:meta] )?
67                $Cfg:ident: ( $Sercom:ident, $PadNum:ident ) $( + $I2C:ident )?,
68            )+
69        }
70    ) => {
71        $(
72            #[$id_cfg]
73            $( #[$sercom_cfg] )?
74            pad_info!( $PinId, $Cfg, $Sercom, $PadNum $( + $I2C )? );
75        )+
76    };
77
78    (
79        $PinId:ident {
80            $(
81                $( #[$sercom_cfg:meta] )?
82                $Cfg:ident: ( $Sercom:ident, $PadNum:ident ) $( + $I2C:ident )?,
83            )+
84        }
85    ) => {
86        $(
87            $( #[$sercom_cfg] )?
88            pad_info!( $PinId, $Cfg, $Sercom, $PadNum $( + $I2C )?  );
89        )+
90    };
91
92    (
93        $(
94            $( #[$id_cfg:meta] )?
95            $PinId:ident {
96                $(
97                    $( #[$sercom_cfg:meta] )?
98                    $Cfg:ident: ( $Sercom:ident, $PadNum:ident ) $( + $I2C:ident )?,
99                )+
100            }
101        )+
102    ) => {
103        $(
104            pad_table!(
105                $( #[$id_cfg] )?
106                $PinId {
107                    $(
108                        $( #[$sercom_cfg] )?
109                        $Cfg: ( $Sercom, $PadNum ) $( + $I2C )?,
110                    )+
111                }
112            );
113        )+
114    };
115}
116
117#[hal_macro_helper]
118#[hal_cfg("sercom0-d11")]
119pad_table!(
120    #[hal_cfg("pa04")]
121    PA04 {
122        #[hal_cfg("sercom0")]
123        C: (Sercom0, Pad2),
124        #[hal_cfg("sercom0")]
125        D: (Sercom0, Pad0),
126    }
127    #[hal_cfg("pa05")]
128    PA05 {
129        #[hal_cfg("sercom0")]
130        C: (Sercom0, Pad3),
131        #[hal_cfg("sercom0")]
132        D: (Sercom0, Pad1),
133    }
134    #[hal_cfg("pa06")]
135    PA06 {
136        #[hal_cfg("sercom0")]
137        C: (Sercom0, Pad0),
138        #[hal_cfg("sercom0")]
139        D: (Sercom0, Pad2),
140    }
141    #[hal_cfg("pa07")]
142    PA07 {
143        #[hal_cfg("sercom1")]
144        C: (Sercom1, Pad1),
145        #[hal_cfg("sercom0")]
146        D: (Sercom0, Pad3),
147    }
148    #[hal_cfg("pa08")]
149    PA08 {
150        #[hal_cfg("sercom1")]
151        C: (Sercom1, Pad2),
152        #[hal_cfg("sercom0")]
153        D: (Sercom0, Pad2),
154    }
155    #[hal_cfg("pa09")]
156    PA09 {
157        #[hal_cfg("sercom1")]
158        C: (Sercom1, Pad3),
159        #[hal_cfg("sercom0")]
160        D: (Sercom0, Pad3),
161    }
162    #[hal_cfg("pa10")]
163    PA10 {
164        #[hal_cfg("sercom0")]
165        C: (Sercom0, Pad2),
166        #[hal_cfg("sercom2")]
167        D: (Sercom2, Pad2),
168    }
169    #[hal_cfg("pa11")]
170    PA11 {
171        #[hal_cfg("sercom0")]
172        C: (Sercom0, Pad3),
173        #[hal_cfg("sercom2")]
174        D: (Sercom2, Pad3),
175    }
176    #[hal_cfg("pa14")]
177    PA14 {
178        #[hal_cfg("sercom0")]
179        C: (Sercom0, Pad0) + I2C,
180        #[hal_cfg("sercom2")]
181        D: (Sercom2, Pad0) + I2C,
182    }
183    #[hal_cfg("pa15")]
184    PA15 {
185        #[hal_cfg("sercom0")]
186        C: (Sercom0, Pad1) + I2C,
187        #[hal_cfg("sercom2")]
188        D: (Sercom2, Pad1) + I2C,
189    }
190    #[hal_cfg("pa16")]
191    PA16 {
192        #[hal_cfg("sercom2")]
193        C: (Sercom1, Pad2),
194        #[hal_cfg("sercom2")]
195        D: (Sercom2, Pad2),
196    }
197    #[hal_cfg("pa17")]
198    PA17 {
199        #[hal_cfg("sercom1")]
200        C: (Sercom1, Pad3),
201        #[hal_cfg("sercom2")]
202        D: (Sercom2, Pad3),
203    }
204    #[hal_cfg("pa22")]
205    PA22 {
206        #[hal_cfg("sercom1")]
207        C: (Sercom1, Pad0) + I2C,
208        #[hal_cfg("sercom2")]
209        D: (Sercom2, Pad0) + I2C,
210    }
211    #[hal_cfg("pa23")]
212    PA23 {
213        #[hal_cfg("sercom1")]
214        C: (Sercom1, Pad1) + I2C,
215        #[hal_cfg("sercom2")]
216        D: (Sercom2, Pad1) + I2C,
217    }
218    #[hal_cfg("pa24")]
219    PA24 {
220        #[hal_cfg("sercom1")]
221        C: (Sercom1, Pad2),
222        #[hal_cfg("sercom2")]
223        D: (Sercom2, Pad2),
224    }
225    #[hal_cfg("pa25")]
226    PA25 {
227        #[hal_cfg("sercom1")]
228        C: (Sercom1, Pad3),
229        #[hal_cfg("sercom2")]
230        D: (Sercom2, Pad3),
231    }
232    #[hal_cfg("pa30")]
233    PA30 {
234        #[hal_cfg("sercom1")]
235        C: (Sercom1, Pad0),
236        #[hal_cfg("sercom1")]
237        D: (Sercom1, Pad2),
238    }
239    #[hal_cfg("pa31")]
240    PA31 {
241        #[hal_cfg("sercom1")]
242        C: (Sercom1, Pad1),
243        #[hal_cfg("sercom1")]
244        D: (Sercom1, Pad3),
245    }
246);
247
248#[hal_macro_helper]
249#[hal_cfg("sercom0-d21")]
250pad_table!(
251    #[hal_cfg("pa00")]
252    PA00 {
253        #[hal_cfg("sercom1")]
254        D: (Sercom1, Pad0),
255    }
256    #[hal_cfg("pa01")]
257    PA01 {
258        #[hal_cfg("sercom1")]
259        D: (Sercom1, Pad1),
260    }
261    #[hal_cfg("pa04")]
262    PA04 {
263        #[hal_cfg("sercom0")]
264        D: (Sercom0, Pad0),
265    }
266    #[hal_cfg("pa05")]
267    PA05 {
268        #[hal_cfg("sercom0")]
269        D: (Sercom0, Pad1),
270    }
271    #[hal_cfg("pa06")]
272    PA06 {
273        #[hal_cfg("sercom0")]
274        D: (Sercom0, Pad2),
275    }
276    #[hal_cfg("pa07")]
277    PA07 {
278        #[hal_cfg("sercom0")]
279        D: (Sercom0, Pad3),
280    }
281    #[hal_cfg("pa08")]
282    PA08 {
283        #[hal_cfg("sercom0")]
284        C: (Sercom0, Pad0) + I2C,
285        #[hal_cfg("sercom2")]
286        D: (Sercom2, Pad0) + I2C,
287    }
288    #[hal_cfg("pa09")]
289    PA09 {
290        #[hal_cfg("sercom0")]
291        C: (Sercom0, Pad1) + I2C,
292        #[hal_cfg("sercom2")]
293        D: (Sercom2, Pad1) + I2C,
294    }
295    #[hal_cfg("pa10")]
296    PA10 {
297        #[hal_cfg("sercom0")]
298        C: (Sercom0, Pad2),
299        #[hal_cfg("sercom2")]
300        D: (Sercom2, Pad2),
301    }
302    #[hal_cfg("pa11")]
303    PA11 {
304        #[hal_cfg("sercom0")]
305        C: (Sercom0, Pad3),
306        #[hal_cfg("sercom2")]
307        D: (Sercom2, Pad3),
308    }
309    #[hal_cfg("pa12")]
310    PA12 {
311        #[hal_cfg("sercom2")]
312        C: (Sercom2, Pad0) + I2C,
313        #[hal_cfg("sercom4")]
314        D: (Sercom4, Pad0) + I2C,
315    }
316    #[hal_cfg("pa13")]
317    PA13 {
318        #[hal_cfg("sercom2")]
319        C: (Sercom2, Pad1) + I2C,
320        #[hal_cfg("sercom4")]
321        D: (Sercom4, Pad1) + I2C,
322    }
323    #[hal_cfg("pa14")]
324    PA14 {
325        #[hal_cfg("sercom2")]
326        C: (Sercom2, Pad2),
327        #[hal_cfg("sercom4")]
328        D: (Sercom4, Pad2),
329    }
330    #[hal_cfg("pa15")]
331    PA15 {
332        #[hal_cfg("sercom2")]
333        C: (Sercom2, Pad3),
334        #[hal_cfg("sercom4")]
335        D: (Sercom4, Pad3),
336    }
337    #[hal_cfg("pa16")]
338    PA16 {
339        #[hal_cfg("sercom1")]
340        C: (Sercom1, Pad0) + I2C,
341        #[hal_cfg("sercom3")]
342        D: (Sercom3, Pad0) + I2C,
343    }
344    #[hal_cfg("pa17")]
345    PA17 {
346        #[hal_cfg("sercom1")]
347        C: (Sercom1, Pad1) + I2C,
348        #[hal_cfg("sercom3")]
349        D: (Sercom3, Pad1) + I2C,
350    }
351    #[hal_cfg("pa18")]
352    PA18 {
353        #[hal_cfg("sercom1")]
354        C: (Sercom1, Pad2),
355        #[hal_cfg("sercom3")]
356        D: (Sercom3, Pad2),
357    }
358    #[hal_cfg("pa19")]
359    PA19 {
360        #[hal_cfg("sercom1")]
361        C: (Sercom1, Pad3),
362        #[hal_cfg("sercom3")]
363        D: (Sercom3, Pad3),
364    }
365    #[hal_cfg("pa20")]
366    PA20 {
367        #[hal_cfg("sercom5")]
368        C: (Sercom5, Pad2),
369        #[hal_cfg("sercom3")]
370        D: (Sercom3, Pad2),
371    }
372    #[hal_cfg("pa21")]
373    PA21 {
374        #[hal_cfg("sercom5")]
375        C: (Sercom5, Pad3),
376        #[hal_cfg("sercom3")]
377        D: (Sercom3, Pad3),
378    }
379    #[hal_cfg("pa22")]
380    PA22 {
381        #[hal_cfg("sercom3")]
382        C: (Sercom3, Pad0) + I2C,
383        #[hal_cfg("sercom5")]
384        D: (Sercom5, Pad0) + I2C,
385    }
386    #[hal_cfg("pa23")]
387    PA23 {
388        #[hal_cfg("sercom3")]
389        C: (Sercom3, Pad1) + I2C,
390        #[hal_cfg("sercom5")]
391        D: (Sercom5, Pad1) + I2C,
392    }
393    #[hal_cfg("pa24")]
394    PA24 {
395        #[hal_cfg("sercom3")]
396        C: (Sercom3, Pad2),
397        #[hal_cfg("sercom5")]
398        D: (Sercom5, Pad2),
399    }
400    #[hal_cfg("pa25")]
401    PA25 {
402        #[hal_cfg("sercom3")]
403        C: (Sercom3, Pad3),
404        #[hal_cfg("sercom5")]
405        D: (Sercom5, Pad3),
406    }
407    #[hal_cfg("pa30")]
408    PA30 {
409        #[hal_cfg("sercom1")]
410        D: (Sercom1, Pad2),
411    }
412    #[hal_cfg("pa31")]
413    PA31 {
414        #[hal_cfg("sercom1")]
415        D: (Sercom1, Pad3),
416    }
417    #[hal_cfg("pb00")]
418    PB00 {
419        #[hal_cfg("sercom5")]
420        D: (Sercom5, Pad2),
421    }
422    #[hal_cfg("pb01")]
423    PB01 {
424        #[hal_cfg("sercom5")]
425        D: (Sercom5, Pad3),
426    }
427    #[hal_cfg("pb02")]
428    PB02 {
429        #[hal_cfg("sercom5")]
430        D: (Sercom5, Pad0),
431    }
432    #[hal_cfg("pb03")]
433    PB03 {
434        #[hal_cfg("sercom5")]
435        D: (Sercom5, Pad1),
436    }
437    #[hal_cfg("pb08")]
438    PB08 {
439        #[hal_cfg("sercom4")]
440        D: (Sercom4, Pad0),
441    }
442    #[hal_cfg("pb09")]
443    PB09 {
444        #[hal_cfg("sercom4")]
445        D: (Sercom4, Pad1),
446    }
447    #[hal_cfg("pb10")]
448    PB10 {
449        #[hal_cfg("sercom4")]
450        D: (Sercom4, Pad2),
451    }
452    #[hal_cfg("pb11")]
453    PB11 {
454        #[hal_cfg("sercom4")]
455        D: (Sercom4, Pad3),
456    }
457    #[hal_cfg("pb12")]
458    PB12 {
459        #[hal_cfg("sercom4")]
460        C: (Sercom4, Pad0) + I2C,
461    }
462    #[hal_cfg("pb13")]
463    PB13 {
464        #[hal_cfg("sercom4")]
465        C: (Sercom4, Pad1) + I2C,
466    }
467    #[hal_cfg("pb14")]
468    PB14 {
469        #[hal_cfg("sercom4")]
470        C: (Sercom4, Pad2),
471    }
472    #[hal_cfg("pb15")]
473    PB15 {
474        #[hal_cfg("sercom4")]
475        C: (Sercom4, Pad3),
476    }
477    #[hal_cfg("pb16")]
478    PB16 {
479        #[hal_cfg("sercom5")]
480        C: (Sercom5, Pad0) + I2C,
481    }
482    #[hal_cfg("pb17")]
483    PB17 {
484        #[hal_cfg("sercom5")]
485        C: (Sercom5, Pad1) + I2C,
486    }
487    #[hal_cfg("pb22")]
488    PB22 {
489        #[hal_cfg("sercom5")]
490        D: (Sercom5, Pad2),
491    }
492    #[hal_cfg("pb23")]
493    PB23 {
494        #[hal_cfg("sercom5")]
495        D: (Sercom5, Pad3),
496    }
497    #[hal_cfg("pb30")]
498    PB30 {
499        #[hal_cfg("sercom5")]
500        D: (Sercom5, Pad0) + I2C,
501    }
502    #[hal_cfg("pb31")]
503    PB31 {
504        #[hal_cfg("sercom5")]
505        D: (Sercom5, Pad1) + I2C,
506    }
507);