USB Host Shield 2.0
avrpins.h
Go to the documentation of this file.
1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
2 
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2 of the License, or
6 (at your option) any later version.
7 
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12 
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software
15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 
17 Contact information
18 -------------------
19 
20 Circuits At Home, LTD
21 Web : http://www.circuitsathome.com
22 e-mail : support@circuitsathome.com
23  */
24 
25 /* derived from Konstantin Chizhov's AVR port templates */
26 
27 #if !defined(_usb_h_) || defined(_avrpins_h_)
28 #error "Never include avrpins.h directly; include Usb.h instead"
29 #else
30 #define _avrpins_h_
31 
32 #if defined(__AVR__)
33 
34 // pointers are 16 bits on AVR
35 #define pgm_read_pointer(p) pgm_read_word(p)
36 
37 // Support for these boards needs to be manually activated in settings.h or in a makefile
38 #if !defined(BOARD_MEGA_ADK) && defined(__AVR_ATmega2560__) && (USE_UHS_MEGA_ADK || defined(ARDUINO_AVR_ADK))
39 #define BOARD_MEGA_ADK
40 #elif !defined(BOARD_BLACK_WIDDOW) && USE_UHS_BLACK_WIDDOW
41 #define BOARD_BLACK_WIDDOW
42 #endif
43 
44 #ifdef PORTA
45 #define USE_PORTA
46 #endif
47 #ifdef PORTB
48 #define USE_PORTB
49 #endif
50 #ifdef PORTC
51 #define USE_PORTC
52 #endif
53 #ifdef PORTD
54 #define USE_PORTD
55 #endif
56 #ifdef PORTE
57 #define USE_PORTE
58 #endif
59 #ifdef PORTF
60 #define USE_PORTF
61 #endif
62 #ifdef PORTG
63 #define USE_PORTG
64 #endif
65 #ifdef PORTH
66 #define USE_PORTH
67 #endif
68 #ifdef PORTJ
69 #define USE_PORTJ
70 #endif
71 #ifdef PORTK
72 #define USE_PORTK
73 #endif
74 #ifdef PORTL
75 #define USE_PORTL
76 #endif
77 #ifdef PORTQ
78 #define USE_PORTQ
79 #endif
80 #ifdef PORTR
81 #define USE_PORTR
82 #endif
83 
84 #ifdef TCCR0A
85 #define USE_TCCR0A
86 #endif
87 #ifdef TCCR1A
88 #define USE_TCCR1A
89 #endif
90 #ifdef TCCR2A
91 #define USE_TCCR2A
92 #endif
93 
94 //Port definitions for AtTiny, AtMega families.
95 
96 #define MAKE_PORT(portName, ddrName, pinName, className, ID) \
97  class className{\
98  public:\
99  typedef uint8_t DataT;\
100  public:\
101  static void Write(DataT value){portName = value;}\
102  static void ClearAndSet(DataT clearMask, DataT value){portName = (portName & ~clearMask) | value;}\
103  static DataT Read(){return portName;}\
104  static void DirWrite(DataT value){ddrName = value;}\
105  static DataT DirRead(){return ddrName;}\
106  static void Set(DataT value){portName |= value;}\
107  static void Clear(DataT value){portName &= ~value;}\
108  static void Toggle(DataT value){portName ^= value;}\
109  static void DirSet(DataT value){ddrName |= value;}\
110  static void DirClear(DataT value){ddrName &= ~value;}\
111  static void DirToggle(DataT value){ddrName ^= value;}\
112  static DataT PinRead(){return pinName;}\
113  enum{Id = ID};\
114  enum{Width=sizeof(DataT)*8};\
115  };
116 
117 // TCCR registers to set/clear Arduino PWM
118 #define MAKE_TCCR(TccrName, className) \
119  class className{\
120  public:\
121  typedef uint8_t DataT;\
122  public:\
123  static void Write(DataT value){TccrName = value;}\
124  static void ClearAndSet(DataT clearMask, DataT value){TccrName = (TccrName & ~clearMask) | value;}\
125  static DataT Read(){return TccrName;}\
126  static void Set(DataT value){TccrName |= value;}\
127  static void Clear(DataT value){TccrName &= ~value;}\
128  static void Toggle(DataT value){TccrName ^= value;}\
129  enum{Width=sizeof(DataT)*8};\
130  };
131 
132 #ifdef USE_PORTA
133 
134 MAKE_PORT(PORTA, DDRA, PINA, Porta, 'A')
135 #endif
136 #ifdef USE_PORTB
137 MAKE_PORT(PORTB, DDRB, PINB, Portb, 'B')
138 #endif
139 #ifdef USE_PORTC
140 MAKE_PORT(PORTC, DDRC, PINC, Portc, 'C')
141 #endif
142 #ifdef USE_PORTD
143 MAKE_PORT(PORTD, DDRD, PIND, Portd, 'D')
144 #endif
145 #ifdef USE_PORTE
146 MAKE_PORT(PORTE, DDRE, PINE, Porte, 'E')
147 #endif
148 #ifdef USE_PORTF
149 MAKE_PORT(PORTF, DDRF, PINF, Portf, 'F')
150 #endif
151 #ifdef USE_PORTG
152 MAKE_PORT(PORTG, DDRG, PING, Portg, 'G')
153 #endif
154 #ifdef USE_PORTH
155 MAKE_PORT(PORTH, DDRH, PINH, Porth, 'H')
156 #endif
157 #ifdef USE_PORTJ
158 MAKE_PORT(PORTJ, DDRJ, PINJ, Portj, 'J')
159 #endif
160 #ifdef USE_PORTK
161 MAKE_PORT(PORTK, DDRK, PINK, Portk, 'K')
162 #endif
163 #ifdef USE_PORTL
164 MAKE_PORT(PORTL, DDRL, PINL, Portl, 'L')
165 #endif
166 #ifdef USE_PORTQ
167 MAKE_PORT(PORTQ, DDRQ, PINQ, Portq, 'Q')
168 #endif
169 #ifdef USE_PORTR
170 MAKE_PORT(PORTR, DDRR, PINR, Portr, 'R')
171 #endif
172 
173 #ifdef USE_TCCR0A
174 MAKE_TCCR(TCCR0A, Tccr0a)
175 #endif
176 #ifdef USE_TCCR1A
177 MAKE_TCCR(TCCR1A, Tccr1a)
178 #endif
179 #ifdef USE_TCCR2A
180 MAKE_TCCR(TCCR2A, Tccr2a)
181 #endif
182 
183 // this class represents one pin in a IO port.
184 // It is fully static.
185 template<typename PORT, uint8_t PIN>
186 class TPin {
187  // BOOST_STATIC_ASSERT(PIN < PORT::Width);
188 public:
189  typedef PORT Port;
190 
191  enum {
192  Number = PIN
193  };
194 
195  static void Set() {
196  PORT::Set(1 << PIN);
197  }
198 
199  static void Set(uint8_t val) {
200  if(val)
201  Set();
202  else Clear();
203  }
204 
205  static void SetDir(uint8_t val) {
206  if(val)
207  SetDirWrite();
208  else SetDirRead();
209  }
210 
211  static void Clear() {
212  PORT::Clear(1 << PIN);
213  }
214 
215  static void Toggle() {
216  PORT::Toggle(1 << PIN);
217  }
218 
219  static void SetDirRead() {
220  PORT::DirClear(1 << PIN);
221  }
222 
223  static void SetDirWrite() {
224  PORT::DirSet(1 << PIN);
225  }
226 
227  static uint8_t IsSet() {
228  return PORT::PinRead() & (uint8_t)(1 << PIN);
229  }
230 
231  static void WaiteForSet() {
232  while(IsSet() == 0) {
233  }
234  }
235 
236  static void WaiteForClear() {
237  while(IsSet()) {
238  }
239  }
240 }; //class TPin...
241 
242 // this class represents one bit in TCCR port.
243 // used to set/clear TCCRx bits
244 // It is fully static.
245 
246 template<typename TCCR, uint8_t COM>
247 class TCom {
248  // BOOST_STATIC_ASSERT(PIN < PORT::Width);
249 public:
250  typedef TCCR Tccr;
251 
252  enum {
253  Com = COM
254  };
255 
256  static void Set() {
257  TCCR::Set(1 << COM);
258  }
259 
260  static void Clear() {
261  TCCR::Clear(1 << COM);
262  }
263 
264  static void Toggle() {
265  TCCR::Toggle(1 << COM);
266  }
267 }; //class TCom...
268 
269 //Short pin definitions
270 #ifdef USE_PORTA
271 typedef TPin<Porta, 0 > Pa0;
272 typedef TPin<Porta, 1 > Pa1;
273 typedef TPin<Porta, 2 > Pa2;
274 typedef TPin<Porta, 3 > Pa3;
275 typedef TPin<Porta, 4 > Pa4;
276 typedef TPin<Porta, 5 > Pa5;
277 typedef TPin<Porta, 6 > Pa6;
278 typedef TPin<Porta, 7 > Pa7;
279 #endif
280 
281 #ifdef USE_PORTB
282 typedef TPin<Portb, 0 > Pb0;
283 typedef TPin<Portb, 1 > Pb1;
284 typedef TPin<Portb, 2 > Pb2;
285 typedef TPin<Portb, 3 > Pb3;
286 typedef TPin<Portb, 4 > Pb4;
287 typedef TPin<Portb, 5 > Pb5;
288 typedef TPin<Portb, 6 > Pb6;
289 typedef TPin<Portb, 7 > Pb7;
290 #endif
291 
292 #ifdef USE_PORTC
293 typedef TPin<Portc, 0 > Pc0;
294 typedef TPin<Portc, 1 > Pc1;
295 typedef TPin<Portc, 2 > Pc2;
296 typedef TPin<Portc, 3 > Pc3;
297 typedef TPin<Portc, 4 > Pc4;
298 typedef TPin<Portc, 5 > Pc5;
299 typedef TPin<Portc, 6 > Pc6;
300 typedef TPin<Portc, 7 > Pc7;
301 #endif
302 
303 #ifdef USE_PORTD
304 typedef TPin<Portd, 0 > Pd0;
305 typedef TPin<Portd, 1 > Pd1;
306 typedef TPin<Portd, 2 > Pd2;
307 typedef TPin<Portd, 3 > Pd3;
308 typedef TPin<Portd, 4 > Pd4;
309 typedef TPin<Portd, 5 > Pd5;
310 typedef TPin<Portd, 6 > Pd6;
311 typedef TPin<Portd, 7 > Pd7;
312 #endif
313 
314 #ifdef USE_PORTE
315 typedef TPin<Porte, 0 > Pe0;
316 typedef TPin<Porte, 1 > Pe1;
317 typedef TPin<Porte, 2 > Pe2;
318 typedef TPin<Porte, 3 > Pe3;
319 typedef TPin<Porte, 4 > Pe4;
320 typedef TPin<Porte, 5 > Pe5;
321 typedef TPin<Porte, 6 > Pe6;
322 typedef TPin<Porte, 7 > Pe7;
323 #endif
324 
325 #ifdef USE_PORTF
326 typedef TPin<Portf, 0 > Pf0;
327 typedef TPin<Portf, 1 > Pf1;
328 typedef TPin<Portf, 2 > Pf2;
329 typedef TPin<Portf, 3 > Pf3;
330 typedef TPin<Portf, 4 > Pf4;
331 typedef TPin<Portf, 5 > Pf5;
332 typedef TPin<Portf, 6 > Pf6;
333 typedef TPin<Portf, 7 > Pf7;
334 #endif
335 
336 #ifdef USE_PORTG
337 typedef TPin<Portg, 0 > Pg0;
338 typedef TPin<Portg, 1 > Pg1;
339 typedef TPin<Portg, 2 > Pg2;
340 typedef TPin<Portg, 3 > Pg3;
341 typedef TPin<Portg, 4 > Pg4;
342 typedef TPin<Portg, 5 > Pg5;
343 typedef TPin<Portg, 6 > Pg6;
344 typedef TPin<Portg, 7 > Pg7;
345 #endif
346 
347 #ifdef USE_PORTH
348 typedef TPin<Porth, 0 > Ph0;
349 typedef TPin<Porth, 1 > Ph1;
350 typedef TPin<Porth, 2 > Ph2;
351 typedef TPin<Porth, 3 > Ph3;
352 typedef TPin<Porth, 4 > Ph4;
353 typedef TPin<Porth, 5 > Ph5;
354 typedef TPin<Porth, 6 > Ph6;
355 typedef TPin<Porth, 7 > Ph7;
356 #endif
357 
358 #ifdef USE_PORTJ
359 typedef TPin<Portj, 0 > Pj0;
360 typedef TPin<Portj, 1 > Pj1;
361 typedef TPin<Portj, 2 > Pj2;
362 typedef TPin<Portj, 3 > Pj3;
363 typedef TPin<Portj, 4 > Pj4;
364 typedef TPin<Portj, 5 > Pj5;
365 typedef TPin<Portj, 6 > Pj6;
366 typedef TPin<Portj, 7 > Pj7;
367 #endif
368 
369 #ifdef USE_PORTK
370 typedef TPin<Portk, 0 > Pk0;
371 typedef TPin<Portk, 1 > Pk1;
372 typedef TPin<Portk, 2 > Pk2;
373 typedef TPin<Portk, 3 > Pk3;
374 typedef TPin<Portk, 4 > Pk4;
375 typedef TPin<Portk, 5 > Pk5;
376 typedef TPin<Portk, 6 > Pk6;
377 typedef TPin<Portk, 7 > Pk7;
378 #endif
379 
380 #ifdef USE_PORTL
381 typedef TPin<Portl, 0 > Pl0;
382 typedef TPin<Portl, 1 > Pl1;
383 typedef TPin<Portl, 2 > Pl2;
384 typedef TPin<Portl, 3 > Pl3;
385 typedef TPin<Portl, 4 > Pl4;
386 typedef TPin<Portl, 5 > Pl5;
387 typedef TPin<Portl, 6 > Pl6;
388 typedef TPin<Portl, 7 > Pl7;
389 #endif
390 
391 #ifdef USE_PORTQ
392 typedef TPin<Portq, 0 > Pq0;
393 typedef TPin<Portq, 1 > Pq1;
394 typedef TPin<Portq, 2 > Pq2;
395 typedef TPin<Portq, 3 > Pq3;
396 typedef TPin<Portq, 4 > Pq4;
397 typedef TPin<Portq, 5 > Pq5;
398 typedef TPin<Portq, 6 > Pq6;
399 typedef TPin<Portq, 7 > Pq7;
400 #endif
401 
402 #ifdef USE_PORTR
403 typedef TPin<Portr, 0 > Pr0;
404 typedef TPin<Portr, 1 > Pr1;
405 typedef TPin<Portr, 2 > Pr2;
406 typedef TPin<Portr, 3 > Pr3;
407 typedef TPin<Portr, 4 > Pr4;
408 typedef TPin<Portr, 5 > Pr5;
409 typedef TPin<Portr, 6 > Pr6;
410 typedef TPin<Portr, 7 > Pr7;
411 #endif
412 
413 #ifdef USE_TCCR0A
414 typedef TCom<Tccr0a, COM0A1> Tc0a; //P6
415 typedef TCom<Tccr0a, COM0B1> Tc0b; //P5
416 #endif
417 
418 #ifdef USE_TCCR1A
419 typedef TCom<Tccr1a, COM1A1> Tc1a; //P9
420 typedef TCom<Tccr1a, COM1B1> Tc1b; //P10
421 #endif
422 
423 #ifdef USE_TCCR2A
424 typedef TCom<Tccr2a, COM2A1> Tc2a; //P11
425 typedef TCom<Tccr2a, COM2B1> Tc2b; //P3
426 #endif
427 
428 template<typename Tp_pin, typename Tc_bit>
429 class Tp_Tc {
430 public:
431 
432  static void SetDir(uint8_t val) {
433  if(val)
434  SetDirWrite();
435  else SetDirRead();
436  }
437 
438  static void SetDirRead() {
439  Tp_pin::SetDirRead(); //set pin direction
440  Tc_bit::Clear(); //disconnect pin from PWM
441  }
442 
443  static void SetDirWrite() {
444  Tp_pin::SetDirWrite();
445  Tc_bit::Clear();
446  }
447 };
448 
449 /* pin definitions for cases where it's necessary to clear compare output mode bits */
450 
451 //typedef Tp_Tc<Pd3, Tc2b> P3; //Arduino pin 3
452 //typedef Tp_Tc<Pd5, Tc0b> P5; //Arduino pin 5
453 //typedef Tp_Tc<Pd6, Tc0a> P6; //Arduino pin 6
454 //typedef Tp_Tc<Pb1, Tc1a> P9; //Arduino pin 9
455 //typedef Tp_Tc<Pb2, Tc1b> P10; //Arduino pin 10
456 //typedef Tp_Tc<Pb3, Tc2a> P11; //Arduino pin 11
457 
458 /* Arduino pin definitions */
459 #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
460 // "Mega" Arduino pin numbers
461 
462 #define P0 Pe0
463 #define P1 Pe1
464 #define P2 Pe4
465 #define P3 Pe5
466 #define P4 Pg5
467 #define P5 Pe3
468 #define P6 Ph3
469 #define P7 Ph4
470 
471 #define P8 Ph5
472 #define P9 Ph6
473 #define P10 Pb4
474 #define P11 Pb5
475 #define P12 Pb6
476 #define P13 Pb7
477 
478 #define P14 Pj1
479 #define P15 Pj0
480 #define P16 Ph1
481 #define P17 Ph0
482 #define P18 Pd3
483 #define P19 Pd2
484 #define P20 Pd1
485 #define P21 Pd0
486 
487 #define P22 Pa0
488 #define P23 Pa1
489 #define P24 Pa2
490 #define P25 Pa3
491 #define P26 Pa4
492 #define P27 Pa5
493 #define P28 Pa6
494 #define P29 Pa7
495 #define P30 Pc7
496 #define P31 Pc6
497 #define P32 Pc5
498 #define P33 Pc4
499 #define P34 Pc3
500 #define P35 Pc2
501 #define P36 Pc1
502 #define P37 Pc0
503 
504 #define P38 Pd7
505 #define P39 Pg2
506 #define P40 Pg1
507 #define P41 Pg0
508 #define P42 Pl7
509 #define P43 Pl6
510 #define P44 Pl5
511 #define P45 Pl4
512 #define P46 Pl3
513 #define P47 Pl2
514 #define P48 Pl1
515 #define P49 Pl0
516 #define P50 Pb3
517 #define P51 Pb2
518 #define P52 Pb1
519 #define P53 Pb0
520 
521 #ifdef BOARD_MEGA_ADK // These pins are not broken out on the Arduino ADK
522 #define P54 Pe6 // INT on Arduino ADK
523 #define P55 Pj2 // MAX_RESET on Arduino ADK
524 #endif
525 
526 // "Mega" pin numbers
527 
528 #elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
529 // "Classic" Arduino pin numbers
530 
531 #define P0 Pd0
532 #define P1 Pd1
533 #define P2 Pd2
534 #define P3 Pd3
535 #define P4 Pd4
536 #define P5 Pd5
537 #define P6 Pd6
538 #define P7 Pd7
539 
540 #define P8 Pb0
541 #define P9 Pb1
542 #define P10 Pb2
543 #define P11 Pb3
544 #define P12 Pb4
545 #define P13 Pb5
546 
547 #define P14 Pc0
548 #define P15 Pc1
549 #define P16 Pc2
550 #define P17 Pc3
551 #define P18 Pc4
552 #define P19 Pc5
553 
554 // "Classic" Arduino pin numbers
555 
556 #elif defined(CORE_TEENSY) && defined(__AVR_ATmega32U4__)
557 // Teensy 2.0 pin numbers
558 // http://www.pjrc.com/teensy/pinout.html
559 #define P0 Pb0
560 #define P1 Pb1
561 #define P2 Pb2
562 #define P3 Pb3
563 #define P4 Pb7
564 #define P5 Pd0
565 #define P6 Pd1
566 #define P7 Pd2
567 #define P8 Pd3
568 #define P9 Pc6
569 #define P10 Pc7
570 #define P11 Pd6
571 #define P12 Pd7
572 #define P13 Pb4
573 #define P14 Pb5
574 #define P15 Pb6
575 #define P16 Pf7
576 #define P17 Pf6
577 #define P18 Pf5
578 #define P19 Pf4
579 #define P20 Pf1
580 #define P21 Pf0
581 #define P22 Pd4
582 #define P23 Pd5
583 #define P24 Pe6
584 // Teensy 2.0
585 
586 #elif defined(__AVR_ATmega32U4__)
587 // Arduino Leonardo pin numbers
588 
589 #define P0 Pd2 // D0 - PD2
590 #define P1 Pd3 // D1 - PD3
591 #define P2 Pd1 // D2 - PD1
592 #define P3 Pd0 // D3 - PD0
593 #define P4 Pd4 // D4 - PD4
594 #define P5 Pc6 // D5 - PC6
595 #define P6 Pd7 // D6 - PD7
596 #define P7 Pe6 // D7 - PE6
597 
598 #define P8 Pb4 // D8 - PB4
599 #define P9 Pb5 // D9 - PB5
600 #define P10 Pb6 // D10 - PB6
601 #define P11 Pb7 // D11 - PB7
602 #define P12 Pd6 // D12 - PD6
603 #define P13 Pc7 // D13 - PC7
604 
605 #define P14 Pb3 // D14 - MISO - PB3
606 #define P15 Pb1 // D15 - SCK - PB1
607 #define P16 Pb2 // D16 - MOSI - PB2
608 #define P17 Pb0 // D17 - SS - PB0
609 
610 #define P18 Pf7 // D18 - A0 - PF7
611 #define P19 Pf6 // D19 - A1 - PF6
612 #define P20 Pf5 // D20 - A2 - PF5
613 #define P21 Pf4 // D21 - A3 - PF4
614 #define P22 Pf1 // D22 - A4 - PF1
615 #define P23 Pf0 // D23 - A5 - PF0
616 
617 #define P24 Pd4 // D24 / D4 - A6 - PD4
618 #define P25 Pd7 // D25 / D6 - A7 - PD7
619 #define P26 Pb4 // D26 / D8 - A8 - PB4
620 #define P27 Pb5 // D27 / D9 - A9 - PB5
621 #define P28 Pb6 // D28 / D10 - A10 - PB6
622 #define P29 Pd6 // D29 / D12 - A11 - PD6
623 
624 // Arduino Leonardo pin numbers
625 
626 #elif defined(CORE_TEENSY) && (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__))
627 // Teensy++ 1.0 and 2.0 pin numbers
628 // http://www.pjrc.com/teensy/pinout.html
629 #define P0 Pd0
630 #define P1 Pd1
631 #define P2 Pd2
632 #define P3 Pd3
633 #define P4 Pd4
634 #define P5 Pd5
635 #define P6 Pd6
636 #define P7 Pd7
637 #define P8 Pe0
638 #define P9 Pe1
639 #define P10 Pc0
640 #define P11 Pc1
641 #define P12 Pc2
642 #define P13 Pc3
643 #define P14 Pc4
644 #define P15 Pc5
645 #define P16 Pc6
646 #define P17 Pc7
647 #define P18 Pe6
648 #define P19 Pe7
649 #define P20 Pb0
650 #define P21 Pb1
651 #define P22 Pb2
652 #define P23 Pb3
653 #define P24 Pb4
654 #define P25 Pb5
655 #define P26 Pb6
656 #define P27 Pb7
657 #define P28 Pa0
658 #define P29 Pa1
659 #define P30 Pa2
660 #define P31 Pa3
661 #define P32 Pa4
662 #define P33 Pa5
663 #define P34 Pa6
664 #define P35 Pa7
665 #define P36 Pe4
666 #define P37 Pe5
667 #define P38 Pf0
668 #define P39 Pf1
669 #define P40 Pf2
670 #define P41 Pf3
671 #define P42 Pf4
672 #define P43 Pf5
673 #define P44 Pf6
674 #define P45 Pf7
675 // Teensy++ 1.0 and 2.0
676 
677 #elif defined(ARDUINO_AVR_BALANDUINO) && (defined(__AVR_ATmega644__) || defined(__AVR_ATmega1284P__))
678 // Balanduino pin numbers
679 // http://balanduino.net/
680 #define P0 Pd0 /* 0 - PD0 */
681 #define P1 Pd1 /* 1 - PD1 */
682 
683 #if BALANDUINO_REVISION < 13
684  #define P2 Pb2 /* 2 - PB2 */
685  #define P3 Pd6 /* 3 - PD6 */
686  #define P4 Pd7 /* 4 - PD7 */
687  #define P5 Pb3 /* 5 - PB3 */
688 #else
689  #define P2 Pd2 /* 2 - PD2 */
690  #define P3 Pd3 /* 3 - PD3 */
691  #define P4 Pd6 /* 4 - PD6 */
692  #define P5 Pd7 /* 5 - PD7 */
693 #endif
694 
695 #define P6 Pb4 /* 6 - PB4 */
696 #define P7 Pa0 /* 7 - PA0 */
697 #define P8 Pa1 /* 8 - PA1 */
698 #define P9 Pa2 /* 9 - PA2 */
699 #define P10 Pa3 /* 10 - PA3 */
700 #define P11 Pa4 /* 11 - PA4 */
701 #define P12 Pa5 /* 12 - PA5 */
702 #define P13 Pc1 /* 13 - PC1 */
703 #define P14 Pc0 /* 14 - PC0 */
704 
705 #if BALANDUINO_REVISION < 13
706  #define P15 Pd2 /* 15 - PD2 */
707  #define P16 Pd3 /* 16 - PD3 */
708 #else
709  #define P15 Pb2 /* 15 - PB2 */
710  #define P16 Pb3 /* 16 - PB2 */
711 #endif
712 
713 #define P17 Pd4 /* 17 - PD4 */
714 #define P18 Pd5 /* 18 - PD5 */
715 #define P19 Pc2 /* 19 - PC2 */
716 #define P20 Pc3 /* 20 - PC3 */
717 #define P21 Pc4 /* 21 - PC4 */
718 #define P22 Pc5 /* 22 - PC5 */
719 #define P23 Pc6 /* 23 - PC6 */
720 #define P24 Pc7 /* 24 - PC7 */
721 #define P25 Pb0 /* 25 - PB0 */
722 #define P26 Pb1 /* 26 - PB1 */
723 #define P27 Pb5 /* 27 - PB5 */
724 #define P28 Pb6 /* 28 - PB6 */
725 #define P29 Pb7 /* 29 - PB7 */
726 #define P30 Pa6 /* 30 - PA6 */
727 #define P31 Pa7 /* 31 - PA7 */
728 // Balanduino
729 
730 #elif defined(ARDUINO_AVR_UNO_PRO) && defined(__AVR_ATmega1284P__)
731 // UNO*Pro pin numbers
732 // Homepage: http://www.hobbytronics.co.uk/arduino-uno-pro
733 // Pin Reference: http://www.hobbytronics.co.uk/download/uno_pro/pins_arduino.h
734 #define P0 Pd0
735 #define P1 Pd1
736 #define P2 Pb2
737 #define P3 Pb3
738 #define P4 Pb0
739 #define P5 Pb1
740 #define P6 Pd2
741 #define P7 Pd3
742 #define P8 Pd5
743 #define P9 Pd6
744 #define P10 Pb4
745 #define P11 Pb5
746 #define P12 Pb6
747 #define P13 Pb7
748 #define P14 Pa7
749 #define P15 Pa6
750 #define P16 Pa5
751 #define P17 Pa4
752 #define P18 Pa3
753 #define P19 Pa2
754 #define P20 Pa1
755 #define P21 Pa0
756 #define P22 Pc0
757 #define P23 Pc1
758 #define P24 Pc2
759 #define P25 Pc3
760 #define P26 Pc4
761 #define P27 Pc5
762 #define P28 Pc6
763 #define P29 Pc7
764 #define P30 Pd4
765 #define P31 Pd7
766 // UNO*Pro
767 
768 #elif defined(MIGHTYCORE)
769 // https://github.com/MCUdude/MightyCore
770 #if defined(BOBUINO_PINOUT)
771  #define P0 Pd0
772  #define P1 Pd1
773  #define P2 Pd2
774  #define P3 Pd3
775  #define P4 Pb0
776  #define P5 Pb1
777  #define P6 Pb2
778  #define P7 Pb3
779  #define P8 Pd5
780  #define P9 Pd6
781  #define P10 Pb4
782  #define P11 Pb5
783  #define P12 Pb6
784  #define P13 Pb7
785  #define P14 Pa7
786  #define P15 Pa6
787  #define P16 Pa5
788  #define P17 Pa4
789  #define P18 Pa3
790  #define P19 Pa2
791  #define P20 Pa1
792  #define P21 Pa0
793  #define P22 Pc0
794  #define P23 Pc1
795  #define P24 Pc2
796  #define P25 Pc3
797  #define P26 Pc4
798  #define P27 Pc5
799  #define P28 Pc6
800  #define P29 Pc7
801  #define P30 Pd4
802  #define P31 Pd7
803 #else
804  #define P0 Pb0
805  #define P1 Pb1
806  #define P2 Pb2
807  #define P3 Pb3
808  #define P4 Pb4
809  #define P5 Pb5
810  #define P6 Pb6
811  #define P7 Pb7
812  #define P8 Pd0
813  #define P9 Pd1
814  #define P10 Pd2
815  #define P11 Pd3
816  #define P12 Pd4
817  #define P13 Pd5
818  #define P14 Pd6
819  #define P15 Pd7
820  #define P16 Pc0
821  #define P17 Pc1
822  #define P18 Pc2
823  #define P19 Pc3
824  #define P20 Pc4
825  #define P21 Pc5
826  #define P22 Pc6
827  #define P23 Pc7
828  #if defined(SANGUINO_PINOUT)
829  #define P24 Pa7
830  #define P25 Pa6
831  #define P26 Pa5
832  #define P27 Pa4
833  #define P28 Pa3
834  #define P29 Pa2
835  #define P30 Pa1
836  #define P31 Pa0
837  #else
838  #define P24 Pa0
839  #define P25 Pa1
840  #define P26 Pa2
841  #define P27 Pa3
842  #define P28 Pa4
843  #define P29 Pa5
844  #define P30 Pa6
845  #define P31 Pa7
846  #endif
847 #endif
848 // MightyCore
849 
850 #elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
851 // Sanguino pin numbers
852 // Homepage: http://sanguino.cc/hardware
853 // Hardware add-on: https://github.com/Lauszus/Sanguino
854 #define P0 Pb0
855 #define P1 Pb1
856 #define P2 Pb2
857 #define P3 Pb3
858 #define P4 Pb4
859 #define P5 Pb5
860 #define P6 Pb6
861 #define P7 Pb7
862 #define P8 Pd0
863 #define P9 Pd1
864 #define P10 Pd2
865 #define P11 Pd3
866 #define P12 Pd4
867 #define P13 Pd5
868 #define P14 Pd6
869 #define P15 Pd7
870 #define P16 Pc0
871 #define P17 Pc1
872 #define P18 Pc2
873 #define P19 Pc3
874 #define P20 Pc4
875 #define P21 Pc5
876 #define P22 Pc6
877 #define P23 Pc7
878 #define P24 Pa0
879 #define P25 Pa1
880 #define P26 Pa2
881 #define P27 Pa3
882 #define P28 Pa4
883 #define P29 Pa5
884 #define P30 Pa6
885 #define P31 Pa7
886 // Sanguino
887 
888 #else
889 #error "Please define board in avrpins.h"
890 
891 #endif // Arduino pin definitions
892 
893 #elif defined(__arm__)
894 
895 // pointers are 32 bits on ARM
896 #define pgm_read_pointer(p) pgm_read_dword(p)
897 
898 #if defined(CORE_TEENSY) && (defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__))
899 // Teensy 3.x
900 
901 #include "core_pins.h"
902 #include "avr_emulation.h"
903 
904 #define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000)
905 #define GPIO_BITBAND_PTR(reg, bit) ((uint8_t *)GPIO_BITBAND_ADDR((reg), (bit)))
906 
907 #define MAKE_PIN(className, baseReg, pinNum, configReg) \
908 class className { \
909 public: \
910  static void Set() { \
911  *GPIO_BITBAND_PTR(baseReg, pinNum) = 1; \
912  } \
913  static void Clear() { \
914  *GPIO_BITBAND_PTR(baseReg, pinNum) = 0; \
915  } \
916  static void SetDirRead() { \
917  configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
918  *(GPIO_BITBAND_PTR(baseReg, pinNum) + 640) = 0; \
919  } \
920  static void SetDirWrite() { \
921  configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
922  *(GPIO_BITBAND_PTR(baseReg, pinNum) + 640) = 1; \
923  } \
924  static uint8_t IsSet() { \
925  return *(GPIO_BITBAND_PTR(baseReg, pinNum) + 512); \
926  } \
927 };
928 
929 MAKE_PIN(P0, CORE_PIN0_PORTREG, CORE_PIN0_BIT, CORE_PIN0_CONFIG);
930 MAKE_PIN(P1, CORE_PIN1_PORTREG, CORE_PIN1_BIT, CORE_PIN1_CONFIG);
931 MAKE_PIN(P2, CORE_PIN2_PORTREG, CORE_PIN2_BIT, CORE_PIN2_CONFIG);
932 MAKE_PIN(P3, CORE_PIN3_PORTREG, CORE_PIN3_BIT, CORE_PIN3_CONFIG);
933 MAKE_PIN(P4, CORE_PIN4_PORTREG, CORE_PIN4_BIT, CORE_PIN4_CONFIG);
934 MAKE_PIN(P5, CORE_PIN5_PORTREG, CORE_PIN5_BIT, CORE_PIN5_CONFIG);
935 MAKE_PIN(P6, CORE_PIN6_PORTREG, CORE_PIN6_BIT, CORE_PIN6_CONFIG);
936 MAKE_PIN(P7, CORE_PIN7_PORTREG, CORE_PIN7_BIT, CORE_PIN7_CONFIG);
937 MAKE_PIN(P8, CORE_PIN8_PORTREG, CORE_PIN8_BIT, CORE_PIN8_CONFIG);
938 MAKE_PIN(P9, CORE_PIN9_PORTREG, CORE_PIN9_BIT, CORE_PIN9_CONFIG);
939 MAKE_PIN(P10, CORE_PIN10_PORTREG, CORE_PIN10_BIT, CORE_PIN10_CONFIG);
940 MAKE_PIN(P11, CORE_PIN11_PORTREG, CORE_PIN11_BIT, CORE_PIN11_CONFIG);
941 MAKE_PIN(P12, CORE_PIN12_PORTREG, CORE_PIN12_BIT, CORE_PIN12_CONFIG);
942 MAKE_PIN(P13, CORE_PIN13_PORTREG, CORE_PIN13_BIT, CORE_PIN13_CONFIG);
943 MAKE_PIN(P14, CORE_PIN14_PORTREG, CORE_PIN14_BIT, CORE_PIN14_CONFIG);
944 MAKE_PIN(P15, CORE_PIN15_PORTREG, CORE_PIN15_BIT, CORE_PIN15_CONFIG);
945 MAKE_PIN(P16, CORE_PIN16_PORTREG, CORE_PIN16_BIT, CORE_PIN16_CONFIG);
946 MAKE_PIN(P17, CORE_PIN17_PORTREG, CORE_PIN17_BIT, CORE_PIN17_CONFIG);
947 MAKE_PIN(P18, CORE_PIN18_PORTREG, CORE_PIN18_BIT, CORE_PIN18_CONFIG);
948 MAKE_PIN(P19, CORE_PIN19_PORTREG, CORE_PIN19_BIT, CORE_PIN19_CONFIG);
949 MAKE_PIN(P20, CORE_PIN20_PORTREG, CORE_PIN20_BIT, CORE_PIN20_CONFIG);
950 MAKE_PIN(P21, CORE_PIN21_PORTREG, CORE_PIN21_BIT, CORE_PIN21_CONFIG);
951 MAKE_PIN(P22, CORE_PIN22_PORTREG, CORE_PIN22_BIT, CORE_PIN22_CONFIG);
952 MAKE_PIN(P23, CORE_PIN23_PORTREG, CORE_PIN23_BIT, CORE_PIN23_CONFIG);
953 MAKE_PIN(P24, CORE_PIN24_PORTREG, CORE_PIN24_BIT, CORE_PIN24_CONFIG);
954 MAKE_PIN(P25, CORE_PIN25_PORTREG, CORE_PIN25_BIT, CORE_PIN25_CONFIG);
955 MAKE_PIN(P26, CORE_PIN26_PORTREG, CORE_PIN26_BIT, CORE_PIN26_CONFIG);
956 MAKE_PIN(P27, CORE_PIN27_PORTREG, CORE_PIN27_BIT, CORE_PIN27_CONFIG);
957 MAKE_PIN(P28, CORE_PIN28_PORTREG, CORE_PIN28_BIT, CORE_PIN28_CONFIG);
958 MAKE_PIN(P29, CORE_PIN29_PORTREG, CORE_PIN29_BIT, CORE_PIN29_CONFIG);
959 MAKE_PIN(P30, CORE_PIN30_PORTREG, CORE_PIN30_BIT, CORE_PIN30_CONFIG);
960 MAKE_PIN(P31, CORE_PIN31_PORTREG, CORE_PIN31_BIT, CORE_PIN31_CONFIG);
961 MAKE_PIN(P32, CORE_PIN32_PORTREG, CORE_PIN32_BIT, CORE_PIN32_CONFIG);
962 MAKE_PIN(P33, CORE_PIN33_PORTREG, CORE_PIN33_BIT, CORE_PIN33_CONFIG);
963 #if defined(__MK64FX512__) || defined(__MK66FX1M0__)
964 MAKE_PIN(P34, CORE_PIN34_PORTREG, CORE_PIN34_BIT, CORE_PIN34_CONFIG);
965 MAKE_PIN(P35, CORE_PIN35_PORTREG, CORE_PIN35_BIT, CORE_PIN35_CONFIG);
966 MAKE_PIN(P36, CORE_PIN36_PORTREG, CORE_PIN36_BIT, CORE_PIN36_CONFIG);
967 MAKE_PIN(P37, CORE_PIN37_PORTREG, CORE_PIN37_BIT, CORE_PIN37_CONFIG);
968 MAKE_PIN(P38, CORE_PIN38_PORTREG, CORE_PIN38_BIT, CORE_PIN38_CONFIG);
969 MAKE_PIN(P39, CORE_PIN39_PORTREG, CORE_PIN39_BIT, CORE_PIN39_CONFIG);
970 MAKE_PIN(P40, CORE_PIN40_PORTREG, CORE_PIN40_BIT, CORE_PIN40_CONFIG);
971 MAKE_PIN(P41, CORE_PIN41_PORTREG, CORE_PIN41_BIT, CORE_PIN41_CONFIG);
972 MAKE_PIN(P42, CORE_PIN42_PORTREG, CORE_PIN42_BIT, CORE_PIN42_CONFIG);
973 MAKE_PIN(P43, CORE_PIN43_PORTREG, CORE_PIN43_BIT, CORE_PIN43_CONFIG);
974 MAKE_PIN(P44, CORE_PIN44_PORTREG, CORE_PIN44_BIT, CORE_PIN44_CONFIG);
975 MAKE_PIN(P45, CORE_PIN45_PORTREG, CORE_PIN45_BIT, CORE_PIN45_CONFIG);
976 MAKE_PIN(P46, CORE_PIN46_PORTREG, CORE_PIN46_BIT, CORE_PIN46_CONFIG);
977 MAKE_PIN(P47, CORE_PIN47_PORTREG, CORE_PIN47_BIT, CORE_PIN47_CONFIG);
978 MAKE_PIN(P48, CORE_PIN48_PORTREG, CORE_PIN48_BIT, CORE_PIN48_CONFIG);
979 MAKE_PIN(P49, CORE_PIN49_PORTREG, CORE_PIN49_BIT, CORE_PIN49_CONFIG);
980 MAKE_PIN(P50, CORE_PIN50_PORTREG, CORE_PIN50_BIT, CORE_PIN50_CONFIG);
981 MAKE_PIN(P51, CORE_PIN51_PORTREG, CORE_PIN51_BIT, CORE_PIN51_CONFIG);
982 MAKE_PIN(P52, CORE_PIN52_PORTREG, CORE_PIN52_BIT, CORE_PIN52_CONFIG);
983 MAKE_PIN(P53, CORE_PIN53_PORTREG, CORE_PIN53_BIT, CORE_PIN53_CONFIG);
984 MAKE_PIN(P54, CORE_PIN54_PORTREG, CORE_PIN54_BIT, CORE_PIN54_CONFIG);
985 MAKE_PIN(P55, CORE_PIN55_PORTREG, CORE_PIN55_BIT, CORE_PIN55_CONFIG);
986 MAKE_PIN(P56, CORE_PIN56_PORTREG, CORE_PIN56_BIT, CORE_PIN56_CONFIG);
987 MAKE_PIN(P57, CORE_PIN57_PORTREG, CORE_PIN57_BIT, CORE_PIN57_CONFIG);
988 MAKE_PIN(P58, CORE_PIN58_PORTREG, CORE_PIN58_BIT, CORE_PIN58_CONFIG);
989 MAKE_PIN(P59, CORE_PIN59_PORTREG, CORE_PIN59_BIT, CORE_PIN59_CONFIG);
990 MAKE_PIN(P60, CORE_PIN60_PORTREG, CORE_PIN60_BIT, CORE_PIN60_CONFIG);
991 MAKE_PIN(P61, CORE_PIN61_PORTREG, CORE_PIN61_BIT, CORE_PIN61_CONFIG);
992 MAKE_PIN(P62, CORE_PIN62_PORTREG, CORE_PIN62_BIT, CORE_PIN62_CONFIG);
993 MAKE_PIN(P63, CORE_PIN63_PORTREG, CORE_PIN63_BIT, CORE_PIN63_CONFIG);
994 #endif
995 
996 #undef MAKE_PIN
997 
998 #elif defined(CORE_TEENSY) && (defined(__MKL26Z64__))
999 // Teensy-LC
1000 
1001 // we could get lower level by making these macros work properly.
1002 // for now just use the semi optimised version, it costs a lookup in the pin pgm table per op
1003 // but for now it will do.
1004 //#define GPIO_BITBAND_ADDR(reg, bit) (((volatile uint8_t *)&(reg) + ((bit) >> 3)))
1005 //#define GPIO_BITBAND_MASK(reg, bit) (1<<((bit) & 7))
1006 //#define GPIO_BITBAND_PTR(reg, bit) ((volatile uint8_t *)GPIO_BITBAND_ADDR((reg), (bit)))
1007 
1008 #include "core_pins.h"
1009 #include "avr_emulation.h"
1010 
1011 #define MAKE_PIN(className, baseReg, pinNum, configReg) \
1012 class className { \
1013 public: \
1014  static void Set() { \
1015  *portSetRegister(pinNum) = digitalPinToBitMask(pinNum); \
1016  } \
1017  static void Clear() { \
1018  *portClearRegister(pinNum) = digitalPinToBitMask(pinNum); \
1019  } \
1020  static void SetDirRead() { \
1021  configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
1022  *portModeRegister(pinNum) &= ~digitalPinToBitMask(pinNum); \
1023  } \
1024  static void SetDirWrite() { \
1025  configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
1026  *portModeRegister(pinNum) |= digitalPinToBitMask(pinNum); \
1027  } \
1028  static uint8_t IsSet() { \
1029  return (*portInputRegister(pinNum) & digitalPinToBitMask(pinNum)) ? 1 : 0; \
1030  } \
1031 };
1032 
1033 MAKE_PIN(P0, CORE_PIN0_PORTREG, 0, CORE_PIN0_CONFIG);
1034 MAKE_PIN(P1, CORE_PIN1_PORTREG, 1, CORE_PIN1_CONFIG);
1035 MAKE_PIN(P2, CORE_PIN2_PORTREG, 2, CORE_PIN2_CONFIG);
1036 MAKE_PIN(P3, CORE_PIN3_PORTREG, 3, CORE_PIN3_CONFIG);
1037 MAKE_PIN(P4, CORE_PIN4_PORTREG, 4, CORE_PIN4_CONFIG);
1038 MAKE_PIN(P5, CORE_PIN5_PORTREG, 5, CORE_PIN5_CONFIG);
1039 MAKE_PIN(P6, CORE_PIN6_PORTREG, 6, CORE_PIN6_CONFIG);
1040 MAKE_PIN(P7, CORE_PIN7_PORTREG, 7, CORE_PIN7_CONFIG);
1041 MAKE_PIN(P8, CORE_PIN8_PORTREG, 8, CORE_PIN8_CONFIG);
1042 MAKE_PIN(P9, CORE_PIN9_PORTREG, 9, CORE_PIN9_CONFIG);
1043 MAKE_PIN(P10, CORE_PIN10_PORTREG, 10, CORE_PIN10_CONFIG);
1044 MAKE_PIN(P11, CORE_PIN11_PORTREG, 11, CORE_PIN11_CONFIG);
1045 MAKE_PIN(P12, CORE_PIN12_PORTREG, 12, CORE_PIN12_CONFIG);
1046 MAKE_PIN(P13, CORE_PIN13_PORTREG, 13, CORE_PIN13_CONFIG);
1047 MAKE_PIN(P14, CORE_PIN14_PORTREG, 14, CORE_PIN14_CONFIG);
1048 MAKE_PIN(P15, CORE_PIN15_PORTREG, 15, CORE_PIN15_CONFIG);
1049 MAKE_PIN(P16, CORE_PIN16_PORTREG, 16, CORE_PIN16_CONFIG);
1050 MAKE_PIN(P17, CORE_PIN17_PORTREG, 17, CORE_PIN17_CONFIG);
1051 MAKE_PIN(P18, CORE_PIN18_PORTREG, 18, CORE_PIN18_CONFIG);
1052 MAKE_PIN(P19, CORE_PIN19_PORTREG, 19, CORE_PIN19_CONFIG);
1053 MAKE_PIN(P20, CORE_PIN20_PORTREG, 20, CORE_PIN20_CONFIG);
1054 MAKE_PIN(P21, CORE_PIN21_PORTREG, 21, CORE_PIN21_CONFIG);
1055 MAKE_PIN(P22, CORE_PIN22_PORTREG, 22, CORE_PIN22_CONFIG);
1056 MAKE_PIN(P23, CORE_PIN23_PORTREG, 23, CORE_PIN23_CONFIG);
1057 MAKE_PIN(P24, CORE_PIN24_PORTREG, 24, CORE_PIN24_CONFIG);
1058 MAKE_PIN(P25, CORE_PIN25_PORTREG, 25, CORE_PIN25_CONFIG);
1059 MAKE_PIN(P26, CORE_PIN26_PORTREG, 26, CORE_PIN26_CONFIG);
1060 
1061 #undef MAKE_PIN
1062 
1063 #elif defined(__IMXRT1062__) && (defined(ARDUINO_TEENSY40) || defined(ARDUINO_TEENSY41))
1064 // Teensy 4.x
1065 
1066 #include "core_pins.h"
1067 
1068 #define MAKE_PIN(className, pin) \
1069 class className { \
1070 public: \
1071  static void Set() { \
1072  digitalWriteFast(pin, HIGH);\
1073  } \
1074  static void Clear() { \
1075  digitalWriteFast(pin, LOW); \
1076  } \
1077  static void SetDirRead() { \
1078  pinMode(pin, INPUT); \
1079  } \
1080  static void SetDirWrite() { \
1081  pinMode(pin, OUTPUT); \
1082  } \
1083  static uint8_t IsSet() { \
1084  return digitalReadFast(pin); \
1085  } \
1086 };
1087 
1088 MAKE_PIN(P0, 0);
1089 MAKE_PIN(P1, 1);
1090 MAKE_PIN(P2, 2);
1091 MAKE_PIN(P3, 3);
1092 MAKE_PIN(P4, 4);
1093 MAKE_PIN(P5, 5);
1094 MAKE_PIN(P6, 6);
1095 MAKE_PIN(P7, 7);
1096 MAKE_PIN(P8, 8);
1097 MAKE_PIN(P9, 9);
1098 MAKE_PIN(P10, 10);
1099 MAKE_PIN(P11, 11);
1100 MAKE_PIN(P12, 12);
1101 MAKE_PIN(P13, 13);
1102 MAKE_PIN(P14, 14);
1103 MAKE_PIN(P15, 15);
1104 MAKE_PIN(P16, 16);
1105 MAKE_PIN(P17, 17);
1106 MAKE_PIN(P18, 18);
1107 MAKE_PIN(P19, 19);
1108 MAKE_PIN(P20, 20);
1109 MAKE_PIN(P21, 21);
1110 MAKE_PIN(P22, 22);
1111 MAKE_PIN(P23, 23);
1112 MAKE_PIN(P24, 24);
1113 MAKE_PIN(P25, 25);
1114 MAKE_PIN(P26, 26);
1115 MAKE_PIN(P27, 27);
1116 MAKE_PIN(P28, 28);
1117 MAKE_PIN(P29, 29);
1118 MAKE_PIN(P30, 30);
1119 MAKE_PIN(P31, 31);
1120 MAKE_PIN(P32, 35);
1121 MAKE_PIN(P33, 33);
1122 MAKE_PIN(P34, 34);
1123 MAKE_PIN(P35, 35);
1124 MAKE_PIN(P36, 36);
1125 MAKE_PIN(P37, 37);
1126 MAKE_PIN(P38, 38);
1127 MAKE_PIN(P39, 39);
1128 #ifdef ARDUINO_TEENSY41
1129 MAKE_PIN(P40, 40);
1130 MAKE_PIN(P41, 41);
1131 MAKE_PIN(P42, 42);
1132 MAKE_PIN(P43, 43);
1133 MAKE_PIN(P44, 44);
1134 MAKE_PIN(P45, 45);
1135 MAKE_PIN(P46, 46);
1136 MAKE_PIN(P47, 47);
1137 MAKE_PIN(P48, 48);
1138 MAKE_PIN(P49, 49);
1139 MAKE_PIN(P50, 50);
1140 MAKE_PIN(P51, 51);
1141 MAKE_PIN(P52, 52);
1142 MAKE_PIN(P53, 53);
1143 MAKE_PIN(P54, 54);
1144 #endif
1145 
1146 #undef MAKE_PIN
1147 
1148 #elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)
1149 
1150 // SetDirRead:
1151 // Disable interrupts
1152 // Disable the pull up resistor
1153 // Set to INPUT
1154 // Enable PIO
1155 
1156 // SetDirWrite:
1157 // Disable interrupts
1158 // Disable the pull up resistor
1159 // Set to OUTPUT
1160 // Enable PIO
1161 
1162 #define MAKE_PIN(className, pio, pinMask) \
1163 class className { \
1164 public: \
1165  static void Set() { \
1166  pio->PIO_SODR = pinMask; \
1167  } \
1168  static void Clear() { \
1169  pio->PIO_CODR = pinMask; \
1170  } \
1171  static void SetDirRead() { \
1172  pio->PIO_IDR = pinMask ; \
1173  pio->PIO_PUDR = pinMask; \
1174  pio->PIO_ODR = pinMask; \
1175  pio->PIO_PER = pinMask; \
1176  } \
1177  static void SetDirWrite() { \
1178  pio->PIO_IDR = pinMask ; \
1179  pio->PIO_PUDR = pinMask; \
1180  pio->PIO_OER = pinMask; \
1181  pio->PIO_PER = pinMask; \
1182  } \
1183  static uint8_t IsSet() { \
1184  return pio->PIO_PDSR & pinMask; \
1185  } \
1186 };
1187 
1188 // See: http://arduino.cc/en/Hacking/PinMappingSAM3X and variant.cpp
1189 
1190 MAKE_PIN(P0, PIOA, PIO_PA8);
1191 MAKE_PIN(P1, PIOA, PIO_PA9);
1192 MAKE_PIN(P2, PIOB, PIO_PB25);
1193 MAKE_PIN(P3, PIOC, PIO_PC28);
1194 MAKE_PIN(P4, PIOC, PIO_PC26);
1195 MAKE_PIN(P5, PIOC, PIO_PC25);
1196 MAKE_PIN(P6, PIOC, PIO_PC24);
1197 MAKE_PIN(P7, PIOC, PIO_PC23);
1198 MAKE_PIN(P8, PIOC, PIO_PC22);
1199 MAKE_PIN(P9, PIOC, PIO_PC21);
1200 MAKE_PIN(P10, PIOC, PIO_PC29);
1201 MAKE_PIN(P11, PIOD, PIO_PD7);
1202 MAKE_PIN(P12, PIOD, PIO_PD8);
1203 MAKE_PIN(P13, PIOB, PIO_PB27);
1204 MAKE_PIN(P14, PIOD, PIO_PD4);
1205 MAKE_PIN(P15, PIOD, PIO_PD5);
1206 MAKE_PIN(P16, PIOA, PIO_PA13);
1207 MAKE_PIN(P17, PIOA, PIO_PA12);
1208 MAKE_PIN(P18, PIOA, PIO_PA11);
1209 MAKE_PIN(P19, PIOA, PIO_PA10);
1210 MAKE_PIN(P20, PIOB, PIO_PB12);
1211 MAKE_PIN(P21, PIOB, PIO_PB13);
1212 MAKE_PIN(P22, PIOB, PIO_PB26);
1213 MAKE_PIN(P23, PIOA, PIO_PA14);
1214 MAKE_PIN(P24, PIOA, PIO_PA15);
1215 MAKE_PIN(P25, PIOD, PIO_PD0);
1216 MAKE_PIN(P26, PIOD, PIO_PD1);
1217 MAKE_PIN(P27, PIOD, PIO_PD2);
1218 MAKE_PIN(P28, PIOD, PIO_PD3);
1219 MAKE_PIN(P29, PIOD, PIO_PD6);
1220 MAKE_PIN(P30, PIOD, PIO_PD9);
1221 MAKE_PIN(P31, PIOA, PIO_PA7);
1222 MAKE_PIN(P32, PIOD, PIO_PD10);
1223 MAKE_PIN(P33, PIOC, PIO_PC1);
1224 MAKE_PIN(P34, PIOC, PIO_PC2);
1225 MAKE_PIN(P35, PIOC, PIO_PC3);
1226 MAKE_PIN(P36, PIOC, PIO_PC4);
1227 MAKE_PIN(P37, PIOC, PIO_PC5);
1228 MAKE_PIN(P38, PIOC, PIO_PC6);
1229 MAKE_PIN(P39, PIOC, PIO_PC7);
1230 MAKE_PIN(P40, PIOC, PIO_PC8);
1231 MAKE_PIN(P41, PIOC, PIO_PC9);
1232 MAKE_PIN(P42, PIOA, PIO_PA19);
1233 MAKE_PIN(P43, PIOA, PIO_PA20);
1234 MAKE_PIN(P44, PIOC, PIO_PC19);
1235 MAKE_PIN(P45, PIOC, PIO_PC18);
1236 MAKE_PIN(P46, PIOC, PIO_PC17);
1237 MAKE_PIN(P47, PIOC, PIO_PC16);
1238 MAKE_PIN(P48, PIOC, PIO_PC15);
1239 MAKE_PIN(P49, PIOC, PIO_PC14);
1240 MAKE_PIN(P50, PIOC, PIO_PC13);
1241 MAKE_PIN(P51, PIOC, PIO_PC12);
1242 MAKE_PIN(P52, PIOB, PIO_PB21);
1243 MAKE_PIN(P53, PIOB, PIO_PB14);
1244 MAKE_PIN(P54, PIOA, PIO_PA16);
1245 MAKE_PIN(P55, PIOA, PIO_PA24);
1246 MAKE_PIN(P56, PIOA, PIO_PA23);
1247 MAKE_PIN(P57, PIOA, PIO_PA22);
1248 MAKE_PIN(P58, PIOA, PIO_PA6);
1249 MAKE_PIN(P59, PIOA, PIO_PA4);
1250 MAKE_PIN(P60, PIOA, PIO_PA3);
1251 MAKE_PIN(P61, PIOA, PIO_PA2);
1252 MAKE_PIN(P62, PIOB, PIO_PB17);
1253 MAKE_PIN(P63, PIOB, PIO_PB18);
1254 MAKE_PIN(P64, PIOB, PIO_PB19);
1255 MAKE_PIN(P65, PIOB, PIO_PB20);
1256 MAKE_PIN(P66, PIOB, PIO_PB15);
1257 MAKE_PIN(P67, PIOB, PIO_PB16);
1258 MAKE_PIN(P68, PIOA, PIO_PA1);
1259 MAKE_PIN(P69, PIOA, PIO_PA0);
1260 MAKE_PIN(P70, PIOA, PIO_PA17);
1261 MAKE_PIN(P71, PIOA, PIO_PA18);
1262 MAKE_PIN(P72, PIOC, PIO_PC30);
1263 MAKE_PIN(P73, PIOA, PIO_PA21);
1264 MAKE_PIN(P74, PIOA, PIO_PA25); // MISO
1265 MAKE_PIN(P75, PIOA, PIO_PA26); // MOSI
1266 MAKE_PIN(P76, PIOA, PIO_PA27); // CLK
1267 MAKE_PIN(P77, PIOA, PIO_PA28);
1268 MAKE_PIN(P78, PIOB, PIO_PB23); // Unconnected
1269 
1270 #undef MAKE_PIN
1271 
1272 #elif defined(RBL_NRF51822)
1273 
1274 #define MAKE_PIN(className, pin) \
1275 class className { \
1276 public: \
1277  static void Set() { \
1278  nrf_gpio_pin_set(pin); \
1279  } \
1280  static void Clear() { \
1281  nrf_gpio_pin_clear(pin); \
1282  } \
1283  static void SetDirRead() { \
1284  nrf_gpio_cfg_input(pin, NRF_GPIO_PIN_NOPULL); \
1285  } \
1286  static void SetDirWrite() { \
1287  nrf_gpio_cfg_output(pin); \
1288  } \
1289  static uint8_t IsSet() { \
1290  return (uint8_t)nrf_gpio_pin_read(pin); \
1291  } \
1292 };
1293 
1294 // See: pin_transform.c in RBL nRF51822 SDK
1295 MAKE_PIN(P0, Pin_nRF51822_to_Arduino(D0));
1296 MAKE_PIN(P1, Pin_nRF51822_to_Arduino(D1));
1297 MAKE_PIN(P2, Pin_nRF51822_to_Arduino(D2));
1298 MAKE_PIN(P3, Pin_nRF51822_to_Arduino(D3));
1299 MAKE_PIN(P4, Pin_nRF51822_to_Arduino(D4));
1300 MAKE_PIN(P5, Pin_nRF51822_to_Arduino(D5));
1301 MAKE_PIN(P6, Pin_nRF51822_to_Arduino(D6));
1302 MAKE_PIN(P7, Pin_nRF51822_to_Arduino(D7));
1303 MAKE_PIN(P8, Pin_nRF51822_to_Arduino(D8));
1304 MAKE_PIN(P9, Pin_nRF51822_to_Arduino(D9)); // INT
1305 MAKE_PIN(P10, Pin_nRF51822_to_Arduino(D10)); // SS
1306 MAKE_PIN(P11, Pin_nRF51822_to_Arduino(D11));
1307 MAKE_PIN(P12, Pin_nRF51822_to_Arduino(D12));
1308 MAKE_PIN(P13, Pin_nRF51822_to_Arduino(D13));
1309 MAKE_PIN(P14, Pin_nRF51822_to_Arduino(D14));
1310 MAKE_PIN(P15, Pin_nRF51822_to_Arduino(D15));
1311 MAKE_PIN(P17, Pin_nRF51822_to_Arduino(D17)); // MISO
1312 MAKE_PIN(P18, Pin_nRF51822_to_Arduino(D18)); // MOSI
1313 MAKE_PIN(P16, Pin_nRF51822_to_Arduino(D16)); // CLK
1314 MAKE_PIN(P19, Pin_nRF51822_to_Arduino(D19));
1315 MAKE_PIN(P20, Pin_nRF51822_to_Arduino(D20));
1316 MAKE_PIN(P21, Pin_nRF51822_to_Arduino(D21));
1317 MAKE_PIN(P22, Pin_nRF51822_to_Arduino(D22));
1318 MAKE_PIN(P23, Pin_nRF51822_to_Arduino(D23));
1319 MAKE_PIN(P24, Pin_nRF51822_to_Arduino(D24));
1320 
1321 #undef MAKE_PIN
1322 
1323 #elif defined(STM32F446xx)
1324 // NUCLEO-F446RE
1325 
1326 #define MAKE_PIN(className, port, pin) \
1327 class className { \
1328 public: \
1329  static void Set() { \
1330  HAL_GPIO_WritePin(port, pin, GPIO_PIN_SET); \
1331  } \
1332  static void Clear() { \
1333  HAL_GPIO_WritePin(port, pin, GPIO_PIN_RESET); \
1334  } \
1335  static void SetDirRead() { \
1336  static GPIO_InitTypeDef GPIO_InitStruct; \
1337  GPIO_InitStruct.Pin = pin; \
1338  GPIO_InitStruct.Mode = GPIO_MODE_INPUT; \
1339  GPIO_InitStruct.Pull = GPIO_NOPULL; \
1340  HAL_GPIO_Init(port, &GPIO_InitStruct); \
1341  } \
1342  static void SetDirWrite() { \
1343  static GPIO_InitTypeDef GPIO_InitStruct; \
1344  GPIO_InitStruct.Pin = pin; \
1345  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; \
1346  GPIO_InitStruct.Pull = GPIO_NOPULL; \
1347  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; \
1348  HAL_GPIO_Init(port, &GPIO_InitStruct); \
1349  } \
1350  static GPIO_PinState IsSet() { \
1351  return HAL_GPIO_ReadPin(port, pin); \
1352  } \
1353 };
1354 
1355 MAKE_PIN(P0, GPIOA, GPIO_PIN_3); // D0
1356 MAKE_PIN(P1, GPIOA, GPIO_PIN_2); // D1
1357 MAKE_PIN(P2, GPIOA, GPIO_PIN_10); // D2
1358 MAKE_PIN(P3, GPIOB, GPIO_PIN_3); // D3
1359 MAKE_PIN(P4, GPIOB, GPIO_PIN_5); // D4
1360 MAKE_PIN(P5, GPIOB, GPIO_PIN_4); // D5
1361 MAKE_PIN(P6, GPIOB, GPIO_PIN_10); // D6
1362 MAKE_PIN(P7, GPIOA, GPIO_PIN_8); // D7
1363 MAKE_PIN(P8, GPIOA, GPIO_PIN_9); // D8
1364 MAKE_PIN(P9, GPIOC, GPIO_PIN_7); // D9
1365 MAKE_PIN(P10, GPIOB, GPIO_PIN_6); // D10
1366 MAKE_PIN(P11, GPIOA, GPIO_PIN_7); // D11
1367 MAKE_PIN(P12, GPIOA, GPIO_PIN_6); // D12
1368 MAKE_PIN(P13, GPIOA, GPIO_PIN_5); // D13
1369 
1370 MAKE_PIN(P14, GPIOA, GPIO_PIN_0); // A0
1371 MAKE_PIN(P15, GPIOA, GPIO_PIN_1); // A1
1372 MAKE_PIN(P16, GPIOA, GPIO_PIN_4); // A2
1373 MAKE_PIN(P17, GPIOB, GPIO_PIN_0); // A3
1374 MAKE_PIN(P18, GPIOC, GPIO_PIN_1); // A4
1375 MAKE_PIN(P19, GPIOC, GPIO_PIN_0); // A5
1376 
1377 #undef MAKE_PIN
1378 
1379 
1380 #elif defined(ARDUINO_NRF52840_FEATHER)
1381 
1382 #define MAKE_PIN(className, pin) \
1383 class className { \
1384 public: \
1385  static void Set() { \
1386  nrf_gpio_pin_set(pin); \
1387  } \
1388  static void Clear() { \
1389  nrf_gpio_pin_clear(pin); \
1390  } \
1391  static void SetDirRead() { \
1392  nrf_gpio_cfg_input(pin, NRF_GPIO_PIN_NOPULL); \
1393  } \
1394  static void SetDirWrite() { \
1395  nrf_gpio_cfg_output(pin); \
1396  } \
1397  static uint8_t IsSet() { \
1398  return (uint8_t)nrf_gpio_pin_read(pin); \
1399  } \
1400 };
1401 
1402 // Based on variants/feather_nrf52840_express/variant.cpp
1403 // g_ADigitalPinMap could be used directly, but it would be slower
1404 MAKE_PIN(P0, (25));
1405 MAKE_PIN(P1, (24));
1406 MAKE_PIN(P2, (10));
1407 MAKE_PIN(P3, (47));
1408 MAKE_PIN(P4, (42));
1409 MAKE_PIN(P5, (40));
1410 MAKE_PIN(P6, (7));
1411 MAKE_PIN(P7, (34));
1412 MAKE_PIN(P8, (16));
1413 MAKE_PIN(P9, (26));
1414 MAKE_PIN(P10, (27));
1415 MAKE_PIN(P11, (6));
1416 MAKE_PIN(P12, (8));
1417 MAKE_PIN(P13, (41));
1418 MAKE_PIN(P14, (4));
1419 MAKE_PIN(P15, (5));
1420 MAKE_PIN(P17, (30));
1421 MAKE_PIN(P18, (28));
1422 MAKE_PIN(P16, (2));
1423 MAKE_PIN(P19, (3));
1424 MAKE_PIN(P20, (29));
1425 MAKE_PIN(P21, (31));
1426 MAKE_PIN(P22, (12));
1427 MAKE_PIN(P23, (11));
1428 MAKE_PIN(P24, (15));
1429 MAKE_PIN(P25, (13));
1430 MAKE_PIN(P26, (14));
1431 MAKE_PIN(P27, (19));
1432 MAKE_PIN(P28, (20));
1433 MAKE_PIN(P29, (17));
1434 MAKE_PIN(P30, (22));
1435 MAKE_PIN(P31, (23));
1436 MAKE_PIN(P32, (21));
1437 MAKE_PIN(P33, (9));
1438 
1439 #undef MAKE_PIN
1440 
1441 #else
1442 #error "Please define board in avrpins.h"
1443 
1444 #endif
1445 
1446 #elif defined(__ARDUINO_ARC__)
1447 
1448 #include <avr/pgmspace.h>
1449 // Pointers are 32 bits on arc
1450 #define pgm_read_pointer(p) pgm_read_dword(p)
1451 
1452 #define MAKE_PIN(className, pin) \
1453 class className { \
1454 public: \
1455  static void Set() { \
1456  digitalWrite(pin, HIGH);\
1457  } \
1458  static void Clear() { \
1459  digitalWrite(pin, LOW); \
1460  } \
1461  static void SetDirRead() { \
1462  pinMode(pin, INPUT); \
1463  } \
1464  static void SetDirWrite() { \
1465  pinMode(pin, OUTPUT); \
1466  } \
1467  static uint8_t IsSet() { \
1468  return digitalRead(pin); \
1469  } \
1470 };
1471 
1472 MAKE_PIN(P0, 0);
1473 MAKE_PIN(P1, 1);
1474 MAKE_PIN(P2, 2);
1475 MAKE_PIN(P3, 3); //PWM
1476 MAKE_PIN(P4, 4);
1477 MAKE_PIN(P5, 5); //PWM
1478 MAKE_PIN(P6, 6); //PWM
1479 MAKE_PIN(P7, 7);
1480 MAKE_PIN(P8, 8);
1481 MAKE_PIN(P9, 9); //PWM
1482 
1483 MAKE_PIN(P10, 10); //SPI SS
1484 MAKE_PIN(P11, 11); //SPI MOSI
1485 MAKE_PIN(P12, 12); //SPI MISO
1486 MAKE_PIN(P13, 13); //SPI SCK / BUILTIN LED
1487 
1488 MAKE_PIN(P14, 14); // A0
1489 MAKE_PIN(P15, 15); // A1
1490 MAKE_PIN(P16, 16); // A2
1491 MAKE_PIN(P17, 17); // A3
1492 MAKE_PIN(P18, 18); // A4 SDA
1493 MAKE_PIN(P19, 19); // A5 SCL
1494 MAKE_PIN(P20, 20); // ATN
1495 
1496 #undef MAKE_PIN
1497 
1498 #elif defined(__ARDUINO_X86__) // Intel Galileo, Intel Galileo 2 and Intel Edison
1499 
1500 #include <avr/pgmspace.h>
1501 
1502 // Pointers are 32 bits on x86
1503 #define pgm_read_pointer(p) pgm_read_dword(p)
1504 
1505 #if PLATFORM_ID == 0xE1 // Edison platform id
1506 #define pinToFastPin(pin) 1 // As far as I can tell all pins can be used as fast pins
1507 #endif
1508 
1509 // Pin 2 and 3 on the Intel Galileo supports a higher rate,
1510 // so it is recommended to use one of these as the SS pin.
1511 
1512 #define MAKE_PIN(className, pin) \
1513 class className { \
1514 public: \
1515  static void Set() { \
1516  fastDigitalWrite(pin, HIGH); \
1517  } \
1518  static void Clear() { \
1519  fastDigitalWrite(pin, LOW); \
1520  } \
1521  static void SetDirRead() { \
1522  if (pinToFastPin(pin)) \
1523  pinMode(pin, INPUT_FAST); \
1524  else \
1525  pinMode(pin, INPUT); \
1526  } \
1527  static void SetDirWrite() { \
1528  if (pinToFastPin(pin)) \
1529  pinMode(pin, OUTPUT_FAST); \
1530  else \
1531  pinMode(pin, OUTPUT); \
1532  } \
1533  static uint8_t IsSet() { \
1534  return fastDigitalRead(pin); \
1535  } \
1536 };
1537 
1538 MAKE_PIN(P0, 0);
1539 MAKE_PIN(P1, 1);
1540 MAKE_PIN(P2, 2);
1541 MAKE_PIN(P3, 3);
1542 MAKE_PIN(P4, 4);
1543 MAKE_PIN(P5, 5);
1544 MAKE_PIN(P6, 6);
1545 MAKE_PIN(P7, 7);
1546 MAKE_PIN(P8, 8);
1547 MAKE_PIN(P9, 9);
1548 MAKE_PIN(P10, 10);
1549 MAKE_PIN(P11, 11);
1550 MAKE_PIN(P12, 12);
1551 MAKE_PIN(P13, 13);
1552 MAKE_PIN(P14, 14); // A0
1553 MAKE_PIN(P15, 15); // A1
1554 MAKE_PIN(P16, 16); // A2
1555 MAKE_PIN(P17, 17); // A3
1556 MAKE_PIN(P18, 18); // A4
1557 MAKE_PIN(P19, 19); // A5
1558 
1559 #undef MAKE_PIN
1560 
1561 #elif defined(__MIPSEL__)
1562 // MIPSEL (MIPS architecture using a little endian byte order)
1563 
1564 // MIPS size_t = 4
1565 #define pgm_read_pointer(p) pgm_read_dword(p)
1566 
1567 #define MAKE_PIN(className, pin) \
1568 class className { \
1569 public: \
1570  static void Set() { \
1571  digitalWrite(pin, HIGH);\
1572  } \
1573  static void Clear() { \
1574  digitalWrite(pin, LOW); \
1575  } \
1576  static void SetDirRead() { \
1577  pinMode(pin, INPUT); \
1578  } \
1579  static void SetDirWrite() { \
1580  pinMode(pin, OUTPUT); \
1581  } \
1582  static uint8_t IsSet() { \
1583  return digitalRead(pin); \
1584  } \
1585 };
1586 
1587 // 0 .. 13 - Digital pins
1588 MAKE_PIN(P0, 0); // RX
1589 MAKE_PIN(P1, 1); // TX
1590 MAKE_PIN(P2, 2); //
1591 MAKE_PIN(P3, 3); //
1592 MAKE_PIN(P4, 4); //
1593 MAKE_PIN(P5, 5); //
1594 MAKE_PIN(P6, 6); //
1595 MAKE_PIN(P7, 7); //
1596 MAKE_PIN(P8, 8); //
1597 MAKE_PIN(P9, 9); //
1598 MAKE_PIN(P10, 10); //
1599 MAKE_PIN(P11, 11); //
1600 MAKE_PIN(P12, 12); //
1601 MAKE_PIN(P13, 13); //
1602 
1603 #undef MAKE_PIN
1604 
1605 #elif defined(ESP8266) || defined(ESP32)
1606 
1607 #define MAKE_PIN(className, pin) \
1608 class className { \
1609 public: \
1610  static void Set() { \
1611  digitalWrite(pin, HIGH);\
1612  } \
1613  static void Clear() { \
1614  digitalWrite(pin, LOW); \
1615  } \
1616  static void SetDirRead() { \
1617  pinMode(pin, INPUT); \
1618  } \
1619  static void SetDirWrite() { \
1620  pinMode(pin, OUTPUT); \
1621  } \
1622  static uint8_t IsSet() { \
1623  return digitalRead(pin); \
1624  } \
1625 };
1626 
1627 #if defined(ESP8266)
1628 
1629 // Workaround the following issue: https://github.com/esp8266/Arduino/pull/5735
1630 #undef pgm_read_ptr_aligned
1631 #ifdef __cplusplus
1632 #define pgm_read_ptr_aligned(addr) (*reinterpret_cast<const void* const*>(addr))
1633 #else
1634 #define pgm_read_ptr_aligned(addr) (*(const void* const*)(addr))
1635 #endif
1636 
1637 #undef pgm_read_ptr
1638 #if PGM_READ_UNALIGNED
1639 #define pgm_read_ptr(p) pgm_read_ptr_unaligned(p)
1640 #else
1641 #define pgm_read_ptr(p) pgm_read_ptr_aligned(p)
1642 #endif
1643 
1644 #ifdef pgm_read_pointer
1645 #undef pgm_read_pointer
1646 #endif
1647 #define pgm_read_pointer(p) pgm_read_ptr(p)
1648 
1649 // Pinout for ESP-12 module
1650 // 0 .. 16 - Digital pins
1651 // GPIO 6 to 11 and 16 are not usable in this library.
1652 
1653 MAKE_PIN(P0, 0);
1654 MAKE_PIN(P1, 1); // TX0
1655 MAKE_PIN(P2, 2); // TX1
1656 MAKE_PIN(P3, 3); // RX0
1657 MAKE_PIN(P4, 4); // SDA
1658 MAKE_PIN(P5, 5); // SCL
1659 MAKE_PIN(P12, 12); // MISO
1660 MAKE_PIN(P13, 13); // MOSI
1661 MAKE_PIN(P14, 14); // SCK
1662 MAKE_PIN(P15, 15); // SS
1663 
1664 #elif defined(ESP32)
1665 
1666 // Workaround strict-aliasing warnings
1667 #ifdef pgm_read_word
1668 #undef pgm_read_word
1669 #endif
1670 #ifdef pgm_read_dword
1671 #undef pgm_read_dword
1672 #endif
1673 #ifdef pgm_read_float
1674 #undef pgm_read_float
1675 #endif
1676 #ifdef pgm_read_ptr
1677 #undef pgm_read_ptr
1678 #endif
1679 
1680 #define pgm_read_word(addr) ({ \
1681  typeof(addr) _addr = (addr); \
1682  *(const unsigned short *)(_addr); \
1683 })
1684 #define pgm_read_dword(addr) ({ \
1685  typeof(addr) _addr = (addr); \
1686  *(const unsigned long *)(_addr); \
1687 })
1688 #define pgm_read_float(addr) ({ \
1689  typeof(addr) _addr = (addr); \
1690  *(const float *)(_addr); \
1691 })
1692 #define pgm_read_ptr(addr) ({ \
1693  typeof(addr) _addr = (addr); \
1694  *(void * const *)(_addr); \
1695 })
1696 
1697 // Pinout for ESP32 dev module
1698 
1699 MAKE_PIN(P0, 0);
1700 MAKE_PIN(P1, 1); // TX0
1701 MAKE_PIN(P10, 10); // TX1
1702 MAKE_PIN(P3, 3); // RX0
1703 MAKE_PIN(P21, 21); // SDA
1704 MAKE_PIN(P22, 22); // SCL
1705 MAKE_PIN(P19, 19); // MISO
1706 MAKE_PIN(P23, 23); // MOSI
1707 MAKE_PIN(P18, 18); // SCK
1708 MAKE_PIN(P5, 5); // SS
1709 MAKE_PIN(P17, 17); // INT
1710 
1711 #endif
1712 
1713 #undef MAKE_PIN
1714 
1715 // pgm_read_ptr is not defined in the ESP32, so we have to undef the diffinition from version_helper.h
1716 #ifdef pgm_read_pointer
1717 #undef pgm_read_pointer
1718 #endif
1719 #define pgm_read_pointer(p) pgm_read_ptr(p)
1720 
1721 #else
1722 #error "Please define board in avrpins.h"
1723 
1724 #endif
1725 
1726 #endif //_avrpins_h_