@@ -38,328 +38,56 @@ uint8_t const SCK_PIN = SCK;
38
38
#define Sd2PinMap_h
39
39
#include <avr/io.h>
40
40
41
- //------------------------------------------------------------------------------
42
- /** struct for mapping digital pins */
43
- struct pin_map_t {
44
- volatile uint8_t * ddr ;
45
- volatile uint8_t * pin ;
46
- volatile uint8_t * port ;
47
- uint8_t bit ;
48
- };
49
- //------------------------------------------------------------------------------
50
- #if defined(__AVR_ATmega1280__ ) || defined(__AVR_ATmega2560__ )
51
- // Mega
52
-
53
- // Two Wire (aka I2C) ports
54
- uint8_t const SDA_PIN = 20 ;
55
- uint8_t const SCL_PIN = 21 ;
56
-
57
- // SPI port
58
- uint8_t const SS_PIN = 53 ;
59
- uint8_t const MOSI_PIN = 51 ;
60
- uint8_t const MISO_PIN = 50 ;
61
- uint8_t const SCK_PIN = 52 ;
62
-
63
- static const pin_map_t digitalPinMap [] = {
64
- {& DDRE , & PINE , & PORTE , 0 }, // E0 0
65
- {& DDRE , & PINE , & PORTE , 1 }, // E1 1
66
- {& DDRE , & PINE , & PORTE , 4 }, // E4 2
67
- {& DDRE , & PINE , & PORTE , 5 }, // E5 3
68
- {& DDRG , & PING , & PORTG , 5 }, // G5 4
69
- {& DDRE , & PINE , & PORTE , 3 }, // E3 5
70
- {& DDRH , & PINH , & PORTH , 3 }, // H3 6
71
- {& DDRH , & PINH , & PORTH , 4 }, // H4 7
72
- {& DDRH , & PINH , & PORTH , 5 }, // H5 8
73
- {& DDRH , & PINH , & PORTH , 6 }, // H6 9
74
- {& DDRB , & PINB , & PORTB , 4 }, // B4 10
75
- {& DDRB , & PINB , & PORTB , 5 }, // B5 11
76
- {& DDRB , & PINB , & PORTB , 6 }, // B6 12
77
- {& DDRB , & PINB , & PORTB , 7 }, // B7 13
78
- {& DDRJ , & PINJ , & PORTJ , 1 }, // J1 14
79
- {& DDRJ , & PINJ , & PORTJ , 0 }, // J0 15
80
- {& DDRH , & PINH , & PORTH , 1 }, // H1 16
81
- {& DDRH , & PINH , & PORTH , 0 }, // H0 17
82
- {& DDRD , & PIND , & PORTD , 3 }, // D3 18
83
- {& DDRD , & PIND , & PORTD , 2 }, // D2 19
84
- {& DDRD , & PIND , & PORTD , 1 }, // D1 20
85
- {& DDRD , & PIND , & PORTD , 0 }, // D0 21
86
- {& DDRA , & PINA , & PORTA , 0 }, // A0 22
87
- {& DDRA , & PINA , & PORTA , 1 }, // A1 23
88
- {& DDRA , & PINA , & PORTA , 2 }, // A2 24
89
- {& DDRA , & PINA , & PORTA , 3 }, // A3 25
90
- {& DDRA , & PINA , & PORTA , 4 }, // A4 26
91
- {& DDRA , & PINA , & PORTA , 5 }, // A5 27
92
- {& DDRA , & PINA , & PORTA , 6 }, // A6 28
93
- {& DDRA , & PINA , & PORTA , 7 }, // A7 29
94
- {& DDRC , & PINC , & PORTC , 7 }, // C7 30
95
- {& DDRC , & PINC , & PORTC , 6 }, // C6 31
96
- {& DDRC , & PINC , & PORTC , 5 }, // C5 32
97
- {& DDRC , & PINC , & PORTC , 4 }, // C4 33
98
- {& DDRC , & PINC , & PORTC , 3 }, // C3 34
99
- {& DDRC , & PINC , & PORTC , 2 }, // C2 35
100
- {& DDRC , & PINC , & PORTC , 1 }, // C1 36
101
- {& DDRC , & PINC , & PORTC , 0 }, // C0 37
102
- {& DDRD , & PIND , & PORTD , 7 }, // D7 38
103
- {& DDRG , & PING , & PORTG , 2 }, // G2 39
104
- {& DDRG , & PING , & PORTG , 1 }, // G1 40
105
- {& DDRG , & PING , & PORTG , 0 }, // G0 41
106
- {& DDRL , & PINL , & PORTL , 7 }, // L7 42
107
- {& DDRL , & PINL , & PORTL , 6 }, // L6 43
108
- {& DDRL , & PINL , & PORTL , 5 }, // L5 44
109
- {& DDRL , & PINL , & PORTL , 4 }, // L4 45
110
- {& DDRL , & PINL , & PORTL , 3 }, // L3 46
111
- {& DDRL , & PINL , & PORTL , 2 }, // L2 47
112
- {& DDRL , & PINL , & PORTL , 1 }, // L1 48
113
- {& DDRL , & PINL , & PORTL , 0 }, // L0 49
114
- {& DDRB , & PINB , & PORTB , 3 }, // B3 50
115
- {& DDRB , & PINB , & PORTB , 2 }, // B2 51
116
- {& DDRB , & PINB , & PORTB , 1 }, // B1 52
117
- {& DDRB , & PINB , & PORTB , 0 }, // B0 53
118
- {& DDRF , & PINF , & PORTF , 0 }, // F0 54
119
- {& DDRF , & PINF , & PORTF , 1 }, // F1 55
120
- {& DDRF , & PINF , & PORTF , 2 }, // F2 56
121
- {& DDRF , & PINF , & PORTF , 3 }, // F3 57
122
- {& DDRF , & PINF , & PORTF , 4 }, // F4 58
123
- {& DDRF , & PINF , & PORTF , 5 }, // F5 59
124
- {& DDRF , & PINF , & PORTF , 6 }, // F6 60
125
- {& DDRF , & PINF , & PORTF , 7 }, // F7 61
126
- {& DDRK , & PINK , & PORTK , 0 }, // K0 62
127
- {& DDRK , & PINK , & PORTK , 1 }, // K1 63
128
- {& DDRK , & PINK , & PORTK , 2 }, // K2 64
129
- {& DDRK , & PINK , & PORTK , 3 }, // K3 65
130
- {& DDRK , & PINK , & PORTK , 4 }, // K4 66
131
- {& DDRK , & PINK , & PORTK , 5 }, // K5 67
132
- {& DDRK , & PINK , & PORTK , 6 }, // K6 68
133
- {& DDRK , & PINK , & PORTK , 7 } // K7 69
134
- };
135
- //------------------------------------------------------------------------------
136
- #elif defined(__AVR_ATmega644P__ ) || defined(__AVR_ATmega644__ )
137
- // Sanguino
138
-
139
- // Two Wire (aka I2C) ports
140
- uint8_t const SDA_PIN = 17 ;
141
- uint8_t const SCL_PIN = 18 ;
142
-
143
- // SPI port
144
- uint8_t const SS_PIN = 4 ;
145
- uint8_t const MOSI_PIN = 5 ;
146
- uint8_t const MISO_PIN = 6 ;
147
- uint8_t const SCK_PIN = 7 ;
148
-
149
- static const pin_map_t digitalPinMap [] = {
150
- {& DDRB , & PINB , & PORTB , 0 }, // B0 0
151
- {& DDRB , & PINB , & PORTB , 1 }, // B1 1
152
- {& DDRB , & PINB , & PORTB , 2 }, // B2 2
153
- {& DDRB , & PINB , & PORTB , 3 }, // B3 3
154
- {& DDRB , & PINB , & PORTB , 4 }, // B4 4
155
- {& DDRB , & PINB , & PORTB , 5 }, // B5 5
156
- {& DDRB , & PINB , & PORTB , 6 }, // B6 6
157
- {& DDRB , & PINB , & PORTB , 7 }, // B7 7
158
- {& DDRD , & PIND , & PORTD , 0 }, // D0 8
159
- {& DDRD , & PIND , & PORTD , 1 }, // D1 9
160
- {& DDRD , & PIND , & PORTD , 2 }, // D2 10
161
- {& DDRD , & PIND , & PORTD , 3 }, // D3 11
162
- {& DDRD , & PIND , & PORTD , 4 }, // D4 12
163
- {& DDRD , & PIND , & PORTD , 5 }, // D5 13
164
- {& DDRD , & PIND , & PORTD , 6 }, // D6 14
165
- {& DDRD , & PIND , & PORTD , 7 }, // D7 15
166
- {& DDRC , & PINC , & PORTC , 0 }, // C0 16
167
- {& DDRC , & PINC , & PORTC , 1 }, // C1 17
168
- {& DDRC , & PINC , & PORTC , 2 }, // C2 18
169
- {& DDRC , & PINC , & PORTC , 3 }, // C3 19
170
- {& DDRC , & PINC , & PORTC , 4 }, // C4 20
171
- {& DDRC , & PINC , & PORTC , 5 }, // C5 21
172
- {& DDRC , & PINC , & PORTC , 6 }, // C6 22
173
- {& DDRC , & PINC , & PORTC , 7 }, // C7 23
174
- {& DDRA , & PINA , & PORTA , 7 }, // A7 24
175
- {& DDRA , & PINA , & PORTA , 6 }, // A6 25
176
- {& DDRA , & PINA , & PORTA , 5 }, // A5 26
177
- {& DDRA , & PINA , & PORTA , 4 }, // A4 27
178
- {& DDRA , & PINA , & PORTA , 3 }, // A3 28
179
- {& DDRA , & PINA , & PORTA , 2 }, // A2 29
180
- {& DDRA , & PINA , & PORTA , 1 }, // A1 30
181
- {& DDRA , & PINA , & PORTA , 0 } // A0 31
182
- };
183
- //------------------------------------------------------------------------------
184
- #elif defined(__AVR_ATmega32U4__ )
185
- // Leonardo
186
-
187
- // Two Wire (aka I2C) ports
188
- uint8_t const SDA_PIN = 2 ;
189
- uint8_t const SCL_PIN = 3 ;
190
-
191
- // SPI port
192
- uint8_t const SS_PIN = 17 ;
193
- uint8_t const MOSI_PIN = 16 ;
194
- uint8_t const MISO_PIN = 14 ;
195
- uint8_t const SCK_PIN = 15 ;
196
-
197
- static const pin_map_t digitalPinMap [] = {
198
- {& DDRD , & PIND , & PORTD , 2 }, // D2 0
199
- {& DDRD , & PIND , & PORTD , 3 }, // D3 1
200
- {& DDRD , & PIND , & PORTD , 1 }, // D1 2
201
- {& DDRD , & PIND , & PORTD , 0 }, // D0 3
202
- {& DDRD , & PIND , & PORTD , 4 }, // D4 4
203
- {& DDRC , & PINC , & PORTC , 6 }, // C6 5
204
- {& DDRD , & PIND , & PORTD , 7 }, // D7 6
205
- {& DDRE , & PINE , & PORTE , 6 }, // E6 7
206
- {& DDRB , & PINB , & PORTB , 4 }, // B4 8
207
- {& DDRB , & PINB , & PORTB , 5 }, // B5 9
208
- {& DDRB , & PINB , & PORTB , 6 }, // B6 10
209
- {& DDRB , & PINB , & PORTB , 7 }, // B7 11
210
- {& DDRD , & PIND , & PORTD , 6 }, // D6 12
211
- {& DDRC , & PINC , & PORTC , 7 }, // C7 13
212
- {& DDRB , & PINB , & PORTB , 3 }, // B3 14
213
- {& DDRB , & PINB , & PORTB , 1 }, // B1 15
214
- {& DDRB , & PINB , & PORTB , 2 }, // B2 16
215
- {& DDRB , & PINB , & PORTB , 0 }, // B0 17
216
- {& DDRF , & PINF , & PORTF , 7 }, // F7 18
217
- {& DDRF , & PINF , & PORTF , 6 }, // F6 19
218
- {& DDRF , & PINF , & PORTF , 5 }, // F5 20
219
- {& DDRF , & PINF , & PORTF , 4 }, // F4 21
220
- {& DDRF , & PINF , & PORTF , 1 }, // F1 22
221
- {& DDRF , & PINF , & PORTF , 0 }, // F0 23
222
- };
223
- //------------------------------------------------------------------------------
224
- #elif defined(__AVR_AT90USB646__ ) || defined(__AVR_AT90USB1286__ )
225
- // Teensy++ 1.0 & 2.0
226
-
227
- // Two Wire (aka I2C) ports
228
- uint8_t const SDA_PIN = 1 ;
229
- uint8_t const SCL_PIN = 0 ;
230
-
231
- // SPI port
232
- uint8_t const SS_PIN = 20 ;
233
- uint8_t const MOSI_PIN = 22 ;
234
- uint8_t const MISO_PIN = 23 ;
235
- uint8_t const SCK_PIN = 21 ;
236
-
237
- static const pin_map_t digitalPinMap [] = {
238
- {& DDRD , & PIND , & PORTD , 0 }, // D0 0
239
- {& DDRD , & PIND , & PORTD , 1 }, // D1 1
240
- {& DDRD , & PIND , & PORTD , 2 }, // D2 2
241
- {& DDRD , & PIND , & PORTD , 3 }, // D3 3
242
- {& DDRD , & PIND , & PORTD , 4 }, // D4 4
243
- {& DDRD , & PIND , & PORTD , 5 }, // D5 5
244
- {& DDRD , & PIND , & PORTD , 6 }, // D6 6
245
- {& DDRD , & PIND , & PORTD , 7 }, // D7 7
246
- {& DDRE , & PINE , & PORTE , 0 }, // E0 8
247
- {& DDRE , & PINE , & PORTE , 1 }, // E1 9
248
- {& DDRC , & PINC , & PORTC , 0 }, // C0 10
249
- {& DDRC , & PINC , & PORTC , 1 }, // C1 11
250
- {& DDRC , & PINC , & PORTC , 2 }, // C2 12
251
- {& DDRC , & PINC , & PORTC , 3 }, // C3 13
252
- {& DDRC , & PINC , & PORTC , 4 }, // C4 14
253
- {& DDRC , & PINC , & PORTC , 5 }, // C5 15
254
- {& DDRC , & PINC , & PORTC , 6 }, // C6 16
255
- {& DDRC , & PINC , & PORTC , 7 }, // C7 17
256
- {& DDRE , & PINE , & PORTE , 6 }, // E6 18
257
- {& DDRE , & PINE , & PORTE , 7 }, // E7 19
258
- {& DDRB , & PINB , & PORTB , 0 }, // B0 20
259
- {& DDRB , & PINB , & PORTB , 1 }, // B1 21
260
- {& DDRB , & PINB , & PORTB , 2 }, // B2 22
261
- {& DDRB , & PINB , & PORTB , 3 }, // B3 23
262
- {& DDRB , & PINB , & PORTB , 4 }, // B4 24
263
- {& DDRB , & PINB , & PORTB , 5 }, // B5 25
264
- {& DDRB , & PINB , & PORTB , 6 }, // B6 26
265
- {& DDRB , & PINB , & PORTB , 7 }, // B7 27
266
- {& DDRA , & PINA , & PORTA , 0 }, // A0 28
267
- {& DDRA , & PINA , & PORTA , 1 }, // A1 29
268
- {& DDRA , & PINA , & PORTA , 2 }, // A2 30
269
- {& DDRA , & PINA , & PORTA , 3 }, // A3 31
270
- {& DDRA , & PINA , & PORTA , 4 }, // A4 32
271
- {& DDRA , & PINA , & PORTA , 5 }, // A5 33
272
- {& DDRA , & PINA , & PORTA , 6 }, // A6 34
273
- {& DDRA , & PINA , & PORTA , 7 }, // A7 35
274
- {& DDRE , & PINE , & PORTE , 4 }, // E4 36
275
- {& DDRE , & PINE , & PORTE , 5 }, // E5 37
276
- {& DDRF , & PINF , & PORTF , 0 }, // F0 38
277
- {& DDRF , & PINF , & PORTF , 1 }, // F1 39
278
- {& DDRF , & PINF , & PORTF , 2 }, // F2 40
279
- {& DDRF , & PINF , & PORTF , 3 }, // F3 41
280
- {& DDRF , & PINF , & PORTF , 4 }, // F4 42
281
- {& DDRF , & PINF , & PORTF , 5 }, // F5 43
282
- {& DDRF , & PINF , & PORTF , 6 }, // F6 44
283
- {& DDRF , & PINF , & PORTF , 7 } // F7 45
284
- };
285
- //------------------------------------------------------------------------------
286
- #else // defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
287
- // 168 and 328 Arduinos
41
+ #include <Arduino.h>
288
42
289
43
// Two Wire (aka I2C) ports
290
- uint8_t const SDA_PIN = 18 ;
291
- uint8_t const SCL_PIN = 19 ;
44
+ uint8_t const SDA_PIN = SDA ;
45
+ uint8_t const SCL_PIN = SCL ;
292
46
293
47
// SPI port
294
- uint8_t const SS_PIN = 10 ;
295
- uint8_t const MOSI_PIN = 11 ;
296
- uint8_t const MISO_PIN = 12 ;
297
- uint8_t const SCK_PIN = 13 ;
298
-
299
- static const pin_map_t digitalPinMap [] = {
300
- {& DDRD , & PIND , & PORTD , 0 }, // D0 0
301
- {& DDRD , & PIND , & PORTD , 1 }, // D1 1
302
- {& DDRD , & PIND , & PORTD , 2 }, // D2 2
303
- {& DDRD , & PIND , & PORTD , 3 }, // D3 3
304
- {& DDRD , & PIND , & PORTD , 4 }, // D4 4
305
- {& DDRD , & PIND , & PORTD , 5 }, // D5 5
306
- {& DDRD , & PIND , & PORTD , 6 }, // D6 6
307
- {& DDRD , & PIND , & PORTD , 7 }, // D7 7
308
- {& DDRB , & PINB , & PORTB , 0 }, // B0 8
309
- {& DDRB , & PINB , & PORTB , 1 }, // B1 9
310
- {& DDRB , & PINB , & PORTB , 2 }, // B2 10
311
- {& DDRB , & PINB , & PORTB , 3 }, // B3 11
312
- {& DDRB , & PINB , & PORTB , 4 }, // B4 12
313
- {& DDRB , & PINB , & PORTB , 5 }, // B5 13
314
- {& DDRC , & PINC , & PORTC , 0 }, // C0 14
315
- {& DDRC , & PINC , & PORTC , 1 }, // C1 15
316
- {& DDRC , & PINC , & PORTC , 2 }, // C2 16
317
- {& DDRC , & PINC , & PORTC , 3 }, // C3 17
318
- {& DDRC , & PINC , & PORTC , 4 }, // C4 18
319
- {& DDRC , & PINC , & PORTC , 5 } // C5 19
320
- };
321
- #endif // defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
322
- //------------------------------------------------------------------------------
323
- static const uint8_t digitalPinCount = sizeof (digitalPinMap )/sizeof (pin_map_t );
48
+ uint8_t const SS_PIN = SS ;
49
+ uint8_t const MOSI_PIN = MOSI ;
50
+ uint8_t const MISO_PIN = MISO ;
51
+ uint8_t const SCK_PIN = SCK ;
324
52
325
53
uint8_t badPinNumber (void )
326
54
__attribute__((error ("Pin number is too large or not a constant" )));
327
55
328
56
static inline __attribute__((always_inline ))
329
57
uint8_t getPinMode (uint8_t pin ) {
330
- if (__builtin_constant_p (pin ) && pin < digitalPinCount ) {
331
- return ( * digitalPinMap [ pin ]. ddr >> digitalPinMap [ pin ]. bit ) & 1 ;
58
+ if (__builtin_constant_p (pin ) && pin < NUM_DIGITAL_PINS ) {
59
+ return * portModeRegister ( digitalPinToPort ( pin )) & digitalPinToBitMask ( pin ) ;
332
60
} else {
333
61
return badPinNumber ();
334
62
}
335
63
}
336
64
static inline __attribute__((always_inline ))
337
65
void setPinMode (uint8_t pin , uint8_t mode ) {
338
- if (__builtin_constant_p (pin ) && pin < digitalPinCount ) {
66
+ if (__builtin_constant_p (pin ) && pin < NUM_DIGITAL_PINS ) {
339
67
if (mode ) {
340
- * digitalPinMap [ pin ]. ddr |= 1 << digitalPinMap [ pin ]. bit ;
68
+ * portModeRegister ( digitalPinToPort ( pin )) |= digitalPinToBitMask ( pin ) ;
341
69
} else {
342
- * digitalPinMap [ pin ]. ddr &= ~( 1 << digitalPinMap [ pin ]. bit );
70
+ * portModeRegister ( digitalPinToPort ( pin )) &= ~digitalPinToBitMask ( pin );
343
71
}
344
72
} else {
345
73
badPinNumber ();
346
74
}
347
75
}
348
76
static inline __attribute__((always_inline ))
349
77
uint8_t fastDigitalRead (uint8_t pin ) {
350
- if (__builtin_constant_p (pin ) && pin < digitalPinCount ) {
351
- return ( * digitalPinMap [ pin ]. pin >> digitalPinMap [ pin ]. bit ) & 1 ;
78
+ if (__builtin_constant_p (pin ) && pin < NUM_DIGITAL_PINS ) {
79
+ return * portInputRegister ( digitalPinToPort ( pin )) & digitalPinToBitMask ( pin ) ;
352
80
} else {
353
81
return badPinNumber ();
354
82
}
355
83
}
356
84
static inline __attribute__((always_inline ))
357
85
void fastDigitalWrite (uint8_t pin , uint8_t value ) {
358
- if (__builtin_constant_p (pin ) && pin < digitalPinCount ) {
86
+ if (__builtin_constant_p (pin ) && pin < NUM_DIGITAL_PINS ) {
359
87
if (value ) {
360
- * digitalPinMap [ pin ]. port |= 1 << digitalPinMap [ pin ]. bit ;
88
+ * portOutputRegister ( digitalPinToPort ( pin )) |= digitalPinToBitMask ( pin ) ;
361
89
} else {
362
- * digitalPinMap [ pin ]. port &= ~( 1 << digitalPinMap [ pin ]. bit );
90
+ * portOutputRegister ( digitalPinToPort ( pin )) &= ~digitalPinToBitMask ( pin );
363
91
}
364
92
} else {
365
93
badPinNumber ();
0 commit comments