Просмотр исходного кода

eth: support W5500 in network examples

morris 5 лет назад
Родитель
Сommit
aea901f014

+ 24 - 18
examples/common_components/protocol_examples_common/Kconfig.projbuild

@@ -33,7 +33,7 @@ menu "Example Connection Configuration"
         choice EXAMPLE_USE_ETHERNET
             prompt "Ethernet Type"
             default EXAMPLE_USE_INTERNAL_ETHERNET if IDF_TARGET_ESP32
-            default EXAMPLE_USE_DM9051 if !IDF_TARGET_ESP32
+            default EXAMPLE_USE_W5500
             help
                 Select which kind of Ethernet will be used in the example.
 
@@ -51,6 +51,13 @@ menu "Example Connection Configuration"
                 help
                     Select external SPI-Ethernet module.
 
+            config EXAMPLE_USE_W5500
+                bool "W5500 Module"
+                select ETH_USE_SPI_ETHERNET
+                select ETH_SPI_ETHERNET_W5500
+                help
+                    Select external SPI-Ethernet module (W5500).
+
             config EXAMPLE_USE_OPENETH
                 bool "OpenCores Ethernet MAC (EXPERIMENTAL)"
                 select ETH_USE_OPENETH
@@ -108,55 +115,55 @@ menu "Example Connection Configuration"
                     Set the GPIO number used by SMI MDIO.
         endif
 
-        if EXAMPLE_USE_DM9051
-            config EXAMPLE_DM9051_SPI_HOST
+        if ETH_USE_SPI_ETHERNET
+            config EXAMPLE_ETH_SPI_HOST
                 int "SPI Host Number"
                 range 0 2
                 default 1
                 help
-                    Set the SPI host used to communicate with DM9051.
+                    Set the SPI host used to communicate with the SPI Ethernet Controller.
 
-            config EXAMPLE_DM9051_SCLK_GPIO
+            config EXAMPLE_ETH_SPI_SCLK_GPIO
                 int "SPI SCLK GPIO number"
                 range 0 33
-                default 19
+                default 20
                 help
                     Set the GPIO number used by SPI SCLK.
 
-            config EXAMPLE_DM9051_MOSI_GPIO
+            config EXAMPLE_ETH_SPI_MOSI_GPIO
                 int "SPI MOSI GPIO number"
                 range 0 33
-                default 23
+                default 19
                 help
                     Set the GPIO number used by SPI MOSI.
 
-            config EXAMPLE_DM9051_MISO_GPIO
+            config EXAMPLE_ETH_SPI_MISO_GPIO
                 int "SPI MISO GPIO number"
                 range 0 33
-                default 25
+                default 18
                 help
                     Set the GPIO number used by SPI MISO.
 
-            config EXAMPLE_DM9051_CS_GPIO
+            config EXAMPLE_ETH_SPI_CS_GPIO
                 int "SPI CS GPIO number"
                 range 0 33
-                default 22
+                default 21
                 help
                     Set the GPIO number used by SPI CS.
 
-            config EXAMPLE_DM9051_SPI_CLOCK_MHZ
+            config EXAMPLE_ETH_SPI_CLOCK_MHZ
                 int "SPI clock speed (MHz)"
                 range 20 80
-                default 20
+                default 36
                 help
                     Set the clock speed (MHz) of SPI interface.
 
-            config EXAMPLE_DM9051_INT_GPIO
+            config EXAMPLE_ETH_SPI_INT_GPIO
                 int "Interrupt GPIO number"
                 default 4
                 help
-                    Set the GPIO number used by DM9051 interrupt.
-        endif
+                    Set the GPIO number used by the SPI Ethernet module interrupt line.
+        endif # ETH_USE_SPI_ETHERNET
 
         config EXAMPLE_ETH_PHY_RST_GPIO
             int "PHY Reset GPIO number"
@@ -168,7 +175,6 @@ menu "Example Connection Configuration"
         config EXAMPLE_ETH_PHY_ADDR
             int "PHY Address"
             range 0 31 if EXAMPLE_USE_INTERNAL_ETHERNET
-            range 1 1 if !EXAMPLE_USE_INTERNAL_ETHERNET
             default 1
             help
                 Set PHY address according your board schematic.

+ 50 - 22
examples/common_components/protocol_examples_common/connect.c

@@ -15,7 +15,10 @@
 #include "esp_wifi_default.h"
 #if CONFIG_EXAMPLE_CONNECT_ETHERNET
 #include "esp_eth.h"
-#endif
+#if CONFIG_ETH_USE_SPI_ETHERNET
+#include "driver/spi_master.h"
+#endif // CONFIG_ETH_USE_SPI_ETHERNET
+#endif // CONFIG_EXAMPLE_CONNECT_ETHERNET
 #include "esp_log.h"
 #include "esp_netif.h"
 #include "driver/gpio.h"
@@ -60,17 +63,17 @@ static const char *s_ipv6_addr_types[] = {
     "ESP_IP6_ADDR_IS_SITE_LOCAL",
     "ESP_IP6_ADDR_IS_UNIQUE_LOCAL",
     "ESP_IP6_ADDR_IS_IPV4_MAPPED_IPV6"
-    };
+};
 #endif
 
 static const char *TAG = "example_connect";
 
 #if CONFIG_EXAMPLE_CONNECT_WIFI
-static esp_netif_t* wifi_start(void);
+static esp_netif_t *wifi_start(void);
 static void wifi_stop(void);
 #endif
 #if CONFIG_EXAMPLE_CONNECT_ETHERNET
-static esp_netif_t* eth_start(void);
+static esp_netif_t *eth_start(void);
 static void eth_stop(void);
 #endif
 
@@ -81,7 +84,7 @@ static void eth_stop(void);
  */
 static bool is_our_netif(const char *prefix, esp_netif_t *netif)
 {
-    return strncmp(prefix, esp_netif_get_desc(netif), strlen(prefix)-1) == 0;
+    return strncmp(prefix, esp_netif_get_desc(netif), strlen(prefix) - 1) == 0;
 }
 
 /* set up connection, Wi-Fi and/or Ethernet */
