1/*
2  pins_arduino.c - pin definitions for the Arduino board
3  Part of Arduino / Wiring Lite
4
5  Copyright (c) 2005 David A. Mellis
6
7  This library is free software; you can redistribute it and/or
8  modify it under the terms of the GNU Lesser General Public
9  License as published by the Free Software Foundation; either
10  version 2.1 of the License, or (at your option) any later version.
11
12  This library is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  Lesser General Public License for more details.
16
17  You should have received a copy of the GNU Lesser General
18  Public License along with this library; if not, write to the
19  Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20  Boston, MA  02111-1307  USA
21
22  $Id$
23*/
24
25#include <avr/io.h>
26#include "wiring_private.h"
27#include "pins_arduino.h"
28
29// On the Arduino board, digital pins are also used
30// for the analog output (software PWM).  Analog input
31// pins are a separate set.
32
33// ATMEL ATMEGA8 & 168 / ARDUINO
34//
35//                  +-\/-+
36//            PC6  1|    |28  PC5 (AI 5)
37//      (D 0) PD0  2|    |27  PC4 (AI 4)
38//      (D 1) PD1  3|    |26  PC3 (AI 3)
39//      (D 2) PD2  4|    |25  PC2 (AI 2)
40// PWM+ (D 3) PD3  5|    |24  PC1 (AI 1)
41//      (D 4) PD4  6|    |23  PC0 (AI 0)
42//            VCC  7|    |22  GND
43//            GND  8|    |21  AREF
44//            PB6  9|    |20  AVCC
45//            PB7 10|    |19  PB5 (D 13)
46// PWM+ (D 5) PD5 11|    |18  PB4 (D 12)
47// PWM+ (D 6) PD6 12|    |17  PB3 (D 11) PWM
48//      (D 7) PD7 13|    |16  PB2 (D 10) PWM
49//      (D 8) PB0 14|    |15  PB1 (D 9) PWM
50//                  +----+
51//
52// (PWM+ indicates the additional PWM pins on the ATmega168.)
53
54// ATMEL ATMEGA1280 / ARDUINO
55//
56// 0-7 PE0-PE7   works
57// 8-13 PB0-PB5  works
58// 14-21 PA0-PA7 works
59// 22-29 PH0-PH7 works
60// 30-35 PG5-PG0 works
61// 36-43 PC7-PC0 works
62// 44-51 PJ7-PJ0 works
63// 52-59 PL7-PL0 works
64// 60-67 PD7-PD0 works
65// A0-A7 PF0-PF7
66// A8-A15 PK0-PK7
67
68#define PA 1
69#define PB 2
70#define PC 3
71#define PD 4
72#define PE 5
73#define PF 6
74#define PG 7
75#define PH 8
76#define PJ 10
77#define PK 11
78#define PL 12
79
80
81#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
82const uint16_t PROGMEM port_to_mode_PGM[] = {
83	NOT_A_PORT,
84	&DDRA,
85	&DDRB,
86	&DDRC,
87	&DDRD,
88	&DDRE,
89	&DDRF,
90	&DDRG,
91	&DDRH,
92	NOT_A_PORT,
93	&DDRJ,
94	&DDRK,
95	&DDRL,
96};
97
98const uint16_t PROGMEM port_to_output_PGM[] = {
99	NOT_A_PORT,
100	&PORTA,
101	&PORTB,
102	&PORTC,
103	&PORTD,
104	&PORTE,
105	&PORTF,
106	&PORTG,
107	&PORTH,
108	NOT_A_PORT,
109	&PORTJ,
110	&PORTK,
111	&PORTL,
112};
113
114const uint16_t PROGMEM port_to_input_PGM[] = {
115	NOT_A_PIN,
116	&PINA,
117	&PINB,
118	&PINC,
119	&PIND,
120	&PINE,
121	&PINF,
122	&PING,
123	&PINH,
124	NOT_A_PIN,
125	&PINJ,
126	&PINK,
127	&PINL,
128};
129
130const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
131	// PORTLIST
132	// -------------------------------------------
133	PE	, // PE 0 ** 0 ** USART0_RX
134	PE	, // PE 1 ** 1 ** USART0_TX
135	PE	, // PE 4 ** 2 ** PWM2
136	PE	, // PE 5 ** 3 ** PWM3
137	PG	, // PG 5 ** 4 ** PWM4
138	PE	, // PE 3 ** 5 ** PWM5
139	PH	, // PH 3 ** 6 ** PWM6
140	PH	, // PH 4 ** 7 ** PWM7
141	PH	, // PH 5 ** 8 ** PWM8
142	PH	, // PH 6 ** 9 ** PWM9
143	PB	, // PB 4 ** 10 ** PWM10
144	PB	, // PB 5 ** 11 ** PWM11
145	PB	, // PB 6 ** 12 ** PWM12
146	PB	, // PB 7 ** 13 ** PWM13
147	PJ	, // PJ 1 ** 14 ** USART3_TX
148	PJ	, // PJ 0 ** 15 ** USART3_RX
149	PH	, // PH 1 ** 16 ** USART2_TX
150	PH	, // PH 0 ** 17 ** USART2_RX
151	PD	, // PD 3 ** 18 ** USART1_TX
152	PD	, // PD 2 ** 19 ** USART1_RX
153	PD	, // PD 1 ** 20 ** I2C_SDA
154	PD	, // PD 0 ** 21 ** I2C_SCL
155	PA	, // PA 0 ** 22 ** D22
156	PA	, // PA 1 ** 23 ** D23
157	PA	, // PA 2 ** 24 ** D24
158	PA	, // PA 3 ** 25 ** D25
159	PA	, // PA 4 ** 26 ** D26
160	PA	, // PA 5 ** 27 ** D27
161	PA	, // PA 6 ** 28 ** D28
162	PA	, // PA 7 ** 29 ** D29
163	PC	, // PC 7 ** 30 ** D30
164	PC	, // PC 6 ** 31 ** D31
165	PC	, // PC 5 ** 32 ** D32
166	PC	, // PC 4 ** 33 ** D33
167	PC	, // PC 3 ** 34 ** D34
168	PC	, // PC 2 ** 35 ** D35
169	PC	, // PC 1 ** 36 ** D36
170	PC	, // PC 0 ** 37 ** D37
171	PD	, // PD 7 ** 38 ** D38
172	PG	, // PG 2 ** 39 ** D39
173	PG	, // PG 1 ** 40 ** D40
174	PG	, // PG 0 ** 41 ** D41
175	PL	, // PL 7 ** 42 ** D42
176	PL	, // PL 6 ** 43 ** D43
177	PL	, // PL 5 ** 44 ** D44
178	PL	, // PL 4 ** 45 ** D45
179	PL	, // PL 3 ** 46 ** D46
180	PL	, // PL 2 ** 47 ** D47
181	PL	, // PL 1 ** 48 ** D48
182	PL	, // PL 0 ** 49 ** D49
183	PB	, // PB 3 ** 50 ** SPI_MISO
184	PB	, // PB 2 ** 51 ** SPI_MOSI
185	PB	, // PB 1 ** 52 ** SPI_SCK
186	PB	, // PB 0 ** 53 ** SPI_SS
187	PF	, // PF 0 ** 54 ** A0
188	PF	, // PF 1 ** 55 ** A1
189	PF	, // PF 2 ** 56 ** A2
190	PF	, // PF 3 ** 57 ** A3
191	PF	, // PF 4 ** 58 ** A4
192	PF	, // PF 5 ** 59 ** A5
193	PF	, // PF 6 ** 60 ** A6
194	PF	, // PF 7 ** 61 ** A7
195	PK	, // PK 0 ** 62 ** A8
196	PK	, // PK 1 ** 63 ** A9
197	PK	, // PK 2 ** 64 ** A10
198	PK	, // PK 3 ** 65 ** A11
199	PK	, // PK 4 ** 66 ** A12
200	PK	, // PK 5 ** 67 ** A13
201	PK	, // PK 6 ** 68 ** A14
202	PK	, // PK 7 ** 69 ** A15
203};
204
205const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
206	// PIN IN PORT
207	// -------------------------------------------
208	_BV( 0 )	, // PE 0 ** 0 ** USART0_RX
209	_BV( 1 )	, // PE 1 ** 1 ** USART0_TX
210	_BV( 4 )	, // PE 4 ** 2 ** PWM2
211	_BV( 5 )	, // PE 5 ** 3 ** PWM3
212	_BV( 5 )	, // PG 5 ** 4 ** PWM4
213	_BV( 3 )	, // PE 3 ** 5 ** PWM5
214	_BV( 3 )	, // PH 3 ** 6 ** PWM6
215	_BV( 4 )	, // PH 4 ** 7 ** PWM7
216	_BV( 5 )	, // PH 5 ** 8 ** PWM8
217	_BV( 6 )	, // PH 6 ** 9 ** PWM9
218	_BV( 4 )	, // PB 4 ** 10 ** PWM10
219	_BV( 5 )	, // PB 5 ** 11 ** PWM11
220	_BV( 6 )	, // PB 6 ** 12 ** PWM12
221	_BV( 7 )	, // PB 7 ** 13 ** PWM13
222	_BV( 1 )	, // PJ 1 ** 14 ** USART3_TX
223	_BV( 0 )	, // PJ 0 ** 15 ** USART3_RX
224	_BV( 1 )	, // PH 1 ** 16 ** USART2_TX
225	_BV( 0 )	, // PH 0 ** 17 ** USART2_RX
226	_BV( 3 )	, // PD 3 ** 18 ** USART1_TX
227	_BV( 2 )	, // PD 2 ** 19 ** USART1_RX
228	_BV( 1 )	, // PD 1 ** 20 ** I2C_SDA
229	_BV( 0 )	, // PD 0 ** 21 ** I2C_SCL
230	_BV( 0 )	, // PA 0 ** 22 ** D22
231	_BV( 1 )	, // PA 1 ** 23 ** D23
232	_BV( 2 )	, // PA 2 ** 24 ** D24
233	_BV( 3 )	, // PA 3 ** 25 ** D25
234	_BV( 4 )	, // PA 4 ** 26 ** D26
235	_BV( 5 )	, // PA 5 ** 27 ** D27
236	_BV( 6 )	, // PA 6 ** 28 ** D28
237	_BV( 7 )	, // PA 7 ** 29 ** D29
238	_BV( 7 )	, // PC 7 ** 30 ** D30
239	_BV( 6 )	, // PC 6 ** 31 ** D31
240	_BV( 5 )	, // PC 5 ** 32 ** D32
241	_BV( 4 )	, // PC 4 ** 33 ** D33
242	_BV( 3 )	, // PC 3 ** 34 ** D34
243	_BV( 2 )	, // PC 2 ** 35 ** D35
244	_BV( 1 )	, // PC 1 ** 36 ** D36
245	_BV( 0 )	, // PC 0 ** 37 ** D37
246	_BV( 7 )	, // PD 7 ** 38 ** D38
247	_BV( 2 )	, // PG 2 ** 39 ** D39
248	_BV( 1 )	, // PG 1 ** 40 ** D40
249	_BV( 0 )	, // PG 0 ** 41 ** D41
250	_BV( 7 )	, // PL 7 ** 42 ** D42
251	_BV( 6 )	, // PL 6 ** 43 ** D43
252	_BV( 5 )	, // PL 5 ** 44 ** D44
253	_BV( 4 )	, // PL 4 ** 45 ** D45
254	_BV( 3 )	, // PL 3 ** 46 ** D46
255	_BV( 2 )	, // PL 2 ** 47 ** D47
256	_BV( 1 )	, // PL 1 ** 48 ** D48
257	_BV( 0 )	, // PL 0 ** 49 ** D49
258	_BV( 3 )	, // PB 3 ** 50 ** SPI_MISO
259	_BV( 2 )	, // PB 2 ** 51 ** SPI_MOSI
260	_BV( 1 )	, // PB 1 ** 52 ** SPI_SCK
261	_BV( 0 )	, // PB 0 ** 53 ** SPI_SS
262	_BV( 0 )	, // PF 0 ** 54 ** A0
263	_BV( 1 )	, // PF 1 ** 55 ** A1
264	_BV( 2 )	, // PF 2 ** 56 ** A2
265	_BV( 3 )	, // PF 3 ** 57 ** A3
266	_BV( 4 )	, // PF 4 ** 58 ** A4
267	_BV( 5 )	, // PF 5 ** 59 ** A5
268	_BV( 6 )	, // PF 6 ** 60 ** A6
269	_BV( 7 )	, // PF 7 ** 61 ** A7
270	_BV( 0 )	, // PK 0 ** 62 ** A8
271	_BV( 1 )	, // PK 1 ** 63 ** A9
272	_BV( 2 )	, // PK 2 ** 64 ** A10
273	_BV( 3 )	, // PK 3 ** 65 ** A11
274	_BV( 4 )	, // PK 4 ** 66 ** A12
275	_BV( 5 )	, // PK 5 ** 67 ** A13
276	_BV( 6 )	, // PK 6 ** 68 ** A14
277	_BV( 7 )	, // PK 7 ** 69 ** A15
278};
279
280const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
281	// TIMERS
282	// -------------------------------------------
283	NOT_ON_TIMER	, // PE 0 ** 0 ** USART0_RX
284	NOT_ON_TIMER	, // PE 1 ** 1 ** USART0_TX
285	TIMER3B	, // PE 4 ** 2 ** PWM2
286	TIMER3C	, // PE 5 ** 3 ** PWM3
287	TIMER0B	, // PG 5 ** 4 ** PWM4
288	TIMER3A	, // PE 3 ** 5 ** PWM5
289	TIMER4A	, // PH 3 ** 6 ** PWM6
290	TIMER4B	, // PH 4 ** 7 ** PWM7
291	TIMER4C	, // PH 5 ** 8 ** PWM8
292	TIMER2B	, // PH 6 ** 9 ** PWM9
293	TIMER2A	, // PB 4 ** 10 ** PWM10
294	TIMER1A	, // PB 5 ** 11 ** PWM11
295	TIMER1B	, // PB 6 ** 12 ** PWM12
296	TIMER0A	, // PB 7 ** 13 ** PWM13
297	NOT_ON_TIMER	, // PJ 1 ** 14 ** USART3_TX
298	NOT_ON_TIMER	, // PJ 0 ** 15 ** USART3_RX
299	NOT_ON_TIMER	, // PH 1 ** 16 ** USART2_TX
300	NOT_ON_TIMER	, // PH 0 ** 17 ** USART2_RX
301	NOT_ON_TIMER	, // PD 3 ** 18 ** USART1_TX
302	NOT_ON_TIMER	, // PD 2 ** 19 ** USART1_RX
303	NOT_ON_TIMER	, // PD 1 ** 20 ** I2C_SDA
304	NOT_ON_TIMER	, // PD 0 ** 21 ** I2C_SCL
305	NOT_ON_TIMER	, // PA 0 ** 22 ** D22
306	NOT_ON_TIMER	, // PA 1 ** 23 ** D23
307	NOT_ON_TIMER	, // PA 2 ** 24 ** D24
308	NOT_ON_TIMER	, // PA 3 ** 25 ** D25
309	NOT_ON_TIMER	, // PA 4 ** 26 ** D26
310	NOT_ON_TIMER	, // PA 5 ** 27 ** D27
311	NOT_ON_TIMER	, // PA 6 ** 28 ** D28
312	NOT_ON_TIMER	, // PA 7 ** 29 ** D29
313	NOT_ON_TIMER	, // PC 7 ** 30 ** D30
314	NOT_ON_TIMER	, // PC 6 ** 31 ** D31
315	NOT_ON_TIMER	, // PC 5 ** 32 ** D32
316	NOT_ON_TIMER	, // PC 4 ** 33 ** D33
317	NOT_ON_TIMER	, // PC 3 ** 34 ** D34
318	NOT_ON_TIMER	, // PC 2 ** 35 ** D35
319	NOT_ON_TIMER	, // PC 1 ** 36 ** D36
320	NOT_ON_TIMER	, // PC 0 ** 37 ** D37
321	NOT_ON_TIMER	, // PD 7 ** 38 ** D38
322	NOT_ON_TIMER	, // PG 2 ** 39 ** D39
323	NOT_ON_TIMER	, // PG 1 ** 40 ** D40
324	NOT_ON_TIMER	, // PG 0 ** 41 ** D41
325	NOT_ON_TIMER	, // PL 7 ** 42 ** D42
326	NOT_ON_TIMER	, // PL 6 ** 43 ** D43
327	TIMER5C	, // PL 5 ** 44 ** D44
328	TIMER5B	, // PL 4 ** 45 ** D45
329	TIMER5A	, // PL 3 ** 46 ** D46
330	NOT_ON_TIMER	, // PL 2 ** 47 ** D47
331	NOT_ON_TIMER	, // PL 1 ** 48 ** D48
332	NOT_ON_TIMER	, // PL 0 ** 49 ** D49
333	NOT_ON_TIMER	, // PB 3 ** 50 ** SPI_MISO
334	NOT_ON_TIMER	, // PB 2 ** 51 ** SPI_MOSI
335	NOT_ON_TIMER	, // PB 1 ** 52 ** SPI_SCK
336	NOT_ON_TIMER	, // PB 0 ** 53 ** SPI_SS
337	NOT_ON_TIMER	, // PF 0 ** 54 ** A0
338	NOT_ON_TIMER	, // PF 1 ** 55 ** A1
339	NOT_ON_TIMER	, // PF 2 ** 56 ** A2
340	NOT_ON_TIMER	, // PF 3 ** 57 ** A3
341	NOT_ON_TIMER	, // PF 4 ** 58 ** A4
342	NOT_ON_TIMER	, // PF 5 ** 59 ** A5
343	NOT_ON_TIMER	, // PF 6 ** 60 ** A6
344	NOT_ON_TIMER	, // PF 7 ** 61 ** A7
345	NOT_ON_TIMER	, // PK 0 ** 62 ** A8
346	NOT_ON_TIMER	, // PK 1 ** 63 ** A9
347	NOT_ON_TIMER	, // PK 2 ** 64 ** A10
348	NOT_ON_TIMER	, // PK 3 ** 65 ** A11
349	NOT_ON_TIMER	, // PK 4 ** 66 ** A12
350	NOT_ON_TIMER	, // PK 5 ** 67 ** A13
351	NOT_ON_TIMER	, // PK 6 ** 68 ** A14
352	NOT_ON_TIMER	, // PK 7 ** 69 ** A15
353};
354#else
355// these arrays map port names (e.g. port B) to the
356// appropriate addresses for various functions (e.g. reading
357// and writing)
358const uint16_t PROGMEM port_to_mode_PGM[] = {
359	NOT_A_PORT,
360	NOT_A_PORT,
361	&DDRB,
362	&DDRC,
363	&DDRD,
364};
365
366const uint16_t PROGMEM port_to_output_PGM[] = {
367	NOT_A_PORT,
368	NOT_A_PORT,
369	&PORTB,
370	&PORTC,
371	&PORTD,
372};
373
374const uint16_t PROGMEM port_to_input_PGM[] = {
375	NOT_A_PORT,
376	NOT_A_PORT,
377	&PINB,
378	&PINC,
379	&PIND,
380};
381
382const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
383	PD, /* 0 */
384	PD,
385	PD,
386	PD,
387	PD,
388	PD,
389	PD,
390	PD,
391	PB, /* 8 */
392	PB,
393	PB,
394	PB,
395	PB,
396	PB,
397	PC, /* 14 */
398	PC,
399	PC,
400	PC,
401	PC,
402	PC,
403};
404
405const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
406	_BV(0), /* 0, port D */
407	_BV(1),
408	_BV(2),
409	_BV(3),
410	_BV(4),
411	_BV(5),
412	_BV(6),
413	_BV(7),
414	_BV(0), /* 8, port B */
415	_BV(1),
416	_BV(2),
417	_BV(3),
418	_BV(4),
419	_BV(5),
420	_BV(0), /* 14, port C */
421	_BV(1),
422	_BV(2),
423	_BV(3),
424	_BV(4),
425	_BV(5),
426};
427
428const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
429	NOT_ON_TIMER, /* 0 - port D */
430	NOT_ON_TIMER,
431	NOT_ON_TIMER,
432	// on the ATmega168, digital pin 3 has hardware pwm
433#if defined(__AVR_ATmega8__)
434	NOT_ON_TIMER,
435#else
436	TIMER2B,
437#endif
438	NOT_ON_TIMER,
439	// on the ATmega168, digital pins 5 and 6 have hardware pwm
440#if defined(__AVR_ATmega8__)
441	NOT_ON_TIMER,
442	NOT_ON_TIMER,
443#else
444	TIMER0B,
445	TIMER0A,
446#endif
447	NOT_ON_TIMER,
448	NOT_ON_TIMER, /* 8 - port B */
449	TIMER1A,
450	TIMER1B,
451#if defined(__AVR_ATmega8__)
452	TIMER2,
453#else
454	TIMER2A,
455#endif
456	NOT_ON_TIMER,
457	NOT_ON_TIMER,
458	NOT_ON_TIMER,
459	NOT_ON_TIMER, /* 14 - port C */
460	NOT_ON_TIMER,
461	NOT_ON_TIMER,
462	NOT_ON_TIMER,
463	NOT_ON_TIMER,
464};
465#endif
466