Skip to content

Commit 247310a

Browse files
authored
Merge pull request #58 from fpistm/update_pinfunctions
Update pinfunctions
2 parents ada7c5c + eccfd28 commit 247310a

File tree

3 files changed

+44
-29
lines changed

3 files changed

+44
-29
lines changed

Diff for: cores/arduino/pins_arduino.c

+6-4
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,12 @@ void __libc_init_array(void);
2626

2727
WEAK uint32_t pinNametoDigitalPin(PinName p)
2828
{
29-
uint32_t i = 0;
30-
for(i = 0; i < NUM_DIGITAL_PINS; i++) {
31-
if (digitalPin[i] == p)
32-
break;
29+
uint32_t i = NC;
30+
if(STM_VALID_PINNAME(p)) {
31+
for(i = 0; i < NUM_DIGITAL_PINS; i++) {
32+
if (digitalPin[i] == p)
33+
break;
34+
}
3335
}
3436
return i;
3537
}

Diff for: cores/arduino/pins_arduino.h

+31-18
Original file line numberDiff line numberDiff line change
@@ -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
4444
uint32_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
}

Diff for: libraries/Firmata/Boards.h

+7-7
Original file line numberDiff line numberDiff line change
@@ -771,14 +771,14 @@ writePort(port, value, bitmask): Write an 8 bit port.
771771
#define TOTAL_PORTS MAX_NB_PORT
772772
#define VERSION_BLINK_PIN LED_BUILTIN
773773
// PIN_SERIALY_RX/TX defined in the variant.h
774-
#define IS_PIN_DIGITAL(p) ((p != PIN_SERIAL_RX) && (p != PIN_SERIAL_TX) && (p < TOTAL_PINS))
775-
#define IS_PIN_ANALOG(p) ((p) >= A0 && (p) < AEND)
776-
#define IS_PIN_PWM(p) digitalPinHasPWM(p)
774+
#define IS_PIN_DIGITAL(p) (digitalPinIsValid(p) && !pinIsSerial(p))
775+
#define IS_PIN_ANALOG(p) ((p >= A0) && (p < AEND) && !pinIsSerial(p))
776+
#define IS_PIN_PWM(p) (IS_PIN_DIGITAL(p) && digitalPinHasPWM(p))
777777
#define IS_PIN_SERVO(p) IS_PIN_DIGITAL(p)
778-
#define IS_PIN_I2C(p) digitalPinHasI2C(p)
779-
#define IS_PIN_SPI(p) digitalPinHasSPI(p)
780-
#define IS_PIN_INTERRUPT(p) (digitalPinToInterrupt(p) > NOT_AN_INTERRUPT)
781-
#define IS_PIN_SERIAL(p) digitalPinHasSerial(p)
778+
#define IS_PIN_I2C(p) (IS_PIN_DIGITAL(p) && digitalPinHasI2C(p))
779+
#define IS_PIN_SPI(p) (IS_PIN_DIGITAL(p) && digitalPinHasSPI(p))
780+
#define IS_PIN_INTERRUPT(p) (IS_PIN_DIGITAL(p) && (digitalPinToInterrupt(p) > NOT_AN_INTERRUPT)))
781+
#define IS_PIN_SERIAL(p) (digitalPinHasSerial(p))
782782
#define PIN_TO_DIGITAL(p) (p)
783783
#define PIN_TO_ANALOG(p) (p-A0)
784784
#define PIN_TO_PWM(p) (p)

0 commit comments

Comments
 (0)