fix(rtcio): RTC GPIO configuration should be written if LP IO clock exists

This commit is contained in:
Song Ruo Jing
2026-03-13 11:22:37 +08:00
parent 9df5d023bc
commit 68ed9e912b
32 changed files with 248 additions and 156 deletions
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -11,7 +11,6 @@
#include "soc/clk_tree_defs.h"
#include "soc/gpio_num.h"
#include "soc/soc_caps.h"
#include "soc/io_mux_reg.h"
#ifdef __cplusplus
extern "C" {
@@ -32,8 +31,8 @@ esp_err_t io_mux_set_clock_source(soc_module_clk_t clk_src);
#if SOC_LP_IO_CLOCK_IS_INDEPENDENT
typedef struct {
uint8_t rtc_io_enabled_cnt[MAX_RTC_GPIO_NUM + 1];
uint32_t rtc_io_using_mask;
uint8_t rtc_io_enabled_cnt[SOC_RTCIO_PIN_COUNT];
uint32_t rtc_io_using_mask : SOC_RTCIO_PIN_COUNT;
} rtc_io_status_t;
/**
@@ -45,12 +44,24 @@ typedef struct {
void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable);
/**
* Force disable one LP_IO to clock dependency
* @brief Force disable one LP_IO to clock dependency
*
* @param gpio_num GPIO number
*/
void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num);
#endif
#if SOC_RTCIO_PIN_COUNT > 0
/**
* @brief Check if the LP_IO is in use
*
* @param gpio_num GPIO number
*
* @return true if the LP_IO is in use, false otherwise
*/
bool io_mux_is_lp_io_in_use(gpio_num_t gpio_num);
#endif
#ifdef __cplusplus
}
#endif
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -11,3 +11,11 @@ esp_err_t io_mux_set_clock_source(soc_module_clk_t clk_src)
// IO MUX clock source is not selectable
return ESP_OK;
}
bool io_mux_is_lp_io_in_use(gpio_num_t gpio_num)
{
// ESP32 does not have SOC_LP_IO_CLOCK_IS_INDEPENDENT
// which means we don't need LP_IO clock management
// So we just always return true here
return true;
}
+21 -12
View File
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2023-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -50,17 +50,18 @@ esp_err_t io_mux_set_clock_source(soc_module_clk_t clk_src)
void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable)
{
assert(gpio_num != GPIO_NUM_NC);
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
esp_os_enter_critical(&s_io_mux_spinlock);
if (enable) {
if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) {
s_rtc_io_status.rtc_io_using_mask |= (1ULL << gpio_num);
if (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] == 0) {
s_rtc_io_status.rtc_io_using_mask |= (1ULL << rtc_io_num);
}
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]++;
} else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] > 0)) {
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]--;
if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) {
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num]++;
} else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] > 0)) {
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num]--;
if (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] == 0) {
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << rtc_io_num);
}
}
RTCIO_RCC_ATOMIC() {
@@ -75,10 +76,11 @@ void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable)
void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num)
{
assert(gpio_num != GPIO_NUM_NC);
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
esp_os_enter_critical(&s_io_mux_spinlock);
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] = 0;
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] = 0;
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << rtc_io_num);
if (s_rtc_io_status.rtc_io_using_mask == 0) {
RTCIO_RCC_ATOMIC() {
rtcio_ll_enable_io_clock(false);
@@ -86,3 +88,10 @@ void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num)
}
esp_os_exit_critical(&s_io_mux_spinlock);
}
bool io_mux_is_lp_io_in_use(gpio_num_t gpio_num)
{
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
return s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] > 0;
}
+21 -12
View File
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -49,17 +49,18 @@ esp_err_t io_mux_set_clock_source(soc_module_clk_t clk_src)
void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable)
{
assert(gpio_num != GPIO_NUM_NC);
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
esp_os_enter_critical(&s_io_mux_spinlock);
if (enable) {
if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) {
s_rtc_io_status.rtc_io_using_mask |= (1ULL << gpio_num);
if (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] == 0) {
s_rtc_io_status.rtc_io_using_mask |= (1ULL << rtc_io_num);
}
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]++;
} else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] > 0)) {
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]--;
if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) {
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num]++;
} else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] > 0)) {
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num]--;
if (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] == 0) {
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << rtc_io_num);
}
}
RTCIO_RCC_ATOMIC() {
@@ -74,10 +75,11 @@ void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable)
void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num)
{
assert(gpio_num != GPIO_NUM_NC);
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
esp_os_enter_critical(&s_io_mux_spinlock);
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] = 0;
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] = 0;
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << rtc_io_num);
if (s_rtc_io_status.rtc_io_using_mask == 0) {
RTCIO_RCC_ATOMIC() {
rtcio_ll_enable_io_clock(false);
@@ -85,3 +87,10 @@ void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num)
}
esp_os_exit_critical(&s_io_mux_spinlock);
}
bool io_mux_is_lp_io_in_use(gpio_num_t gpio_num)
{
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
return s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] > 0;
}
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -44,17 +44,18 @@ esp_err_t io_mux_set_clock_source(soc_module_clk_t clk_src)
void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable)
{
assert(gpio_num != GPIO_NUM_NC);
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
esp_os_enter_critical(&s_io_mux_spinlock);
if (enable) {
if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) {
s_rtc_io_status.rtc_io_using_mask |= (1ULL << gpio_num);
if (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] == 0) {
s_rtc_io_status.rtc_io_using_mask |= (1ULL << rtc_io_num);
}
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]++;
} else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] > 0)) {
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]--;
if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) {
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num]++;
} else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] > 0)) {
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num]--;
if (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] == 0) {
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << rtc_io_num);
}
}
RTCIO_RCC_ATOMIC() {
@@ -69,10 +70,11 @@ void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable)
void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num)
{
assert(gpio_num != GPIO_NUM_NC);
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
esp_os_enter_critical(&s_io_mux_spinlock);
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] = 0;
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] = 0;
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << rtc_io_num);
if (s_rtc_io_status.rtc_io_using_mask == 0) {
RTCIO_RCC_ATOMIC() {
rtcio_ll_enable_io_clock(false);
@@ -80,3 +82,10 @@ void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num)
}
esp_os_exit_critical(&s_io_mux_spinlock);
}
bool io_mux_is_lp_io_in_use(gpio_num_t gpio_num)
{
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
return s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] > 0;
}
+21 -12
View File
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -44,17 +44,18 @@ esp_err_t io_mux_set_clock_source(soc_module_clk_t clk_src)
void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable)
{
assert(gpio_num != GPIO_NUM_NC);
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
esp_os_enter_critical(&s_io_mux_spinlock);
if (enable) {
if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) {
s_rtc_io_status.rtc_io_using_mask |= (1ULL << gpio_num);
if (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] == 0) {
s_rtc_io_status.rtc_io_using_mask |= (1ULL << rtc_io_num);
}
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]++;
} else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] > 0)) {
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]--;
if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) {
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num]++;
} else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] > 0)) {
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num]--;
if (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] == 0) {
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << rtc_io_num);
}
}
RTCIO_RCC_ATOMIC() {
@@ -69,10 +70,11 @@ void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable)
void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num)
{
assert(gpio_num != GPIO_NUM_NC);
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
esp_os_enter_critical(&s_io_mux_spinlock);
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] = 0;
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] = 0;
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << rtc_io_num);
if (s_rtc_io_status.rtc_io_using_mask == 0) {
RTCIO_RCC_ATOMIC() {
rtcio_ll_enable_io_clock(false);
@@ -80,3 +82,10 @@ void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num)
}
esp_os_exit_critical(&s_io_mux_spinlock);
}
bool io_mux_is_lp_io_in_use(gpio_num_t gpio_num)
{
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
return s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] > 0;
}
@@ -1,6 +1,6 @@
/*
* SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -45,17 +45,18 @@ esp_err_t io_mux_set_clock_source(soc_module_clk_t clk_src)
void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable)
{
assert(gpio_num != GPIO_NUM_NC);
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
esp_os_enter_critical(&s_io_mux_spinlock);
if (enable) {
if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) {
s_rtc_io_status.rtc_io_using_mask |= (1ULL << gpio_num);
if (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] == 0) {
s_rtc_io_status.rtc_io_using_mask |= (1ULL << rtc_io_num);
}
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]++;
} else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] > 0)) {
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]--;
if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) {
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num]++;
} else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] > 0)) {
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num]--;
if (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] == 0) {
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << rtc_io_num);
}
}
RTCIO_RCC_ATOMIC() {
@@ -70,10 +71,11 @@ void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable)
void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num)
{
assert(gpio_num != GPIO_NUM_NC);
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
esp_os_enter_critical(&s_io_mux_spinlock);
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] = 0;
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] = 0;
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << rtc_io_num);
if (s_rtc_io_status.rtc_io_using_mask == 0) {
RTCIO_RCC_ATOMIC() {
rtcio_ll_enable_io_clock(false);
@@ -81,3 +83,10 @@ void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num)
}
esp_os_exit_critical(&s_io_mux_spinlock);
}
bool io_mux_is_lp_io_in_use(gpio_num_t gpio_num)
{
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
return s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] > 0;
}
+21 -12
View File
@@ -1,6 +1,6 @@
/*
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -45,17 +45,18 @@ esp_err_t io_mux_set_clock_source(soc_module_clk_t clk_src)
void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable)
{
assert(gpio_num != GPIO_NUM_NC);
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
esp_os_enter_critical(&s_io_mux_spinlock);
if (enable) {
if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) {
s_rtc_io_status.rtc_io_using_mask |= (1ULL << gpio_num);
if (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] == 0) {
s_rtc_io_status.rtc_io_using_mask |= (1ULL << rtc_io_num);
}
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]++;
} else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] > 0)) {
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]--;
if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) {
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num]++;
} else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] > 0)) {
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num]--;
if (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] == 0) {
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << rtc_io_num);
}
}
RTCIO_RCC_ATOMIC() {
@@ -70,10 +71,11 @@ void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable)
void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num)
{
assert(gpio_num != GPIO_NUM_NC);
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
esp_os_enter_critical(&s_io_mux_spinlock);
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] = 0;
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] = 0;
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << rtc_io_num);
if (s_rtc_io_status.rtc_io_using_mask == 0) {
RTCIO_RCC_ATOMIC() {
rtcio_ll_enable_io_clock(false);
@@ -81,3 +83,10 @@ void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num)
}
esp_os_exit_critical(&s_io_mux_spinlock);
}
bool io_mux_is_lp_io_in_use(gpio_num_t gpio_num)
{
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
return s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] > 0;
}
+21 -12
View File
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2023-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -54,17 +54,18 @@ esp_err_t io_mux_set_clock_source(soc_module_clk_t clk_src)
void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable)
{
assert((gpio_num != GPIO_NUM_NC) && (gpio_num <= MAX_RTC_GPIO_NUM) && "RTCIO number error");
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
esp_os_enter_critical(&s_io_mux_spinlock);
if (enable) {
if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) {
s_rtc_io_status.rtc_io_using_mask |= (1ULL << gpio_num);
if (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] == 0) {
s_rtc_io_status.rtc_io_using_mask |= (1ULL << rtc_io_num);
}
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]++;
} else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] > 0)) {
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]--;
if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) {
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num]++;
} else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] > 0)) {
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num]--;
if (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] == 0) {
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << rtc_io_num);
}
}
RTCIO_RCC_ATOMIC() {
@@ -79,10 +80,11 @@ void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable)
void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num)
{
assert((gpio_num != GPIO_NUM_NC) && (gpio_num <= MAX_RTC_GPIO_NUM) && "RTCIO number error");
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
esp_os_enter_critical(&s_io_mux_spinlock);
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] = 0;
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] = 0;
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << rtc_io_num);
if (s_rtc_io_status.rtc_io_using_mask == 0) {
RTCIO_RCC_ATOMIC() {
rtcio_ll_enable_io_clock(false);
@@ -90,3 +92,10 @@ void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num)
}
esp_os_exit_critical(&s_io_mux_spinlock);
}
bool io_mux_is_lp_io_in_use(gpio_num_t gpio_num)
{
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
return s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] > 0;
}
+21 -12
View File
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -32,17 +32,18 @@ static rtc_io_status_t s_rtc_io_status = {
void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable)
{
assert(gpio_num != GPIO_NUM_NC);
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
esp_os_enter_critical(&s_io_mux_spinlock);
if (enable) {
if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) {
s_rtc_io_status.rtc_io_using_mask |= (1ULL << gpio_num);
if (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] == 0) {
s_rtc_io_status.rtc_io_using_mask |= (1ULL << rtc_io_num);
}
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]++;
} else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] > 0)) {
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]--;
if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) {
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num]++;
} else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] > 0)) {
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num]--;
if (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] == 0) {
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << rtc_io_num);
}
}
RTCIO_RCC_ATOMIC() {
@@ -57,10 +58,11 @@ void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable)
void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num)
{
assert(gpio_num != GPIO_NUM_NC);
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
esp_os_enter_critical(&s_io_mux_spinlock);
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] = 0;
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] = 0;
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << rtc_io_num);
if (s_rtc_io_status.rtc_io_using_mask == 0) {
RTCIO_RCC_ATOMIC() {
rtcio_ll_enable_io_clock(false);
@@ -68,3 +70,10 @@ void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num)
}
esp_os_exit_critical(&s_io_mux_spinlock);
}
bool io_mux_is_lp_io_in_use(gpio_num_t gpio_num)
{
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
return s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] > 0;
}
+21 -12
View File
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -32,17 +32,18 @@ static rtc_io_status_t s_rtc_io_status = {
void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable)
{
assert(gpio_num != GPIO_NUM_NC);
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
esp_os_enter_critical(&s_io_mux_spinlock);
if (enable) {
if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) {
s_rtc_io_status.rtc_io_using_mask |= (1ULL << gpio_num);
if (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] == 0) {
s_rtc_io_status.rtc_io_using_mask |= (1ULL << rtc_io_num);
}
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]++;
} else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] > 0)) {
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num]--;
if (s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] == 0) {
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num]++;
} else if (!enable && (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] > 0)) {
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num]--;
if (s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] == 0) {
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << rtc_io_num);
}
}
RTCIO_RCC_ATOMIC() {
@@ -57,10 +58,11 @@ void io_mux_enable_lp_io_clock(gpio_num_t gpio_num, bool enable)
void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num)
{
assert(gpio_num != GPIO_NUM_NC);
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
esp_os_enter_critical(&s_io_mux_spinlock);
s_rtc_io_status.rtc_io_enabled_cnt[gpio_num] = 0;
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << gpio_num);
s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] = 0;
s_rtc_io_status.rtc_io_using_mask &= ~(1ULL << rtc_io_num);
if (s_rtc_io_status.rtc_io_using_mask == 0) {
RTCIO_RCC_ATOMIC() {
rtcio_ll_enable_io_clock(false);
@@ -68,3 +70,10 @@ void io_mux_force_disable_lp_io_clock(gpio_num_t gpio_num)
}
esp_os_exit_critical(&s_io_mux_spinlock);
}
bool io_mux_is_lp_io_in_use(gpio_num_t gpio_num)
{
uint32_t rtc_io_num = gpio_num - RTCIO_LL_GPIO_NUM_OFFSET;
assert(rtc_io_num < SOC_RTCIO_PIN_COUNT);
return s_rtc_io_status.rtc_io_enabled_cnt[rtc_io_num] > 0;
}