5 #include <esp_heap_caps.h> 6 #include <esp_system.h> 7 #include <esp_chip_info.h> 8 #include <esp_partition.h> 10 #if defined(USE_ESP32_VARIANT_ESP32) 11 #include <esp32/rom/rtc.h> 12 #elif defined(USE_ESP32_VARIANT_ESP32C3) 13 #include <esp32c3/rom/rtc.h> 14 #elif defined(USE_ESP32_VARIANT_ESP32C6) 15 #include <esp32c6/rom/rtc.h> 16 #elif defined(USE_ESP32_VARIANT_ESP32S2) 17 #include <esp32s2/rom/rtc.h> 18 #elif defined(USE_ESP32_VARIANT_ESP32S3) 19 #include <esp32s3/rom/rtc.h> 20 #elif defined(USE_ESP32_VARIANT_ESP32H2) 21 #include <esp32h2/rom/rtc.h> 30 static const char *
const TAG =
"debug";
33 ESP_LOGCONFIG(TAG,
"Partition table:");
34 ESP_LOGCONFIG(TAG,
" %-12s %-4s %-8s %-10s %-10s",
"Name",
"Type",
"Subtype",
"Address",
"Size");
35 esp_partition_iterator_t it = esp_partition_find(ESP_PARTITION_TYPE_ANY, ESP_PARTITION_SUBTYPE_ANY, NULL);
37 const esp_partition_t *partition = esp_partition_get(it);
38 ESP_LOGCONFIG(TAG,
" %-12s %-4d %-8d 0x%08" PRIX32
" 0x%08" PRIX32, partition->label, partition->type,
39 partition->subtype, partition->address, partition->size);
40 it = esp_partition_next(it);
42 esp_partition_iterator_release(it);
46 std::string reset_reason;
47 switch (esp_reset_reason()) {
49 reset_reason =
"Reset due to power-on event";
52 reset_reason =
"Reset by external pin";
55 reset_reason =
"Software reset via esp_restart";
58 reset_reason =
"Software reset due to exception/panic";
61 reset_reason =
"Reset (software or hardware) due to interrupt watchdog";
63 case ESP_RST_TASK_WDT:
64 reset_reason =
"Reset due to task watchdog";
67 reset_reason =
"Reset due to other watchdogs";
69 case ESP_RST_DEEPSLEEP:
70 reset_reason =
"Reset after exiting deep sleep mode";
72 case ESP_RST_BROWNOUT:
73 reset_reason =
"Brownout reset (software or hardware)";
76 reset_reason =
"Reset over SDIO";
78 #ifdef USE_ESP32_VARIANT_ESP32 79 #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 4)) 81 reset_reason =
"Reset by USB peripheral";
84 reset_reason =
"Reset by JTAG";
87 reset_reason =
"Reset due to efuse error";
89 case ESP_RST_PWR_GLITCH:
90 reset_reason =
"Reset due to power glitch detected";
92 case ESP_RST_CPU_LOCKUP:
93 reset_reason =
"Reset due to CPU lock up (double exception)";
95 #endif // ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 4) 96 #endif // USE_ESP32_VARIANT_ESP32 98 switch (rtc_get_reset_reason(0)) {
100 reset_reason =
"Power On Reset";
102 #if defined(USE_ESP32_VARIANT_ESP32) 104 #elif defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S2) || \ 105 defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32C6) 106 case RTC_SW_SYS_RESET:
108 reset_reason =
"Software Reset Digital Core";
110 #if defined(USE_ESP32_VARIANT_ESP32) 112 reset_reason =
"Watch Dog Reset Digital Core";
115 case DEEPSLEEP_RESET:
116 reset_reason =
"Deep Sleep Reset Digital Core";
118 #if defined(USE_ESP32_VARIANT_ESP32) 120 reset_reason =
"SLC Module Reset Digital Core";
123 case TG0WDT_SYS_RESET:
124 reset_reason =
"Timer Group 0 Watch Dog Reset Digital Core";
126 case TG1WDT_SYS_RESET:
127 reset_reason =
"Timer Group 1 Watch Dog Reset Digital Core";
129 case RTCWDT_SYS_RESET:
130 reset_reason =
"RTC Watch Dog Reset Digital Core";
132 #if !defined(USE_ESP32_VARIANT_ESP32C6) && !defined(USE_ESP32_VARIANT_ESP32H2) 133 case INTRUSION_RESET:
134 reset_reason =
"Intrusion Reset CPU";
137 #if defined(USE_ESP32_VARIANT_ESP32) 138 case TGWDT_CPU_RESET:
139 reset_reason =
"Timer Group Reset CPU";
141 #elif defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S2) || \ 142 defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32C6) 143 case TG0WDT_CPU_RESET:
144 reset_reason =
"Timer Group 0 Reset CPU";
147 #if defined(USE_ESP32_VARIANT_ESP32) 149 #elif defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S2) || \ 150 defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32C6) 151 case RTC_SW_CPU_RESET:
153 reset_reason =
"Software Reset CPU";
155 case RTCWDT_CPU_RESET:
156 reset_reason =
"RTC Watch Dog Reset CPU";
158 #if defined(USE_ESP32_VARIANT_ESP32) 160 reset_reason =
"External CPU Reset";
163 case RTCWDT_BROWN_OUT_RESET:
164 reset_reason =
"Voltage Unstable Reset";
166 case RTCWDT_RTC_RESET:
167 reset_reason =
"RTC Watch Dog Reset Digital Core And RTC Module";
169 #if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) || \ 170 defined(USE_ESP32_VARIANT_ESP32C6) 171 case TG1WDT_CPU_RESET:
172 reset_reason =
"Timer Group 1 Reset CPU";
174 case SUPER_WDT_RESET:
175 reset_reason =
"Super Watchdog Reset Digital Core And RTC Module";
178 reset_reason =
"eFuse Reset Digital Core";
181 #if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) 182 case GLITCH_RTC_RESET:
183 reset_reason =
"Glitch Reset Digital Core And RTC Module";
186 #if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32C6) 187 case USB_UART_CHIP_RESET:
188 reset_reason =
"USB UART Reset Digital Core";
190 case USB_JTAG_CHIP_RESET:
191 reset_reason =
"USB JTAG Reset Digital Core";
194 #if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S3) 195 case POWER_GLITCH_RESET:
196 reset_reason =
"Power Glitch Reset Digital Core And RTC Module";
200 reset_reason =
"Unknown Reset Reason";
204 ESP_LOGD(TAG,
"Reset Reason: %s", reset_reason.c_str());
211 #if defined(USE_ARDUINO) 212 const char *flash_mode;
213 switch (ESP.getFlashChipMode()) {
227 flash_mode =
"FAST_READ";
230 flash_mode =
"SLOW_READ";
233 flash_mode =
"UNKNOWN";
235 ESP_LOGD(TAG,
"Flash Chip: Size=%ukB Speed=%uMHz Mode=%s",
236 ESP.getFlashChipSize() / 1024,
237 ESP.getFlashChipSpeed() / 1000000, flash_mode);
238 device_info +=
"|Flash: " +
to_string(ESP.getFlashChipSize() / 1024) +
239 "kB Speed:" +
to_string(ESP.getFlashChipSpeed() / 1000000) +
"MHz Mode:";
240 device_info += flash_mode;
243 esp_chip_info_t info;
244 esp_chip_info(&info);
246 #if defined(USE_ESP32_VARIANT_ESP32) 248 #elif defined(USE_ESP32_VARIANT_ESP32C3) 250 #elif defined(USE_ESP32_VARIANT_ESP32C6) 252 #elif defined(USE_ESP32_VARIANT_ESP32S2) 254 #elif defined(USE_ESP32_VARIANT_ESP32S3) 256 #elif defined(USE_ESP32_VARIANT_ESP32H2) 261 std::string features;
262 if (info.features & CHIP_FEATURE_EMB_FLASH) {
263 features +=
"EMB_FLASH,";
264 info.features &= ~CHIP_FEATURE_EMB_FLASH;
266 if (info.features & CHIP_FEATURE_WIFI_BGN) {
267 features +=
"WIFI_BGN,";
268 info.features &= ~CHIP_FEATURE_WIFI_BGN;
270 if (info.features & CHIP_FEATURE_BLE) {
272 info.features &= ~CHIP_FEATURE_BLE;
274 if (info.features & CHIP_FEATURE_BT) {
276 info.features &= ~CHIP_FEATURE_BT;
278 if (info.features & CHIP_FEATURE_EMB_PSRAM) {
279 features +=
"EMB_PSRAM,";
280 info.features &= ~CHIP_FEATURE_EMB_PSRAM;
283 features +=
"Other:" +
format_hex(info.features);
284 ESP_LOGD(TAG,
"Chip: Model=%s, Features=%s Cores=%u, Revision=%u", model, features.c_str(), info.cores,
286 device_info +=
"|Chip: ";
287 device_info += model;
288 device_info +=
" Features:";
289 device_info += features;
290 device_info +=
" Cores:" +
to_string(info.cores);
291 device_info +=
" Revision:" +
to_string(info.revision);
294 device_info +=
"|Framework: ";
296 ESP_LOGD(TAG,
"Framework: Arduino");
297 device_info +=
"Arduino";
298 #elif defined(USE_ESP_IDF) 299 ESP_LOGD(TAG,
"Framework: ESP-IDF");
300 device_info +=
"ESP-IDF";
302 ESP_LOGW(TAG,
"Framework: UNKNOWN");
303 device_info +=
"UNKNOWN";
306 ESP_LOGD(TAG,
"ESP-IDF Version: %s", esp_get_idf_version());
307 device_info +=
"|ESP-IDF: ";
308 device_info += esp_get_idf_version();
311 ESP_LOGD(TAG,
"EFuse MAC: %s", mac.c_str());
312 device_info +=
"|EFuse MAC: ";
315 device_info +=
"|Reset: ";
318 const char *wakeup_reason;
319 switch (rtc_get_wakeup_cause()) {
321 wakeup_reason =
"No Sleep";
323 case EXT_EVENT0_TRIG:
324 wakeup_reason =
"External Event 0";
326 case EXT_EVENT1_TRIG:
327 wakeup_reason =
"External Event 1";
330 wakeup_reason =
"GPIO";
333 wakeup_reason =
"Wakeup Timer";
336 wakeup_reason =
"SDIO";
339 wakeup_reason =
"MAC";
342 wakeup_reason =
"UART0";
345 wakeup_reason =
"UART1";
348 wakeup_reason =
"Touch";
351 wakeup_reason =
"SAR";
354 wakeup_reason =
"BT";
357 wakeup_reason =
"Unknown";
359 ESP_LOGD(TAG,
"Wakeup Reason: %s", wakeup_reason);
360 device_info +=
"|Wakeup: ";
361 device_info += wakeup_reason;
void log_partition_info_()
Logs information about the device's partition table.
std::string format_hex(const uint8_t *data, size_t length)
Format the byte array data of length len in lowercased hex.
void get_device_info_(std::string &device_info)
sensor::Sensor * psram_sensor_
void publish_state(float state)
Publish a new state to the front-end.
uint32_t get_free_heap_()
std::string to_string(int value)
std::string get_reset_reason_()
Implementation of SPI Controller mode.
std::string get_mac_address_pretty()
Get the device MAC address as a string, in colon-separated uppercase hex notation.
sensor::Sensor * block_sensor_