ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
debug_zephyr.cpp
Go to the documentation of this file.
1#include "debug_component.h"
2#ifdef USE_ZEPHYR
3#include <cinttypes>
4#include <climits>
6#include "esphome/core/log.h"
8#include <zephyr/drivers/hwinfo.h>
9#include <hal/nrf_power.h>
10#include <cstdint>
11#include <zephyr/storage/flash_map.h>
12
13#define BOOTLOADER_VERSION_REGISTER NRF_TIMER2->CC[0]
14
15namespace esphome::debug {
16
17ESPHOME_LOG_TAG(TAG, "debug");
18constexpr std::uintptr_t MBR_PARAM_PAGE_ADDR = 0xFFC;
19constexpr std::uintptr_t MBR_BOOTLOADER_ADDR = 0xFF8;
20
21static inline uint32_t read_mem_u32(uintptr_t addr) {
22 // NOLINTNEXTLINE(performance-no-int-to-ptr,clang-analyzer-core.FixedAddressDereference)
23 return *reinterpret_cast<volatile uint32_t *>(addr);
24}
25
26static inline uint8_t read_mem_u8(uintptr_t addr) {
27 // NOLINTNEXTLINE(performance-no-int-to-ptr,clang-analyzer-core.FixedAddressDereference)
28 return *reinterpret_cast<volatile uint8_t *>(addr);
29}
30
31// defines from https://github.com/adafruit/Adafruit_nRF52_Bootloader which prints those information
32constexpr uint32_t SD_MAGIC_NUMBER = 0x51B1E5DB;
33constexpr uintptr_t MBR_SIZE = 0x1000;
34constexpr uintptr_t SOFTDEVICE_INFO_STRUCT_OFFSET = 0x2000;
35constexpr uintptr_t SD_ID_OFFSET = SOFTDEVICE_INFO_STRUCT_OFFSET + 0x10;
37
38static inline bool is_sd_present() {
39 return read_mem_u32(SOFTDEVICE_INFO_STRUCT_OFFSET + MBR_SIZE + 4) == SD_MAGIC_NUMBER;
40}
41static inline uint32_t sd_id_get() {
43 return read_mem_u32(MBR_SIZE + SD_ID_OFFSET);
44 }
45 return 0;
46}
47static inline uint32_t sd_version_get() {
49 return read_mem_u32(MBR_SIZE + SD_VERSION_OFFSET);
50 }
51 return 0;
52}
53
54const char *DebugComponent::get_reset_reason_(std::span<char, RESET_REASON_BUFFER_SIZE> buffer) {
55 const char *buf = zephyr::get_reset_reason(buffer);
56 ESP_LOGD(TAG, "Reset Reason: %s", buf);
57 return buf;
58}
59
60const char *DebugComponent::get_wakeup_cause_(std::span<char, WAKEUP_CAUSE_BUFFER_SIZE> buffer) {
61 // Zephyr doesn't have detailed wakeup cause like ESP32
62 return "";
63}
64
65uint32_t DebugComponent::get_free_heap_() { return INT_MAX; }
66
67static void fa_cb(const struct flash_area *fa, void *user_data) {
68#if CONFIG_FLASH_MAP_LABELS
69 const char *fa_label = flash_area_label(fa);
70
71 if (fa_label == nullptr) {
72 fa_label = "-";
73 }
74 ESP_LOGCONFIG(TAG, "%2d 0x%0*" PRIxPTR " %-26s %-24.24s 0x%-10x 0x%-12x", (int) fa->fa_id,
75 sizeof(uintptr_t) * 2, (uintptr_t) fa->fa_dev, fa->fa_dev->name, fa_label, (uint32_t) fa->fa_off,
76 fa->fa_size);
77#else
78 ESP_LOGCONFIG(TAG, "%2d 0x%0*" PRIxPTR " %-26s 0x%-10x 0x%-12x", (int) fa->fa_id, sizeof(uintptr_t) * 2,
79 (uintptr_t) fa->fa_dev, fa->fa_dev->name, (uint32_t) fa->fa_off, fa->fa_size);
80#endif
81}
82
84#if CONFIG_FLASH_MAP_LABELS
85 ESP_LOGCONFIG(TAG, "ID | Device | Device Name "
86 "| Label | Offset | Size");
87 ESP_LOGCONFIG(TAG, "--------------------------------------------"
88 "-----------------------------------------------");
89#else
90 ESP_LOGCONFIG(TAG, "ID | Device | Device Name "
91 "| Offset | Size");
92 ESP_LOGCONFIG(TAG, "-----------------------------------------"
93 "------------------------------");
94#endif
95 flash_area_foreach(fa_cb, nullptr);
96}
97
98#ifdef ESPHOME_LOG_HAS_VERBOSE
99// Check if an nRF peripheral's ENABLE register indicates it is enabled.
100// periph: peripheral register prefix (e.g. USBD, UARTE, SPI)
101// reg: register block pointer (e.g. NRF_USBD, NRF_UARTE0)
102#define NRF_PERIPH_ENABLED(periph, reg) \
103 YESNO(((reg)->ENABLE & periph##_ENABLE_ENABLE_Msk) == (periph##_ENABLE_ENABLE_Enabled << periph##_ENABLE_ENABLE_Pos))
104
105// NOLINTBEGIN(clang-analyzer-core.FixedAddressDereference) -- nRF peripheral registers are MMIO at fixed addresses
106static void log_peripherals_info() {
107 // most peripherals are enabled only when in use so ESP_LOGV is enough
108 ESP_LOGV(TAG, "Peripherals status:");
109 ESP_LOGV(TAG, " USBD: %-3s| UARTE0: %-3s| UARTE1: %-3s| UART0: %-3s", //
110 NRF_PERIPH_ENABLED(USBD, NRF_USBD), NRF_PERIPH_ENABLED(UARTE, NRF_UARTE0),
111 NRF_PERIPH_ENABLED(UARTE, NRF_UARTE1), NRF_PERIPH_ENABLED(UART, NRF_UART0));
112 ESP_LOGV(TAG, " TWIS0: %-3s| TWIS1: %-3s| TWIM0: %-3s| TWIM1: %-3s", //
113 NRF_PERIPH_ENABLED(TWIS, NRF_TWIS0), NRF_PERIPH_ENABLED(TWIS, NRF_TWIS1),
114 NRF_PERIPH_ENABLED(TWIM, NRF_TWIM0), NRF_PERIPH_ENABLED(TWIM, NRF_TWIM1));
115 ESP_LOGV(TAG, " TWI0: %-3s| TWI1: %-3s| COMP: %-3s| CCM: %-3s", //
116 NRF_PERIPH_ENABLED(TWI, NRF_TWI0), NRF_PERIPH_ENABLED(TWI, NRF_TWI1), NRF_PERIPH_ENABLED(COMP, NRF_COMP),
117 NRF_PERIPH_ENABLED(CCM, NRF_CCM));
118 ESP_LOGV(TAG, " PDM: %-3s| SPIS0: %-3s| SPIS1: %-3s| SPIS2: %-3s", //
119 NRF_PERIPH_ENABLED(PDM, NRF_PDM), NRF_PERIPH_ENABLED(SPIS, NRF_SPIS0), NRF_PERIPH_ENABLED(SPIS, NRF_SPIS1),
120 NRF_PERIPH_ENABLED(SPIS, NRF_SPIS2));
121 ESP_LOGV(TAG, " SPIM0: %-3s| SPIM1: %-3s| SPIM2: %-3s| SPIM3: %-3s", //
122 NRF_PERIPH_ENABLED(SPIM, NRF_SPIM0), NRF_PERIPH_ENABLED(SPIM, NRF_SPIM1),
123 NRF_PERIPH_ENABLED(SPIM, NRF_SPIM2), NRF_PERIPH_ENABLED(SPIM, NRF_SPIM3));
124 ESP_LOGV(TAG, " SPI0: %-3s| SPI1: %-3s| SPI2: %-3s| SAADC: %-3s", //
125 NRF_PERIPH_ENABLED(SPI, NRF_SPI0), NRF_PERIPH_ENABLED(SPI, NRF_SPI1), NRF_PERIPH_ENABLED(SPI, NRF_SPI2),
126 NRF_PERIPH_ENABLED(SAADC, NRF_SAADC));
127 ESP_LOGV(TAG, " QSPI: %-3s| QDEC: %-3s| LPCOMP: %-3s| I2S: %-3s", //
128 NRF_PERIPH_ENABLED(QSPI, NRF_QSPI), NRF_PERIPH_ENABLED(QDEC, NRF_QDEC),
129 NRF_PERIPH_ENABLED(LPCOMP, NRF_LPCOMP), NRF_PERIPH_ENABLED(I2S, NRF_I2S));
130 ESP_LOGV(TAG, " PWM0: %-3s| PWM1: %-3s| PWM2: %-3s| PWM3: %-3s", //
131 NRF_PERIPH_ENABLED(PWM, NRF_PWM0), NRF_PERIPH_ENABLED(PWM, NRF_PWM1), NRF_PERIPH_ENABLED(PWM, NRF_PWM2),
132 NRF_PERIPH_ENABLED(PWM, NRF_PWM3));
133 ESP_LOGV(TAG, " AAR: %-3s| QSPI deep power-down:%-3s| CRYPTOCELL: %-3s", NRF_PERIPH_ENABLED(AAR, NRF_AAR),
134 YESNO((NRF_QSPI->IFCONFIG0 & QSPI_IFCONFIG0_DPMENABLE_Msk) ==
135 (QSPI_IFCONFIG0_DPMENABLE_Enable << QSPI_IFCONFIG0_DPMENABLE_Pos)),
136 YESNO((NRF_CRYPTOCELL->ENABLE & CRYPTOCELL_ENABLE_ENABLE_Msk) ==
137 (CRYPTOCELL_ENABLE_ENABLE_Enabled << CRYPTOCELL_ENABLE_ENABLE_Pos)));
138}
139// NOLINTEND(clang-analyzer-core.FixedAddressDereference)
140#undef NRF_PERIPH_ENABLED
141#endif
142
143static const char *regout0_to_str(uint32_t value) {
144 switch (value) {
145 case (UICR_REGOUT0_VOUT_DEFAULT):
146 return "1.8V (default)";
147 case (UICR_REGOUT0_VOUT_1V8):
148 return "1.8V";
149 case (UICR_REGOUT0_VOUT_2V1):
150 return "2.1V";
151 case (UICR_REGOUT0_VOUT_2V4):
152 return "2.4V";
153 case (UICR_REGOUT0_VOUT_2V7):
154 return "2.7V";
155 case (UICR_REGOUT0_VOUT_3V0):
156 return "3.0V";
157 case (UICR_REGOUT0_VOUT_3V3):
158 return "3.3V";
159 default:
160 break;
161 }
162 return "???V";
163}
164
165size_t DebugComponent::get_device_info_(std::span<char, DEVICE_INFO_BUFFER_SIZE> buffer, size_t pos) {
166 constexpr size_t size = DEVICE_INFO_BUFFER_SIZE;
167 char *buf = buffer.data();
168
169 // Main supply status
170 // NOLINTNEXTLINE(clang-analyzer-core.FixedAddressDereference) -- NRF_POWER is MMIO at a fixed address
171 auto regstatus = nrf_power_mainregstatus_get(NRF_POWER);
172 const char *supply_status = (regstatus == NRF_POWER_MAINREGSTATUS_NORMAL) ? "Normal voltage." : "High voltage.";
173 ESP_LOGD(TAG, "Main supply status: %s", supply_status);
174 pos = buf_append_str(buf, size, pos, "|Main supply status: ");
175 pos = buf_append_str(buf, size, pos, supply_status);
176
177 // Regulator stage 0
178 if (nrf_power_mainregstatus_get(NRF_POWER) == NRF_POWER_MAINREGSTATUS_HIGH) {
179 const char *reg0_type = nrf_power_dcdcen_vddh_get(NRF_POWER) ? "DC/DC" : "LDO";
180 const char *reg0_voltage = regout0_to_str((NRF_UICR->REGOUT0 & UICR_REGOUT0_VOUT_Msk) >> UICR_REGOUT0_VOUT_Pos);
181 ESP_LOGD(TAG, "Regulator stage 0: %s, %s", reg0_type, reg0_voltage);
182 pos = buf_append_str(buf, size, pos, "|Regulator stage 0: ");
183 pos = buf_append_str(buf, size, pos, reg0_type);
184 pos = buf_append_str(buf, size, pos, ", ");
185 pos = buf_append_str(buf, size, pos, reg0_voltage);
186#ifdef USE_NRF52_REG0_VOUT
187 if ((NRF_UICR->REGOUT0 & UICR_REGOUT0_VOUT_Msk) >> UICR_REGOUT0_VOUT_Pos != USE_NRF52_REG0_VOUT) {
188 ESP_LOGE(TAG, "Regulator stage 0: expected %s", regout0_to_str(USE_NRF52_REG0_VOUT));
189 }
190#endif
191 } else {
192 ESP_LOGD(TAG, "Regulator stage 0: disabled");
193 pos = buf_append_str(buf, size, pos, "|Regulator stage 0: disabled");
194 }
195
196 // Regulator stage 1
197 const char *reg1_type = nrf_power_dcdcen_get(NRF_POWER) ? "DC/DC" : "LDO";
198 ESP_LOGD(TAG, "Regulator stage 1: %s", reg1_type);
199 pos = buf_append_str(buf, size, pos, "|Regulator stage 1: ");
200 pos = buf_append_str(buf, size, pos, reg1_type);
201
202 // USB power state
203 const char *usb_state;
204 if (nrf_power_usbregstatus_vbusdet_get(NRF_POWER)) {
205 if (nrf_power_usbregstatus_outrdy_get(NRF_POWER)) {
206 usb_state = "ready";
207 } else {
208 usb_state = "connected (regulator is not ready)";
209 }
210 } else {
211 usb_state = "disconnected";
212 }
213 ESP_LOGD(TAG, "USB power state: %s", usb_state);
214 pos = buf_append_str(buf, size, pos, "|USB power state: ");
215 pos = buf_append_str(buf, size, pos, usb_state);
216
217 // Power-fail comparator
218 bool enabled;
219 nrf_power_pof_thr_t pof_thr = nrf_power_pofcon_get(NRF_POWER, &enabled);
220 if (enabled) {
221 const char *pof_voltage;
222 switch (pof_thr) {
223 case POWER_POFCON_THRESHOLD_V17:
224 pof_voltage = "1.7V";
225 break;
226 case POWER_POFCON_THRESHOLD_V18:
227 pof_voltage = "1.8V";
228 break;
229 case POWER_POFCON_THRESHOLD_V19:
230 pof_voltage = "1.9V";
231 break;
232 case POWER_POFCON_THRESHOLD_V20:
233 pof_voltage = "2.0V";
234 break;
235 case POWER_POFCON_THRESHOLD_V21:
236 pof_voltage = "2.1V";
237 break;
238 case POWER_POFCON_THRESHOLD_V22:
239 pof_voltage = "2.2V";
240 break;
241 case POWER_POFCON_THRESHOLD_V23:
242 pof_voltage = "2.3V";
243 break;
244 case POWER_POFCON_THRESHOLD_V24:
245 pof_voltage = "2.4V";
246 break;
247 case POWER_POFCON_THRESHOLD_V25:
248 pof_voltage = "2.5V";
249 break;
250 case POWER_POFCON_THRESHOLD_V26:
251 pof_voltage = "2.6V";
252 break;
253 case POWER_POFCON_THRESHOLD_V27:
254 pof_voltage = "2.7V";
255 break;
256 case POWER_POFCON_THRESHOLD_V28:
257 pof_voltage = "2.8V";
258 break;
259 default:
260 pof_voltage = "???V";
261 break;
262 }
263
264 if (nrf_power_mainregstatus_get(NRF_POWER) == NRF_POWER_MAINREGSTATUS_HIGH) {
265 const char *vddh_voltage;
266 switch (nrf_power_pofcon_vddh_get(NRF_POWER)) {
267 case NRF_POWER_POFTHRVDDH_V27:
268 vddh_voltage = "2.7V";
269 break;
270 case NRF_POWER_POFTHRVDDH_V28:
271 vddh_voltage = "2.8V";
272 break;
273 case NRF_POWER_POFTHRVDDH_V29:
274 vddh_voltage = "2.9V";
275 break;
276 case NRF_POWER_POFTHRVDDH_V30:
277 vddh_voltage = "3.0V";
278 break;
279 case NRF_POWER_POFTHRVDDH_V31:
280 vddh_voltage = "3.1V";
281 break;
282 case NRF_POWER_POFTHRVDDH_V32:
283 vddh_voltage = "3.2V";
284 break;
285 case NRF_POWER_POFTHRVDDH_V33:
286 vddh_voltage = "3.3V";
287 break;
288 case NRF_POWER_POFTHRVDDH_V34:
289 vddh_voltage = "3.4V";
290 break;
291 case NRF_POWER_POFTHRVDDH_V35:
292 vddh_voltage = "3.5V";
293 break;
294 case NRF_POWER_POFTHRVDDH_V36:
295 vddh_voltage = "3.6V";
296 break;
297 case NRF_POWER_POFTHRVDDH_V37:
298 vddh_voltage = "3.7V";
299 break;
300 case NRF_POWER_POFTHRVDDH_V38:
301 vddh_voltage = "3.8V";
302 break;
303 case NRF_POWER_POFTHRVDDH_V39:
304 vddh_voltage = "3.9V";
305 break;
306 case NRF_POWER_POFTHRVDDH_V40:
307 vddh_voltage = "4.0V";
308 break;
309 case NRF_POWER_POFTHRVDDH_V41:
310 vddh_voltage = "4.1V";
311 break;
312 case NRF_POWER_POFTHRVDDH_V42:
313 vddh_voltage = "4.2V";
314 break;
315 default:
316 vddh_voltage = "???V";
317 break;
318 }
319 ESP_LOGD(TAG, "Power-fail comparator: %s, VDDH: %s", pof_voltage, vddh_voltage);
320 pos = buf_append_str(buf, size, pos, "|Power-fail comparator: ");
321 pos = buf_append_str(buf, size, pos, pof_voltage);
322 pos = buf_append_str(buf, size, pos, ", VDDH: ");
323 pos = buf_append_str(buf, size, pos, vddh_voltage);
324 } else {
325 ESP_LOGD(TAG, "Power-fail comparator: %s", pof_voltage);
326 pos = buf_append_str(buf, size, pos, "|Power-fail comparator: ");
327 pos = buf_append_str(buf, size, pos, pof_voltage);
328 }
329 } else {
330 ESP_LOGD(TAG, "Power-fail comparator: disabled");
331 pos = buf_append_str(buf, size, pos, "|Power-fail comparator: disabled");
332 }
333
334 auto package = [](uint32_t value) {
335 switch (value) {
336 case 0x2004:
337 return "QIxx - 7x7 73-pin aQFN";
338 case 0x2000:
339 return "QFxx - 6x6 48-pin QFN";
340 case 0x2005:
341 return "CKxx - 3.544 x 3.607 WLCSP";
342 default:
343 break;
344 }
345 return "Unspecified";
346 };
347
348 char mac_pretty[MAC_ADDRESS_PRETTY_BUFFER_SIZE];
350 ESP_LOGD(TAG,
351 "nRF debug info:\n"
352 " Code page size: %u, code size: %u, device id: 0x%08x%08x\n"
353 " Encryption root: 0x%08x%08x%08x%08x, Identity Root: 0x%08x%08x%08x%08x\n"
354 " Device address type: %s, address: %s\n"
355 " Part code: nRF%x, version: %c%c%c%c, package: %s\n"
356 " RAM: %ukB, Flash: %ukB, production test: %sdone",
357 NRF_FICR->CODEPAGESIZE, NRF_FICR->CODESIZE, NRF_FICR->DEVICEID[1], NRF_FICR->DEVICEID[0], NRF_FICR->ER[0],
358 NRF_FICR->ER[1], NRF_FICR->ER[2], NRF_FICR->ER[3], NRF_FICR->IR[0], NRF_FICR->IR[1], NRF_FICR->IR[2],
359 NRF_FICR->IR[3], (NRF_FICR->DEVICEADDRTYPE & 0x1 ? "Random" : "Public"), mac_pretty, NRF_FICR->INFO.PART,
360 NRF_FICR->INFO.VARIANT >> 24 & 0xFF, NRF_FICR->INFO.VARIANT >> 16 & 0xFF, NRF_FICR->INFO.VARIANT >> 8 & 0xFF,
361 NRF_FICR->INFO.VARIANT & 0xFF, package(NRF_FICR->INFO.PACKAGE), NRF_FICR->INFO.RAM, NRF_FICR->INFO.FLASH,
362 (NRF_FICR->PRODTEST[0] == 0xBB42319F ? "" : "not "));
363 bool n_reset_enabled = NRF_UICR->PSELRESET[0] == NRF_UICR->PSELRESET[1] &&
364 (NRF_UICR->PSELRESET[0] & UICR_PSELRESET_CONNECT_Msk) == UICR_PSELRESET_CONNECT_Connected
365 << UICR_PSELRESET_CONNECT_Pos;
366 ESP_LOGD(
367 TAG, " GPIO as NFC pins: %s, GPIO as nRESET pin: %s",
368 YESNO((NRF_UICR->NFCPINS & UICR_NFCPINS_PROTECT_Msk) == (UICR_NFCPINS_PROTECT_NFC << UICR_NFCPINS_PROTECT_Pos)),
369 YESNO(n_reset_enabled));
370 if (n_reset_enabled) {
371 uint8_t port = (NRF_UICR->PSELRESET[0] & UICR_PSELRESET_PORT_Msk) >> UICR_PSELRESET_PORT_Pos;
372 uint8_t pin = (NRF_UICR->PSELRESET[0] & UICR_PSELRESET_PIN_Msk) >> UICR_PSELRESET_PIN_Pos;
373 ESP_LOGD(TAG, " nRESET port P%u.%02u", port, pin);
374 }
375#ifdef USE_BOOTLOADER_MCUBOOT
376 ESP_LOGD(TAG, " Bootloader: mcuboot");
377#else
378 ESP_LOGD(TAG, " Bootloader: Adafruit, version %u.%u.%u", (BOOTLOADER_VERSION_REGISTER >> 16) & 0xFF,
379 (BOOTLOADER_VERSION_REGISTER >> 8) & 0xFF, BOOTLOADER_VERSION_REGISTER & 0xFF);
380 ESP_LOGD(TAG, " MBR bootloader addr 0x%08x, UICR bootloader addr 0x%08x", read_mem_u32(MBR_BOOTLOADER_ADDR),
381 NRF_UICR->NRFFW[0]);
382 ESP_LOGD(TAG, " MBR param page addr 0x%08x, UICR param page addr 0x%08x", read_mem_u32(MBR_PARAM_PAGE_ADDR),
383 NRF_UICR->NRFFW[1]);
384 if (is_sd_present()) {
385 uint32_t const sd_id = sd_id_get();
386 uint32_t const sd_version = sd_version_get();
387
388 uint32_t ver[3];
389 ver[0] = sd_version / 1000000;
390 ver[1] = (sd_version - ver[0] * 1000000) / 1000;
391 ver[2] = (sd_version - ver[0] * 1000000 - ver[1] * 1000);
392
393 ESP_LOGD(TAG, " SoftDevice: S%u %u.%u.%u", sd_id, ver[0], ver[1], ver[2]);
394#ifdef USE_SOFTDEVICE_ID
395#ifdef USE_SOFTDEVICE_VERSION
396 if (USE_SOFTDEVICE_ID != sd_id || USE_SOFTDEVICE_VERSION != ver[0]) {
397 ESP_LOGE(TAG, "Built for SoftDevice S%u %u.x.y. It may crash due to mismatch of bootloader version.",
398 USE_SOFTDEVICE_ID, USE_SOFTDEVICE_VERSION);
399 }
400#else
401 if (USE_SOFTDEVICE_ID != sd_id) {
402 ESP_LOGE(TAG, "Built for SoftDevice S%u. It may crash due to mismatch of bootloader version.", USE_SOFTDEVICE_ID);
403 }
404#endif
405#endif
406 }
407#endif
408 // 13 words of 8 hex digits, separated by spaces
409 char uicr_buf[13 * 9];
410 auto uicr = [&uicr_buf](volatile uint32_t *data, uint8_t size) {
411 size_t len = 0;
412 for (size_t i = 0; i < size; i++) {
413 len = buf_append_printf(uicr_buf, sizeof(uicr_buf), len, i > 0 ? " %08" PRIX32 : "%08" PRIX32, data[i]);
414 }
415 return uicr_buf;
416 };
417 ESP_LOGD(TAG, " NRFFW %s", uicr(NRF_UICR->NRFFW, 13));
418 ESP_LOGD(TAG, " NRFHW %s", uicr(NRF_UICR->NRFHW, 12));
419#ifdef ESPHOME_LOG_HAS_VERBOSE
420 log_peripherals_info();
421#endif
422 return pos;
423}
424
425void DebugComponent::update_platform_() {}
426
427} // namespace esphome::debug
428#endif
Heap-allocating helper functions.
const char * get_wakeup_cause_(std::span< char, WAKEUP_CAUSE_BUFFER_SIZE > buffer)
void log_partition_info_()
Logs information about the device's partition table.
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)
uint32_t buffer
Definition gif.cpp:50
constexpr std::uintptr_t MBR_PARAM_PAGE_ADDR
constexpr uintptr_t SD_ID_OFFSET
ESPHOME_LOG_TAG(TAG, "debug")
constexpr std::uintptr_t MBR_BOOTLOADER_ADDR
constexpr uintptr_t MBR_SIZE
constexpr uintptr_t SOFTDEVICE_INFO_STRUCT_OFFSET
constexpr uintptr_t SD_VERSION_OFFSET
constexpr uint32_t SD_MAGIC_NUMBER
std::span< const uint8_t > data
const char * get_reset_reason(std::span< char, RESET_REASON_BUFFER_SIZE > buffer)
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:1304
const void size_t len
Definition hal.h:68
uint16_t size
Definition helpers.cpp:34
size_t size_t pos
Definition helpers.h:1255
const char * get_mac_address_pretty_into_buffer(std::span< char, MAC_ADDRESS_PRETTY_BUFFER_SIZE > buf)
Get the device MAC address into the given buffer, in colon-separated uppercase hex notation.
Definition helpers.cpp:854
static void uint32_t