feat(gpio): support to attach gpio signals internally

This commit is contained in:
laokaiyao
2026-03-31 12:26:35 +08:00
committed by morris
parent 1ec13a92d2
commit b5c68aa481
3 changed files with 21 additions and 6 deletions
@@ -21,7 +21,7 @@
#include "unity.h" #include "unity.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
#include "driver/gpio.h" #include "driver/gpio.h"
#include "hal/gpio_ll.h" #include "hal/gpio_hal.h"
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
#include "freertos/task.h" #include "freertos/task.h"
#include "freertos/queue.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 // 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) 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 // signal256 -> output pin -> signal_idx -> input_pin
// Set output pin IE to be able to connect to the signal gpio_hal_matrix_interconnect(&hal, output_pin, input_pin, signal_idx);
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);
} }
#endif #endif
+6
View File
@@ -68,6 +68,12 @@ void gpio_hal_matrix_out(gpio_hal_context_t *hal, uint32_t gpio_num, uint32_t si
#endif #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 #if SOC_GPIO_SUPPORT_PIN_HYS_FILTER
void gpio_hal_hysteresis_soft_enable(gpio_hal_context_t *hal, uint32_t gpio_num, bool enable) void gpio_hal_hysteresis_soft_enable(gpio_hal_context_t *hal, uint32_t gpio_num, bool enable)
{ {
@@ -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); 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 #if SOC_GPIO_SUPPORT_FORCE_HOLD
/** /**
* @brief Force hold all digital gpio pads (including those powered by VDD3P3_RTC power domain). * @brief Force hold all digital gpio pads (including those powered by VDD3P3_RTC power domain).