ESPHome 2026.5.0b1
Loading...
Searching...
No Matches
debug_rp2040.cpp
Go to the documentation of this file.
1#include "debug_component.h"
2#ifdef USE_RP2040
4#include "esphome/core/log.h"
5#include <Arduino.h>
6#include <hardware/watchdog.h>
7#if defined(PICO_RP2350)
8#include <hardware/structs/powman.h>
9#else
10#include <hardware/structs/vreg_and_chip_reset.h>
11#endif
12#ifdef USE_RP2040_CRASH_HANDLER
14#endif
15namespace esphome::debug {
16
17static const char *const TAG = "debug";
18
19const char *DebugComponent::get_reset_reason_(std::span<char, RESET_REASON_BUFFER_SIZE> buffer) {
20 char *buf = buffer.data();
21 const size_t size = RESET_REASON_BUFFER_SIZE;
22 size_t pos = 0;
23
24#if defined(PICO_RP2350)
25 uint32_t chip_reset = powman_hw->chip_reset;
26 if (chip_reset & 0x04000000) // HAD_GLITCH_DETECT
27 pos = buf_append_str(buf, size, pos, "Power supply glitch|");
28 if (chip_reset & 0x00040000) // HAD_RUN_LOW
29 pos = buf_append_str(buf, size, pos, "RUN pin|");
30 if (chip_reset & 0x00020000) // HAD_BOR
31 pos = buf_append_str(buf, size, pos, "Brown-out|");
32 if (chip_reset & 0x00010000) // HAD_POR
33 pos = buf_append_str(buf, size, pos, "Power-on reset|");
34#else
35 uint32_t chip_reset = vreg_and_chip_reset_hw->chip_reset;
36 if (chip_reset & 0x00010000) // HAD_RUN
37 pos = buf_append_str(buf, size, pos, "RUN pin|");
38 if (chip_reset & 0x00000100) // HAD_POR
39 pos = buf_append_str(buf, size, pos, "Power-on reset|");
40#endif
41
42 if (watchdog_caused_reboot()) {
43 bool handled = false;
44#ifdef USE_RP2040_CRASH_HANDLER
46 pos = buf_append_str(buf, size, pos, "Crash (HardFault)|");
47 handled = true;
48 }
49#endif
50 if (!handled) {
51 if (watchdog_enable_caused_reboot()) {
52 pos = buf_append_str(buf, size, pos, "Watchdog timeout|");
53 } else {
54 pos = buf_append_str(buf, size, pos, "Software reset|");
55 }
56 }
57 }
58
59 // Remove trailing '|'
60 if (pos > 0 && buf[pos - 1] == '|') {
61 buf[pos - 1] = '\0';
62 } else if (pos == 0) {
63 return "Unknown";
64 }
65
66 return buf;
67}
68
69const char *DebugComponent::get_wakeup_cause_(std::span<char, WAKEUP_CAUSE_BUFFER_SIZE> buffer) { return ""; }
70
71uint32_t DebugComponent::get_free_heap_() { return ::rp2040.getFreeHeap(); }
72
73size_t DebugComponent::get_device_info_(std::span<char, DEVICE_INFO_BUFFER_SIZE> buffer, size_t pos) {
74 constexpr size_t size = DEVICE_INFO_BUFFER_SIZE;
75 char *buf = buffer.data();
76
77 uint32_t cpu_freq = ::rp2040.f_cpu();
78 ESP_LOGD(TAG, "CPU Frequency: %" PRIu32, cpu_freq);
79 pos = buf_append_printf(buf, size, pos, "|CPU Frequency: %" PRIu32, cpu_freq);
80
81 return pos;
82}
83
85
86} // namespace esphome::debug
87#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:1087
uint16_t size
Definition helpers.cpp:25
size_t size_t pos
Definition helpers.h:1038
static void uint32_t