mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-03 04:34:31 +02:00
fix(esp_hw_support): fix modem wakeup req always high caused by pmu min slp cycle update
This commit is contained in:
@@ -12,6 +12,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "soc/soc_caps.h"
|
#include "soc/soc_caps.h"
|
||||||
|
#include "soc/clk_tree_defs.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@@ -204,18 +205,20 @@ bool pmu_sleep_pll_already_enabled(void);
|
|||||||
* @brief Calculate the hardware time overhead during sleep to compensate for sleep time
|
* @brief Calculate the hardware time overhead during sleep to compensate for sleep time
|
||||||
*
|
*
|
||||||
* @param pd_flags flags indicates the power domain that will be powered down
|
* @param pd_flags flags indicates the power domain that will be powered down
|
||||||
|
* @param slowclk_src slow clock source of pmu
|
||||||
* @param slowclk_period re-calibrated slow clock period
|
* @param slowclk_period re-calibrated slow clock period
|
||||||
* @param fastclk_period re-calibrated fast clock period
|
* @param fastclk_period re-calibrated fast clock period
|
||||||
*
|
*
|
||||||
* @return hardware time overhead in us
|
* @return hardware time overhead in us
|
||||||
*/
|
*/
|
||||||
uint32_t pmu_sleep_calculate_hw_wait_time(uint32_t pd_flags, uint32_t slowclk_period, uint32_t fastclk_period);
|
uint32_t pmu_sleep_calculate_hw_wait_time(uint32_t pd_flags, soc_rtc_slow_clk_src_t slowclk_src, uint32_t slowclk_period, uint32_t fastclk_period);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get default sleep configuration
|
* @brief Get default sleep configuration
|
||||||
* @param config pmu_sleep_config instance
|
* @param config pmu_sleep_config instance
|
||||||
* @param pd_flags flags indicates the power domain that will be powered down
|
* @param pd_flags flags indicates the power domain that will be powered down
|
||||||
* @param adjustment total software and hardware time overhead
|
* @param adjustment total software and hardware time overhead
|
||||||
|
* @param slowclk_src slow clock source of pmu
|
||||||
* @param slowclk_period re-calibrated slow clock period in microseconds,
|
* @param slowclk_period re-calibrated slow clock period in microseconds,
|
||||||
* Q13.19 fixed point format
|
* Q13.19 fixed point format
|
||||||
* @param fastclk_period re-calibrated fast clock period in microseconds,
|
* @param fastclk_period re-calibrated fast clock period in microseconds,
|
||||||
@@ -224,7 +227,7 @@ uint32_t pmu_sleep_calculate_hw_wait_time(uint32_t pd_flags, uint32_t slowclk_pe
|
|||||||
|
|
||||||
* @return hardware time overhead in us
|
* @return hardware time overhead in us
|
||||||
*/
|
*/
|
||||||
const pmu_sleep_config_t* pmu_sleep_config_default(pmu_sleep_config_t *config, uint32_t pd_flags, uint32_t adjustment, uint32_t slowclk_period, uint32_t fastclk_period, bool dslp);
|
const pmu_sleep_config_t* pmu_sleep_config_default(pmu_sleep_config_t *config, uint32_t pd_flags, uint32_t adjustment, soc_rtc_slow_clk_src_t slowclk_src, uint32_t slowclk_period, uint32_t fastclk_period, bool dslp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Prepare the chip to enter sleep mode
|
* @brief Prepare the chip to enter sleep mode
|
||||||
|
@@ -105,7 +105,7 @@ void pmu_sleep_disable_regdma_backup(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t pmu_sleep_calculate_hw_wait_time(uint32_t pd_flags, uint32_t slowclk_period, uint32_t fastclk_period)
|
uint32_t pmu_sleep_calculate_hw_wait_time(uint32_t pd_flags, soc_rtc_slow_clk_src_t slowclk_src, uint32_t slowclk_period, uint32_t fastclk_period)
|
||||||
{
|
{
|
||||||
const pmu_sleep_machine_constant_t *mc = (pmu_sleep_machine_constant_t *)PMU_instance()->mc;
|
const pmu_sleep_machine_constant_t *mc = (pmu_sleep_machine_constant_t *)PMU_instance()->mc;
|
||||||
|
|
||||||
@@ -147,8 +147,20 @@ uint32_t pmu_sleep_calculate_hw_wait_time(uint32_t pd_flags, uint32_t slowclk_pe
|
|||||||
* | wake-up delay |
|
* | wake-up delay |
|
||||||
*/
|
*/
|
||||||
#if SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP
|
#if SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP
|
||||||
|
int min_slp_time_adjustment_us = 0;
|
||||||
|
#if SOC_PM_PMU_MIN_SLP_SLOW_CLK_CYCLE_FIXED
|
||||||
|
if (slowclk_src == SOC_RTC_SLOW_CLK_SRC_RC_SLOW) {
|
||||||
|
const uint32_t slowclk_period_fixed = rtc_clk_freq_to_period(SOC_CLK_RC_SLOW_FREQ_APPROX);
|
||||||
|
const int min_slp_cycle_fixed = rtc_time_us_to_slowclk(mc->hp.min_slp_time_us, slowclk_period_fixed);
|
||||||
|
const int min_slp_cycle_calib = rtc_time_us_to_slowclk(mc->hp.min_slp_time_us, slowclk_period);
|
||||||
|
const int min_slp_cycle_diff = (min_slp_cycle_calib > min_slp_cycle_fixed) ? \
|
||||||
|
(min_slp_cycle_calib - min_slp_cycle_fixed) : (min_slp_cycle_fixed - min_slp_cycle_calib);
|
||||||
|
const int min_slp_time_diff = rtc_time_slowclk_to_us(min_slp_cycle_diff, slowclk_period_fixed);
|
||||||
|
min_slp_time_adjustment_us = (min_slp_cycle_calib > min_slp_cycle_fixed) ? min_slp_time_diff : -min_slp_time_diff;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
const int rf_on_protect_time_us = mc->hp.regdma_rf_on_work_time_us;
|
const int rf_on_protect_time_us = mc->hp.regdma_rf_on_work_time_us;
|
||||||
const int total_hw_wait_time_us = lp_hw_wait_time_us + hp_hw_wait_time_us + mc->hp.clock_domain_sync_time_us;
|
const int total_hw_wait_time_us = lp_hw_wait_time_us + hp_hw_wait_time_us + mc->hp.clock_domain_sync_time_us + min_slp_time_adjustment_us;
|
||||||
#else
|
#else
|
||||||
const int rf_on_protect_time_us = 0;
|
const int rf_on_protect_time_us = 0;
|
||||||
const int total_hw_wait_time_us = lp_hw_wait_time_us + hp_hw_wait_time_us;
|
const int total_hw_wait_time_us = lp_hw_wait_time_us + hp_hw_wait_time_us;
|
||||||
@@ -163,24 +175,31 @@ static inline pmu_sleep_param_config_t * pmu_sleep_param_config_default(
|
|||||||
pmu_sleep_power_config_t *power, /* We'll use the runtime power parameter to determine some hardware parameters */
|
pmu_sleep_power_config_t *power, /* We'll use the runtime power parameter to determine some hardware parameters */
|
||||||
const uint32_t pd_flags,
|
const uint32_t pd_flags,
|
||||||
const uint32_t adjustment,
|
const uint32_t adjustment,
|
||||||
|
soc_rtc_slow_clk_src_t slowclk_src,
|
||||||
const uint32_t slowclk_period,
|
const uint32_t slowclk_period,
|
||||||
const uint32_t fastclk_period
|
const uint32_t fastclk_period
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const pmu_sleep_machine_constant_t *mc = (pmu_sleep_machine_constant_t *)PMU_instance()->mc;
|
const pmu_sleep_machine_constant_t *mc = (pmu_sleep_machine_constant_t *)PMU_instance()->mc;
|
||||||
|
|
||||||
param->hp_sys.min_slp_slow_clk_cycle = rtc_time_us_to_slowclk(mc->hp.min_slp_time_us, slowclk_period);
|
#if (SOC_PM_PMU_MIN_SLP_SLOW_CLK_CYCLE_FIXED && SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP)
|
||||||
|
const uint32_t slowclk_period_fixed = (slowclk_src == SOC_RTC_SLOW_CLK_SRC_RC_SLOW) ? rtc_clk_freq_to_period(SOC_CLK_RC_SLOW_FREQ_APPROX) : slowclk_period;
|
||||||
|
#else
|
||||||
|
const uint32_t slowclk_period_fixed = slowclk_period;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
param->hp_sys.min_slp_slow_clk_cycle = rtc_time_us_to_slowclk(mc->hp.min_slp_time_us, slowclk_period_fixed);
|
||||||
param->hp_sys.analog_wait_target_cycle = rtc_time_us_to_fastclk(mc->hp.analog_wait_time_us, fastclk_period);
|
param->hp_sys.analog_wait_target_cycle = rtc_time_us_to_fastclk(mc->hp.analog_wait_time_us, fastclk_period);
|
||||||
param->hp_sys.digital_power_supply_wait_cycle = rtc_time_us_to_fastclk(mc->hp.power_supply_wait_time_us, fastclk_period);
|
param->hp_sys.digital_power_supply_wait_cycle = rtc_time_us_to_fastclk(mc->hp.power_supply_wait_time_us, fastclk_period);
|
||||||
param->hp_sys.digital_power_up_wait_cycle = rtc_time_us_to_fastclk(mc->hp.power_up_wait_time_us, fastclk_period);
|
param->hp_sys.digital_power_up_wait_cycle = rtc_time_us_to_fastclk(mc->hp.power_up_wait_time_us, fastclk_period);
|
||||||
param->hp_sys.pll_stable_wait_cycle = rtc_time_us_to_fastclk(mc->hp.pll_wait_stable_time_us, fastclk_period);
|
param->hp_sys.pll_stable_wait_cycle = rtc_time_us_to_fastclk(mc->hp.pll_wait_stable_time_us, fastclk_period);
|
||||||
|
|
||||||
const int hw_wait_time_us = pmu_sleep_calculate_hw_wait_time(pd_flags, slowclk_period, fastclk_period);
|
const int hw_wait_time_us = pmu_sleep_calculate_hw_wait_time(pd_flags, slowclk_src, slowclk_period, fastclk_period);
|
||||||
const int modem_state_skip_time_us = mc->hp.regdma_m2a_work_time_us + mc->hp.system_dfs_up_work_time_us + mc->lp.min_slp_time_us;
|
const int modem_state_skip_time_us = mc->hp.regdma_m2a_work_time_us + mc->hp.system_dfs_up_work_time_us + mc->lp.min_slp_time_us;
|
||||||
const int modem_wakeup_wait_time_us = adjustment - hw_wait_time_us + modem_state_skip_time_us + mc->hp.regdma_rf_on_work_time_us;
|
const int modem_wakeup_wait_time_us = adjustment - hw_wait_time_us + modem_state_skip_time_us + mc->hp.regdma_rf_on_work_time_us;
|
||||||
param->hp_sys.modem_wakeup_wait_cycle = rtc_time_us_to_fastclk(modem_wakeup_wait_time_us, fastclk_period);
|
param->hp_sys.modem_wakeup_wait_cycle = rtc_time_us_to_fastclk(modem_wakeup_wait_time_us, fastclk_period);
|
||||||
|
|
||||||
param->lp_sys.min_slp_slow_clk_cycle = rtc_time_us_to_slowclk(mc->lp.min_slp_time_us, slowclk_period);
|
param->lp_sys.min_slp_slow_clk_cycle = rtc_time_us_to_slowclk(mc->lp.min_slp_time_us, slowclk_period_fixed);
|
||||||
param->lp_sys.analog_wait_target_cycle = rtc_time_us_to_slowclk(mc->lp.analog_wait_time_us, slowclk_period);
|
param->lp_sys.analog_wait_target_cycle = rtc_time_us_to_slowclk(mc->lp.analog_wait_time_us, slowclk_period);
|
||||||
param->lp_sys.digital_power_supply_wait_cycle = rtc_time_us_to_fastclk(mc->lp.power_supply_wait_time_us, fastclk_period);
|
param->lp_sys.digital_power_supply_wait_cycle = rtc_time_us_to_fastclk(mc->lp.power_supply_wait_time_us, fastclk_period);
|
||||||
param->lp_sys.digital_power_up_wait_cycle = rtc_time_us_to_fastclk(mc->lp.power_up_wait_time_us, fastclk_period);
|
param->lp_sys.digital_power_up_wait_cycle = rtc_time_us_to_fastclk(mc->lp.power_up_wait_time_us, fastclk_period);
|
||||||
@@ -197,6 +216,7 @@ const pmu_sleep_config_t* pmu_sleep_config_default(
|
|||||||
pmu_sleep_config_t *config,
|
pmu_sleep_config_t *config,
|
||||||
uint32_t pd_flags,
|
uint32_t pd_flags,
|
||||||
uint32_t adjustment,
|
uint32_t adjustment,
|
||||||
|
soc_rtc_slow_clk_src_t slowclk_src,
|
||||||
uint32_t slowclk_period,
|
uint32_t slowclk_period,
|
||||||
uint32_t fastclk_period,
|
uint32_t fastclk_period,
|
||||||
bool dslp
|
bool dslp
|
||||||
@@ -207,7 +227,7 @@ const pmu_sleep_config_t* pmu_sleep_config_default(
|
|||||||
config->power = power_default;
|
config->power = power_default;
|
||||||
|
|
||||||
pmu_sleep_param_config_t param_default = PMU_SLEEP_PARAM_CONFIG_DEFAULT(pd_flags);
|
pmu_sleep_param_config_t param_default = PMU_SLEEP_PARAM_CONFIG_DEFAULT(pd_flags);
|
||||||
config->param = *pmu_sleep_param_config_default(¶m_default, &power_default, pd_flags, adjustment, slowclk_period, fastclk_period);
|
config->param = *pmu_sleep_param_config_default(¶m_default, &power_default, pd_flags, adjustment, slowclk_src, slowclk_period, fastclk_period);
|
||||||
|
|
||||||
if (dslp) {
|
if (dslp) {
|
||||||
config->param.lp_sys.analog_wait_target_cycle = rtc_time_us_to_slowclk(PMU_LP_ANALOG_WAIT_TARGET_TIME_DSLP_US, slowclk_period);
|
config->param.lp_sys.analog_wait_target_cycle = rtc_time_us_to_slowclk(PMU_LP_ANALOG_WAIT_TARGET_TIME_DSLP_US, slowclk_period);
|
||||||
|
@@ -63,7 +63,7 @@ void pmu_sleep_disable_regdma_backup(void)
|
|||||||
pmu_hal_hp_set_sleep_active_backup_disable(PMU_instance()->hal);
|
pmu_hal_hp_set_sleep_active_backup_disable(PMU_instance()->hal);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t pmu_sleep_calculate_hw_wait_time(uint32_t pd_flags, uint32_t slowclk_period, uint32_t fastclk_period)
|
uint32_t pmu_sleep_calculate_hw_wait_time(uint32_t pd_flags, soc_rtc_slow_clk_src_t slowclk_src, uint32_t slowclk_period, uint32_t fastclk_period)
|
||||||
{
|
{
|
||||||
pmu_sleep_machine_constant_t *mc = (pmu_sleep_machine_constant_t *)PMU_instance()->mc;
|
pmu_sleep_machine_constant_t *mc = (pmu_sleep_machine_constant_t *)PMU_instance()->mc;
|
||||||
|
|
||||||
@@ -129,6 +129,7 @@ const pmu_sleep_config_t* pmu_sleep_config_default(
|
|||||||
pmu_sleep_config_t *config,
|
pmu_sleep_config_t *config,
|
||||||
uint32_t pd_flags,
|
uint32_t pd_flags,
|
||||||
uint32_t adjustment,
|
uint32_t adjustment,
|
||||||
|
soc_rtc_slow_clk_src_t slowclk_src,
|
||||||
uint32_t slowclk_period,
|
uint32_t slowclk_period,
|
||||||
uint32_t fastclk_period,
|
uint32_t fastclk_period,
|
||||||
bool dslp
|
bool dslp
|
||||||
|
@@ -879,7 +879,7 @@ static esp_err_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags, esp_sleep_mode_t m
|
|||||||
#if SOC_PMU_SUPPORTED
|
#if SOC_PMU_SUPPORTED
|
||||||
pmu_sleep_config_t config;
|
pmu_sleep_config_t config;
|
||||||
pmu_sleep_init(pmu_sleep_config_default(&config, sleep_flags, s_config.sleep_time_adjustment,
|
pmu_sleep_init(pmu_sleep_config_default(&config, sleep_flags, s_config.sleep_time_adjustment,
|
||||||
s_config.rtc_clk_cal_period, s_config.fast_clk_cal_period,
|
rtc_clk_slow_src_get(), s_config.rtc_clk_cal_period, s_config.fast_clk_cal_period,
|
||||||
deep_sleep), deep_sleep);
|
deep_sleep), deep_sleep);
|
||||||
#else
|
#else
|
||||||
rtc_sleep_config_t config;
|
rtc_sleep_config_t config;
|
||||||
@@ -1289,7 +1289,7 @@ esp_err_t esp_light_sleep_start(void)
|
|||||||
*/
|
*/
|
||||||
#if SOC_PMU_SUPPORTED
|
#if SOC_PMU_SUPPORTED
|
||||||
int sleep_time_sw_adjustment = LIGHT_SLEEP_TIME_OVERHEAD_US + sleep_time_overhead_in + s_config.sleep_time_overhead_out;
|
int sleep_time_sw_adjustment = LIGHT_SLEEP_TIME_OVERHEAD_US + sleep_time_overhead_in + s_config.sleep_time_overhead_out;
|
||||||
int sleep_time_hw_adjustment = pmu_sleep_calculate_hw_wait_time(pd_flags, s_config.rtc_clk_cal_period, s_config.fast_clk_cal_period);
|
int sleep_time_hw_adjustment = pmu_sleep_calculate_hw_wait_time(pd_flags, rtc_clk_slow_src_get(), s_config.rtc_clk_cal_period, s_config.fast_clk_cal_period);
|
||||||
s_config.sleep_time_adjustment = sleep_time_sw_adjustment + sleep_time_hw_adjustment;
|
s_config.sleep_time_adjustment = sleep_time_sw_adjustment + sleep_time_hw_adjustment;
|
||||||
#else
|
#else
|
||||||
uint32_t rtc_cntl_xtl_buf_wait_slp_cycles = rtc_time_us_to_slowclk(RTC_CNTL_XTL_BUF_WAIT_SLP_US, s_config.rtc_clk_cal_period);
|
uint32_t rtc_cntl_xtl_buf_wait_slp_cycles = rtc_time_us_to_slowclk(RTC_CNTL_XTL_BUF_WAIT_SLP_US, s_config.rtc_clk_cal_period);
|
||||||
|
@@ -1295,6 +1295,10 @@ config SOC_PM_PAU_REGDMA_UPDATE_CACHE_BEFORE_WAIT_COMPARE
|
|||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
|
config SOC_PM_PMU_MIN_SLP_SLOW_CLK_CYCLE_FIXED
|
||||||
|
bool
|
||||||
|
default y
|
||||||
|
|
||||||
config SOC_CLK_RC_FAST_SUPPORT_CALIBRATION
|
config SOC_CLK_RC_FAST_SUPPORT_CALIBRATION
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
@@ -529,6 +529,7 @@
|
|||||||
#define SOC_PM_PAU_LINK_NUM (4)
|
#define SOC_PM_PAU_LINK_NUM (4)
|
||||||
|
|
||||||
#define SOC_PM_PAU_REGDMA_UPDATE_CACHE_BEFORE_WAIT_COMPARE (1)
|
#define SOC_PM_PAU_REGDMA_UPDATE_CACHE_BEFORE_WAIT_COMPARE (1)
|
||||||
|
#define SOC_PM_PMU_MIN_SLP_SLOW_CLK_CYCLE_FIXED (1)
|
||||||
|
|
||||||
/*-------------------------- CLOCK SUBSYSTEM CAPS ----------------------------------------*/
|
/*-------------------------- CLOCK SUBSYSTEM CAPS ----------------------------------------*/
|
||||||
#define SOC_CLK_RC_FAST_SUPPORT_CALIBRATION (1)
|
#define SOC_CLK_RC_FAST_SUPPORT_CALIBRATION (1)
|
||||||
|
Reference in New Issue
Block a user