Skip to content

Commit 9df7b37

Browse files
pillo79facchinm
authored andcommitted
[pin_remap 2/3] core,libs: add pin remap hooks
1 parent 4e485f1 commit 9df7b37

File tree

7 files changed

+144
-11
lines changed

7 files changed

+144
-11
lines changed

cores/esp32/Arduino.h

Lines changed: 4 additions & 3 deletions
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))
@@ -220,5 +220,6 @@ void noTone(uint8_t _pin);
220220
#endif /* __cplusplus */
221221

222222
#include "pins_arduino.h"
223+
#include "io_pin_remap.h"
223224

224225
#endif /* _ESP32_CORE_ARDUINO_H_ */

cores/esp32/FunctionalInterrupt.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ void ARDUINO_ISR_ATTR interruptFunctional(void* arg)
2828
void attachInterrupt(uint8_t pin, std::function<void(void)> intRoutine, int mode)
2929
{
3030
// use the local interrupt routine which takes the ArgStructure as argument
31-
__attachInterruptFunctionalArg (pin, (voidFuncPtrArg)interruptFunctional, new InterruptArgStructure{intRoutine}, mode, true);
31+
__attachInterruptFunctionalArg (digitalPinToGPIONumber(pin), (voidFuncPtrArg)interruptFunctional, new InterruptArgStructure{intRoutine}, mode, true);
3232
}
3333

3434
extern "C"

cores/esp32/HardwareSerial.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <inttypes.h>
55

66
#include "pins_arduino.h"
7+
#include "io_pin_remap.h"
78
#include "HardwareSerial.h"
89
#include "soc/soc_caps.h"
910
#include "driver/uart.h"
@@ -370,6 +371,10 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
370371
}
371372
}
372373

