11/*
22 Boards.h - Hardware Abstraction Layer for Firmata library
33 Copyright (c) 2006-2008 Hans-Christoph Steiner. All rights reserved.
4- Copyright (C) 2009-2015 Jeff Hoefs. All rights reserved.
4+ Copyright (C) 2009-2017 Jeff Hoefs. All rights reserved.
55
66 This library is free software; you can redistribute it and/or
77 modify it under the terms of the GNU Lesser General Public
1010
1111 See file LICENSE.txt for further informations on licensing terms.
1212
13- Last updated December 19th, 2015
13+ Last updated March 16th, 2017
1414*/
1515
1616#ifndef Firmata_Boards_h
@@ -260,6 +260,23 @@ writePort(port, value, bitmask): Write an 8 bit port.
260260#define PIN_TO_SERVO (p ) (p) // deprecated since v2.4
261261
262262
263+ // Arduino MKRZero
264+ #elif defined(ARDUINO_SAMD_MKRZERO )
265+ #define TOTAL_ANALOG_PINS 7
266+ #define TOTAL_PINS 34 // 8 digital + 3 spi + 2 i2c + 2 uart + 7 analog + 3 usb + 1 aref + 5 sd + 1 bottom pad + 1 led + 1 battery adc
267+ #define IS_PIN_DIGITAL (p ) ((((p) >= 0 && (p) <= 21) || (p) == 32) && !IS_PIN_SERIAL(p))
268+ #define IS_PIN_ANALOG (p ) (((p) >= 15 && (p) < 15 + TOTAL_ANALOG_PINS) || (p) == 33)
269+ #define IS_PIN_PWM (p ) digitalPinHasPWM(p)
270+ #define IS_PIN_SERVO (p ) (IS_PIN_DIGITAL(p) && (p) < MAX_SERVOS) // deprecated since v2.4
271+ #define IS_PIN_I2C (p ) ((p) == 11 || (p) == 12) // SDA = 11, SCL = 12
272+ #define IS_PIN_SPI (p ) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
273+ #define IS_PIN_SERIAL (p ) ((p) == PIN_SERIAL1_RX || (p) == PIN_SERIAL1_TX) //defined in variant.h RX = 13, TX = 14
274+ #define PIN_TO_DIGITAL (p ) (p)
275+ #define PIN_TO_ANALOG (p ) ((p) - 15)
276+ #define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
277+ #define PIN_TO_SERVO (p ) (p) // deprecated since v2.4
278+
279+
263280// Arduino Zero
264281// Note this will work with an Arduino Zero Pro, but not with an Arduino M0 Pro
265282// Arduino M0 Pro does not properly map pins to the board labeled pin numbers
@@ -282,8 +299,23 @@ writePort(port, value, bitmask): Write an 8 bit port.
282299#define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
283300#define PIN_TO_SERVO (p ) (p) // deprecated since v2.4
284301
302+ // Arduino Primo
303+ #elif defined(ARDUINO_PRIMO )
304+ #define TOTAL_ANALOG_PINS 6
305+ #define TOTAL_PINS 22 //14 digital + 6 analog + 2 i2c
306+ #define VERSION_BLINK_PIN LED_BUILTIN
307+ #define IS_PIN_DIGITAL (p ) ((p) >= 2 && (p) < 20)
308+ #define IS_PIN_ANALOG (p ) ((p) >= 14 && (p) < 20)
309+ #define IS_PIN_PWM (p ) digitalPinHasPWM(p)
310+ #define IS_PIN_SERVO (p ) (IS_PIN_DIGITAL(p) && (p) < MAX_SERVOS+2)
311+ #define IS_PIN_I2C (p ) ((p) == PIN_WIRE_SDA || (p) == PIN_WIRE_SCL) // SDA = 20, SCL = 21
312+ #define IS_PIN_SPI (p ) ((p) == SS || (p)== MOSI || (p) == MISO || (p == SCK)) // 10, 11, 12, 13
313+ #define PIN_TO_DIGITAL (p ) (p)
314+ #define PIN_TO_ANALOG (p ) ((p) - 14)
315+ #define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
316+ #define PIN_TO_SERVO (p ) (p)
285317
286- // Teensy 1.0
318+ // Arduino 101
287319#elif defined(_VARIANT_ARDUINO_101_X_ )
288320#define TOTAL_ANALOG_PINS NUM_ANALOG_INPUTS
289321#define TOTAL_PINS NUM_DIGITAL_PINS // 15 digital (including ATN pin) + 6 analog
@@ -343,6 +375,36 @@ writePort(port, value, bitmask): Write an 8 bit port.
343375#define PIN_TO_SERVO (p ) (p)
344376
345377
378+ // Teensy 3.5 and 3.6
379+ // reference: https://github.com/PaulStoffregen/cores/blob/master/teensy3/pins_arduino.h
380+ #elif defined(__MK64FX512__ ) || defined(__MK66FX1M0__ )
381+ #define TOTAL_ANALOG_PINS 27 // 3.5 has 27 and 3.6 has 25
382+ #define TOTAL_PINS 70 // 43 digital + 21 analog-digital + 6 analog (64-69)
383+ #define VERSION_BLINK_PIN 13
384+ #define PIN_SERIAL1_RX 0
385+ #define PIN_SERIAL1_TX 1
386+ #define PIN_SERIAL2_RX 9
387+ #define PIN_SERIAL2_TX 10
388+ #define PIN_SERIAL3_RX 7
389+ #define PIN_SERIAL3_TX 8
390+ // The following 2 UARTs are not yet available via SerialFirmata
391+ #define PIN_SERIAL4_RX 31
392+ #define PIN_SERIAL5_TX 32
393+ #define PIN_SERIAL6_RX 34
394+ #define PIN_SERIAL6_TX 33
395+ #define IS_PIN_DIGITAL (p ) ((p) >= 0 && (p) <= 63)
396+ #define IS_PIN_ANALOG (p ) (((p) >= 14 && (p) <= 23) || ((p) >= 31 && (p) <= 39) || ((p) >= 49 && (p) <= 50) || ((p) >= 64 && (p) <= 69))
397+ #define IS_PIN_PWM (p ) digitalPinHasPWM(p)
398+ #define IS_PIN_SERVO (p ) ((p) >= 0 && (p) < MAX_SERVOS)
399+ #define IS_PIN_I2C (p ) ((p) == 18 || (p) == 19)
400+ #define IS_PIN_SERIAL (p ) (((p) > 6 && (p) < 11) || ((p) == 0 || (p) == 1))
401+ #define PIN_TO_DIGITAL (p ) (p)
402+ // A0-A9 = D14-D23; A12-A20 = D31-D39; A23-A24 = D49-D50; A10-A11 = D64-D65; A21-A22 = D66-D67; A25-A26 = D68-D69
403+ #define PIN_TO_ANALOG (p ) (((p) <= 23) ? (p) - 14 : (((p) <= 39) ? (p) - 19 : (((p) <= 50) ? (p) - 26 : (((p) <= 65) ? (p) - 55 : (((p) <= 67) ? (p) - 45 : (p) - 43)))))
404+ #define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
405+ #define PIN_TO_SERVO (p ) (p)
406+
407+
346408// Teensy 3.0, 3.1 and 3.2
347409#elif defined(__MK20DX128__ ) || defined(__MK20DX256__ )
348410#define TOTAL_ANALOG_PINS 14
@@ -449,6 +511,22 @@ writePort(port, value, bitmask): Write an 8 bit port.
449511#define PIN_TO_SERVO (p ) ((p) - 2)
450512
451513
514+ // RedBearLab BLE Nano with factory switch settings (S1 - S10)
515+ #elif defined(BLE_NANO )
516+ #define TOTAL_ANALOG_PINS 6
517+ #define TOTAL_PINS 15 // 9 digital + 3 analog
518+ #define IS_PIN_DIGITAL (p ) ((p) >= 2 && (p) <= 14)
519+ #define IS_PIN_ANALOG (p ) ((p) == 8 || (p) == 9 || (p) == 10 || (p) == 11 || (p) == 12 || (p) == 14) //A0~A5
520+ #define IS_PIN_PWM (p ) ((p) == 3 || (p) == 5 || (p) == 6)
521+ #define IS_PIN_SERVO (p ) ((p) >= 2 && (p) <= 7)
522+ #define IS_PIN_I2C (p ) ((p) == SDA || (p) == SCL)
523+ #define IS_PIN_SPI (p ) ((p) == CS || (p) == MOSI || (p) == MISO || (p) == SCK)
524+ #define PIN_TO_DIGITAL (p ) (p)
525+ #define PIN_TO_ANALOG (p ) ((p) - 8)
526+ #define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
527+ #define PIN_TO_SERVO (p ) (p)
528+
529+
452530// Sanguino
453531#elif defined(__AVR_ATmega644P__ ) || defined(__AVR_ATmega644__ )
454532#define TOTAL_ANALOG_PINS 8
@@ -665,29 +743,48 @@ writePort(port, value, bitmask): Write an 8 bit port.
665743#define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
666744#define PIN_TO_SERVO (p ) ((p) - 2)
667745
668- // Nucleo STM32F429
669- #elif defined(STM32 )
670- #define TOTAL_ANALOG_PINS NUM_ANALOG_INPUTS //7
671- #define TOTAL_PINS NUM_DIGITAL_PINS //22 : All pins can be digital
672- #define TOTAL_PORTS 3
673- #define VERSION_BLINK_PIN LED_BUILTIN
674- #define PIN_SERIAL_RX 9
675- #define PIN_SERIAL_TX 8
676- #define PIN_SERIAL1_RX 0
677- #define PIN_SERIAL1_TX 1
678- #define PIN_SERIAL2_RX 8
679- #define PIN_SERIAL2_TX 9
680- #define IS_PIN_DIGITAL (p ) ((p) >= 2 && (p) < TOTAL_PINS)
681- #define IS_PIN_ANALOG (p ) ((p) >= 16 && (p) < TOTAL_PINS)
682- #define IS_PIN_PWM (p ) ((p) == 3 || (p) == 5 || (p) == 6 || (p) == 9 || (p) == 10 || (p) == 11)
683- #define IS_PIN_SERVO (p ) IS_PIN_DIGITAL((p))
684- #define IS_PIN_I2C (p ) ((p) == 14 || (p) == 15)
746+ // ESP8266
747+ // note: boot mode GPIOs 0, 2 and 15 can be used as outputs, GPIOs 6-11 are in use for flash IO
748+ #elif defined(ESP8266 )
749+ #define TOTAL_ANALOG_PINS NUM_ANALOG_INPUTS
750+ #define TOTAL_PINS A0 + NUM_ANALOG_INPUTS
751+ #define PIN_SERIAL_RX 3
752+ #define PIN_SERIAL_TX 1
753+ #define IS_PIN_DIGITAL (p ) (((p) >= 0 && (p) <= 5) || ((p) >= 12 && (p) < A0))
754+ #define IS_PIN_ANALOG (p ) ((p) >= A0 && (p) < A0 + NUM_ANALOG_INPUTS)
755+ #define IS_PIN_PWM (p ) digitalPinHasPWM(p)
756+ #define IS_PIN_SERVO (p ) (IS_PIN_DIGITAL(p) && (p) < MAX_SERVOS)
757+ #define IS_PIN_I2C (p ) ((p) == SDA || (p) == SCL)
685758#define IS_PIN_SPI (p ) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
686- #define IS_PIN_SERIAL (p ) ((p) == 0 || (p) == 1)
759+ #define IS_PIN_INTERRUPT (p ) (digitalPinToInterrupt(p) > NOT_AN_INTERRUPT)
760+ #define IS_PIN_SERIAL (p ) ((p) == PIN_SERIAL_RX || (p) == PIN_SERIAL_TX)
687761#define PIN_TO_DIGITAL (p ) (p)
688- #define PIN_TO_ANALOG (p ) ((p) - 16)
762+ #define PIN_TO_ANALOG (p ) ((p) - A0)
763+ #define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
764+ #define PIN_TO_SERVO (p ) (p)
765+ #define DEFAULT_PWM_RESOLUTION 10
766+
767+ // STM32 based boards
768+ #elif defined(ARDUINO_ARCH_STM32 )
769+ #define TOTAL_ANALOG_PINS NUM_ANALOG_INPUTS
770+ #define TOTAL_PINS NUM_DIGITAL_PINS
771+ #define TOTAL_PORTS MAX_NB_PORT
772+ #define VERSION_BLINK_PIN LED_BUILTIN
773+ // PIN_SERIALY_RX/TX defined in the variant.h
774+ #define IS_PIN_DIGITAL (p ) ((p != PIN_SERIAL_RX) && (p != PIN_SERIAL_TX) &&\
775+ (p >= 0) && (p < TOTAL_PINS))
776+ #define IS_PIN_ANALOG (p ) ((p) >= A0 && (p) < AEND)
777+ #define IS_PIN_PWM (p ) digitalPinHasPWM(p)
778+ #define IS_PIN_SERVO (p ) IS_PIN_DIGITAL(p)
779+ #define IS_PIN_I2C (p ) digitalPinHasI2C(p)
780+ #define IS_PIN_SPI (p ) digitalPinHasSPI(p)
781+ #define IS_PIN_INTERRUPT (p ) (digitalPinToInterrupt(p) > NOT_AN_INTERRUPT)
782+ #define IS_PIN_SERIAL (p ) digitalPinHasSerial(p)
783+ #define PIN_TO_DIGITAL (p ) (p)
784+ #define PIN_TO_ANALOG (p ) (p-A0)
689785#define PIN_TO_PWM (p ) (p)
690786#define PIN_TO_SERVO (p ) (p)
787+ #define DEFAULT_PWM_RESOLUTION PWM_RESOLUTION
691788
692789// anything else
693790#else
@@ -703,6 +800,9 @@ writePort(port, value, bitmask): Write an 8 bit port.
703800#define IS_PIN_SERIAL (p ) 0
704801#endif
705802
803+ #ifndef DEFAULT_PWM_RESOLUTION
804+ #define DEFAULT_PWM_RESOLUTION 8
805+ #endif
706806
707807/*==============================================================================
708808 * readPort() - Read an 8 bit port
0 commit comments