1use atsamd_hal_macros::{hal_cfg, hal_macro_helper};
4
5use crate::gpio::*;
6use crate::sercom::*;
7
8macro_rules! pad_info {
13 (
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 (
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
60macro_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);