@@ -32,38 +32,51 @@ extern "C" {
3232# include <syscalls.h> /** RedHat Newlib minimal stub */
3333#endif
3434
35- #define NOT_AN_INTERRUPT NC // -1
35+ #define NOT_AN_INTERRUPT NC // -1
3636
37- #define NUM_DIGITAL_PINS DEND
38- #define NUM_ANALOG_INPUTS (AEND-A0)
37+ #define NUM_DIGITAL_PINS DEND
38+ #define NUM_ANALOG_INPUTS (AEND-A0)
3939
4040// Convert a digital pin number Dxx to a PinName Pxy
4141// Note: Analog pin is also a digital pin.
42- #define digitalPinToPinName (p ) ((p < NUM_DIGITAL_PINS) ? digitalPin[p] : (STM_VALID_PINNAME(p))? (PinName)p : NC)
42+ #define digitalPinToPinName (p ) ((p < NUM_DIGITAL_PINS) ? digitalPin[p] : NC)
4343// Convert a PinName Pxy to a digital pin number
4444uint32_t pinNametoDigitalPin (PinName p );
4545
4646// Convert an analog pin number to a digital pin number
4747// Used by analogRead api to have A0 == 0
48- #define analogInputToDigitalPin (p ) ((p < NUM_ANALOG_INPUTS) ? (p+A0) : p)
48+ #define analogInputToDigitalPin (p ) ((p < NUM_ANALOG_INPUTS) ? (p+A0) : p)
4949// Convert an analog pin number Axx to a PinName Pxy
50- #define analogInputToPinName (p ) (digitalPinToPinName(analogInputToDigitalPin(p)))
50+ #define analogInputToPinName (p ) (digitalPinToPinName(analogInputToDigitalPin(p)))
5151// All pins could manage EXTI
52- #define digitalPinToInterrupt (p ) ((p>=D0) && (p < NUM_DIGITAL_PINS ) ? p : NOT_AN_INTERRUPT)
52+ #define digitalPinToInterrupt (p ) ((digitalPinIsValid(p ) ? p : NOT_AN_INTERRUPT)
5353
54- #define digitalPinHasI2C (p ) (pin_in_pinmap(digitalPinToPinName(p), PinMap_I2C_SDA) ||\
55- pin_in_pinmap(digitalPinToPinName(p), PinMap_I2C_SCL))
56- #define digitalPinHasPWM (p ) (pin_in_pinmap(digitalPinToPinName(p), PinMap_PWM))
57- #define digitalPinHasSerial (p ) (pin_in_pinmap(digitalPinToPinName(p), PinMap_UART_RX) ||\
58- pin_in_pinmap(digitalPinToPinName(p), PinMap_UART_TX))
59- #define digitalPinHasSPI (p ) (pin_in_pinmap(digitalPinToPinName(p), PinMap_SPI_MOSI) ||\
60- pin_in_pinmap(digitalPinToPinName(p), PinMap_SPI_MISO) ||\
61- pin_in_pinmap(digitalPinToPinName(p), PinMap_SPI_SCLK) ||\
62- pin_in_pinmap(digitalPinToPinName(p), PinMap_SPI_SSEL))
54+ #define digitalPinHasI2C (p ) (pin_in_pinmap(digitalPinToPinName(p), PinMap_I2C_SDA) ||\
55+ pin_in_pinmap(digitalPinToPinName(p), PinMap_I2C_SCL))
56+ #define digitalPinHasPWM (p ) (pin_in_pinmap(digitalPinToPinName(p), PinMap_PWM))
57+ #define digitalPinHasSerial (p ) (pin_in_pinmap(digitalPinToPinName(p), PinMap_UART_RX) ||\
58+ pin_in_pinmap(digitalPinToPinName(p), PinMap_UART_TX))
59+ #define digitalPinHasSPI (p ) (pin_in_pinmap(digitalPinToPinName(p), PinMap_SPI_MOSI) ||\
60+ pin_in_pinmap(digitalPinToPinName(p), PinMap_SPI_MISO) ||\
61+ pin_in_pinmap(digitalPinToPinName(p), PinMap_SPI_SCLK) ||\
62+ pin_in_pinmap(digitalPinToPinName(p), PinMap_SPI_SSEL))
6363
6464
65- #define digitalPinToPort (p ) ( get_GPIO_Port(digitalPinToPinName(p)) )
66- #define digitalPinToBitMask (p ) ( STM_GPIO_PIN(digitalPinToPinName(p)) )
65+ #define digitalPinToPort (p ) (get_GPIO_Port(digitalPinToPinName(p)))
66+ #define digitalPinToBitMask (p ) (STM_GPIO_PIN(digitalPinToPinName(p)))
67+
68+ #define digitalPinIsValid (p ) (digitalPinToPinName(p) != NC)
69+
70+ // As some pin could be duplicated in digitalPin[]
71+ // return first occurence of linked PinName (PYx)
72+ #define digitalPinFirstOccurence (p ) (pinNametoDigitalPin(digitalPinToPinName(p)))
73+
74+ // Specific for Firmata. As some pins could be duplicated,
75+ // ensure 'p' is not one of the serial pins
76+ #if defined(PIN_SERIAL_RX ) && defined(PIN_SERIAL_TX )
77+ #define pinIsSerial (p ) ((digitalPinFirstOccurence(p) == PIN_SERIAL_RX) ||\
78+ (digitalPinFirstOccurence(p) == PIN_SERIAL_TX))
79+ #endif
6780
6881#ifdef __cplusplus
6982}
0 commit comments