change(esp_hw_support): use PM_MODEM_STATE_ENABLED to enable related feature

This commit is contained in:
hebinglin
2026-08-27 23:16:03 +08:00
parent 3f9dfb4649
commit 2b4c200dab
6 changed files with 18 additions and 31 deletions
+1 -1
View File
@@ -50,7 +50,7 @@ entries:
pmu_sleep (noflash) pmu_sleep (noflash)
if PM_SLEEP_CLK_ICG_ENABLE = y && PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP != y: if PM_SLEEP_CLK_ICG_ENABLE = y && PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP != y:
pmu_sleep_clock_icg:pmu_sleep_clock_icg_config (noflash) pmu_sleep_clock_icg:pmu_sleep_clock_icg_config (noflash)
if IDF_TARGET_ESP32H4 = y && BT_LE_MODEM_STATE_ENABLED = y: if IDF_TARGET_ESP32H4 = y && PM_MODEM_STATE_ENABLED = y:
pmu_sleep_power:pmu_sleep_power_analog_wait_config (noflash) pmu_sleep_power:pmu_sleep_power_analog_wait_config (noflash)
pmu_sleep_power:pmu_sleep_power_clock_config (noflash) pmu_sleep_power:pmu_sleep_power_clock_config (noflash)
sleep_mspi (noflash) sleep_mspi (noflash)
@@ -14,7 +14,7 @@ endif()
if(NOT BOOTLOADER_BUILD) if(NOT BOOTLOADER_BUILD)
list(APPEND srcs "sar_periph_ctrl.c") list(APPEND srcs "sar_periph_ctrl.c")
if(CONFIG_BT_LE_MODEM_STATE_ENABLED) if(CONFIG_PM_MODEM_STATE_ENABLED)
list(APPEND srcs "pmu_sleep_power.c") list(APPEND srcs "pmu_sleep_power.c")
endif() endif()
endif() endif()
@@ -250,15 +250,14 @@ static void pmu_sleep_param_init(pmu_context_t *ctx, const pmu_sleep_param_confi
pmu_ll_set_xtal_stable_wait_cycle(ctx->hal->dev, param->hp_lp.xtal_stable_wait_slow_clk_cycle); pmu_ll_set_xtal_stable_wait_cycle(ctx->hal->dev, param->hp_lp.xtal_stable_wait_slow_clk_cycle);
pmu_ll_set_pll_stable_wait_cycle(ctx->hal->dev, param->hp_sys.pll_stable_wait_cycle); pmu_ll_set_pll_stable_wait_cycle(ctx->hal->dev, param->hp_sys.pll_stable_wait_cycle);
#if CONFIG_BT_LE_MODEM_STATE_ENABLED && CONFIG_PM_SKIP_MODEM_TO_ACTIVE_ANALOG_WAIT #if CONFIG_PM_MODEM_STATE_ENABLED
uint16_t ana_wait[ANALOG_WAIT_CTRL_NUM] = { uint16_t ana_wait[ANALOG_WAIT_CTRL_NUM] = {
0x20, // about 1.6us 0x20, // about 1.6us
param->hp_sys.analog_wait_target_cycle, param->hp_sys.analog_wait_target_cycle,
param->hp_sys.analog_wait_target_cycle, param->hp_sys.analog_wait_target_cycle,
}; };
pmu_sleep_power_analog_wait_config(ctx->priv, ana_wait); pmu_sleep_power_analog_wait_config(ctx->priv, ana_wait);
#endif #if SOC_PM_MODEM_LOCK_CLK_WORKAROUND
#if CONFIG_BT_LE_MODEM_STATE_ENABLED && SOC_PM_MODEM_LOCK_CLK_WORKAROUND
pmu_hp_clk_power_reg_t hp_ck = { .val = pmu_ll_hp_get_clk_power(ctx->hal->dev, HP(ACTIVE)) }; pmu_hp_clk_power_reg_t hp_ck = { .val = pmu_ll_hp_get_clk_power(ctx->hal->dev, HP(ACTIVE)) };
uint32_t xtalx2_xpd = pmu_ll_hp_get_xtalx2_xpd(ctx->hal->dev, HP(ACTIVE)); uint32_t xtalx2_xpd = pmu_ll_hp_get_xtalx2_xpd(ctx->hal->dev, HP(ACTIVE));
pmu_imm_hp_clk_power_reg_t imm = { pmu_imm_hp_clk_power_reg_t imm = {
@@ -269,7 +268,9 @@ static void pmu_sleep_param_init(pmu_context_t *ctx, const pmu_sleep_param_confi
.tie_high_global_xtalx2_icg = xtalx2_xpd, .tie_high_global_xtalx2_icg = xtalx2_xpd,
}; };
pmu_sleep_power_clock_config(ctx->priv, imm.val); pmu_sleep_power_clock_config(ctx->priv, imm.val);
#endif #endif // SOC_PM_MODEM_LOCK_CLK_WORKAROUND
#endif // CONFIG_PM_MODEM_STATE_ENABLED
} }
bool pmu_sleep_pll_already_enabled(void) bool pmu_sleep_pll_already_enabled(void)
@@ -56,8 +56,6 @@ static esp_err_t sleep_power_system_retention_init(void *arg)
#endif #endif
#if CONFIG_PM_SKIP_MODEM_TO_ACTIVE_ANALOG_WAIT
#define SLEEP_POWER_ANA_WAIT_LINK_BASE 10 #define SLEEP_POWER_ANA_WAIT_LINK_BASE 10
#define SLEEP_POWER_ANA_WAIT_LINK_ID(_idx) REGDMA_POWER_LINK((SLEEP_POWER_ANA_WAIT_LINK_BASE + (_idx))) #define SLEEP_POWER_ANA_WAIT_LINK_ID(_idx) REGDMA_POWER_LINK((SLEEP_POWER_ANA_WAIT_LINK_BASE + (_idx)))
@@ -89,15 +87,11 @@ static esp_err_t sleep_power_analog_wait_ctrl_init(void *arg)
return ESP_OK; return ESP_OK;
} }
#endif
typedef struct { typedef struct {
#if SOC_PM_MODEM_LOCK_CLK_WORKAROUND #if SOC_PM_MODEM_LOCK_CLK_WORKAROUND
pmu_sleep_power_clock_context_t clock; pmu_sleep_power_clock_context_t clock;
#endif #endif
#if CONFIG_PM_SKIP_MODEM_TO_ACTIVE_ANALOG_WAIT
pmu_sleep_power_ana_wait_context_t ana_wait; pmu_sleep_power_ana_wait_context_t ana_wait;
#endif
} pmu_sleep_power_context_t; } pmu_sleep_power_context_t;
static esp_err_t sleep_power_retention_init(void *arg) static esp_err_t sleep_power_retention_init(void *arg)
@@ -106,9 +100,7 @@ static esp_err_t sleep_power_retention_init(void *arg)
#if SOC_PM_MODEM_LOCK_CLK_WORKAROUND #if SOC_PM_MODEM_LOCK_CLK_WORKAROUND
ESP_RETURN_ON_ERROR(sleep_power_system_retention_init(&ctx->clock), TAG, "system retention init failed"); ESP_RETURN_ON_ERROR(sleep_power_system_retention_init(&ctx->clock), TAG, "system retention init failed");
#endif #endif
#if CONFIG_PM_SKIP_MODEM_TO_ACTIVE_ANALOG_WAIT
ESP_RETURN_ON_ERROR(sleep_power_analog_wait_ctrl_init(&ctx->ana_wait), TAG, "analog wait ctrl retention init failed"); ESP_RETURN_ON_ERROR(sleep_power_analog_wait_ctrl_init(&ctx->ana_wait), TAG, "analog wait ctrl retention init failed");
#endif
return ESP_OK; return ESP_OK;
} }
@@ -120,11 +112,9 @@ static esp_err_t sleep_power_retention_deinit(void *arg)
ctx->clock.regdma_desc[i] = NULL; ctx->clock.regdma_desc[i] = NULL;
} }
#endif #endif
#if CONFIG_PM_SKIP_MODEM_TO_ACTIVE_ANALOG_WAIT
for (int i = 0; i < ANALOG_WAIT_CTRL_NUM; i++) { for (int i = 0; i < ANALOG_WAIT_CTRL_NUM; i++) {
ctx->ana_wait.regdma_desc[i] = NULL; ctx->ana_wait.regdma_desc[i] = NULL;
} }
#endif
return ESP_OK; return ESP_OK;
} }
@@ -146,9 +136,7 @@ ESP_SYSTEM_INIT_FN(sleep_power_startup_init, SECONDARY, BIT(0), 108)
} else { } else {
#if PMU_SLEEP_PRIV_ENABLED #if PMU_SLEEP_PRIV_ENABLED
pmu_sleep_data_t *data = (pmu_sleep_data_t *)PMU_instance()->priv; pmu_sleep_data_t *data = (pmu_sleep_data_t *)PMU_instance()->priv;
#if CONFIG_PM_SKIP_MODEM_TO_ACTIVE_ANALOG_WAIT
data->func[PMU_SLEEP_PRIV_SKIP_MODEM_TO_ACTIVE_ANALOG_WAIT] = &power_context.ana_wait; data->func[PMU_SLEEP_PRIV_SKIP_MODEM_TO_ACTIVE_ANALOG_WAIT] = &power_context.ana_wait;
#endif
#if SOC_PM_MODEM_LOCK_CLK_WORKAROUND #if SOC_PM_MODEM_LOCK_CLK_WORKAROUND
data->func[PMU_SLEEP_PRIV_MODEM_LOCK_CLK_POWER] = &power_context.clock; data->func[PMU_SLEEP_PRIV_MODEM_LOCK_CLK_POWER] = &power_context.clock;
#endif #endif
@@ -158,7 +146,6 @@ ESP_SYSTEM_INIT_FN(sleep_power_startup_init, SECONDARY, BIT(0), 108)
return ESP_OK; return ESP_OK;
} }
#if CONFIG_PM_SKIP_MODEM_TO_ACTIVE_ANALOG_WAIT
void pmu_sleep_power_analog_wait_config(void *data, const uint16_t analog_wait[ANALOG_WAIT_CTRL_NUM]) void pmu_sleep_power_analog_wait_config(void *data, const uint16_t analog_wait[ANALOG_WAIT_CTRL_NUM])
{ {
pmu_sleep_data_t *data_ctx = (pmu_sleep_data_t *)data; pmu_sleep_data_t *data_ctx = (pmu_sleep_data_t *)data;
@@ -174,7 +161,6 @@ void pmu_sleep_power_analog_wait_config(void *data, const uint16_t analog_wait[A
regdma_link_set_write_wait_content(ana_wait_ctx->regdma_desc[i], (uint32_t)analog_wait[i] << PMU_ANA_WAIT_TARGET_S, PMU_ANA_WAIT_TARGET_M); regdma_link_set_write_wait_content(ana_wait_ctx->regdma_desc[i], (uint32_t)analog_wait[i] << PMU_ANA_WAIT_TARGET_S, PMU_ANA_WAIT_TARGET_M);
} }
} }
#endif
#if SOC_PM_MODEM_LOCK_CLK_WORKAROUND #if SOC_PM_MODEM_LOCK_CLK_WORKAROUND
void pmu_sleep_power_clock_config(void *data, const uint32_t config) void pmu_sleep_power_clock_config(void *data, const uint32_t config)
@@ -112,7 +112,7 @@ typedef struct {
const pmu_lp_system_analog_param_t* pmu_lp_system_analog_param_default(pmu_lp_mode_t mode); const pmu_lp_system_analog_param_t* pmu_lp_system_analog_param_default(pmu_lp_mode_t mode);
#if CONFIG_PM_SKIP_MODEM_TO_ACTIVE_ANALOG_WAIT #if CONFIG_PM_MODEM_STATE_ENABLED
#define ANALOG_WAIT_CTRL_NUM 3 // S2M, M2S, M2A #define ANALOG_WAIT_CTRL_NUM 3 // S2M, M2S, M2A
/** /**
* @brief Update content of selected analog wait ctrl REGDMA links. * @brief Update content of selected analog wait ctrl REGDMA links.
@@ -121,7 +121,6 @@ const pmu_lp_system_analog_param_t* pmu_lp_system_analog_param_default(pmu_lp_mo
* @param analog_wait Update analog wait values at S2M, M2S, M2A retention links. * @param analog_wait Update analog wait values at S2M, M2S, M2A retention links.
*/ */
void pmu_sleep_power_analog_wait_config(void *data, const uint16_t analog_wait[ANALOG_WAIT_CTRL_NUM]); void pmu_sleep_power_analog_wait_config(void *data, const uint16_t analog_wait[ANALOG_WAIT_CTRL_NUM]);
#endif
#if SOC_PM_MODEM_LOCK_CLK_WORKAROUND #if SOC_PM_MODEM_LOCK_CLK_WORKAROUND
/** /**
@@ -131,18 +130,20 @@ void pmu_sleep_power_analog_wait_config(void *data, const uint16_t analog_wait[A
* @param config IMM TIE_HIGH bits to write. * @param config IMM TIE_HIGH bits to write.
*/ */
void pmu_sleep_power_clock_config(void *data, const uint32_t config); void pmu_sleep_power_clock_config(void *data, const uint32_t config);
#endif #endif // SOC_PM_MODEM_LOCK_CLK_WORKAROUND
#endif // CONFIG_PM_MODEM_STATE_ENABLED
/* Enabled when this chip needs any pmu_sleep_data_t priv slot; conditions differ per chip. */ /* Enabled when this chip needs any pmu_sleep_data_t priv slot; conditions differ per chip. */
#define PMU_SLEEP_PRIV_ENABLED (CONFIG_PM_SKIP_MODEM_TO_ACTIVE_ANALOG_WAIT || SOC_PM_SUPPORT_PMU_RETENTION_CLK_ICG || SOC_PM_MODEM_LOCK_CLK_WORKAROUND) #define PMU_SLEEP_PRIV_ENABLED (CONFIG_PM_MODEM_STATE_ENABLED || SOC_PM_SUPPORT_PMU_RETENTION_CLK_ICG || SOC_PM_MODEM_LOCK_CLK_WORKAROUND)
#if PMU_SLEEP_PRIV_ENABLED #if PMU_SLEEP_PRIV_ENABLED
enum { enum {
#if CONFIG_PM_SKIP_MODEM_TO_ACTIVE_ANALOG_WAIT #if CONFIG_PM_MODEM_STATE_ENABLED
PMU_SLEEP_PRIV_SKIP_MODEM_TO_ACTIVE_ANALOG_WAIT, PMU_SLEEP_PRIV_SKIP_MODEM_TO_ACTIVE_ANALOG_WAIT,
#endif
#if SOC_PM_MODEM_LOCK_CLK_WORKAROUND #if SOC_PM_MODEM_LOCK_CLK_WORKAROUND
PMU_SLEEP_PRIV_MODEM_LOCK_CLK_POWER, PMU_SLEEP_PRIV_MODEM_LOCK_CLK_POWER,
#endif #endif // SOC_PM_MODEM_LOCK_CLK_WORKAROUND
#endif // CONFIG_PM_MODEM_STATE_ENABLED
#if SOC_PM_SUPPORT_PMU_RETENTION_CLK_ICG #if SOC_PM_SUPPORT_PMU_RETENTION_CLK_ICG
PMU_SLEEP_PRIV_HW_RETENTION_ICG_CLK, PMU_SLEEP_PRIV_HW_RETENTION_ICG_CLK,
#endif #endif
+3 -4
View File
@@ -338,12 +338,11 @@ menu "Power Management"
keeping all other peripheral clocks gated to minimize sleep keeping all other peripheral clocks gated to minimize sleep
power consumption. power consumption.
config PM_SKIP_MODEM_TO_ACTIVE_ANALOG_WAIT config PM_MODEM_STATE_ENABLED
bool bool
depends on SOC_PM_SUPPORT_PMU_MODEM_STATE depends on SOC_PM_SUPPORT_PMU_MODEM_STATE && IDF_TARGET_ESP32H4
default n default n
help help
If enabled, the analog wait time when waking up from modem to active state will be skipped. If enabled, the modem state is supported. Note: This option is only supported on ESP32H4.
This will reduce the wakeup time.
endmenu # "Power Management" endmenu # "Power Management"