38 static inline __attribute__((always_inline))
40 return *portInputRegister(pin);
47 static inline __attribute__((always_inline))
50 *portSetRegister(pin) = 1;
52 *portClearRegister(pin) = 1;
61 static inline __attribute__((always_inline))
63 return g_APinDescription[pin].pPort->PIO_PDSR & g_APinDescription[pin].ulPin;
70 static inline __attribute__((always_inline))
73 g_APinDescription[pin].pPort->PIO_SODR = g_APinDescription[pin].ulPin;
75 g_APinDescription[pin].pPort->PIO_CODR = g_APinDescription[pin].ulPin;
84 inline void fastPinMode(uint8_t pin,
bool mode) {pinMode(pin, mode);}
87 #include <util/atomic.h>
94 volatile uint8_t*
ddr;
95 volatile uint8_t*
pin;
100 #if defined(__AVR_ATmega168__)\
101 ||defined(__AVR_ATmega168P__)\
102 ||defined(__AVR_ATmega328P__)
105 {&DDRD, &PIND, &PORTD, 0},
106 {&DDRD, &PIND, &PORTD, 1},
107 {&DDRD, &PIND, &PORTD, 2},
108 {&DDRD, &PIND, &PORTD, 3},
109 {&DDRD, &PIND, &PORTD, 4},
110 {&DDRD, &PIND, &PORTD, 5},
111 {&DDRD, &PIND, &PORTD, 6},
112 {&DDRD, &PIND, &PORTD, 7},
113 {&DDRB, &PINB, &PORTB, 0},
114 {&DDRB, &PINB, &PORTB, 1},
115 {&DDRB, &PINB, &PORTB, 2},
116 {&DDRB, &PINB, &PORTB, 3},
117 {&DDRB, &PINB, &PORTB, 4},
118 {&DDRB, &PINB, &PORTB, 5},
119 {&DDRC, &PINC, &PORTC, 0},
120 {&DDRC, &PINC, &PORTC, 1},
121 {&DDRC, &PINC, &PORTC, 2},
122 {&DDRC, &PINC, &PORTC, 3},
123 {&DDRC, &PINC, &PORTC, 4},
124 {&DDRC, &PINC, &PORTC, 5}
127 #elif defined(__AVR_ATmega1280__)\
128 || defined(__AVR_ATmega2560__)
131 {&DDRE, &PINE, &PORTE, 0},
132 {&DDRE, &PINE, &PORTE, 1},
133 {&DDRE, &PINE, &PORTE, 4},
134 {&DDRE, &PINE, &PORTE, 5},
135 {&DDRG, &PING, &PORTG, 5},
136 {&DDRE, &PINE, &PORTE, 3},
137 {&DDRH, &PINH, &PORTH, 3},
138 {&DDRH, &PINH, &PORTH, 4},
139 {&DDRH, &PINH, &PORTH, 5},
140 {&DDRH, &PINH, &PORTH, 6},
141 {&DDRB, &PINB, &PORTB, 4},
142 {&DDRB, &PINB, &PORTB, 5},
143 {&DDRB, &PINB, &PORTB, 6},
144 {&DDRB, &PINB, &PORTB, 7},
145 {&DDRJ, &PINJ, &PORTJ, 1},
146 {&DDRJ, &PINJ, &PORTJ, 0},
147 {&DDRH, &PINH, &PORTH, 1},
148 {&DDRH, &PINH, &PORTH, 0},
149 {&DDRD, &PIND, &PORTD, 3},
150 {&DDRD, &PIND, &PORTD, 2},
151 {&DDRD, &PIND, &PORTD, 1},
152 {&DDRD, &PIND, &PORTD, 0},
153 {&DDRA, &PINA, &PORTA, 0},
154 {&DDRA, &PINA, &PORTA, 1},
155 {&DDRA, &PINA, &PORTA, 2},
156 {&DDRA, &PINA, &PORTA, 3},
157 {&DDRA, &PINA, &PORTA, 4},
158 {&DDRA, &PINA, &PORTA, 5},
159 {&DDRA, &PINA, &PORTA, 6},
160 {&DDRA, &PINA, &PORTA, 7},
161 {&DDRC, &PINC, &PORTC, 7},
162 {&DDRC, &PINC, &PORTC, 6},
163 {&DDRC, &PINC, &PORTC, 5},
164 {&DDRC, &PINC, &PORTC, 4},
165 {&DDRC, &PINC, &PORTC, 3},
166 {&DDRC, &PINC, &PORTC, 2},
167 {&DDRC, &PINC, &PORTC, 1},
168 {&DDRC, &PINC, &PORTC, 0},
169 {&DDRD, &PIND, &PORTD, 7},
170 {&DDRG, &PING, &PORTG, 2},
171 {&DDRG, &PING, &PORTG, 1},
172 {&DDRG, &PING, &PORTG, 0},
173 {&DDRL, &PINL, &PORTL, 7},
174 {&DDRL, &PINL, &PORTL, 6},
175 {&DDRL, &PINL, &PORTL, 5},
176 {&DDRL, &PINL, &PORTL, 4},
177 {&DDRL, &PINL, &PORTL, 3},
178 {&DDRL, &PINL, &PORTL, 2},
179 {&DDRL, &PINL, &PORTL, 1},
180 {&DDRL, &PINL, &PORTL, 0},
181 {&DDRB, &PINB, &PORTB, 3},
182 {&DDRB, &PINB, &PORTB, 2},
183 {&DDRB, &PINB, &PORTB, 1},
184 {&DDRB, &PINB, &PORTB, 0},
185 {&DDRF, &PINF, &PORTF, 0},
186 {&DDRF, &PINF, &PORTF, 1},
187 {&DDRF, &PINF, &PORTF, 2},
188 {&DDRF, &PINF, &PORTF, 3},
189 {&DDRF, &PINF, &PORTF, 4},
190 {&DDRF, &PINF, &PORTF, 5},
191 {&DDRF, &PINF, &PORTF, 6},
192 {&DDRF, &PINF, &PORTF, 7},
193 {&DDRK, &PINK, &PORTK, 0},
194 {&DDRK, &PINK, &PORTK, 1},
195 {&DDRK, &PINK, &PORTK, 2},
196 {&DDRK, &PINK, &PORTK, 3},
197 {&DDRK, &PINK, &PORTK, 4},
198 {&DDRK, &PINK, &PORTK, 5},
199 {&DDRK, &PINK, &PORTK, 6},
200 {&DDRK, &PINK, &PORTK, 7}
203 #elif defined(__AVR_ATmega1284P__)\
204 || defined(__AVR_ATmega1284__)\
205 || defined(__AVR_ATmega644P__)\
206 || defined(__AVR_ATmega644__)\
207 || defined(__AVR_ATmega64__)\
208 || defined(__AVR_ATmega32__)\
209 || defined(__AVR_ATmega324__)\
210 || defined(__AVR_ATmega16__)
212 #ifdef defined(VARIANT_MIGHTY)
215 {&DDRB, &PINB, &PORTB, 0},
216 {&DDRB, &PINB, &PORTB, 1},
217 {&DDRB, &PINB, &PORTB, 2},
218 {&DDRB, &PINB, &PORTB, 3},
219 {&DDRB, &PINB, &PORTB, 4},
220 {&DDRB, &PINB, &PORTB, 5},
221 {&DDRB, &PINB, &PORTB, 6},
222 {&DDRB, &PINB, &PORTB, 7},
223 {&DDRD, &PIND, &PORTD, 0},
224 {&DDRD, &PIND, &PORTD, 1},
225 {&DDRD, &PIND, &PORTD, 2},
226 {&DDRD, &PIND, &PORTD, 3},
227 {&DDRD, &PIND, &PORTD, 4},
228 {&DDRD, &PIND, &PORTD, 5},
229 {&DDRD, &PIND, &PORTD, 6},
230 {&DDRD, &PIND, &PORTD, 7},
231 {&DDRC, &PINC, &PORTC, 0},
232 {&DDRC, &PINC, &PORTC, 1},
233 {&DDRC, &PINC, &PORTC, 2},
234 {&DDRC, &PINC, &PORTC, 3},
235 {&DDRC, &PINC, &PORTC, 4},
236 {&DDRC, &PINC, &PORTC, 5},
237 {&DDRC, &PINC, &PORTC, 6},
238 {&DDRC, &PINC, &PORTC, 7},
239 {&DDRA, &PINA, &PORTA, 0},
240 {&DDRA, &PINA, &PORTA, 1},
241 {&DDRA, &PINA, &PORTA, 2},
242 {&DDRA, &PINA, &PORTA, 3},
243 {&DDRA, &PINA, &PORTA, 4},
244 {&DDRA, &PINA, &PORTA, 5},
245 {&DDRA, &PINA, &PORTA, 6},
246 {&DDRA, &PINA, &PORTA, 7}
248 #elif defined(VARIANT_BOBUINO)
251 {&DDRD, &PIND, &PORTD, 0},
252 {&DDRD, &PIND, &PORTD, 1},
253 {&DDRD, &PIND, &PORTD, 2},
254 {&DDRD, &PIND, &PORTD, 3},
255 {&DDRB, &PINB, &PORTB, 0},
256 {&DDRB, &PINB, &PORTB, 1},
257 {&DDRB, &PINB, &PORTB, 2},
258 {&DDRB, &PINB, &PORTB, 3},
259 {&DDRD, &PIND, &PORTD, 5},
260 {&DDRD, &PIND, &PORTD, 6},
261 {&DDRB, &PINB, &PORTB, 4},
262 {&DDRB, &PINB, &PORTB, 5},
263 {&DDRB, &PINB, &PORTB, 6},
264 {&DDRB, &PINB, &PORTB, 7},
265 {&DDRA, &PINA, &PORTA, 7},
266 {&DDRA, &PINA, &PORTA, 6},
267 {&DDRA, &PINA, &PORTA, 5},
268 {&DDRA, &PINA, &PORTA, 4},
269 {&DDRA, &PINA, &PORTA, 3},
270 {&DDRA, &PINA, &PORTA, 2},
271 {&DDRA, &PINA, &PORTA, 1},
272 {&DDRA, &PINA, &PORTA, 0},
273 {&DDRC, &PINC, &PORTC, 0},
274 {&DDRC, &PINC, &PORTC, 1},
275 {&DDRC, &PINC, &PORTC, 2},
276 {&DDRC, &PINC, &PORTC, 3},
277 {&DDRC, &PINC, &PORTC, 4},
278 {&DDRC, &PINC, &PORTC, 5},
279 {&DDRC, &PINC, &PORTC, 6},
280 {&DDRC, &PINC, &PORTC, 7},
281 {&DDRD, &PIND, &PORTD, 4},
282 {&DDRD, &PIND, &PORTD, 7}
284 #elif defined(VARIANT_STANDARD)
287 {&DDRB, &PINB, &PORTB, 0},
288 {&DDRB, &PINB, &PORTB, 1},
289 {&DDRB, &PINB, &PORTB, 2},
290 {&DDRB, &PINB, &PORTB, 3},
291 {&DDRB, &PINB, &PORTB, 4},
292 {&DDRB, &PINB, &PORTB, 5},
293 {&DDRB, &PINB, &PORTB, 6},
294 {&DDRB, &PINB, &PORTB, 7},
295 {&DDRD, &PIND, &PORTD, 0},
296 {&DDRD, &PIND, &PORTD, 1},
297 {&DDRD, &PIND, &PORTD, 2},
298 {&DDRD, &PIND, &PORTD, 3},
299 {&DDRD, &PIND, &PORTD, 4},
300 {&DDRD, &PIND, &PORTD, 5},
301 {&DDRD, &PIND, &PORTD, 6},
302 {&DDRD, &PIND, &PORTD, 7},
303 {&DDRC, &PINC, &PORTC, 0},
304 {&DDRC, &PINC, &PORTC, 1},
305 {&DDRC, &PINC, &PORTC, 2},
306 {&DDRC, &PINC, &PORTC, 3},
307 {&DDRC, &PINC, &PORTC, 4},
308 {&DDRC, &PINC, &PORTC, 5},
309 {&DDRC, &PINC, &PORTC, 6},
310 {&DDRC, &PINC, &PORTC, 7},
311 {&DDRA, &PINA, &PORTA, 7},
312 {&DDRA, &PINA, &PORTA, 6},
313 {&DDRA, &PINA, &PORTA, 5},
314 {&DDRA, &PINA, &PORTA, 4},
315 {&DDRA, &PINA, &PORTA, 3},
316 {&DDRA, &PINA, &PORTA, 2},
317 {&DDRA, &PINA, &PORTA, 1},
318 {&DDRA, &PINA, &PORTA, 0}
320 #else // VARIANT_MIGHTY
321 #error Undefined variant 1284, 644, 324, 64, 32
322 #endif // VARIANT_MIGHTY
324 #elif defined(__AVR_ATmega32U4__)
328 {&DDRB, &PINB, &PORTB, 0},
329 {&DDRB, &PINB, &PORTB, 1},
330 {&DDRB, &PINB, &PORTB, 2},
331 {&DDRB, &PINB, &PORTB, 3},
332 {&DDRB, &PINB, &PORTB, 7},
333 {&DDRD, &PIND, &PORTD, 0},
334 {&DDRD, &PIND, &PORTD, 1},
335 {&DDRD, &PIND, &PORTD, 2},
336 {&DDRD, &PIND, &PORTD, 3},
337 {&DDRC, &PINC, &PORTC, 6},
338 {&DDRC, &PINC, &PORTC, 7},
339 {&DDRD, &PIND, &PORTD, 6},
340 {&DDRD, &PIND, &PORTD, 7},
341 {&DDRB, &PINB, &PORTB, 4},
342 {&DDRB, &PINB, &PORTB, 5},
343 {&DDRB, &PINB, &PORTB, 6},
344 {&DDRF, &PINF, &PORTF, 7},
345 {&DDRF, &PINF, &PORTF, 6},
346 {&DDRF, &PINF, &PORTF, 5},
347 {&DDRF, &PINF, &PORTF, 4},
348 {&DDRF, &PINF, &PORTF, 1},
349 {&DDRF, &PINF, &PORTF, 0},
350 {&DDRD, &PIND, &PORTD, 4},
351 {&DDRD, &PIND, &PORTD, 5},
352 {&DDRE, &PINE, &PORTE, 6}
358 {&DDRD, &PIND, &PORTD, 2},
359 {&DDRD, &PIND, &PORTD, 3},
360 {&DDRD, &PIND, &PORTD, 1},
361 {&DDRD, &PIND, &PORTD, 0},
362 {&DDRD, &PIND, &PORTD, 4},
363 {&DDRC, &PINC, &PORTC, 6},
364 {&DDRD, &PIND, &PORTD, 7},
365 {&DDRE, &PINE, &PORTE, 6},
366 {&DDRB, &PINB, &PORTB, 4},
367 {&DDRB, &PINB, &PORTB, 5},
368 {&DDRB, &PINB, &PORTB, 6},
369 {&DDRB, &PINB, &PORTB, 7},
370 {&DDRD, &PIND, &PORTD, 6},
371 {&DDRC, &PINC, &PORTC, 7},
372 {&DDRB, &PINB, &PORTB, 3},
373 {&DDRB, &PINB, &PORTB, 1},
374 {&DDRB, &PINB, &PORTB, 2},
375 {&DDRB, &PINB, &PORTB, 0},
376 {&DDRF, &PINF, &PORTF, 7},
377 {&DDRF, &PINF, &PORTF, 6},
378 {&DDRF, &PINF, &PORTF, 5},
379 {&DDRF, &PINF, &PORTF, 4},
380 {&DDRF, &PINF, &PORTF, 1},
381 {&DDRF, &PINF, &PORTF, 0},
382 {&DDRD, &PIND, &PORTD, 4},
383 {&DDRD, &PIND, &PORTD, 7},
384 {&DDRB, &PINB, &PORTB, 4},
385 {&DDRB, &PINB, &PORTB, 5},
386 {&DDRB, &PINB, &PORTB, 6},
387 {&DDRD, &PIND, &PORTD, 6}
389 #endif // CORE_TEENSY
391 #elif defined(__AVR_AT90USB646__)\
392 || defined(__AVR_AT90USB1286__)
395 {&DDRD, &PIND, &PORTD, 0},
396 {&DDRD, &PIND, &PORTD, 1},
397 {&DDRD, &PIND, &PORTD, 2},
398 {&DDRD, &PIND, &PORTD, 3},
399 {&DDRD, &PIND, &PORTD, 4},
400 {&DDRD, &PIND, &PORTD, 5},
401 {&DDRD, &PIND, &PORTD, 6},
402 {&DDRD, &PIND, &PORTD, 7},
403 {&DDRE, &PINE, &PORTE, 0},
404 {&DDRE, &PINE, &PORTE, 1},
405 {&DDRC, &PINC, &PORTC, 0},
406 {&DDRC, &PINC, &PORTC, 1},
407 {&DDRC, &PINC, &PORTC, 2},
408 {&DDRC, &PINC, &PORTC, 3},
409 {&DDRC, &PINC, &PORTC, 4},
410 {&DDRC, &PINC, &PORTC, 5},
411 {&DDRC, &PINC, &PORTC, 6},
412 {&DDRC, &PINC, &PORTC, 7},
413 {&DDRE, &PINE, &PORTE, 6},
414 {&DDRE, &PINE, &PORTE, 7},
415 {&DDRB, &PINB, &PORTB, 0},
416 {&DDRB, &PINB, &PORTB, 1},
417 {&DDRB, &PINB, &PORTB, 2},
418 {&DDRB, &PINB, &PORTB, 3},
419 {&DDRB, &PINB, &PORTB, 4},
420 {&DDRB, &PINB, &PORTB, 5},
421 {&DDRB, &PINB, &PORTB, 6},
422 {&DDRB, &PINB, &PORTB, 7},
423 {&DDRA, &PINA, &PORTA, 0},
424 {&DDRA, &PINA, &PORTA, 1},
425 {&DDRA, &PINA, &PORTA, 2},
426 {&DDRA, &PINA, &PORTA, 3},
427 {&DDRA, &PINA, &PORTA, 4},
428 {&DDRA, &PINA, &PORTA, 5},
429 {&DDRA, &PINA, &PORTA, 6},
430 {&DDRA, &PINA, &PORTA, 7},
431 {&DDRE, &PINE, &PORTE, 4},
432 {&DDRE, &PINE, &PORTE, 5},
433 {&DDRF, &PINF, &PORTF, 0},
434 {&DDRF, &PINF, &PORTF, 1},
435 {&DDRF, &PINF, &PORTF, 2},
436 {&DDRF, &PINF, &PORTF, 3},
437 {&DDRF, &PINF, &PORTF, 4},
438 {&DDRF, &PINF, &PORTF, 5},
439 {&DDRF, &PINF, &PORTF, 6},
440 {&DDRF, &PINF, &PORTF, 7}
444 #error unknown CPU type
452 __attribute__((error("Pin number is too large or not a constant")));
457 static inline __attribute__((always_inline))
459 if (!__builtin_constant_p(pin) || pin >= digitalPinCount) {
469 static inline __attribute__((always_inline))
472 if (address > (uint8_t*)0X5F) {
477 *address |= 1 << bit;
479 *address &= ~(1 << bit);
481 if (address > (uint8_t*)0X5F) {
490 static inline __attribute__((always_inline))
493 return (*pinMap[pin].pin >> pinMap[pin].bit) & 1;
502 static inline __attribute__((always_inline))
505 if (pinMap[pin].pin > (uint8_t*)0X5F) {
507 *pinMap[pin].
pin = 1 << pinMap[pin].
bit;
510 *pinMap[pin].
pin |= 1 << pinMap[pin].
bit;
518 static inline __attribute__((always_inline))
530 static inline __attribute__((always_inline))
544 static inline __attribute__((always_inline))
554 template<u
int8_t PinNumber>
591 inline operator bool () const __attribute__((always_inline)) {
600 inline __attribute__((always_inline))
608 inline __attribute__((always_inline))
614 inline __attribute__((always_inline))
623 inline __attribute__((always_inline))
629 inline __attribute__((always_inline))
639 inline __attribute__((always_inline))
648 inline __attribute__((always_inline))
653 #endif // DigitalPin_h
static const uint8_t digitalPinCount
DigitalPin & operator=(bool value)
static void fastBitWriteSafe(volatile uint8_t *address, uint8_t bit, bool level)
void config(bool mode, bool level)
static void fastPinMode(uint8_t pin, bool mode)
DigitalPin(bool mode, bool level)
static void fastDigitalWrite(uint8_t pin, bool level)
static bool fastDigitalRead(uint8_t pin)
static void fastDigitalToggle(uint8_t pin)
static void badPinCheck(uint8_t pin)
static void fastPinConfig(uint8_t pin, bool mode, bool level)
struct for mapping digital pins