374+
// map logical pins to GPIO numbers
375+
rxPin = digitalPinToGPIONumber(rxPin);
376+
txPin = digitalPinToGPIONumber(txPin);
377+
373378
if(_uart) {
374379
// in this case it is a begin() over a previous begin() - maybe to change baud rate
375380
// thus do not disable debug output
@@ -554,6 +559,12 @@ bool HardwareSerial::setPins(int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t r
554559
return false;
555560
}
556561

562+
// map logical pins to GPIO numbers
563+
rxPin = digitalPinToGPIONumber(rxPin);
564+
txPin = digitalPinToGPIONumber(txPin);
565+
ctsPin = digitalPinToGPIONumber(ctsPin);
566+
rtsPin = digitalPinToGPIONumber(rtsPin);
567+
557568
// uartSetPins() checks if pins are valid for each function and for the SoC
558569
bool retCode = uartSetPins(_uart, rxPin, txPin, ctsPin, rtsPin);
559570
if (retCode) {

cores/esp32/io_pin_remap.h

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
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 digitalPinFromGPIONumber(int8_t gpioPin);
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, state, timeout) pulseInLong(digitalPinToGPIONumber(pin), state, timeout)
19+
#define pulseIn(pin, state, timeout) pulseIn(digitalPinToGPIONumber(pin), state, timeout)
20+
#define noTone(_pin) noTone(digitalPinToGPIONumber(_pin))
21+
#define tone(_pin, frequency, duration) tone(digitalPinToGPIONumber(_pin), frequency, duration)
22+
23+
// cores/esp32/esp32-hal.h
24+
#define analogGetChannel(pin) analogGetChannel(digitalPinToGPIONumber(pin))
25+
#define analogWrite(pin, value) analogWrite(digitalPinToGPIONumber(pin), value)
26+
27+
// cores/esp32/esp32-hal-adc.h
28+
#define adcAttachPin(pin) adcAttachPin(digitalPinToGPIONumber(pin))
29+
#define analogRead(pin) analogRead(digitalPinToGPIONumber(pin))
30+
#define analogReadMilliVolts(pin) analogReadMilliVolts(digitalPinToGPIONumber(pin))
31+
#define analogSetPinAttenuation(pin, attenuation) analogSetPinAttenuation(digitalPinToGPIONumber(pin), attenuation)
32+
#define analogSetVRefPin(pin) analogSetVRefPin(digitalPinToGPIONumber(pin))
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 ledcAttachPin(pin, channel) ledcAttachPin(digitalPinToGPIONumber(pin), channel)
57+
#define ledcDetachPin(pin) ledcDetachPin(digitalPinToGPIONumber(pin))
58+
59+
// cores/esp32/esp32-hal-matrix.h
60+
#define pinMatrixInAttach(pin, signal, inverted) pinMatrixInAttach(digitalPinToGPIONumber(pin), signal, inverted)
61+
#define pinMatrixOutAttach(pin, function, invertOut, invertEnable) pinMatrixOutAttach(digitalPinToGPIONumber(pin), function, invertOut, invertEnable)
62+
#define pinMatrixOutDetach(pin, invertOut, invertEnable) pinMatrixOutDetach(digitalPinToGPIONumber(pin), invertOut, invertEnable)
63+
64+
// cores/esp32/esp32-hal-rgb-led.h
65+
#define neopixelWrite(pin, red_val, green_val, blue_val) neopixelWrite(digitalPinToGPIONumber(pin), red_val, green_val, blue_val)
66+
67+
// cores/esp32/esp32-hal-rmt.h
68+
#define rmtInit(pin, tx_not_rx, memsize) rmtInit(digitalPinToGPIONumber(pin), tx_not_rx, memsize)
69+
70+
// cores/esp32/esp32-hal-sigmadelta.h
71+
#define sigmaDeltaSetup(pin, channel, freq) sigmaDeltaSetup(digitalPinToGPIONumber(pin), channel, freq)
72+
#define sigmaDeltaDetachPin(pin) sigmaDeltaDetachPin(digitalPinToGPIONumber(pin))
73+
74+
// cores/esp32/esp32-hal-spi.h
75+
#define spiAttachSCK(spi, sck) spiAttachSCK(spi, digitalPinToGPIONumber(sck))
76+
#define spiAttachMISO(spi, miso) spiAttachMISO(spi, digitalPinToGPIONumber(miso))
77+
#define spiAttachMOSI(spi, mosi) spiAttachMOSI(spi, digitalPinToGPIONumber(mosi))
78+
#define spiDetachSCK(spi, sck) spiDetachSCK(spi, digitalPinToGPIONumber(sck))
79+
#define spiDetachMISO(spi, miso) spiDetachMISO(spi, digitalPinToGPIONumber(miso))
80+
#define spiDetachMOSI(spi, mosi) spiDetachMOSI(spi, digitalPinToGPIONumber(mosi))
81+
#define spiAttachSS(spi, cs_num, ss) spiAttachSS(spi, cs_num, digitalPinToGPIONumber(ss))
82+
#define spiDetachSS(spi, ss) spiDetachSS(spi, digitalPinToGPIONumber(ss))
83+
84+
// cores/esp32/esp32-hal-touch.h
85+
#define touchInterruptGetLastStatus(pin) touchInterruptGetLastStatus(digitalPinToGPIONumber(pin))
86+
#define touchRead(pin) touchRead(digitalPinToGPIONumber(pin))
87+
#define touchAttachInterruptArg(pin, userFunc, arg, threshold) touchAttachInterruptArg(digitalPinToGPIONumber(pin), userFunc, arg, threshold)
88+
#define touchAttachInterrupt(pin, userFunc, threshold) touchAttachInterrupt(digitalPinToGPIONumber(pin), userFunc, threshold)
89+
#define touchDetachInterrupt(pin) touchDetachInterrupt(digitalPinToGPIONumber(pin))
90+
#define touchSleepWakeUpEnable(pin, threshold) touchSleepWakeUpEnable(digitalPinToGPIONumber(pin), threshold)
91+
92+
// cores/esp32/esp32-hal-uart.h
93+
#define uartBegin(uart_nr, baudrate, config, rxPin, txPin, rx_buffer_size, tx_buffer_size, inverted, rxfifo_full_thrhd) \
94+
uartBegin(uart_nr, baudrate, config, digitalPinToGPIONumber(rxPin), digitalPinToGPIONumber(txPin), rx_buffer_size, tx_buffer_size, inverted, rxfifo_full_thrhd)
95+
#define uartSetPins(uart, rxPin, txPin, ctsPin, rtsPin) \
96+
uartSetPins(uart, digitalPinToGPIONumber(rxPin), digitalPinToGPIONumber(txPin), digitalPinToGPIONumber(ctsPin), digitalPinToGPIONumber(rtsPin))
97+
#define uartDetachPins(uart, rxPin, txPin, ctsPin, rtsPin) \
98+
uartDetachPins(uart, digitalPinToGPIONumber(rxPin), digitalPinToGPIONumber(txPin), digitalPinToGPIONumber(ctsPin), digitalPinToGPIONumber(rtsPin))
99+
100+
#endif // ARDUINO_CORE_BUILD
101+
102+
#else
103+
104+
// pin remapping disabled: use stubs
105+
#define digitalPinToGPIONumber(digitalPin) (digitalPin)
106+
#define gpioNumberToDigitalPin(gpioNumber) (gpioNumber)
107+
108+
#endif
109+
110+
#endif /* __GPIO_PIN_REMAP_H__ */

libraries/I2S/src/I2S.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -317,24 +317,24 @@ int I2SClass::begin(int mode, int sampleRate, int bitsPerSample, bool driveClock
317317
int I2SClass::_applyPinSetting(){
318318
if(_driverInstalled){
319319
esp_i2s::i2s_pin_config_t pin_config = {
320-
.bck_io_num = _sckPin,
321-
.ws_io_num = _fsPin,
320+
.bck_io_num = digitalPinToGPIONumber(_sckPin),
321+
.ws_io_num = digitalPinToGPIONumber(_fsPin),
322322
.data_out_num = I2S_PIN_NO_CHANGE,
323323
.data_in_num = I2S_PIN_NO_CHANGE
324324
};
325325
if (_state == I2S_STATE_DUPLEX){ // duplex
326-
pin_config.data_out_num = _outSdPin;
327-
pin_config.data_in_num = _inSdPin;
326+
pin_config.data_out_num = digitalPinToGPIONumber(_outSdPin);
327+
pin_config.data_in_num = digitalPinToGPIONumber(_inSdPin);
328328
}else{ // simplex
329329
if(_state == I2S_STATE_RECEIVER){
330330
pin_config.data_out_num = I2S_PIN_NO_CHANGE;
331-
pin_config.data_in_num = _sdPin;
331+
pin_config.data_in_num = digitalPinToGPIONumber(_sdPin);
332332
}else if(_state == I2S_STATE_TRANSMITTER){
333-
pin_config.data_out_num = _sdPin;
333+
pin_config.data_out_num = digitalPinToGPIONumber(_sdPin);
334334
pin_config.data_in_num = I2S_PIN_NO_CHANGE;
335335
}else{
336336
pin_config.data_out_num = I2S_PIN_NO_CHANGE;
337-
pin_config.data_in_num = _sdPin;
337+
pin_config.data_in_num = digitalPinToGPIONumber(_sdPin);
338338
}
339339
}
340340
if(ESP_OK != esp_i2s::i2s_set_pin((esp_i2s::i2s_port_t) _deviceIndex, &pin_config)){

libraries/SD_MMC/src/SD_MMC.cpp

Lines changed: 10 additions & 0 deletions
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"
@@ -54,6 +55,15 @@ bool SDMMCFS::setPins(int clk, int cmd, int d0, int d1, int d2, int d3)
5455
log_e("SD_MMC.setPins must be called before SD_MMC.begin");
5556
return false;
5657
}
58+
59+
// map logical pins to GPIO numbers
60+
clk = digitalPinToGPIONumber(clk);
61+
cmd = digitalPinToGPIONumber(cmd);
62+
d0 = digitalPinToGPIONumber(d0);
63+
d1 = digitalPinToGPIONumber(d1);
64+
d2 = digitalPinToGPIONumber(d2);
65+
d3 = digitalPinToGPIONumber(d3);
66+
5767
#ifdef SOC_SDMMC_USE_GPIO_MATRIX
5868
// SoC supports SDMMC pin configuration via GPIO matrix. Save the pins for later use in SDMMCFS::begin.
5969
_pin_clk = (int8_t) clk;

libraries/SPI/src/SPI.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
*/
2121

2222
#include "SPI.h"
23+
#include "io_pin_remap.h"
2324
#include "esp32-hal-log.h"
2425

2526
#if !CONFIG_DISABLE_HAL_LOCKS

0 commit comments

Comments
 (0)