Skip to content

Commit dc527fb

Browse files
committed
Merge branch 'bugfix/uart_release_pin' into 'master'
fix(uart): fix release pin logic if switching only specific pins See merge request espressif/esp-idf!40199
2 parents e5d11d1 + ec358cf commit dc527fb

File tree

2 files changed

+32
-17
lines changed

2 files changed

+32
-17
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) {

examples/system/light_sleep/main/uart_wakeup.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,18 @@
1414
#include "driver/uart_wakeup.h"
1515
#include "sdkconfig.h"
1616

17-
#define EXAMPLE_UART_NUM 0
17+
#define EXAMPLE_UART_NUM CONFIG_ESP_CONSOLE_UART_NUM
1818
/* Notice that ESP32 has to use the iomux input to configure uart as wakeup source
1919
* Please use 'UxRXD_GPIO_NUM' as uart rx pin. No limitation to the other target */
2020
#define EXAMPLE_UART_TX_IO_NUM U0TXD_GPIO_NUM
2121
#define EXAMPLE_UART_RX_IO_NUM U0RXD_GPIO_NUM
2222

23+
#if CONFIG_ESP_CONSOLE_UART
24+
#define EXAMPLE_UART_BAUDRATE CONFIG_ESP_CONSOLE_UART_BAUDRATE
25+
#else
26+
#define EXAMPLE_UART_BAUDRATE 115200
27+
#endif
28+
2329
#define EXAMPLE_UART_WAKEUP_EDGE_THRESHOLD 3
2430
#define EXAMPLE_UART_WAKEUP_FIFO_THRESHOLD 8
2531
#define EXAMPLE_UART_WAKEUP_CHARS_SEQ "ok"
@@ -103,7 +109,7 @@ static void uart_wakeup_task(void *arg)
103109
static void uart_initialization(void)
104110
{
105111
uart_config_t uart_cfg = {
106-
.baud_rate = CONFIG_ESP_CONSOLE_UART_BAUDRATE,
112+
.baud_rate = EXAMPLE_UART_BAUDRATE,
107113
.data_bits = UART_DATA_8_BITS,
108114
.parity = UART_PARITY_DISABLE,
109115
.stop_bits = UART_STOP_BITS_1,

0 commit comments

Comments
 (0)