Based on https://github.com/espressif/arduino-esp32/blob/a3b6fe61ba39fccf8770a0bdf06243377c907702/libraries/Ethernet/src/ETH.cpp Not tested! diff --git a/ETHClass2.cpp b/ETHClass2.cpp index 7c263cf..d734d3d 100644 --- a/ETHClass2.cpp +++ b/ETHClass2.cpp @@ -416,7 +416,7 @@ bool ETHClass2::beginSPI(eth_phy_type_t type, uint8_t phy_addr, int cs, int irq, #endif - tcpipInit(); + Network.begin(); // Install GPIO ISR handler to be able to service SPI Eth modules interrupts ret = gpio_install_isr_service(0); @@ -434,7 +434,6 @@ bool ETHClass2::beginSPI(eth_phy_type_t type, uint8_t phy_addr, int cs, int irq, phy_config.reset_gpio_num = _pin_rst; // Init SPI bus - spi_device_handle_t spi_handle = {0}; spi_bus_config_t buscfg = {0}; buscfg.miso_io_num = _pin_miso; buscfg.mosi_io_num = _pin_mosi; @@ -458,18 +457,12 @@ bool ETHClass2::beginSPI(eth_phy_type_t type, uint8_t phy_addr, int cs, int irq, // Set SPI module Chip Select GPIO spi_devcfg.spics_io_num = _pin_cs; - ret = spi_bus_add_device(spi_host, &spi_devcfg, &spi_handle); - if (ret != ESP_OK) { - log_e("spi_bus_add_device failed"); - return false; - } - esp_eth_mac_t *mac = NULL; esp_eth_phy_t *phy = NULL; #if CONFIG_ETH_SPI_ETHERNET_W5500 if (type == ETH_PHY_W5500) { - eth_w5500_config_t mac_config = ETH_W5500_DEFAULT_CONFIG(spi_handle); + eth_w5500_config_t mac_config = ETH_W5500_DEFAULT_CONFIG(spi_host, &spi_devcfg); mac_config.int_gpio_num = _pin_irq; #if ETH_SPI_SUPPORTS_CUSTOM @@ -591,8 +584,8 @@ bool ETHClass2::beginSPI(eth_phy_type_t type, uint8_t phy_addr, int cs, int irq, return false; } - // attach to WiFiGeneric to receive events - add_esp_interface_netif(ESP_IF_ETH, _esp_netif); + // attach to receive events + initNetif((Network_Interface_ID)ESP_IF_ETH); // Start Ethernet driver state machine ret = esp_eth_start(_eth_handle); @@ -784,7 +777,7 @@ bool ETHClass2::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, return true; } -IPAddress ETHClass2::localIP() +IPAddress ETHClass2::localIP() const { if (_esp_netif == NULL) { return IPAddress(); @@ -796,7 +789,7 @@ IPAddress ETHClass2::localIP() return IPAddress(ip.ip.addr); } -IPAddress ETHClass2::subnetMask() +IPAddress ETHClass2::subnetMask() const { if (_esp_netif == NULL) { return IPAddress(); @@ -808,7 +801,7 @@ IPAddress ETHClass2::subnetMask() return IPAddress(ip.netmask.addr); } -IPAddress ETHClass2::gatewayIP() +IPAddress ETHClass2::gatewayIP() const { if (_esp_netif == NULL) { return IPAddress(); @@ -820,7 +813,7 @@ IPAddress ETHClass2::gatewayIP() return IPAddress(ip.gw.addr); } -IPAddress ETHClass2::dnsIP(uint8_t dns_no) +IPAddress ETHClass2::dnsIP(uint8_t dns_no) const { if (_esp_netif == NULL) { return IPAddress(); @@ -832,7 +825,7 @@ IPAddress ETHClass2::dnsIP(uint8_t dns_no) return IPAddress(d.ip.u_addr.ip4.addr); } -IPAddress ETHClass2::broadcastIP() +IPAddress ETHClass2::broadcastIP() const { if (_esp_netif == NULL) { return IPAddress(); @@ -896,16 +889,16 @@ bool ETHClass2::enableIpV6() return esp_netif_create_ip6_linklocal(_esp_netif) == 0; } -IPv6Address ETHClass2::localIPv6() +IPAddress ETHClass2::localIPv6() { if (_esp_netif == NULL) { - return IPv6Address(); + return IPAddress(IPType::IPv6); } static esp_ip6_addr_t addr; if (esp_netif_get_ip6_linklocal(_esp_netif, &addr)) { - return IPv6Address(); + return IPAddress(IPType::IPv6); } - return IPv6Address(addr.addr); + return IPAddress(IPType::IPv6, (const uint8_t *)addr.addr); } const char *ETHClass2::ifkey(void) @@ -916,7 +909,7 @@ const char *ETHClass2::ifkey(void) return esp_netif_get_ifkey(_esp_netif); } -const char *ETHClass2::desc(void) +const char *ETHClass2::desc(void) const { if (_esp_netif == NULL) { return ""; @@ -940,15 +933,15 @@ String ETHClass2::impl_name(void) bool ETHClass2::connected() { - return WiFiGenericClass::getStatusBits() & ETH_CONNECTED_BIT; + return NetworkInterface::getStatusBits() & ESP_NETIF_CONNECTED_BIT; } bool ETHClass2::hasIP() { - return WiFiGenericClass::getStatusBits() & ETH_HAS_IP_BIT; + return NetworkInterface::getStatusBits() & ESP_NETIF_HAS_IP_BIT; } -bool ETHClass2::linkUp() +bool ETHClass2::linkUp() const { if (_esp_netif == NULL) { return false; @@ -956,7 +949,7 @@ bool ETHClass2::linkUp() return esp_netif_is_netif_up(_esp_netif); } -bool ETHClass2::fullDuplex() +bool ETHClass2::fullDuplex() const { if (_eth_handle == NULL) { return false; @@ -966,7 +959,7 @@ bool ETHClass2::fullDuplex() return (link_duplex == ETH_DUPLEX_FULL); } -bool ETHClass2::autoNegotiation() +bool ETHClass2::autoNegotiation() const { if (_eth_handle == NULL) { return false; @@ -976,7 +969,7 @@ bool ETHClass2::autoNegotiation() return auto_nego; } -uint32_t ETHClass2::phyAddr() +uint32_t ETHClass2::phyAddr() const { if (_eth_handle == NULL) { return 0; @@ -986,7 +979,7 @@ uint32_t ETHClass2::phyAddr() return phy_addr; } -uint8_t ETHClass2::linkSpeed() +uint8_t ETHClass2::linkSpeed() const { if (_eth_handle == NULL) { return 0; @@ -996,7 +989,7 @@ uint8_t ETHClass2::linkSpeed() return (link_speed == ETH_SPEED_10M) ? 10 : 100; } -uint8_t *ETHClass2::macAddress(uint8_t *mac) +uint8_t *ETHClass2::macAddress(uint8_t *mac) const { if (_eth_handle == NULL) { return NULL; @@ -1008,7 +1001,7 @@ uint8_t *ETHClass2::macAddress(uint8_t *mac) return mac; } -String ETHClass2::macAddress(void) +String ETHClass2::macAddress(void) const { uint8_t mac[6] = {0, 0, 0, 0, 0, 0}; char macStr[18] = { 0 }; @@ -1017,49 +1010,51 @@ String ETHClass2::macAddress(void) return String(macStr); } -void ETHClass2::printInfo(Print &out) +size_t ETHClass2::printDriverInfo(Print &out) const { - out.print(desc()); - out.print(":"); + size_t bytes = 0; + bytes += out.print(desc()); + bytes += out.print(":"); if (linkUp()) { - out.print(" "); - - out.print(" "); - out.print("ether "); - out.print(macAddress()); - out.printf(" phy 0x%lX", phyAddr()); - out.println(); - - out.print(" "); - out.print("inet "); - out.print(localIP()); - out.print(" netmask "); - out.print(subnetMask()); - out.print(" broadcast "); - out.print(broadcastIP()); - out.println(); - - out.print(" "); - out.print("gateway "); - out.print(gatewayIP()); - out.print(" dns "); - out.print(dnsIP()); - out.println(); - - out.println(); + bytes += out.print(",AUTO"); + } + bytes += out.println(">"); + + bytes += out.print(" "); + bytes += out.print("ether "); + bytes += out.print(macAddress()); + bytes += out.printf(" phy 0x%lX", phyAddr()); + bytes += out.println(); + + bytes += out.print(" "); + bytes += out.print("inet "); + bytes += out.print(localIP()); + bytes += out.print(" netmask "); + bytes += out.print(subnetMask()); + bytes += out.print(" broadcast "); + bytes += out.print(broadcastIP()); + bytes += out.println(); + + bytes += out.print(" "); + bytes += out.print("gateway "); + bytes += out.print(gatewayIP()); + bytes += out.print(" dns "); + bytes += out.print(dnsIP()); + bytes += out.println(); + + bytes += out.println(); + return bytes; } ETHClass2 ETH2; diff --git a/ETHClass2.h b/ETHClass2.h index 8c4685f..d655fa7 100644 --- a/ETHClass2.h +++ b/ETHClass2.h @@ -103,7 +103,7 @@ typedef enum { ETH_PHY_MAX } eth_phy_type_t; -class ETHClass2 { +class ETHClass2 : public NetworkInterface { public: ETHClass2(uint8_t eth_index=0); ~ETHClass2(); @@ -138,17 +138,17 @@ class ETHClass2 { bool config(IPAddress local_ip = (uint32_t)0x00000000, IPAddress gateway = (uint32_t)0x00000000, IPAddress subnet = (uint32_t)0x00000000, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000); const char * getHostname(); bool setHostname(const char * hostname); - IPAddress localIP(); - IPAddress subnetMask(); - IPAddress gatewayIP(); - IPAddress dnsIP(uint8_t dns_no = 0); - IPAddress broadcastIP(); + IPAddress localIP() const; + IPAddress subnetMask() const; + IPAddress gatewayIP() const; + IPAddress dnsIP(uint8_t dns_no = 0) const; + IPAddress broadcastIP() const; IPAddress networkID(); uint8_t subnetCIDR(); bool enableIpV6(); - IPv6Address localIPv6(); + IPAddress localIPv6(); const char * ifkey(void); - const char * desc(void); + const char * desc(void) const; String impl_name(void); // Event based getters @@ -156,19 +156,19 @@ class ETHClass2 { bool hasIP(); // ETH Handle APIs - uint8_t * macAddress(uint8_t* mac); - String macAddress(); - bool fullDuplex(); - bool linkUp(); - uint8_t linkSpeed(); - bool autoNegotiation(); - uint32_t phyAddr(); + uint8_t * macAddress(uint8_t* mac) const; + String macAddress() const; + bool fullDuplex() const; + bool linkUp() const; + uint8_t linkSpeed() const; + bool autoNegotiation() const; + uint32_t phyAddr() const; // Info APIs - void printInfo(Print & out); + size_t printDriverInfo(Print & out) const; - friend class WiFiClient; - friend class WiFiServer; + friend class NetworkClient; + friend class NetworkServer; #if ETH_SPI_SUPPORTS_CUSTOM static esp_err_t _eth_spi_read(void *ctx, uint32_t cmd, uint32_t addr, void *data, uint32_t data_len);