Skip to content

Commit 45cbc5a

Browse files
committed
Rework analog pin management
Use mask to ease analog pin management and ease alternative analog pins introduction. Fix some issues. Signed-off-by: Frederic Pillon <[email protected]>
1 parent 51f0492 commit 45cbc5a

File tree

5 files changed

+59
-33
lines changed

5 files changed

+59
-33
lines changed

Diff for: cores/arduino/pins_arduino.c

+28-9
Original file line numberDiff line numberDiff line change
@@ -67,28 +67,47 @@ PinName analogInputToPinName(uint32_t pin)
6767
return pn;
6868
}
6969

70-
bool pinIsAnalogInput(uint32_t pin)
70+
/**
71+
* @brief Return true if a digital pin is an analog input
72+
* @param pin Dx, x or PYn
73+
* @retval boolean true if analog or false
74+
*/
75+
bool digitalpinIsAnalogInput(uint32_t pin)
7176
{
7277
bool ret = false;
7378
#if NUM_ANALOG_INPUTS > 0
74-
for (uint32_t i = 0; i < NUM_ANALOG_INPUTS; i++) {
75-
if (analogInputPin[i] == pin) {
76-
ret = true;
77-
break;
79+
if ((pin & PANA) == PANA) {
80+
ret = true;
81+
} else {
82+
for (uint32_t i = 0; i < NUM_ANALOG_INPUTS; i++) {
83+
if (analogInputPin[i] == pin) {
84+
ret = true;
85+
break;
86+
}
7887
}
7988
}
8089
#endif /* NUM_ANALOG_INPUTS > 0 */
8190
return ret;
8291
}
8392

93+
/**
94+
* @brief Return the analog input linked to a digital pin
95+
* @param pin Dx, x or PYn
96+
* @retval analogInput valid analog input or NUM_ANALOG_INPUTS
97+
*/
8498
uint32_t digitalPinToAnalogInput(uint32_t pin)
8599
{
86100
uint32_t ret = NUM_ANALOG_INPUTS;
87101
#if NUM_ANALOG_INPUTS > 0
88-
for (uint32_t i = 0; i < NUM_ANALOG_INPUTS; i++) {
89-
if (analogInputPin[i] == pin) {
90-
ret = i;
91-
break;
102+
if ((pin & PANA) == PANA) {
103+
/* PYn = Ax */
104+
ret = pin & PANA_IDX;
105+
} else {
106+
for (uint32_t i = 0; i < NUM_ANALOG_INPUTS; i++) {
107+
if (analogInputPin[i] == pin) {
108+
ret = i;
109+
break;
110+
}
92111
}
93112
}
94113
#endif /* NUM_ANALOG_INPUTS > 0 */

Diff for: cores/arduino/pins_arduino.h

+12-13
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,11 @@ extern const uint32_t analogInputPin[];
8585
/* Convert a digital pin number Dxx to a PinName PX_n */
8686
#if NUM_ANALOG_INPUTS > 0
8787
/* Note: Analog pin is also a digital pin */
88-
#define digitalPinToPinName(p) (((uint32_t)p < NUM_DIGITAL_PINS) ? digitalPin[p] : \
89-
((uint32_t)p >= NUM_ANALOG_FIRST) && ((uint32_t)p <= NUM_ANALOG_LAST) ? \
90-
digitalPin[analogInputPin[p-NUM_ANALOG_FIRST]] : NC)
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)
9191
#else
92-
#define digitalPinToPinName(p) (((uint32_t)p < NUM_DIGITAL_PINS) ? digitalPin[p] : NC)
92+
#define digitalPinToPinName(p) (((uint32_t)(p) < NUM_DIGITAL_PINS) ? digitalPin[p] : NC)
9393
#endif /* NUM_ANALOG_INPUTS > 0 */
9494
/* Convert a PinName PX_n to a digital pin number */
9595
uint32_t pinNametoDigitalPin(PinName p);
@@ -98,16 +98,14 @@ uint32_t pinNametoDigitalPin(PinName p);
9898
#if NUM_ANALOG_INPUTS > 0
9999
/* Used by analogRead api to have A0 == 0 */
100100
/* Non contiguous analog pins definition in digitalPin array */
101-
#define analogInputToDigitalPin(p) ( \
102-
((uint32_t)p < NUM_ANALOG_INPUTS) ? analogInputPin[p] : \
103-
((uint32_t)p >= NUM_ANALOG_FIRST) && ((uint32_t)p <= NUM_ANALOG_LAST) ? \
104-
analogInputPin[p-NUM_ANALOG_FIRST] : p)
105-
#else
106-
/* No analog pin defined */
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)
104+
#else/* No analog pin defined */
107105
#define analogInputToDigitalPin(p) (NUM_DIGITAL_PINS)
108106
#endif /* NUM_ANALOG_INPUTS > 0 */
109107

110-
/* Convert an analog pin number Axx to a PinName PX_n */
108+
/* Convert an analog pin number Ax to a PinName PX_n */
111109
PinName analogInputToPinName(uint32_t pin);
112110

113111
/* All pins could manage EXTI */
@@ -166,8 +164,9 @@ PinName analogInputToPinName(uint32_t pin);
166164
#define pinIsSerial(p) ((digitalPinFirstOccurence(p) == PIN_SERIAL_RX) ||\
167165
(digitalPinFirstOccurence(p) == PIN_SERIAL_TX))
168166
#endif
169-
/* Convenient macro to handle Analog */
170-
bool pinIsAnalogInput(uint32_t pin);
167+
/* Convenient macro to handle Analog for Firmata */
168+
#define pinIsAnalogInput digitalpinIsAnalogInput
169+
bool digitalpinIsAnalogInput(uint32_t pin);
171170
uint32_t digitalPinToAnalogInput(uint32_t pin);
172171

