ESPHome 2026.9.0-dev
Loading...
Searching...
No Matches
debug_rp2.cpp
Go to the documentation of this file.
1#include "debug_component.h"
2#ifdef USE_RP2
5#include "esphome/core/log.h"
6#include <hardware/clocks.h>
7#include <hardware/watchdog.h>
8#if defined(PICO_RP2350)
9#include <hardware/structs/powman.h>
10#else
11#include <hardware/structs/vreg_and_chip_reset.h>
12#endif
13#ifdef USE_RP2_CRASH_HANDLER
15#endif
16namespace esphome::debug {
17
18static const char *const TAG = "debug";
19
20const char *DebugComponent::get_reset_reason_(std::span<char, RESET_REASON_BUFFER_SIZE> buffer) {
21 char *buf = buffer.data();
22 const size_t size = RESET_REASON_BUFFER_SIZE;
23 size_t pos = 0;
24
25#if defined(PICO_RP2350)
26 uint32_t chip_reset = powman_hw->chip_reset;
27 if (chip_reset & 0x04000000) // HAD_GLITCH_DETECT
28 pos = buf_append_str(buf, size, pos, "Power supply glitch|");
29 if (chip_reset & 0x00040000) // HAD_RUN_LOW
30 pos = buf_append_str(buf, size, pos, "RUN pin|");
31 if (chip_reset & 0x00020000) // HAD_BOR
32 pos = buf_append_str(buf, size, pos, "Brown-out|");
33 if (chip_reset & 0x00010000) // HAD_POR
34 pos = buf_append_str(buf, size, pos, "Power-on reset|");
35#else
36 uint32_t chip_reset = vreg_and_chip_reset_hw->chip_reset;
37 if (chip_reset & 0x00010000) // HAD_RUN
38 pos = buf_append_str(buf, size, pos, "RUN pin|");
39 if (chip_reset & 0x00000100) // HAD_POR
40 pos = buf_append_str(buf, size, pos, "Power-on reset|");
41#endif
42
43 if (watchdog_caused_reboot()) {
44 bool handled = false;
45#ifdef USE_RP2_CRASH_HANDLER
47 pos = buf_append_str(buf, size, pos, "Crash (HardFault)|");
48 handled = true;
49 }
50#endif
51 if (!handled) {
52 if (watchdog_enable_caused_reboot()) {
53 pos = buf_append_str(buf, size, pos, "Watchdog timeout|");
54 } else {
55 pos = buf_append_str(buf, size, pos, "Software reset|");
56 }
57 }
58 }
59
60 // Remove trailing '|'
61 if (pos > 0 && buf[pos - 1] == '|') {
62 buf[pos - 1] = '\0';
63 } else if (pos == 0) {
64 return "Unknown";
65 }
66
67 return buf;
68}
69
70const char *DebugComponent::get_wakeup_cause_(std::span<char, WAKEUP_CAUSE_BUFFER_SIZE> buffer) { return ""; }
71
72// RAMAllocator already implements the free-heap calculation for this platform, so it is not duplicated here.
73uint32_t DebugComponent::get_free_heap_() { return RAMAllocator<uint8_t>().get_free_heap_size(); }
74
75size_t DebugComponent::get_device_info_(std::span<char, DEVICE_INFO_BUFFER_SIZE> buffer, size_t pos) {
76 constexpr size_t size = DEVICE_INFO_BUFFER_SIZE;
77 char *buf = buffer.data();
78
79 uint32_t cpu_freq = clock_get_hz(clk_sys);
80 ESP_LOGD(TAG, "CPU Frequency: %" PRIu32, cpu_freq);
81 pos = buf_append_printf(buf, size, pos, "|CPU Frequency: %" PRIu32, cpu_freq);
82
83 return pos;
84}
85
87
88} // namespace esphome::debug
89#endif
const char * get_wakeup_cause_(std::span< char, WAKEUP_CAUSE_BUFFER_SIZE > buffer)
size_t get_device_info_(std::span< char, DEVICE_INFO_BUFFER_SIZE > buffer, size_t pos)
const char * get_reset_reason_(std::span< char, RESET_REASON_BUFFER_SIZE > buffer)
bool crash_handler_has_data()
Returns true if crash data was found this boot.
size_t buf_append_str(char *buf, size_t size, size_t pos, const char *str)
Safely append a string to buffer, returning new position (capped at size).
Definition helpers.h:1141
uint16_t size
Definition helpers.cpp:25
size_t size_t pos
Definition helpers.h:1092
static void uint32_t