ESPHome 2026.3.0
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 {
16namespace 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_RP2040_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
72uint32_t DebugComponent::get_free_heap_() { return ::rp2040.getFreeHeap(); }
73
74size_t DebugComponent::get_device_info_(std::span<char, DEVICE_INFO_BUFFER_SIZE> buffer, size_t pos) {
75 constexpr size_t size = DEVICE_INFO_BUFFER_SIZE;
76 char *buf = buffer.data();
77
78 uint32_t cpu_freq = ::rp2040.f_cpu();
79 ESP_LOGD(TAG, "CPU Frequency: %" PRIu32, cpu_freq);
80 pos = buf_append_printf(buf, size, pos, "|CPU Frequency: %" PRIu32, cpu_freq);
81
82 return pos;
83}
84
86
87} // namespace debug
88} // namespace esphome
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.
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
size_t buf_append_str(char *buf, size_t size, size_t pos, const char *str)
Safely append a string to buffer without format parsing, returning new position (capped at size).
Definition helpers.h:952
size_t size
Definition helpers.h:929
size_t size_t pos
Definition helpers.h:929
static void uint32_t