Add ESP32 Core3 support for SPI ethernet on DM9051, W5500 and KSZ8851

This commit is contained in:
Theo Arends 2024-02-08 16:45:28 +01:00
parent 2f0b1e8edd
commit 4e7e256892
3 changed files with 38 additions and 41 deletions

View File

@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file.
### Added ### Added
- Internal support for persistent JSON settings using single file - Internal support for persistent JSON settings using single file
- Command ``SetOption158`` to publish or suppress ModbusReceived MQTT messages (#20678) - Command ``SetOption158`` to publish or suppress ModbusReceived MQTT messages (#20678)
- ESP32 Core3 support for SPI ethernet on DM9051, W5500 and KSZ8851
### Breaking Changed ### Breaking Changed
- ESP32 LVGL library from v8.3.11 to v9.0.0, some small breaking changes in C, none in HASPmota (#20659) - ESP32 LVGL library from v8.3.11 to v9.0.0, some small breaking changes in C, none in HASPmota (#20659)

View File

@ -136,6 +136,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm
- ESP32 MI BLE support for Xiaomi LYWSD02MMC [#20381](https://github.com/arendst/Tasmota/issues/20381) - ESP32 MI BLE support for Xiaomi LYWSD02MMC [#20381](https://github.com/arendst/Tasmota/issues/20381)
- ESP32 support for Shelly Plus Add-On using DS18x20 or DHT11/AM2301/DHT21/DHT22/AM2302/AM2321/SI7021 on GPIO0/1 [#20580](https://github.com/arendst/Tasmota/issues/20580) - ESP32 support for Shelly Plus Add-On using DS18x20 or DHT11/AM2301/DHT21/DHT22/AM2302/AM2321/SI7021 on GPIO0/1 [#20580](https://github.com/arendst/Tasmota/issues/20580)
- ESP32 MI32 Legacy initial support for sensors using BTHOME packet format [#20625](https://github.com/arendst/Tasmota/issues/20625) - ESP32 MI32 Legacy initial support for sensors using BTHOME packet format [#20625](https://github.com/arendst/Tasmota/issues/20625)
- ESP32 Core3 support for SPI ethernet on DM9051, W5500 and KSZ8851
- ESP32-C3 support for GPIO11 [#18350](https://github.com/arendst/Tasmota/issues/18350) - ESP32-C3 support for GPIO11 [#18350](https://github.com/arendst/Tasmota/issues/18350)
- Berry GPIO viewer initial version using async webserver [#20416](https://github.com/arendst/Tasmota/issues/20416) - Berry GPIO viewer initial version using async webserver [#20416](https://github.com/arendst/Tasmota/issues/20416)
- Berry `introspect.set()` for class attributes [#20339](https://github.com/arendst/Tasmota/issues/20339) - Berry `introspect.set()` for class attributes [#20339](https://github.com/arendst/Tasmota/issues/20339)

View File

@ -71,8 +71,11 @@
#endif #endif
#ifndef ETH_TYPE #ifndef ETH_TYPE
#define ETH_TYPE ETH_PHY_LAN8720 // ETH.h eth_phy_type_t: 0 = ETH_PHY_LAN8720, 1 = ETH_PHY_TLK110/ETH_PHY_IP101, 2 = ETH_PHY_RTL8201, 3 = ETH_PHY_DP83848, 4 = ETH_PHY_DM9051, 5 = ETH_PHY_KSZ8081 #if ESP_IDF_VERSION_MAJOR >= 5
#define ETH_TYPE ETH_PHY_LAN8720 // ETH.h eth_phy_type_t: 0 = ETH_PHY_LAN8720, 1 = ETH_PHY_TLK110/ETH_PHY_IP101, 2 = ETH_PHY_RTL8201, 3 = ETH_PHY_JL1101, 4 = ETH_PHY_DP83848, 5 = ETH_PHY_KSZ8041, 6 = ETH_PHY_KSZ8081, 7 = ETH_PHY_DM9051, 8 = ETH_PHY_W5500, 9 = ETH_PHY_KSZ8851
#else
#define ETH_TYPE ETH_PHY_LAN8720 // ETH.h eth_phy_type_t: 0 = ETH_PHY_LAN8720, 1 = ETH_PHY_TLK110/ETH_PHY_IP101, 2 = ETH_PHY_RTL8201, 3 = ETH_PHY_DP83848, 4 = ETH_PHY_DM9051, 5 = ETH_PHY_KSZ8041, 6 = ETH_PHY_KSZ8081, 7 = ETH_PHY_JL1101
#endif
#endif #endif
#ifndef ETH_CLKMODE #ifndef ETH_CLKMODE
@ -104,11 +107,11 @@ void EthernetEvent(arduino_event_t *event) {
while (esp_netif_create_ip6_linklocal(get_esp_interface_netif(ESP_IF_ETH)) != ESP_OK) { while (esp_netif_create_ip6_linklocal(get_esp_interface_netif(ESP_IF_ETH)) != ESP_OK) {
delay(1); delay(1);
if (i-- == 0) { if (i-- == 0) {
AddLog(LOG_LEVEL_INFO, ">>>> HELP"); AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_ETH ">>>> HELP"));
break; break;
} }
} }
AddLog(LOG_LEVEL_INFO, ">>>> ESP_IF_ETH i=%i", i); AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_ETH "ESP_IF_ETH i=%i"), i);
} }
#endif // USE_IPV6 #endif // USE_IPV6
@ -183,12 +186,6 @@ void EthernetSetIp(void) {
void EthernetInit(void) { void EthernetInit(void) {
if (!Settings->flag4.network_ethernet) { return; } if (!Settings->flag4.network_ethernet) { return; }
if (!PinUsed(GPIO_ETH_PHY_MDC) && !PinUsed(GPIO_ETH_PHY_MDIO)) {
AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_ETH "No ETH MDC and/or ETH MDIO GPIO defined"));
return;
}
eth_config_change = 0;
if (WT32_ETH01 == TasmotaGlobal.module_type) { if (WT32_ETH01 == TasmotaGlobal.module_type) {
Settings->eth_address = 1; // EthAddress Settings->eth_address = 1; // EthAddress
@ -196,45 +193,43 @@ void EthernetInit(void) {
Settings->eth_clk_mode = ETH_CLOCK_GPIO0_IN; // EthClockMode Settings->eth_clk_mode = ETH_CLOCK_GPIO0_IN; // EthClockMode
} }
// snprintf_P(Eth.hostname, sizeof(Eth.hostname), PSTR("%s-eth"), TasmotaGlobal.hostname); if (!PinUsed(GPIO_ETH_PHY_MDC) && !PinUsed(GPIO_ETH_PHY_MDIO)) {
if (Settings->eth_type < 7) {
// CONFIG_ETH_USE_ESP32_EMAC
AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_ETH "No ETH MDC and ETH MDIO GPIO defined"));
} else {
// CONFIG_ETH_SPI_ETHERNET
if (!PinUsed(GPIO_ETH_PHY_POWER)) {
AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_ETH "No ETH MDC (SPI CS), ETH MDIO (SPI IRQ) and ETH POWER (SPI RST) GPIO defined"));
}
}
return;
}
eth_config_change = 0;
strlcpy(eth_hostname, TasmotaGlobal.hostname, sizeof(eth_hostname) -5); // Make sure there is room for "-eth" strlcpy(eth_hostname, TasmotaGlobal.hostname, sizeof(eth_hostname) -5); // Make sure there is room for "-eth"
strcat(eth_hostname, "-eth"); strcat(eth_hostname, "-eth");
WiFi.onEvent(EthernetEvent); WiFi.onEvent(EthernetEvent);
int eth_power = Pin(GPIO_ETH_PHY_POWER); int eth_mdc = Pin(GPIO_ETH_PHY_MDC); // Ethernet SPI CS (chip select)
int eth_mdc = Pin(GPIO_ETH_PHY_MDC); int eth_mdio = Pin(GPIO_ETH_PHY_MDIO); // Ethernet SPI IRQ
int eth_mdio = Pin(GPIO_ETH_PHY_MDIO); int eth_power = Pin(GPIO_ETH_PHY_POWER); // Ethernet SPI RST
//#if CONFIG_IDF_TARGET_ESP32
// fix an disconnection issue after rebooting Olimex POE - this forces a clean state for all GPIO involved in RMII bool init_ok = false;
// gpio_reset_pin((gpio_num_t)GPIO_ETH_PHY_POWER);
// gpio_reset_pin((gpio_num_t)GPIO_ETH_PHY_MDC);
// gpio_reset_pin((gpio_num_t)GPIO_ETH_PHY_MDIO);
// gpio_reset_pin(GPIO_NUM_19); // EMAC_TXD0 - hardcoded
// gpio_reset_pin(GPIO_NUM_21); // EMAC_TX_EN - hardcoded
// gpio_reset_pin(GPIO_NUM_22); // EMAC_TXD1 - hardcoded
// gpio_reset_pin(GPIO_NUM_25); // EMAC_RXD0 - hardcoded
// gpio_reset_pin(GPIO_NUM_26); // EMAC_RXD1 - hardcoded
// gpio_reset_pin(GPIO_NUM_27); // EMAC_RX_CRS_DV - hardcoded
// switch (Settings->eth_clk_mode) {
// case 0: // ETH_CLOCK_GPIO0_IN
// case 1: // ETH_CLOCK_GPIO0_OUT
// gpio_reset_pin(GPIO_NUM_0);
// break;
// case 2: // ETH_CLOCK_GPIO16_OUT
// gpio_reset_pin(GPIO_NUM_16);
// break;
// case 3: // ETH_CLOCK_GPIO17_OUT
// gpio_reset_pin(GPIO_NUM_17);
// break;
// }
// delay(1);
//#endif // CONFIG_IDF_TARGET_ESP32
#if ESP_IDF_VERSION_MAJOR >= 5 #if ESP_IDF_VERSION_MAJOR >= 5
if (!ETH.begin( (eth_phy_type_t)Settings->eth_type, Settings->eth_address, eth_mdc, eth_mdio, eth_power, (eth_clock_mode_t)Settings->eth_clk_mode)) { if (Settings->eth_type < 7) {
// CONFIG_ETH_USE_ESP32_EMAC
init_ok = (ETH.begin((eth_phy_type_t)Settings->eth_type, Settings->eth_address, eth_mdc, eth_mdio, eth_power, (eth_clock_mode_t)Settings->eth_clk_mode));
} else {
// CONFIG_ETH_SPI_ETHERNET
init_ok = (ETH.begin((eth_phy_type_t)Settings->eth_type, Settings->eth_address, eth_mdc, eth_mdio, eth_power, SPI, ETH_PHY_SPI_FREQ_MHZ));
}
#else #else
if (!ETH.begin(Settings->eth_address, eth_power, eth_mdc, eth_mdio, (eth_phy_type_t)Settings->eth_type, (eth_clock_mode_t)Settings->eth_clk_mode)) { init_ok = (ETH.begin(Settings->eth_address, eth_power, eth_mdc, eth_mdio, (eth_phy_type_t)Settings->eth_type, (eth_clock_mode_t)Settings->eth_clk_mode));
#endif #endif
if (!init_ok) {
AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_ETH "Bad PHY type or init error")); AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_ETH "Bad PHY type or init error"));
return; return;
}; };