mirror of
https://github.com/esphome/esphome.git
synced 2024-11-10 01:07:45 +01:00
Adding W5500 support to ethernet component (#4424)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
parent
f53f91e191
commit
4a9d7771fe
8 changed files with 298 additions and 23 deletions
|
@ -1,6 +1,13 @@
|
||||||
from esphome import pins
|
from esphome import pins
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
|
import esphome.final_validate as fv
|
||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
|
from esphome.components.esp32 import add_idf_sdkconfig_option, get_esp32_variant
|
||||||
|
from esphome.components.esp32.const import (
|
||||||
|
VARIANT_ESP32C3,
|
||||||
|
VARIANT_ESP32S2,
|
||||||
|
VARIANT_ESP32S3,
|
||||||
|
)
|
||||||
from esphome.const import (
|
from esphome.const import (
|
||||||
CONF_DOMAIN,
|
CONF_DOMAIN,
|
||||||
CONF_ID,
|
CONF_ID,
|
||||||
|
@ -12,9 +19,17 @@ from esphome.const import (
|
||||||
CONF_SUBNET,
|
CONF_SUBNET,
|
||||||
CONF_DNS1,
|
CONF_DNS1,
|
||||||
CONF_DNS2,
|
CONF_DNS2,
|
||||||
|
CONF_CLK_PIN,
|
||||||
|
CONF_MISO_PIN,
|
||||||
|
CONF_MOSI_PIN,
|
||||||
|
CONF_CS_PIN,
|
||||||
|
CONF_INTERRUPT_PIN,
|
||||||
|
CONF_RESET_PIN,
|
||||||
|
CONF_SPI,
|
||||||
)
|
)
|
||||||
from esphome.core import CORE, coroutine_with_priority
|
from esphome.core import CORE, coroutine_with_priority
|
||||||
from esphome.components.network import IPAddress
|
from esphome.components.network import IPAddress
|
||||||
|
from esphome.components.spi import get_spi_interface, CONF_INTERFACE_INDEX
|
||||||
|
|
||||||
CONFLICTS_WITH = ["wifi"]
|
CONFLICTS_WITH = ["wifi"]
|
||||||
DEPENDENCIES = ["esp32"]
|
DEPENDENCIES = ["esp32"]
|
||||||
|
@ -27,6 +42,8 @@ CONF_MDIO_PIN = "mdio_pin"
|
||||||
CONF_CLK_MODE = "clk_mode"
|
CONF_CLK_MODE = "clk_mode"
|
||||||
CONF_POWER_PIN = "power_pin"
|
CONF_POWER_PIN = "power_pin"
|
||||||
|
|
||||||
|
CONF_CLOCK_SPEED = "clock_speed"
|
||||||
|
|
||||||
EthernetType = ethernet_ns.enum("EthernetType")
|
EthernetType = ethernet_ns.enum("EthernetType")
|
||||||
ETHERNET_TYPES = {
|
ETHERNET_TYPES = {
|
||||||
"LAN8720": EthernetType.ETHERNET_TYPE_LAN8720,
|
"LAN8720": EthernetType.ETHERNET_TYPE_LAN8720,
|
||||||
|
@ -36,8 +53,11 @@ ETHERNET_TYPES = {
|
||||||
"JL1101": EthernetType.ETHERNET_TYPE_JL1101,
|
"JL1101": EthernetType.ETHERNET_TYPE_JL1101,
|
||||||
"KSZ8081": EthernetType.ETHERNET_TYPE_KSZ8081,
|
"KSZ8081": EthernetType.ETHERNET_TYPE_KSZ8081,
|
||||||
"KSZ8081RNA": EthernetType.ETHERNET_TYPE_KSZ8081RNA,
|
"KSZ8081RNA": EthernetType.ETHERNET_TYPE_KSZ8081RNA,
|
||||||
|
"W5500": EthernetType.ETHERNET_TYPE_W5500,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SPI_ETHERNET_TYPES = ["W5500"]
|
||||||
|
|
||||||
emac_rmii_clock_mode_t = cg.global_ns.enum("emac_rmii_clock_mode_t")
|
emac_rmii_clock_mode_t = cg.global_ns.enum("emac_rmii_clock_mode_t")
|
||||||
emac_rmii_clock_gpio_t = cg.global_ns.enum("emac_rmii_clock_gpio_t")
|
emac_rmii_clock_gpio_t = cg.global_ns.enum("emac_rmii_clock_gpio_t")
|
||||||
CLK_MODES = {
|
CLK_MODES = {
|
||||||
|
@ -84,11 +104,22 @@ def _validate(config):
|
||||||
return config
|
return config
|
||||||
|
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.All(
|
BASE_SCHEMA = cv.Schema(
|
||||||
|
{
|
||||||
|
cv.GenerateID(): cv.declare_id(EthernetComponent),
|
||||||
|
cv.Optional(CONF_MANUAL_IP): MANUAL_IP_SCHEMA,
|
||||||
|
cv.Optional(CONF_DOMAIN, default=".local"): cv.domain_name,
|
||||||
|
cv.Optional(CONF_USE_ADDRESS): cv.string_strict,
|
||||||
|
cv.Optional("enable_mdns"): cv.invalid(
|
||||||
|
"This option has been removed. Please use the [disabled] option under the "
|
||||||
|
"new mdns component instead."
|
||||||
|
),
|
||||||
|
}
|
||||||
|
).extend(cv.COMPONENT_SCHEMA)
|
||||||
|
|
||||||
|
RMII_SCHEMA = BASE_SCHEMA.extend(
|
||||||
cv.Schema(
|
cv.Schema(
|
||||||
{
|
{
|
||||||
cv.GenerateID(): cv.declare_id(EthernetComponent),
|
|
||||||
cv.Required(CONF_TYPE): cv.enum(ETHERNET_TYPES, upper=True),
|
|
||||||
cv.Required(CONF_MDC_PIN): pins.internal_gpio_output_pin_number,
|
cv.Required(CONF_MDC_PIN): pins.internal_gpio_output_pin_number,
|
||||||
cv.Required(CONF_MDIO_PIN): pins.internal_gpio_output_pin_number,
|
cv.Required(CONF_MDIO_PIN): pins.internal_gpio_output_pin_number,
|
||||||
cv.Optional(CONF_CLK_MODE, default="GPIO0_IN"): cv.enum(
|
cv.Optional(CONF_CLK_MODE, default="GPIO0_IN"): cv.enum(
|
||||||
|
@ -96,19 +127,64 @@ CONFIG_SCHEMA = cv.All(
|
||||||
),
|
),
|
||||||
cv.Optional(CONF_PHY_ADDR, default=0): cv.int_range(min=0, max=31),
|
cv.Optional(CONF_PHY_ADDR, default=0): cv.int_range(min=0, max=31),
|
||||||
cv.Optional(CONF_POWER_PIN): pins.internal_gpio_output_pin_number,
|
cv.Optional(CONF_POWER_PIN): pins.internal_gpio_output_pin_number,
|
||||||
cv.Optional(CONF_MANUAL_IP): MANUAL_IP_SCHEMA,
|
}
|
||||||
cv.Optional(CONF_DOMAIN, default=".local"): cv.domain_name,
|
)
|
||||||
cv.Optional(CONF_USE_ADDRESS): cv.string_strict,
|
)
|
||||||
cv.Optional("enable_mdns"): cv.invalid(
|
|
||||||
"This option has been removed. Please use the [disabled] option under the "
|
SPI_SCHEMA = BASE_SCHEMA.extend(
|
||||||
"new mdns component instead."
|
cv.Schema(
|
||||||
|
{
|
||||||
|
cv.Required(CONF_CLK_PIN): pins.internal_gpio_output_pin_number,
|
||||||
|
cv.Required(CONF_MISO_PIN): pins.internal_gpio_input_pin_number,
|
||||||
|
cv.Required(CONF_MOSI_PIN): pins.internal_gpio_output_pin_number,
|
||||||
|
cv.Required(CONF_CS_PIN): pins.internal_gpio_output_pin_number,
|
||||||
|
cv.Optional(CONF_INTERRUPT_PIN): pins.internal_gpio_input_pin_number,
|
||||||
|
cv.Optional(CONF_RESET_PIN): pins.internal_gpio_output_pin_number,
|
||||||
|
cv.Optional(CONF_CLOCK_SPEED, default="26.67MHz"): cv.All(
|
||||||
|
cv.frequency, cv.int_range(int(8e6), int(80e6))
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
).extend(cv.COMPONENT_SCHEMA),
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
CONFIG_SCHEMA = cv.All(
|
||||||
|
cv.typed_schema(
|
||||||
|
{
|
||||||
|
"LAN8720": RMII_SCHEMA,
|
||||||
|
"RTL8201": RMII_SCHEMA,
|
||||||
|
"DP83848": RMII_SCHEMA,
|
||||||
|
"IP101": RMII_SCHEMA,
|
||||||
|
"JL1101": RMII_SCHEMA,
|
||||||
|
"W5500": SPI_SCHEMA,
|
||||||
|
},
|
||||||
|
upper=True,
|
||||||
|
),
|
||||||
_validate,
|
_validate,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _final_validate(config):
|
||||||
|
if config[CONF_TYPE] not in SPI_ETHERNET_TYPES:
|
||||||
|
return
|
||||||
|
if spi_configs := fv.full_config.get().get(CONF_SPI):
|
||||||
|
variant = get_esp32_variant()
|
||||||
|
if variant in (VARIANT_ESP32C3, VARIANT_ESP32S2, VARIANT_ESP32S3):
|
||||||
|
spi_host = "SPI2_HOST"
|
||||||
|
else:
|
||||||
|
spi_host = "SPI3_HOST"
|
||||||
|
for spi_conf in spi_configs:
|
||||||
|
if (index := spi_conf.get(CONF_INTERFACE_INDEX)) is not None:
|
||||||
|
interface = get_spi_interface(index)
|
||||||
|
if interface == spi_host:
|
||||||
|
raise cv.Invalid(
|
||||||
|
f"`spi` component is using interface '{interface}'. "
|
||||||
|
f"To use {config[CONF_TYPE]}, you must change the `interface` on the `spi` component.",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
FINAL_VALIDATE_SCHEMA = _final_validate
|
||||||
|
|
||||||
|
|
||||||
def manual_ip(config):
|
def manual_ip(config):
|
||||||
return cg.StructInitializer(
|
return cg.StructInitializer(
|
||||||
ManualIP,
|
ManualIP,
|
||||||
|
@ -125,15 +201,31 @@ async def to_code(config):
|
||||||
var = cg.new_Pvariable(config[CONF_ID])
|
var = cg.new_Pvariable(config[CONF_ID])
|
||||||
await cg.register_component(var, config)
|
await cg.register_component(var, config)
|
||||||
|
|
||||||
cg.add(var.set_phy_addr(config[CONF_PHY_ADDR]))
|
if config[CONF_TYPE] == "W5500":
|
||||||
cg.add(var.set_mdc_pin(config[CONF_MDC_PIN]))
|
cg.add(var.set_clk_pin(config[CONF_CLK_PIN]))
|
||||||
cg.add(var.set_mdio_pin(config[CONF_MDIO_PIN]))
|
cg.add(var.set_miso_pin(config[CONF_MISO_PIN]))
|
||||||
cg.add(var.set_type(config[CONF_TYPE]))
|
cg.add(var.set_mosi_pin(config[CONF_MOSI_PIN]))
|
||||||
cg.add(var.set_clk_mode(*CLK_MODES[config[CONF_CLK_MODE]]))
|
cg.add(var.set_cs_pin(config[CONF_CS_PIN]))
|
||||||
cg.add(var.set_use_address(config[CONF_USE_ADDRESS]))
|
if CONF_INTERRUPT_PIN in config:
|
||||||
|
cg.add(var.set_interrupt_pin(config[CONF_INTERRUPT_PIN]))
|
||||||
|
if CONF_RESET_PIN in config:
|
||||||
|
cg.add(var.set_reset_pin(config[CONF_RESET_PIN]))
|
||||||
|
cg.add(var.set_clock_speed(config[CONF_CLOCK_SPEED]))
|
||||||
|
|
||||||
if CONF_POWER_PIN in config:
|
cg.add_define("USE_ETHERNET_SPI")
|
||||||
cg.add(var.set_power_pin(config[CONF_POWER_PIN]))
|
if CORE.using_esp_idf:
|
||||||
|
add_idf_sdkconfig_option("CONFIG_ETH_USE_SPI_ETHERNET", True)
|
||||||
|
add_idf_sdkconfig_option("CONFIG_ETH_SPI_ETHERNET_W5500", True)
|
||||||
|
else:
|
||||||
|
cg.add(var.set_phy_addr(config[CONF_PHY_ADDR]))
|
||||||
|
cg.add(var.set_mdc_pin(config[CONF_MDC_PIN]))
|
||||||
|
cg.add(var.set_mdio_pin(config[CONF_MDIO_PIN]))
|
||||||
|
cg.add(var.set_clk_mode(*CLK_MODES[config[CONF_CLK_MODE]]))
|
||||||
|
if CONF_POWER_PIN in config:
|
||||||
|
cg.add(var.set_power_pin(config[CONF_POWER_PIN]))
|
||||||
|
|
||||||
|
cg.add(var.set_type(ETHERNET_TYPES[config[CONF_TYPE]]))
|
||||||
|
cg.add(var.set_use_address(config[CONF_USE_ADDRESS]))
|
||||||
|
|
||||||
if CONF_MANUAL_IP in config:
|
if CONF_MANUAL_IP in config:
|
||||||
cg.add(var.set_manual_ip(manual_ip(config[CONF_MANUAL_IP])))
|
cg.add(var.set_manual_ip(manual_ip(config[CONF_MANUAL_IP])))
|
||||||
|
|
|
@ -9,6 +9,11 @@
|
||||||
#include <lwip/dns.h>
|
#include <lwip/dns.h>
|
||||||
#include "esp_event.h"
|
#include "esp_event.h"
|
||||||
|
|
||||||
|
#ifdef USE_ETHERNET_SPI
|
||||||
|
#include <driver/gpio.h>
|
||||||
|
#include <driver/spi_master.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace esphome {
|
namespace esphome {
|
||||||
namespace ethernet {
|
namespace ethernet {
|
||||||
|
|
||||||
|
@ -33,6 +38,36 @@ void EthernetComponent::setup() {
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t err;
|
esp_err_t err;
|
||||||
|
|
||||||
|
#ifdef USE_ETHERNET_SPI
|
||||||
|
// Install GPIO ISR handler to be able to service SPI Eth modules interrupts
|
||||||
|
gpio_install_isr_service(0);
|
||||||
|
|
||||||
|
spi_bus_config_t buscfg = {
|
||||||
|
.mosi_io_num = this->mosi_pin_,
|
||||||
|
.miso_io_num = this->miso_pin_,
|
||||||
|
.sclk_io_num = this->clk_pin_,
|
||||||
|
.quadwp_io_num = -1,
|
||||||
|
.quadhd_io_num = -1,
|
||||||
|
.data4_io_num = -1,
|
||||||
|
.data5_io_num = -1,
|
||||||
|
.data6_io_num = -1,
|
||||||
|
.data7_io_num = -1,
|
||||||
|
.max_transfer_sz = 0,
|
||||||
|
.flags = 0,
|
||||||
|
.intr_flags = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
#if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
|
||||||
|
auto host = SPI2_HOST;
|
||||||
|
#else
|
||||||
|
auto host = SPI3_HOST;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
err = spi_bus_initialize(host, &buscfg, SPI_DMA_CH_AUTO);
|
||||||
|
ESPHL_ERROR_CHECK(err, "SPI bus initialize error");
|
||||||
|
#endif
|
||||||
|
|
||||||
err = esp_netif_init();
|
err = esp_netif_init();
|
||||||
ESPHL_ERROR_CHECK(err, "ETH netif init error");
|
ESPHL_ERROR_CHECK(err, "ETH netif init error");
|
||||||
err = esp_event_loop_create_default();
|
err = esp_event_loop_create_default();
|
||||||
|
@ -43,10 +78,40 @@ void EthernetComponent::setup() {
|
||||||
|
|
||||||
// Init MAC and PHY configs to default
|
// Init MAC and PHY configs to default
|
||||||
eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG();
|
eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG();
|
||||||
|
eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG();
|
||||||
|
|
||||||
|
#ifdef USE_ETHERNET_SPI // Configure SPI interface and Ethernet driver for specific SPI module
|
||||||
|
spi_device_interface_config_t devcfg = {
|
||||||
|
.command_bits = 16, // Actually it's the address phase in W5500 SPI frame
|
||||||
|
.address_bits = 8, // Actually it's the control phase in W5500 SPI frame
|
||||||
|
.dummy_bits = 0,
|
||||||
|
.mode = 0,
|
||||||
|
.duty_cycle_pos = 0,
|
||||||
|
.cs_ena_pretrans = 0,
|
||||||
|
.cs_ena_posttrans = 0,
|
||||||
|
.clock_speed_hz = this->clock_speed_,
|
||||||
|
.input_delay_ns = 0,
|
||||||
|
.spics_io_num = this->cs_pin_,
|
||||||
|
.flags = 0,
|
||||||
|
.queue_size = 20,
|
||||||
|
.pre_cb = nullptr,
|
||||||
|
.post_cb = nullptr,
|
||||||
|
};
|
||||||
|
|
||||||
|
spi_device_handle_t spi_handle = nullptr;
|
||||||
|
err = spi_bus_add_device(host, &devcfg, &spi_handle);
|
||||||
|
ESPHL_ERROR_CHECK(err, "SPI bus add device error");
|
||||||
|
|
||||||
|
eth_w5500_config_t w5500_config = ETH_W5500_DEFAULT_CONFIG(spi_handle);
|
||||||
|
w5500_config.int_gpio_num = this->interrupt_pin_;
|
||||||
|
phy_config.phy_addr = this->phy_addr_spi_;
|
||||||
|
phy_config.reset_gpio_num = this->reset_pin_;
|
||||||
|
|
||||||
|
esp_eth_mac_t *mac = esp_eth_mac_new_w5500(&w5500_config, &mac_config);
|
||||||
|
#else
|
||||||
phy_config.phy_addr = this->phy_addr_;
|
phy_config.phy_addr = this->phy_addr_;
|
||||||
phy_config.reset_gpio_num = this->power_pin_;
|
phy_config.reset_gpio_num = this->power_pin_;
|
||||||
|
|
||||||
eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG();
|
|
||||||
#if ESP_IDF_VERSION_MAJOR >= 5
|
#if ESP_IDF_VERSION_MAJOR >= 5
|
||||||
eth_esp32_emac_config_t esp32_emac_config = ETH_ESP32_EMAC_DEFAULT_CONFIG();
|
eth_esp32_emac_config_t esp32_emac_config = ETH_ESP32_EMAC_DEFAULT_CONFIG();
|
||||||
esp32_emac_config.smi_mdc_gpio_num = this->mdc_pin_;
|
esp32_emac_config.smi_mdc_gpio_num = this->mdc_pin_;
|
||||||
|
@ -62,9 +127,11 @@ void EthernetComponent::setup() {
|
||||||
mac_config.clock_config.rmii.clock_gpio = this->clk_gpio_;
|
mac_config.clock_config.rmii.clock_gpio = this->clk_gpio_;
|
||||||
|
|
||||||
esp_eth_mac_t *mac = esp_eth_mac_new_esp32(&mac_config);
|
esp_eth_mac_t *mac = esp_eth_mac_new_esp32(&mac_config);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
switch (this->type_) {
|
switch (this->type_) {
|
||||||
|
#if CONFIG_ETH_USE_ESP32_EMAC
|
||||||
case ETHERNET_TYPE_LAN8720: {
|
case ETHERNET_TYPE_LAN8720: {
|
||||||
this->phy_ = esp_eth_phy_new_lan87xx(&phy_config);
|
this->phy_ = esp_eth_phy_new_lan87xx(&phy_config);
|
||||||
break;
|
break;
|
||||||
|
@ -94,6 +161,13 @@ void EthernetComponent::setup() {
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef USE_ETHERNET_SPI
|
||||||
|
case ETHERNET_TYPE_W5500: {
|
||||||
|
this->phy_ = esp_eth_phy_new_w5500(&phy_config);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
default: {
|
default: {
|
||||||
this->mark_failed();
|
this->mark_failed();
|
||||||
return;
|
return;
|
||||||
|
@ -105,10 +179,18 @@ void EthernetComponent::setup() {
|
||||||
err = esp_eth_driver_install(ð_config, &this->eth_handle_);
|
err = esp_eth_driver_install(ð_config, &this->eth_handle_);
|
||||||
ESPHL_ERROR_CHECK(err, "ETH driver install error");
|
ESPHL_ERROR_CHECK(err, "ETH driver install error");
|
||||||
|
|
||||||
|
#ifndef USE_ETHERNET_SPI
|
||||||
if (this->type_ == ETHERNET_TYPE_KSZ8081RNA && this->clk_mode_ == EMAC_CLK_OUT) {
|
if (this->type_ == ETHERNET_TYPE_KSZ8081RNA && this->clk_mode_ == EMAC_CLK_OUT) {
|
||||||
// KSZ8081RNA default is incorrect. It expects a 25MHz clock instead of the 50MHz we provide.
|
// KSZ8081RNA default is incorrect. It expects a 25MHz clock instead of the 50MHz we provide.
|
||||||
this->ksz8081_set_clock_reference_(mac);
|
this->ksz8081_set_clock_reference_(mac);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// use ESP internal eth mac
|
||||||
|
uint8_t mac_addr[6];
|
||||||
|
esp_read_mac(mac_addr, ESP_MAC_ETH);
|
||||||
|
err = esp_eth_ioctl(this->eth_handle_, ETH_CMD_S_MAC_ADDR, mac_addr);
|
||||||
|
ESPHL_ERROR_CHECK(err, "set mac address error");
|
||||||
|
|
||||||
/* attach Ethernet driver to TCP/IP stack */
|
/* attach Ethernet driver to TCP/IP stack */
|
||||||
err = esp_netif_attach(this->eth_netif_, esp_eth_new_netif_glue(this->eth_handle_));
|
err = esp_netif_attach(this->eth_netif_, esp_eth_new_netif_glue(this->eth_handle_));
|
||||||
|
@ -200,6 +282,10 @@ void EthernetComponent::dump_config() {
|
||||||
eth_type = "KSZ8081RNA";
|
eth_type = "KSZ8081RNA";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ETHERNET_TYPE_W5500:
|
||||||
|
eth_type = "W5500";
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
eth_type = "Unknown";
|
eth_type = "Unknown";
|
||||||
break;
|
break;
|
||||||
|
@ -207,13 +293,23 @@ void EthernetComponent::dump_config() {
|
||||||
|
|
||||||
ESP_LOGCONFIG(TAG, "Ethernet:");
|
ESP_LOGCONFIG(TAG, "Ethernet:");
|
||||||
this->dump_connect_params_();
|
this->dump_connect_params_();
|
||||||
|
#ifdef USE_ETHERNET_SPI
|
||||||
|
ESP_LOGCONFIG(TAG, " CLK Pin: %u", this->clk_pin_);
|
||||||
|
ESP_LOGCONFIG(TAG, " MISO Pin: %u", this->miso_pin_);
|
||||||
|
ESP_LOGCONFIG(TAG, " MOSI Pin: %u", this->mosi_pin_);
|
||||||
|
ESP_LOGCONFIG(TAG, " CS Pin: %u", this->cs_pin_);
|
||||||
|
ESP_LOGCONFIG(TAG, " IRQ Pin: %u", this->interrupt_pin_);
|
||||||
|
ESP_LOGCONFIG(TAG, " Reset Pin: %d", this->reset_pin_);
|
||||||
|
ESP_LOGCONFIG(TAG, " Clock Speed: %d MHz", this->clock_speed_ / 1000000);
|
||||||
|
#else
|
||||||
if (this->power_pin_ != -1) {
|
if (this->power_pin_ != -1) {
|
||||||
ESP_LOGCONFIG(TAG, " Power Pin: %u", this->power_pin_);
|
ESP_LOGCONFIG(TAG, " Power Pin: %u", this->power_pin_);
|
||||||
}
|
}
|
||||||
ESP_LOGCONFIG(TAG, " MDC Pin: %u", this->mdc_pin_);
|
ESP_LOGCONFIG(TAG, " MDC Pin: %u", this->mdc_pin_);
|
||||||
ESP_LOGCONFIG(TAG, " MDIO Pin: %u", this->mdio_pin_);
|
ESP_LOGCONFIG(TAG, " MDIO Pin: %u", this->mdio_pin_);
|
||||||
ESP_LOGCONFIG(TAG, " Type: %s", eth_type);
|
|
||||||
ESP_LOGCONFIG(TAG, " PHY addr: %u", this->phy_addr_);
|
ESP_LOGCONFIG(TAG, " PHY addr: %u", this->phy_addr_);
|
||||||
|
#endif
|
||||||
|
ESP_LOGCONFIG(TAG, " Type: %s", eth_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
float EthernetComponent::get_setup_priority() const { return setup_priority::WIFI; }
|
float EthernetComponent::get_setup_priority() const { return setup_priority::WIFI; }
|
||||||
|
@ -407,15 +503,25 @@ void EthernetComponent::dump_connect_params_() {
|
||||||
ESP_LOGCONFIG(TAG, " Link Speed: %u", speed == ETH_SPEED_100M ? 100 : 10);
|
ESP_LOGCONFIG(TAG, " Link Speed: %u", speed == ETH_SPEED_100M ? 100 : 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_ETHERNET_SPI
|
||||||
|
void EthernetComponent::set_clk_pin(uint8_t clk_pin) { this->clk_pin_ = clk_pin; }
|
||||||
|
void EthernetComponent::set_miso_pin(uint8_t miso_pin) { this->miso_pin_ = miso_pin; }
|
||||||
|
void EthernetComponent::set_mosi_pin(uint8_t mosi_pin) { this->mosi_pin_ = mosi_pin; }
|
||||||
|
void EthernetComponent::set_cs_pin(uint8_t cs_pin) { this->cs_pin_ = cs_pin; }
|
||||||
|
void EthernetComponent::set_interrupt_pin(uint8_t interrupt_pin) { this->interrupt_pin_ = interrupt_pin; }
|
||||||
|
void EthernetComponent::set_reset_pin(uint8_t reset_pin) { this->reset_pin_ = reset_pin; }
|
||||||
|
void EthernetComponent::set_clock_speed(int clock_speed) { this->clock_speed_ = clock_speed; }
|
||||||
|
#else
|
||||||
void EthernetComponent::set_phy_addr(uint8_t phy_addr) { this->phy_addr_ = phy_addr; }
|
void EthernetComponent::set_phy_addr(uint8_t phy_addr) { this->phy_addr_ = phy_addr; }
|
||||||
void EthernetComponent::set_power_pin(int power_pin) { this->power_pin_ = power_pin; }
|
void EthernetComponent::set_power_pin(int power_pin) { this->power_pin_ = power_pin; }
|
||||||
void EthernetComponent::set_mdc_pin(uint8_t mdc_pin) { this->mdc_pin_ = mdc_pin; }
|
void EthernetComponent::set_mdc_pin(uint8_t mdc_pin) { this->mdc_pin_ = mdc_pin; }
|
||||||
void EthernetComponent::set_mdio_pin(uint8_t mdio_pin) { this->mdio_pin_ = mdio_pin; }
|
void EthernetComponent::set_mdio_pin(uint8_t mdio_pin) { this->mdio_pin_ = mdio_pin; }
|
||||||
void EthernetComponent::set_type(EthernetType type) { this->type_ = type; }
|
|
||||||
void EthernetComponent::set_clk_mode(emac_rmii_clock_mode_t clk_mode, emac_rmii_clock_gpio_t clk_gpio) {
|
void EthernetComponent::set_clk_mode(emac_rmii_clock_mode_t clk_mode, emac_rmii_clock_gpio_t clk_gpio) {
|
||||||
this->clk_mode_ = clk_mode;
|
this->clk_mode_ = clk_mode;
|
||||||
this->clk_gpio_ = clk_gpio;
|
this->clk_gpio_ = clk_gpio;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
void EthernetComponent::set_type(EthernetType type) { this->type_ = type; }
|
||||||
void EthernetComponent::set_manual_ip(const ManualIP &manual_ip) { this->manual_ip_ = manual_ip; }
|
void EthernetComponent::set_manual_ip(const ManualIP &manual_ip) { this->manual_ip_ = manual_ip; }
|
||||||
|
|
||||||
std::string EthernetComponent::get_use_address() const {
|
std::string EthernetComponent::get_use_address() const {
|
||||||
|
@ -442,6 +548,7 @@ bool EthernetComponent::powerdown() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef USE_ETHERNET_SPI
|
||||||
void EthernetComponent::ksz8081_set_clock_reference_(esp_eth_mac_t *mac) {
|
void EthernetComponent::ksz8081_set_clock_reference_(esp_eth_mac_t *mac) {
|
||||||
#define KSZ80XX_PC2R_REG_ADDR (0x1F)
|
#define KSZ80XX_PC2R_REG_ADDR (0x1F)
|
||||||
|
|
||||||
|
@ -472,6 +579,7 @@ void EthernetComponent::ksz8081_set_clock_reference_(esp_eth_mac_t *mac) {
|
||||||
|
|
||||||
#undef KSZ80XX_PC2R_REG_ADDR
|
#undef KSZ80XX_PC2R_REG_ADDR
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace ethernet
|
} // namespace ethernet
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|
|
@ -23,6 +23,7 @@ enum EthernetType {
|
||||||
ETHERNET_TYPE_JL1101,
|
ETHERNET_TYPE_JL1101,
|
||||||
ETHERNET_TYPE_KSZ8081,
|
ETHERNET_TYPE_KSZ8081,
|
||||||
ETHERNET_TYPE_KSZ8081RNA,
|
ETHERNET_TYPE_KSZ8081RNA,
|
||||||
|
ETHERNET_TYPE_W5500,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ManualIP {
|
struct ManualIP {
|
||||||
|
@ -50,12 +51,22 @@ class EthernetComponent : public Component {
|
||||||
void on_shutdown() override { powerdown(); }
|
void on_shutdown() override { powerdown(); }
|
||||||
bool is_connected();
|
bool is_connected();
|
||||||
|
|
||||||
|
#ifdef USE_ETHERNET_SPI
|
||||||
|
void set_clk_pin(uint8_t clk_pin);
|
||||||
|
void set_miso_pin(uint8_t miso_pin);
|
||||||
|
void set_mosi_pin(uint8_t mosi_pin);
|
||||||
|
void set_cs_pin(uint8_t cs_pin);
|
||||||
|
void set_interrupt_pin(uint8_t interrupt_pin);
|
||||||
|
void set_reset_pin(uint8_t reset_pin);
|
||||||
|
void set_clock_speed(int clock_speed);
|
||||||
|
#else
|
||||||
void set_phy_addr(uint8_t phy_addr);
|
void set_phy_addr(uint8_t phy_addr);
|
||||||
void set_power_pin(int power_pin);
|
void set_power_pin(int power_pin);
|
||||||
void set_mdc_pin(uint8_t mdc_pin);
|
void set_mdc_pin(uint8_t mdc_pin);
|
||||||
void set_mdio_pin(uint8_t mdio_pin);
|
void set_mdio_pin(uint8_t mdio_pin);
|
||||||
void set_type(EthernetType type);
|
|
||||||
void set_clk_mode(emac_rmii_clock_mode_t clk_mode, emac_rmii_clock_gpio_t clk_gpio);
|
void set_clk_mode(emac_rmii_clock_mode_t clk_mode, emac_rmii_clock_gpio_t clk_gpio);
|
||||||
|
#endif
|
||||||
|
void set_type(EthernetType type);
|
||||||
void set_manual_ip(const ManualIP &manual_ip);
|
void set_manual_ip(const ManualIP &manual_ip);
|
||||||
|
|
||||||
network::IPAddresses get_ip_addresses();
|
network::IPAddresses get_ip_addresses();
|
||||||
|
@ -76,13 +87,24 @@ class EthernetComponent : public Component {
|
||||||
void ksz8081_set_clock_reference_(esp_eth_mac_t *mac);
|
void ksz8081_set_clock_reference_(esp_eth_mac_t *mac);
|
||||||
|
|
||||||
std::string use_address_;
|
std::string use_address_;
|
||||||
|
#ifdef USE_ETHERNET_SPI
|
||||||
|
uint8_t clk_pin_;
|
||||||
|
uint8_t miso_pin_;
|
||||||
|
uint8_t mosi_pin_;
|
||||||
|
uint8_t cs_pin_;
|
||||||
|
uint8_t interrupt_pin_;
|
||||||
|
int reset_pin_{-1};
|
||||||
|
int phy_addr_spi_{-1};
|
||||||
|
int clock_speed_;
|
||||||
|
#else
|
||||||
uint8_t phy_addr_{0};
|
uint8_t phy_addr_{0};
|
||||||
int power_pin_{-1};
|
int power_pin_{-1};
|
||||||
uint8_t mdc_pin_{23};
|
uint8_t mdc_pin_{23};
|
||||||
uint8_t mdio_pin_{18};
|
uint8_t mdio_pin_{18};
|
||||||
EthernetType type_{ETHERNET_TYPE_UNKNOWN};
|
|
||||||
emac_rmii_clock_mode_t clk_mode_{EMAC_CLK_EXT_IN};
|
emac_rmii_clock_mode_t clk_mode_{EMAC_CLK_EXT_IN};
|
||||||
emac_rmii_clock_gpio_t clk_gpio_{EMAC_CLK_IN_GPIO};
|
emac_rmii_clock_gpio_t clk_gpio_{EMAC_CLK_IN_GPIO};
|
||||||
|
#endif
|
||||||
|
EthernetType type_{ETHERNET_TYPE_UNKNOWN};
|
||||||
optional<ManualIP> manual_ip_{};
|
optional<ManualIP> manual_ip_{};
|
||||||
|
|
||||||
bool started_{false};
|
bool started_{false};
|
||||||
|
|
|
@ -732,6 +732,7 @@ CONF_SPEED_COUNT = "speed_count"
|
||||||
CONF_SPEED_LEVEL_COMMAND_TOPIC = "speed_level_command_topic"
|
CONF_SPEED_LEVEL_COMMAND_TOPIC = "speed_level_command_topic"
|
||||||
CONF_SPEED_LEVEL_STATE_TOPIC = "speed_level_state_topic"
|
CONF_SPEED_LEVEL_STATE_TOPIC = "speed_level_state_topic"
|
||||||
CONF_SPEED_STATE_TOPIC = "speed_state_topic"
|
CONF_SPEED_STATE_TOPIC = "speed_state_topic"
|
||||||
|
CONF_SPI = "spi"
|
||||||
CONF_SPI_ID = "spi_id"
|
CONF_SPI_ID = "spi_id"
|
||||||
CONF_SPIKE_REJECTION = "spike_rejection"
|
CONF_SPIKE_REJECTION = "spike_rejection"
|
||||||
CONF_SSID = "ssid"
|
CONF_SSID = "ssid"
|
||||||
|
|
12
tests/components/ethernet/lan8720.esp32-idf.yaml
Normal file
12
tests/components/ethernet/lan8720.esp32-idf.yaml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
ethernet:
|
||||||
|
type: LAN8720
|
||||||
|
mdc_pin: 23
|
||||||
|
mdio_pin: 25
|
||||||
|
clk_mode: GPIO0_IN
|
||||||
|
phy_addr: 0
|
||||||
|
power_pin: 26
|
||||||
|
manual_ip:
|
||||||
|
static_ip: 192.168.178.56
|
||||||
|
gateway: 192.168.178.1
|
||||||
|
subnet: 255.255.255.0
|
||||||
|
domain: .local
|
12
tests/components/ethernet/lan8720.esp32.yaml
Normal file
12
tests/components/ethernet/lan8720.esp32.yaml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
ethernet:
|
||||||
|
type: LAN8720
|
||||||
|
mdc_pin: 23
|
||||||
|
mdio_pin: 25
|
||||||
|
clk_mode: GPIO0_IN
|
||||||
|
phy_addr: 0
|
||||||
|
power_pin: 26
|
||||||
|
manual_ip:
|
||||||
|
static_ip: 192.168.178.56
|
||||||
|
gateway: 192.168.178.1
|
||||||
|
subnet: 255.255.255.0
|
||||||
|
domain: .local
|
14
tests/components/ethernet/w5500.esp32-idf.yaml
Normal file
14
tests/components/ethernet/w5500.esp32-idf.yaml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
ethernet:
|
||||||
|
type: W5500
|
||||||
|
clk_pin: GPIO19
|
||||||
|
mosi_pin: GPIO21
|
||||||
|
miso_pin: GPIO23
|
||||||
|
cs_pin: GPIO18
|
||||||
|
interrupt_pin: GPIO36
|
||||||
|
reset_pin: GPIO22
|
||||||
|
clock_speed: 10Mhz
|
||||||
|
manual_ip:
|
||||||
|
static_ip: 192.168.178.56
|
||||||
|
gateway: 192.168.178.1
|
||||||
|
subnet: 255.255.255.0
|
||||||
|
domain: .local
|
14
tests/components/ethernet/w5500.esp32.yaml
Normal file
14
tests/components/ethernet/w5500.esp32.yaml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
ethernet:
|
||||||
|
type: W5500
|
||||||
|
clk_pin: GPIO19
|
||||||
|
mosi_pin: GPIO21
|
||||||
|
miso_pin: GPIO23
|
||||||
|
cs_pin: GPIO18
|
||||||
|
interrupt_pin: GPIO36
|
||||||
|
reset_pin: GPIO22
|
||||||
|
clock_speed: 10Mhz
|
||||||
|
manual_ip:
|
||||||
|
static_ip: 192.168.178.56
|
||||||
|
gateway: 192.168.178.1
|
||||||
|
subnet: 255.255.255.0
|
||||||
|
domain: .local
|
Loading…
Reference in a new issue