20 #if defined(__arm__) // Arduino Due Board follows
27 uint8_t
const SS_PIN = SS;
28 uint8_t
const MOSI_PIN = MOSI;
29 uint8_t
const MISO_PIN = MISO;
30 uint8_t
const SCK_PIN = SCK;
34 #elif defined(__AVR__) // Other AVR based Boards follows
44 volatile uint8_t* ddr;
45 volatile uint8_t* pin;
46 volatile uint8_t* port;
50 #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
54 uint8_t
const SDA_PIN = 20;
55 uint8_t
const SCL_PIN = 21;
58 uint8_t
const SS_PIN = 53;
59 uint8_t
const MOSI_PIN = 51;
60 uint8_t
const MISO_PIN = 50;
61 uint8_t
const SCK_PIN = 52;
63 static const pin_map_t digitalPinMap[] = {
64 {&DDRE, &PINE, &PORTE, 0},
65 {&DDRE, &PINE, &PORTE, 1},
66 {&DDRE, &PINE, &PORTE, 4},
67 {&DDRE, &PINE, &PORTE, 5},
68 {&DDRG, &PING, &PORTG, 5},
69 {&DDRE, &PINE, &PORTE, 3},
70 {&DDRH, &PINH, &PORTH, 3},
71 {&DDRH, &PINH, &PORTH, 4},
72 {&DDRH, &PINH, &PORTH, 5},
73 {&DDRH, &PINH, &PORTH, 6},
74 {&DDRB, &PINB, &PORTB, 4},
75 {&DDRB, &PINB, &PORTB, 5},
76 {&DDRB, &PINB, &PORTB, 6},
77 {&DDRB, &PINB, &PORTB, 7},
78 {&DDRJ, &PINJ, &PORTJ, 1},
79 {&DDRJ, &PINJ, &PORTJ, 0},
80 {&DDRH, &PINH, &PORTH, 1},
81 {&DDRH, &PINH, &PORTH, 0},
82 {&DDRD, &PIND, &PORTD, 3},
83 {&DDRD, &PIND, &PORTD, 2},
84 {&DDRD, &PIND, &PORTD, 1},
85 {&DDRD, &PIND, &PORTD, 0},
86 {&DDRA, &PINA, &PORTA, 0},
87 {&DDRA, &PINA, &PORTA, 1},
88 {&DDRA, &PINA, &PORTA, 2},
89 {&DDRA, &PINA, &PORTA, 3},
90 {&DDRA, &PINA, &PORTA, 4},
91 {&DDRA, &PINA, &PORTA, 5},
92 {&DDRA, &PINA, &PORTA, 6},
93 {&DDRA, &PINA, &PORTA, 7},
94 {&DDRC, &PINC, &PORTC, 7},
95 {&DDRC, &PINC, &PORTC, 6},
96 {&DDRC, &PINC, &PORTC, 5},
97 {&DDRC, &PINC, &PORTC, 4},
98 {&DDRC, &PINC, &PORTC, 3},
99 {&DDRC, &PINC, &PORTC, 2},
100 {&DDRC, &PINC, &PORTC, 1},
101 {&DDRC, &PINC, &PORTC, 0},
102 {&DDRD, &PIND, &PORTD, 7},
103 {&DDRG, &PING, &PORTG, 2},
104 {&DDRG, &PING, &PORTG, 1},
105 {&DDRG, &PING, &PORTG, 0},
106 {&DDRL, &PINL, &PORTL, 7},
107 {&DDRL, &PINL, &PORTL, 6},
108 {&DDRL, &PINL, &PORTL, 5},
109 {&DDRL, &PINL, &PORTL, 4},
110 {&DDRL, &PINL, &PORTL, 3},
111 {&DDRL, &PINL, &PORTL, 2},
112 {&DDRL, &PINL, &PORTL, 1},
113 {&DDRL, &PINL, &PORTL, 0},
114 {&DDRB, &PINB, &PORTB, 3},
115 {&DDRB, &PINB, &PORTB, 2},
116 {&DDRB, &PINB, &PORTB, 1},
117 {&DDRB, &PINB, &PORTB, 0},
118 {&DDRF, &PINF, &PORTF, 0},
119 {&DDRF, &PINF, &PORTF, 1},
120 {&DDRF, &PINF, &PORTF, 2},
121 {&DDRF, &PINF, &PORTF, 3},
122 {&DDRF, &PINF, &PORTF, 4},
123 {&DDRF, &PINF, &PORTF, 5},
124 {&DDRF, &PINF, &PORTF, 6},
125 {&DDRF, &PINF, &PORTF, 7},
126 {&DDRK, &PINK, &PORTK, 0},
127 {&DDRK, &PINK, &PORTK, 1},
128 {&DDRK, &PINK, &PORTK, 2},
129 {&DDRK, &PINK, &PORTK, 3},
130 {&DDRK, &PINK, &PORTK, 4},
131 {&DDRK, &PINK, &PORTK, 5},
132 {&DDRK, &PINK, &PORTK, 6},
133 {&DDRK, &PINK, &PORTK, 7}
136 #elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__)
140 uint8_t
const SDA_PIN = 17;
141 uint8_t
const SCL_PIN = 18;
144 uint8_t
const SS_PIN = 4;
145 uint8_t
const MOSI_PIN = 5;
146 uint8_t
const MISO_PIN = 6;
147 uint8_t
const SCK_PIN = 7;
149 static const pin_map_t digitalPinMap[] = {
150 {&DDRB, &PINB, &PORTB, 0},
151 {&DDRB, &PINB, &PORTB, 1},
152 {&DDRB, &PINB, &PORTB, 2},
153 {&DDRB, &PINB, &PORTB, 3},
154 {&DDRB, &PINB, &PORTB, 4},
155 {&DDRB, &PINB, &PORTB, 5},
156 {&DDRB, &PINB, &PORTB, 6},
157 {&DDRB, &PINB, &PORTB, 7},
158 {&DDRD, &PIND, &PORTD, 0},
159 {&DDRD, &PIND, &PORTD, 1},
160 {&DDRD, &PIND, &PORTD, 2},
161 {&DDRD, &PIND, &PORTD, 3},
162 {&DDRD, &PIND, &PORTD, 4},
163 {&DDRD, &PIND, &PORTD, 5},
164 {&DDRD, &PIND, &PORTD, 6},
165 {&DDRD, &PIND, &PORTD, 7},
166 {&DDRC, &PINC, &PORTC, 0},
167 {&DDRC, &PINC, &PORTC, 1},
168 {&DDRC, &PINC, &PORTC, 2},
169 {&DDRC, &PINC, &PORTC, 3},
170 {&DDRC, &PINC, &PORTC, 4},
171 {&DDRC, &PINC, &PORTC, 5},
172 {&DDRC, &PINC, &PORTC, 6},
173 {&DDRC, &PINC, &PORTC, 7},
174 {&DDRA, &PINA, &PORTA, 7},
175 {&DDRA, &PINA, &PORTA, 6},
176 {&DDRA, &PINA, &PORTA, 5},
177 {&DDRA, &PINA, &PORTA, 4},
178 {&DDRA, &PINA, &PORTA, 3},
179 {&DDRA, &PINA, &PORTA, 2},
180 {&DDRA, &PINA, &PORTA, 1},
181 {&DDRA, &PINA, &PORTA, 0}
184 #elif defined(__AVR_ATmega32U4__)
188 uint8_t
const SDA_PIN = 2;
189 uint8_t
const SCL_PIN = 3;
192 uint8_t
const SS_PIN = 17;
193 uint8_t
const MOSI_PIN = 16;
194 uint8_t
const MISO_PIN = 14;
195 uint8_t
const SCK_PIN = 15;
197 static const pin_map_t digitalPinMap[] = {
198 {&DDRD, &PIND, &PORTD, 2},
199 {&DDRD, &PIND, &PORTD, 3},
200 {&DDRD, &PIND, &PORTD, 1},
201 {&DDRD, &PIND, &PORTD, 0},
202 {&DDRD, &PIND, &PORTD, 4},
203 {&DDRC, &PINC, &PORTC, 6},
204 {&DDRD, &PIND, &PORTD, 7},
205 {&DDRE, &PINE, &PORTE, 6},
206 {&DDRB, &PINB, &PORTB, 4},
207 {&DDRB, &PINB, &PORTB, 5},
208 {&DDRB, &PINB, &PORTB, 6},
209 {&DDRB, &PINB, &PORTB, 7},
210 {&DDRD, &PIND, &PORTD, 6},
211 {&DDRC, &PINC, &PORTC, 7},
212 {&DDRB, &PINB, &PORTB, 3},
213 {&DDRB, &PINB, &PORTB, 1},
214 {&DDRB, &PINB, &PORTB, 2},
215 {&DDRB, &PINB, &PORTB, 0},
216 {&DDRF, &PINF, &PORTF, 7},
217 {&DDRF, &PINF, &PORTF, 6},
218 {&DDRF, &PINF, &PORTF, 5},
219 {&DDRF, &PINF, &PORTF, 4},
220 {&DDRF, &PINF, &PORTF, 1},
221 {&DDRF, &PINF, &PORTF, 0},
224 #elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
228 uint8_t
const SDA_PIN = 1;
229 uint8_t
const SCL_PIN = 0;
232 uint8_t
const SS_PIN = 20;
233 uint8_t
const MOSI_PIN = 22;
234 uint8_t
const MISO_PIN = 23;
235 uint8_t
const SCK_PIN = 21;
237 static const pin_map_t digitalPinMap[] = {
238 {&DDRD, &PIND, &PORTD, 0},
239 {&DDRD, &PIND, &PORTD, 1},
240 {&DDRD, &PIND, &PORTD, 2},
241 {&DDRD, &PIND, &PORTD, 3},
242 {&DDRD, &PIND, &PORTD, 4},
243 {&DDRD, &PIND, &PORTD, 5},
244 {&DDRD, &PIND, &PORTD, 6},
245 {&DDRD, &PIND, &PORTD, 7},
246 {&DDRE, &PINE, &PORTE, 0},
247 {&DDRE, &PINE, &PORTE, 1},
248 {&DDRC, &PINC, &PORTC, 0},
249 {&DDRC, &PINC, &PORTC, 1},
250 {&DDRC, &PINC, &PORTC, 2},
251 {&DDRC, &PINC, &PORTC, 3},
252 {&DDRC, &PINC, &PORTC, 4},
253 {&DDRC, &PINC, &PORTC, 5},
254 {&DDRC, &PINC, &PORTC, 6},
255 {&DDRC, &PINC, &PORTC, 7},
256 {&DDRE, &PINE, &PORTE, 6},
257 {&DDRE, &PINE, &PORTE, 7},
258 {&DDRB, &PINB, &PORTB, 0},
259 {&DDRB, &PINB, &PORTB, 1},
260 {&DDRB, &PINB, &PORTB, 2},
261 {&DDRB, &PINB, &PORTB, 3},
262 {&DDRB, &PINB, &PORTB, 4},
263 {&DDRB, &PINB, &PORTB, 5},
264 {&DDRB, &PINB, &PORTB, 6},
265 {&DDRB, &PINB, &PORTB, 7},
266 {&DDRA, &PINA, &PORTA, 0},
267 {&DDRA, &PINA, &PORTA, 1},
268 {&DDRA, &PINA, &PORTA, 2},
269 {&DDRA, &PINA, &PORTA, 3},
270 {&DDRA, &PINA, &PORTA, 4},
271 {&DDRA, &PINA, &PORTA, 5},
272 {&DDRA, &PINA, &PORTA, 6},
273 {&DDRA, &PINA, &PORTA, 7},
274 {&DDRE, &PINE, &PORTE, 4},
275 {&DDRE, &PINE, &PORTE, 5},
276 {&DDRF, &PINF, &PORTF, 0},
277 {&DDRF, &PINF, &PORTF, 1},
278 {&DDRF, &PINF, &PORTF, 2},
279 {&DDRF, &PINF, &PORTF, 3},
280 {&DDRF, &PINF, &PORTF, 4},
281 {&DDRF, &PINF, &PORTF, 5},
282 {&DDRF, &PINF, &PORTF, 6},
283 {&DDRF, &PINF, &PORTF, 7}
286 #else // defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
290 uint8_t
const SDA_PIN = 18;
291 uint8_t
const SCL_PIN = 19;
294 uint8_t
const SS_PIN = 10;
295 uint8_t
const MOSI_PIN = 11;
296 uint8_t
const MISO_PIN = 12;
297 uint8_t
const SCK_PIN = 13;
299 static const pin_map_t digitalPinMap[] = {
300 {&DDRD, &PIND, &PORTD, 0},
301 {&DDRD, &PIND, &PORTD, 1},
302 {&DDRD, &PIND, &PORTD, 2},
303 {&DDRD, &PIND, &PORTD, 3},
304 {&DDRD, &PIND, &PORTD, 4},
305 {&DDRD, &PIND, &PORTD, 5},
306 {&DDRD, &PIND, &PORTD, 6},
307 {&DDRD, &PIND, &PORTD, 7},
308 {&DDRB, &PINB, &PORTB, 0},
309 {&DDRB, &PINB, &PORTB, 1},
310 {&DDRB, &PINB, &PORTB, 2},
311 {&DDRB, &PINB, &PORTB, 3},
312 {&DDRB, &PINB, &PORTB, 4},
313 {&DDRB, &PINB, &PORTB, 5},
314 {&DDRC, &PINC, &PORTC, 0},
315 {&DDRC, &PINC, &PORTC, 1},
316 {&DDRC, &PINC, &PORTC, 2},
317 {&DDRC, &PINC, &PORTC, 3},
318 {&DDRC, &PINC, &PORTC, 4},
319 {&DDRC, &PINC, &PORTC, 5}
321 #endif // defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
323 static const uint8_t digitalPinCount =
sizeof(digitalPinMap)/
sizeof(pin_map_t);
325 uint8_t badPinNumber(
void)
326 __attribute__((error("Pin number is too large or not a constant")));
328 static inline __attribute__((always_inline))
329 uint8_t getPinMode(uint8_t pin) {
330 if (__builtin_constant_p(pin) && pin < digitalPinCount) {
331 return (*digitalPinMap[pin].ddr >> digitalPinMap[pin].bit) & 1;
333 return badPinNumber();
336 static inline __attribute__((always_inline))
337 void setPinMode(uint8_t pin, uint8_t mode) {
338 if (__builtin_constant_p(pin) && pin < digitalPinCount) {
340 *digitalPinMap[pin].ddr |= 1 << digitalPinMap[pin].bit;
342 *digitalPinMap[pin].ddr &= ~(1 << digitalPinMap[pin].bit);
348 static inline __attribute__((always_inline))
349 uint8_t fastDigitalRead(uint8_t pin) {
350 if (__builtin_constant_p(pin) && pin < digitalPinCount) {
351 return (*digitalPinMap[pin].pin >> digitalPinMap[pin].bit) & 1;
353 return badPinNumber();
356 static inline __attribute__((always_inline))
357 void fastDigitalWrite(uint8_t pin, uint8_t value) {
358 if (__builtin_constant_p(pin) && pin < digitalPinCount) {
360 *digitalPinMap[pin].port |= 1 << digitalPinMap[pin].bit;
362 *digitalPinMap[pin].port &= ~(1 << digitalPinMap[pin].bit);
368 #endif // Sd2PinMap_h
371 #error Architecture or board not supported.