From ab664da95d2b062d6fe8a805de3dbcb6d4d20daa Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Tue, 7 Apr 2026 16:49:20 +0800 Subject: [PATCH] feat(esp_hw_support): add support for SOC_CLOCK_SOURCE_CG and WIFI_BB_80X1 clock in modem clock management --- .../modem/include/modem/modem_clock_impl.h | 6 +++ .../modem/port/esp32s31/modem_clock_impl.c | 38 +++++++++++++++++-- .../esp32s31/include/hal/modem_syscon_ll.h | 14 +++++-- components/hal/esp32s31/modem_clock_hal.c | 13 +++++++ components/hal/include/hal/modem_clock_hal.h | 7 +++- .../esp32s31/include/soc/Kconfig.soc_caps.in | 8 ++++ .../soc/esp32s31/include/soc/soc_caps.h | 2 + 7 files changed, 79 insertions(+), 9 deletions(-) diff --git a/components/esp_hw_support/modem/include/modem/modem_clock_impl.h b/components/esp_hw_support/modem/include/modem/modem_clock_impl.h index 110df308b12..6b27fb29d73 100644 --- a/components/esp_hw_support/modem/include/modem/modem_clock_impl.h +++ b/components/esp_hw_support/modem/include/modem/modem_clock_impl.h @@ -50,6 +50,9 @@ typedef enum { MODEM_CLOCK_DEVICE_MIN = 0, MODEM_CLOCK_MODEM_ADC_COMMON_FE = MODEM_CLOCK_DEVICE_MIN, MODEM_CLOCK_MODEM_PRIVATE_FE, +#if SOC_MODEM_CLOCK_SOC_PLL_SOURCE_CG_SUPPORTED + MODEM_CLOCK_SOC_PLL_SOURCE_CG, +#endif MODEM_CLOCK_COEXIST, MODEM_CLOCK_I2C_MASTER, #if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT @@ -59,6 +62,9 @@ typedef enum { #if SOC_WIFI_SUPPORTED MODEM_CLOCK_WIFI_MAC, MODEM_CLOCK_WIFI_BB, +#if SOC_MODEM_CLOCK_WIFI_BB_80X1_AS_APB + MODEM_CLOCK_WIFI_BB_80X1, +#endif #endif MODEM_CLOCK_ETM, #if SOC_BT_SUPPORTED diff --git a/components/esp_hw_support/modem/port/esp32s31/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32s31/modem_clock_impl.c index e4eb35b73aa..b9ffc7c7b5a 100644 --- a/components/esp_hw_support/modem/port/esp32s31/modem_clock_impl.c +++ b/components/esp_hw_support/modem/port/esp32s31/modem_clock_impl.c @@ -11,15 +11,15 @@ #include "esp_private/regi2c_ctrl.h" /* Clock dependency definitions */ -#define WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_MAC, WIFI_APB, WIFI_BB, WIFI_BB_44M, COEXIST ) ) -#define BLE_CLOCK_DEPS ( MODEM_CLOCKS( BLE_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) +#define WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_MAC, WIFI_APB, WIFI_BB, WIFI_BB_44M, WIFI_BB_80X1, COEXIST ) ) +#define BLE_CLOCK_DEPS ( MODEM_CLOCKS( BLE_MAC, BT_I154_COMMON_BB, ETM, COEXIST, WIFI_BB_80X1 ) ) #define IEEE802154_CLOCK_DEPS ( MODEM_CLOCKS( 802154_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) #define COEXIST_CLOCK_DEPS ( MODEM_CLOCKS( COEXIST ) ) #define I2C_ANA_MST_CLOCK_DEPS ( MODEM_CLOCKS( I2C_MASTER ) ) -#define PHY_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE, MODEM_PRIVATE_FE ) | I2C_ANA_MST_CLOCK_DEPS ) +#define PHY_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE, MODEM_PRIVATE_FE, SOC_PLL_SOURCE_CG ) | I2C_ANA_MST_CLOCK_DEPS ) #define MODEM_ETM_CLOCK_DEPS ( MODEM_CLOCKS( ETM ) ) #define MODEM_ADC_COMMON_FE_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE ) ) -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB, WIFI_BB_44M ) ) +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB, WIFI_BB_44M, WIFI_BB_80X1 ) ) #define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB_44M, BT_I154_COMMON_BB ) ) #define PHY_CALIBRATION_CLOCK_DEPS ( PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS ) @@ -65,6 +65,13 @@ static void IRAM_ATTR modem_clock_wifi_bb_configure(modem_clock_context_t *ctx, } } +static void IRAM_ATTR modem_clock_wifi_bb_80x1_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { + modem_syscon_ll_enable_wifibb_80x1_clock(ctx->hal->syscon_dev, enable); + } +} + #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING static esp_err_t IRAM_ATTR modem_clock_wifi_mac_check_enable(modem_clock_context_t *ctx) { @@ -77,6 +84,11 @@ static esp_err_t IRAM_ATTR modem_clock_wifi_bb_check_enable(modem_clock_context_ { return modem_syscon_ll_wifibb_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; } + +static esp_err_t IRAM_ATTR modem_clock_wifi_bb_80x1_check_enable(modem_clock_context_t *ctx) +{ + return modem_syscon_ll_wifibb_80x1_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; +} #endif #endif @@ -169,6 +181,13 @@ static void IRAM_ATTR modem_clock_coex_configure(modem_clock_context_t *ctx, boo modem_lpcon_ll_enable_coex_clock(ctx->hal->lpcon_dev, enable); } +#if SOC_MODEM_CLOCK_SOC_PLL_SOURCE_CG_SUPPORTED +static void IRAM_ATTR modem_clock_soc_pll_source_cg_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_clock_hal_enable_soc_pll_source_cg(ctx->hal, enable); +} +#endif + static void IRAM_ATTR modem_clock_modem_adc_common_fe_configure(modem_clock_context_t *ctx, bool enable) { modem_clock_hal_enable_modem_common_fe_clock(ctx->hal, enable); @@ -205,6 +224,13 @@ static esp_err_t IRAM_ATTR modem_clock_coex_check_enable(modem_clock_context_t * return modem_lpcon_ll_coex_clock_is_enabled(ctx->hal->lpcon_dev) ? ESP_OK : ESP_FAIL; } +#if SOC_MODEM_CLOCK_SOC_PLL_SOURCE_CG_SUPPORTED +static esp_err_t IRAM_ATTR modem_clock_soc_pll_source_cg_check_enable(modem_clock_context_t *ctx) +{ + return modem_clock_hal_soc_pll_source_cg_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; +} +#endif + static esp_err_t IRAM_ATTR modem_clock_modem_adc_common_fe_check_enable(modem_clock_context_t *ctx) { return modem_clock_hal_modem_common_fe_clock_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; @@ -240,6 +266,7 @@ static void IRAM_ATTR modem_clock_configure_impl(modem_clock_context_t *ctx, int void (*action)(struct modem_clock_context *, bool) = ( (dev_id == MODEM_CLOCK_MODEM_ADC_COMMON_FE) ? modem_clock_modem_adc_common_fe_configure + : (dev_id == MODEM_CLOCK_SOC_PLL_SOURCE_CG) ? modem_clock_soc_pll_source_cg_configure : (dev_id == MODEM_CLOCK_MODEM_PRIVATE_FE) ? modem_clock_modem_private_fe_configure : (dev_id == MODEM_CLOCK_COEXIST) ? modem_clock_coex_configure : (dev_id == MODEM_CLOCK_I2C_MASTER) ? modem_clock_i2c_master_configure @@ -250,6 +277,7 @@ static void IRAM_ATTR modem_clock_configure_impl(modem_clock_context_t *ctx, int #if SOC_WIFI_SUPPORTED : (dev_id == MODEM_CLOCK_WIFI_MAC) ? modem_clock_wifi_mac_configure : (dev_id == MODEM_CLOCK_WIFI_BB) ? modem_clock_wifi_bb_configure + : (dev_id == MODEM_CLOCK_WIFI_BB_80X1) ? modem_clock_wifi_bb_80x1_configure #endif : (dev_id == MODEM_CLOCK_ETM) ? modem_clock_etm_configure #if SOC_BT_SUPPORTED @@ -274,6 +302,7 @@ static esp_err_t IRAM_ATTR modem_clock_check_impl(modem_clock_context_t *ctx, in esp_err_t (*check_action)(struct modem_clock_context *) = ( (dev_id == MODEM_CLOCK_MODEM_ADC_COMMON_FE) ? modem_clock_modem_adc_common_fe_check_enable + : (dev_id == MODEM_CLOCK_SOC_PLL_SOURCE_CG) ? modem_clock_soc_pll_source_cg_check_enable : (dev_id == MODEM_CLOCK_MODEM_PRIVATE_FE) ? modem_clock_modem_private_fe_check_enable : (dev_id == MODEM_CLOCK_COEXIST) ? modem_clock_coex_check_enable : (dev_id == MODEM_CLOCK_I2C_MASTER) ? modem_clock_i2c_master_check_enable @@ -281,6 +310,7 @@ static esp_err_t IRAM_ATTR modem_clock_check_impl(modem_clock_context_t *ctx, in : (dev_id == MODEM_CLOCK_WIFI_BB_44M) ? modem_clock_wifi_bb_44m_check_enable : (dev_id == MODEM_CLOCK_WIFI_MAC) ? modem_clock_wifi_mac_check_enable : (dev_id == MODEM_CLOCK_WIFI_BB) ? modem_clock_wifi_bb_check_enable + : (dev_id == MODEM_CLOCK_WIFI_BB_80X1) ? modem_clock_wifi_bb_80x1_check_enable : (dev_id == MODEM_CLOCK_ETM) ? modem_clock_etm_check_enable : (dev_id == MODEM_CLOCK_BLE_MAC) ? modem_clock_ble_mac_check_enable : (dev_id == MODEM_CLOCK_BT_I154_COMMON_BB) ? modem_clock_ble_i154_bb_check_enable diff --git a/components/hal/esp32s31/include/hal/modem_syscon_ll.h b/components/hal/esp32s31/include/hal/modem_syscon_ll.h index 65b19dd9e1a..11fe5f0ef88 100644 --- a/components/hal/esp32s31/include/hal/modem_syscon_ll.h +++ b/components/hal/esp32s31/include/hal/modem_syscon_ll.h @@ -393,19 +393,25 @@ static inline void modem_syscon_ll_clk_wifibb_configure(modem_syscon_dev_t *hw, { /* Configure clk_wifibb_22m / clk_wifibb_40m / clk_wifibb_80m - clk_wifibb_40x / clk_wifibb_80x / clk_wifibb_40x1 / clk_wifibb_80x1 + clk_wifibb_40x / clk_wifibb_80x / clk_wifibb_40x1 clk_wifibb_160x1 clk_wifibb_44m is configured in modem_syscon_ll_enable_wifibb_44m_clock + clk_wifibb_80x1 is configured in modem_syscon_ll_enable_wifibb_80x1_clock */ - modem_syscon_ll_clk_conf1_configure(hw, en, 0x1fb); + modem_syscon_ll_clk_conf1_configure(hw, en, 0x17b); } __attribute__((always_inline)) static inline bool modem_syscon_ll_wifibb_clock_is_enabled(modem_syscon_dev_t *hw) { - // Check if any of the wifibb clocks are enabled - return (hw->clk_conf1.val & 0x1fb) == 0x1fb; + return (hw->clk_conf1.val & 0x17b) == 0x17b; +} + +__attribute__((always_inline)) +static inline bool modem_syscon_ll_wifibb_80x1_clock_is_enabled(modem_syscon_dev_t *hw) +{ + return hw->clk_conf1.clk_wifibb_80x1_en; } __attribute__((always_inline)) diff --git a/components/hal/esp32s31/modem_clock_hal.c b/components/hal/esp32s31/modem_clock_hal.c index beed6a610b2..4d213e63ac4 100644 --- a/components/hal/esp32s31/modem_clock_hal.c +++ b/components/hal/esp32s31/modem_clock_hal.c @@ -7,6 +7,7 @@ // The HAL layer for MODEM CLOCK (ESP32-S31 specific part) #include #include "soc/soc.h" +#include "soc/hp_sys_clkrst_reg.h" #include "esp_attr.h" #include "hal/modem_clock_hal.h" #include "hal/modem_clock_types.h" @@ -117,6 +118,18 @@ uint32_t IRAM_ATTR modem_clock_hal_get_clock_domain_icg_bitmap(modem_clock_hal_c return bitmap; } +void IRAM_ATTR modem_clock_hal_enable_soc_pll_source_cg(modem_clock_hal_context_t *hal, bool enable) +{ + (void)hal; + HP_SYS_CLKRST.modem_conf.val = enable ? 0x3d : 0x25; +} + +bool IRAM_ATTR modem_clock_hal_soc_pll_source_cg_is_enabled(modem_clock_hal_context_t *hal) +{ + (void)hal; + return (HP_SYS_CLKRST.modem_conf.val == 0x3d); +} + void IRAM_ATTR modem_clock_hal_enable_modem_common_fe_clock(modem_clock_hal_context_t *hal, bool enable) { if (enable) { diff --git a/components/hal/include/hal/modem_clock_hal.h b/components/hal/include/hal/modem_clock_hal.h index 07ad1c7b21a..2f275331061 100644 --- a/components/hal/include/hal/modem_clock_hal.h +++ b/components/hal/include/hal/modem_clock_hal.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -34,6 +34,11 @@ bool modem_clock_hal_modem_common_fe_clock_is_enabled(modem_clock_hal_context_t void modem_clock_hal_enable_modem_private_fe_clock(modem_clock_hal_context_t *hal, bool enable); bool modem_clock_hal_modem_private_fe_clock_is_enabled(modem_clock_hal_context_t *hal); +#if SOC_MODEM_CLOCK_SOC_PLL_SOURCE_CG_SUPPORTED +void modem_clock_hal_enable_soc_pll_source_cg(modem_clock_hal_context_t *hal, bool enable); +bool modem_clock_hal_soc_pll_source_cg_is_enabled(modem_clock_hal_context_t *hal); +#endif + #if SOC_BT_SUPPORTED void modem_clock_hal_set_ble_rtc_timer_divisor_value(modem_clock_hal_context_t *hal, uint32_t divider); void modem_clock_hal_enable_ble_rtc_timer_clock(modem_clock_hal_context_t *hal, bool enable); diff --git a/components/soc/esp32s31/include/soc/Kconfig.soc_caps.in b/components/soc/esp32s31/include/soc/Kconfig.soc_caps.in index 3ea4b681f24..02266e542c4 100644 --- a/components/soc/esp32s31/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32s31/include/soc/Kconfig.soc_caps.in @@ -791,6 +791,14 @@ config SOC_MODEM_CLOCK_IS_INDEPENDENT bool default y +config SOC_MODEM_CLOCK_SOC_PLL_SOURCE_CG_SUPPORTED + bool + default y + +config SOC_MODEM_CLOCK_WIFI_BB_80X1_AS_APB + bool + default y + config SOC_CLK_RC_FAST_SUPPORT_CALIBRATION bool default y diff --git a/components/soc/esp32s31/include/soc/soc_caps.h b/components/soc/esp32s31/include/soc/soc_caps.h index 36b1cc3ed03..6281de11956 100644 --- a/components/soc/esp32s31/include/soc/soc_caps.h +++ b/components/soc/esp32s31/include/soc/soc_caps.h @@ -367,6 +367,8 @@ // /*-------------------------- CLOCK SUBSYSTEM CAPS ----------------------------------------*/ #define SOC_MODEM_CLOCK_IS_INDEPENDENT (1) +#define SOC_MODEM_CLOCK_SOC_PLL_SOURCE_CG_SUPPORTED (1) +#define SOC_MODEM_CLOCK_WIFI_BB_80X1_AS_APB (1) #define SOC_CLK_RC_FAST_SUPPORT_CALIBRATION (1)