Skip to content

Commit b7e9ff8

Browse files
authored
Merge pull request #4961 from TD-er/bugfix/ESP32_SPI_Ethernet_shared_bus
[SPI Ethernet] Fix concurrency issue with shared SPI bus for ETH/display
2 parents 8371a84 + 619f25f commit b7e9ff8

File tree

6 files changed

+42
-33
lines changed

6 files changed

+42
-33
lines changed

src/src/CustomBuild/ESPEasyDefaults.h

+1-13
Original file line numberDiff line numberDiff line change
@@ -255,31 +255,19 @@
255255
#define DEFAULT_ETH_PHY_TYPE EthPhyType_t::notSet
256256
#endif
257257
#ifndef DEFAULT_ETH_PIN_MDC
258-
#ifdef ESP32_CLASSIC
259-
#define DEFAULT_ETH_PIN_MDC 23
260-
#else
261258
#define DEFAULT_ETH_PIN_MDC -1
262259
#endif
263-
#endif
264260
#ifndef DEFAULT_ETH_PIN_MDIO
265-
#ifdef ESP32_CLASSIC
266-
#define DEFAULT_ETH_PIN_MDIO 18
267-
#else
268261
#define DEFAULT_ETH_PIN_MDIO -1
269262
#endif
270-
#endif
271263
#ifndef DEFAULT_ETH_PIN_POWER
272264
#define DEFAULT_ETH_PIN_POWER -1
273265
#endif
274266
#ifndef DEFAULT_ETH_CLOCK_MODE
275267
#define DEFAULT_ETH_CLOCK_MODE EthClockMode_t::Ext_crystal_osc
276268
#endif
277269
#ifndef DEFAULT_NETWORK_MEDIUM
278-
#if FEATURE_ETHERNET
279-
#define DEFAULT_NETWORK_MEDIUM NetworkMedium_t::Ethernet
280-
#else
281-
#define DEFAULT_NETWORK_MEDIUM NetworkMedium_t::WIFI
282-
#endif
270+
#define DEFAULT_NETWORK_MEDIUM NetworkMedium_t::WIFI
283271
#endif
284272
#ifndef DEFAULT_JSON_BOOL_WITHOUT_QUOTES
285273
#define DEFAULT_JSON_BOOL_WITHOUT_QUOTES false

src/src/DataStructs_templ/SettingsStruct.cpp

+22-13
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
#include "include/esp32x_fixes.h"
2424
#endif
2525

