Files
Song Ruo Jing 9c2a8281c1 fix(uart): lp uart rx iomux pin was not working as expected
Introduced in 8818157e42
The workaround in the commit routes the signal to LP GPIO matrix first.
When uses LP IOMUX pin as UART RX, the signal did not bypass the matrix,
which caused the issue.

This commit adds rtc_gpio_iomux_input and rtc_gpio_iomux_output APIs
to align with existing GPIO driver APIs.
2026-04-09 17:07:01 +08:00

104 lines
3.2 KiB
C

/*
* SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
// The HAL layer for RTC IO (common part)
#include "hal/rtc_io_hal.h"
#include "soc/soc_caps.h"
#if SOC_RTCIO_INPUT_OUTPUT_SUPPORTED
void rtcio_hal_set_direction(int rtcio_num, rtc_gpio_mode_t mode)
{
switch (mode) {
case RTC_GPIO_MODE_INPUT_ONLY:
rtcio_ll_output_mode_set(rtcio_num, RTCIO_LL_OUTPUT_NORMAL);
rtcio_ll_output_disable(rtcio_num);
rtcio_ll_input_enable(rtcio_num);
break;
case RTC_GPIO_MODE_OUTPUT_ONLY:
rtcio_ll_output_mode_set(rtcio_num, RTCIO_LL_OUTPUT_NORMAL);
rtcio_ll_output_enable(rtcio_num);
rtcio_ll_input_disable(rtcio_num);
break;
case RTC_GPIO_MODE_INPUT_OUTPUT:
rtcio_ll_output_mode_set(rtcio_num, RTCIO_LL_OUTPUT_NORMAL);
rtcio_ll_output_enable(rtcio_num);
rtcio_ll_input_enable(rtcio_num);
break;
case RTC_GPIO_MODE_DISABLED:
rtcio_ll_output_mode_set(rtcio_num, RTCIO_LL_OUTPUT_NORMAL);
rtcio_ll_output_disable(rtcio_num);
rtcio_ll_input_disable(rtcio_num);
break;
case RTC_GPIO_MODE_OUTPUT_OD:
rtcio_ll_output_mode_set(rtcio_num, RTCIO_LL_OUTPUT_OD);
rtcio_ll_output_enable(rtcio_num);
rtcio_ll_input_disable(rtcio_num);
break;
case RTC_GPIO_MODE_INPUT_OUTPUT_OD:
rtcio_ll_output_mode_set(rtcio_num, RTCIO_LL_OUTPUT_OD);
rtcio_ll_output_enable(rtcio_num);
rtcio_ll_input_enable(rtcio_num);
break;
default:
break;
}
}
void rtcio_hal_set_direction_in_sleep(int rtcio_num, rtc_gpio_mode_t mode)
{
switch (mode) {
case RTC_GPIO_MODE_INPUT_ONLY:
rtcio_ll_enable_input_in_sleep(rtcio_num);
rtcio_ll_disable_output_in_sleep(rtcio_num);
rtcio_ll_enable_sleep_setting(rtcio_num);
break;
case RTC_GPIO_MODE_OUTPUT_ONLY:
rtcio_ll_enable_output_in_sleep(rtcio_num);
rtcio_ll_disable_input_in_sleep(rtcio_num);
rtcio_ll_enable_sleep_setting(rtcio_num);
break;
case RTC_GPIO_MODE_INPUT_OUTPUT:
rtcio_ll_enable_input_in_sleep(rtcio_num);
rtcio_ll_enable_output_in_sleep(rtcio_num);
rtcio_ll_enable_sleep_setting(rtcio_num);
break;
case RTC_GPIO_MODE_DISABLED:
rtcio_ll_disable_input_in_sleep(rtcio_num);
rtcio_ll_disable_output_in_sleep(rtcio_num);
rtcio_ll_disable_sleep_setting(rtcio_num);
break;
default:
break;
}
}
void rtcio_hal_isolate(int rtcio_num)
{
rtcio_ll_pullup_disable(rtcio_num);
rtcio_ll_pulldown_disable(rtcio_num);
rtcio_ll_output_disable(rtcio_num);
rtcio_ll_input_disable(rtcio_num);
}
void rtcio_hal_iomux_input(int rtcio_num, int func, uint32_t signal_idx)
{
rtcio_ll_input_enable(rtcio_num);
rtcio_ll_iomux_func_sel(rtcio_num, func);
#if SOC_LP_GPIO_MATRIX_SUPPORTED
rtcio_ll_set_input_signal_from(signal_idx, false);
#endif
}
void rtcio_hal_iomux_output(int rtcio_num, int func)
{
rtcio_ll_iomux_func_sel(rtcio_num, func);
// as long as the func sel is not RTC IO, the oe can only be controlled by the peripheral
}
#endif //SOC_RTCIO_INPUT_OUTPUT_SUPPORTED