Skip to content

Commit 85f0da6

Browse files
committed
fix(uart): fix release pin logic if switching only one pin
1 parent 7e570d2 commit 85f0da6

File tree

1 file changed

+24
-15
lines changed
  • components/esp_driver_uart/src

1 file changed

+24
-15
lines changed

components/esp_driver_uart/src/uart.c

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -722,12 +722,14 @@ static bool uart_try_set_iomux_pin(uart_port_t uart_num, int io_num, uint32_t id
722722
return true;
723723
}
724724

725-
static void uart_release_pin(uart_port_t uart_num)
725+
static void uart_release_pin(uart_port_t uart_num, bool release_tx, bool release_rx, bool release_rts, bool release_cts)
726726
{
727727
if (uart_num >= UART_NUM_MAX) {
728728
return;
729729
}
730-
if (uart_context[uart_num].tx_io_num >= 0) {
730+
731+
uint32_t released_io_mask = 0;
732+
if (release_tx && uart_context[uart_num].tx_io_num >= 0) {
731733
gpio_output_disable(uart_context[uart_num].tx_io_num);
732734
#if (SOC_UART_LP_NUM >= 1)
733735
if (!(uart_num < SOC_UART_HP_NUM)) {
@@ -737,9 +739,12 @@ static void uart_release_pin(uart_port_t uart_num)
737739
#if CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND || CONFIG_PM_SLP_DISABLE_GPIO
738740
gpio_sleep_sel_en(uart_context[uart_num].tx_io_num); // re-enable the switch to the sleep configuration to save power consumption
739741
#endif
742+
743+
released_io_mask |= BIT64(uart_context[uart_num].tx_io_num);
744+
uart_context[uart_num].tx_io_num = -1;
740745
}
741746

742-
if (uart_context[uart_num].rx_io_num >= 0) {
747+
if (release_rx && uart_context[uart_num].rx_io_num >= 0) {
743748
if (uart_num < SOC_UART_HP_NUM) {
744749
esp_rom_gpio_connect_in_signal(GPIO_MATRIX_CONST_ONE_INPUT, UART_PERIPH_SIGNAL(uart_num, SOC_UART_RX_PIN_IDX), false);
745750
}
@@ -754,18 +759,24 @@ static void uart_release_pin(uart_port_t uart_num)
754759
#if CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND || CONFIG_PM_SLP_DISABLE_GPIO
755760
gpio_sleep_sel_en(uart_context[uart_num].rx_io_num); // re-enable the switch to the sleep configuration to save power consumption
756761
#endif
762+
763+
released_io_mask |= BIT64(uart_context[uart_num].rx_io_num);
764+
uart_context[uart_num].rx_io_num = -1;
757765
}
758766

759-
if (uart_context[uart_num].rts_io_num >= 0) {
767+
if (release_rts && uart_context[uart_num].rts_io_num >= 0) {
760768
gpio_output_disable(uart_context[uart_num].rts_io_num);
761769
#if (SOC_UART_LP_NUM >= 1)
762770
if (!(uart_num < SOC_UART_HP_NUM)) {
763771
rtc_gpio_deinit(uart_context[uart_num].rts_io_num);
764772
}
765773
#endif
774+
775+
released_io_mask |= BIT64(uart_context[uart_num].rts_io_num);
776+
uart_context[uart_num].rts_io_num = -1;
766777
}
767778

768-
if (uart_context[uart_num].cts_io_num >= 0) {
779+
if (release_cts && uart_context[uart_num].cts_io_num >= 0) {
769780
if (uart_num < SOC_UART_HP_NUM) {
770781
esp_rom_gpio_connect_in_signal(GPIO_MATRIX_CONST_ZERO_INPUT, UART_PERIPH_SIGNAL(uart_num, SOC_UART_CTS_PIN_IDX), false);
771782
}
@@ -777,15 +788,13 @@ static void uart_release_pin(uart_port_t uart_num)
777788
rtc_gpio_deinit(uart_context[uart_num].cts_io_num);
778789
}
779790
#endif
780-
}
781791

782-
esp_gpio_revoke(uart_context[uart_num].io_reserved_mask);
792+
released_io_mask |= BIT64(uart_context[uart_num].cts_io_num);
793+
uart_context[uart_num].cts_io_num = -1;
794+
}
783795

784-
uart_context[uart_num].tx_io_num = -1;
785-
uart_context[uart_num].rx_io_num = -1;
786-
uart_context[uart_num].rts_io_num = -1;
787-
uart_context[uart_num].cts_io_num = -1;
788-
uart_context[uart_num].io_reserved_mask = 0;
796+
esp_gpio_revoke(uart_context[uart_num].io_reserved_mask & released_io_mask);
797+
uart_context[uart_num].io_reserved_mask &= ~released_io_mask;
789798
}
790799

791800
esp_err_t uart_set_pin(uart_port_t uart_num, int tx_io_num, int rx_io_num, int rts_io_num, int cts_io_num)
@@ -820,7 +829,7 @@ esp_err_t uart_set_pin(uart_port_t uart_num, int tx_io_num, int rx_io_num, int r
820829
#endif
821830

822831
// First, release previously configured IOs if there is
823-
uart_release_pin(uart_num);
832+
uart_release_pin(uart_num, (tx_io_num >= 0), (rx_io_num >= 0), (rts_io_num >= 0), (cts_io_num >= 0));
824833

825834
// Potential IO reserved mask
826835
uint64_t io_reserve_mask = 0;
@@ -1899,7 +1908,7 @@ esp_err_t uart_driver_delete(uart_port_t uart_num)
18991908
return ESP_OK;
19001909
}
19011910

1902-
uart_release_pin(uart_num);
1911+
uart_release_pin(uart_num, true, true, true, true);
19031912

19041913
esp_intr_free(p_uart_obj[uart_num]->intr_handle);
19051914
uart_disable_rx_intr(uart_num);
@@ -2178,7 +2187,7 @@ esp_err_t uart_detect_bitrate_stop(uart_port_t uart_num, bool deinit, uart_bitra
21782187
}
21792188

21802189
if (deinit) { // release the port
2181-
uart_release_pin(uart_num);
2190+
uart_release_pin(uart_num, true, true, true, true);
21822191
ESP_RETURN_ON_ERROR(esp_clk_tree_enable_src(uart_context[uart_num].sclk_sel, false), UART_TAG, "clock source disable failed");
21832192
#if SOC_UART_SUPPORT_RTC_CLK
21842193
if (src_clk == (soc_module_clk_t)UART_SCLK_RTC) {

0 commit comments

Comments
 (0)