Skip to content

Commit 8478823

Browse files
committed
Merge branch 'bugfix/dfs_rtc_fixes' into 'master'
DFS related fixes See merge request idf/esp-idf!2102
2 parents aa3c77e + 1618dbc commit 8478823

File tree

2 files changed

+20
-8
lines changed

2 files changed

+20
-8
lines changed

components/esp32/pm_esp32.c

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,9 @@ static bool s_core_idle[portNUM_PROCESSORS];
8282
extern uint32_t g_ticks_per_us_pro;
8383

8484
/* Lookup table of CPU frequencies to be used in each mode.
85-
* Modified by esp_pm_configure.
85+
* Initialized by esp_pm_impl_init and modified by esp_pm_configure.
8686
*/
87-
rtc_cpu_freq_t s_cpu_freq_by_mode[PM_MODE_COUNT] = {
88-
[PM_MODE_LIGHT_SLEEP] = (rtc_cpu_freq_t) -1, /* unused */
89-
[PM_MODE_APB_MIN] = RTC_CPU_FREQ_XTAL,
90-
[PM_MODE_APB_MAX] = RTC_CPU_FREQ_80M,
91-
[PM_MODE_CPU_MAX] = RTC_CPU_FREQ_80M,
92-
};
87+
rtc_cpu_freq_t s_cpu_freq_by_mode[PM_MODE_COUNT];
9388

9489
/* Lookup table of CPU ticks per microsecond for each RTC_CPU_FREQ_ value.
9590
* Essentially the same as returned by rtc_clk_cpu_freq_value(), but without
@@ -192,6 +187,7 @@ esp_err_t esp_pm_configure(const void* vconfig)
192187
s_cpu_freq_by_mode[PM_MODE_CPU_MAX] = max_freq;
193188
s_cpu_freq_by_mode[PM_MODE_APB_MAX] = apb_max_freq;
194189
s_cpu_freq_by_mode[PM_MODE_APB_MIN] = min_freq;
190+
s_cpu_freq_by_mode[PM_MODE_LIGHT_SLEEP] = min_freq;
195191
s_light_sleep_en = config->light_sleep_enable;
196192
portEXIT_CRITICAL(&s_switch_lock);
197193

@@ -430,9 +426,15 @@ void esp_pm_impl_dump_stats(FILE* out)
430426

431427
time_in_mode[cur_mode] += now - last_mode_change_time;
432428

429+
fprintf(out, "Mode stats:\n");
433430
for (int i = 0; i < PM_MODE_COUNT; ++i) {
434-
fprintf(out, "%8s %12lld %2d%%\n",
431+
if (i == PM_MODE_LIGHT_SLEEP && !s_light_sleep_en) {
432+
/* don't display light sleep mode if it's not enabled */
433+
continue;
434+
}
435+
fprintf(out, "%8s %6s %12lld %2d%%\n",
435436
s_mode_names[i],
437+
s_freq_names[s_cpu_freq_by_mode[i]],
436438
time_in_mode[i],
437439
(int) (time_in_mode[i] * 100 / now));
438440
}
@@ -452,5 +454,14 @@ void esp_pm_impl_init()
452454
ESP_ERROR_CHECK(esp_pm_lock_create(ESP_PM_CPU_FREQ_MAX, 0, "rtos1",
453455
&s_rtos_lock_handle[1]));
454456
ESP_ERROR_CHECK(esp_pm_lock_acquire(s_rtos_lock_handle[1]));
457+
458+
/* Configure all modes to use the default CPU frequency.
459+
* This will be modified later by a call to esp_pm_configure.
460+
*/
461+
rtc_cpu_freq_t default_freq;
462+
assert(rtc_clk_cpu_freq_from_mhz(CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ, &default_freq));
463+
for (size_t i = 0; i < PM_MODE_COUNT; ++i) {
464+
s_cpu_freq_by_mode[i] = default_freq;
465+
}
455466
#endif // portNUM_PROCESSORS == 2
456467
}

components/soc/esp32/rtc_clk.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,7 @@ void rtc_clk_cpu_freq_set_fast(rtc_cpu_freq_t cpu_freq)
402402
rtc_clk_cpu_freq_to_xtal();
403403
} else if (cpu_freq > RTC_CPU_FREQ_XTAL) {
404404
rtc_clk_cpu_freq_to_pll(cpu_freq);
405+
rtc_clk_wait_for_slow_cycle();
405406
}
406407
}
407408

0 commit comments

Comments
 (0)