From b5c68aa481a39adc4b528966d82993322cff7b2c Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Fri, 6 Feb 2026 13:35:42 +0800 Subject: [PATCH] feat(gpio): support to attach gpio signals internally --- .../esp_driver_gpio/test_apps/gpio/main/test_gpio.c | 11 +++++------ components/esp_hal_gpio/gpio_hal.c | 6 ++++++ components/esp_hal_gpio/include/hal/gpio_hal.h | 10 ++++++++++ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/components/esp_driver_gpio/test_apps/gpio/main/test_gpio.c b/components/esp_driver_gpio/test_apps/gpio/main/test_gpio.c index 851c7e9e283..22f1ae7435c 100644 --- a/components/esp_driver_gpio/test_apps/gpio/main/test_gpio.c +++ b/components/esp_driver_gpio/test_apps/gpio/main/test_gpio.c @@ -21,7 +21,7 @@ #include "unity.h" #include "unity_test_utils.h" #include "driver/gpio.h" -#include "hal/gpio_ll.h" +#include "hal/gpio_hal.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" @@ -504,12 +504,11 @@ TEST_CASE("GPIO_iram_interrupt_safe_test", "[gpio]") // Inter-connect input pin and output pin through an internal signal static void gpio_interconnect_input_output_pin(uint32_t input_pin, uint32_t output_pin, uint32_t signal_idx) { + gpio_hal_context_t hal = { + .dev = &GPIO, + }; // signal256 -> output pin -> signal_idx -> input_pin - // Set output pin IE to be able to connect to the signal - gpio_ll_input_enable(&GPIO, output_pin); - esp_rom_gpio_connect_in_signal(output_pin, signal_idx, 0); - // Input pin OE to be able to connect to the signal is done by the esp_rom_gpio_connect_out_signal function - esp_rom_gpio_connect_out_signal(input_pin, signal_idx, 0, 0); + gpio_hal_matrix_interconnect(&hal, output_pin, input_pin, signal_idx); } #endif diff --git a/components/esp_hal_gpio/gpio_hal.c b/components/esp_hal_gpio/gpio_hal.c index deeeefbd4f2..44667df0584 100644 --- a/components/esp_hal_gpio/gpio_hal.c +++ b/components/esp_hal_gpio/gpio_hal.c @@ -68,6 +68,12 @@ void gpio_hal_matrix_out(gpio_hal_context_t *hal, uint32_t gpio_num, uint32_t si #endif } +void gpio_hal_matrix_interconnect(gpio_hal_context_t *hal, uint32_t sig_src_pin, uint32_t sig_dst_pin, uint32_t signal_idx) +{ + gpio_hal_matrix_in(hal, sig_src_pin, signal_idx, false); + gpio_hal_matrix_out(hal, sig_dst_pin, signal_idx, false, false); +} + #if SOC_GPIO_SUPPORT_PIN_HYS_FILTER void gpio_hal_hysteresis_soft_enable(gpio_hal_context_t *hal, uint32_t gpio_num, bool enable) { diff --git a/components/esp_hal_gpio/include/hal/gpio_hal.h b/components/esp_hal_gpio/include/hal/gpio_hal.h index 7664aa83bad..7e57348f47e 100644 --- a/components/esp_hal_gpio/include/hal/gpio_hal.h +++ b/components/esp_hal_gpio/include/hal/gpio_hal.h @@ -412,6 +412,16 @@ void gpio_hal_matrix_in(gpio_hal_context_t *hal, uint32_t gpio_num, uint32_t sig */ void gpio_hal_matrix_out(gpio_hal_context_t *hal, uint32_t gpio_num, uint32_t signal_idx, bool out_inv, bool oen_inv); +/** + * @brief Connect two GPIOs through the GPIO matrix by a signal. + * + * @param hal Context of the HAL layer + * @param sig_src_pin Source GPIO number + * @param sig_dst_pin Destination GPIO number + * @param signal_idx Peripheral signal index (tagged as input attribute). One of the ``SIG_IN_FUNC`` signals in ``soc/gpio_sig_map.h``. + */ +void gpio_hal_matrix_interconnect(gpio_hal_context_t *hal, uint32_t sig_src_pin, uint32_t sig_dst_pin, uint32_t signal_idx); + #if SOC_GPIO_SUPPORT_FORCE_HOLD /** * @brief Force hold all digital gpio pads (including those powered by VDD3P3_RTC power domain).