Skip to content

Commit 3254c19

Browse files
committed
Add ALTx management
Pin number can be: - PYn_ALTx - Ax | ALTx - Dx | ALTx - x | ALTx PinName can be: - PY_n_ALTx Signed-off-by: Frederic Pillon <[email protected]>
1 parent 773a56a commit 3254c19

File tree

3 files changed

+27
-16
lines changed

3 files changed

+27
-16
lines changed

Diff for: 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);
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);
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);
109110
break;
110111
}
111112
}

Diff for: 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)) : \
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)) : 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)) : 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) : \
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) : (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

Diff for: cores/arduino/stm32/PinNames.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ extern "C" {
1616
#define ALT4 0x500
1717
#define ALT5 0x600
1818
#define ALT6 0x700
19-
19+
// ALTX mask
20+
#define ALTX 0x700
2021
// Specific pinmap definition
2122
// Analog internal
2223
#define PANAINT 0x1000

0 commit comments

Comments
 (0)