From b1bb83df2b1503507ec61a51b15cbabde3bb52f1 Mon Sep 17 00:00:00 2001 From: Song Ruo Jing Date: Wed, 11 Feb 2026 21:07:16 +0800 Subject: [PATCH 1/2] fix(uart): tx write bytes fails to use non-default tx fifo empty threshold Users may see tx write bytes fails to feed data into tx fifo in time even if the tx fifo empty threshold has been set to a large value. --- components/esp_driver_uart/include/driver/uart.h | 10 +++++----- components/esp_driver_uart/src/uart.c | 9 ++++++--- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/components/esp_driver_uart/include/driver/uart.h b/components/esp_driver_uart/include/driver/uart.h index ceb48cdf411..5d467f4a21d 100644 --- a/components/esp_driver_uart/include/driver/uart.h +++ b/components/esp_driver_uart/include/driver/uart.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -365,7 +365,7 @@ esp_err_t uart_enable_rx_intr(uart_port_t uart_num); esp_err_t uart_disable_rx_intr(uart_port_t uart_num); /** - * @brief Disable UART TX interrupt (TX_FULL & TX_TIMEOUT INTERRUPT) + * @brief Disable UART TX interrupt (TX_FIFO_EMPTY INTERRUPT) * * @param uart_num UART port number * @@ -376,11 +376,11 @@ esp_err_t uart_disable_rx_intr(uart_port_t uart_num); esp_err_t uart_disable_tx_intr(uart_port_t uart_num); /** - * @brief Enable UART TX interrupt (TX_FULL & TX_TIMEOUT INTERRUPT) + * @brief Enable UART TX interrupt (TX_FIFO_EMPTY INTERRUPT) * * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). - * @param enable 1: enable; 0: disable - * @param thresh Threshold of TX interrupt, 0 ~ UART_HW_FIFO_LEN(uart_num) + * @param enable Set to 1 to enable the interrupt + * @param thresh Threshold of TX FIFO empty interrupt, 0 ~ UART_HW_FIFO_LEN(uart_num). If -1 is given, threshold configuration will be skipped. * * @return * - ESP_OK Success diff --git a/components/esp_driver_uart/src/uart.c b/components/esp_driver_uart/src/uart.c index 503e6de12bc..ecf5184f4e8 100644 --- a/components/esp_driver_uart/src/uart.c +++ b/components/esp_driver_uart/src/uart.c @@ -686,11 +686,14 @@ esp_err_t uart_disable_tx_intr(uart_port_t uart_num) esp_err_t uart_enable_tx_intr(uart_port_t uart_num, int enable, int thresh) { + (void)enable; ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_FAIL, UART_TAG, "uart_num error"); ESP_RETURN_ON_FALSE((thresh < UART_HW_FIFO_LEN(uart_num)), ESP_FAIL, UART_TAG, "empty intr threshold error"); uart_hal_clr_intsts_mask(&(uart_context[uart_num].hal), UART_INTR_TXFIFO_EMPTY); UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock)); - uart_hal_set_txfifo_empty_thr(&(uart_context[uart_num].hal), thresh); + if (thresh != -1) { + uart_hal_set_txfifo_empty_thr(&(uart_context[uart_num].hal), thresh); + } uart_hal_ena_intr_mask(&(uart_context[uart_num].hal), UART_INTR_TXFIFO_EMPTY); UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock)); return ESP_OK; @@ -1577,7 +1580,7 @@ static int uart_tx_all(uart_port_t uart_num, const char *src, size_t size, bool xRingbufferSend(p_uart_obj[uart_num]->tx_ring_buf, (void *)(src + offset), send_size, portMAX_DELAY); size -= send_size; offset += send_size; - uart_enable_tx_intr(uart_num, 1, UART_THRESHOLD_NUM(uart_num, UART_EMPTY_THRESH_DEFAULT)); + uart_enable_tx_intr(uart_num, 1, -1); } } } else { @@ -1587,7 +1590,7 @@ static int uart_tx_all(uart_port_t uart_num, const char *src, size_t size, bool uint32_t sent = uart_enable_tx_write_fifo(uart_num, (const uint8_t *) src, size); if (sent < size) { p_uart_obj[uart_num]->tx_waiting_fifo = true; - uart_enable_tx_intr(uart_num, 1, UART_THRESHOLD_NUM(uart_num, UART_EMPTY_THRESH_DEFAULT)); + uart_enable_tx_intr(uart_num, 1, -1); } size -= sent; src += sent; From e801bde973bd83ad448ac4da8dd946244716b4c1 Mon Sep 17 00:00:00 2001 From: Song Ruo Jing Date: Fri, 28 Nov 2025 20:34:06 +0800 Subject: [PATCH 2/2] fix(uart): Avoid division by zero error when calling uart_get_baudrate If uart_driver_install is not called before uart_get_baudrate, the UART port may not be ready. In such cases, the register values cannot be read out, leading to a division by zero error in uart_ll_get_baudrate. This commit adds a check to ensure the UART port is enabled before attempting to read its registers. Closes https://github.com/espressif/esp-idf/issues/17513 --- components/esp_driver_uart/include/driver/uart.h | 2 +- components/esp_driver_uart/src/uart.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/components/esp_driver_uart/include/driver/uart.h b/components/esp_driver_uart/include/driver/uart.h index 5d467f4a21d..5c8a182beae 100644 --- a/components/esp_driver_uart/include/driver/uart.h +++ b/components/esp_driver_uart/include/driver/uart.h @@ -248,7 +248,7 @@ esp_err_t uart_set_baudrate(uart_port_t uart_num, uint32_t baudrate); * @param baudrate Pointer to accept value of UART baud rate * * @return - * - ESP_FAIL Parameter error + * - ESP_FAIL Parameter error or the UART port is not enabled * - ESP_OK Success, result will be put in (*baudrate) * */ diff --git a/components/esp_driver_uart/src/uart.c b/components/esp_driver_uart/src/uart.c index ecf5184f4e8..6b1484e62c1 100644 --- a/components/esp_driver_uart/src/uart.c +++ b/components/esp_driver_uart/src/uart.c @@ -396,6 +396,7 @@ esp_err_t uart_set_baudrate(uart_port_t uart_num, uint32_t baud_rate) esp_err_t uart_get_baudrate(uart_port_t uart_num, uint32_t *baudrate) { ESP_RETURN_ON_FALSE((uart_num < UART_NUM_MAX), ESP_FAIL, UART_TAG, "uart_num error"); + ESP_RETURN_ON_FALSE(uart_ll_is_enabled(uart_num), ESP_FAIL, UART_TAG, "uart port not enabled, unable to get register values"); soc_module_clk_t src_clk; uint32_t sclk_freq;