Skip to content

Commit 6c95e42

Browse files
committed
[pin_remap 2/3] core,libs: add pin remap hooks
1 parent 1ac2144 commit 6c95e42

File tree

8 files changed

+184
-22
lines changed

8 files changed

+184
-22
lines changed

cores/esp32/Arduino.h

+6-5
Original file line numberDiff line numberDiff line change
@@ -110,13 +110,13 @@
110110
#define analogInPinToBit(P) (P)
111111
#if SOC_GPIO_PIN_COUNT <= 32
112112
#define digitalPinToPort(pin) (0)
113-
#define digitalPinToBitMask(pin) (1UL << (pin))
113+
#define digitalPinToBitMask(pin) (1UL << digitalPinToGPIONumber(pin))
114114
#define portOutputRegister(port) ((volatile uint32_t*)GPIO_OUT_REG)
115115
#define portInputRegister(port) ((volatile uint32_t*)GPIO_IN_REG)
116116
#define portModeRegister(port) ((volatile uint32_t*)GPIO_ENABLE_REG)
117117
#elif SOC_GPIO_PIN_COUNT <= 64
118-
#define digitalPinToPort(pin) (((pin)>31)?1:0)
119-
#define digitalPinToBitMask(pin) (1UL << (((pin)>31)?((pin)-32):(pin)))
118+
#define digitalPinToPort(pin) ((digitalPinToGPIONumber(pin)>31)?1:0)
119+
#define digitalPinToBitMask(pin) (1UL << (digitalPinToGPIONumber(pin)&31))
120120
#define portOutputRegister(port) ((volatile uint32_t*)((port)?GPIO_OUT1_REG:GPIO_OUT_REG))
121121
#define portInputRegister(port) ((volatile uint32_t*)((port)?GPIO_IN1_REG:GPIO_IN_REG))
122122
#define portModeRegister(port) ((volatile uint32_t*)((port)?GPIO_ENABLE1_REG:GPIO_ENABLE_REG))
@@ -138,8 +138,8 @@
138138
#endif
139139
#define EXTERNAL_NUM_INTERRUPTS NUM_DIGITAL_PINS // All GPIOs
140140
#define analogInputToDigitalPin(p) (((p)<NUM_ANALOG_INPUTS)?(analogChannelToDigitalPin(p)):-1)
141-
#define digitalPinToInterrupt(p) (((p)<NUM_DIGITAL_PINS)?(p):NOT_AN_INTERRUPT)
142-
#define digitalPinHasPWM(p) ((p)<NUM_DIGITAL_PINS)
141+
#define digitalPinToInterrupt(p) ((((uint8_t)digitalPinToGPIONumber(p))<NUM_DIGITAL_PINS)?digitalPinToGPIONumber(p):NOT_AN_INTERRUPT)
142+
#define digitalPinHasPWM(p) (((uint8_t)digitalPinToGPIONumber(p))<NUM_DIGITAL_PINS)
143143

144144
typedef bool boolean;
145145
typedef uint8_t byte;
@@ -235,5 +235,6 @@ void noTone(uint8_t _pin);
235235
#endif /* __cplusplus */
236236

237237
#include "pins_arduino.h"
238+
#include "io_pin_remap.h"
238239

239240
#endif /* _ESP32_CORE_ARDUINO_H_ */

cores/esp32/FunctionalInterrupt.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@
1212
#include <stdint.h>
1313

1414
struct InterruptArgStructure {
15-
std::function<void(void)> interruptFunction;
15+
std::function<void(void)> interruptFunction;
1616
};
1717

18-
void attachInterrupt(uint8_t pin, std::function<void(void)> intRoutine, int mode);
19-
18+
// The extra set of parentheses here prevents macros defined
19+
// in io_pin_remap.h from applying to this declaration.
20+
void (attachInterrupt)(uint8_t pin, std::function<void(void)> intRoutine, int mode);
2021

2122
#endif /* CORE_CORE_FUNCTIONALINTERRUPT_H_ */