26-
2726
/*
2827
// VariousBits1 defaults to 0, keep in mind when adding bit lookups.
2928
template<unsigned int N_TASKS>
@@ -566,9 +565,9 @@ void SettingsStruct_tmpl<N_TASKS>::clearMisc() {
566565
#ifdef ESP32
567566
// Ethernet related settings are never used on ESP8266
568567
ETH_Phy_Addr = DEFAULT_ETH_PHY_ADDR;
569-
ETH_Pin_mdc_cs = DEFAULT_ETH_PIN_MDC;
570-
ETH_Pin_mdio_irq = DEFAULT_ETH_PIN_MDIO;
571-
ETH_Pin_power_rst = DEFAULT_ETH_PIN_POWER;
568+
ETH_Pin_mdc_cs = DEFAULT_ETH_PIN_MDC;
569+
ETH_Pin_mdio_irq = DEFAULT_ETH_PIN_MDIO;
570+
ETH_Pin_power_rst = DEFAULT_ETH_PIN_POWER;
572571
ETH_Phy_Type = DEFAULT_ETH_PHY_TYPE;
573572
ETH_Clock_Mode = DEFAULT_ETH_CLOCK_MODE;
574573
#endif
@@ -883,25 +882,37 @@ spi_host_device_t SettingsStruct_tmpl<N_TASKS>::getSPI_host() const
883882
switch (SPI_selection) {
884883
case SPI_Options_e::Vspi_Fspi:
885884
{
886-
return VSPI_HOST;
885+
#if CONFIG_IDF_TARGET_ESP32
886+
return static_cast<spi_host_device_t>(VSPI);
887+
#else
888+
return static_cast<spi_host_device_t>(FSPI);
889+
#endif
887890
}
888891
#ifdef ESP32_CLASSIC
889892
case SPI_Options_e::Hspi:
890893
{
891-
return HSPI_HOST;
894+
return static_cast<spi_host_device_t>(HSPI);
892895
}
893896
#endif
894897
case SPI_Options_e::UserDefined:
895898
{
896-
return HSPI_HOST;
899+
#if CONFIG_IDF_TARGET_ESP32
900+
return static_cast<spi_host_device_t>(VSPI);
901+
#else
902+
return static_cast<spi_host_device_t>(FSPI);
903+
#endif
897904
}
898905
case SPI_Options_e::None:
899906
break;
900907
}
901908

902909
}
903910
#if ESP_IDF_VERSION_MAJOR < 5
904-
return SPI_HOST;
911+
#if CONFIG_IDF_TARGET_ESP32
912+
return static_cast<spi_host_device_t>(VSPI);
913+
#else
914+
return static_cast<spi_host_device_t>(FSPI);
915+
#endif
905916
#else
906917
return spi_host_device_t::SPI_HOST_MAX;
907918
#endif
@@ -955,10 +966,8 @@ template<unsigned int N_TASKS>
955966
bool SettingsStruct_tmpl<N_TASKS>::isEthernetPin(int8_t pin) const {
956967
#if FEATURE_ETHERNET
957968
if (pin < 0) return false;
958-
if (isSPI_EthernetType(ETH_Phy_Type)) {
959-
return false;
960-
}
961-
if (NetworkMedium == NetworkMedium_t::Ethernet) {
969+
if (NetworkMedium == NetworkMedium_t::Ethernet &&
970+
!isSPI_EthernetType(ETH_Phy_Type)) {
962971
if (19 == pin) return true; // ETH TXD0
963972
if (21 == pin) return true; // ETH TX EN
964973
if (22 == pin) return true; // ETH TXD1
@@ -976,7 +985,7 @@ bool SettingsStruct_tmpl<N_TASKS>::isEthernetPinOptional(int8_t pin) const {
976985
#if FEATURE_ETHERNET
977986
if (pin < 0) return false;
978987
if (NetworkMedium == NetworkMedium_t::Ethernet) {
979-
if (isGpioUsedInETHClockMode(ETH_Clock_Mode, pin)) return true;
988+
if (!isSPI_EthernetType(ETH_Phy_Type) && isGpioUsedInETHClockMode(ETH_Clock_Mode, pin)) return true;
980989
if (ETH_Pin_mdc_cs == pin) return true;
981990
if (ETH_Pin_mdio_irq == pin) return true;
982991
if (ETH_Pin_power_rst == pin) return true;

src/src/DataTypes/EthernetParameters.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ enum class EthPhyType_t : uint8_t {
4444
KSZ8851 = 12,
4545
#endif
4646
#endif
47-
notSet = 255
47+
notSet = 127 // Might be processed in some code as int, uint8_t and int8_t
4848
};
4949

5050
bool isValid(EthPhyType_t phyType);

src/src/ESPEasyCore/ESPEasyEth.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,15 @@ bool ETHConnectRelaxed() {
184184
}
185185
// else
186186
{
187+
#if ETH_SPI_SUPPORTS_CUSTOM
188+
EthEventData.ethInitSuccess = ETH.begin(
189+
to_ESP_phy_type(Settings.ETH_Phy_Type),
190+
Settings.ETH_Phy_Addr,
191+
Settings.ETH_Pin_mdc_cs,
192+
Settings.ETH_Pin_mdio_irq,
193+
Settings.ETH_Pin_power_rst,
194+
SPI);
195+
#else
187196
EthEventData.ethInitSuccess = ETH.begin(
188197
to_ESP_phy_type(Settings.ETH_Phy_Type),
189198
Settings.ETH_Phy_Addr,
@@ -194,6 +203,7 @@ bool ETHConnectRelaxed() {
194203
static_cast<int>(Settings.SPI_SCLK_pin),
195204
static_cast<int>(Settings.SPI_MISO_pin),
196205
static_cast<int>(Settings.SPI_MOSI_pin));
206+
#endif
197207
}
198208
} else {
199209
# if CONFIG_ETH_USE_ESP32_EMAC

src/src/Helpers/ESPEasy_Storage.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -337,14 +337,14 @@ bool BuildFixes()
337337
if (Settings.Build < 20108) {
338338
#ifdef ESP32
339339
// Ethernet related settings are never used on ESP8266
340-
Settings.ETH_Phy_Addr = DEFAULT_ETH_PHY_ADDR;
340+
Settings.ETH_Phy_Addr = DEFAULT_ETH_PHY_ADDR;
341341
Settings.ETH_Pin_mdc_cs = DEFAULT_ETH_PIN_MDC;
342-
Settings.ETH_Pin_mdio_irq = DEFAULT_ETH_PIN_MDIO;
343-
Settings.ETH_Pin_power_rst = DEFAULT_ETH_PIN_POWER;
344-
Settings.ETH_Phy_Type = DEFAULT_ETH_PHY_TYPE;
345-
Settings.ETH_Clock_Mode = DEFAULT_ETH_CLOCK_MODE;
342+
Settings.ETH_Pin_mdio_irq = DEFAULT_ETH_PIN_MDIO;
343+
Settings.ETH_Pin_power_rst = DEFAULT_ETH_PIN_POWER;
344+
Settings.ETH_Phy_Type = DEFAULT_ETH_PHY_TYPE;
345+
Settings.ETH_Clock_Mode = DEFAULT_ETH_CLOCK_MODE;
346346
#endif
347-
Settings.NetworkMedium = DEFAULT_NETWORK_MEDIUM;
347+
Settings.NetworkMedium = DEFAULT_NETWORK_MEDIUM;
348348
}
349349
if (Settings.Build < 20109) {
350350
Settings.SyslogPort = 514;

src/src/Helpers/Hardware.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,9 @@ void hardwareInit()
234234
isValid(Settings.ETH_Phy_Type) &&
235235
isSPI_EthernetType(Settings.ETH_Phy_Type))
236236
{
237+
#if !ETH_SPI_SUPPORTS_CUSTOM
237238
tryInitSPI = false;
239+
#endif
238240
}
239241
#endif
240242

0 commit comments

Comments
 (0)