Skip to content

Commit 5124dca

Browse files
authored
ESP32 has GPIOs 34-39 that are input only, without internal pull-up. Make them available. (plerup#192)
1 parent 7389070 commit 5124dca

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

src/SoftwareSerial.cpp

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ bool SoftwareSerial::isValidGPIOpin(int8_t pin) {
5151
return (pin >= 0 && pin <= 16) && !isFlashInterfacePin(pin);
5252
#elif defined(ESP32)
5353
return (pin >= 0 && pin <= 5) || (pin >= 12 && pin <= 19) ||
54-
(pin >= 21 && pin <= 23) || (pin >= 25 && pin <= 27) || (pin >= 32 && pin < 39);
54+
(pin >= 21 && pin <= 23) || (pin >= 25 && pin <= 27) || (pin >= 32 && pin <= 39);
5555
#else
5656
return true;
5757
#endif
@@ -61,12 +61,26 @@ bool SoftwareSerial::isValidRxGPIOpin(int8_t pin) {
6161
return isValidGPIOpin(pin)
6262
#if defined(ESP8266)
6363
&& (pin != 16)
64-
#elif defined(ESP32)
64+
#endif
65+
;
66+
}
67+
68+
bool SoftwareSerial::isValidTxGPIOpin(int8_t pin) {
69+
return isValidGPIOpin(pin)
70+
#if defined(ESP32)
6571
&& (pin < 34)
6672
#endif
6773
;
6874
}
6975

76+
bool SoftwareSerial::hasRxGPIOPullUp(int8_t pin) {
77+
#if defined(ESP32)
78+
return !(pin >= 34 && pin <= 39);
79+
#else
80+
return true;
81+
#endif
82+
}
83+
7084
void SoftwareSerial::begin(uint32_t baud, SoftwareSerialConfig config,
7185
int8_t rxPin, int8_t txPin,
7286
bool invert, int bufCapacity, int isrBufCapacity) {
@@ -91,10 +105,10 @@ void SoftwareSerial::begin(uint32_t baud, SoftwareSerialConfig config,
91105
isrBufCapacity : m_buffer->capacity() * (2 + m_dataBits + static_cast<bool>(m_parityMode))));
92106
if (m_buffer && (!m_parityMode || m_parityBuffer) && m_isrBuffer) {
93107
m_rxValid = true;
94-
pinMode(m_rxPin, INPUT_PULLUP);
108+
pinMode(m_rxPin, hasRxGPIOPullUp(m_rxPin) ? INPUT_PULLUP : INPUT);
95109
}
96110
}
97-
if (isValidGPIOpin(m_txPin)) {
111+
if (isValidTxGPIOpin(m_txPin)) {
98112
m_txValid = true;
99113
if (!m_oneWire) {
100114
pinMode(m_txPin, OUTPUT);
@@ -122,7 +136,7 @@ uint32_t SoftwareSerial::baudRate() {
122136
}
123137

124138
void SoftwareSerial::setTransmitEnablePin(int8_t txEnablePin) {
125-
if (isValidGPIOpin(txEnablePin)) {
139+
if (isValidTxGPIOpin(txEnablePin)) {
126140
m_txEnableValid = true;
127141
m_txEnablePin = txEnablePin;
128142
pinMode(m_txEnablePin, OUTPUT);
@@ -145,7 +159,7 @@ void SoftwareSerial::enableTx(bool on) {
145159
digitalWrite(m_txPin, !m_invert);
146160
}
147161
else {
148-
pinMode(m_rxPin, INPUT_PULLUP);
162+
pinMode(m_rxPin, hasRxGPIOPullUp(m_rxPin) ? INPUT_PULLUP : INPUT);
149163
enableRx(true);
150164
}
151165
}

src/SoftwareSerial.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,9 @@ class SoftwareSerial : public Stream {
215215
uint32_t dutyCycle, uint32_t offCycle, bool withStopBit);
216216
bool isValidGPIOpin(int8_t pin);
217217
bool isValidRxGPIOpin(int8_t pin);
218+
bool isValidTxGPIOpin(int8_t pin);
219+
// result is only defined for a valid Rx GPIO pin
220+
bool hasRxGPIOPullUp(int8_t pin);
218221
/* check m_rxValid that calling is safe */
219222
void rxBits();
220223
void rxBits(const uint32_t& isrCycle);

0 commit comments

Comments
 (0)