Skip to content

Commit a5e4948

Browse files
committed
Add Alternate pins (ALTx) management
The PinName mentioned Px_y_ALTz (described in the PeripheralPins.c/PinNames.h files) are alternative possibilities which use other HW peripheral instances. To access those alternative PinName name using a pin number can be performed like this: - PYn_ALTx - Ax | ALTx - Dx | ALTx - x | ALTx Signed-off-by: Frederic Pillon <[email protected]>
1 parent 7607fc8 commit a5e4948

File tree

4 files changed

+28
-15
lines changed

4 files changed

+28
-15
lines changed

cores/arduino/pins_arduino.c

+6-5
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ WEAK uint32_t pinNametoDigitalPin(PinName p)
2727
uint32_t i = NUM_DIGITAL_PINS;
2828
if (STM_VALID_PINNAME(p)) {
2929
for (i = 0; i < NUM_DIGITAL_PINS; i++) {
30-
if (digitalPin[i] == p) {
30+
if (digitalPin[i] == (p & PNAME_MASK)) {
31+
i |= ((uint32_t)(p) & ALTX_MASK);
3132
break;
3233
}
3334
}
@@ -80,7 +81,7 @@ bool digitalpinIsAnalogInput(uint32_t pin)
8081
ret = true;
8182
} else {
8283
for (uint32_t i = 0; i < NUM_ANALOG_INPUTS; i++) {
83-
if (analogInputPin[i] == pin) {
84+
if (analogInputPin[i] == (pin & PNUM_MASK)) {
8485
ret = true;
8586
break;
8687
}
@@ -101,11 +102,11 @@ uint32_t digitalPinToAnalogInput(uint32_t pin)
101102
#if NUM_ANALOG_INPUTS > 0
102103
if ((pin & PANA) == PANA) {
103104
/* PYn = Ax */
104-
ret = pin & PANA_IDX;
105+
ret = (pin & PANA_IDX) | (pin & ALTX_MASK);
105106
} else {
106107
for (uint32_t i = 0; i < NUM_ANALOG_INPUTS; i++) {
107-
if (analogInputPin[i] == pin) {
108-
ret = i;
108+
if (analogInputPin[i] == (pin & PNUM_MASK)) {
109+
ret = i | (pin & ALTX_MASK);
109110
break;
110111
}
111112
}

cores/arduino/pins_arduino.h

+19-10
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
#include "pins_arduino_analog.h"
2626
#include "pins_arduino_digital.h"
2727

28+
/* Pin number */
29+
#define PNUM_MASK 0xFF
30+
2831
/* Avoid PortName issue */
2932
_Static_assert(LastPort <= 0x0F, "PortName must be less than 16");
3033

@@ -85,11 +88,14 @@ extern const uint32_t analogInputPin[];
8588
/* Convert a digital pin number Dxx to a PinName PX_n */
8689
#if NUM_ANALOG_INPUTS > 0
8790
/* Note: Analog pin is also a digital pin */
88-
#define digitalPinToPinName(p) (((uint32_t)(p) < NUM_DIGITAL_PINS) ? digitalPin[p] : \
89-
(((uint32_t)(p) & PANA) == PANA) && ((uint32_t)(p) < NUM_ANALOG_INTERNAL_FIRST) ? \
90-
digitalPin[analogInputPin[(p)&PANA_IDX]] : NC)
91+
#define digitalPinToPinName(p) ((((uint32_t)(p) & PNUM_MASK) < NUM_DIGITAL_PINS) ? \
92+
(PinName)(digitalPin[(uint32_t)(p) & PNUM_MASK] | ((p) & ALTX_MASK)) : \
93+
(((uint32_t)(p) & PANA) == PANA) && \
94+
(((uint32_t)(p) & PNUM_MASK) < NUM_ANALOG_INTERNAL_FIRST) ? \
95+
(PinName)(digitalPin[analogInputPin[(p) & PANA_IDX]] | ((p) & ALTX_MASK)) : NC)
9196
#else
92-
#define digitalPinToPinName(p) (((uint32_t)(p) < NUM_DIGITAL_PINS) ? digitalPin[p] : NC)
97+
#define digitalPinToPinName(p) ((((uint32_t)(p) & PNUM_MASK) < NUM_DIGITAL_PINS) ? \
98+
(PinName)(digitalPin[(uint32_t)(p) & PNUM_MASK] | ((p) & ALTX_MASK)) : NC)
9399
#endif /* NUM_ANALOG_INPUTS > 0 */
94100
/* Convert a PinName PX_n to a digital pin number */
95101
uint32_t pinNametoDigitalPin(PinName p);
@@ -98,9 +104,11 @@ uint32_t pinNametoDigitalPin(PinName p);
98104
#if NUM_ANALOG_INPUTS > 0
99105
/* Used by analogRead api to have A0 == 0 */
100106
/* Non contiguous analog pins definition in digitalPin array */
101-
#define analogInputToDigitalPin(p) (((uint32_t)(p) < NUM_ANALOG_INPUTS) ? analogInputPin[p] : \
102-
(((uint32_t)(p) & PANA) == PANA) && ((uint32_t)(p) < NUM_ANALOG_INTERNAL_FIRST) ? \
103-
analogInputPin[(p)&PANA_IDX] : (uint32_t)NC)
107+
#define analogInputToDigitalPin(p) ((((uint32_t)(p) & PNUM_MASK) < NUM_ANALOG_INPUTS) ? \
108+
analogInputPin[(uint32_t)(p) & PNUM_MASK] | ((uint32_t)(p) & ALTX_MASK) : \
109+
(((uint32_t)(p) & PANA) == PANA) && \
110+
(((uint32_t)(p) & PNUM_MASK) < NUM_ANALOG_INTERNAL_FIRST) ? \
111+
analogInputPin[(p) & PANA_IDX] | ((uint32_t)(p) & ALTX_MASK) : (uint32_t)NC)
104112
#else/* No analog pin defined */
105113
#define analogInputToDigitalPin(p) (NUM_DIGITAL_PINS)
106114
#endif /* NUM_ANALOG_INPUTS > 0 */
@@ -159,10 +167,11 @@ PinName analogInputToPinName(uint32_t pin);
159167
#define digitalPinFirstOccurence(p) (pinNametoDigitalPin(digitalPinToPinName(p)))
160168

161169
/* Specific for Firmata */
162-
/* Some pins could be duplicated, ensure 'p' is not one of the serial pins */
163170
#if defined(PIN_SERIAL_RX) && defined(PIN_SERIAL_TX)
164-
#define pinIsSerial(p) ((digitalPinFirstOccurence(p) == PIN_SERIAL_RX) ||\
165-
(digitalPinFirstOccurence(p) == PIN_SERIAL_TX))
171+
#define pinIsSerial(p) ((digitalPinToPinName(p) == \
172+
digitalPinToPinName(PIN_SERIAL_RX & PNUM_MASK)) ||\
173+
(digitalPinToPinName(p) == \
174+
digitalPinToPinName(PIN_SERIAL_TX & PNUM_MASK)))
166175
#endif
167176
/* Convenient macro to handle Analog for Firmata */
168177
#define pinIsAnalogInput digitalpinIsAnalogInput

cores/arduino/stm32/PinNames.h

+2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ extern "C" {
1717
#define ALT5 0x500
1818
#define ALT6 0x600
1919
#define ALT7 0x700
20+
// ALTX mask
21+
#define ALTX_MASK 0x700
2022

2123
// Specific pinmap definition
2224
// Analog internal

keywords.txt

+1
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,7 @@ ALT4 LITERAL1
734734
ALT5 LITERAL1
735735
ALT6 LITERAL1
736736
ALT7 LITERAL1
737+
ATLX_MASK LITERAL1
737738
PANA LITERAL1
738739
PANAINT LITERAL1
739740
PDUAL LITERAL1

0 commit comments

Comments
 (0)