#include "NetworkDeviceInstantiator.h" #include "../networkDevices/EthernetDevice.h" #ifndef CONFIG_IDF_TARGET_ESP32H2 #include "../networkDevices/WifiDevice.h" #endif #include "../PreferencesKeys.h" #include "NetworkUtil.h" #include "../networkDevices/LAN8720Definitions.h" #include "../networkDevices/Tlk110Definitions.h" NetworkDevice *NetworkDeviceInstantiator::Create(NetworkDeviceType networkDeviceType, String hostname, Preferences *preferences, IPConfiguration *ipConfiguration) { NetworkDevice* device = nullptr; #if defined(CONFIG_IDF_TARGET_ESP32P4) bool fakedevice = true; #endif switch (networkDeviceType) { case NetworkDeviceType::W5500: device = new EthernetDevice(hostname, preferences, ipConfiguration, "Generic W5500", ETH_PHY_ADDR_W5500, ETH_PHY_CS_GENERIC_W5500, ETH_PHY_IRQ_GENERIC_W5500, ETH_PHY_RST_GENERIC_W5500, ETH_PHY_SPI_SCK_GENERIC_W5500, ETH_PHY_SPI_MISO_GENERIC_W5500, ETH_PHY_SPI_MOSI_GENERIC_W5500, ETH_PHY_W5500); break; case NetworkDeviceType::W5500M5: device = new EthernetDevice(hostname, preferences, ipConfiguration, "M5Stack Atom POE", ETH_PHY_ADDR_W5500, ETH_PHY_CS_M5_W5500, ETH_PHY_IRQ_M5_W5500, ETH_PHY_RST_M5_W5500, ETH_PHY_SPI_SCK_M5_W5500, ETH_PHY_SPI_MISO_M5_W5500, ETH_PHY_SPI_MOSI_M5_W5500, ETH_PHY_W5500); break; case NetworkDeviceType::W5500M5S3: device = new EthernetDevice(hostname, preferences, ipConfiguration, "M5Stack Atom POE S3", ETH_PHY_ADDR_W5500, ETH_PHY_CS_M5_W5500_S3, ETH_PHY_IRQ_M5_W5500, ETH_PHY_RST_M5_W5500, ETH_PHY_SPI_SCK_M5_W5500_S3, ETH_PHY_SPI_MISO_M5_W5500_S3, ETH_PHY_SPI_MOSI_M5_W5500_S3, ETH_PHY_W5500); break; case NetworkDeviceType::Waveshare_ESP32_S3_ETH: device = new EthernetDevice(hostname, preferences, ipConfiguration, "Waveshare ESP32-S3-ETH / ESP32-S3-ETH-POE", ETH_ADDR_WAVESHARE_ESP32_S3_ETH, ETH_PHY_SPI_CS_WAVESHARE_ESP32_S3_ETH, ETH_PHY_SPI_IRQ_WAVESHARE_ESP32_S3_ETH, ETH_PHY_SPI_RST_WAVESHARE_ESP32_S3_ETH, ETH_PHY_SPI_SCK_WAVESHARE_ESP32_S3_ETH, ETH_PHY_SPI_MISO_WAVESHARE_ESP32_S3_ETH, ETH_PHY_SPI_MOSI_WAVESHARE_ESP32_S3_ETH, ETH_PHY_W5500); break; case NetworkDeviceType::ETH01_Evo: device = new EthernetDevice(hostname, preferences, ipConfiguration, "ETH01-Evo", ETH_PHY_ADDR_ETH01EVO, ETH_PHY_CS_ETH01EVO, ETH_PHY_IRQ_ETH01EVO, ETH_PHY_RST_ETH01EVO, ETH_PHY_SPI_SCK_ETH01EVO, ETH_PHY_SPI_MISO_ETH01EVO, ETH_PHY_SPI_MOSI_ETH01EVO, ETH_PHY_TYPE_DM9051); break; case NetworkDeviceType::LilyGO_T_ETH_ELite: device = new EthernetDevice(hostname, preferences, ipConfiguration, "LilyGO T-ETH ELite", ETH_PHY_ADDR_W5500, ETH_PHY_CS_ELITE_W5500, ETH_PHY_IRQ_ELITE_W5500, ETH_PHY_RST_ELITE_W5500, ETH_PHY_SPI_SCK_ELITE_W5500, ETH_PHY_SPI_MISO_ELITE_W5500, ETH_PHY_SPI_MOSI_ELITE_W5500, ETH_PHY_W5500); break; case NetworkDeviceType::LilyGO_T_ETH_Lite_S3: device = new EthernetDevice(hostname, preferences, ipConfiguration, "LilyGO T-ETH-Lite-ESP32S3", ETH_PHY_ADDR_W5500, ETH_PHY_CS_ETHLITES3_W5500, ETH_PHY_IRQ_ETHLITES3_W5500, ETH_PHY_RST_ETHLITES3_W5500, ETH_PHY_SPI_SCK_ETHLITES3_W5500, ETH_PHY_SPI_MISO_ETHLITES3_W5500, ETH_PHY_SPI_MOSI_ETHLITES3_W5500, ETH_PHY_W5500); break; #if defined(CONFIG_IDF_TARGET_ESP32P4) case NetworkDeviceType::Waveshare_ESP32_P4_NANO: device = new EthernetDevice(hostname, preferences, ipConfiguration, "Waveshare ESP32-P4-NANO", 1, 51, 31, 52, ETH_PHY_IP101, ETH_CLOCK_GPIO0_IN); break; case NetworkDeviceType::Waveshare_ESP32_P4_Module_DEV_KIT: device = new EthernetDevice(hostname, preferences, ipConfiguration, "Waveshare ESP32-P4-Module-DEV-KIT", 1, 51, 31, 52, ETH_PHY_IP101, ETH_CLOCK_GPIO0_IN); break; case NetworkDeviceType::ESP32_P4_Function_EV_Board: device = new EthernetDevice(hostname, preferences, ipConfiguration, "ESP32-P4-Function-EV-Board", 1, 51, 31, 52, ETH_PHY_IP101, ETH_CLOCK_GPIO0_IN); break; #endif case NetworkDeviceType::CUSTOM: { int custPHY = preferences->getInt(preference_network_custom_phy, 0); if(custPHY >= 1 && custPHY <= 3) { std::string custName; eth_phy_type_t custEthtype; switch(custPHY) { case 1: custName = "Custom (W5500)"; custEthtype = ETH_PHY_W5500; break; case 2: custName = "Custom (DN9051)"; custEthtype = ETH_PHY_DM9051; break; case 3: custName = "Custom (KSZ8851SNL)"; custEthtype = ETH_PHY_KSZ8851; break; default: custName = "Custom (W5500)"; custEthtype = ETH_PHY_W5500; break; } device = new EthernetDevice(hostname, preferences, ipConfiguration, custName, preferences->getInt(preference_network_custom_addr, -1), preferences->getInt(preference_network_custom_cs, -1), preferences->getInt(preference_network_custom_irq, -1), preferences->getInt(preference_network_custom_rst, -1), preferences->getInt(preference_network_custom_sck, -1), preferences->getInt(preference_network_custom_miso, -1), preferences->getInt(preference_network_custom_mosi, -1), custEthtype); } #if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32P4) else if(custPHY >= 4 && custPHY <= 9) { int custCLKpref = preferences->getInt(preference_network_custom_clk, 0); std::string custName = NetworkUtil::GetCustomEthernetDeviceName(custPHY); eth_phy_type_t custEthtype = NetworkUtil::GetCustomEthernetType(custPHY); eth_clock_mode_t custCLK = NetworkUtil::GetCustomClock(custCLKpref); device = new EthernetDevice(hostname, preferences, ipConfiguration, custName, preferences->getInt(preference_network_custom_addr, -1), preferences->getInt(preference_network_custom_pwr, -1), preferences->getInt(preference_network_custom_mdc, -1), preferences->getInt(preference_network_custom_mdio, -1), custEthtype, custCLK); } #endif #ifndef CONFIG_IDF_TARGET_ESP32H2 else { device = new WifiDevice(hostname, preferences, ipConfiguration); #if defined(CONFIG_IDF_TARGET_ESP32P4) fakedevice = false; #endif } #endif } break; #if defined(CONFIG_IDF_TARGET_ESP32) case NetworkDeviceType::M5STACK_PoESP32_Unit: device = new EthernetDevice(hostname, preferences, ipConfiguration, "M5STACK PoESP32 Unit", ETH_PHY_ADDR_M5_POESP32, ETH_PHY_POWER_M5_POESP32, ETH_PHY_MDC_M5_POESP32, ETH_PHY_MDIO_M5_POESP32, ETH_CLK_MODE_M5_TYPE, ETH_CLK_MODE_M5_POESP32); break; case NetworkDeviceType::Olimex_LAN8720: device = new EthernetDevice(hostname, preferences, ipConfiguration, "Olimex (LAN8720)", ETH_PHY_ADDR_LAN8720, 12, ETH_PHY_MDC_LAN8720, ETH_PHY_MDIO_LAN8720, ETH_PHY_TYPE_LAN8720, ETH_CLOCK_GPIO17_OUT); break; case NetworkDeviceType::WT32_LAN8720: device = new EthernetDevice(hostname, preferences, ipConfiguration, "WT32-ETH01", 1, 16); break; case NetworkDeviceType::GL_S10: device = new EthernetDevice(hostname, preferences, ipConfiguration, "GL-S10", 1, 5, ETH_PHY_MDC_LAN8720, ETH_PHY_MDIO_LAN8720, ETH_PHY_IP101, ETH_CLOCK_GPIO0_IN); break; case NetworkDeviceType::LilyGO_T_ETH_POE: device = new EthernetDevice(hostname, preferences, ipConfiguration, "LilyGO T-ETH-POE", 0, -1, ETH_PHY_MDC_LAN8720, ETH_PHY_MDIO_LAN8720, ETH_PHY_TYPE_LAN8720, ETH_CLOCK_GPIO17_OUT); break; #endif #ifndef CONFIG_IDF_TARGET_ESP32H2 case NetworkDeviceType::WiFi: device = new WifiDevice(hostname, preferences, ipConfiguration); #if defined(CONFIG_IDF_TARGET_ESP32P4) fakedevice = false; #endif break; default: device = new WifiDevice(hostname, preferences, ipConfiguration); #if defined(CONFIG_IDF_TARGET_ESP32P4) fakedevice = false; #endif break; #else default: device = new EthernetDevice(hostname, preferences, ipConfiguration, "Custom (W5500)", preferences->getInt(preference_network_custom_addr, -1), preferences->getInt(preference_network_custom_cs, -1), preferences->getInt(preference_network_custom_irq, -1), preferences->getInt(preference_network_custom_rst, -1), preferences->getInt(preference_network_custom_sck, -1), preferences->getInt(preference_network_custom_miso, -1), preferences->getInt(preference_network_custom_mosi, -1), ETH_PHY_W5500); break; #endif } #if defined(CONFIG_IDF_TARGET_ESP32P4) if (fakedevice) { Log->println("Create dummy WiFi device for Hosted on P4"); NetworkDevice* device2 = nullptr; device2 = new WifiDevice("fakep4forhosted", preferences, ipConfiguration); device2->initialize(); delete device2; device2 = NULL; } #endif return device; }