From ca0037d0760b3927c9a0399d042b430693d18d6a Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Sun, 25 May 2025 21:33:41 -0400 Subject: [PATCH] [esp32, logger, core] Add initial c5 support (#8895) --- esphome/components/esp32/__init__.py | 2 + esphome/components/esp32/boards.py | 5 +++ esphome/components/esp32/const.py | 3 ++ esphome/components/esp32/gpio.py | 6 +++ esphome/components/esp32/gpio_esp32_c5.py | 45 +++++++++++++++++++++++ esphome/components/logger/__init__.py | 3 ++ esphome/core/defines.h | 3 +- 7 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 esphome/components/esp32/gpio_esp32_c5.py diff --git a/esphome/components/esp32/__init__.py b/esphome/components/esp32/__init__.py index 9c507d8a21..b211015865 100644 --- a/esphome/components/esp32/__init__.py +++ b/esphome/components/esp32/__init__.py @@ -57,6 +57,7 @@ from .const import ( # noqa VARIANT_ESP32, VARIANT_ESP32C2, VARIANT_ESP32C3, + VARIANT_ESP32C5, VARIANT_ESP32C6, VARIANT_ESP32H2, VARIANT_ESP32P4, @@ -88,6 +89,7 @@ CPU_FREQUENCIES = { VARIANT_ESP32S3: get_cpu_frequencies(80, 160, 240), VARIANT_ESP32C2: get_cpu_frequencies(80, 120), VARIANT_ESP32C3: get_cpu_frequencies(80, 160), + VARIANT_ESP32C5: get_cpu_frequencies(80, 160, 240), 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), diff --git a/esphome/components/esp32/boards.py b/esphome/components/esp32/boards.py index 1a8f6d5332..e7cdac0d8e 100644 --- a/esphome/components/esp32/boards.py +++ b/esphome/components/esp32/boards.py @@ -2,6 +2,7 @@ from .const import ( VARIANT_ESP32, VARIANT_ESP32C2, VARIANT_ESP32C3, + VARIANT_ESP32C5, VARIANT_ESP32C6, VARIANT_ESP32H2, VARIANT_ESP32P4, @@ -1593,6 +1594,10 @@ BOARDS = { "name": "Ai-Thinker ESP-C3-M1-I-Kit", "variant": VARIANT_ESP32C3, }, + "esp32-c5-devkitc-1": { + "name": "Espressif ESP32-C5-DevKitC-1", + "variant": VARIANT_ESP32C5, + }, "esp32-c6-devkitc-1": { "name": "Espressif ESP32-C6-DevKitC-1", "variant": VARIANT_ESP32C6, diff --git a/esphome/components/esp32/const.py b/esphome/components/esp32/const.py index 8ca3905be9..9bef18847f 100644 --- a/esphome/components/esp32/const.py +++ b/esphome/components/esp32/const.py @@ -17,6 +17,7 @@ VARIANT_ESP32S2 = "ESP32S2" VARIANT_ESP32S3 = "ESP32S3" VARIANT_ESP32C2 = "ESP32C2" VARIANT_ESP32C3 = "ESP32C3" +VARIANT_ESP32C5 = "ESP32C5" VARIANT_ESP32C6 = "ESP32C6" VARIANT_ESP32H2 = "ESP32H2" VARIANT_ESP32P4 = "ESP32P4" @@ -26,6 +27,7 @@ VARIANTS = [ VARIANT_ESP32S3, VARIANT_ESP32C2, VARIANT_ESP32C3, + VARIANT_ESP32C5, VARIANT_ESP32C6, VARIANT_ESP32H2, VARIANT_ESP32P4, @@ -37,6 +39,7 @@ VARIANT_FRIENDLY = { VARIANT_ESP32S3: "ESP32-S3", VARIANT_ESP32C2: "ESP32-C2", VARIANT_ESP32C3: "ESP32-C3", + VARIANT_ESP32C5: "ESP32-C5", VARIANT_ESP32C6: "ESP32-C6", VARIANT_ESP32H2: "ESP32-H2", VARIANT_ESP32P4: "ESP32-P4", diff --git a/esphome/components/esp32/gpio.py b/esphome/components/esp32/gpio.py index 85bae3f52a..c35e5c2215 100644 --- a/esphome/components/esp32/gpio.py +++ b/esphome/components/esp32/gpio.py @@ -27,6 +27,7 @@ from .const import ( VARIANT_ESP32, VARIANT_ESP32C2, VARIANT_ESP32C3, + VARIANT_ESP32C5, VARIANT_ESP32C6, VARIANT_ESP32H2, VARIANT_ESP32P4, @@ -37,6 +38,7 @@ from .const import ( from .gpio_esp32 import esp32_validate_gpio_pin, esp32_validate_supports from .gpio_esp32_c2 import esp32_c2_validate_gpio_pin, esp32_c2_validate_supports from .gpio_esp32_c3 import esp32_c3_validate_gpio_pin, esp32_c3_validate_supports +from .gpio_esp32_c5 import esp32_c5_validate_gpio_pin, esp32_c5_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 @@ -100,6 +102,10 @@ _esp32_validations = { pin_validation=esp32_c3_validate_gpio_pin, usage_validation=esp32_c3_validate_supports, ), + VARIANT_ESP32C5: ESP32ValidationFunctions( + pin_validation=esp32_c5_validate_gpio_pin, + usage_validation=esp32_c5_validate_supports, + ), VARIANT_ESP32C6: ESP32ValidationFunctions( pin_validation=esp32_c6_validate_gpio_pin, usage_validation=esp32_c6_validate_supports, diff --git a/esphome/components/esp32/gpio_esp32_c5.py b/esphome/components/esp32/gpio_esp32_c5.py new file mode 100644 index 0000000000..ada426771c --- /dev/null +++ b/esphome/components/esp32/gpio_esp32_c5.py @@ -0,0 +1,45 @@ +import logging + +import esphome.config_validation as cv +from esphome.const import CONF_INPUT, CONF_MODE, CONF_NUMBER +from esphome.pins import check_strapping_pin + +_ESP32C5_SPI_PSRAM_PINS = { + 16: "SPICS0", + 17: "SPIQ", + 18: "SPIWP", + 19: "VDD_SPI", + 20: "SPIHD", + 21: "SPICLK", + 22: "SPID", +} + +_ESP32C5_STRAPPING_PINS = {2, 7, 27, 28} + +_LOGGER = logging.getLogger(__name__) + + +def esp32_c5_validate_gpio_pin(value): + if value < 0 or value > 28: + raise cv.Invalid(f"Invalid pin number: {value} (must be 0-28)") + if value in _ESP32C5_SPI_PSRAM_PINS: + raise cv.Invalid( + f"This pin cannot be used on ESP32-C5s and is already used by the SPI/PSRAM interface (function: {_ESP32C5_SPI_PSRAM_PINS[value]})" + ) + + return value + + +def esp32_c5_validate_supports(value): + num = value[CONF_NUMBER] + mode = value[CONF_MODE] + is_input = mode[CONF_INPUT] + + if num < 0 or num > 28: + raise cv.Invalid(f"Invalid pin number: {num} (must be 0-28)") + if is_input: + # All ESP32 pins support input mode + pass + + check_strapping_pin(value, _ESP32C5_STRAPPING_PINS, _LOGGER) + return value diff --git a/esphome/components/logger/__init__.py b/esphome/components/logger/__init__.py index 1a4d645c8a..462cae73b6 100644 --- a/esphome/components/logger/__init__.py +++ b/esphome/components/logger/__init__.py @@ -8,6 +8,7 @@ from esphome.components.esp32.const import ( VARIANT_ESP32, VARIANT_ESP32C2, VARIANT_ESP32C3, + VARIANT_ESP32C5, VARIANT_ESP32C6, VARIANT_ESP32H2, VARIANT_ESP32P4, @@ -89,6 +90,7 @@ UART_SELECTION_ESP32 = { VARIANT_ESP32S3: [UART0, UART1, USB_CDC, USB_SERIAL_JTAG], VARIANT_ESP32C3: [UART0, UART1, USB_CDC, USB_SERIAL_JTAG], VARIANT_ESP32C2: [UART0, UART1], + VARIANT_ESP32C5: [UART0, UART1, USB_CDC, USB_SERIAL_JTAG], 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], @@ -207,6 +209,7 @@ CONFIG_SCHEMA = cv.All( esp32_s3_idf=USB_SERIAL_JTAG, esp32_c3_arduino=USB_CDC, esp32_c3_idf=USB_SERIAL_JTAG, + esp32_c5_idf=USB_SERIAL_JTAG, esp32_c6_arduino=USB_CDC, esp32_c6_idf=USB_SERIAL_JTAG, esp32_p4_idf=USB_SERIAL_JTAG, diff --git a/esphome/core/defines.h b/esphome/core/defines.h index 770e091205..455b404e32 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -160,7 +160,8 @@ #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_ESP32P4) + defined(USE_ESP32_VARIANT_ESP32C5) || 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