source: rtos_arduino/trunk/arduino_lib/libraries/Firmata/Boards.h@ 224

Last change on this file since 224 was 224, checked in by ertl-honda, 8 years ago

1.7.10のファイルに更新

File size: 31.2 KB
Line 
1/*
2 Boards.h - Hardware Abstraction Layer for Firmata library
3 Copyright (c) 2006-2008 Hans-Christoph Steiner. All rights reserved.
4 Copyright (C) 2009-2015 Jeff Hoefs. All rights reserved.
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 See file LICENSE.txt for further informations on licensing terms.
12
13 Last updated December 19th, 2015
14*/
15
16#ifndef Firmata_Boards_h
17#define Firmata_Boards_h
18
19#include <inttypes.h>
20
21#if defined(ARDUINO) && ARDUINO >= 100
22#include "Arduino.h" // for digitalRead, digitalWrite, etc
23#else
24#include "WProgram.h"
25#endif
26
27// Normally Servo.h must be included before Firmata.h (which then includes
28// this file). If Servo.h wasn't included, this allows the code to still
29// compile, but without support for any Servos. Hopefully that's what the
30// user intended by not including Servo.h
31#ifndef MAX_SERVOS
32#define MAX_SERVOS 0
33#endif
34
35/*
36 Firmata Hardware Abstraction Layer
37
38Firmata is built on top of the hardware abstraction functions of Arduino,
39specifically digitalWrite, digitalRead, analogWrite, analogRead, and
40pinMode. While these functions offer simple integer pin numbers, Firmata
41needs more information than is provided by Arduino. This file provides
42all other hardware specific details. To make Firmata support a new board,
43only this file should require editing.
44
45The key concept is every "pin" implemented by Firmata may be mapped to
46any pin as implemented by Arduino. Usually a simple 1-to-1 mapping is
47best, but such mapping should not be assumed. This hardware abstraction
48layer allows Firmata to implement any number of pins which map onto the
49Arduino implemented pins in almost any arbitrary way.
50
51
52General Constants:
53
54These constants provide basic information Firmata requires.
55
56TOTAL_PINS: The total number of pins Firmata implemented by Firmata.
57 Usually this will match the number of pins the Arduino functions
58 implement, including any pins pins capable of analog or digital.
59 However, Firmata may implement any number of pins. For example,
60 on Arduino Mini with 8 analog inputs, 6 of these may be used
61 for digital functions, and 2 are analog only. On such boards,
62 Firmata can implement more pins than Arduino's pinMode()
63 function, in order to accommodate those special pins. The
64 Firmata protocol supports a maximum of 128 pins, so this
65 constant must not exceed 128.
66
67TOTAL_ANALOG_PINS: The total number of analog input pins implemented.
68 The Firmata protocol allows up to 16 analog inputs, accessed
69 using offsets 0 to 15. Because Firmata presents the analog
70 inputs using different offsets than the actual pin numbers
71 (a legacy of Arduino's analogRead function, and the way the
72 analog input capable pins are physically labeled on all
73 Arduino boards), the total number of analog input signals
74 must be specified. 16 is the maximum.
75
76VERSION_BLINK_PIN: When Firmata starts up, it will blink the version
77 number. This constant is the Arduino pin number where a
78 LED is connected.
79
80
81Pin Mapping Macros:
82
83These macros provide the mapping between pins as implemented by
84Firmata protocol and the actual pin numbers used by the Arduino
85functions. Even though such mappings are often simple, pin
86numbers received by Firmata protocol should always be used as
87input to these macros, and the result of the macro should be
88used with with any Arduino function.
89
90When Firmata is extended to support a new pin mode or feature,
91a pair of macros should be added and used for all hardware
92access. For simple 1:1 mapping, these macros add no actual
93overhead, yet their consistent use allows source code which
94uses them consistently to be easily adapted to all other boards
95with different requirements.
96
97IS_PIN_XXXX(pin): The IS_PIN macros resolve to true or non-zero
98 if a pin as implemented by Firmata corresponds to a pin
99 that actually implements the named feature.
100
101PIN_TO_XXXX(pin): The PIN_TO macros translate pin numbers as
102 implemented by Firmata to the pin numbers needed as inputs
103 to the Arduino functions. The corresponding IS_PIN macro
104 should always be tested before using a PIN_TO macro, so
105 these macros only need to handle valid Firmata pin
106 numbers for the named feature.
107
108
109Port Access Inline Funtions:
110
111For efficiency, Firmata protocol provides access to digital
112input and output pins grouped by 8 bit ports. When these
113groups of 8 correspond to actual 8 bit ports as implemented
114by the hardware, these inline functions can provide high
115speed direct port access. Otherwise, a default implementation
116using 8 calls to digitalWrite or digitalRead is used.
117
118When porting Firmata to a new board, it is recommended to
119use the default functions first and focus only on the constants
120and macros above. When those are working, if optimized port
121access is desired, these inline functions may be extended.
122The recommended approach defines a symbol indicating which
123optimization to use, and then conditional complication is
124used within these functions.
125
126readPort(port, bitmask): Read an 8 bit port, returning the value.
127 port: The port number, Firmata pins port*8 to port*8+7
128 bitmask: The actual pins to read, indicated by 1 bits.
129
130writePort(port, value, bitmask): Write an 8 bit port.
131 port: The port number, Firmata pins port*8 to port*8+7
132 value: The 8 bit value to write
133 bitmask: The actual pins to write, indicated by 1 bits.
134*/
135
136/*==============================================================================
137 * Board Specific Configuration
138 *============================================================================*/
139
140#ifndef digitalPinHasPWM
141#define digitalPinHasPWM(p) IS_PIN_DIGITAL(p)
142#endif
143
144// Arduino Duemilanove, Diecimila, and NG
145#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
146#if defined(NUM_ANALOG_INPUTS) && NUM_ANALOG_INPUTS == 6
147#define TOTAL_ANALOG_PINS 6
148#define TOTAL_PINS 20 // 14 digital + 6 analog
149#else
150#define TOTAL_ANALOG_PINS 8
151#define TOTAL_PINS 22 // 14 digital + 8 analog
152#endif
153#define VERSION_BLINK_PIN 13
154#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) <= 19)
155#define IS_PIN_ANALOG(p) ((p) >= 14 && (p) < 14 + TOTAL_ANALOG_PINS)
156#define IS_PIN_PWM(p) digitalPinHasPWM(p)
157#define IS_PIN_SERVO(p) (IS_PIN_DIGITAL(p) && (p) - 2 < MAX_SERVOS)
158#define IS_PIN_I2C(p) ((p) == 18 || (p) == 19)
159#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
160#define PIN_TO_DIGITAL(p) (p)
161#define PIN_TO_ANALOG(p) ((p) - 14)
162#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
163#define PIN_TO_SERVO(p) ((p) - 2)
164#define ARDUINO_PINOUT_OPTIMIZE 1
165
166
167// Wiring (and board)
168#elif defined(WIRING)
169#define VERSION_BLINK_PIN WLED
170#define IS_PIN_DIGITAL(p) ((p) >= 0 && (p) < TOTAL_PINS)
171#define IS_PIN_ANALOG(p) ((p) >= FIRST_ANALOG_PIN && (p) < (FIRST_ANALOG_PIN+TOTAL_ANALOG_PINS))
172#define IS_PIN_PWM(p) digitalPinHasPWM(p)
173#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
174#define IS_PIN_I2C(p) ((p) == SDA || (p) == SCL)
175#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
176#define PIN_TO_DIGITAL(p) (p)
177#define PIN_TO_ANALOG(p) ((p) - FIRST_ANALOG_PIN)
178#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
179#define PIN_TO_SERVO(p) (p)
180
181
182// old Arduinos
183#elif defined(__AVR_ATmega8__)
184#define TOTAL_ANALOG_PINS 6
185#define TOTAL_PINS 20 // 14 digital + 6 analog
186#define VERSION_BLINK_PIN 13
187#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) <= 19)
188#define IS_PIN_ANALOG(p) ((p) >= 14 && (p) <= 19)
189#define IS_PIN_PWM(p) digitalPinHasPWM(p)
190#define IS_PIN_SERVO(p) (IS_PIN_DIGITAL(p) && (p) - 2 < MAX_SERVOS)
191#define IS_PIN_I2C(p) ((p) == 18 || (p) == 19)
192#define PIN_TO_DIGITAL(p) (p)
193#define PIN_TO_ANALOG(p) ((p) - 14)
194#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
195#define PIN_TO_SERVO(p) ((p) - 2)
196#define ARDUINO_PINOUT_OPTIMIZE 1
197
198
199// Arduino Mega
200#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
201#define TOTAL_ANALOG_PINS 16
202#define TOTAL_PINS 70 // 54 digital + 16 analog
203#define VERSION_BLINK_PIN 13
204#define PIN_SERIAL1_RX 19
205#define PIN_SERIAL1_TX 18
206#define PIN_SERIAL2_RX 17
207#define PIN_SERIAL2_TX 16
208#define PIN_SERIAL3_RX 15
209#define PIN_SERIAL3_TX 14
210#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) < TOTAL_PINS)
211#define IS_PIN_ANALOG(p) ((p) >= 54 && (p) < TOTAL_PINS)
212#define IS_PIN_PWM(p) digitalPinHasPWM(p)
213#define IS_PIN_SERVO(p) ((p) >= 2 && (p) - 2 < MAX_SERVOS)
214#define IS_PIN_I2C(p) ((p) == 20 || (p) == 21)
215#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
216#define IS_PIN_SERIAL(p) ((p) > 13 && (p) < 20)
217#define PIN_TO_DIGITAL(p) (p)
218#define PIN_TO_ANALOG(p) ((p) - 54)
219#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
220#define PIN_TO_SERVO(p) ((p) - 2)
221
222
223// Arduino DUE
224#elif defined(__SAM3X8E__)
225#define TOTAL_ANALOG_PINS 12
226#define TOTAL_PINS 66 // 54 digital + 12 analog
227#define VERSION_BLINK_PIN 13
228#define PIN_SERIAL1_RX 19
229#define PIN_SERIAL1_TX 18
230#define PIN_SERIAL2_RX 17
231#define PIN_SERIAL2_TX 16
232#define PIN_SERIAL3_RX 15
233#define PIN_SERIAL3_TX 14
234#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) < TOTAL_PINS)
235#define IS_PIN_ANALOG(p) ((p) >= 54 && (p) < TOTAL_PINS)
236#define IS_PIN_PWM(p) digitalPinHasPWM(p)
237#define IS_PIN_SERVO(p) ((p) >= 2 && (p) - 2 < MAX_SERVOS)
238#define IS_PIN_I2C(p) ((p) == 20 || (p) == 21) // 70 71
239#define IS_PIN_SERIAL(p) ((p) > 13 && (p) < 20)
240#define PIN_TO_DIGITAL(p) (p)
241#define PIN_TO_ANALOG(p) ((p) - 54)
242#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
243#define PIN_TO_SERVO(p) ((p) - 2)
244
245
246// Arduino M0 / M0 pro
247#elif defined(__SAMD21G18A__)
248#define TOTAL_ANALOG_PINS 6
249#define TOTAL_PINS 34 // 14 digital + 6 analog + 2 i2c + 3 spi. 34 is due to non linear enumeration of pins
250#define TOTAL_PORTS 3
251#define VERSION_BLINK_PIN 13
252#define IS_PIN_DIGITAL(p) (((p) >= 2 && (p) <= 13) || ((p)>=24 && (p)<=29))
253#define IS_PIN_ANALOG(p) ((p) >= 24 && (p) <= 29)
254#define IS_PIN_PWM(p) digitalPinHasPWM(p)
255#define IS_PIN_SERVO(p) (IS_PIN_DIGITAL(p) && (p) < MAX_SERVOS)
256#define IS_PIN_I2C(p) ((p) == 16 || (p) == 17)
257#define IS_PIN_SPI(p) ((p)== MOSI || (p) == MISO || (p == SCK))
258#define IS_PIN_SERIAL(p) ((p) == 0 || (p) == 1)
259#define PIN_SERIAL5_RX 0 //Serial5
260#define PIN_SERIAL5_TX 1 //Serial5
261#define PIN_TO_DIGITAL(p) (p)
262#define PIN_TO_ANALOG(p) ((p) - 24)
263#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
264#define PIN_TO_SERVO(p) (p)
265
266
267// Teensy 1.0
268#elif defined(__AVR_AT90USB162__)
269#define TOTAL_ANALOG_PINS 0
270#define TOTAL_PINS 21 // 21 digital + no analog
271#define VERSION_BLINK_PIN 6
272#define PIN_SERIAL1_RX 2
273#define PIN_SERIAL1_TX 3
274#define IS_PIN_DIGITAL(p) ((p) >= 0 && (p) < TOTAL_PINS)
275#define IS_PIN_ANALOG(p) (0)
276#define IS_PIN_PWM(p) digitalPinHasPWM(p)
277#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
278#define IS_PIN_I2C(p) (0)
279#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
280#define IS_PIN_SERIAL(p) ((p) == 2 || (p) == 3)
281#define PIN_TO_DIGITAL(p) (p)
282#define PIN_TO_ANALOG(p) (0)
283#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
284#define PIN_TO_SERVO(p) (p)
285
286
287// Teensy 2.0
288#elif defined(__AVR_ATmega32U4__) && defined(CORE_TEENSY)
289#define TOTAL_ANALOG_PINS 12
290#define TOTAL_PINS 25 // 11 digital + 12 analog
291#define VERSION_BLINK_PIN 11
292#define PIN_SERIAL1_RX 7
293#define PIN_SERIAL1_TX 8
294#define IS_PIN_DIGITAL(p) ((p) >= 0 && (p) < TOTAL_PINS)
295#define IS_PIN_ANALOG(p) ((p) >= 11 && (p) <= 22)
296#define IS_PIN_PWM(p) digitalPinHasPWM(p)
297#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
298#define IS_PIN_I2C(p) ((p) == 5 || (p) == 6)
299#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
300#define IS_PIN_SERIAL(p) ((p) == 7 || (p) == 8)
301#define PIN_TO_DIGITAL(p) (p)
302#define PIN_TO_ANALOG(p) (((p) < 22) ? 21 - (p) : 11)
303#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
304#define PIN_TO_SERVO(p) (p)
305
306
307// Teensy 3.0, 3.1 and 3.2
308#elif defined(__MK20DX128__) || defined(__MK20DX256__)
309#define TOTAL_ANALOG_PINS 14
310#define TOTAL_PINS 38 // 24 digital + 10 analog-digital + 4 analog
311#define VERSION_BLINK_PIN 13
312#define PIN_SERIAL1_RX 0
313#define PIN_SERIAL1_TX 1
314#define PIN_SERIAL2_RX 9
315#define PIN_SERIAL2_TX 10
316#define PIN_SERIAL3_RX 7
317#define PIN_SERIAL3_TX 8
318#define IS_PIN_DIGITAL(p) ((p) >= 0 && (p) <= 33)
319#define IS_PIN_ANALOG(p) (((p) >= 14 && (p) <= 23) || ((p) >= 34 && (p) <= 38))
320#define IS_PIN_PWM(p) digitalPinHasPWM(p)
321#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
322#define IS_PIN_I2C(p) ((p) == 18 || (p) == 19)
323#define IS_PIN_SERIAL(p) (((p) > 6 && (p) < 11) || ((p) == 0 || (p) == 1))
324#define PIN_TO_DIGITAL(p) (p)
325#define PIN_TO_ANALOG(p) (((p) <= 23) ? (p) - 14 : (p) - 24)
326#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
327#define PIN_TO_SERVO(p) (p)
328
329
330// Teensy-LC
331#elif defined(__MKL26Z64__)
332#define TOTAL_ANALOG_PINS 13
333#define TOTAL_PINS 27 // 27 digital + 13 analog-digital
334#define VERSION_BLINK_PIN 13
335#define PIN_SERIAL1_RX 0
336#define PIN_SERIAL1_TX 1
337#define PIN_SERIAL2_RX 9
338#define PIN_SERIAL2_TX 10
339#define PIN_SERIAL3_RX 7
340#define PIN_SERIAL3_TX 8
341#define IS_PIN_DIGITAL(p) ((p) >= 0 && (p) <= 26)
342#define IS_PIN_ANALOG(p) ((p) >= 14)
343#define IS_PIN_PWM(p) digitalPinHasPWM(p)
344#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
345#define IS_PIN_I2C(p) ((p) == 18 || (p) == 19)
346#define IS_PIN_SERIAL(p) (((p) > 6 && (p) < 11) || ((p) == 0 || (p) == 1))
347#define PIN_TO_DIGITAL(p) (p)
348#define PIN_TO_ANALOG(p) ((p) - 14)
349#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
350#define PIN_TO_SERVO(p) (p)
351
352
353// Teensy++ 1.0 and 2.0
354#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
355#define TOTAL_ANALOG_PINS 8
356#define TOTAL_PINS 46 // 38 digital + 8 analog
357#define VERSION_BLINK_PIN 6
358#define PIN_SERIAL1_RX 2
359#define PIN_SERIAL1_TX 3
360#define IS_PIN_DIGITAL(p) ((p) >= 0 && (p) < TOTAL_PINS)
361#define IS_PIN_ANALOG(p) ((p) >= 38 && (p) < TOTAL_PINS)
362#define IS_PIN_PWM(p) digitalPinHasPWM(p)
363#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
364#define IS_PIN_I2C(p) ((p) == 0 || (p) == 1)
365#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
366#define IS_PIN_SERIAL(p) ((p) == 2 || (p) == 3)
367#define PIN_TO_DIGITAL(p) (p)
368#define PIN_TO_ANALOG(p) ((p) - 38)
369#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
370#define PIN_TO_SERVO(p) (p)
371
372
373// Leonardo
374#elif defined(__AVR_ATmega32U4__)
375#define TOTAL_ANALOG_PINS 12
376#define TOTAL_PINS 30 // 14 digital + 12 analog + 4 SPI (D14-D17 on ISP header)
377#define VERSION_BLINK_PIN 13
378#define PIN_SERIAL1_RX 0
379#define PIN_SERIAL1_TX 1
380#define IS_PIN_DIGITAL(p) ((p) >= 0 && (p) < TOTAL_PINS)
381#define IS_PIN_ANALOG(p) ((p) >= 18 && (p) < TOTAL_PINS)
382#define IS_PIN_PWM(p) ((p) == 3 || (p) == 5 || (p) == 6 || (p) == 9 || (p) == 10 || (p) == 11 || (p) == 13)
383#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
384#define IS_PIN_I2C(p) ((p) == 2 || (p) == 3)
385#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
386#define IS_PIN_SERIAL(p) ((p) == 0 || (p) == 1)
387#define PIN_TO_DIGITAL(p) (p)
388#define PIN_TO_ANALOG(p) (p) - 18
389#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
390#define PIN_TO_SERVO(p) (p)
391
392
393// Intel Galileo Board (gen 1 and 2) and Intel Edison
394#elif defined(ARDUINO_LINUX)
395#define TOTAL_ANALOG_PINS 6
396#define TOTAL_PINS 20 // 14 digital + 6 analog
397#define VERSION_BLINK_PIN 13
398#define PIN_SERIAL1_RX 0
399#define PIN_SERIAL1_TX 1
400#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) <= 19)
401#define IS_PIN_ANALOG(p) ((p) >= 14 && (p) <= 19)
402#define IS_PIN_PWM(p) digitalPinHasPWM(p)
403#define IS_PIN_SERVO(p) (IS_PIN_DIGITAL(p) && (p) - 2 < MAX_SERVOS)
404#define IS_PIN_I2C(p) ((p) == SDA || (p) == SCL)
405#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
406#define IS_PIN_SERIAL(p) ((p) == 0 || (p) == 1)
407#define PIN_TO_DIGITAL(p) (p)
408#define PIN_TO_ANALOG(p) ((p) - 14)
409#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
410#define PIN_TO_SERVO(p) ((p) - 2)
411
412
413// RedBearLab BLE Nano with factory switch settings (S1 - S10)
414#elif defined(BLE_NANO)
415#define TOTAL_ANALOG_PINS 6
416#define TOTAL_PINS 15 // 9 digital + 3 analog
417#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) <= 14)
418#define IS_PIN_ANALOG(p) ((p) == 8 || (p) == 9 || (p) == 10 || (p) == 11 || (p) == 12 || (p) == 14) //A0~A5
419#define IS_PIN_PWM(p) ((p) == 3 || (p) == 5 || (p) == 6)
420#define IS_PIN_SERVO(p) ((p) >= 2 && (p) <= 7)
421#define IS_PIN_I2C(p) ((p) == SDA || (p) == SCL)
422#define IS_PIN_SPI(p) ((p) == CS || (p) == MOSI || (p) == MISO || (p) == SCK)
423#define PIN_TO_DIGITAL(p) (p)
424#define PIN_TO_ANALOG(p) ((p) - 8)
425#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
426#define PIN_TO_SERVO(p) (p)
427
428
429// Sanguino
430#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__)
431#define TOTAL_ANALOG_PINS 8
432#define TOTAL_PINS 32 // 24 digital + 8 analog
433#define VERSION_BLINK_PIN 0
434#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) < TOTAL_PINS)
435#define IS_PIN_ANALOG(p) ((p) >= 24 && (p) < TOTAL_PINS)
436#define IS_PIN_PWM(p) digitalPinHasPWM(p)
437#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
438#define IS_PIN_I2C(p) ((p) == 16 || (p) == 17)
439#define PIN_TO_DIGITAL(p) (p)
440#define PIN_TO_ANALOG(p) ((p) - 24)
441#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
442#define PIN_TO_SERVO(p) ((p) - 2)
443
444
445// Illuminato
446#elif defined(__AVR_ATmega645__)
447#define TOTAL_ANALOG_PINS 6
448#define TOTAL_PINS 42 // 36 digital + 6 analog
449#define VERSION_BLINK_PIN 13
450#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) < TOTAL_PINS)
451#define IS_PIN_ANALOG(p) ((p) >= 36 && (p) < TOTAL_PINS)
452#define IS_PIN_PWM(p) digitalPinHasPWM(p)
453#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
454#define IS_PIN_I2C(p) ((p) == 4 || (p) == 5)
455#define PIN_TO_DIGITAL(p) (p)
456#define PIN_TO_ANALOG(p) ((p) - 36)
457#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
458#define PIN_TO_SERVO(p) ((p) - 2)
459
460
461// Pic32 chipKIT FubarinoSD
462#elif defined(_BOARD_FUBARINO_SD_)
463#define TOTAL_ANALOG_PINS NUM_ANALOG_PINS // 15
464#define TOTAL_PINS NUM_DIGITAL_PINS // 45, All pins can be digital
465#define MAX_SERVOS NUM_DIGITAL_PINS
466#define VERSION_BLINK_PIN PIN_LED1
467#define IS_PIN_DIGITAL(p) 1
468#define IS_PIN_ANALOG(p) ((p) >= 30 && (p) <= 44)
469#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p)
470#define IS_PIN_SERVO(p) IS_PIN_DIGITAL(p)
471#define IS_PIN_I2C(p) ((p) == 1 || (p) == 2)
472#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
473#define PIN_TO_DIGITAL(p) (p)
474#define PIN_TO_ANALOG(p) (14 - (p - 30))
475#define PIN_TO_PWM(p) (p)
476#define PIN_TO_SERVO(p) (p)
477
478
479// Pic32 chipKIT FubarinoMini
480// Note, FubarinoMini analog pin 20 will not function in Firmata as analog input due to limitation in analog mapping
481#elif defined(_BOARD_FUBARINO_MINI_)
482#define TOTAL_ANALOG_PINS 14 // We have to fake this because of the poor analog pin mapping planning in FubarinoMini
483#define TOTAL_PINS NUM_DIGITAL_PINS // 33
484#define MAX_SERVOS NUM_DIGITAL_PINS
485#define VERSION_BLINK_PIN PIN_LED1
486#define IS_PIN_DIGITAL(p) ((p) != 14 && (p) != 15 && (p) != 31 && (p) != 32)
487#define IS_PIN_ANALOG(p) ((p) == 0 || ((p) >= 3 && (p) <= 13))
488#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p)
489#define IS_PIN_SERVO(p) IS_PIN_DIGITAL(p)
490#define IS_PIN_I2C(p) ((p) == 25 || (p) == 26)
491#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
492#define PIN_TO_DIGITAL(p) (p)
493#define PIN_TO_ANALOG(p) (p)
494#define PIN_TO_PWM(p) (p)
495#define PIN_TO_SERVO(p) (p)
496
497
498// Pic32 chipKIT UNO32
499#elif defined(_BOARD_UNO_) && defined(__PIC32) // NOTE: no _BOARD_UNO32_ to use
500#define TOTAL_ANALOG_PINS NUM_ANALOG_PINS // 12
501#define TOTAL_PINS NUM_DIGITAL_PINS // 47 All pins can be digital
502#define MAX_SERVOS NUM_DIGITAL_PINS // All pins can be servo with SoftPWMservo
503#define VERSION_BLINK_PIN PIN_LED1
504#define IS_PIN_DIGITAL(p) ((p) >= 2)
505#define IS_PIN_ANALOG(p) ((p) >= 14 && (p) <= 25)
506#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p)
507#define IS_PIN_SERVO(p) IS_PIN_DIGITAL(p)
508#define IS_PIN_I2C(p) ((p) == 45 || (p) == 46)
509#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
510#define PIN_TO_DIGITAL(p) (p)
511#define PIN_TO_ANALOG(p) ((p) - 14)
512#define PIN_TO_PWM(p) (p)
513#define PIN_TO_SERVO(p) (p)
514
515
516// Pic32 chipKIT DP32
517#elif defined(_BOARD_DP32_)
518#define TOTAL_ANALOG_PINS 15 // Really only has 9, but have to override because of mistake in variant file
519#define TOTAL_PINS NUM_DIGITAL_PINS // 19
520#define MAX_SERVOS NUM_DIGITAL_PINS // All pins can be servo with SoftPWMservo
521#define VERSION_BLINK_PIN PIN_LED1
522#define IS_PIN_DIGITAL(p) (((p) != 1) && ((p) != 4) && ((p) != 5) && ((p) != 15) && ((p) != 16))
523#define IS_PIN_ANALOG(p) ((p) >= 6 && (p) <= 14)
524#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p)
525#define IS_PIN_SERVO(p) IS_PIN_DIGITAL(p)
526#define IS_PIN_I2C(p) ((p) == 2 || (p) == 3)
527#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
528#define PIN_TO_DIGITAL(p) (p)
529#define PIN_TO_ANALOG(p) (p)
530#define PIN_TO_PWM(p) (p)
531#define PIN_TO_SERVO(p) (p)
532
533
534// Pic32 chipKIT uC32
535#elif defined(_BOARD_UC32_)
536#define TOTAL_ANALOG_PINS NUM_ANALOG_PINS // 12
537#define TOTAL_PINS NUM_DIGITAL_PINS // 47 All pins can be digital
538#define MAX_SERVOS NUM_DIGITAL_PINS // All pins can be servo with SoftPWMservo
539#define VERSION_BLINK_PIN PIN_LED1
540#define IS_PIN_DIGITAL(p) ((p) >= 2)
541#define IS_PIN_ANALOG(p) ((p) >= 14 && (p) <= 25)
542#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p)
543#define IS_PIN_SERVO(p) IS_PIN_DIGITAL(p)
544#define IS_PIN_I2C(p) ((p) == 45 || (p) == 46)
545#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
546#define PIN_TO_DIGITAL(p) (p)
547#define PIN_TO_ANALOG(p) ((p) - 14)
548#define PIN_TO_PWM(p) (p)
549#define PIN_TO_SERVO(p) (p)
550
551
552// Pic32 chipKIT WF32
553#elif defined(_BOARD_WF32_)
554#define TOTAL_ANALOG_PINS NUM_ANALOG_PINS
555#define TOTAL_PINS NUM_DIGITAL_PINS
556#define MAX_SERVOS NUM_DIGITAL_PINS
557#define VERSION_BLINK_PIN PIN_LED1
558#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) <= 49) // Accounts for SD and WiFi dedicated pins
559#define IS_PIN_ANALOG(p) ((p) >= 14 && (p) <= 25)
560#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p)
561#define IS_PIN_SERVO(p) IS_PIN_DIGITAL(p)
562#define IS_PIN_I2C(p) ((p) == 34 || (p) == 35)
563#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
564#define PIN_TO_DIGITAL(p) (p)
565#define PIN_TO_ANALOG(p) ((p) - 14)
566#define PIN_TO_PWM(p) (p)
567#define PIN_TO_SERVO(p) (p)
568
569
570// Pic32 chipKIT WiFire
571#elif defined(_BOARD_WIFIRE_)
572#define TOTAL_ANALOG_PINS NUM_ANALOG_PINS // 14
573#define TOTAL_PINS NUM_DIGITAL_PINS // 71
574#define MAX_SERVOS NUM_DIGITAL_PINS
575#define VERSION_BLINK_PIN PIN_LED1
576#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) <= 47) // Accounts for SD and WiFi dedicated pins
577#define IS_PIN_ANALOG(p) ((p) >= 14 && (p) <= 25)
578#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p)
579#define IS_PIN_SERVO(p) IS_PIN_DIGITAL(p)
580#define IS_PIN_I2C(p) ((p) == 34 || (p) == 35)
581#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
582#define PIN_TO_DIGITAL(p) (p)
583#define PIN_TO_ANALOG(p) ((p) <= 25 ? ((p) - 14) : (p) - 36)
584#define PIN_TO_PWM(p) (p)
585#define PIN_TO_SERVO(p) (p)
586
587
588// Pic32 chipKIT MAX32
589#elif defined(_BOARD_MEGA_) && defined(__PIC32) // NOTE: no _BOARD_MAX32_ to use
590#define TOTAL_ANALOG_PINS NUM_ANALOG_PINS // 16
591#define TOTAL_PINS NUM_DIGITAL_PINS // 87
592#define MAX_SERVOS NUM_DIGITAL_PINS
593#define VERSION_BLINK_PIN PIN_LED1
594#define IS_PIN_DIGITAL(p) ((p) >= 2)
595#define IS_PIN_ANALOG(p) ((p) >= 54 && (p) <= 69)
596#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p)
597#define IS_PIN_SERVO(p) IS_PIN_DIGITAL(p)
598#define IS_PIN_I2C(p) ((p) == 34 || (p) == 35)
599#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
600#define PIN_TO_DIGITAL(p) (p)
601#define PIN_TO_ANALOG(p) ((p) - 54)
602#define PIN_TO_PWM(p) (p)
603#define PIN_TO_SERVO(p) (p)
604
605
606// Pic32 chipKIT Pi
607#elif defined(_BOARD_CHIPKIT_PI_)
608#define TOTAL_ANALOG_PINS 16
609#define TOTAL_PINS NUM_DIGITAL_PINS // 19
610#define MAX_SERVOS NUM_DIGITAL_PINS
611#define VERSION_BLINK_PIN PIN_LED1
612#define IS_PIN_DIGITAL(p) (((p) >= 2) && ((p) <= 3) || (((p) >= 8) && ((p) <= 13)) || (((p) >= 14) && ((p) <= 17)))
613#define IS_PIN_ANALOG(p) ((p) >= 14 && (p) <= 17)
614#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p)
615#define IS_PIN_SERVO(p) IS_PIN_DIGITAL(p)
616#define IS_PIN_I2C(p) ((p) == 16 || (p) == 17)
617#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
618#define PIN_TO_DIGITAL(p) (p)
619#define PIN_TO_ANALOG(p) ((p) <= 15 ? (p) - 14 : (p) - 12)
620//#define PIN_TO_ANALOG(p) (((p) <= 16) ? ((p) - 14) : ((p) - 16))
621#define PIN_TO_PWM(p) (p)
622#define PIN_TO_SERVO(p) (p)
623
624// Pinoccio Scout
625// Note: digital pins 9-16 are usable but not labeled on the board numerically.
626// SS=9, MOSI=10, MISO=11, SCK=12, RX1=13, TX1=14, SCL=15, SDA=16
627#elif defined(ARDUINO_PINOCCIO)
628#define TOTAL_ANALOG_PINS 8
629#define TOTAL_PINS NUM_DIGITAL_PINS // 32
630#define VERSION_BLINK_PIN 23
631#define PIN_SERIAL1_RX 13
632#define PIN_SERIAL1_TX 14
633#define IS_PIN_DIGITAL(p) (((p) >= 2) && ((p) <= 16)) || (((p) >= 24) && ((p) <= 31))
634#define IS_PIN_ANALOG(p) ((p) >= 24 && (p) <= 31)
635#define IS_PIN_PWM(p) digitalPinHasPWM(p)
636#define IS_PIN_SERVO(p) IS_PIN_DIGITAL(p)
637#define IS_PIN_I2C(p) ((p) == SCL || (p) == SDA)
638#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
639#define IS_PIN_SERIAL(p) ((p) == 13 || (p) == 14)
640#define PIN_TO_DIGITAL(p) (p)
641#define PIN_TO_ANALOG(p) ((p) - 24)
642#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
643#define PIN_TO_SERVO(p) ((p) - 2)
644
645// anything else
646#else
647#error "Please edit Boards.h with a hardware abstraction for this board"
648#endif
649
650// as long this is not defined for all boards:
651#ifndef IS_PIN_SPI
652#define IS_PIN_SPI(p) 0
653#endif
654
655#ifndef IS_PIN_SERIAL
656#define IS_PIN_SERIAL(p) 0
657#endif
658
659/*==============================================================================
660 * readPort() - Read an 8 bit port
661 *============================================================================*/
662
663static inline unsigned char readPort(byte, byte) __attribute__((always_inline, unused));
664static inline unsigned char readPort(byte port, byte bitmask)
665{
666#if defined(ARDUINO_PINOUT_OPTIMIZE)
667 if (port == 0) return (PIND & 0xFC) & bitmask; // ignore Rx/Tx 0/1
668 if (port == 1) return ((PINB & 0x3F) | ((PINC & 0x03) << 6)) & bitmask;
669 if (port == 2) return ((PINC & 0x3C) >> 2) & bitmask;
670 return 0;
671#else
672 unsigned char out=0, pin=port*8;
673 if (IS_PIN_DIGITAL(pin+0) && (bitmask & 0x01) && digitalRead(PIN_TO_DIGITAL(pin+0))) out |= 0x01;
674 if (IS_PIN_DIGITAL(pin+1) && (bitmask & 0x02) && digitalRead(PIN_TO_DIGITAL(pin+1))) out |= 0x02;
675 if (IS_PIN_DIGITAL(pin+2) && (bitmask & 0x04) && digitalRead(PIN_TO_DIGITAL(pin+2))) out |= 0x04;
676 if (IS_PIN_DIGITAL(pin+3) && (bitmask & 0x08) && digitalRead(PIN_TO_DIGITAL(pin+3))) out |= 0x08;
677 if (IS_PIN_DIGITAL(pin+4) && (bitmask & 0x10) && digitalRead(PIN_TO_DIGITAL(pin+4))) out |= 0x10;
678 if (IS_PIN_DIGITAL(pin+5) && (bitmask & 0x20) && digitalRead(PIN_TO_DIGITAL(pin+5))) out |= 0x20;
679 if (IS_PIN_DIGITAL(pin+6) && (bitmask & 0x40) && digitalRead(PIN_TO_DIGITAL(pin+6))) out |= 0x40;
680 if (IS_PIN_DIGITAL(pin+7) && (bitmask & 0x80) && digitalRead(PIN_TO_DIGITAL(pin+7))) out |= 0x80;
681 return out;
682#endif
683}
684
685/*==============================================================================
686 * writePort() - Write an 8 bit port, only touch pins specified by a bitmask
687 *============================================================================*/
688
689static inline unsigned char writePort(byte, byte, byte) __attribute__((always_inline, unused));
690static inline unsigned char writePort(byte port, byte value, byte bitmask)
691{
692#if defined(ARDUINO_PINOUT_OPTIMIZE)
693 if (port == 0) {
694 bitmask = bitmask & 0xFC; // do not touch Tx & Rx pins
695 byte valD = value & bitmask;
696 byte maskD = ~bitmask;
697 cli();
698 PORTD = (PORTD & maskD) | valD;
699 sei();
700 } else if (port == 1) {
701 byte valB = (value & bitmask) & 0x3F;
702 byte valC = (value & bitmask) >> 6;
703 byte maskB = ~(bitmask & 0x3F);
704 byte maskC = ~((bitmask & 0xC0) >> 6);
705 cli();
706 PORTB = (PORTB & maskB) | valB;
707 PORTC = (PORTC & maskC) | valC;
708 sei();
709 } else if (port == 2) {
710 bitmask = bitmask & 0x0F;
711 byte valC = (value & bitmask) << 2;
712 byte maskC = ~(bitmask << 2);
713 cli();
714 PORTC = (PORTC & maskC) | valC;
715 sei();
716 }
717#else
718 byte pin=port*8;
719 if ((bitmask & 0x01)) digitalWrite(PIN_TO_DIGITAL(pin+0), (value & 0x01));
720 if ((bitmask & 0x02)) digitalWrite(PIN_TO_DIGITAL(pin+1), (value & 0x02));
721 if ((bitmask & 0x04)) digitalWrite(PIN_TO_DIGITAL(pin+2), (value & 0x04));
722 if ((bitmask & 0x08)) digitalWrite(PIN_TO_DIGITAL(pin+3), (value & 0x08));
723 if ((bitmask & 0x10)) digitalWrite(PIN_TO_DIGITAL(pin+4), (value & 0x10));
724 if ((bitmask & 0x20)) digitalWrite(PIN_TO_DIGITAL(pin+5), (value & 0x20));
725 if ((bitmask & 0x40)) digitalWrite(PIN_TO_DIGITAL(pin+6), (value & 0x40));
726 if ((bitmask & 0x80)) digitalWrite(PIN_TO_DIGITAL(pin+7), (value & 0x80));
727
728#endif
729}
730
731
732
733
734#ifndef TOTAL_PORTS
735#define TOTAL_PORTS ((TOTAL_PINS + 7) / 8)
736#endif
737
738
739#endif /* Firmata_Boards_h */
740
Note: See TracBrowser for help on using the repository browser.