7#include <zephyr/device.h>
8#include <zephyr/drivers/uart.h>
9#include <zephyr/sys/printk.h>
10#include <zephyr/usb/usb_device.h>
11#ifdef USE_LOGGER_EARLY_MESSAGE
28#if defined(CONFIG_THREAD_NAME)
29 char thread[CONFIG_THREAD_MAX_NAME_LEN];
33static const char *
const TAG =
"logger";
35#ifdef USE_LOGGER_UART_SELECTION_USB_CDC
40 static bool opened =
false;
42 uart_line_ctrl_get(this->
uart_dev_, UART_LINE_CTRL_DTR, &dtr);
58 static const struct device *uart_dev =
nullptr;
59 switch (this->
uart_) {
61 uart_dev = DEVICE_DT_GET_OR_NULL(DT_NODELABEL(uart0));
64 uart_dev = DEVICE_DT_GET_OR_NULL(DT_NODELABEL(uart1));
66#ifdef USE_LOGGER_USB_CDC
68 uart_dev = DEVICE_DT_GET_OR_NULL(DT_NODELABEL(cdc_acm_uart0));
69 if (device_is_ready(uart_dev)) {
75 if (!device_is_ready(uart_dev)) {
79#if defined(USE_LOGGER_WAIT_FOR_CDC) && defined(USE_LOGGER_UART_SELECTION_USB_CDC)
82 while (dtr == 0 && count-- != 0) {
83 uart_line_ctrl_get(this->
uart_dev_, UART_LINE_CTRL_DTR, &dtr);
91 ESP_LOGI(TAG,
"Log initialized");
92#ifdef USE_LOGGER_EARLY_MESSAGE
93 char reason_buffer[zephyr::RESET_REASON_BUFFER_SIZE];
94 const char *reset_reason =
zephyr::get_reset_reason(std::span<char, zephyr::RESET_REASON_BUFFER_SIZE>(reason_buffer));
95 ESP_LOGI(TAG,
"Reset reason: %s", reset_reason);
97 zephyr_coredump::print_coredump();
106 printk(
"%.*s",
static_cast<int>(
len), msg);
111 for (uint16_t i = 0; i <
len; ++i) {
117 switch (this->
uart_) {
119 return LOG_STR(
"UART0");
121 return LOG_STR(
"UART1");
122#ifdef USE_LOGGER_USB_CDC
124 return LOG_STR(
"USB_CDC");
127 return LOG_STR(
"UNKNOWN");
131static const uint8_t REASON_BUF_SIZE = 32;
133static const char *reason_to_str(
unsigned int reason,
char *buf) {
135 case K_ERR_CPU_EXCEPTION:
136 return "CPU exception";
137 case K_ERR_SPURIOUS_IRQ:
138 return "Unhandled interrupt";
139 case K_ERR_STACK_CHK_FAIL:
140 return "Stack overflow";
141 case K_ERR_KERNEL_OOPS:
142 return "Kernel oops";
143 case K_ERR_KERNEL_PANIC:
144 return "Kernel panic";
146 snprintf(buf, REASON_BUF_SIZE,
"Unknown error (%u)", reason);
152 ESP_LOGD(TAG,
"Crash buffer address %p", &
crash_buf);
154 char reason_buf[REASON_BUF_SIZE];
155 ESP_LOGE(TAG,
"Last crash:");
156 ESP_LOGE(TAG,
"Reason=%s PC=0x%08x LR=0x%08x", reason_to_str(
crash_buf.reason, reason_buf),
crash_buf.pc,
158#if defined(CONFIG_THREAD_NAME)
159 ESP_LOGE(TAG,
"Thread: %s",
crash_buf.thread);
171#if defined(CONFIG_THREAD_NAME)
172 auto thread = k_current_get();
173 const char *name = k_thread_name_get(thread);
uint32_t get_config_hash()
Get the config hash as a 32-bit integer.
void schedule_dump_config()
void write_msg_(const char *msg, uint16_t len)
const LogString * get_uart_selection_()
void pre_setup()
Set up this component.
struct @65::@66 __attribute__
void k_sys_fatal_error_handler(unsigned int reason, const z_arch_esf_t *esf)
void k_sys_fatal_error_handler(unsigned int reason, const z_arch_esf_t *esf)
const char * get_reset_reason(std::span< char, RESET_REASON_BUFFER_SIZE > buffer)
void HOT delay(uint32_t ms)
Application App
Global storage of Application pointer - only one Application can exist.