173172
#ifdef __cplusplus

Diff for: cores/arduino/pins_arduino_analog.h

+11-7
Original file line numberDiff line numberDiff line change
@@ -15,34 +15,38 @@
1515
#include "variant.h"
1616
#include "PinNames.h"
1717

18+
/* Analog */
19+
#define PANA 0xC0
20+
/* Analog index */
21+
#define PANA_IDX 0x3F
22+
1823
/* Arduino analog pins */
1924
#ifndef NUM_ANALOG_INPUTS
2025
#define NUM_ANALOG_INPUTS 0
2126
#endif
2227

23-
#define NUM_ANALOG_FIRST (NUM_DIGITAL_PINS + 1)
24-
#define NUM_ANALOG_LAST (NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS)
25-
#define NUM_ANALOG_INTERNAL_FIRST (NUM_ANALOG_LAST + 1)
28+
/* Analog internal pin numbers follow the analog pin number */
29+
#define NUM_ANALOG_INTERNAL_FIRST (PANA + NUM_ANALOG_INPUTS)
2630

2731
/* ADC internal channels (not a pins) */
2832
/* Only used for analogRead() */
2933
#if defined(ADC_CHANNEL_TEMPSENSOR) || defined(ADC_CHANNEL_TEMPSENSOR_ADC1)
3034
#define ATEMP (NUM_ANALOG_INTERNAL_FIRST)
3135
#endif
3236
#ifdef ADC_CHANNEL_VREFINT
33-
#define AVREF (NUM_ANALOG_INTERNAL_FIRST + 2)
37+
#define AVREF (NUM_ANALOG_INTERNAL_FIRST + 1)
3438
#endif
3539
#ifdef ADC_CHANNEL_VBAT
36-
#define AVBAT (NUM_ANALOG_INTERNAL_FIRST + 3)
40+
#define AVBAT (NUM_ANALOG_INTERNAL_FIRST + 2)
3741
#endif
3842
#if defined(ADC5) && defined(ADC_CHANNEL_TEMPSENSOR_ADC5)
39-
#define ATEMP_ADC5 (NUM_ANALOG_INTERNAL_FIRST + 4)
43+
#define ATEMP_ADC5 (NUM_ANALOG_INTERNAL_FIRST + 3)
4044
#endif
4145

4246
/* If NUM_ANALOG_INPUTS is not defined there is no analog pins defined. */
4347
/* Anyway ADC internal channels are always available. */
4448
#if NUM_ANALOG_INPUTS > 0
45-
#define PIN_A0 NUM_ANALOG_FIRST
49+
#define PIN_A0 PANA
4650
static const uint8_t A0 = PIN_A0;
4751
#if NUM_ANALOG_INPUTS > 1
4852
#define PIN_A1 (PIN_A0 + 1)

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

+5-3
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ extern "C" {
1717
#define ALT5 0x600
1818
#define ALT6 0x700
1919

20-
// Specific pins
20+
// Specific pinmap definition
21+
// Analog internal
22+
#define PANAINT 0x1000
2123
// Dual pad pin
2224
// Direct channels are connected to analog I/Os
2325
// (PY_C) to optimize ADC performance.
@@ -29,7 +31,7 @@ extern "C" {
2931

3032
typedef enum {
3133
// Not connected
32-
NC = (int)0xFFFFFFFF,
34+
NC = 0xFFFFFFFF,
3335

3436
// Pin name definition
3537
PA_0 = (PortA << 4) + 0x00,
@@ -246,7 +248,7 @@ typedef enum {
246248
PZ_15 = (PortZ << 4) + 0x0F,
247249
#endif
248250
// Specific pin name
249-
PADC_BASE = 0x100,
251+
PADC_BASE = PANAINT,
250252
#if defined(ADC_CHANNEL_TEMPSENSOR) || defined(ADC_CHANNEL_TEMPSENSOR_ADC1)
251253
PADC_TEMP,
252254
#endif

Diff for: keywords.txt

+3-1
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,6 @@ PIN_A23 LITERAL1
240240

241241
NUM_DIGITAL_PINS LITERAL1
242242
NUM_ANALOG_INPUTS LITERAL1
243-
NUM_ANALOG_FIRST LITERAL1
244243
MAX_ANALOG_INPUTS LITERAL1
245244
NOT_AN_INTERRUPT LITERAL1
246245

@@ -344,6 +343,7 @@ LED_RED LITERAL1
344343

345344
digitalPinToPinName KEYWORD2
346345
analogInputToDigitalPin KEYWORD2
346+
analogInputToPinName KEYWORD2
347347
digitalPinHasI2C KEYWORD2
348348
digitalPinHasPWM KEYWORD2
349349
digitalPinHasSerial KEYWORD2
@@ -733,6 +733,8 @@ ALT3 LITERAL1
733733
ALT4 LITERAL1
734734
ALT5 LITERAL1
735735
ALT6 LITERAL1
736+
PANA LITERAL1
737+
PANAINT LITERAL1
736738
PDUAL LITERAL1
737739
PREMAP LITERAL1
738740

0 commit comments

Comments
 (0)