|
43 | 43 | #define HP(state) (PMU_MODE_HP_ ## state) |
44 | 44 | #define LP(state) (PMU_MODE_LP_ ## state) |
45 | 45 |
|
| 46 | +#define DCDC_STARTUP_TIME_US (950) |
46 | 47 |
|
47 | 48 | static bool s_pmu_sleep_regdma_backup_enabled; |
48 | 49 |
|
@@ -194,16 +195,9 @@ const pmu_sleep_config_t* pmu_sleep_config_default( |
194 | 195 | analog_default.lp_sys[LP(SLEEP)].analog.pd_cur = PMU_PD_CUR_SLEEP_ON; |
195 | 196 | analog_default.lp_sys[LP(SLEEP)].analog.bias_sleep = PMU_BIASSLP_SLEEP_ON; |
196 | 197 | analog_default.lp_sys[LP(SLEEP)].analog.dbg_atten = PMU_DBG_ATTEN_ACTIVE_DEFAULT; |
197 | | -#if !CONFIG_ESP_SLEEP_KEEP_DCDC_ALWAYS_ON |
198 | | - analog_default.lp_sys[LP(SLEEP)].analog.dbias = LP_CALI_ACTIVE_DBIAS_DEFAULT; |
199 | | -#endif |
200 | 198 | } |
201 | | - |
202 | | -#if CONFIG_ESP_SLEEP_KEEP_DCDC_ALWAYS_ON |
203 | 199 | power_default.hp_sys.dig_power.dcdc_switch_pd_en = 0; |
204 | 200 | analog_default.hp_sys.analog.dcm_vset = CONFIG_ESP_SLEEP_DCM_VSET_VAL_IN_SLEEP; |
205 | | - analog_default.hp_sys.analog.dcm_mode = 1; |
206 | | -#endif |
207 | 201 | if (sleep_flags & PMU_SLEEP_PD_VDDSDIO) { |
208 | 202 | analog_default.hp_sys.analog.xpd_0p1a = 0; |
209 | 203 | } else { |
@@ -275,6 +269,10 @@ static void pmu_sleep_digital_init(pmu_context_t *ctx, const pmu_sleep_digital_c |
275 | 269 | static void pmu_sleep_analog_init(pmu_context_t *ctx, const pmu_sleep_analog_config_t *analog, bool dslp) |
276 | 270 | { |
277 | 271 | assert(ctx->hal); |
| 272 | + /* For deepsleep, DCDC_EN will be controlled by software to avoid DCDC working in a non-feedback state, |
| 273 | + which may cause input glitch voltage when waking up and switching to LDO. After chip wake up from deepsleep, |
| 274 | + set DCDC_EN in rtc_clk_init. */ |
| 275 | + pmu_ll_hp_set_dcm_mode (ctx->hal->dev, HP(ACTIVE), dslp ? 0 : 1); |
278 | 276 | pmu_ll_hp_set_dcm_mode (ctx->hal->dev, HP(SLEEP), analog->hp_sys.analog.dcm_mode); |
279 | 277 | pmu_ll_hp_set_dcm_vset (ctx->hal->dev, HP(SLEEP), analog->hp_sys.analog.dcm_vset); |
280 | 278 | pmu_ll_hp_set_current_power_off (ctx->hal->dev, HP(SLEEP), analog->hp_sys.analog.pd_cur); |
@@ -340,7 +338,7 @@ void pmu_sleep_increase_ldo_volt(void) { |
340 | 338 | } |
341 | 339 |
|
342 | 340 | void pmu_sleep_shutdown_dcdc(void) { |
343 | | - pmu_ll_set_dcdc_switch_force_power_down(&PMU, true); |
| 341 | + // Keep dcdc_switch on, will be disabled by PMU when entered sleep. |
344 | 342 | pmu_ll_set_dcdc_en(&PMU, false); |
345 | 343 | // Decrease hp_ldo voltage. |
346 | 344 | pmu_ll_hp_set_regulator_dbias(&PMU, PMU_MODE_HP_ACTIVE, HP_CALI_ACTIVE_DBIAS_DEFAULT); |
@@ -442,18 +440,13 @@ TCM_IRAM_ATTR uint32_t pmu_sleep_start(uint32_t wakeup_opt, uint32_t reject_opt, |
442 | 440 |
|
443 | 441 | TCM_IRAM_ATTR bool pmu_sleep_finish(bool dslp) |
444 | 442 | { |
445 | | -#if CONFIG_ESP_SLEEP_KEEP_DCDC_ALWAYS_ON |
446 | | - if (!dslp) { |
447 | | - // Keep DCDC always on during light sleep, no need to adjust LDO. |
448 | | - } else |
449 | | -#endif |
450 | | - { |
| 443 | + if (dslp) { |
451 | 444 | pmu_ll_hp_set_dcm_vset(&PMU, PMU_MODE_HP_ACTIVE, HP_CALI_ACTIVE_DCM_VSET_DEFAULT); |
452 | 445 | pmu_sleep_enable_dcdc(); |
453 | 446 | if (pmu_ll_hp_is_sleep_reject(&PMU)) { |
454 | | - // If sleep is rejected, the hardware wake-up process that turns on DCDC |
455 | | - // is skipped, and wait DCDC volt rise up by software here. |
456 | | - esp_rom_delay_us(950); |
| 447 | + // If sleep is rejected or regdma restore is skipped, the hardware wake-up process that |
| 448 | + // turns on DCDC is skipped, and wait DCDC volt rise up by software here. |
| 449 | + esp_rom_delay_us(DCDC_STARTUP_TIME_US); |
457 | 450 | } |
458 | 451 | pmu_sleep_shutdown_ldo(); |
459 | 452 | } |
|
0 commit comments