Skip to content

Commit f41795c

Browse files
committed
fix(uart): fixes setPins to keep driver working
1 parent 85d92e9 commit f41795c

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

cores/esp32/esp32-hal-uart.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,16 @@ bool uartSetPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t ctsPin, in
667667
//log_v("setting UART%d pins: prev->new RX(%d->%d) TX(%d->%d) CTS(%d->%d) RTS(%d->%d)", uart_num,
668668
// uart->_rxPin, rxPin, uart->_txPin, txPin, uart->_ctsPin, ctsPin, uart->_rtsPin, rtsPin); vTaskDelay(10);
669669

670+
// mute bus detaching callbacks to avoid terminating the UART driver when both RX and TX pins are detached
671+
peripheral_bus_deinit_cb_t rxDeinit = perimanGetBusDeinit(ESP32_BUS_TYPE_UART_RX);
672+
peripheral_bus_deinit_cb_t txDeinit = perimanGetBusDeinit(ESP32_BUS_TYPE_UART_TX);
673+
peripheral_bus_deinit_cb_t ctsDeinit = perimanGetBusDeinit(ESP32_BUS_TYPE_UART_CTS);
674+
peripheral_bus_deinit_cb_t rtsDeinit = perimanGetBusDeinit(ESP32_BUS_TYPE_UART_RTS);
675+
perimanClearBusDeinit(ESP32_BUS_TYPE_UART_RX);
676+
perimanClearBusDeinit(ESP32_BUS_TYPE_UART_TX);
677+
perimanClearBusDeinit(ESP32_BUS_TYPE_UART_CTS);
678+
perimanClearBusDeinit(ESP32_BUS_TYPE_UART_RTS);
679+
670680
// First step: detaches all previous UART pins
671681
bool rxPinChanged = rxPin >= 0 && rxPin != uart->_rxPin;
672682
if (rxPinChanged) {
@@ -698,6 +708,21 @@ bool uartSetPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t ctsPin, in
698708
if (rtsPinChanged) {
699709
retCode &= _uartAttachPins(uart->num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, rtsPin);
700710
}
711+
712+
// restore bus detaching callbacks
713+
if (rxDeinit != NULL) {
714+
perimanSetBusDeinit(ESP32_BUS_TYPE_UART_RX, rxDeinit);
715+
}
716+
if (txDeinit != NULL) {
717+
perimanSetBusDeinit(ESP32_BUS_TYPE_UART_TX, txDeinit);
718+
}
719+
if (ctsDeinit != NULL) {
720+
perimanSetBusDeinit(ESP32_BUS_TYPE_UART_CTS, ctsDeinit);
721+
}
722+
if (rtsDeinit != NULL) {
723+
perimanSetBusDeinit(ESP32_BUS_TYPE_UART_RTS, rtsDeinit);
724+
}
725+
701726
UART_MUTEX_UNLOCK();
702727

703728
if (!retCode) {

0 commit comments

Comments
 (0)