mirror of
https://github.com/esphome/esphome.git
synced 2024-11-26 00:48:19 +01:00
Initial ESP32-H2 Support (#5498)
This commit is contained in:
parent
44e5b0c745
commit
fa0dcac2c7
7 changed files with 80 additions and 16 deletions
|
@ -24,6 +24,7 @@ from esphome.components.esp32.const import (
|
||||||
VARIANT_ESP32S3,
|
VARIANT_ESP32S3,
|
||||||
VARIANT_ESP32C2,
|
VARIANT_ESP32C2,
|
||||||
VARIANT_ESP32C6,
|
VARIANT_ESP32C6,
|
||||||
|
VARIANT_ESP32H2,
|
||||||
)
|
)
|
||||||
|
|
||||||
WAKEUP_PINS = {
|
WAKEUP_PINS = {
|
||||||
|
@ -98,6 +99,7 @@ WAKEUP_PINS = {
|
||||||
],
|
],
|
||||||
VARIANT_ESP32C2: [0, 1, 2, 3, 4, 5],
|
VARIANT_ESP32C2: [0, 1, 2, 3, 4, 5],
|
||||||
VARIANT_ESP32C6: [0, 1, 2, 3, 4, 5, 6, 7],
|
VARIANT_ESP32C6: [0, 1, 2, 3, 4, 5, 6, 7],
|
||||||
|
VARIANT_ESP32H2: [7, 8, 9, 10, 11, 12, 13, 14],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,53 @@
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from esphome.const import CONF_INPUT, CONF_MODE, CONF_NUMBER
|
||||||
|
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
|
|
||||||
|
_ESP32H2_SPI_FLASH_PINS = {6, 7, 15, 16, 17, 18, 19, 20, 21}
|
||||||
|
|
||||||
|
_ESP32H2_USB_JTAG_PINS = {26, 27}
|
||||||
|
|
||||||
|
_ESP32H2_STRAPPING_PINS = {2, 3, 8, 9, 25}
|
||||||
|
|
||||||
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def esp32_h2_validate_gpio_pin(value):
|
def esp32_h2_validate_gpio_pin(value):
|
||||||
# ESP32-H2 not yet supported
|
if value < 0 or value > 27:
|
||||||
raise cv.Invalid("ESP32-H2 isn't supported yet")
|
raise cv.Invalid(f"Invalid pin number: {value} (must be 0-27)")
|
||||||
|
if value in _ESP32H2_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 _ESP32H2_SPI_FLASH_PINS:
|
||||||
|
_LOGGER.warning(
|
||||||
|
"GPIO%d is reserved for SPI Flash communication on some ESP32-H2 chip variants.\n"
|
||||||
|
"Utilizing SPI-reserved pins could cause unexpected failures.\n"
|
||||||
|
"See https://docs.espressif.com/projects/esp-idf/en/latest/esp32h2/api-reference/peripherals/gpio.html",
|
||||||
|
value,
|
||||||
|
)
|
||||||
|
if value in _ESP32H2_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_h2_validate_supports(value):
|
def esp32_h2_validate_supports(value):
|
||||||
# ESP32-H2 not yet supported
|
num = value[CONF_NUMBER]
|
||||||
raise cv.Invalid("ESP32-H2 isn't supported yet")
|
mode = value[CONF_MODE]
|
||||||
|
is_input = mode[CONF_INPUT]
|
||||||
|
|
||||||
|
if num < 0 or num > 27:
|
||||||
|
raise cv.Invalid(f"Invalid pin number: {value} (must be 0-27)")
|
||||||
|
if is_input:
|
||||||
|
# All ESP32 pins support input mode
|
||||||
|
pass
|
||||||
|
return value
|
||||||
|
|
|
@ -64,6 +64,7 @@ RMT_CHANNELS = {
|
||||||
esp32.const.VARIANT_ESP32S3: [0, 1, 2, 3],
|
esp32.const.VARIANT_ESP32S3: [0, 1, 2, 3],
|
||||||
esp32.const.VARIANT_ESP32C3: [0, 1],
|
esp32.const.VARIANT_ESP32C3: [0, 1],
|
||||||
esp32.const.VARIANT_ESP32C6: [0, 1],
|
esp32.const.VARIANT_ESP32C6: [0, 1],
|
||||||
|
esp32.const.VARIANT_ESP32H2: [0, 1],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ from esphome.components.esp32.const import (
|
||||||
VARIANT_ESP32S3,
|
VARIANT_ESP32S3,
|
||||||
VARIANT_ESP32C2,
|
VARIANT_ESP32C2,
|
||||||
VARIANT_ESP32C6,
|
VARIANT_ESP32C6,
|
||||||
|
VARIANT_ESP32H2,
|
||||||
)
|
)
|
||||||
from esphome.components.libretiny import get_libretiny_component, get_libretiny_family
|
from esphome.components.libretiny import get_libretiny_component, get_libretiny_family
|
||||||
from esphome.components.libretiny.const import (
|
from esphome.components.libretiny.const import (
|
||||||
|
@ -86,6 +87,7 @@ UART_SELECTION_ESP32 = {
|
||||||
VARIANT_ESP32C3: [UART0, UART1, USB_SERIAL_JTAG],
|
VARIANT_ESP32C3: [UART0, UART1, USB_SERIAL_JTAG],
|
||||||
VARIANT_ESP32C2: [UART0, UART1],
|
VARIANT_ESP32C2: [UART0, UART1],
|
||||||
VARIANT_ESP32C6: [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],
|
||||||
}
|
}
|
||||||
|
|
||||||
UART_SELECTION_ESP8266 = [UART0, UART0_SWAP, UART1]
|
UART_SELECTION_ESP8266 = [UART0, UART0_SWAP, UART1]
|
||||||
|
|
|
@ -121,7 +121,7 @@ void HOT Logger::log_message_(int level, const char *tag, int offset) {
|
||||||
if (
|
if (
|
||||||
#if defined(USE_ESP32_VARIANT_ESP32S2)
|
#if defined(USE_ESP32_VARIANT_ESP32S2)
|
||||||
uart_ == UART_SELECTION_USB_CDC
|
uart_ == UART_SELECTION_USB_CDC
|
||||||
#elif defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6)
|
#elif defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32H2)
|
||||||
uart_ == UART_SELECTION_USB_SERIAL_JTAG
|
uart_ == UART_SELECTION_USB_SERIAL_JTAG
|
||||||
#elif defined(USE_ESP32_VARIANT_ESP32S3)
|
#elif defined(USE_ESP32_VARIANT_ESP32S3)
|
||||||
uart_ == UART_SELECTION_USB_CDC || uart_ == UART_SELECTION_USB_SERIAL_JTAG
|
uart_ == UART_SELECTION_USB_CDC || uart_ == UART_SELECTION_USB_SERIAL_JTAG
|
||||||
|
@ -218,21 +218,24 @@ void Logger::pre_setup() {
|
||||||
uart_num_ = UART_NUM_1;
|
uart_num_ = UART_NUM_1;
|
||||||
break;
|
break;
|
||||||
#if !defined(USE_ESP32_VARIANT_ESP32C3) && !defined(USE_ESP32_VARIANT_ESP32C6) && \
|
#if !defined(USE_ESP32_VARIANT_ESP32C3) && !defined(USE_ESP32_VARIANT_ESP32C6) && \
|
||||||
!defined(USE_ESP32_VARIANT_ESP32S2) && !defined(USE_ESP32_VARIANT_ESP32S3)
|
!defined(USE_ESP32_VARIANT_ESP32S2) && !defined(USE_ESP32_VARIANT_ESP32S3) && !defined(USE_ESP32_VARIANT_ESP32H2)
|
||||||
case UART_SELECTION_UART2:
|
case UART_SELECTION_UART2:
|
||||||
uart_num_ = UART_NUM_2;
|
uart_num_ = UART_NUM_2;
|
||||||
break;
|
break;
|
||||||
#endif // !USE_ESP32_VARIANT_ESP32C3 && !USE_ESP32_VARIANT_ESP32S2 && !USE_ESP32_VARIANT_ESP32S3
|
#endif // !USE_ESP32_VARIANT_ESP32C3 && !USE_ESP32_VARIANT_ESP32S2 && !USE_ESP32_VARIANT_ESP32S3 &&
|
||||||
|
// !USE_ESP32_VARIANT_ESP32H2
|
||||||
#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
|
#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
|
||||||
case UART_SELECTION_USB_CDC:
|
case UART_SELECTION_USB_CDC:
|
||||||
uart_num_ = -1;
|
uart_num_ = -1;
|
||||||
break;
|
break;
|
||||||
#endif // USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3
|
#endif // USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3
|
||||||
#if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32S3)
|
#if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32S3) || \
|
||||||
|
defined(USE_ESP32_VARIANT_ESP32H2)
|
||||||
case UART_SELECTION_USB_SERIAL_JTAG:
|
case UART_SELECTION_USB_SERIAL_JTAG:
|
||||||
uart_num_ = -1;
|
uart_num_ = -1;
|
||||||
break;
|
break;
|
||||||
#endif // USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C6 || USE_ESP32_VARIANT_ESP32S3
|
#endif // USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C6 || USE_ESP32_VARIANT_ESP32S3 ||
|
||||||
|
// USE_ESP32_VARIANT_ESP32H2
|
||||||
}
|
}
|
||||||
if (uart_num_ >= 0) {
|
if (uart_num_ >= 0) {
|
||||||
uart_config_t uart_config{};
|
uart_config_t uart_config{};
|
||||||
|
@ -331,9 +334,10 @@ const char *const LOG_LEVELS[] = {"NONE", "ERROR", "WARN", "INFO", "CONFIG", "DE
|
||||||
const char *const UART_SELECTIONS[] = {
|
const char *const UART_SELECTIONS[] = {
|
||||||
"UART0", "UART1",
|
"UART0", "UART1",
|
||||||
#if !defined(USE_ESP32_VARIANT_ESP32C3) && !defined(USE_ESP32_VARIANT_ESP32C6) && \
|
#if !defined(USE_ESP32_VARIANT_ESP32C3) && !defined(USE_ESP32_VARIANT_ESP32C6) && \
|
||||||
!defined(USE_ESP32_VARIANT_ESP32S2) && !defined(USE_ESP32_VARIANT_ESP32S3)
|
!defined(USE_ESP32_VARIANT_ESP32S2) && !defined(USE_ESP32_VARIANT_ESP32S3) && !defined(USE_ESP32_VARIANT_ESP32H2)
|
||||||
"UART2",
|
"UART2",
|
||||||
#endif // !USE_ESP32_VARIANT_ESP32C3 && !USE_ESP32_VARIANT_ESP32S2 && !USE_ESP32_VARIANT_ESP32S3
|
#endif // !USE_ESP32_VARIANT_ESP32C3 && !USE_ESP32_VARINT_ESP32C6 && !USE_ESP32_VARIANT_ESP32S2 &&
|
||||||
|
// !USE_ESP32_VARIANT_ESP32S3 && !USE_ESP32_VARIANT_ESP32H2
|
||||||
#if defined(USE_ESP_IDF)
|
#if defined(USE_ESP_IDF)
|
||||||
#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
|
#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
|
||||||
"USB_CDC",
|
"USB_CDC",
|
||||||
|
|
|
@ -41,16 +41,19 @@ enum UARTSelection {
|
||||||
UART_SELECTION_UART1,
|
UART_SELECTION_UART1,
|
||||||
#if defined(USE_ESP32)
|
#if defined(USE_ESP32)
|
||||||
#if !defined(USE_ESP32_VARIANT_ESP32C3) && !defined(USE_ESP32_VARIANT_ESP32C6) && \
|
#if !defined(USE_ESP32_VARIANT_ESP32C3) && !defined(USE_ESP32_VARIANT_ESP32C6) && \
|
||||||
!defined(USE_ESP32_VARIANT_ESP32S2) && !defined(USE_ESP32_VARIANT_ESP32S3)
|
!defined(USE_ESP32_VARIANT_ESP32S2) && !defined(USE_ESP32_VARIANT_ESP32S3) && !defined(USE_ESP32_VARIANT_ESP32H2)
|
||||||
UART_SELECTION_UART2,
|
UART_SELECTION_UART2,
|
||||||
#endif // !USE_ESP32_VARIANT_ESP32C3 && !USE_ESP32_VARIANT_ESP32S2 && !USE_ESP32_VARIANT_ESP32S3
|
#endif // !USE_ESP32_VARIANT_ESP32C3 && !USE_ESP32_VARIANT_ESP32C6 && !USE_ESP32_VARIANT_ESP32S2 &&
|
||||||
|
// !USE_ESP32_VARIANT_ESP32S3 && !USE_ESP32_VARIANT_ESP32H2
|
||||||
#ifdef USE_ESP_IDF
|
#ifdef USE_ESP_IDF
|
||||||
#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
|
#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
|
||||||
UART_SELECTION_USB_CDC,
|
UART_SELECTION_USB_CDC,
|
||||||
#endif // USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3
|
#endif // USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3
|
||||||
#if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32S3)
|
#if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32S3) || \
|
||||||
|
defined(USE_ESP32_VARIANT_ESP32H2)
|
||||||
UART_SELECTION_USB_SERIAL_JTAG,
|
UART_SELECTION_USB_SERIAL_JTAG,
|
||||||
#endif // USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32S3
|
#endif // USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C6 || USE_ESP32_VARIANT_ESP32S3 ||
|
||||||
|
// USE_ESP32_VARIANT_ESP32H2
|
||||||
#endif // USE_ESP_IDF
|
#endif // USE_ESP_IDF
|
||||||
#endif // USE_ESP32
|
#endif // USE_ESP32
|
||||||
#ifdef USE_ESP8266
|
#ifdef USE_ESP8266
|
||||||
|
|
|
@ -34,12 +34,14 @@ from esphome.const import (
|
||||||
CONF_EAP,
|
CONF_EAP,
|
||||||
)
|
)
|
||||||
from esphome.core import CORE, HexInt, coroutine_with_priority
|
from esphome.core import CORE, HexInt, coroutine_with_priority
|
||||||
from esphome.components.esp32 import add_idf_sdkconfig_option
|
from esphome.components.esp32 import add_idf_sdkconfig_option, get_esp32_variant, const
|
||||||
from esphome.components.network import IPAddress
|
from esphome.components.network import IPAddress
|
||||||
from . import wpa2_eap
|
from . import wpa2_eap
|
||||||
|
|
||||||
AUTO_LOAD = ["network"]
|
AUTO_LOAD = ["network"]
|
||||||
|
|
||||||
|
NO_WIFI_VARIANTS = [const.VARIANT_ESP32H2]
|
||||||
|
|
||||||
wifi_ns = cg.esphome_ns.namespace("wifi")
|
wifi_ns = cg.esphome_ns.namespace("wifi")
|
||||||
EAPAuth = wifi_ns.struct("EAPAuth")
|
EAPAuth = wifi_ns.struct("EAPAuth")
|
||||||
ManualIP = wifi_ns.struct("ManualIP")
|
ManualIP = wifi_ns.struct("ManualIP")
|
||||||
|
@ -148,6 +150,13 @@ WIFI_NETWORK_STA = WIFI_NETWORK_BASE.extend(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_variant(_):
|
||||||
|
if CORE.is_esp32:
|
||||||
|
variant = get_esp32_variant()
|
||||||
|
if variant in NO_WIFI_VARIANTS:
|
||||||
|
raise cv.Invalid(f"{variant} does not support WiFi")
|
||||||
|
|
||||||
|
|
||||||
def final_validate(config):
|
def final_validate(config):
|
||||||
has_sta = bool(config.get(CONF_NETWORKS, True))
|
has_sta = bool(config.get(CONF_NETWORKS, True))
|
||||||
has_ap = CONF_AP in config
|
has_ap = CONF_AP in config
|
||||||
|
@ -199,6 +208,7 @@ FINAL_VALIDATE_SCHEMA = cv.All(
|
||||||
extra=cv.ALLOW_EXTRA,
|
extra=cv.ALLOW_EXTRA,
|
||||||
),
|
),
|
||||||
final_validate,
|
final_validate,
|
||||||
|
validate_variant,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue