From 466097d370e813b43b78c58702b91fd13681d902 Mon Sep 17 00:00:00 2001 From: cjin Date: Wed, 29 Jul 2026 17:21:41 +0800 Subject: [PATCH] feat(modem_clock): added bt_apb module and separete bt_apb from bt_mac module --- .../modem/include/modem/modem_clock_impl.h | 1 + .../modem/port/esp32h4/modem_clock_impl.c | 31 +++++++++++++------ .../modem/port/esp32s31/modem_clock_impl.c | 30 ++++++++++++------ .../hal/esp32h4/include/hal/modem_syscon_ll.h | 28 +++++------------ .../esp32s31/include/hal/modem_syscon_ll.h | 4 +-- .../soc/esp32h4/include/soc/periph_defs.h | 3 +- .../soc/esp32s31/include/soc/periph_defs.h | 3 +- 7 files changed, 58 insertions(+), 42 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 6b27fb29d73..fc8ad09901d 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 @@ -69,6 +69,7 @@ typedef enum { MODEM_CLOCK_ETM, #if SOC_BT_SUPPORTED MODEM_CLOCK_BLE_MAC, + MODEM_CLOCK_BT_APB, #endif #if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED MODEM_CLOCK_BT_I154_COMMON_BB, diff --git a/components/esp_hw_support/modem/port/esp32h4/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32h4/modem_clock_impl.c index fd06a20173a..9e18f4acbdb 100644 --- a/components/esp_hw_support/modem/port/esp32h4/modem_clock_impl.c +++ b/components/esp_hw_support/modem/port/esp32h4/modem_clock_impl.c @@ -11,14 +11,16 @@ #include "esp_private/regi2c_ctrl.h" /* Clock dependency definitions */ -#define BLE_CLOCK_DEPS ( MODEM_CLOCKS( BLE_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) -#define IEEE802154_CLOCK_DEPS ( MODEM_CLOCKS( 802154_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) +#define BT_APB_CLOCK_DEPS ( MODEM_CLOCKS( BT_APB, ETM ) ) +#define BLE_CLOCK_DEPS ( MODEM_CLOCKS( BLE_MAC, BT_I154_COMMON_BB, ETM, COEXIST, BT_APB ) ) +#define BT_APB_CLOCK_DEPS ( MODEM_CLOCKS( BT_APB, ETM ) ) +#define IEEE802154_CLOCK_DEPS ( MODEM_CLOCKS( 802154_MAC, BT_I154_COMMON_BB, ETM, COEXIST, BT_APB ) ) #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 MODEM_ETM_CLOCK_DEPS ( MODEM_CLOCKS( ETM ) ) #define MODEM_ADC_COMMON_FE_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE ) ) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( BT_I154_COMMON_BB ) ) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( BT_I154_COMMON_BB, BT_APB ) ) #define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( 0 ) #if !defined(SOC_BT_SUPPORTED) && !defined(SOC_IEEE802154_SUPPORTED) #undef PHY_CALIBRATION_BT_I154_CLOCK_DEPS @@ -38,6 +40,7 @@ uint32_t IRAM_ATTR modem_clock_get_module_deps(shared_periph_module_t module) case PERIPH_PHY_CALIBRATION_MODULE: deps = PHY_CALIBRATION_CLOCK_DEPS; break; case PERIPH_IEEE802154_MODULE: deps = IEEE802154_CLOCK_DEPS; break; case PERIPH_MODEM_ETM_MODULE: deps = MODEM_ETM_CLOCK_DEPS; break; + case PERIPH_BT_APB_MODULE: deps = BT_APB_CLOCK_DEPS; break; default: assert(0); } @@ -62,19 +65,27 @@ static esp_err_t IRAM_ATTR modem_clock_ble_mac_check_enable(modem_clock_context_ } #endif -static void IRAM_ATTR modem_clock_ble_i154_bb_configure(modem_clock_context_t *ctx, bool enable) +static void IRAM_ATTR modem_clock_bt_apb_configure(modem_clock_context_t *ctx, bool enable) { modem_syscon_ll_enable_bt_apb_clock(ctx->hal->syscon_dev, enable); - modem_syscon_ll_enable_bt_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_bt_apb_check_enable(modem_clock_context_t *ctx) +{ + return modem_syscon_ll_bt_apb_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; +} +#endif + +static void IRAM_ATTR modem_clock_ble_i154_bb_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_bt_bb_clock(ctx->hal->syscon_dev, enable); } #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING static esp_err_t IRAM_ATTR modem_clock_ble_i154_bb_check_enable(modem_clock_context_t *ctx) { - bool all_clock_enabled = true; - all_clock_enabled &= modem_syscon_ll_bt_apb_clock_is_enabled(ctx->hal->syscon_dev); - all_clock_enabled &= modem_syscon_ll_bt_clock_is_enabled(ctx->hal->syscon_dev); - return all_clock_enabled ? ESP_OK : ESP_FAIL; + return modem_syscon_ll_bt_bb_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; } #endif @@ -177,6 +188,7 @@ static void IRAM_ATTR modem_clock_configure_impl(modem_clock_context_t *ctx, int : (dev_id == MODEM_CLOCK_I2C_MASTER) ? modem_clock_i2c_master_configure : (dev_id == MODEM_CLOCK_ETM) ? modem_clock_etm_configure : (dev_id == MODEM_CLOCK_BLE_MAC) ? modem_clock_ble_mac_configure + : (dev_id == MODEM_CLOCK_BT_APB) ? modem_clock_bt_apb_configure : (dev_id == MODEM_CLOCK_BT_I154_COMMON_BB) ? modem_clock_ble_i154_bb_configure : (dev_id == MODEM_CLOCK_802154_MAC) ? modem_clock_ieee802154_mac_configure : (dev_id == MODEM_CLOCK_DATADUMP) ? modem_clock_data_dump_configure @@ -197,6 +209,7 @@ static esp_err_t IRAM_ATTR modem_clock_check_impl(modem_clock_context_t *ctx, in : (dev_id == MODEM_CLOCK_I2C_MASTER) ? modem_clock_i2c_master_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_APB) ? modem_clock_bt_apb_check_enable : (dev_id == MODEM_CLOCK_BT_I154_COMMON_BB) ? modem_clock_ble_i154_bb_check_enable : (dev_id == MODEM_CLOCK_802154_MAC) ? modem_clock_ieee802154_mac_check_enable : (dev_id == MODEM_CLOCK_DATADUMP) ? modem_clock_data_dump_check_enable 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 2995536d9a3..954e1364dab 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 @@ -12,15 +12,16 @@ /* Clock dependency definitions */ #define WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_MAC, WIFI_APB, WIFI_BB, WIFI_BB_44M, COEXIST, WIFI_BB_80X1, SOC_PLL_SOURCE_CG ) ) -#define BLE_CLOCK_DEPS ( MODEM_CLOCKS( BLE_MAC, BT_I154_COMMON_BB, ETM, COEXIST, WIFI_BB_80X1, SOC_PLL_SOURCE_CG ) ) -#define IEEE802154_CLOCK_DEPS ( MODEM_CLOCKS( 802154_MAC, BT_I154_COMMON_BB, ETM, COEXIST, WIFI_BB_80X1, SOC_PLL_SOURCE_CG ) ) +#define BLE_CLOCK_DEPS ( MODEM_CLOCKS( BLE_MAC, BT_I154_COMMON_BB, ETM, COEXIST, WIFI_BB_80X1, SOC_PLL_SOURCE_CG, BT_APB ) ) +#define BT_APB_CLOCK_DEPS ( MODEM_CLOCKS( BT_APB, ETM ) ) +#define IEEE802154_CLOCK_DEPS ( MODEM_CLOCKS( 802154_MAC, BT_I154_COMMON_BB, ETM, COEXIST, WIFI_BB_80X1, SOC_PLL_SOURCE_CG, BT_APB ) ) #define COEXIST_CLOCK_DEPS ( MODEM_CLOCKS( COEXIST, SOC_PLL_SOURCE_CG ) ) #define I2C_ANA_MST_CLOCK_DEPS ( MODEM_CLOCKS( I2C_MASTER ) ) #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, SOC_PLL_SOURCE_CG ) ) #define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB, WIFI_BB_44M, WIFI_BB_80X1, SOC_PLL_SOURCE_CG ) ) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB_44M, BT_I154_COMMON_BB, SOC_PLL_SOURCE_CG ) ) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB_44M, BT_I154_COMMON_BB, SOC_PLL_SOURCE_CG, BT_APB ) ) #define PHY_CALIBRATION_CLOCK_DEPS ( PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS ) @@ -45,6 +46,7 @@ uint32_t IRAM_ATTR modem_clock_get_module_deps(shared_periph_module_t module) case PERIPH_IEEE802154_MODULE: deps = IEEE802154_CLOCK_DEPS; break; #endif case PERIPH_MODEM_ETM_MODULE: deps = MODEM_ETM_CLOCK_DEPS; break; + case PERIPH_BT_APB_MODULE: deps = BT_APB_CLOCK_DEPS; break; default: assert(0); } @@ -116,6 +118,18 @@ static esp_err_t IRAM_ATTR modem_clock_ble_mac_check_enable(modem_clock_context_ #endif #endif +static void IRAM_ATTR modem_clock_bt_apb_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_bt_apb_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_bt_apb_check_enable(modem_clock_context_t *ctx) +{ + return modem_syscon_ll_bt_apb_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; +} +#endif + #if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT static void IRAM_ATTR modem_clock_wifi_apb_configure(modem_clock_context_t *ctx, bool enable) { @@ -147,17 +161,13 @@ static esp_err_t IRAM_ATTR modem_clock_wifi_bb_44m_check_enable(modem_clock_cont #if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED static void IRAM_ATTR modem_clock_ble_i154_bb_configure(modem_clock_context_t *ctx, bool enable) { - modem_syscon_ll_enable_bt_apb_clock(ctx->hal->syscon_dev, enable); - modem_syscon_ll_enable_bt_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_bt_bb_clock(ctx->hal->syscon_dev, enable); } #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING static esp_err_t IRAM_ATTR modem_clock_ble_i154_bb_check_enable(modem_clock_context_t *ctx) { - bool all_clock_enabled = true; - all_clock_enabled &= modem_syscon_ll_bt_apb_clock_is_enabled(ctx->hal->syscon_dev); - all_clock_enabled &= modem_syscon_ll_bt_clock_is_enabled(ctx->hal->syscon_dev); - return all_clock_enabled ? ESP_OK : ESP_FAIL; + return modem_syscon_ll_bt_bb_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; } #endif #endif @@ -286,6 +296,7 @@ static void IRAM_ATTR modem_clock_configure_impl(modem_clock_context_t *ctx, int : (dev_id == MODEM_CLOCK_ETM) ? modem_clock_etm_configure #if SOC_BT_SUPPORTED : (dev_id == MODEM_CLOCK_BLE_MAC) ? modem_clock_ble_mac_configure + : (dev_id == MODEM_CLOCK_BT_APB) ? modem_clock_bt_apb_configure #endif #if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED : (dev_id == MODEM_CLOCK_BT_I154_COMMON_BB) ? modem_clock_ble_i154_bb_configure @@ -317,6 +328,7 @@ static esp_err_t IRAM_ATTR modem_clock_check_impl(modem_clock_context_t *ctx, in : (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_APB) ? modem_clock_bt_apb_check_enable : (dev_id == MODEM_CLOCK_BT_I154_COMMON_BB) ? modem_clock_ble_i154_bb_check_enable : (dev_id == MODEM_CLOCK_802154_MAC) ? modem_clock_ieee802154_mac_check_enable : (dev_id == MODEM_CLOCK_DATADUMP) ? modem_clock_data_dump_check_enable diff --git a/components/hal/esp32h4/include/hal/modem_syscon_ll.h b/components/hal/esp32h4/include/hal/modem_syscon_ll.h index a97fa5f2c23..6fa8cce6de9 100644 --- a/components/hal/esp32h4/include/hal/modem_syscon_ll.h +++ b/components/hal/esp32h4/include/hal/modem_syscon_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -345,11 +345,10 @@ static inline void modem_syscon_ll_reset_all(modem_syscon_dev_t *hw) hw->modem_rst_conf.val = 0; } - __attribute__((always_inline)) static inline void modem_syscon_ll_clk_conf1_configure(modem_syscon_dev_t *hw, bool en, uint32_t mask) { - if(en){ + if (en) { hw->clk_conf1.val = hw->clk_conf1.val | mask; } else { hw->clk_conf1.val = hw->clk_conf1.val & ~mask; @@ -398,7 +397,6 @@ static inline bool modem_syscon_ll_fe_32m_clock_is_enabled(modem_syscon_dev_t *h return hw->clk_conf1.clk_fe_32m_en; } - __attribute__((always_inline)) static inline void modem_syscon_ll_enable_fe_sdm_clock(modem_syscon_dev_t *hw, bool en) { @@ -453,6 +451,12 @@ static inline void modem_syscon_ll_enable_bt_bb_clock(modem_syscon_dev_t *hw, bo hw->clk_conf1.clk_btbb_en = en; } +__attribute__((always_inline)) +static inline bool modem_syscon_ll_bt_bb_clock_is_enabled(modem_syscon_dev_t *hw) +{ + return hw->clk_conf1.clk_btbb_en; +} + __attribute__((always_inline)) static inline void modem_syscon_ll_enable_bt_mac_clock(modem_syscon_dev_t *hw, bool en) { @@ -465,22 +469,6 @@ static inline bool modem_syscon_ll_bt_mac_clock_is_enabled(modem_syscon_dev_t *h return hw->clk_conf1.clk_btmac_en; } -__attribute__((always_inline)) -static inline void modem_syscon_ll_enable_bt_clock(modem_syscon_dev_t *hw, bool en) -{ - hw->clk_conf1.clk_bt_apb_en = en; - hw->clk_conf1.clk_btbb_en = en; - hw->clk_conf1.clk_btmac_en = en; -} - -__attribute__((always_inline)) -static inline bool modem_syscon_ll_bt_clock_is_enabled(modem_syscon_dev_t *hw) -{ - return hw->clk_conf1.clk_bt_apb_en && - hw->clk_conf1.clk_btbb_en && - hw->clk_conf1.clk_btmac_en; -} - __attribute__((always_inline)) static inline uint32_t modem_syscon_ll_get_date(modem_syscon_dev_t *hw) { diff --git a/components/hal/esp32s31/include/hal/modem_syscon_ll.h b/components/hal/esp32s31/include/hal/modem_syscon_ll.h index 11fe5f0ef88..0799b2ea3d6 100644 --- a/components/hal/esp32s31/include/hal/modem_syscon_ll.h +++ b/components/hal/esp32s31/include/hal/modem_syscon_ll.h @@ -610,13 +610,13 @@ static inline bool modem_syscon_ll_bt_mac_clock_is_enabled(modem_syscon_dev_t *h } __attribute__((always_inline)) -static inline void modem_syscon_ll_enable_bt_clock(modem_syscon_dev_t *hw, bool en) +static inline void modem_syscon_ll_enable_bt_bb_clock(modem_syscon_dev_t *hw, bool en) { hw->clk_conf1.clk_btbb_en = en; } __attribute__((always_inline)) -static inline bool modem_syscon_ll_bt_clock_is_enabled(modem_syscon_dev_t *hw) +static inline bool modem_syscon_ll_bt_bb_clock_is_enabled(modem_syscon_dev_t *hw) { return hw->clk_conf1.clk_btbb_en; } diff --git a/components/soc/esp32h4/include/soc/periph_defs.h b/components/soc/esp32h4/include/soc/periph_defs.h index 4296923405d..cdbc153581d 100644 --- a/components/soc/esp32h4/include/soc/periph_defs.h +++ b/components/soc/esp32h4/include/soc/periph_defs.h @@ -27,12 +27,13 @@ typedef enum { PERIPH_MODEM_ETM_MODULE, PERIPH_MODEM_ADC_COMMON_FE_MODULE, PERIPH_PHY_CALIBRATION_MODULE, + PERIPH_BT_APB_MODULE, PERIPH_MODULE_MAX /* !!! Don't append soc modules here !!! */ } shared_periph_module_t; #define PERIPH_MODEM_MODULE_MIN PERIPH_BT_MODULE -#define PERIPH_MODEM_MODULE_MAX PERIPH_PHY_CALIBRATION_MODULE +#define PERIPH_MODEM_MODULE_MAX PERIPH_BT_APB_MODULE #define PERIPH_MODEM_MODULE_NUM (PERIPH_MODEM_MODULE_MAX - PERIPH_MODEM_MODULE_MIN + 1) #define IS_MODEM_MODULE(periph) ((periph>=PERIPH_MODEM_MODULE_MIN) && (periph<=PERIPH_MODEM_MODULE_MAX)) diff --git a/components/soc/esp32s31/include/soc/periph_defs.h b/components/soc/esp32s31/include/soc/periph_defs.h index 9445a6f494e..6a6c6a650d0 100644 --- a/components/soc/esp32s31/include/soc/periph_defs.h +++ b/components/soc/esp32s31/include/soc/periph_defs.h @@ -29,11 +29,12 @@ typedef enum { PERIPH_MODEM_ETM_MODULE, PERIPH_MODEM_ADC_COMMON_FE_MODULE, PERIPH_PHY_CALIBRATION_MODULE, + PERIPH_BT_APB_MODULE, PERIPH_MODULE_MAX } shared_periph_module_t; #define PERIPH_MODEM_MODULE_MIN PERIPH_WIFI_MODULE -#define PERIPH_MODEM_MODULE_MAX PERIPH_PHY_CALIBRATION_MODULE +#define PERIPH_MODEM_MODULE_MAX PERIPH_BT_APB_MODULE #define PERIPH_MODEM_MODULE_NUM (PERIPH_MODEM_MODULE_MAX - PERIPH_MODEM_MODULE_MIN + 1) #define IS_MODEM_MODULE(periph) ((periph>=PERIPH_MODEM_MODULE_MIN) && (periph<=PERIPH_MODEM_MODULE_MAX))