From 787f4860db9444b285f0220e911450e832e895f0 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 21 May 2025 21:22:01 -0400 Subject: [PATCH] [esp32, logger] Add initial P4 support (#8439) Co-authored-by: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- esphome/components/esp32/__init__.py | 2 + esphome/components/esp32/boards.py | 9 +++++ esphome/components/esp32/const.py | 3 ++ esphome/components/esp32/gpio.py | 6 +++ esphome/components/esp32/gpio_esp32_p4.py | 43 ++++++++++++++++++++++ esphome/components/logger/__init__.py | 3 ++ esphome/components/logger/logger_esp32.cpp | 10 ++--- esphome/core/defines.h | 2 +- 8 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 esphome/components/esp32/gpio_esp32_p4.py diff --git a/esphome/components/esp32/__init__.py b/esphome/components/esp32/__init__.py index 85319a755e..9c507d8a21 100644 --- a/esphome/components/esp32/__init__.py +++ b/esphome/components/esp32/__init__.py @@ -59,6 +59,7 @@ from .const import ( # noqa VARIANT_ESP32C3, VARIANT_ESP32C6, VARIANT_ESP32H2, + VARIANT_ESP32P4, VARIANT_ESP32S2, VARIANT_ESP32S3, VARIANT_FRIENDLY, @@ -89,6 +90,7 @@ CPU_FREQUENCIES = { VARIANT_ESP32C3: get_cpu_frequencies(80, 160), VARIANT_ESP32C6: get_cpu_frequencies(80, 120, 160), VARIANT_ESP32H2: get_cpu_frequencies(16, 32, 48, 64, 96), + VARIANT_ESP32P4: get_cpu_frequencies(40, 360, 400), } # Make sure not missed here if a new variant added. diff --git a/esphome/components/esp32/boards.py b/esphome/components/esp32/boards.py index 81400eb9c3..1a8f6d5332 100644 --- a/esphome/components/esp32/boards.py +++ b/esphome/components/esp32/boards.py @@ -4,6 +4,7 @@ from .const import ( VARIANT_ESP32C3, VARIANT_ESP32C6, VARIANT_ESP32H2, + VARIANT_ESP32P4, VARIANT_ESP32S2, VARIANT_ESP32S3, ) @@ -1632,6 +1633,14 @@ BOARDS = { "name": "Espressif ESP32-H2-DevKit", "variant": VARIANT_ESP32H2, }, + "esp32-p4": { + "name": "Espressif ESP32-P4 generic", + "variant": VARIANT_ESP32P4, + }, + "esp32-p4-evboard": { + "name": "Espressif ESP32-P4 Function EV Board", + "variant": VARIANT_ESP32P4, + }, "esp32-pico-devkitm-2": { "name": "Espressif ESP32-PICO-DevKitM-2", "variant": VARIANT_ESP32, diff --git a/esphome/components/esp32/const.py b/esphome/components/esp32/const.py index a86713e857..8ca3905be9 100644 --- a/esphome/components/esp32/const.py +++ b/esphome/components/esp32/const.py @@ -19,6 +19,7 @@ VARIANT_ESP32C2 = "ESP32C2" VARIANT_ESP32C3 = "ESP32C3" VARIANT_ESP32C6 = "ESP32C6" VARIANT_ESP32H2 = "ESP32H2" +VARIANT_ESP32P4 = "ESP32P4" VARIANTS = [ VARIANT_ESP32, VARIANT_ESP32S2, @@ -27,6 +28,7 @@ VARIANTS = [ VARIANT_ESP32C3, VARIANT_ESP32C6, VARIANT_ESP32H2, + VARIANT_ESP32P4, ] VARIANT_FRIENDLY = { @@ -37,6 +39,7 @@ VARIANT_FRIENDLY = { VARIANT_ESP32C3: "ESP32-C3", VARIANT_ESP32C6: "ESP32-C6", VARIANT_ESP32H2: "ESP32-H2", + VARIANT_ESP32P4: "ESP32-P4", } esp32_ns = cg.esphome_ns.namespace("esp32") diff --git a/esphome/components/esp32/gpio.py b/esphome/components/esp32/gpio.py index 4258b160bc..85bae3f52a 100644 --- a/esphome/components/esp32/gpio.py +++ b/esphome/components/esp32/gpio.py @@ -29,6 +29,7 @@ from .const import ( VARIANT_ESP32C3, VARIANT_ESP32C6, VARIANT_ESP32H2, + VARIANT_ESP32P4, VARIANT_ESP32S2, VARIANT_ESP32S3, esp32_ns, @@ -38,6 +39,7 @@ from .gpio_esp32_c2 import esp32_c2_validate_gpio_pin, esp32_c2_validate_support from .gpio_esp32_c3 import esp32_c3_validate_gpio_pin, esp32_c3_validate_supports from .gpio_esp32_c6 import esp32_c6_validate_gpio_pin, esp32_c6_validate_supports from .gpio_esp32_h2 import esp32_h2_validate_gpio_pin, esp32_h2_validate_supports +from .gpio_esp32_p4 import esp32_p4_validate_gpio_pin, esp32_p4_validate_supports from .gpio_esp32_s2 import esp32_s2_validate_gpio_pin, esp32_s2_validate_supports from .gpio_esp32_s3 import esp32_s3_validate_gpio_pin, esp32_s3_validate_supports @@ -106,6 +108,10 @@ _esp32_validations = { pin_validation=esp32_h2_validate_gpio_pin, usage_validation=esp32_h2_validate_supports, ), + VARIANT_ESP32P4: ESP32ValidationFunctions( + pin_validation=esp32_p4_validate_gpio_pin, + usage_validation=esp32_p4_validate_supports, + ), VARIANT_ESP32S2: ESP32ValidationFunctions( pin_validation=esp32_s2_validate_gpio_pin, usage_validation=esp32_s2_validate_supports, diff --git a/esphome/components/esp32/gpio_esp32_p4.py b/esphome/components/esp32/gpio_esp32_p4.py new file mode 100644 index 0000000000..650d06e108 --- /dev/null +++ b/esphome/components/esp32/gpio_esp32_p4.py @@ -0,0 +1,43 @@ +import logging + +import esphome.config_validation as cv +from esphome.const import CONF_INPUT, CONF_MODE, CONF_NUMBER + +_ESP32P4_USB_JTAG_PINS = {24, 25} + +_ESP32P4_STRAPPING_PINS = {34, 35, 36, 37, 38} + +_LOGGER = logging.getLogger(__name__) + + +def esp32_p4_validate_gpio_pin(value): + if value < 0 or value > 54: + raise cv.Invalid(f"Invalid pin number: {value} (must be 0-54)") + if value in _ESP32P4_STRAPPING_PINS: + _LOGGER.warning( + "GPIO%d is a Strapping PIN and should be avoided.\n" + "Attaching external pullup/down resistors to strapping pins can cause unexpected failures.\n" + "See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins", + value, + ) + if value in _ESP32P4_USB_JTAG_PINS: + _LOGGER.warning( + "GPIO%d is reserved for the USB-Serial-JTAG interface.\n" + "To use this pin as GPIO, USB-Serial-JTAG will be disabled.", + value, + ) + + return value + + +def esp32_p4_validate_supports(value): + num = value[CONF_NUMBER] + mode = value[CONF_MODE] + is_input = mode[CONF_INPUT] + + if num < 0 or num > 54: + raise cv.Invalid(f"Invalid pin number: {value} (must be 0-54)") + if is_input: + # All ESP32 pins support input mode + pass + return value diff --git a/esphome/components/logger/__init__.py b/esphome/components/logger/__init__.py index 4698c1d9f1..2fc1601d28 100644 --- a/esphome/components/logger/__init__.py +++ b/esphome/components/logger/__init__.py @@ -10,6 +10,7 @@ from esphome.components.esp32.const import ( VARIANT_ESP32C3, VARIANT_ESP32C6, VARIANT_ESP32H2, + VARIANT_ESP32P4, VARIANT_ESP32S2, VARIANT_ESP32S3, ) @@ -89,6 +90,7 @@ UART_SELECTION_ESP32 = { VARIANT_ESP32C2: [UART0, UART1], VARIANT_ESP32C6: [UART0, UART1, USB_CDC, USB_SERIAL_JTAG], VARIANT_ESP32H2: [UART0, UART1, USB_CDC, USB_SERIAL_JTAG], + VARIANT_ESP32P4: [UART0, UART1, USB_CDC, USB_SERIAL_JTAG], } UART_SELECTION_ESP8266 = [UART0, UART0_SWAP, UART1] @@ -206,6 +208,7 @@ CONFIG_SCHEMA = cv.All( esp32_c3_idf=USB_SERIAL_JTAG, esp32_c6_arduino=USB_CDC, esp32_c6_idf=USB_SERIAL_JTAG, + esp32_p4_idf=USB_SERIAL_JTAG, rp2040=USB_CDC, bk72xx=DEFAULT, rtl87xx=DEFAULT, diff --git a/esphome/components/logger/logger_esp32.cpp b/esphome/components/logger/logger_esp32.cpp index c9de3d815a..b5ac84a665 100644 --- a/esphome/components/logger/logger_esp32.cpp +++ b/esphome/components/logger/logger_esp32.cpp @@ -18,12 +18,12 @@ #endif #endif -#include "freertos/FreeRTOS.h" #include "esp_idf_version.h" +#include "freertos/FreeRTOS.h" +#include #include #include -#include #endif // USE_ESP_IDF @@ -174,11 +174,11 @@ void Logger::pre_setup() { #ifdef USE_ESP_IDF void HOT Logger::write_msg_(const char *msg) { if ( -#if defined(USE_ESP32_VARIANT_ESP32S2) +#if defined(USE_LOGGER_USB_CDC) && !defined(USE_LOGGER_USB_SERIAL_JTAG) this->uart_ == UART_SELECTION_USB_CDC -#elif defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32H2) +#elif defined(USE_LOGGER_USB_SERIAL_JTAG) && !defined(USE_LOGGER_USB_CDC) this->uart_ == UART_SELECTION_USB_SERIAL_JTAG -#elif defined(USE_ESP32_VARIANT_ESP32S3) +#elif defined(USE_LOGGER_USB_CDC) && defined(USE_LOGGER_USB_SERIAL_JTAG) this->uart_ == UART_SELECTION_USB_CDC || this->uart_ == UART_SELECTION_USB_SERIAL_JTAG #else /* DISABLES CODE */ (false) // NOLINT diff --git a/esphome/core/defines.h b/esphome/core/defines.h index 8bc554d5f4..770e091205 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -160,7 +160,7 @@ #if defined(USE_ESP32_VARIANT_ESP32S2) #define USE_LOGGER_USB_CDC #elif defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32C3) || \ - defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32H2) + defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32H2) || defined(USE_ESP32_VARIANT_ESP32P4) #define USE_LOGGER_USB_CDC #define USE_LOGGER_USB_SERIAL_JTAG #endif