From 29f8fcf7b70be226a4850778beb6587aff6d425f Mon Sep 17 00:00:00 2001 From: Chen Chen Date: Tue, 26 Aug 2025 17:02:37 +0800 Subject: [PATCH] fix(i2c/gpio): Add error checks to the i2c driver Add more checks to i2c driver, as well as fixed some GPIO issues together with it. --- components/esp_driver_gpio/src/gpio.c | 3 ++- components/esp_driver_gpio/src/rtc_io.c | 15 ++++++++++++--- components/esp_driver_i2c/i2c_common.c | 4 ++-- components/esp_driver_i2c/i2c_master.c | 2 +- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/components/esp_driver_gpio/src/gpio.c b/components/esp_driver_gpio/src/gpio.c index b951025b3f..9c494a2631 100644 --- a/components/esp_driver_gpio/src/gpio.c +++ b/components/esp_driver_gpio/src/gpio.c @@ -839,7 +839,8 @@ esp_err_t gpio_iomux_output(gpio_num_t gpio_num, int func) esp_err_t gpio_matrix_input(gpio_num_t gpio_num, uint32_t signal_idx, bool in_inv) { - GPIO_CHECK(GPIO_IS_VALID_GPIO(gpio_num), "GPIO number error", ESP_ERR_INVALID_ARG); + GPIO_CHECK((gpio_num == GPIO_MATRIX_CONST_ZERO_INPUT) || (gpio_num == GPIO_MATRIX_CONST_ONE_INPUT) || GPIO_IS_VALID_GPIO(gpio_num), \ + "GPIO number error", ESP_ERR_INVALID_ARG); gpio_hal_matrix_in(gpio_context.gpio_hal, gpio_num, signal_idx, in_inv); diff --git a/components/esp_driver_gpio/src/rtc_io.c b/components/esp_driver_gpio/src/rtc_io.c index 7da59866bd..d605d72d98 100644 --- a/components/esp_driver_gpio/src/rtc_io.c +++ b/components/esp_driver_gpio/src/rtc_io.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2019-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -16,6 +16,9 @@ #include "hal/rtc_io_hal.h" #include "soc/rtc_io_periph.h" #include "soc/soc_caps.h" +#if SOC_LP_GPIO_MATRIX_SUPPORTED +#include "soc/lp_gpio_pins.h" +#endif static const char __attribute__((__unused__)) *RTCIO_TAG = "RTCIO"; @@ -181,8 +184,14 @@ esp_err_t rtc_gpio_iomux_func_sel(gpio_num_t gpio_num, int func) #if SOC_LP_GPIO_MATRIX_SUPPORTED esp_err_t lp_gpio_connect_in_signal(gpio_num_t gpio_num, uint32_t signal_idx, bool inv) { - ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "LP_IO number error"); - rtcio_hal_matrix_in(rtc_io_number_get(gpio_num), signal_idx, inv); + uint32_t io_num; + if (gpio_num == LP_GPIO_MATRIX_CONST_ZERO_INPUT || gpio_num == LP_GPIO_MATRIX_CONST_ONE_INPUT) { + io_num = gpio_num; + } else { + ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "LP_IO number error"); + io_num = rtc_io_number_get(gpio_num); + } + rtcio_hal_matrix_in(io_num, signal_idx, inv); return ESP_OK; } diff --git a/components/esp_driver_i2c/i2c_common.c b/components/esp_driver_i2c/i2c_common.c index 35c47c6dc5..5ec4403284 100644 --- a/components/esp_driver_i2c/i2c_common.c +++ b/components/esp_driver_i2c/i2c_common.c @@ -457,8 +457,8 @@ esp_err_t i2c_common_deinit_pins(i2c_bus_handle_t handle) ESP_RETURN_ON_ERROR(rtc_gpio_deinit(handle->sda_num), TAG, "deinit rtc gpio failed"); ESP_RETURN_ON_ERROR(rtc_gpio_deinit(handle->scl_num), TAG, "deinit rtc gpio failed"); #if SOC_LP_GPIO_MATRIX_SUPPORTED - lp_gpio_connect_in_signal(LP_GPIO_MATRIX_CONST_ZERO_INPUT, i2c_periph_signal[port_id].scl_in_sig, 0); - lp_gpio_connect_in_signal(LP_GPIO_MATRIX_CONST_ZERO_INPUT, i2c_periph_signal[port_id].sda_in_sig, 0); + ESP_RETURN_ON_ERROR(lp_gpio_connect_in_signal(LP_GPIO_MATRIX_CONST_ZERO_INPUT, i2c_periph_signal[port_id].scl_in_sig, 0), TAG, "failed to connect lp gpio to zero"); + ESP_RETURN_ON_ERROR(lp_gpio_connect_in_signal(LP_GPIO_MATRIX_CONST_ZERO_INPUT, i2c_periph_signal[port_id].sda_in_sig, 0), TAG, "failed to connect lp gpio to zero"); #endif } #endif diff --git a/components/esp_driver_i2c/i2c_master.c b/components/esp_driver_i2c/i2c_master.c index 65ccafe9f3..3d91d324f5 100644 --- a/components/esp_driver_i2c/i2c_master.c +++ b/components/esp_driver_i2c/i2c_master.c @@ -870,7 +870,7 @@ static esp_err_t i2c_master_bus_destroy(i2c_master_bus_handle_t bus_handle) i2c_master_bus_handle_t i2c_master = bus_handle; esp_err_t err = ESP_OK; if (i2c_master->base) { - i2c_common_deinit_pins(i2c_master->base); + ESP_RETURN_ON_ERROR(i2c_common_deinit_pins(i2c_master->base), TAG, "failed to deinit i2c pins"); err = i2c_release_bus_handle(i2c_master->base); } if (err == ESP_OK) {