@@ -153,7 +156,7 @@ static void on_got_ipv6(void *arg, esp_event_base_t event_base,
     }
     esp_ip6_addr_type_t ipv6_type = esp_netif_ip6_get_addr_type(&event->ip6_info.ip);
     ESP_LOGI(TAG, "Got IPv6 event: Interface \"%s\" address: " IPV6STR ", type: %s", esp_netif_get_desc(event->esp_netif),
-            IPV62STR(event->ip6_info.ip), s_ipv6_addr_types[ipv6_type]);
+             IPV62STR(event->ip6_info.ip), s_ipv6_addr_types[ipv6_type]);
     if (ipv6_type == EXAMPLE_CONNECT_PREFERRED_IPV6_TYPE) {
         memcpy(&s_ipv6_addr, &event->ip6_info.ip, sizeof(s_ipv6_addr));
         xSemaphoreGive(s_semph_get_ip_addrs);
@@ -172,13 +175,13 @@ esp_err_t example_connect(void)
     start();
     ESP_ERROR_CHECK(esp_register_shutdown_handler(&stop));
     ESP_LOGI(TAG, "Waiting for IP(s)");
-    for (int i=0; i<NR_OF_IP_ADDRESSES_TO_WAIT_FOR; ++i) {
+    for (int i = 0; i < NR_OF_IP_ADDRESSES_TO_WAIT_FOR; ++i) {
         xSemaphoreTake(s_semph_get_ip_addrs, portMAX_DELAY);
     }
     // iterate over active interfaces, and print out IPs of "our" netifs
     esp_netif_t *netif = NULL;
     esp_netif_ip_info_t ip;
-    for (int i=0; i<esp_netif_get_nr_of_ifs(); ++i) {
+    for (int i = 0; i < esp_netif_get_nr_of_ifs(); ++i) {
         netif = esp_netif_next(netif);
         if (is_our_netif(TAG, netif)) {
             ESP_LOGI(TAG, "Connected to %s", esp_netif_get_desc(netif));
@@ -188,7 +191,7 @@ esp_err_t example_connect(void)
 #ifdef CONFIG_EXAMPLE_CONNECT_IPV6
             esp_ip6_addr_t ip6[MAX_IP6_ADDRS_PER_NETIF];
             int ip6_addrs = esp_netif_get_all_ip6(netif, ip6);
-            for (int j=0; j< ip6_addrs; ++j) {
+            for (int j = 0; j < ip6_addrs; ++j) {
                 esp_ip6_addr_type_t ipv6_type = esp_netif_ip6_get_addr_type(&(ip6[j]));
                 ESP_LOGI(TAG, "- IPv6 address: " IPV6STR ", type: %s", IPV62STR(ip6[j]), s_ipv6_addr_types[ipv6_type]);
             }
@@ -234,7 +237,7 @@ static void on_wifi_connect(void *esp_netif, esp_event_base_t event_base,
 
 #endif // CONFIG_EXAMPLE_CONNECT_IPV6
 
-static esp_netif_t* wifi_start(void)
+static esp_netif_t *wifi_start(void)
 {
     char *desc;
     wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
@@ -318,7 +321,7 @@ static esp_eth_mac_t *s_mac = NULL;
 static esp_eth_phy_t *s_phy = NULL;
 static void *s_eth_glue = NULL;
 
-static esp_netif_t* eth_start(void)
+static esp_netif_t *eth_start(void)
 {
     char *desc;
     esp_netif_inherent_config_t esp_netif_config = ESP_NETIF_INHERENT_DEFAULT_ETH();
@@ -328,8 +331,8 @@ static esp_netif_t* eth_start(void)
     esp_netif_config.if_desc = desc;
     esp_netif_config.route_prio = 64;
     esp_netif_config_t netif_config = {
-            .base = &esp_netif_config,
-            .stack = ESP_NETIF_NETSTACK_DEFAULT_ETH
+        .base = &esp_netif_config,
+        .stack = ESP_NETIF_NETSTACK_DEFAULT_ETH
     };
     esp_netif_t *netif = esp_netif_new(&netif_config);
     assert(netif);
@@ -359,31 +362,48 @@ static esp_netif_t* eth_start(void)
 #elif CONFIG_EXAMPLE_ETH_PHY_DP83848
     s_phy = esp_eth_phy_new_dp83848(&phy_config);
 #endif
-#elif CONFIG_EXAMPLE_USE_DM9051
+#elif CONFIG_ETH_USE_SPI_ETHERNET
     gpio_install_isr_service(0);
     spi_device_handle_t spi_handle = NULL;
     spi_bus_config_t buscfg = {
-        .miso_io_num = CONFIG_EXAMPLE_DM9051_MISO_GPIO,
-        .mosi_io_num = CONFIG_EXAMPLE_DM9051_MOSI_GPIO,
-        .sclk_io_num = CONFIG_EXAMPLE_DM9051_SCLK_GPIO,
+        .miso_io_num = CONFIG_EXAMPLE_ETH_SPI_MISO_GPIO,
+        .mosi_io_num = CONFIG_EXAMPLE_ETH_SPI_MOSI_GPIO,
+        .sclk_io_num = CONFIG_EXAMPLE_ETH_SPI_SCLK_GPIO,
         .quadwp_io_num = -1,
         .quadhd_io_num = -1,
     };
-    ESP_ERROR_CHECK(spi_bus_initialize(CONFIG_EXAMPLE_DM9051_SPI_HOST, &buscfg, 1));
+    ESP_ERROR_CHECK(spi_bus_initialize(CONFIG_EXAMPLE_ETH_SPI_HOST, &buscfg, 1));
+#if CONFIG_EXAMPLE_USE_DM9051
     spi_device_interface_config_t devcfg = {
         .command_bits = 1,
         .address_bits = 7,
         .mode = 0,
-        .clock_speed_hz = CONFIG_EXAMPLE_DM9051_SPI_CLOCK_MHZ * 1000 * 1000,
-        .spics_io_num = CONFIG_EXAMPLE_DM9051_CS_GPIO,
+        .clock_speed_hz = CONFIG_EXAMPLE_ETH_SPI_CLOCK_MHZ * 1000 * 1000,
+        .spics_io_num = CONFIG_EXAMPLE_ETH_SPI_CS_GPIO,
         .queue_size = 20
     };
-    ESP_ERROR_CHECK(spi_bus_add_device(CONFIG_EXAMPLE_DM9051_SPI_HOST, &devcfg, &spi_handle));
+    ESP_ERROR_CHECK(spi_bus_add_device(CONFIG_EXAMPLE_ETH_SPI_HOST, &devcfg, &spi_handle));
     /* dm9051 ethernet driver is based on spi driver */
     eth_dm9051_config_t dm9051_config = ETH_DM9051_DEFAULT_CONFIG(spi_handle);
-    dm9051_config.int_gpio_num = CONFIG_EXAMPLE_DM9051_INT_GPIO;
+    dm9051_config.int_gpio_num = CONFIG_EXAMPLE_ETH_SPI_INT_GPIO;
     s_mac = esp_eth_mac_new_dm9051(&dm9051_config, &mac_config);
     s_phy = esp_eth_phy_new_dm9051(&phy_config);
+#elif CONFIG_EXAMPLE_USE_W5500
+    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
+        .mode = 0,
+        .clock_speed_hz = CONFIG_EXAMPLE_ETH_SPI_CLOCK_MHZ * 1000 * 1000,
+        .spics_io_num = CONFIG_EXAMPLE_ETH_SPI_CS_GPIO,
+        .queue_size = 20
+    };
+    ESP_ERROR_CHECK(spi_bus_add_device(CONFIG_EXAMPLE_ETH_SPI_HOST, &devcfg, &spi_handle));
+    /* w5500 ethernet driver is based on spi driver */
+    eth_w5500_config_t w5500_config = ETH_W5500_DEFAULT_CONFIG(spi_handle);
+    w5500_config.int_gpio_num = CONFIG_EXAMPLE_ETH_SPI_INT_GPIO;
+    s_mac = esp_eth_mac_new_w5500(&w5500_config, &mac_config);
+    s_phy = esp_eth_phy_new_w5500(&phy_config);
+#endif
 #elif CONFIG_EXAMPLE_USE_OPENETH
     phy_config.autonego_timeout_ms = 100;
     s_mac = esp_eth_mac_new_openeth(&mac_config);
@@ -393,6 +413,14 @@ static esp_netif_t* eth_start(void)
     // Install Ethernet driver
     esp_eth_config_t config = ETH_DEFAULT_CONFIG(s_mac, s_phy);
     ESP_ERROR_CHECK(esp_eth_driver_install(&config, &s_eth_handle));
+#if !CONFIG_EXAMPLE_USE_INTERNAL_ETHERNET
+    /* The SPI Ethernet module might doesn't have a burned factory MAC address, we cat to set it manually.
+       02:00:00 is a Locally Administered OUI range so should not be used except when testing on a LAN under your control.
+    */
+    ESP_ERROR_CHECK(esp_eth_ioctl(s_eth_handle, ETH_CMD_S_MAC_ADDR, (uint8_t[]) {
+        0x02, 0x00, 0x00, 0x12, 0x34, 0x56
+    }));
+#endif
     // combine driver with netif
     s_eth_glue = esp_eth_new_netif_glue(s_eth_handle);
     esp_netif_attach(netif, s_eth_glue);

+ 26 - 21
examples/ethernet/basic/main/Kconfig.projbuild

@@ -2,7 +2,7 @@ menu "Example Configuration"
     choice EXAMPLE_USE_ETHERNET
         prompt "Ethernet Type"
         default EXAMPLE_USE_INTERNAL_ETHERNET if IDF_TARGET_ESP32
-        default EXAMPLE_USE_DM9051 if !IDF_TARGET_ESP32
+        default EXAMPLE_USE_W5500
         help
             Select which kind of Ethernet will be used in the example.
 
@@ -20,7 +20,13 @@ menu "Example Configuration"
             help
                 Select external SPI-Ethernet module (DM9051).
 
-    endchoice
+        config EXAMPLE_USE_W5500
+            bool "W5500 Module"
+            select ETH_USE_SPI_ETHERNET
+            select ETH_SPI_ETHERNET_W5500
+            help
+                Select external SPI-Ethernet module (W5500).
+    endchoice # EXAMPLE_USE_ETHERNET
 
     if EXAMPLE_USE_INTERNAL_ETHERNET
         choice EXAMPLE_ETH_PHY_MODEL
@@ -58,7 +64,7 @@ menu "Example Configuration"
                 help
                     The KSZ8041 is a single supply 10Base-T/100Base-TX Physical Layer Transceiver.
                     Goto https://www.microchip.com/wwwproducts/en/KSZ8041 for more information about it.
-        endchoice
+        endchoice # EXAMPLE_ETH_PHY_MODEL
 
         config EXAMPLE_ETH_MDC_GPIO
             int "SMI MDC GPIO number"
@@ -71,57 +77,57 @@ menu "Example Configuration"
             default 18
             help
                 Set the GPIO number used by SMI MDIO.
-    endif
+    endif # EXAMPLE_USE_INTERNAL_ETHERNET
 
-    if EXAMPLE_USE_DM9051
-        config EXAMPLE_DM9051_SPI_HOST
+    if ETH_USE_SPI_ETHERNET
+        config EXAMPLE_ETH_SPI_HOST
             int "SPI Host Number"
             range 0 2
             default 1
             help
                 Set the SPI host used to communicate with the SPI Ethernet Controller.
 
-        config EXAMPLE_DM9051_SCLK_GPIO
+        config EXAMPLE_ETH_SPI_SCLK_GPIO
             int "SPI SCLK GPIO number"
             range 0 33
-            default 19
+            default 20
             help
                 Set the GPIO number used by SPI SCLK.
 
-        config EXAMPLE_DM9051_MOSI_GPIO
+        config EXAMPLE_ETH_SPI_MOSI_GPIO
             int "SPI MOSI GPIO number"
             range 0 33
-            default 23
+            default 19
             help
                 Set the GPIO number used by SPI MOSI.
 
-        config EXAMPLE_DM9051_MISO_GPIO
+        config EXAMPLE_ETH_SPI_MISO_GPIO
             int "SPI MISO GPIO number"
             range 0 33
-            default 25
+            default 18
             help
                 Set the GPIO number used by SPI MISO.
 
-        config EXAMPLE_DM9051_CS_GPIO
+        config EXAMPLE_ETH_SPI_CS_GPIO
             int "SPI CS GPIO number"
             range 0 33
-            default 22
+            default 21
             help
                 Set the GPIO number used by SPI CS.
 
-        config EXAMPLE_DM9051_SPI_CLOCK_MHZ
+        config EXAMPLE_ETH_SPI_CLOCK_MHZ
             int "SPI clock speed (MHz)"
             range 5 80
-            default 20
+            default 36
             help
                 Set the clock speed (MHz) of SPI interface.
 
-        config EXAMPLE_DM9051_INT_GPIO
+        config EXAMPLE_ETH_SPI_INT_GPIO
             int "Interrupt GPIO number"
             default 4
             help
-                Set the GPIO number used by DM9051 interrupt.
-    endif
+                Set the GPIO number used by the SPI Ethernet module interrupt line.
+    endif # ETH_USE_SPI_ETHERNET
 
     config EXAMPLE_ETH_PHY_RST_GPIO
         int "PHY Reset GPIO number"
@@ -132,8 +138,7 @@ menu "Example Configuration"
 
     config EXAMPLE_ETH_PHY_ADDR
         int "PHY Address"
-        range 0 31 if EXAMPLE_USE_INTERNAL_ETHERNET
-        range 1 1 if !EXAMPLE_USE_INTERNAL_ETHERNET
+        range 0 31
         default 1
         help
             Set PHY address according your board schematic.

+ 37 - 9
examples/ethernet/basic/main/ethernet_example_main.c

@@ -16,6 +16,9 @@
 #include "esp_log.h"
 #include "driver/gpio.h"
 #include "sdkconfig.h"
+#if CONFIG_ETH_USE_SPI_ETHERNET
+#include "driver/spi_master.h"
+#endif // CONFIG_ETH_USE_SPI_ETHERNET
 
 static const char *TAG = "eth_example";
 
@@ -96,35 +99,60 @@ void app_main(void)
 #elif CONFIG_EXAMPLE_ETH_PHY_KSZ8041
     esp_eth_phy_t *phy = esp_eth_phy_new_ksz8041(&phy_config);
 #endif
-#elif CONFIG_EXAMPLE_USE_DM9051
+#elif CONFIG_ETH_USE_SPI_ETHERNET
     gpio_install_isr_service(0);
     spi_device_handle_t spi_handle = NULL;
     spi_bus_config_t buscfg = {
-        .miso_io_num = CONFIG_EXAMPLE_DM9051_MISO_GPIO,
-        .mosi_io_num = CONFIG_EXAMPLE_DM9051_MOSI_GPIO,
-        .sclk_io_num = CONFIG_EXAMPLE_DM9051_SCLK_GPIO,
+        .miso_io_num = CONFIG_EXAMPLE_ETH_SPI_MISO_GPIO,
+        .mosi_io_num = CONFIG_EXAMPLE_ETH_SPI_MOSI_GPIO,
+        .sclk_io_num = CONFIG_EXAMPLE_ETH_SPI_SCLK_GPIO,
         .quadwp_io_num = -1,
         .quadhd_io_num = -1,
     };
-    ESP_ERROR_CHECK(spi_bus_initialize(CONFIG_EXAMPLE_DM9051_SPI_HOST, &buscfg, 1));
+    ESP_ERROR_CHECK(spi_bus_initialize(CONFIG_EXAMPLE_ETH_SPI_HOST, &buscfg, 1));
+#if CONFIG_EXAMPLE_USE_DM9051
     spi_device_interface_config_t devcfg = {
         .command_bits = 1,
         .address_bits = 7,
         .mode = 0,
-        .clock_speed_hz = CONFIG_EXAMPLE_DM9051_SPI_CLOCK_MHZ * 1000 * 1000,
-        .spics_io_num = CONFIG_EXAMPLE_DM9051_CS_GPIO,
+        .clock_speed_hz = CONFIG_EXAMPLE_ETH_SPI_CLOCK_MHZ * 1000 * 1000,
+        .spics_io_num = CONFIG_EXAMPLE_ETH_SPI_CS_GPIO,
         .queue_size = 20
     };
-    ESP_ERROR_CHECK(spi_bus_add_device(CONFIG_EXAMPLE_DM9051_SPI_HOST, &devcfg, &spi_handle));
+    ESP_ERROR_CHECK(spi_bus_add_device(CONFIG_EXAMPLE_ETH_SPI_HOST, &devcfg, &spi_handle));
     /* dm9051 ethernet driver is based on spi driver */
     eth_dm9051_config_t dm9051_config = ETH_DM9051_DEFAULT_CONFIG(spi_handle);
-    dm9051_config.int_gpio_num = CONFIG_EXAMPLE_DM9051_INT_GPIO;
+    dm9051_config.int_gpio_num = CONFIG_EXAMPLE_ETH_SPI_INT_GPIO;
     esp_eth_mac_t *mac = esp_eth_mac_new_dm9051(&dm9051_config, &mac_config);
     esp_eth_phy_t *phy = esp_eth_phy_new_dm9051(&phy_config);
+#elif CONFIG_EXAMPLE_USE_W5500
+    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
+        .mode = 0,
+        .clock_speed_hz = CONFIG_EXAMPLE_ETH_SPI_CLOCK_MHZ * 1000 * 1000,
+        .spics_io_num = CONFIG_EXAMPLE_ETH_SPI_CS_GPIO,
+        .queue_size = 20
+    };
+    ESP_ERROR_CHECK(spi_bus_add_device(CONFIG_EXAMPLE_ETH_SPI_HOST, &devcfg, &spi_handle));
+    /* w5500 ethernet driver is based on spi driver */
+    eth_w5500_config_t w5500_config = ETH_W5500_DEFAULT_CONFIG(spi_handle);
+    w5500_config.int_gpio_num = CONFIG_EXAMPLE_ETH_SPI_INT_GPIO;
+    esp_eth_mac_t *mac = esp_eth_mac_new_w5500(&w5500_config, &mac_config);
+    esp_eth_phy_t *phy = esp_eth_phy_new_w5500(&phy_config);
 #endif
+#endif // CONFIG_ETH_USE_SPI_ETHERNET
     esp_eth_config_t config = ETH_DEFAULT_CONFIG(mac, phy);
     esp_eth_handle_t eth_handle = NULL;
     ESP_ERROR_CHECK(esp_eth_driver_install(&config, &eth_handle));
+#if CONFIG_ETH_USE_SPI_ETHERNET
+    /* The SPI Ethernet module might doesn't have a burned factory MAC address, we cat to set it manually.
+       02:00:00 is a Locally Administered OUI range so should not be used except when testing on a LAN under your control.
+    */
+    ESP_ERROR_CHECK(esp_eth_ioctl(eth_handle, ETH_CMD_S_MAC_ADDR, (uint8_t[]) {
+        0x02, 0x00, 0x00, 0x12, 0x34, 0x56
+    }));
+#endif
     /* attach Ethernet driver to TCP/IP stack */
     ESP_ERROR_CHECK(esp_netif_attach(eth_netif, esp_eth_new_netif_glue(eth_handle)));
     /* start Ethernet driver state machine */

+ 2 - 1
examples/ethernet/enc28j60/main/enc28j60_example_main.c

@@ -8,6 +8,7 @@
 */
 #include <stdio.h>
 #include <string.h>
+#include "sdkconfig.h"
 #include "freertos/FreeRTOS.h"
 #include "freertos/task.h"
 #include "esp_netif.h"
@@ -16,7 +17,7 @@
 #include "esp_log.h"
 #include "driver/gpio.h"
 #include "enc28j60.h"
-#include "sdkconfig.h"
+#include "driver/spi_master.h"
 
 static const char *TAG = "eth_example";
 

+ 36 - 24
examples/ethernet/eth2ap/main/Kconfig.projbuild

@@ -2,7 +2,7 @@ menu "Example Configuration"
     choice EXAMPLE_USE_ETHERNET
         prompt "Ethernet Type"
         default EXAMPLE_USE_INTERNAL_ETHERNET if IDF_TARGET_ESP32
-        default EXAMPLE_USE_DM9051 if !IDF_TARGET_ESP32
+        default EXAMPLE_USE_W5500
         help
             Select which kind of Ethernet will be used in the example.
 
@@ -18,8 +18,15 @@ menu "Example Configuration"
             select ETH_USE_SPI_ETHERNET
             select ETH_SPI_ETHERNET_DM9051
             help
-                Select external SPI-Ethernet module.
-    endchoice
+                Select external SPI-Ethernet module (DM9051).
+
+        config EXAMPLE_USE_W5500
+            bool "W5500 Module"
+            select ETH_USE_SPI_ETHERNET
+            select ETH_SPI_ETHERNET_W5500
+            help
+                Select external SPI-Ethernet module (W5500).
+    endchoice # EXAMPLE_USE_ETHERNET
 
     if EXAMPLE_USE_INTERNAL_ETHERNET
         choice EXAMPLE_ETH_PHY_MODEL
@@ -51,7 +58,13 @@ menu "Example Configuration"
                 help
                     DP83848 is a single port 10/100Mb/s Ethernet Physical Layer Transceiver.
                     Goto http://www.ti.com/product/DP83848J for more information about it.
-        endchoice
+
+            config EXAMPLE_ETH_PHY_KSZ8041
+                bool "KSZ8041"
+                help
+                    The KSZ8041 is a single supply 10Base-T/100Base-TX Physical Layer Transceiver.
+                    Goto https://www.microchip.com/wwwproducts/en/KSZ8041 for more information about it.
+        endchoice # EXAMPLE_ETH_PHY_MODEL
 
         config EXAMPLE_ETH_MDC_GPIO
             int "SMI MDC GPIO number"
@@ -64,57 +77,57 @@ menu "Example Configuration"
             default 18
             help
                 Set the GPIO number used by SMI MDIO.
-    endif
+    endif # EXAMPLE_USE_INTERNAL_ETHERNET
 
-    if EXAMPLE_USE_DM9051
-        config EXAMPLE_DM9051_SPI_HOST
+    if ETH_USE_SPI_ETHERNET
+        config EXAMPLE_ETH_SPI_HOST
             int "SPI Host Number"
             range 0 2
             default 1
             help
-                Set the SPI host used to communicate with DM9051.
+                Set the SPI host used to communicate with the SPI Ethernet Controller.
 
-        config EXAMPLE_DM9051_SCLK_GPIO
+        config EXAMPLE_ETH_SPI_SCLK_GPIO
             int "SPI SCLK GPIO number"
             range 0 33
-            default 19
+            default 20
             help
                 Set the GPIO number used by SPI SCLK.
 
-        config EXAMPLE_DM9051_MOSI_GPIO
+        config EXAMPLE_ETH_SPI_MOSI_GPIO
             int "SPI MOSI GPIO number"
             range 0 33
-            default 23
+            default 19
             help
                 Set the GPIO number used by SPI MOSI.
 
-        config EXAMPLE_DM9051_MISO_GPIO
+        config EXAMPLE_ETH_SPI_MISO_GPIO
             int "SPI MISO GPIO number"
             range 0 33
-            default 25
+            default 18
             help
                 Set the GPIO number used by SPI MISO.
 
-        config EXAMPLE_DM9051_CS_GPIO
+        config EXAMPLE_ETH_SPI_CS_GPIO
             int "SPI CS GPIO number"
             range 0 33
-            default 22
+            default 21
             help
                 Set the GPIO number used by SPI CS.
 
-        config EXAMPLE_DM9051_SPI_CLOCK_MHZ
+        config EXAMPLE_ETH_SPI_CLOCK_MHZ
             int "SPI clock speed (MHz)"
-            range 20 80
-            default 20
+            range 5 80
+            default 36
             help
                 Set the clock speed (MHz) of SPI interface.
 
-        config EXAMPLE_DM9051_INT_GPIO
+        config EXAMPLE_ETH_SPI_INT_GPIO
             int "Interrupt GPIO number"
             default 4
             help
-                Set the GPIO number used by DM9051 interrupt.
-    endif
+                Set the GPIO number used by the SPI Ethernet module interrupt line.
+    endif # ETH_USE_SPI_ETHERNET
 
     config EXAMPLE_ETH_PHY_RST_GPIO
         int "PHY Reset GPIO number"
@@ -125,8 +138,7 @@ menu "Example Configuration"
 
     config EXAMPLE_ETH_PHY_ADDR
         int "PHY Address"
-        range 0 31 if EXAMPLE_USE_INTERNAL_ETHERNET
-        range 1 1 if !EXAMPLE_USE_INTERNAL_ETHERNET
+        range 0 31
         default 1
         help
             Set PHY address according your board schematic.

+ 41 - 11
examples/ethernet/eth2ap/main/ethernet_example_main.c

@@ -8,6 +8,7 @@
 */
 #include <string.h>
 #include <stdlib.h>
+#include "sdkconfig.h"
 #include "freertos/FreeRTOS.h"
 #include "freertos/task.h"
 #include "freertos/queue.h"
@@ -18,7 +19,9 @@
 #include "nvs_flash.h"
 #include "esp_private/wifi.h"
 #include "driver/gpio.h"
-#include "sdkconfig.h"
+#if CONFIG_ETH_USE_SPI_ETHERNET
+#include "driver/spi_master.h"
+#endif
 
 static const char *TAG = "eth_example";
 static esp_eth_handle_t s_eth_handle = NULL;
@@ -51,7 +54,7 @@ static esp_err_t pkt_wifi2eth(void *buffer, uint16_t len, void *eb)
 // Forward packets from Ethernet to Wi-Fi
 // Note that, Ethernet works faster than Wi-Fi on ESP32,
 // so we need to add an extra queue to balance their speed difference.
-static esp_err_t pkt_eth2wifi(esp_eth_handle_t eth_handle, uint8_t *buffer, uint32_t len, void* priv)
+static esp_err_t pkt_eth2wifi(esp_eth_handle_t eth_handle, uint8_t *buffer, uint32_t len, void *priv)
 {
     esp_err_t ret = ESP_OK;
     flow_control_msg_t msg = {
@@ -166,36 +169,63 @@ static void initialize_ethernet(void)
     esp_eth_phy_t *phy = esp_eth_phy_new_lan8720(&phy_config);
 #elif CONFIG_EXAMPLE_ETH_PHY_DP83848
     esp_eth_phy_t *phy = esp_eth_phy_new_dp83848(&phy_config);
+#elif CONFIG_EXAMPLE_ETH_PHY_KSZ8041
+    esp_eth_phy_t *phy = esp_eth_phy_new_ksz8041(&phy_config);
 #endif
-#elif CONFIG_EXAMPLE_USE_DM9051
+#elif CONFIG_ETH_USE_SPI_ETHERNET
     gpio_install_isr_service(0);
     spi_device_handle_t spi_handle = NULL;
     spi_bus_config_t buscfg = {
-        .miso_io_num = CONFIG_EXAMPLE_DM9051_MISO_GPIO,
-        .mosi_io_num = CONFIG_EXAMPLE_DM9051_MOSI_GPIO,
-        .sclk_io_num = CONFIG_EXAMPLE_DM9051_SCLK_GPIO,
+        .miso_io_num = CONFIG_EXAMPLE_ETH_SPI_MISO_GPIO,
+        .mosi_io_num = CONFIG_EXAMPLE_ETH_SPI_MOSI_GPIO,
+        .sclk_io_num = CONFIG_EXAMPLE_ETH_SPI_SCLK_GPIO,
         .quadwp_io_num = -1,
         .quadhd_io_num = -1,
     };
-    ESP_ERROR_CHECK(spi_bus_initialize(CONFIG_EXAMPLE_DM9051_SPI_HOST, &buscfg, 1));
+    ESP_ERROR_CHECK(spi_bus_initialize(CONFIG_EXAMPLE_ETH_SPI_HOST, &buscfg, 1));
+#if CONFIG_EXAMPLE_USE_DM9051
     spi_device_interface_config_t devcfg = {
         .command_bits = 1,
         .address_bits = 7,
         .mode = 0,
-        .clock_speed_hz = CONFIG_EXAMPLE_DM9051_SPI_CLOCK_MHZ * 1000 * 1000,
-        .spics_io_num = CONFIG_EXAMPLE_DM9051_CS_GPIO,
+        .clock_speed_hz = CONFIG_EXAMPLE_ETH_SPI_CLOCK_MHZ * 1000 * 1000,
+        .spics_io_num = CONFIG_EXAMPLE_ETH_SPI_CS_GPIO,
         .queue_size = 20
     };
-    ESP_ERROR_CHECK(spi_bus_add_device(CONFIG_EXAMPLE_DM9051_SPI_HOST, &devcfg, &spi_handle));
+    ESP_ERROR_CHECK(spi_bus_add_device(CONFIG_EXAMPLE_ETH_SPI_HOST, &devcfg, &spi_handle));
     /* dm9051 ethernet driver is based on spi driver */
     eth_dm9051_config_t dm9051_config = ETH_DM9051_DEFAULT_CONFIG(spi_handle);
-    dm9051_config.int_gpio_num = CONFIG_EXAMPLE_DM9051_INT_GPIO;
+    dm9051_config.int_gpio_num = CONFIG_EXAMPLE_ETH_SPI_INT_GPIO;
     esp_eth_mac_t *mac = esp_eth_mac_new_dm9051(&dm9051_config, &mac_config);
     esp_eth_phy_t *phy = esp_eth_phy_new_dm9051(&phy_config);
+#elif CONFIG_EXAMPLE_USE_W5500
+    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
+        .mode = 0,
+        .clock_speed_hz = CONFIG_EXAMPLE_ETH_SPI_CLOCK_MHZ * 1000 * 1000,
+        .spics_io_num = CONFIG_EXAMPLE_ETH_SPI_CS_GPIO,
+        .queue_size = 20
+    };
+    ESP_ERROR_CHECK(spi_bus_add_device(CONFIG_EXAMPLE_ETH_SPI_HOST, &devcfg, &spi_handle));
+    /* w5500 ethernet driver is based on spi driver */
+    eth_w5500_config_t w5500_config = ETH_W5500_DEFAULT_CONFIG(spi_handle);
+    w5500_config.int_gpio_num = CONFIG_EXAMPLE_ETH_SPI_INT_GPIO;
+    esp_eth_mac_t *mac = esp_eth_mac_new_w5500(&w5500_config, &mac_config);
+    esp_eth_phy_t *phy = esp_eth_phy_new_w5500(&phy_config);
 #endif
+#endif // CONFIG_ETH_USE_SPI_ETHERNET
     esp_eth_config_t config = ETH_DEFAULT_CONFIG(mac, phy);
     config.stack_input = pkt_eth2wifi;
     ESP_ERROR_CHECK(esp_eth_driver_install(&config, &s_eth_handle));
+#if CONFIG_ETH_USE_SPI_ETHERNET
+    /* The SPI Ethernet module might doesn't have a burned factory MAC address, we cat to set it manually.
+       02:00:00 is a Locally Administered OUI range so should not be used except when testing on a LAN under your control.
+    */
+    ESP_ERROR_CHECK(esp_eth_ioctl(s_eth_handle, ETH_CMD_S_MAC_ADDR, (uint8_t[]) {
+        0x02, 0x00, 0x00, 0x12, 0x34, 0x56
+    }));
+#endif
     esp_eth_ioctl(s_eth_handle, ETH_CMD_S_PROMISCUOUS, (void *)true);
     esp_eth_start(s_eth_handle);
 }

+ 36 - 24
examples/ethernet/iperf/main/Kconfig.projbuild

@@ -10,7 +10,7 @@ menu "Example Configuration"
     choice EXAMPLE_USE_ETHERNET
         prompt "Ethernet Type"
         default EXAMPLE_USE_INTERNAL_ETHERNET if IDF_TARGET_ESP32
-        default EXAMPLE_USE_DM9051 if !IDF_TARGET_ESP32
+        default EXAMPLE_USE_W5500
         help
             Select which kind of Ethernet will be used in the example.
 
@@ -26,8 +26,15 @@ menu "Example Configuration"
             select ETH_USE_SPI_ETHERNET
             select ETH_SPI_ETHERNET_DM9051
             help
-                Select external SPI-Ethernet module.
-    endchoice
+                Select external SPI-Ethernet module (DM9051).
+
+        config EXAMPLE_USE_W5500
+            bool "W5500 Module"
+            select ETH_USE_SPI_ETHERNET
+            select ETH_SPI_ETHERNET_W5500
+            help
+                Select external SPI-Ethernet module (W5500).
+    endchoice # EXAMPLE_USE_ETHERNET
 
     if EXAMPLE_USE_INTERNAL_ETHERNET
         choice EXAMPLE_ETH_PHY_MODEL
@@ -59,7 +66,13 @@ menu "Example Configuration"
                 help
                     DP83848 is a single port 10/100Mb/s Ethernet Physical Layer Transceiver.
                     Goto http://www.ti.com/product/DP83848J for more information about it.
-        endchoice
+
+            config EXAMPLE_ETH_PHY_KSZ8041
+                bool "KSZ8041"
+                help
+                    The KSZ8041 is a single supply 10Base-T/100Base-TX Physical Layer Transceiver.
+                    Goto https://www.microchip.com/wwwproducts/en/KSZ8041 for more information about it.
+        endchoice # EXAMPLE_ETH_PHY_MODEL
 
         config EXAMPLE_ETH_MDC_GPIO
             int "SMI MDC GPIO number"
@@ -72,57 +85,57 @@ menu "Example Configuration"
             default 18
             help
                 Set the GPIO number used by SMI MDIO.
-    endif
+    endif # EXAMPLE_USE_INTERNAL_ETHERNET
 
-    if EXAMPLE_USE_DM9051
-        config EXAMPLE_DM9051_SPI_HOST
+    if ETH_USE_SPI_ETHERNET
+        config EXAMPLE_ETH_SPI_HOST
             int "SPI Host Number"
             range 0 2
             default 1
             help
-                Set the SPI host used to communicate with DM9051.
+                Set the SPI host used to communicate with the SPI Ethernet Controller.
 
-        config EXAMPLE_DM9051_SCLK_GPIO
+        config EXAMPLE_ETH_SPI_SCLK_GPIO
             int "SPI SCLK GPIO number"
             range 0 33
-            default 19
+            default 20
             help
                 Set the GPIO number used by SPI SCLK.
 
-        config EXAMPLE_DM9051_MOSI_GPIO
+        config EXAMPLE_ETH_SPI_MOSI_GPIO
             int "SPI MOSI GPIO number"
             range 0 33
-            default 23
+            default 19
             help
                 Set the GPIO number used by SPI MOSI.
 
-        config EXAMPLE_DM9051_MISO_GPIO
+        config EXAMPLE_ETH_SPI_MISO_GPIO
             int "SPI MISO GPIO number"
             range 0 33
-            default 25
+            default 18
             help
                 Set the GPIO number used by SPI MISO.
 
-        config EXAMPLE_DM9051_CS_GPIO
+        config EXAMPLE_ETH_SPI_CS_GPIO
             int "SPI CS GPIO number"
             range 0 33
-            default 22
+            default 21
             help
                 Set the GPIO number used by SPI CS.
 
-        config EXAMPLE_DM9051_SPI_CLOCK_MHZ
+        config EXAMPLE_ETH_SPI_CLOCK_MHZ
             int "SPI clock speed (MHz)"
-            range 20 80
-            default 20
+            range 5 80
+            default 36
             help
                 Set the clock speed (MHz) of SPI interface.
 
-        config EXAMPLE_DM9051_INT_GPIO
+        config EXAMPLE_ETH_SPI_INT_GPIO
             int "Interrupt GPIO number"
             default 4
             help
-                Set the GPIO number used by DM9051 interrupt.
-    endif
+                Set the GPIO number used by the SPI Ethernet module interrupt line.
+    endif # ETH_USE_SPI_ETHERNET
 
     config EXAMPLE_ETH_PHY_RST_GPIO
         int "PHY Reset GPIO number"
@@ -133,8 +146,7 @@ menu "Example Configuration"
 
     config EXAMPLE_ETH_PHY_ADDR
         int "PHY Address"
-        range 0 31 if EXAMPLE_USE_INTERNAL_ETHERNET
-        range 1 1 if !EXAMPLE_USE_INTERNAL_ETHERNET
+        range 0 31
         default 1
         help
             Set PHY address according your board schematic.

+ 39 - 9
examples/ethernet/iperf/main/cmd_ethernet.c

@@ -19,6 +19,9 @@
 #include "argtable3/argtable3.h"
 #include "iperf.h"
 #include "sdkconfig.h"
+#if CONFIG_ETH_USE_SPI_ETHERNET
+#include "driver/spi_master.h"
+#endif // CONFIG_ETH_USE_SPI_ETHERNET
 
 static esp_netif_ip_info_t ip;
 static bool started = false;
@@ -202,35 +205,62 @@ void register_ethernet(void)
     esp_eth_phy_t *phy = esp_eth_phy_new_lan8720(&phy_config);
 #elif CONFIG_EXAMPLE_ETH_PHY_DP83848
     esp_eth_phy_t *phy = esp_eth_phy_new_dp83848(&phy_config);
+#elif CONFIG_EXAMPLE_ETH_PHY_KSZ8041
+    esp_eth_phy_t *phy = esp_eth_phy_new_ksz8041(&phy_config);
 #endif
-#elif CONFIG_EXAMPLE_USE_DM9051
+#elif CONFIG_ETH_USE_SPI_ETHERNET
     gpio_install_isr_service(0);
     spi_device_handle_t spi_handle = NULL;
     spi_bus_config_t buscfg = {
-        .miso_io_num = CONFIG_EXAMPLE_DM9051_MISO_GPIO,
-        .mosi_io_num = CONFIG_EXAMPLE_DM9051_MOSI_GPIO,
-        .sclk_io_num = CONFIG_EXAMPLE_DM9051_SCLK_GPIO,
+        .miso_io_num = CONFIG_EXAMPLE_ETH_SPI_MISO_GPIO,
+        .mosi_io_num = CONFIG_EXAMPLE_ETH_SPI_MOSI_GPIO,
+        .sclk_io_num = CONFIG_EXAMPLE_ETH_SPI_SCLK_GPIO,
         .quadwp_io_num = -1,
         .quadhd_io_num = -1,
     };
-    ESP_ERROR_CHECK(spi_bus_initialize(CONFIG_EXAMPLE_DM9051_SPI_HOST, &buscfg, 1));
+    ESP_ERROR_CHECK(spi_bus_initialize(CONFIG_EXAMPLE_ETH_SPI_HOST, &buscfg, 1));
+#if CONFIG_EXAMPLE_USE_DM9051
     spi_device_interface_config_t devcfg = {
         .command_bits = 1,
         .address_bits = 7,
         .mode = 0,
-        .clock_speed_hz = CONFIG_EXAMPLE_DM9051_SPI_CLOCK_MHZ * 1000 * 1000,
-        .spics_io_num = CONFIG_EXAMPLE_DM9051_CS_GPIO,
+        .clock_speed_hz = CONFIG_EXAMPLE_ETH_SPI_CLOCK_MHZ * 1000 * 1000,
+        .spics_io_num = CONFIG_EXAMPLE_ETH_SPI_CS_GPIO,
         .queue_size = 20
     };
-    ESP_ERROR_CHECK(spi_bus_add_device(CONFIG_EXAMPLE_DM9051_SPI_HOST, &devcfg, &spi_handle));
+    ESP_ERROR_CHECK(spi_bus_add_device(CONFIG_EXAMPLE_ETH_SPI_HOST, &devcfg, &spi_handle));
     /* dm9051 ethernet driver is based on spi driver */
     eth_dm9051_config_t dm9051_config = ETH_DM9051_DEFAULT_CONFIG(spi_handle);
-    dm9051_config.int_gpio_num = CONFIG_EXAMPLE_DM9051_INT_GPIO;
+    dm9051_config.int_gpio_num = CONFIG_EXAMPLE_ETH_SPI_INT_GPIO;
     esp_eth_mac_t *mac = esp_eth_mac_new_dm9051(&dm9051_config, &mac_config);
     esp_eth_phy_t *phy = esp_eth_phy_new_dm9051(&phy_config);
+#elif CONFIG_EXAMPLE_USE_W5500
+    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
+        .mode = 0,
+        .clock_speed_hz = CONFIG_EXAMPLE_ETH_SPI_CLOCK_MHZ * 1000 * 1000,
+        .spics_io_num = CONFIG_EXAMPLE_ETH_SPI_CS_GPIO,
+        .queue_size = 20
+    };
+    ESP_ERROR_CHECK(spi_bus_add_device(CONFIG_EXAMPLE_ETH_SPI_HOST, &devcfg, &spi_handle));
+    /* w5500 ethernet driver is based on spi driver */
+    eth_w5500_config_t w5500_config = ETH_W5500_DEFAULT_CONFIG(spi_handle);
+    w5500_config.int_gpio_num = CONFIG_EXAMPLE_ETH_SPI_INT_GPIO;
+    esp_eth_mac_t *mac = esp_eth_mac_new_w5500(&w5500_config, &mac_config);
+    esp_eth_phy_t *phy = esp_eth_phy_new_w5500(&phy_config);
 #endif
+#endif // CONFIG_ETH_USE_SPI_ETHERNET
     esp_eth_config_t config = ETH_DEFAULT_CONFIG(mac, phy);
     ESP_ERROR_CHECK(esp_eth_driver_install(&config, &eth_handle));
+#if CONFIG_ETH_USE_SPI_ETHERNET
+    /* The SPI Ethernet module might doesn't have a burned factory MAC address, we cat to set it manually.
+       02:00:00 is a Locally Administered OUI range so should not be used except when testing on a LAN under your control.
+    */
+    ESP_ERROR_CHECK(esp_eth_ioctl(eth_handle, ETH_CMD_S_MAC_ADDR, (uint8_t[]) {
+        0x02, 0x00, 0x00, 0x12, 0x34, 0x56
+    }));
+#endif
     ESP_ERROR_CHECK(esp_netif_attach(eth_netif, esp_eth_new_netif_glue(eth_handle)));
     ESP_ERROR_CHECK(esp_eth_start(eth_handle));