From aea901f014ac05c41664dd1e3ba9bbd2301a0aba Mon Sep 17 00:00:00 2001 From: morris Date: Fri, 6 Nov 2020 16:06:20 +0800 Subject: [PATCH] eth: support W5500 in network examples --- .../Kconfig.projbuild | 42 ++++++----- .../protocol_examples_common/connect.c | 72 +++++++++++++------ .../ethernet/basic/main/Kconfig.projbuild | 47 ++++++------ .../basic/main/ethernet_example_main.c | 46 +++++++++--- .../enc28j60/main/enc28j60_example_main.c | 3 +- .../ethernet/eth2ap/main/Kconfig.projbuild | 60 +++++++++------- .../eth2ap/main/ethernet_example_main.c | 52 +++++++++++--- .../ethernet/iperf/main/Kconfig.projbuild | 60 +++++++++------- examples/ethernet/iperf/main/cmd_ethernet.c | 48 ++++++++++--- 9 files changed, 291 insertions(+), 139 deletions(-) diff --git a/examples/common_components/protocol_examples_common/Kconfig.projbuild b/examples/common_components/protocol_examples_common/Kconfig.projbuild index ed7f51c592..56a6f9c952 100644 --- a/examples/common_components/protocol_examples_common/Kconfig.projbuild +++ b/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. diff --git a/examples/common_components/protocol_examples_common/connect.c b/examples/common_components/protocol_examples_common/connect.c index 6ef826f429..2449ab940a 100644 --- a/examples/common_components/protocol_examples_common/connect.c +++ b/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 #include +#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"; diff --git a/examples/ethernet/eth2ap/main/Kconfig.projbuild b/examples/ethernet/eth2ap/main/Kconfig.projbuild index d6e9b15a86..a45d94c847 100644 --- a/examples/ethernet/eth2ap/main/Kconfig.projbuild +++ b/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. diff --git a/examples/ethernet/eth2ap/main/ethernet_example_main.c b/examples/ethernet/eth2ap/main/ethernet_example_main.c index 224f2c1f30..246ec9754e 100644 --- a/examples/ethernet/eth2ap/main/ethernet_example_main.c +++ b/examples/ethernet/eth2ap/main/ethernet_example_main.c @@ -8,6 +8,7 @@ */ #include #include +#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); } diff --git a/examples/ethernet/iperf/main/Kconfig.projbuild b/examples/ethernet/iperf/main/Kconfig.projbuild index e71121e188..c7f3a24752 100644 --- a/examples/ethernet/iperf/main/Kconfig.projbuild +++ b/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. diff --git a/examples/ethernet/iperf/main/cmd_ethernet.c b/examples/ethernet/iperf/main/cmd_ethernet.c index 1303ac956c..f8efff1e2b 100644 --- a/examples/ethernet/iperf/main/cmd_ethernet.c +++ b/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, ð_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));