1# Atmel SAM/SAM0 pin configurations
2
3This directory contains a set of files describing valid pin configurations for
4multiple Atmel Smart Arm MCUs (SAM) devices. This configuration files maps a
5pin to a peripheral signal which multiplex, at end, I/O lines pins. For example,
6`PWMH0` signal can be mapped to `PA0`, `PA11`, `PA23`, `PB0`, `PC18` or `PD20`
7for `SAM4E` SoC. These configurations can be used to generate valid pin
8mappings.
9
10Atmel SAM devices use three distinct controllers to configure signal
11multiplexing: PIO (SAM), GPIO (SAM4L) and PORT (SAM0). In general, all devices
12uses similar definitions where each pin has one or more associated alternate
13function. These alternate functions can be sometimes changed using especific
14system functionality. The struct created to map the alternate functions is
15shared between all controllers and was concepted to be more close possible to
16datasheet tables.
17
18In the following sections the expected file format is described.
19
20## Configuration
21
22All fields are common, independently of the pin controller, and all fields are
23mandatory.
24
25- `model`: Always defined as `atmel,sam`
26- `family`: Family name like: `sam4e`, `sam4l`, `d5x-e5x`
27- `map`: Define the macro that will be used to generate code for an specific
28  controller. Currently `SAM_PINMUX` is used for all cases.
29- `series`: The SoC series set
30- `revisions` (optional): The SoC die revision which exists for sam0 series.
31- `variants`: Each variant has a different set of valid pin combinations because
32  of a different number of pins.
33- `pins` (required): The pin map itself
34
35Example:
36
37The below `yaml` snip have all the common fields defined. It defines few
38aleatory pins to help understand the definition schema.
39
40```yaml
41# Pin codes:
42#
43# - 48      pins: g
44# - 64      pins: j
45# - 100     pins: n
46# - 120/128 pins: p (package exception)
47
48model: atmel,sam
49
50family: d5x-e5x
51
52map: SAM_PINMUX
53
54series: [d51, e51, e53, e54]
55
56revisions:
57  d51: a
58  e51: ab
59  d53: ab
60  d54: abcd
61
62variants:
63  - pincode: g
64    series: [d51, e51]
65  - pincode: j
66    series: [d51, e51, e53]
67  - pincode: n
68    series: [d51, e51, e53, e54]
69  - pincode: p
70    series: [d51, e54]
71    exception: y
72
73pins:
74  pc00:
75    pincodes: [n, p]
76    periph:
77      - [a, eic, extint0]
78      - [b, adc1, ain10]
79  pa24:
80    pincodes: [g, j, n, p]
81    periph:
82      - [a, eic, extint8]
83      - [c, sercom3, pad2]
84      - [d, sercom5, pad2]
85      - [e, tc5, wo0]
86      - [f, tc2, wo2]
87      - [g, pdec, qdi0]
88      - [h, usb, dm]
89      - [i, can0, tx, [d51, e53]]
90      - [n, ccl, in8]
91  pa25:
92    pincodes: [g, j, n, p]
93    periph:
94      - [a, eic, extint9]
95      - [c, sercom3, pad3]
96      - [d, sercom5, pad3]
97      - [e, tc5, wo1]
98      - [g, pdec, qdi1]
99      - [h, usb, dp]
100      - [i, can0, rx, [d51, e53]]
101      - [n, ccl, out2]
102  pa19:
103    pincodes: [g, j, n, p]
104    periph:
105      - [a, eic, extint3]
106      - [b, ptc, xy13]
107      - [c, sercom1, pad3]
108      - [d, sercom3, pad3]
109      - [e, tc3, wo1]
110      - [f, tcc1, wo3]
111      - [g, tcc0, wo7]
112      - [k, pcc, data3]
113      - [l, gmac, gtx1, [d51, e51]]
114      - [m, ac, cmp1]
115      - [n, ccl, out0]
116  pc16:
117    pincodes: [n, p]
118    periph:
119      - [a, eic, extint0]
120      - [c, sercom6, pad0]
121      - [d, sercom0, pad1]
122      - [f, tcc0, wo0]
123      - [g, pdec, qdi0]
124      - [l, gmac, gtx2, [d51, e51]]
125```
126
127The `series` key define a list of SoC models `[d51, e51, e53, e54]`. This list
128is used to generate file names and map peripherals.
129
130Some sam0 SoC have optimized pins in some revisions. To differentiate those a
131new mux table should be defined. The `revisions` help to identify correct
132pinctrl files by sufix.
133
134The `variants` key define a list of available packages by SoC series. This means
135that for `pincode: g`, which is 48 pins packages, there are valid combination
136of `samd51g` and `samde51g` pin mux. Note, some devices my present some
137chalenges like define a part number which uses same pin code with different
138pin counts. For that ones, we add `exception: y` property. The exception will
139add a `WARNING` message to uses in the auto generated file asking to user look
140datasheet. Any variation with exception must map all pins to allow users access
141functionality.
142
143The `pins` section is a vaiable length list of pin definitions. Each entry is
144a pin itself composed by one mandatory properties which is `pincodes` and many
145optional properties: `periph`, `extra`, `system`, `lpm`. The `pincode` instructs
146the engine to generate pin definitions only for those packages were pin is, in
147fact, available. The `periph` is the set of multiplexed peripheral signals. It
148is a variable length list where each entry is a list. Each peripheral list
149entry is composed of 4 fields, where the first 3 are mandatory. The peripheral
150list represents:
151 - `alternate function index`
152 - `peripheral [instance]`
153 - `signal`
154 - `SoC/pincode exclusion list` (optional)
155
156Additionaly some SoCs define special pin configuration. In the datasheet user
157can find a column named `extra` and another as `systems`. The syntax is the
158same as `periph`. The `lpm` is reserved for future use. Some SoCs may require
159special pin configuration to allow system consume less possible power.
160
161Example:
162
163At below `yaml` snip code defines `pc16` pin:
164
165```yaml
166  pc16:
167    pincodes: [n, p]
168    periph:
169      - [a, eic, extint0]
170      - [c, sercom6, pad0]
171      - [d, sercom0, pad1]
172      - [f, tcc0, wo0]
173      - [g, pdec, qdi0]
174      - [l, gmac, gtx2, [d51, e51]]
175```
176
177This means, that port `C` pin 16 is available for packages `n` and `p`. The
178alternate function available for these pin is that:
179 - at position `a` the `eic` controller have access to signal `extint0`
180 - at position `c` the signal `pad0` can be defined for `sercom6`
181 - at position `d` the signal `pad1` can be defined for `sercom0`
182 - at position `f` the `tcc0` can output signal `wo0`
183 - at position `g` the `pdec` uses `qdi0` as quadrature input 0.
184 - at position `l` the `gmac` define signal `gtx2` which won't be available for
185   SoC `d51` and `e51`.
186
187In this case, besides `n` and `p` packages tells to engine that pin `pc16` must
188be generated for the entire SoC series `d51, e51, e53, e54` the engine allows
189to deliberate exclude some signal combination.
190
191The exclusion list can have both SoC `series` and `pincodes`. This allow create
192less files and give better granularity. The next example shows how to drop `smc`
193functionality in the `SAM4E` SoC. In this case, only one series can accomodate
194all variations and the tunning is made using `pincode` at periph config.
195
196```yaml
197# Pin codes:
198#
199# - 100 pins: c
200# - 144 pins: e
201
202model: atmel,sam
203
204family: sam4e
205
206map: SAM_PINMUX
207
208series: [4eX]
209
210variants:
211  - pincode: c
212    series: [4eX]
213  - pincode: e
214    series: [4eX]
215
216pins:
217  pa0:
218    pincodes: [c, e]
219    periph:
220      - [a, pwm, pwmh0]
221      - [b, tc0, tioa0]
222      - [c, smc, a17, [c]]
223      - [d, supc, wkup0]
224```
225
226It is recommended use one filter at exclusion list. When necessary combine both
227`series` and `pincodes` the exclusion will operate first in the series and then
228will lookup by pincode.
229
230The next example shows how to specify `extra` function and `system` functions.
231
232```yaml
233  pb5:
234    pincodes: [c, e]
235    periph:
236      - [a, twi1, twck1]
237      - [b, pwm, pwml0]
238    extra:
239      - [x, supc, wkup13]
240    system:
241      - [s, jtag, tdo]
242      - [s, swd, traceswo]
243```
244
245## Auto Generated Code
246
247After define all pins the user should run `scripts/sampinctrl.py` script to
248auto generate Zephyr RTOS devicetree pinctrl definitions. See `scripts/README`
249for instructions how to do it.
250
251### Output Format
252
253The output format define constants to be used inside devitree pins definitions,
254see below snip of output:
255
256```c
257/*
258 * Autogenerated file
259 *
260 * SPDX-License-Identifier: Apache-2.0
261 */
262
263#include <dt-bindings/pinctrl/atmel_sam_pinctrl.h>
264
265/*
266 * WARNING: this variant has package exception.
267 *
268 *   Read datasheet topics related to I/O Multiplexing and Considerations or
269 *   Peripheral Signal Multiplexing on I/O Lines for more information.
270 */
271
272/* pa0a_eic_extint0 */
273#define PA0A_EIC_EXTINT0 \
274	SAM_PINMUX(a, 0, a, periph)
275```
276
277The output format uses the compressed representation which of:
278 - port index (PIOx, GPIOx or PORTx)
279 - pin number
280 - alternate function index
281 - function (gpio, periph, extra, system, lpm)
282
283In this case `PA0A_EIC_EXTINT0` is at PORT `a` pin `0` using alternate
284function `a`, which selects pin for external interrupt controller `EIC`
285interrupt `extint0`.
286
287
288## Devicetree definitions
289
290The pinctrl devicetree entries follow current Zephyr RTOS conventions. See
291below example which define serial console for `atsame54_xpro` board.
292
293```devicetree
294#include <dt-bindings/pinctrl/same54p-pinctrl.h>
295
296&pinctrl {
297	sercom2_usart_default: sercom2_usart_default {
298		group1 {
299			pinmux = <PB25D_SERCOM2_PAD1>, <PB24D_SERCOM2_PAD0>;
300		};
301	};
302};
303
304&sercom2 {
305	status = "okay";
306	compatible = "atmel,sam0-uart";
307	current-speed = <115200>;
308	rxpo = <1>;
309	txpo = <0>;
310	#address-cells = <1>;
311	#size-cells = <0>;
312
313	pinctrl-0 = <&sercom2_usart_default>;
314	pinctrl-names = "default";
315};
316```
317