mirror of
https://github.com/esphome/esphome.git
synced 2024-11-30 02:34:12 +01:00
Add SERIAL_JTAG/CDC logger option for ESP-IDF platform for ESP32-S2/S3/C3 (#3105)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
parent
47898b527c
commit
3a3d97dfa7
3 changed files with 114 additions and 39 deletions
|
@ -19,8 +19,13 @@ from esphome.const import (
|
||||||
CONF_TX_BUFFER_SIZE,
|
CONF_TX_BUFFER_SIZE,
|
||||||
)
|
)
|
||||||
from esphome.core import CORE, EsphomeError, Lambda, coroutine_with_priority
|
from esphome.core import CORE, EsphomeError, Lambda, coroutine_with_priority
|
||||||
from esphome.components.esp32 import get_esp32_variant
|
from esphome.components.esp32 import add_idf_sdkconfig_option, get_esp32_variant
|
||||||
from esphome.components.esp32.const import VARIANT_ESP32S2, VARIANT_ESP32C3
|
from esphome.components.esp32.const import (
|
||||||
|
VARIANT_ESP32,
|
||||||
|
VARIANT_ESP32S2,
|
||||||
|
VARIANT_ESP32C3,
|
||||||
|
VARIANT_ESP32S3,
|
||||||
|
)
|
||||||
|
|
||||||
CODEOWNERS = ["@esphome/core"]
|
CODEOWNERS = ["@esphome/core"]
|
||||||
logger_ns = cg.esphome_ns.namespace("logger")
|
logger_ns = cg.esphome_ns.namespace("logger")
|
||||||
|
@ -54,36 +59,51 @@ LOG_LEVEL_SEVERITY = [
|
||||||
"VERY_VERBOSE",
|
"VERY_VERBOSE",
|
||||||
]
|
]
|
||||||
|
|
||||||
ESP32_REDUCED_VARIANTS = [VARIANT_ESP32C3, VARIANT_ESP32S2]
|
UART0 = "UART0"
|
||||||
|
UART1 = "UART1"
|
||||||
|
UART2 = "UART2"
|
||||||
|
UART0_SWAP = "UART0_SWAP"
|
||||||
|
USB_SERIAL_JTAG = "USB_SERIAL_JTAG"
|
||||||
|
USB_CDC = "USB_CDC"
|
||||||
|
|
||||||
UART_SELECTION_ESP32_REDUCED = ["UART0", "UART1"]
|
UART_SELECTION_ESP32 = {
|
||||||
|
VARIANT_ESP32: [UART0, UART1, UART2],
|
||||||
|
VARIANT_ESP32S2: [UART0, UART1, USB_CDC],
|
||||||
|
VARIANT_ESP32S3: [UART0, UART1, USB_CDC, USB_SERIAL_JTAG],
|
||||||
|
VARIANT_ESP32C3: [UART0, UART1, USB_SERIAL_JTAG],
|
||||||
|
}
|
||||||
|
|
||||||
UART_SELECTION_ESP32 = ["UART0", "UART1", "UART2"]
|
UART_SELECTION_ESP8266 = [UART0, UART0_SWAP, UART1]
|
||||||
|
|
||||||
UART_SELECTION_ESP8266 = ["UART0", "UART0_SWAP", "UART1"]
|
ESP_IDF_UARTS = [USB_CDC, USB_SERIAL_JTAG]
|
||||||
|
|
||||||
HARDWARE_UART_TO_UART_SELECTION = {
|
HARDWARE_UART_TO_UART_SELECTION = {
|
||||||
"UART0": logger_ns.UART_SELECTION_UART0,
|
UART0: logger_ns.UART_SELECTION_UART0,
|
||||||
"UART0_SWAP": logger_ns.UART_SELECTION_UART0_SWAP,
|
UART0_SWAP: logger_ns.UART_SELECTION_UART0_SWAP,
|
||||||
"UART1": logger_ns.UART_SELECTION_UART1,
|
UART1: logger_ns.UART_SELECTION_UART1,
|
||||||
"UART2": logger_ns.UART_SELECTION_UART2,
|
UART2: logger_ns.UART_SELECTION_UART2,
|
||||||
|
USB_CDC: logger_ns.UART_SELECTION_USB_CDC,
|
||||||
|
USB_SERIAL_JTAG: logger_ns.UART_SELECTION_USB_SERIAL_JTAG,
|
||||||
}
|
}
|
||||||
|
|
||||||
HARDWARE_UART_TO_SERIAL = {
|
HARDWARE_UART_TO_SERIAL = {
|
||||||
"UART0": cg.global_ns.Serial,
|
UART0: cg.global_ns.Serial,
|
||||||
"UART0_SWAP": cg.global_ns.Serial,
|
UART0_SWAP: cg.global_ns.Serial,
|
||||||
"UART1": cg.global_ns.Serial1,
|
UART1: cg.global_ns.Serial1,
|
||||||
"UART2": cg.global_ns.Serial2,
|
UART2: cg.global_ns.Serial2,
|
||||||
}
|
}
|
||||||
|
|
||||||
is_log_level = cv.one_of(*LOG_LEVELS, upper=True)
|
is_log_level = cv.one_of(*LOG_LEVELS, upper=True)
|
||||||
|
|
||||||
|
|
||||||
def uart_selection(value):
|
def uart_selection(value):
|
||||||
|
if value.upper() in ESP_IDF_UARTS:
|
||||||
|
if not CORE.using_esp_idf:
|
||||||
|
raise cv.Invalid(f"Only esp-idf framework supports {value}.")
|
||||||
if CORE.is_esp32:
|
if CORE.is_esp32:
|
||||||
if get_esp32_variant() in ESP32_REDUCED_VARIANTS:
|
variant = get_esp32_variant()
|
||||||
return cv.one_of(*UART_SELECTION_ESP32_REDUCED, upper=True)(value)
|
if variant in UART_SELECTION_ESP32:
|
||||||
return cv.one_of(*UART_SELECTION_ESP32, upper=True)(value)
|
return cv.one_of(*UART_SELECTION_ESP32[variant], upper=True)(value)
|
||||||
if CORE.is_esp8266:
|
if CORE.is_esp8266:
|
||||||
return cv.one_of(*UART_SELECTION_ESP8266, upper=True)(value)
|
return cv.one_of(*UART_SELECTION_ESP8266, upper=True)(value)
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
@ -113,7 +133,7 @@ CONFIG_SCHEMA = cv.All(
|
||||||
cv.Optional(CONF_BAUD_RATE, default=115200): cv.positive_int,
|
cv.Optional(CONF_BAUD_RATE, default=115200): cv.positive_int,
|
||||||
cv.Optional(CONF_TX_BUFFER_SIZE, default=512): cv.validate_bytes,
|
cv.Optional(CONF_TX_BUFFER_SIZE, default=512): cv.validate_bytes,
|
||||||
cv.Optional(CONF_DEASSERT_RTS_DTR, default=False): cv.boolean,
|
cv.Optional(CONF_DEASSERT_RTS_DTR, default=False): cv.boolean,
|
||||||
cv.Optional(CONF_HARDWARE_UART, default="UART0"): uart_selection,
|
cv.Optional(CONF_HARDWARE_UART, default=UART0): uart_selection,
|
||||||
cv.Optional(CONF_LEVEL, default="DEBUG"): is_log_level,
|
cv.Optional(CONF_LEVEL, default="DEBUG"): is_log_level,
|
||||||
cv.Optional(CONF_LOGS, default={}): cv.Schema(
|
cv.Optional(CONF_LOGS, default={}): cv.Schema(
|
||||||
{
|
{
|
||||||
|
@ -185,6 +205,12 @@ async def to_code(config):
|
||||||
if config.get(CONF_ESP8266_STORE_LOG_STRINGS_IN_FLASH):
|
if config.get(CONF_ESP8266_STORE_LOG_STRINGS_IN_FLASH):
|
||||||
cg.add_build_flag("-DUSE_STORE_LOG_STR_IN_FLASH")
|
cg.add_build_flag("-DUSE_STORE_LOG_STR_IN_FLASH")
|
||||||
|
|
||||||
|
if CORE.using_esp_idf:
|
||||||
|
if config[CONF_HARDWARE_UART] == USB_CDC:
|
||||||
|
add_idf_sdkconfig_option("CONFIG_ESP_CONSOLE_USB_CDC", True)
|
||||||
|
elif config[CONF_HARDWARE_UART] == USB_SERIAL_JTAG:
|
||||||
|
add_idf_sdkconfig_option("CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG", True)
|
||||||
|
|
||||||
# Register at end for safe mode
|
# Register at end for safe mode
|
||||||
await cg.register_component(log, config)
|
await cg.register_component(log, config)
|
||||||
|
|
||||||
|
|
|
@ -116,8 +116,22 @@ void HOT Logger::log_message_(int level, const char *tag, int offset) {
|
||||||
this->hw_serial_->println(msg);
|
this->hw_serial_->println(msg);
|
||||||
#endif // USE_ARDUINO
|
#endif // USE_ARDUINO
|
||||||
#ifdef USE_ESP_IDF
|
#ifdef USE_ESP_IDF
|
||||||
uart_write_bytes(uart_num_, msg, strlen(msg));
|
if (
|
||||||
uart_write_bytes(uart_num_, "\n", 1);
|
#if defined(USE_ESP32_VARIANT_ESP32S2)
|
||||||
|
uart_ == UART_SELECTION_USB_CDC
|
||||||
|
#elif defined(USE_ESP32_VARIANT_ESP32C3)
|
||||||
|
uart_ == UART_SELECTION_USB_SERIAL_JTAG
|
||||||
|
#elif defined(USE_ESP32_VARIANT_ESP32S3)
|
||||||
|
uart_ == UART_SELECTION_USB_CDC || uart_ == UART_SELECTION_USB_SERIAL_JTAG
|
||||||
|
#else
|
||||||
|
/* DISABLES CODE */ (false)
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
|
puts(msg);
|
||||||
|
} else {
|
||||||
|
uart_write_bytes(uart_num_, msg, strlen(msg));
|
||||||
|
uart_write_bytes(uart_num_, "\n", 1);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,29 +195,41 @@ void Logger::pre_setup() {
|
||||||
case UART_SELECTION_UART1:
|
case UART_SELECTION_UART1:
|
||||||
uart_num_ = UART_NUM_1;
|
uart_num_ = UART_NUM_1;
|
||||||
break;
|
break;
|
||||||
#if defined(USE_ESP32) && !defined(USE_ESP32_VARIANT_ESP32C3) && !defined(USE_ESP32_VARIANT_ESP32S2)
|
#if !defined(USE_ESP32_VARIANT_ESP32C3) && !defined(USE_ESP32_VARIANT_ESP32S2) && !defined(USE_ESP32_VARIANT_ESP32S3)
|
||||||
case UART_SELECTION_UART2:
|
case UART_SELECTION_UART2:
|
||||||
uart_num_ = UART_NUM_2;
|
uart_num_ = UART_NUM_2;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif // !USE_ESP32_VARIANT_ESP32C3 && !USE_ESP32_VARIANT_ESP32S2 && !USE_ESP32_VARIANT_ESP32S3
|
||||||
|
#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
|
||||||
|
case UART_SELECTION_USB_CDC:
|
||||||
|
uart_num_ = -1;
|
||||||
|
break;
|
||||||
|
#endif // USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3
|
||||||
|
#if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S3)
|
||||||
|
case UART_SELECTION_USB_SERIAL_JTAG:
|
||||||
|
uart_num_ = -1;
|
||||||
|
break;
|
||||||
|
#endif // USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32S3
|
||||||
}
|
}
|
||||||
uart_config_t uart_config{};
|
if (uart_num_ >= 0) {
|
||||||
uart_config.baud_rate = (int) baud_rate_;
|
uart_config_t uart_config{};
|
||||||
uart_config.data_bits = UART_DATA_8_BITS;
|
uart_config.baud_rate = (int) baud_rate_;
|
||||||
uart_config.parity = UART_PARITY_DISABLE;
|
uart_config.data_bits = UART_DATA_8_BITS;
|
||||||
uart_config.stop_bits = UART_STOP_BITS_1;
|
uart_config.parity = UART_PARITY_DISABLE;
|
||||||
uart_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
|
uart_config.stop_bits = UART_STOP_BITS_1;
|
||||||
uart_param_config(uart_num_, &uart_config);
|
uart_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
|
||||||
const int uart_buffer_size = tx_buffer_size_;
|
uart_param_config(uart_num_, &uart_config);
|
||||||
// Install UART driver using an event queue here
|
const int uart_buffer_size = tx_buffer_size_;
|
||||||
uart_driver_install(uart_num_, uart_buffer_size, uart_buffer_size, 10, nullptr, 0);
|
// Install UART driver using an event queue here
|
||||||
#endif
|
uart_driver_install(uart_num_, uart_buffer_size, uart_buffer_size, 10, nullptr, 0);
|
||||||
|
}
|
||||||
|
#endif // USE_ESP_IDF
|
||||||
}
|
}
|
||||||
#ifdef USE_ESP8266
|
#ifdef USE_ESP8266
|
||||||
else {
|
else {
|
||||||
uart_set_debug(UART_NO);
|
uart_set_debug(UART_NO);
|
||||||
}
|
}
|
||||||
#endif
|
#endif // USE_ESP8266
|
||||||
|
|
||||||
global_logger = this;
|
global_logger = this;
|
||||||
#if defined(USE_ESP_IDF) || defined(USE_ESP32_FRAMEWORK_ARDUINO)
|
#if defined(USE_ESP_IDF) || defined(USE_ESP32_FRAMEWORK_ARDUINO)
|
||||||
|
@ -211,7 +237,7 @@ void Logger::pre_setup() {
|
||||||
if (ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE) {
|
if (ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE) {
|
||||||
esp_log_level_set("*", ESP_LOG_VERBOSE);
|
esp_log_level_set("*", ESP_LOG_VERBOSE);
|
||||||
}
|
}
|
||||||
#endif
|
#endif // USE_ESP_IDF || USE_ESP32_FRAMEWORK_ARDUINO
|
||||||
|
|
||||||
ESP_LOGI(TAG, "Log initialized");
|
ESP_LOGI(TAG, "Log initialized");
|
||||||
}
|
}
|
||||||
|
@ -226,11 +252,24 @@ void Logger::add_on_log_callback(std::function<void(int, const char *, const cha
|
||||||
float Logger::get_setup_priority() const { return setup_priority::BUS + 500.0f; }
|
float Logger::get_setup_priority() const { return setup_priority::BUS + 500.0f; }
|
||||||
const char *const LOG_LEVELS[] = {"NONE", "ERROR", "WARN", "INFO", "CONFIG", "DEBUG", "VERBOSE", "VERY_VERBOSE"};
|
const char *const LOG_LEVELS[] = {"NONE", "ERROR", "WARN", "INFO", "CONFIG", "DEBUG", "VERBOSE", "VERY_VERBOSE"};
|
||||||
#ifdef USE_ESP32
|
#ifdef USE_ESP32
|
||||||
const char *const UART_SELECTIONS[] = {"UART0", "UART1", "UART2"};
|
const char *const UART_SELECTIONS[] = {
|
||||||
#endif
|
"UART0", "UART1",
|
||||||
|
#if !defined(USE_ESP32_VARIANT_ESP32C3) && !defined(USE_ESP32_VARIANT_ESP32S2) && !defined(USE_ESP32_VARIANT_ESP32S3)
|
||||||
|
"UART2",
|
||||||
|
#endif // !USE_ESP32_VARIANT_ESP32C3 && !USE_ESP32_VARIANT_ESP32S2 && !USE_ESP32_VARIANT_ESP32S3
|
||||||
|
#if defined(USE_ESP_IDF)
|
||||||
|
#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
|
||||||
|
"USB_CDC",
|
||||||
|
#endif // USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3
|
||||||
|
#if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S3)
|
||||||
|
"USB_SERIAL_JTAG",
|
||||||
|
#endif // USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32S3
|
||||||
|
#endif // USE_ESP_IDF
|
||||||
|
};
|
||||||
|
#endif // USE_ESP32
|
||||||
#ifdef USE_ESP8266
|
#ifdef USE_ESP8266
|
||||||
const char *const UART_SELECTIONS[] = {"UART0", "UART1", "UART0_SWAP"};
|
const char *const UART_SELECTIONS[] = {"UART0", "UART1", "UART0_SWAP"};
|
||||||
#endif
|
#endif // USE_ESP8266
|
||||||
void Logger::dump_config() {
|
void Logger::dump_config() {
|
||||||
ESP_LOGCONFIG(TAG, "Logger:");
|
ESP_LOGCONFIG(TAG, "Logger:");
|
||||||
ESP_LOGCONFIG(TAG, " Level: %s", LOG_LEVELS[ESPHOME_LOG_LEVEL]);
|
ESP_LOGCONFIG(TAG, " Level: %s", LOG_LEVELS[ESPHOME_LOG_LEVEL]);
|
||||||
|
|
|
@ -24,9 +24,19 @@ namespace logger {
|
||||||
enum UARTSelection {
|
enum UARTSelection {
|
||||||
UART_SELECTION_UART0 = 0,
|
UART_SELECTION_UART0 = 0,
|
||||||
UART_SELECTION_UART1,
|
UART_SELECTION_UART1,
|
||||||
#if defined(USE_ESP32) && !defined(USE_ESP32_VARIANT_ESP32C3) && !defined(USE_ESP32_VARIANT_ESP32S2)
|
#if defined(USE_ESP32)
|
||||||
|
#if !defined(USE_ESP32_VARIANT_ESP32C3) && !defined(USE_ESP32_VARIANT_ESP32S2) && !defined(USE_ESP32_VARIANT_ESP32S3)
|
||||||
UART_SELECTION_UART2,
|
UART_SELECTION_UART2,
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef USE_ESP_IDF
|
||||||
|
#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
|
||||||
|
UART_SELECTION_USB_CDC,
|
||||||
|
#endif
|
||||||
|
#if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S3)
|
||||||
|
UART_SELECTION_USB_SERIAL_JTAG,
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#ifdef USE_ESP8266
|
#ifdef USE_ESP8266
|
||||||
UART_SELECTION_UART0_SWAP,
|
UART_SELECTION_UART0_SWAP,
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue