00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef Sd2PinMap_h
00022 #define Sd2PinMap_h
00023 #include <avr/io.h>
00024
00025
00027 struct pin_map_t {
00028 volatile uint8_t* ddr;
00029 volatile uint8_t* pin;
00030 volatile uint8_t* port;
00031 uint8_t bit;
00032 };
00033
00034 #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
00035
00036
00037
00038 uint8_t const SDA_PIN = 20;
00039 uint8_t const SCL_PIN = 21;
00040
00041
00042 uint8_t const SS_PIN = 53;
00043 uint8_t const MOSI_PIN = 51;
00044 uint8_t const MISO_PIN = 50;
00045 uint8_t const SCK_PIN = 52;
00046
00047 static const pin_map_t digitalPinMap[] = {
00048 {&DDRE, &PINE, &PORTE, 0},
00049 {&DDRE, &PINE, &PORTE, 1},
00050 {&DDRE, &PINE, &PORTE, 4},
00051 {&DDRE, &PINE, &PORTE, 5},
00052 {&DDRG, &PING, &PORTG, 5},
00053 {&DDRE, &PINE, &PORTE, 3},
00054 {&DDRH, &PINH, &PORTH, 3},
00055 {&DDRH, &PINH, &PORTH, 4},
00056 {&DDRH, &PINH, &PORTH, 5},
00057 {&DDRH, &PINH, &PORTH, 6},
00058 {&DDRB, &PINB, &PORTB, 4},
00059 {&DDRB, &PINB, &PORTB, 5},
00060 {&DDRB, &PINB, &PORTB, 6},
00061 {&DDRB, &PINB, &PORTB, 7},
00062 {&DDRJ, &PINJ, &PORTJ, 1},
00063 {&DDRJ, &PINJ, &PORTJ, 0},
00064 {&DDRH, &PINH, &PORTH, 1},
00065 {&DDRH, &PINH, &PORTH, 0},
00066 {&DDRD, &PIND, &PORTD, 3},
00067 {&DDRD, &PIND, &PORTD, 2},
00068 {&DDRD, &PIND, &PORTD, 1},
00069 {&DDRD, &PIND, &PORTD, 0},
00070 {&DDRA, &PINA, &PORTA, 0},
00071 {&DDRA, &PINA, &PORTA, 1},
00072 {&DDRA, &PINA, &PORTA, 2},
00073 {&DDRA, &PINA, &PORTA, 3},
00074 {&DDRA, &PINA, &PORTA, 4},
00075 {&DDRA, &PINA, &PORTA, 5},
00076 {&DDRA, &PINA, &PORTA, 6},
00077 {&DDRA, &PINA, &PORTA, 7},
00078 {&DDRC, &PINC, &PORTC, 7},
00079 {&DDRC, &PINC, &PORTC, 6},
00080 {&DDRC, &PINC, &PORTC, 5},
00081 {&DDRC, &PINC, &PORTC, 4},
00082 {&DDRC, &PINC, &PORTC, 3},
00083 {&DDRC, &PINC, &PORTC, 2},
00084 {&DDRC, &PINC, &PORTC, 1},
00085 {&DDRC, &PINC, &PORTC, 0},
00086 {&DDRD, &PIND, &PORTD, 7},
00087 {&DDRG, &PING, &PORTG, 2},
00088 {&DDRG, &PING, &PORTG, 1},
00089 {&DDRG, &PING, &PORTG, 0},
00090 {&DDRL, &PINL, &PORTL, 7},
00091 {&DDRL, &PINL, &PORTL, 6},
00092 {&DDRL, &PINL, &PORTL, 5},
00093 {&DDRL, &PINL, &PORTL, 4},
00094 {&DDRL, &PINL, &PORTL, 3},
00095 {&DDRL, &PINL, &PORTL, 2},
00096 {&DDRL, &PINL, &PORTL, 1},
00097 {&DDRL, &PINL, &PORTL, 0},
00098 {&DDRB, &PINB, &PORTB, 3},
00099 {&DDRB, &PINB, &PORTB, 2},
00100 {&DDRB, &PINB, &PORTB, 1},
00101 {&DDRB, &PINB, &PORTB, 0},
00102 {&DDRF, &PINF, &PORTF, 0},
00103 {&DDRF, &PINF, &PORTF, 1},
00104 {&DDRF, &PINF, &PORTF, 2},
00105 {&DDRF, &PINF, &PORTF, 3},
00106 {&DDRF, &PINF, &PORTF, 4},
00107 {&DDRF, &PINF, &PORTF, 5},
00108 {&DDRF, &PINF, &PORTF, 6},
00109 {&DDRF, &PINF, &PORTF, 7},
00110 {&DDRK, &PINK, &PORTK, 0},
00111 {&DDRK, &PINK, &PORTK, 1},
00112 {&DDRK, &PINK, &PORTK, 2},
00113 {&DDRK, &PINK, &PORTK, 3},
00114 {&DDRK, &PINK, &PORTK, 4},
00115 {&DDRK, &PINK, &PORTK, 5},
00116 {&DDRK, &PINK, &PORTK, 6},
00117 {&DDRK, &PINK, &PORTK, 7}
00118 };
00119
00120 #elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__)
00121
00122
00123
00124 uint8_t const SDA_PIN = 17;
00125 uint8_t const SCL_PIN = 18;
00126
00127
00128 uint8_t const SS_PIN = 4;
00129 uint8_t const MOSI_PIN = 5;
00130 uint8_t const MISO_PIN = 6;
00131 uint8_t const SCK_PIN = 7;
00132
00133 static const pin_map_t digitalPinMap[] = {
00134 {&DDRB, &PINB, &PORTB, 0},
00135 {&DDRB, &PINB, &PORTB, 1},
00136 {&DDRB, &PINB, &PORTB, 2},
00137 {&DDRB, &PINB, &PORTB, 3},
00138 {&DDRB, &PINB, &PORTB, 4},
00139 {&DDRB, &PINB, &PORTB, 5},
00140 {&DDRB, &PINB, &PORTB, 6},
00141 {&DDRB, &PINB, &PORTB, 7},
00142 {&DDRD, &PIND, &PORTD, 0},
00143 {&DDRD, &PIND, &PORTD, 1},
00144 {&DDRD, &PIND, &PORTD, 2},
00145 {&DDRD, &PIND, &PORTD, 3},
00146 {&DDRD, &PIND, &PORTD, 4},
00147 {&DDRD, &PIND, &PORTD, 5},
00148 {&DDRD, &PIND, &PORTD, 6},
00149 {&DDRD, &PIND, &PORTD, 7},
00150 {&DDRC, &PINC, &PORTC, 0},
00151 {&DDRC, &PINC, &PORTC, 1},
00152 {&DDRC, &PINC, &PORTC, 2},
00153 {&DDRC, &PINC, &PORTC, 3},
00154 {&DDRC, &PINC, &PORTC, 4},
00155 {&DDRC, &PINC, &PORTC, 5},
00156 {&DDRC, &PINC, &PORTC, 6},
00157 {&DDRC, &PINC, &PORTC, 7},
00158 {&DDRA, &PINA, &PORTA, 7},
00159 {&DDRA, &PINA, &PORTA, 6},
00160 {&DDRA, &PINA, &PORTA, 5},
00161 {&DDRA, &PINA, &PORTA, 4},
00162 {&DDRA, &PINA, &PORTA, 3},
00163 {&DDRA, &PINA, &PORTA, 2},
00164 {&DDRA, &PINA, &PORTA, 1},
00165 {&DDRA, &PINA, &PORTA, 0}
00166 };
00167
00168 #elif defined(__AVR_ATmega32U4__)
00169
00170
00171
00172 uint8_t const SDA_PIN = 6;
00173 uint8_t const SCL_PIN = 5;
00174
00175
00176 uint8_t const SS_PIN = 0;
00177 uint8_t const MOSI_PIN = 2;
00178 uint8_t const MISO_PIN = 3;
00179 uint8_t const SCK_PIN = 1;
00180
00181 static const pin_map_t digitalPinMap[] = {
00182 {&DDRB, &PINB, &PORTB, 0},
00183 {&DDRB, &PINB, &PORTB, 1},
00184 {&DDRB, &PINB, &PORTB, 2},
00185 {&DDRB, &PINB, &PORTB, 3},
00186 {&DDRB, &PINB, &PORTB, 7},
00187 {&DDRD, &PIND, &PORTD, 0},
00188 {&DDRD, &PIND, &PORTD, 1},
00189 {&DDRD, &PIND, &PORTD, 2},
00190 {&DDRD, &PIND, &PORTD, 3},
00191 {&DDRC, &PINC, &PORTC, 6},
00192 {&DDRC, &PINC, &PORTC, 7},
00193 {&DDRD, &PIND, &PORTD, 6},
00194 {&DDRD, &PIND, &PORTD, 7},
00195 {&DDRB, &PINB, &PORTB, 4},
00196 {&DDRB, &PINB, &PORTB, 5},
00197 {&DDRB, &PINB, &PORTB, 6},
00198 {&DDRF, &PINF, &PORTF, 7},
00199 {&DDRF, &PINF, &PORTF, 6},
00200 {&DDRF, &PINF, &PORTF, 5},
00201 {&DDRF, &PINF, &PORTF, 4},
00202 {&DDRF, &PINF, &PORTF, 1},
00203 {&DDRF, &PINF, &PORTF, 0},
00204 {&DDRD, &PIND, &PORTD, 4},
00205 {&DDRD, &PIND, &PORTD, 5},
00206 {&DDRE, &PINE, &PORTE, 6}
00207 };
00208
00209 #elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
00210
00211
00212
00213 uint8_t const SDA_PIN = 1;
00214 uint8_t const SCL_PIN = 0;
00215
00216
00217 uint8_t const SS_PIN = 20;
00218 uint8_t const MOSI_PIN = 22;
00219 uint8_t const MISO_PIN = 23;
00220 uint8_t const SCK_PIN = 21;
00221
00222 static const pin_map_t digitalPinMap[] = {
00223 {&DDRD, &PIND, &PORTD, 0},
00224 {&DDRD, &PIND, &PORTD, 1},
00225 {&DDRD, &PIND, &PORTD, 2},
00226 {&DDRD, &PIND, &PORTD, 3},
00227 {&DDRD, &PIND, &PORTD, 4},
00228 {&DDRD, &PIND, &PORTD, 5},
00229 {&DDRD, &PIND, &PORTD, 6},
00230 {&DDRD, &PIND, &PORTD, 7},
00231 {&DDRE, &PINE, &PORTE, 0},
00232 {&DDRE, &PINE, &PORTE, 1},
00233 {&DDRC, &PINC, &PORTC, 0},
00234 {&DDRC, &PINC, &PORTC, 1},
00235 {&DDRC, &PINC, &PORTC, 2},
00236 {&DDRC, &PINC, &PORTC, 3},
00237 {&DDRC, &PINC, &PORTC, 4},
00238 {&DDRC, &PINC, &PORTC, 5},
00239 {&DDRC, &PINC, &PORTC, 6},
00240 {&DDRC, &PINC, &PORTC, 7},
00241 {&DDRE, &PINE, &PORTE, 6},
00242 {&DDRE, &PINE, &PORTE, 7},
00243 {&DDRB, &PINB, &PORTB, 0},
00244 {&DDRB, &PINB, &PORTB, 1},
00245 {&DDRB, &PINB, &PORTB, 2},
00246 {&DDRB, &PINB, &PORTB, 3},
00247 {&DDRB, &PINB, &PORTB, 4},
00248 {&DDRB, &PINB, &PORTB, 5},
00249 {&DDRB, &PINB, &PORTB, 6},
00250 {&DDRB, &PINB, &PORTB, 7},
00251 {&DDRA, &PINA, &PORTA, 0},
00252 {&DDRA, &PINA, &PORTA, 1},
00253 {&DDRA, &PINA, &PORTA, 2},
00254 {&DDRA, &PINA, &PORTA, 3},
00255 {&DDRA, &PINA, &PORTA, 4},
00256 {&DDRA, &PINA, &PORTA, 5},
00257 {&DDRA, &PINA, &PORTA, 6},
00258 {&DDRA, &PINA, &PORTA, 7},
00259 {&DDRE, &PINE, &PORTE, 4},
00260 {&DDRE, &PINE, &PORTE, 5},
00261 {&DDRF, &PINF, &PORTF, 0},
00262 {&DDRF, &PINF, &PORTF, 1},
00263 {&DDRF, &PINF, &PORTF, 2},
00264 {&DDRF, &PINF, &PORTF, 3},
00265 {&DDRF, &PINF, &PORTF, 4},
00266 {&DDRF, &PINF, &PORTF, 5},
00267 {&DDRF, &PINF, &PORTF, 6},
00268 {&DDRF, &PINF, &PORTF, 7}
00269 };
00270
00271 #else // defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
00272
00273
00274
00275 uint8_t const SDA_PIN = 18;
00276 uint8_t const SCL_PIN = 19;
00277
00278
00279 uint8_t const SS_PIN = 10;
00280 uint8_t const MOSI_PIN = 11;
00281 uint8_t const MISO_PIN = 12;
00282 uint8_t const SCK_PIN = 13;
00283
00284 static const pin_map_t digitalPinMap[] = {
00285 {&DDRD, &PIND, &PORTD, 0},
00286 {&DDRD, &PIND, &PORTD, 1},
00287 {&DDRD, &PIND, &PORTD, 2},
00288 {&DDRD, &PIND, &PORTD, 3},
00289 {&DDRD, &PIND, &PORTD, 4},
00290 {&DDRD, &PIND, &PORTD, 5},
00291 {&DDRD, &PIND, &PORTD, 6},
00292 {&DDRD, &PIND, &PORTD, 7},
00293 {&DDRB, &PINB, &PORTB, 0},
00294 {&DDRB, &PINB, &PORTB, 1},
00295 {&DDRB, &PINB, &PORTB, 2},
00296 {&DDRB, &PINB, &PORTB, 3},
00297 {&DDRB, &PINB, &PORTB, 4},
00298 {&DDRB, &PINB, &PORTB, 5},
00299 {&DDRC, &PINC, &PORTC, 0},
00300 {&DDRC, &PINC, &PORTC, 1},
00301 {&DDRC, &PINC, &PORTC, 2},
00302 {&DDRC, &PINC, &PORTC, 3},
00303 {&DDRC, &PINC, &PORTC, 4},
00304 {&DDRC, &PINC, &PORTC, 5}
00305 };
00306 #endif // defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
00307
00308 static const uint8_t digitalPinCount = sizeof(digitalPinMap)/sizeof(pin_map_t);
00309
00310 uint8_t badPinNumber(void)
00311 __attribute__((error("Pin number is too large or not a constant")));
00312
00313 static inline __attribute__((always_inline))
00314 uint8_t getPinMode(uint8_t pin) {
00315 if (__builtin_constant_p(pin) && pin < digitalPinCount) {
00316 return (*digitalPinMap[pin].ddr >> digitalPinMap[pin].bit) & 1;
00317 } else {
00318 return badPinNumber();
00319 }
00320 }
00321 static inline __attribute__((always_inline))
00322 void setPinMode(uint8_t pin, uint8_t mode) {
00323 if (__builtin_constant_p(pin) && pin < digitalPinCount) {
00324 if (mode) {
00325 *digitalPinMap[pin].ddr |= 1 << digitalPinMap[pin].bit;
00326 } else {
00327 *digitalPinMap[pin].ddr &= ~(1 << digitalPinMap[pin].bit);
00328 }
00329 } else {
00330 badPinNumber();
00331 }
00332 }
00333 static inline __attribute__((always_inline))
00334 uint8_t fastDigitalRead(uint8_t pin) {
00335 if (__builtin_constant_p(pin) && pin < digitalPinCount) {
00336 return (*digitalPinMap[pin].pin >> digitalPinMap[pin].bit) & 1;
00337 } else {
00338 return badPinNumber();
00339 }
00340 }
00341 static inline __attribute__((always_inline))
00342 void fastDigitalWrite(uint8_t pin, uint8_t value) {
00343 if (__builtin_constant_p(pin) && pin < digitalPinCount) {
00344 if (value) {
00345 *digitalPinMap[pin].port |= 1 << digitalPinMap[pin].bit;
00346 } else {
00347 *digitalPinMap[pin].port &= ~(1 << digitalPinMap[pin].bit);
00348 }
00349 } else {
00350 badPinNumber();
00351 }
00352 }
00353 #endif // Sd2PinMap_h