12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130 |
- #if !defined(_usb_h_) || defined(_avrpins_h_)
- #error "Never include avrpins.h directly; include Usb.h instead"
- #else
- #define _avrpins_h_
- #if defined(__AVR__)
- #define pgm_read_pointer(p) pgm_read_word(p)
- #if !defined(BOARD_MEGA_ADK) && defined(__AVR_ATmega2560__) && (USE_UHS_MEGA_ADK || defined(ARDUINO_AVR_ADK))
- #define BOARD_MEGA_ADK
- #elif !defined(BOARD_BLACK_WIDDOW) && USE_UHS_BLACK_WIDDOW
- #define BOARD_BLACK_WIDDOW
- #endif
- #ifdef PORTA
- #define USE_PORTA
- #endif
- #ifdef PORTB
- #define USE_PORTB
- #endif
- #ifdef PORTC
- #define USE_PORTC
- #endif
- #ifdef PORTD
- #define USE_PORTD
- #endif
- #ifdef PORTE
- #define USE_PORTE
- #endif
- #ifdef PORTF
- #define USE_PORTF
- #endif
- #ifdef PORTG
- #define USE_PORTG
- #endif
- #ifdef PORTH
- #define USE_PORTH
- #endif
- #ifdef PORTJ
- #define USE_PORTJ
- #endif
- #ifdef PORTK
- #define USE_PORTK
- #endif
- #ifdef PORTL
- #define USE_PORTL
- #endif
- #ifdef PORTQ
- #define USE_PORTQ
- #endif
- #ifdef PORTR
- #define USE_PORTR
- #endif
- #ifdef TCCR0A
- #define USE_TCCR0A
- #endif
- #ifdef TCCR1A
- #define USE_TCCR1A
- #endif
- #ifdef TCCR2A
- #define USE_TCCR2A
- #endif
- #define MAKE_PORT(portName, ddrName, pinName, className, ID) \
- class className{\
- public:\
- typedef uint8_t DataT;\
- public:\
- static void Write(DataT value){portName = value;}\
- static void ClearAndSet(DataT clearMask, DataT value){portName = (portName & ~clearMask) | value;}\
- static DataT Read(){return portName;}\
- static void DirWrite(DataT value){ddrName = value;}\
- static DataT DirRead(){return ddrName;}\
- static void Set(DataT value){portName |= value;}\
- static void Clear(DataT value){portName &= ~value;}\
- static void Toggle(DataT value){portName ^= value;}\
- static void DirSet(DataT value){ddrName |= value;}\
- static void DirClear(DataT value){ddrName &= ~value;}\
- static void DirToggle(DataT value){ddrName ^= value;}\
- static DataT PinRead(){return pinName;}\
- enum{Id = ID};\
- enum{Width=sizeof(DataT)*8};\
- };
- #define MAKE_TCCR(TccrName, className) \
- class className{\
- public:\
- typedef uint8_t DataT;\
- public:\
- static void Write(DataT value){TccrName = value;}\
- static void ClearAndSet(DataT clearMask, DataT value){TccrName = (TccrName & ~clearMask) | value;}\
- static DataT Read(){return TccrName;}\
- static void Set(DataT value){TccrName |= value;}\
- static void Clear(DataT value){TccrName &= ~value;}\
- static void Toggle(DataT value){TccrName ^= value;}\
- enum{Width=sizeof(DataT)*8};\
- };
- #ifdef USE_PORTA
- MAKE_PORT(PORTA, DDRA, PINA, Porta, 'A')
- #endif
- #ifdef USE_PORTB
- MAKE_PORT(PORTB, DDRB, PINB, Portb, 'B')
- #endif
- #ifdef USE_PORTC
- MAKE_PORT(PORTC, DDRC, PINC, Portc, 'C')
- #endif
- #ifdef USE_PORTD
- MAKE_PORT(PORTD, DDRD, PIND, Portd, 'D')
- #endif
- #ifdef USE_PORTE
- MAKE_PORT(PORTE, DDRE, PINE, Porte, 'E')
- #endif
- #ifdef USE_PORTF
- MAKE_PORT(PORTF, DDRF, PINF, Portf, 'F')
- #endif
- #ifdef USE_PORTG
- MAKE_PORT(PORTG, DDRG, PING, Portg, 'G')
- #endif
- #ifdef USE_PORTH
- MAKE_PORT(PORTH, DDRH, PINH, Porth, 'H')
- #endif
- #ifdef USE_PORTJ
- MAKE_PORT(PORTJ, DDRJ, PINJ, Portj, 'J')
- #endif
- #ifdef USE_PORTK
- MAKE_PORT(PORTK, DDRK, PINK, Portk, 'K')
- #endif
- #ifdef USE_PORTL
- MAKE_PORT(PORTL, DDRL, PINL, Portl, 'L')
- #endif
- #ifdef USE_PORTQ
- MAKE_PORT(PORTQ, DDRQ, PINQ, Portq, 'Q')
- #endif
- #ifdef USE_PORTR
- MAKE_PORT(PORTR, DDRR, PINR, Portr, 'R')
- #endif
- #ifdef USE_TCCR0A
- MAKE_TCCR(TCCR0A, Tccr0a)
- #endif
- #ifdef USE_TCCR1A
- MAKE_TCCR(TCCR1A, Tccr1a)
- #endif
- #ifdef USE_TCCR2A
- MAKE_TCCR(TCCR2A, Tccr2a)
- #endif
- template<typename PORT, uint8_t PIN>
- class TPin {
-
- public:
- typedef PORT Port;
- enum {
- Number = PIN
- };
- static void Set() {
- PORT::Set(1 << PIN);
- }
- static void Set(uint8_t val) {
- if(val)
- Set();
- else Clear();
- }
- static void SetDir(uint8_t val) {
- if(val)
- SetDirWrite();
- else SetDirRead();
- }
- static void Clear() {
- PORT::Clear(1 << PIN);
- }
- static void Toggle() {
- PORT::Toggle(1 << PIN);
- }
- static void SetDirRead() {
- PORT::DirClear(1 << PIN);
- }
- static void SetDirWrite() {
- PORT::DirSet(1 << PIN);
- }
- static uint8_t IsSet() {
- return PORT::PinRead() & (uint8_t)(1 << PIN);
- }
- static void WaiteForSet() {
- while(IsSet() == 0) {
- }
- }
- static void WaiteForClear() {
- while(IsSet()) {
- }
- }
- };
- template<typename TCCR, uint8_t COM>
- class TCom {
-
- public:
- typedef TCCR Tccr;
- enum {
- Com = COM
- };
- static void Set() {
- TCCR::Set(1 << COM);
- }
- static void Clear() {
- TCCR::Clear(1 << COM);
- }
- static void Toggle() {
- TCCR::Toggle(1 << COM);
- }
- };
- #ifdef USE_PORTA
- typedef TPin<Porta, 0 > Pa0;
- typedef TPin<Porta, 1 > Pa1;
- typedef TPin<Porta, 2 > Pa2;
- typedef TPin<Porta, 3 > Pa3;
- typedef TPin<Porta, 4 > Pa4;
- typedef TPin<Porta, 5 > Pa5;
- typedef TPin<Porta, 6 > Pa6;
- typedef TPin<Porta, 7 > Pa7;
- #endif
- #ifdef USE_PORTB
- typedef TPin<Portb, 0 > Pb0;
- typedef TPin<Portb, 1 > Pb1;
- typedef TPin<Portb, 2 > Pb2;
- typedef TPin<Portb, 3 > Pb3;
- typedef TPin<Portb, 4 > Pb4;
- typedef TPin<Portb, 5 > Pb5;
- typedef TPin<Portb, 6 > Pb6;
- typedef TPin<Portb, 7 > Pb7;
- #endif
- #ifdef USE_PORTC
- typedef TPin<Portc, 0 > Pc0;
- typedef TPin<Portc, 1 > Pc1;
- typedef TPin<Portc, 2 > Pc2;
- typedef TPin<Portc, 3 > Pc3;
- typedef TPin<Portc, 4 > Pc4;
- typedef TPin<Portc, 5 > Pc5;
- typedef TPin<Portc, 6 > Pc6;
- typedef TPin<Portc, 7 > Pc7;
- #endif
- #ifdef USE_PORTD
- typedef TPin<Portd, 0 > Pd0;
- typedef TPin<Portd, 1 > Pd1;
- typedef TPin<Portd, 2 > Pd2;
- typedef TPin<Portd, 3 > Pd3;
- typedef TPin<Portd, 4 > Pd4;
- typedef TPin<Portd, 5 > Pd5;
- typedef TPin<Portd, 6 > Pd6;
- typedef TPin<Portd, 7 > Pd7;
- #endif
- #ifdef USE_PORTE
- typedef TPin<Porte, 0 > Pe0;
- typedef TPin<Porte, 1 > Pe1;
- typedef TPin<Porte, 2 > Pe2;
- typedef TPin<Porte, 3 > Pe3;
- typedef TPin<Porte, 4 > Pe4;
- typedef TPin<Porte, 5 > Pe5;
- typedef TPin<Porte, 6 > Pe6;
- typedef TPin<Porte, 7 > Pe7;
- #endif
- #ifdef USE_PORTF
- typedef TPin<Portf, 0 > Pf0;
- typedef TPin<Portf, 1 > Pf1;
- typedef TPin<Portf, 2 > Pf2;
- typedef TPin<Portf, 3 > Pf3;
- typedef TPin<Portf, 4 > Pf4;
- typedef TPin<Portf, 5 > Pf5;
- typedef TPin<Portf, 6 > Pf6;
- typedef TPin<Portf, 7 > Pf7;
- #endif
- #ifdef USE_PORTG
- typedef TPin<Portg, 0 > Pg0;
- typedef TPin<Portg, 1 > Pg1;
- typedef TPin<Portg, 2 > Pg2;
- typedef TPin<Portg, 3 > Pg3;
- typedef TPin<Portg, 4 > Pg4;
- typedef TPin<Portg, 5 > Pg5;
- typedef TPin<Portg, 6 > Pg6;
- typedef TPin<Portg, 7 > Pg7;
- #endif
- #ifdef USE_PORTH
- typedef TPin<Porth, 0 > Ph0;
- typedef TPin<Porth, 1 > Ph1;
- typedef TPin<Porth, 2 > Ph2;
- typedef TPin<Porth, 3 > Ph3;
- typedef TPin<Porth, 4 > Ph4;
- typedef TPin<Porth, 5 > Ph5;
- typedef TPin<Porth, 6 > Ph6;
- typedef TPin<Porth, 7 > Ph7;
- #endif
- #ifdef USE_PORTJ
- typedef TPin<Portj, 0 > Pj0;
- typedef TPin<Portj, 1 > Pj1;
- typedef TPin<Portj, 2 > Pj2;
- typedef TPin<Portj, 3 > Pj3;
- typedef TPin<Portj, 4 > Pj4;
- typedef TPin<Portj, 5 > Pj5;
- typedef TPin<Portj, 6 > Pj6;
- typedef TPin<Portj, 7 > Pj7;
- #endif
- #ifdef USE_PORTK
- typedef TPin<Portk, 0 > Pk0;
- typedef TPin<Portk, 1 > Pk1;
- typedef TPin<Portk, 2 > Pk2;
- typedef TPin<Portk, 3 > Pk3;
- typedef TPin<Portk, 4 > Pk4;
- typedef TPin<Portk, 5 > Pk5;
- typedef TPin<Portk, 6 > Pk6;
- typedef TPin<Portk, 7 > Pk7;
- #endif
- #ifdef USE_PORTL
- typedef TPin<Portl, 0 > Pl0;
- typedef TPin<Portl, 1 > Pl1;
- typedef TPin<Portl, 2 > Pl2;
- typedef TPin<Portl, 3 > Pl3;
- typedef TPin<Portl, 4 > Pl4;
- typedef TPin<Portl, 5 > Pl5;
- typedef TPin<Portl, 6 > Pl6;
- typedef TPin<Portl, 7 > Pl7;
- #endif
- #ifdef USE_PORTQ
- typedef TPin<Portq, 0 > Pq0;
- typedef TPin<Portq, 1 > Pq1;
- typedef TPin<Portq, 2 > Pq2;
- typedef TPin<Portq, 3 > Pq3;
- typedef TPin<Portq, 4 > Pq4;
- typedef TPin<Portq, 5 > Pq5;
- typedef TPin<Portq, 6 > Pq6;
- typedef TPin<Portq, 7 > Pq7;
- #endif
- #ifdef USE_PORTR
- typedef TPin<Portr, 0 > Pr0;
- typedef TPin<Portr, 1 > Pr1;
- typedef TPin<Portr, 2 > Pr2;
- typedef TPin<Portr, 3 > Pr3;
- typedef TPin<Portr, 4 > Pr4;
- typedef TPin<Portr, 5 > Pr5;
- typedef TPin<Portr, 6 > Pr6;
- typedef TPin<Portr, 7 > Pr7;
- #endif
- #ifdef USE_TCCR0A
- typedef TCom<Tccr0a, COM0A1> Tc0a;
- typedef TCom<Tccr0a, COM0B1> Tc0b;
- #endif
- #ifdef USE_TCCR1A
- typedef TCom<Tccr1a, COM1A1> Tc1a;
- typedef TCom<Tccr1a, COM1B1> Tc1b;
- #endif
- #ifdef USE_TCCR2A
- typedef TCom<Tccr2a, COM2A1> Tc2a;
- typedef TCom<Tccr2a, COM2B1> Tc2b;
- #endif
- template<typename Tp_pin, typename Tc_bit>
- class Tp_Tc {
- public:
- static void SetDir(uint8_t val) {
- if(val)
- SetDirWrite();
- else SetDirRead();
- }
- static void SetDirRead() {
- Tp_pin::SetDirRead();
- Tc_bit::Clear();
- }
- static void SetDirWrite() {
- Tp_pin::SetDirWrite();
- Tc_bit::Clear();
- }
- };
- #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- #define P0 Pe0
- #define P1 Pe1
- #define P2 Pe4
- #define P3 Pe5
- #define P4 Pg5
- #define P5 Pe3
- #define P6 Ph3
- #define P7 Ph4
- #define P8 Ph5
- #define P9 Ph6
- #define P10 Pb4
- #define P11 Pb5
- #define P12 Pb6
- #define P13 Pb7
- #define P14 Pj1
- #define P15 Pj0
- #define P16 Ph1
- #define P17 Ph0
- #define P18 Pd3
- #define P19 Pd2
- #define P20 Pd1
- #define P21 Pd0
- #define P22 Pa0
- #define P23 Pa1
- #define P24 Pa2
- #define P25 Pa3
- #define P26 Pa4
- #define P27 Pa5
- #define P28 Pa6
- #define P29 Pa7
- #define P30 Pc7
- #define P31 Pc6
- #define P32 Pc5
- #define P33 Pc4
- #define P34 Pc3
- #define P35 Pc2
- #define P36 Pc1
- #define P37 Pc0
- #define P38 Pd7
- #define P39 Pg2
- #define P40 Pg1
- #define P41 Pg0
- #define P42 Pl7
- #define P43 Pl6
- #define P44 Pl5
- #define P45 Pl4
- #define P46 Pl3
- #define P47 Pl2
- #define P48 Pl1
- #define P49 Pl0
- #define P50 Pb3
- #define P51 Pb2
- #define P52 Pb1
- #define P53 Pb0
- #ifdef BOARD_MEGA_ADK
- #define P54 Pe6
- #define P55 Pj2
- #endif
- #elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
- #define P0 Pd0
- #define P1 Pd1
- #define P2 Pd2
- #define P3 Pd3
- #define P4 Pd4
- #define P5 Pd5
- #define P6 Pd6
- #define P7 Pd7
- #define P8 Pb0
- #define P9 Pb1
- #define P10 Pb2
- #define P11 Pb3
- #define P12 Pb4
- #define P13 Pb5
- #define P14 Pc0
- #define P15 Pc1
- #define P16 Pc2
- #define P17 Pc3
- #define P18 Pc4
- #define P19 Pc5
- #elif defined(CORE_TEENSY) && defined(__AVR_ATmega32U4__)
- #define P0 Pb0
- #define P1 Pb1
- #define P2 Pb2
- #define P3 Pb3
- #define P4 Pb7
- #define P5 Pd0
- #define P6 Pd1
- #define P7 Pd2
- #define P8 Pd3
- #define P9 Pc6
- #define P10 Pc7
- #define P11 Pd6
- #define P12 Pd7
- #define P13 Pb4
- #define P14 Pb5
- #define P15 Pb6
- #define P16 Pf7
- #define P17 Pf6
- #define P18 Pf5
- #define P19 Pf4
- #define P20 Pf1
- #define P21 Pf0
- #define P22 Pd4
- #define P23 Pd5
- #define P24 Pe6
- #elif defined(__AVR_ATmega32U4__)
- #define P0 Pd2
- #define P1 Pd3
- #define P2 Pd1
- #define P3 Pd0
- #define P4 Pd4
- #define P5 Pc6
- #define P6 Pd7
- #define P7 Pe6
- #define P8 Pb4
- #define P9 Pb5
- #define P10 Pb6
- #define P11 Pb7
- #define P12 Pd6
- #define P13 Pc7
- #define P14 Pb3
- #define P15 Pb1
- #define P16 Pb2
- #define P17 Pb0
- #define P18 Pf7
- #define P19 Pf6
- #define P20 Pf5
- #define P21 Pf4
- #define P22 Pf1
- #define P23 Pf0
- #define P24 Pd4
- #define P25 Pd7
- #define P26 Pb4
- #define P27 Pb5
- #define P28 Pb6
- #define P29 Pd6
- #elif defined(CORE_TEENSY) && (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__))
- #define P0 Pd0
- #define P1 Pd1
- #define P2 Pd2
- #define P3 Pd3
- #define P4 Pd4
- #define P5 Pd5
- #define P6 Pd6
- #define P7 Pd7
- #define P8 Pe0
- #define P9 Pe1
- #define P10 Pc0
- #define P11 Pc1
- #define P12 Pc2
- #define P13 Pc3
- #define P14 Pc4
- #define P15 Pc5
- #define P16 Pc6
- #define P17 Pc7
- #define P18 Pe6
- #define P19 Pe7
- #define P20 Pb0
- #define P21 Pb1
- #define P22 Pb2
- #define P23 Pb3
- #define P24 Pb4
- #define P25 Pb5
- #define P26 Pb6
- #define P27 Pb7
- #define P28 Pa0
- #define P29 Pa1
- #define P30 Pa2
- #define P31 Pa3
- #define P32 Pa4
- #define P33 Pa5
- #define P34 Pa6
- #define P35 Pa7
- #define P36 Pe4
- #define P37 Pe5
- #define P38 Pf0
- #define P39 Pf1
- #define P40 Pf2
- #define P41 Pf3
- #define P42 Pf4
- #define P43 Pf5
- #define P44 Pf6
- #define P45 Pf7
- #elif defined(ARDUINO_AVR_BALANDUINO) && (defined(__AVR_ATmega644__) || defined(__AVR_ATmega1284P__))
- #define P0 Pd0
- #define P1 Pd1
- #if BALANDUINO_REVISION < 13
- #define P2 Pb2
- #define P3 Pd6
- #define P4 Pd7
- #define P5 Pb3
- #else
- #define P2 Pd2
- #define P3 Pd3
- #define P4 Pd6
- #define P5 Pd7
- #endif
- #define P6 Pb4
- #define P7 Pa0
- #define P8 Pa1
- #define P9 Pa2
- #define P10 Pa3
- #define P11 Pa4
- #define P12 Pa5
- #define P13 Pc1
- #define P14 Pc0
- #if BALANDUINO_REVISION < 13
- #define P15 Pd2
- #define P16 Pd3
- #else
- #define P15 Pb2
- #define P16 Pb3
- #endif
- #define P17 Pd4
- #define P18 Pd5
- #define P19 Pc2
- #define P20 Pc3
- #define P21 Pc4
- #define P22 Pc5
- #define P23 Pc6
- #define P24 Pc7
- #define P25 Pb0
- #define P26 Pb1
- #define P27 Pb5
- #define P28 Pb6
- #define P29 Pb7
- #define P30 Pa6
- #define P31 Pa7
- #elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
- #define P0 Pb0
- #define P1 Pb1
- #define P2 Pb2
- #define P3 Pb3
- #define P4 Pb4
- #define P5 Pb5
- #define P6 Pb6
- #define P7 Pb7
- #define P8 Pd0
- #define P9 Pd1
- #define P10 Pd2
- #define P11 Pd3
- #define P12 Pd4
- #define P13 Pd5
- #define P14 Pd6
- #define P15 Pd7
- #define P16 Pc0
- #define P17 Pc1
- #define P18 Pc2
- #define P19 Pc3
- #define P20 Pc4
- #define P21 Pc5
- #define P22 Pc6
- #define P23 Pc7
- #define P24 Pa0
- #define P25 Pa1
- #define P26 Pa2
- #define P27 Pa3
- #define P28 Pa4
- #define P29 Pa5
- #define P30 Pa6
- #define P31 Pa7
- #else
- #error "Please define board in avrpins.h"
- #endif
- #elif defined(__arm__)
- #define pgm_read_pointer(p) pgm_read_dword(p)
- #if defined(CORE_TEENSY) && (defined(__MK20DX128__) || defined(__MK20DX256__))
- #include "core_pins.h"
- #include "avr_emulation.h"
- #define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000)
- #define GPIO_BITBAND_PTR(reg, bit) ((uint8_t *)GPIO_BITBAND_ADDR((reg), (bit)))
- #define MAKE_PIN(className, baseReg, pinNum, configReg) \
- class className { \
- public: \
- static void Set() { \
- *GPIO_BITBAND_PTR(baseReg, pinNum) = 1; \
- } \
- static void Clear() { \
- *GPIO_BITBAND_PTR(baseReg, pinNum) = 0; \
- } \
- static void SetDirRead() { \
- configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
- *(GPIO_BITBAND_PTR(baseReg, pinNum) + 640) = 0; \
- } \
- static void SetDirWrite() { \
- configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
- *(GPIO_BITBAND_PTR(baseReg, pinNum) + 640) = 1; \
- } \
- static uint8_t IsSet() { \
- return *(GPIO_BITBAND_PTR(baseReg, pinNum) + 512); \
- } \
- };
- MAKE_PIN(P0, CORE_PIN0_PORTREG, CORE_PIN0_BIT, CORE_PIN0_CONFIG);
- MAKE_PIN(P1, CORE_PIN1_PORTREG, CORE_PIN1_BIT, CORE_PIN1_CONFIG);
- MAKE_PIN(P2, CORE_PIN2_PORTREG, CORE_PIN2_BIT, CORE_PIN2_CONFIG);
- MAKE_PIN(P3, CORE_PIN3_PORTREG, CORE_PIN3_BIT, CORE_PIN3_CONFIG);
- MAKE_PIN(P4, CORE_PIN4_PORTREG, CORE_PIN4_BIT, CORE_PIN4_CONFIG);
- MAKE_PIN(P5, CORE_PIN5_PORTREG, CORE_PIN5_BIT, CORE_PIN5_CONFIG);
- MAKE_PIN(P6, CORE_PIN6_PORTREG, CORE_PIN6_BIT, CORE_PIN6_CONFIG);
- MAKE_PIN(P7, CORE_PIN7_PORTREG, CORE_PIN7_BIT, CORE_PIN7_CONFIG);
- MAKE_PIN(P8, CORE_PIN8_PORTREG, CORE_PIN8_BIT, CORE_PIN8_CONFIG);
- MAKE_PIN(P9, CORE_PIN9_PORTREG, CORE_PIN9_BIT, CORE_PIN9_CONFIG);
- MAKE_PIN(P10, CORE_PIN10_PORTREG, CORE_PIN10_BIT, CORE_PIN10_CONFIG);
- MAKE_PIN(P11, CORE_PIN11_PORTREG, CORE_PIN11_BIT, CORE_PIN11_CONFIG);
- MAKE_PIN(P12, CORE_PIN12_PORTREG, CORE_PIN12_BIT, CORE_PIN12_CONFIG);
- MAKE_PIN(P13, CORE_PIN13_PORTREG, CORE_PIN13_BIT, CORE_PIN13_CONFIG);
- MAKE_PIN(P14, CORE_PIN14_PORTREG, CORE_PIN14_BIT, CORE_PIN14_CONFIG);
- MAKE_PIN(P15, CORE_PIN15_PORTREG, CORE_PIN15_BIT, CORE_PIN15_CONFIG);
- MAKE_PIN(P16, CORE_PIN16_PORTREG, CORE_PIN16_BIT, CORE_PIN16_CONFIG);
- MAKE_PIN(P17, CORE_PIN17_PORTREG, CORE_PIN17_BIT, CORE_PIN17_CONFIG);
- MAKE_PIN(P18, CORE_PIN18_PORTREG, CORE_PIN18_BIT, CORE_PIN18_CONFIG);
- MAKE_PIN(P19, CORE_PIN19_PORTREG, CORE_PIN19_BIT, CORE_PIN19_CONFIG);
- MAKE_PIN(P20, CORE_PIN20_PORTREG, CORE_PIN20_BIT, CORE_PIN20_CONFIG);
- MAKE_PIN(P21, CORE_PIN21_PORTREG, CORE_PIN21_BIT, CORE_PIN21_CONFIG);
- MAKE_PIN(P22, CORE_PIN22_PORTREG, CORE_PIN22_BIT, CORE_PIN22_CONFIG);
- MAKE_PIN(P23, CORE_PIN23_PORTREG, CORE_PIN23_BIT, CORE_PIN23_CONFIG);
- MAKE_PIN(P24, CORE_PIN24_PORTREG, CORE_PIN24_BIT, CORE_PIN24_CONFIG);
- MAKE_PIN(P25, CORE_PIN25_PORTREG, CORE_PIN25_BIT, CORE_PIN25_CONFIG);
- MAKE_PIN(P26, CORE_PIN26_PORTREG, CORE_PIN26_BIT, CORE_PIN26_CONFIG);
- MAKE_PIN(P27, CORE_PIN27_PORTREG, CORE_PIN27_BIT, CORE_PIN27_CONFIG);
- MAKE_PIN(P28, CORE_PIN28_PORTREG, CORE_PIN28_BIT, CORE_PIN28_CONFIG);
- MAKE_PIN(P29, CORE_PIN29_PORTREG, CORE_PIN29_BIT, CORE_PIN29_CONFIG);
- MAKE_PIN(P30, CORE_PIN30_PORTREG, CORE_PIN30_BIT, CORE_PIN30_CONFIG);
- MAKE_PIN(P31, CORE_PIN31_PORTREG, CORE_PIN31_BIT, CORE_PIN31_CONFIG);
- MAKE_PIN(P32, CORE_PIN32_PORTREG, CORE_PIN32_BIT, CORE_PIN32_CONFIG);
- MAKE_PIN(P33, CORE_PIN33_PORTREG, CORE_PIN33_BIT, CORE_PIN33_CONFIG);
- #undef MAKE_PIN
- #elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)
- #define MAKE_PIN(className, pio, pinMask) \
- class className { \
- public: \
- static void Set() { \
- pio->PIO_SODR = pinMask; \
- } \
- static void Clear() { \
- pio->PIO_CODR = pinMask; \
- } \
- static void SetDirRead() { \
- pio->PIO_IDR = pinMask ; \
- pio->PIO_PUDR = pinMask; \
- pio->PIO_ODR = pinMask; \
- pio->PIO_PER = pinMask; \
- } \
- static void SetDirWrite() { \
- pio->PIO_IDR = pinMask ; \
- pio->PIO_PUDR = pinMask; \
- pio->PIO_OER = pinMask; \
- pio->PIO_PER = pinMask; \
- } \
- static uint8_t IsSet() { \
- return pio->PIO_PDSR & pinMask; \
- } \
- };
- MAKE_PIN(P0, PIOA, PIO_PA8);
- MAKE_PIN(P1, PIOA, PIO_PA9);
- MAKE_PIN(P2, PIOB, PIO_PB25);
- MAKE_PIN(P3, PIOC, PIO_PC28);
- MAKE_PIN(P4, PIOC, PIO_PC26);
- MAKE_PIN(P5, PIOC, PIO_PC25);
- MAKE_PIN(P6, PIOC, PIO_PC24);
- MAKE_PIN(P7, PIOC, PIO_PC23);
- MAKE_PIN(P8, PIOC, PIO_PC22);
- MAKE_PIN(P9, PIOC, PIO_PC21);
- MAKE_PIN(P10, PIOC, PIO_PC29);
- MAKE_PIN(P11, PIOD, PIO_PD7);
- MAKE_PIN(P12, PIOD, PIO_PD8);
- MAKE_PIN(P13, PIOB, PIO_PB27);
- MAKE_PIN(P14, PIOD, PIO_PD4);
- MAKE_PIN(P15, PIOD, PIO_PD5);
- MAKE_PIN(P16, PIOA, PIO_PA13);
- MAKE_PIN(P17, PIOA, PIO_PA12);
- MAKE_PIN(P18, PIOA, PIO_PA11);
- MAKE_PIN(P19, PIOA, PIO_PA10);
- MAKE_PIN(P20, PIOB, PIO_PB12);
- MAKE_PIN(P21, PIOB, PIO_PB13);
- MAKE_PIN(P22, PIOB, PIO_PB26);
- MAKE_PIN(P23, PIOA, PIO_PA14);
- MAKE_PIN(P24, PIOA, PIO_PA15);
- MAKE_PIN(P25, PIOD, PIO_PD0);
- MAKE_PIN(P26, PIOD, PIO_PD1);
- MAKE_PIN(P27, PIOD, PIO_PD2);
- MAKE_PIN(P28, PIOD, PIO_PD3);
- MAKE_PIN(P29, PIOD, PIO_PD6);
- MAKE_PIN(P30, PIOD, PIO_PD9);
- MAKE_PIN(P31, PIOA, PIO_PA7);
- MAKE_PIN(P32, PIOD, PIO_PD10);
- MAKE_PIN(P33, PIOC, PIO_PC1);
- MAKE_PIN(P34, PIOC, PIO_PC2);
- MAKE_PIN(P35, PIOC, PIO_PC3);
- MAKE_PIN(P36, PIOC, PIO_PC4);
- MAKE_PIN(P37, PIOC, PIO_PC5);
- MAKE_PIN(P38, PIOC, PIO_PC6);
- MAKE_PIN(P39, PIOC, PIO_PC7);
- MAKE_PIN(P40, PIOC, PIO_PC8);
- MAKE_PIN(P41, PIOC, PIO_PC9);
- MAKE_PIN(P42, PIOA, PIO_PA19);
- MAKE_PIN(P43, PIOA, PIO_PA20);
- MAKE_PIN(P44, PIOC, PIO_PC19);
- MAKE_PIN(P45, PIOC, PIO_PC18);
- MAKE_PIN(P46, PIOC, PIO_PC17);
- MAKE_PIN(P47, PIOC, PIO_PC16);
- MAKE_PIN(P48, PIOC, PIO_PC15);
- MAKE_PIN(P49, PIOC, PIO_PC14);
- MAKE_PIN(P50, PIOC, PIO_PC13);
- MAKE_PIN(P51, PIOC, PIO_PC12);
- MAKE_PIN(P52, PIOB, PIO_PB21);
- MAKE_PIN(P53, PIOB, PIO_PB14);
- MAKE_PIN(P54, PIOA, PIO_PA16);
- MAKE_PIN(P55, PIOA, PIO_PA24);
- MAKE_PIN(P56, PIOA, PIO_PA23);
- MAKE_PIN(P57, PIOA, PIO_PA22);
- MAKE_PIN(P58, PIOA, PIO_PA6);
- MAKE_PIN(P59, PIOA, PIO_PA4);
- MAKE_PIN(P60, PIOA, PIO_PA3);
- MAKE_PIN(P61, PIOA, PIO_PA2);
- MAKE_PIN(P62, PIOB, PIO_PB17);
- MAKE_PIN(P63, PIOB, PIO_PB18);
- MAKE_PIN(P64, PIOB, PIO_PB19);
- MAKE_PIN(P65, PIOB, PIO_PB20);
- MAKE_PIN(P66, PIOB, PIO_PB15);
- MAKE_PIN(P67, PIOB, PIO_PB16);
- MAKE_PIN(P68, PIOA, PIO_PA1);
- MAKE_PIN(P69, PIOA, PIO_PA0);
- MAKE_PIN(P70, PIOA, PIO_PA17);
- MAKE_PIN(P71, PIOA, PIO_PA18);
- MAKE_PIN(P72, PIOC, PIO_PC30);
- MAKE_PIN(P73, PIOA, PIO_PA21);
- MAKE_PIN(P74, PIOA, PIO_PA25);
- MAKE_PIN(P75, PIOA, PIO_PA26);
- MAKE_PIN(P76, PIOA, PIO_PA27);
- MAKE_PIN(P77, PIOA, PIO_PA28);
- MAKE_PIN(P78, PIOB, PIO_PB23);
- #undef MAKE_PIN
- #elif defined(RBL_NRF51822)
- #define MAKE_PIN(className, pin) \
- class className { \
- public: \
- static void Set() { \
- nrf_gpio_pin_set(pin); \
- } \
- static void Clear() { \
- nrf_gpio_pin_clear(pin); \
- } \
- static void SetDirRead() { \
- nrf_gpio_cfg_input(pin, NRF_GPIO_PIN_NOPULL); \
- } \
- static void SetDirWrite() { \
- nrf_gpio_cfg_output(pin); \
- } \
- static uint8_t IsSet() { \
- return (uint8_t)nrf_gpio_pin_read(pin); \
- } \
- };
- MAKE_PIN(P0, Pin_nRF51822_to_Arduino(D0));
- MAKE_PIN(P1, Pin_nRF51822_to_Arduino(D1));
- MAKE_PIN(P2, Pin_nRF51822_to_Arduino(D2));
- MAKE_PIN(P3, Pin_nRF51822_to_Arduino(D3));
- MAKE_PIN(P4, Pin_nRF51822_to_Arduino(D4));
- MAKE_PIN(P5, Pin_nRF51822_to_Arduino(D5));
- MAKE_PIN(P6, Pin_nRF51822_to_Arduino(D6));
- MAKE_PIN(P7, Pin_nRF51822_to_Arduino(D7));
- MAKE_PIN(P8, Pin_nRF51822_to_Arduino(D8));
- MAKE_PIN(P9, Pin_nRF51822_to_Arduino(D9));
- MAKE_PIN(P10, Pin_nRF51822_to_Arduino(D10));
- MAKE_PIN(P11, Pin_nRF51822_to_Arduino(D11));
- MAKE_PIN(P12, Pin_nRF51822_to_Arduino(D12));
- MAKE_PIN(P13, Pin_nRF51822_to_Arduino(D13));
- MAKE_PIN(P14, Pin_nRF51822_to_Arduino(D14));
- MAKE_PIN(P15, Pin_nRF51822_to_Arduino(D15));
- MAKE_PIN(P17, Pin_nRF51822_to_Arduino(D17));
- MAKE_PIN(P18, Pin_nRF51822_to_Arduino(D18));
- MAKE_PIN(P16, Pin_nRF51822_to_Arduino(D16));
- MAKE_PIN(P19, Pin_nRF51822_to_Arduino(D19));
- MAKE_PIN(P20, Pin_nRF51822_to_Arduino(D20));
- MAKE_PIN(P21, Pin_nRF51822_to_Arduino(D21));
- MAKE_PIN(P22, Pin_nRF51822_to_Arduino(D22));
- MAKE_PIN(P23, Pin_nRF51822_to_Arduino(D23));
- MAKE_PIN(P24, Pin_nRF51822_to_Arduino(D24));
- #undef MAKE_PIN
- #else
- #error "Please define board in avrpins.h"
- #endif
- #elif defined(__ARDUINO_X86__)
- #include <avr/pgmspace.h>
- #define pgm_read_pointer(p) pgm_read_dword(p)
- #if PLATFORM_ID == 0xE1
- #define pinToFastPin(pin) 1
- #endif
- #define MAKE_PIN(className, pin) \
- class className { \
- public: \
- static void Set() { \
- fastDigitalWrite(pin, HIGH); \
- } \
- static void Clear() { \
- fastDigitalWrite(pin, LOW); \
- } \
- static void SetDirRead() { \
- if (pinToFastPin(pin)) \
- pinMode(pin, INPUT_FAST); \
- else \
- pinMode(pin, INPUT); \
- } \
- static void SetDirWrite() { \
- if (pinToFastPin(pin)) \
- pinMode(pin, OUTPUT_FAST); \
- else \
- pinMode(pin, OUTPUT); \
- } \
- static uint8_t IsSet() { \
- return fastDigitalRead(pin); \
- } \
- };
- MAKE_PIN(P0, 0);
- MAKE_PIN(P1, 1);
- MAKE_PIN(P2, 2);
- MAKE_PIN(P3, 3);
- MAKE_PIN(P4, 4);
- MAKE_PIN(P5, 5);
- MAKE_PIN(P6, 6);
- MAKE_PIN(P7, 7);
- MAKE_PIN(P8, 8);
- MAKE_PIN(P9, 9);
- MAKE_PIN(P10, 10);
- MAKE_PIN(P11, 11);
- MAKE_PIN(P12, 12);
- MAKE_PIN(P13, 13);
- MAKE_PIN(P14, 14);
- MAKE_PIN(P15, 15);
- MAKE_PIN(P16, 16);
- MAKE_PIN(P17, 17);
- MAKE_PIN(P18, 18);
- MAKE_PIN(P19, 19);
- #undef MAKE_PIN
- #elif defined(__MIPSEL__)
- #define pgm_read_pointer(p) pgm_read_dword(p)
- #define MAKE_PIN(className, pin) \
- class className { \
- public: \
- static void Set() { \
- digitalWrite(pin, HIGH);\
- } \
- static void Clear() { \
- digitalWrite(pin, LOW); \
- } \
- static void SetDirRead() { \
- pinMode(pin, INPUT); \
- } \
- static void SetDirWrite() { \
- pinMode(pin, OUTPUT); \
- } \
- static uint8_t IsSet() { \
- return digitalRead(pin); \
- } \
- };
- MAKE_PIN(P0, 0);
- MAKE_PIN(P1, 1);
- MAKE_PIN(P2, 2);
- MAKE_PIN(P3, 3);
- MAKE_PIN(P4, 4);
- MAKE_PIN(P5, 5);
- MAKE_PIN(P6, 6);
- MAKE_PIN(P7, 7);
- MAKE_PIN(P8, 8);
- MAKE_PIN(P9, 9);
- MAKE_PIN(P10, 10);
- MAKE_PIN(P11, 11);
- MAKE_PIN(P12, 12);
- MAKE_PIN(P13, 13);
- #undef MAKE_PIN
- #else
- #error "Please define board in avrpins.h"
- #endif
- #endif
|