Skip to content

Commit b692286

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 df6f6bd commit b692286

File tree

3 files changed

+25
-15
lines changed

3 files changed

+25
-15
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

+17-9
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

@@ -84,19 +87,23 @@ extern const uint32_t analogInputPin[];
8487

8588
/* Convert a digital pin number Dxx to a PinName PX_n */
8689
/* Note: Analog pin is also a digital pin */
87-
#define digitalPinToPinName(p) (((uint32_t)(p) < NUM_DIGITAL_PINS) ? digitalPin[p] : \
88-
(((uint32_t)(p) & PANA) == PANA) && ((uint32_t)(p) < NUM_ANALOG_INTERNAL_FIRST) ? \
89-
digitalPin[analogInputPin[(p)&PANA_IDX]] : NC)
90+
#define digitalPinToPinName(p) ((((uint32_t)(p) & PNUM_MASK) < NUM_DIGITAL_PINS) ? \
91+
(PinName)(digitalPin[(uint32_t)(p) & PNUM_MASK] | ((p) & ALTX)) : \
92+
(((uint32_t)(p) & PANA) == PANA) && \
93+
(((uint32_t)(p) & PNUM_MASK) < NUM_ANALOG_INTERNAL_FIRST) ? \
94+
(PinName)(digitalPin[analogInputPin[(p) & PANA_IDX]] | ((p) & ALTX)) : NC)
9095
/* Convert a PinName PX_n to a digital pin number */
9196
uint32_t pinNametoDigitalPin(PinName p);
9297

9398
/* Convert an analog pin number to a digital pin number */
9499
#if NUM_ANALOG_INPUTS > 0
95100
/* Used by analogRead api to have A0 == 0 */
96101
/* Non contiguous analog pins definition in digitalPin array */
97-
#define analogInputToDigitalPin(p) (((uint32_t)(p) < NUM_ANALOG_INPUTS) ? analogInputPin[p] : \
98-
(((uint32_t)(p) & PANA) == PANA) && ((uint32_t)(p) < NUM_ANALOG_INTERNAL_FIRST) ? \
99-
analogInputPin[(p)&PANA_IDX] : (uint32_t)NC)
102+
#define analogInputToDigitalPin(p) ((((uint32_t)(p) & PNUM_MASK) < NUM_ANALOG_INPUTS) ? \
103+
analogInputPin[(uint32_t)(p) & PNUM_MASK] | ((uint32_t)(p) & ALTX) : \
104+
(((uint32_t)(p) & PANA) == PANA) && \
105+
(((uint32_t)(p) & PNUM_MASK) < NUM_ANALOG_INTERNAL_FIRST) ? \
106+
analogInputPin[(p) & PANA_IDX] | ((uint32_t)(p) & ALTX) : (uint32_t)NC)
100107
#else/* No analog pin defined */
101108
#define analogInputToDigitalPin(p) (NUM_DIGITAL_PINS)
102109
#endif // NUM_ANALOG_INPUTS > 0
@@ -155,10 +162,11 @@ PinName analogInputToPinName(uint32_t pin);
155162
#define digitalPinFirstOccurence(p) (pinNametoDigitalPin(digitalPinToPinName(p)))
156163

157164
/* Specific for Firmata */
158-
/* Some pins could be duplicated, ensure 'p' is not one of the serial pins */
159165
#if defined(PIN_SERIAL_RX) && defined(PIN_SERIAL_TX)
160-
#define pinIsSerial(p) ((digitalPinFirstOccurence(p) == PIN_SERIAL_RX) ||\
161-
(digitalPinFirstOccurence(p) == PIN_SERIAL_TX))
166+
#define pinIsSerial(p) ((digitalPinToPinName(p) == \
167+
digitalPinToPinName(PIN_SERIAL_RX & PNUM_MASK)) ||\
168+
(digitalPinToPinName(p) == \
169+
digitalPinToPinName(PIN_SERIAL_TX & PNUM_MASK)))
162170
#endif
163171
/* Convenient macro to handle Analog for Firmata */
164172
#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)