cores/esp32/HardwareSerial.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <ctime>
66

77
#include "pins_arduino.h"
8+
#include "io_pin_remap.h"
89
#include "HardwareSerial.h"
910
#include "soc/soc_caps.h"
1011
#include "driver/uart.h"
@@ -325,6 +326,10 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
325326
}
326327
}
327328

329+
// map logical pins to GPIO numbers
330+
rxPin = digitalPinToGPIONumber(rxPin);
331+
txPin = digitalPinToGPIONumber(txPin);
332+
328333
if(_uart) {
329334
// in this case it is a begin() over a previous begin() - maybe to change baud rate
330335
// thus do not disable debug output
@@ -500,6 +505,12 @@ void HardwareSerial::setRxInvert(bool invert)
500505
// can be called after or before begin()
501506
bool HardwareSerial::setPins(int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin)
502507
{
508+
// map logical pins to GPIO numbers
509+
rxPin = digitalPinToGPIONumber(rxPin);
510+
txPin = digitalPinToGPIONumber(txPin);
511+
ctsPin = digitalPinToGPIONumber(ctsPin);
512+
rtsPin = digitalPinToGPIONumber(rtsPin);
513+
503514
// uartSetPins() checks if pins are valid and, if necessary, detaches the previous ones
504515
return uartSetPins(_uart_nr, rxPin, txPin, ctsPin, rtsPin);
505516
}

cores/esp32/io_pin_remap.h

+138
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
#ifndef __IO_PIN_REMAP_H__
2+
#define __IO_PIN_REMAP_H__
3+
4+
#include "Arduino.h"
5+
6+
#if defined(BOARD_HAS_PIN_REMAP) && !defined(BOARD_USES_HW_GPIO_NUMBERS)
7+
8+
// Pin remapping functions
9+
int8_t digitalPinToGPIONumber(int8_t digitalPin);
10+
int8_t gpioNumberToDigitalPin(int8_t gpioNumber);
11+
12+
// Apply pin remapping to API only when building libraries and user sketch
13+
#ifndef ARDUINO_CORE_BUILD
14+
15+
// Override APIs requiring pin remapping
16+
17+
// cores/esp32/Arduino.h
18+
#define pulseInLong(pin, args...) pulseInLong(digitalPinToGPIONumber(pin), args)
19+
#define pulseIn(pin, args...) pulseIn(digitalPinToGPIONumber(pin), args)
20+
#define noTone(_pin) noTone(digitalPinToGPIONumber(_pin))
21+
#define tone(_pin, args...) tone(digitalPinToGPIONumber(_pin), args)
22+
23+
// cores/esp32/esp32-hal.h
24+
#define analogGetChannel(pin) analogGetChannel(digitalPinToGPIONumber(pin))
25+
#define analogWrite(pin, value) analogWrite(digitalPinToGPIONumber(pin), value)
26+
#define analogWriteFrequency(pin, freq) analogWriteFrequency(digitalPinToGPIONumber(pin), freq)
27+
#define analogWriteResolution(pin, bits) analogWriteResolution(digitalPinToGPIONumber(pin), bits)
28+
29+
// cores/esp32/esp32-hal-adc.h
30+
#define analogRead(pin) analogRead(digitalPinToGPIONumber(pin))
31+
#define analogReadMilliVolts(pin) analogReadMilliVolts(digitalPinToGPIONumber(pin))
32+
#define analogSetPinAttenuation(pin, attenuation) analogSetPinAttenuation(digitalPinToGPIONumber(pin), attenuation)
33+
34+
// cores/esp32/esp32-hal-dac.h
35+
#define dacDisable(pin) dacDisable(digitalPinToGPIONumber(pin))
36+
#define dacWrite(pin, value) dacWrite(digitalPinToGPIONumber(pin), value)
37+
38+
// cores/esp32/esp32-hal-gpio.h
39+
#define analogChannelToDigitalPin(channel) gpioNumberToDigitalPin(analogChannelToDigitalPin(channel))
40+
#define digitalPinToAnalogChannel(pin) digitalPinToAnalogChannel(digitalPinToGPIONumber(pin))
41+
#define digitalPinToTouchChannel(pin) digitalPinToTouchChannel(digitalPinToGPIONumber(pin))
42+
#define digitalRead(pin) digitalRead(digitalPinToGPIONumber(pin))
43+
#define attachInterruptArg(pin, fcn, arg, mode) attachInterruptArg(digitalPinToGPIONumber(pin), fcn, arg, mode)
44+
#define attachInterrupt(pin, fcn, mode) attachInterrupt(digitalPinToGPIONumber(pin), fcn, mode)
45+
#define detachInterrupt(pin) detachInterrupt(digitalPinToGPIONumber(pin))
46+
#define digitalWrite(pin, val) digitalWrite(digitalPinToGPIONumber(pin), val)
47+
#define pinMode(pin, mode) pinMode(digitalPinToGPIONumber(pin), mode)
48+
49+
// cores/esp32/esp32-hal-i2c.h
50+
#define i2cInit(i2c_num, sda, scl, clk_speed) i2cInit(i2c_num, digitalPinToGPIONumber(sda), digitalPinToGPIONumber(scl), clk_speed)
51+
52+
// cores/esp32/esp32-hal-i2c-slave.h
53+
#define i2cSlaveInit(num, sda, scl, slaveID, frequency, rx_len, tx_len) i2cSlaveInit(num, digitalPinToGPIONumber(sda), digitalPinToGPIONumber(scl), slaveID, frequency, rx_len, tx_len)
54+
55+
// cores/esp32/esp32-hal-ledc.h
56+
#define ledcAttach(pin, freq, resolution) ledcAttach(digitalPinToGPIONumber(pin), freq, resolution)
57+
#define ledcWrite(pin, duty) ledcWrite(digitalPinToGPIONumber(pin), duty)
58+
#define ledcWriteTone(pin, freq) ledcWriteTone(digitalPinToGPIONumber(pin), freq)
59+
#define ledcWriteNote(pin, note, octave) ledcWriteNote(digitalPinToGPIONumber(pin), note, octave)
60+
#define ledcRead(pin) ledcRead(digitalPinToGPIONumber(pin))
61+
#define ledcReadFreq(pin) ledcReadFreq(digitalPinToGPIONumber(pin))
62+
#define ledcDetach(pin) ledcDetach(digitalPinToGPIONumber(pin))
63+
#define ledcChangeFrequency(pin, freq, resolution) ledcChangeFrequency(digitalPinToGPIONumber(pin), freq, resolution)
64+
65+
#define ledcFade(pin, start_duty, target_duty, max_fade_time_ms) ledcFade(digitalPinToGPIONumber(pin), start_duty, target_duty, max_fade_time_ms)
66+
#define ledcFadeWithInterrupt(pin, start_duty, target_duty, max_fade_time_ms, userFunc) ledcFadeWithInterrupt(digitalPinToGPIONumber(pin), start_duty, target_duty, max_fade_time_ms, userFunc)
67+
#define ledcFadeWithInterruptArg(pin, start_duty, target_duty, max_fade_time_ms, userFunc, arg) ledcFadeWithInterruptArg(digitalPinToGPIONumber(pin), start_duty, target_duty, max_fade_time_ms, userFunc, arg)
68+
69+
// cores/esp32/esp32-hal-matrix.h
70+
#define pinMatrixInAttach(pin, signal, inverted) pinMatrixInAttach(digitalPinToGPIONumber(pin), signal, inverted)
71+
#define pinMatrixOutAttach(pin, function, invertOut, invertEnable) pinMatrixOutAttach(digitalPinToGPIONumber(pin), function, invertOut, invertEnable)
72+
#define pinMatrixOutDetach(pin, invertOut, invertEnable) pinMatrixOutDetach(digitalPinToGPIONumber(pin), invertOut, invertEnable)
73+
74+
// cores/esp32/esp32-hal-periman.h
75+
#define perimanSetPinBus(pin, type, bus) perimanSetPinBus(digitalPinToGPIONumber(pin), type, bus)
76+
#define perimanGetPinBus(pin, type) perimanGetPinBus(digitalPinToGPIONumber(pin), type)
77+
#define perimanGetPinBusType(pin) perimanGetPinBusType(digitalPinToGPIONumber(pin))
78+
#define perimanPinIsValid(pin) perimanPinIsValid(digitalPinToGPIONumber(pin))
79+
80+
// cores/esp32/esp32-hal-rgb-led.h
81+
#define neopixelWrite(pin, red_val, green_val, blue_val) neopixelWrite(digitalPinToGPIONumber(pin), red_val, green_val, blue_val)
82+
83+
// cores/esp32/esp32-hal-rmt.h
84+
#define rmtInit(pin, channel_direction, memsize, frequency_Hz) rmtInit(digitalPinToGPIONumber(pin), channel_direction, memsize, frequency_Hz)
85+
#define rmtWrite(pin, data, num_rmt_symbols, timeout_ms) rmtWrite(digitalPinToGPIONumber(pin), data, num_rmt_symbols, timeout_ms)
86+
#define rmtWriteAsync(pin, data, num_rmt_symbols) rmtWriteAsync(digitalPinToGPIONumber(pin), data, num_rmt_symbols)
87+
#define rmtWriteLooping(pin, data, num_rmt_symbols) rmtWriteLooping(digitalPinToGPIONumber(pin), data, num_rmt_symbols)
88+
#define rmtTransmitCompleted(pin) rmtTransmitCompleted(digitalPinToGPIONumber(pin))
89+
#define rmtRead(pin, data, num_rmt_symbols, timeout_ms) rmtRead(digitalPinToGPIONumber(pin), data, num_rmt_symbols, timeout_ms)
90+
#define rmtReadAsync(pin, data, num_rmt_symbols) rmtReadAsync(digitalPinToGPIONumber(pin), data, num_rmt_symbols)
91+
#define rmtReceiveCompleted(pin) rmtReceiveCompleted(digitalPinToGPIONumber(pin))
92+
#define rmtSetRxMaxThreshold(pin, idle_thres_ticks) rmtSetRxMaxThreshold(digitalPinToGPIONumber(pin), idle_thres_ticks)
93+
#define rmtSetCarrier(pin, carrier_en, carrier_level, frequency_Hz, duty_percent) rmtSetCarrier(digitalPinToGPIONumber(pin), carrier_en, carrier_level, frequency_Hz, duty_percent)
94+
#define rmtSetRxMinThreshold(pin, filter_pulse_ticks) rmtSetRxMinThreshold(digitalPinToGPIONumber(pin), filter_pulse_ticks)
95+
#define rmtDeinit(pin) rmtDeinit(digitalPinToGPIONumber(pin))
96+
97+
// cores/esp32/esp32-hal-sigmadelta.h
98+
#define sigmaDeltaAttach(pin, freq) sigmaDeltaAttach(digitalPinToGPIONumber(pin), freq)
99+
#define sigmaDeltaWrite(pin, duty) sigmaDeltaWrite(digitalPinToGPIONumber(pin), duty)
100+
#define sigmaDeltaDetach(pin) sigmaDeltaDetach(digitalPinToGPIONumber(pin))
101+
102+
// cores/esp32/esp32-hal-spi.h
103+
#define spiAttachSCK(spi, sck) spiAttachSCK(spi, digitalPinToGPIONumber(sck))
104+
#define spiAttachMISO(spi, miso) spiAttachMISO(spi, digitalPinToGPIONumber(miso))
105+
#define spiAttachMOSI(spi, mosi) spiAttachMOSI(spi, digitalPinToGPIONumber(mosi))
106+
#define spiDetachSCK(spi, sck) spiDetachSCK(spi, digitalPinToGPIONumber(sck))
107+
#define spiDetachMISO(spi, miso) spiDetachMISO(spi, digitalPinToGPIONumber(miso))
108+
#define spiDetachMOSI(spi, mosi) spiDetachMOSI(spi, digitalPinToGPIONumber(mosi))
109+
#define spiAttachSS(spi, cs_num, ss) spiAttachSS(spi, cs_num, digitalPinToGPIONumber(ss))
110+
#define spiDetachSS(spi, ss) spiDetachSS(spi, digitalPinToGPIONumber(ss))
111+
112+
// cores/esp32/esp32-hal-touch.h
113+
#define touchInterruptGetLastStatus(pin) touchInterruptGetLastStatus(digitalPinToGPIONumber(pin))
114+
#define touchRead(pin) touchRead(digitalPinToGPIONumber(pin))
115+
#define touchAttachInterruptArg(pin, userFunc, arg, threshold) touchAttachInterruptArg(digitalPinToGPIONumber(pin), userFunc, arg, threshold)
116+
#define touchAttachInterrupt(pin, userFunc, threshold) touchAttachInterrupt(digitalPinToGPIONumber(pin), userFunc, threshold)
117+
#define touchDetachInterrupt(pin) touchDetachInterrupt(digitalPinToGPIONumber(pin))
118+
#define touchSleepWakeUpEnable(pin, threshold) touchSleepWakeUpEnable(digitalPinToGPIONumber(pin), threshold)
119+
120+
// cores/esp32/esp32-hal-uart.h
121+
#define uartBegin(uart_nr, baudrate, config, rxPin, txPin, rx_buffer_size, tx_buffer_size, inverted, rxfifo_full_thrhd) \
122+
uartBegin(uart_nr, baudrate, config, digitalPinToGPIONumber(rxPin), digitalPinToGPIONumber(txPin), rx_buffer_size, tx_buffer_size, inverted, rxfifo_full_thrhd)
123+
#define uartSetPins(uart, rxPin, txPin, ctsPin, rtsPin) \
124+
uartSetPins(uart, digitalPinToGPIONumber(rxPin), digitalPinToGPIONumber(txPin), digitalPinToGPIONumber(ctsPin), digitalPinToGPIONumber(rtsPin))
125+
#define uartDetachPins(uart, rxPin, txPin, ctsPin, rtsPin) \
126+
uartDetachPins(uart, digitalPinToGPIONumber(rxPin), digitalPinToGPIONumber(txPin), digitalPinToGPIONumber(ctsPin), digitalPinToGPIONumber(rtsPin))
127+
128+
#endif // ARDUINO_CORE_BUILD
129+
130+
#else
131+
132+
// pin remapping disabled: use stubs
133+
#define digitalPinToGPIONumber(digitalPin) (digitalPin)
134+
#define gpioNumberToDigitalPin(gpioNumber) (gpioNumber)
135+
136+
#endif
137+
138+
#endif /* __GPIO_PIN_REMAP_H__ */

cores/esp32/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ __attribute__((weak)) bool shouldPrintChipDebugReport(void) {
4646
void loopTask(void *pvParameters)
4747
{
4848
// sets UART0 (default console) RX/TX pins as already configured in boot or as defined in variants/pins_arduino.h
49-
Serial0.setPins(SOC_RX0, SOC_TX0);
49+
Serial0.setPins(gpioNumberToDigitalPin(SOC_RX0), gpioNumberToDigitalPin(SOC_TX0));
5050
#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_DEBUG
5151
printBeforeSetupInfo();
5252
#else

libraries/ESP_I2S/src/ESP_I2S.cpp

+13-13
Original file line numberDiff line numberDiff line change
@@ -230,11 +230,11 @@ bool I2SClass::i2sDetachBus(void * bus_pointer){
230230

231231
// Set pins for STD and TDM mode
232232
void I2SClass::setPins(int8_t bclk, int8_t ws, int8_t dout, int8_t din, int8_t mclk){
233-
_mclk = mclk;
234-
_bclk = bclk;
235-
_ws = ws;
236-
_dout = dout;
237-
_din = din;
233+
_mclk = digitalPinToGPIONumber(mclk);
234+
_bclk = digitalPinToGPIONumber(bclk);
235+
_ws = digitalPinToGPIONumber(ws);
236+
_dout = digitalPinToGPIONumber(dout);
237+
_din = digitalPinToGPIONumber(din);
238238
}
239239

240240
void I2SClass::setInverted(bool bclk, bool ws, bool mclk){
@@ -246,23 +246,23 @@ void I2SClass::setInverted(bool bclk, bool ws, bool mclk){
246246
// Set pins for PDM TX mode
247247
#if SOC_I2S_SUPPORTS_PDM_TX
248248
void I2SClass::setPinsPdmTx(int8_t clk, int8_t dout0, int8_t dout1){
249-
_tx_clk = clk;
250-
_tx_dout0 = dout0;
249+
_tx_clk = digitalPinToGPIONumber(clk);
250+
_tx_dout0 = digitalPinToGPIONumber(dout0);
251251
#if (SOC_I2S_PDM_MAX_TX_LINES > 1)
252-
_tx_dout1 = dout1;
252+
_tx_dout1 = digitalPinToGPIONumber(dout1);
253253
#endif
254254
}
255255
#endif
256256

257257
// Set pins for PDM RX mode
258258
#if SOC_I2S_SUPPORTS_PDM_RX
259259
void I2SClass::setPinsPdmRx(int8_t clk, int8_t din0, int8_t din1, int8_t din2, int8_t din3){
260-
_rx_clk = clk;
261-
_rx_din0 = din0;
260+
_rx_clk = digitalPinToGPIONumber(clk);
261+
_rx_din0 = digitalPinToGPIONumber(din0);
262262
#if (SOC_I2S_PDM_MAX_RX_LINES > 1)
263-
_rx_din1 = din1;
264-
_rx_din2 = din2;
265-
_rx_din3 = din3;
263+
_rx_din1 = digitalPinToGPIONumber(din1);
264+
_rx_din2 = digitalPinToGPIONumber(din2);
265+
_rx_din3 = digitalPinToGPIONumber(din3);
266266
#endif
267267
}
268268
#endif

libraries/SD_MMC/src/SD_MMC.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// limitations under the License.
1414

1515
#include "pins_arduino.h"
16+
#include "io_pin_remap.h"
1617
#include "SD_MMC.h"
1718
#ifdef SOC_SDMMC_HOST_SUPPORTED
1819
#include "vfs_api.h"
@@ -72,6 +73,15 @@ bool SDMMCFS::setPins(int clk, int cmd, int d0, int d1, int d2, int d3)
7273
log_e("SD_MMC.setPins must be called before SD_MMC.begin");
7374
return false;
7475
}
76+
77+
// map logical pins to GPIO numbers
78+
clk = digitalPinToGPIONumber(clk);
79+
cmd = digitalPinToGPIONumber(cmd);
80+
d0 = digitalPinToGPIONumber(d0);
81+
d1 = digitalPinToGPIONumber(d1);
82+
d2 = digitalPinToGPIONumber(d2);
83+
d3 = digitalPinToGPIONumber(d3);
84+
7585
#ifdef SOC_SDMMC_USE_GPIO_MATRIX
7686
// SoC supports SDMMC pin configuration via GPIO matrix. Save the pins for later use in SDMMCFS::begin.
7787
_pin_clk = (int8_t) clk;

libraries/SPI/src/SPI.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "SPI.h"
2323
#if SOC_GPSPI_SUPPORTED
2424

25+
#include "io_pin_remap.h"
2526
#include "esp32-hal-log.h"
2627

2728
#if !CONFIG_DISABLE_HAL_LOCKS

0 commit comments

Comments
 (0)