mirror of
https://github.com/espressif/esp-idf.git
synced 2026-05-28 16:46:31 +03:00
feat(esp_hw_support): add support for SOC_CLOCK_SOURCE_CG and WIFI_BB_80X1 clock in modem clock management
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
// The HAL layer for MODEM CLOCK (ESP32-S31 specific part)
|
||||
#include <stdbool.h>
|
||||
#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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user