ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
esp32_power_management.cpp
Go to the documentation of this file.
2#ifdef USE_ESP32
3#include "esphome/core/log.h"
4
5#include "esp_private/esp_clk.h"
6#include "soc/rtc.h"
7
9
10ESPHOME_LOG_TAG(TAG, "esp32_power_management");
11
13 if (this->max_freq_mhz_ == 0)
14 this->max_freq_mhz_ = CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ;
15 if (this->min_freq_mhz_ == 0)
16 this->min_freq_mhz_ = esp_clk_xtal_freq() / MHZ;
17 // A low boot frequency (ESP32-H2 at 16 MHz) can sit below the crystal frequency.
18 if (this->min_freq_mhz_ > this->max_freq_mhz_)
19 this->min_freq_mhz_ = this->max_freq_mhz_;
20
21 esp_pm_config_t pm_config = {
22 .max_freq_mhz = this->max_freq_mhz_,
23 .min_freq_mhz = this->min_freq_mhz_,
24#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
25 .light_sleep_enable = true,
26#endif
27 };
28 esp_err_t rc = esp_pm_configure(&pm_config);
29 if (rc != ESP_OK) {
30 // The usual cause is a minimum frequency that does not divide this board's crystal
31 ESP_LOGE(TAG, "esp_pm_configure failed: %s (crystal %u MHz)", esp_err_to_name(rc),
32 static_cast<unsigned>(esp_clk_xtal_freq() / MHZ));
33 this->mark_failed();
34 }
35}
36
38 ESP_LOGCONFIG(TAG,
39 "Power Management:\n"
40 " Max Frequency: %uMHZ\n"
41 " Min Frequency: %uMHZ",
42 this->max_freq_mhz_, this->min_freq_mhz_);
43#if SOC_CLK_XTAL32K_SUPPORTED
44 ESP_LOGCONFIG(TAG, " 32k XTAL: %s",
45 rtc_clk_slow_src_get() == SOC_RTC_SLOW_CLK_SRC_XTAL32K ? LOG_STR_LITERAL("in use")
46 : LOG_STR_LITERAL("not in use"));
47#endif
48#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
49 ESP_LOGCONFIG(TAG, " Light Sleep Enabled");
50#if CONFIG_ESP_SLEEP_POWER_DOWN_FLASH
51 ESP_LOGCONFIG(TAG, " PM Flash Power Down in Light Sleep Enabled");
52#endif
53#if CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP
54 ESP_LOGCONFIG(TAG, " PM Peripheral Power Down in Light Sleep Enabled");
55#endif
56#if CONFIG_IEEE802154_SLEEP_ENABLE
57 ESP_LOGCONFIG(TAG, " ieee802154 Sleep Enabled");
58#endif
59#if CONFIG_PM_PROFILING
60 ESP_LOGCONFIG(TAG, " PM Profiling Enabled");
61#endif
62#if CONFIG_PM_TRACE
63 ESP_LOGCONFIG(TAG, " PM Trace Enabled");
64#endif
65#if defined(CONFIG_LWIP_IPV6) && !defined(CONFIG_LWIP_ND6)
66 ESP_LOGCONFIG(TAG, " IPv6 Neighbor Discovery Disabled (CONFIG_LWIP_ND6)");
67#endif
68#if CONFIG_USJ_NO_AUTO_LS_ON_CONNECTION
69 ESP_LOGCONFIG(TAG, " USB Serial/JTAG Light Sleep Prevention Enabled");
70#endif
71#endif
72}
73
74} // namespace esphome::esp32_power_management
75#endif
void mark_failed()
Mark this component as failed.
ESPHOME_LOG_TAG(TAG, "esp32_power_management")