@@ -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
791800esp_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