[ETH] Implement SPI support, multiple interfaces and more (#8712)
This commit is contained in:
parent
93a45019a8
commit
e2487b128d
10 changed files with 1172 additions and 529 deletions
|
|
@ -3,11 +3,20 @@
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// Important to be defined BEFORE including ETH.h for ETH.begin() to work.
|
||||||
|
// Example RMII LAN8720 (Olimex, etc.)
|
||||||
|
#define ETH_PHY_TYPE ETH_PHY_LAN8720
|
||||||
|
#define ETH_PHY_ADDR 0
|
||||||
|
#define ETH_PHY_MDC 23
|
||||||
|
#define ETH_PHY_MDIO 18
|
||||||
|
#define ETH_PHY_POWER -1
|
||||||
|
#define ETH_CLK_MODE ETH_CLOCK_GPIO0_IN
|
||||||
|
|
||||||
#include <ETH.h>
|
#include <ETH.h>
|
||||||
|
|
||||||
static bool eth_connected = false;
|
static bool eth_connected = false;
|
||||||
|
|
||||||
void WiFiEvent(WiFiEvent_t event)
|
void onEvent(arduino_event_id_t event, arduino_event_info_t info)
|
||||||
{
|
{
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case ARDUINO_EVENT_ETH_START:
|
case ARDUINO_EVENT_ETH_START:
|
||||||
|
|
@ -19,18 +28,14 @@ void WiFiEvent(WiFiEvent_t event)
|
||||||
Serial.println("ETH Connected");
|
Serial.println("ETH Connected");
|
||||||
break;
|
break;
|
||||||
case ARDUINO_EVENT_ETH_GOT_IP:
|
case ARDUINO_EVENT_ETH_GOT_IP:
|
||||||
Serial.print("ETH MAC: ");
|
Serial.println("ETH Got IP");
|
||||||
Serial.print(ETH.macAddress());
|
ETH.printInfo(Serial);
|
||||||
Serial.print(", IPv4: ");
|
|
||||||
Serial.print(ETH.localIP());
|
|
||||||
if (ETH.fullDuplex()) {
|
|
||||||
Serial.print(", FULL_DUPLEX");
|
|
||||||
}
|
|
||||||
Serial.print(", ");
|
|
||||||
Serial.print(ETH.linkSpeed());
|
|
||||||
Serial.println("Mbps");
|
|
||||||
eth_connected = true;
|
eth_connected = true;
|
||||||
break;
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_LOST_IP:
|
||||||
|
Serial.println("ETH Lost IP");
|
||||||
|
eth_connected = false;
|
||||||
|
break;
|
||||||
case ARDUINO_EVENT_ETH_DISCONNECTED:
|
case ARDUINO_EVENT_ETH_DISCONNECTED:
|
||||||
Serial.println("ETH Disconnected");
|
Serial.println("ETH Disconnected");
|
||||||
eth_connected = false;
|
eth_connected = false;
|
||||||
|
|
@ -67,7 +72,7 @@ void testClient(const char * host, uint16_t port)
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
WiFi.onEvent(WiFiEvent);
|
WiFi.onEvent(onEvent);
|
||||||
ETH.begin();
|
ETH.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,15 +5,16 @@
|
||||||
|
|
||||||
#include <ETH.h>
|
#include <ETH.h>
|
||||||
|
|
||||||
|
#define ETH_TYPE ETH_PHY_TLK110
|
||||||
#define ETH_ADDR 31
|
#define ETH_ADDR 31
|
||||||
#define ETH_POWER_PIN 17
|
|
||||||
#define ETH_MDC_PIN 23
|
#define ETH_MDC_PIN 23
|
||||||
#define ETH_MDIO_PIN 18
|
#define ETH_MDIO_PIN 18
|
||||||
#define ETH_TYPE ETH_PHY_TLK110
|
#define ETH_POWER_PIN 17
|
||||||
|
#define ETH_CLK_MODE ETH_CLOCK_GPIO0_IN
|
||||||
|
|
||||||
static bool eth_connected = false;
|
static bool eth_connected = false;
|
||||||
|
|
||||||
void WiFiEvent(WiFiEvent_t event)
|
void onEvent(arduino_event_id_t event, arduino_event_info_t info)
|
||||||
{
|
{
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case ARDUINO_EVENT_ETH_START:
|
case ARDUINO_EVENT_ETH_START:
|
||||||
|
|
@ -25,18 +26,14 @@ void WiFiEvent(WiFiEvent_t event)
|
||||||
Serial.println("ETH Connected");
|
Serial.println("ETH Connected");
|
||||||
break;
|
break;
|
||||||
case ARDUINO_EVENT_ETH_GOT_IP:
|
case ARDUINO_EVENT_ETH_GOT_IP:
|
||||||
Serial.print("ETH MAC: ");
|
Serial.println("ETH Got IP");
|
||||||
Serial.print(ETH.macAddress());
|
ETH.printInfo(Serial);
|
||||||
Serial.print(", IPv4: ");
|
|
||||||
Serial.print(ETH.localIP());
|
|
||||||
if (ETH.fullDuplex()) {
|
|
||||||
Serial.print(", FULL_DUPLEX");
|
|
||||||
}
|
|
||||||
Serial.print(", ");
|
|
||||||
Serial.print(ETH.linkSpeed());
|
|
||||||
Serial.println("Mbps");
|
|
||||||
eth_connected = true;
|
eth_connected = true;
|
||||||
break;
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_LOST_IP:
|
||||||
|
Serial.println("ETH Lost IP");
|
||||||
|
eth_connected = false;
|
||||||
|
break;
|
||||||
case ARDUINO_EVENT_ETH_DISCONNECTED:
|
case ARDUINO_EVENT_ETH_DISCONNECTED:
|
||||||
Serial.println("ETH Disconnected");
|
Serial.println("ETH Disconnected");
|
||||||
eth_connected = false;
|
eth_connected = false;
|
||||||
|
|
@ -73,8 +70,8 @@ void testClient(const char * host, uint16_t port)
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
WiFi.onEvent(WiFiEvent);
|
WiFi.onEvent(onEvent);
|
||||||
ETH.begin(ETH_ADDR, ETH_POWER_PIN, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_TYPE);
|
ETH.begin(ETH_TYPE, ETH_ADDR, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_POWER_PIN, ETH_CLK_MODE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,110 @@
|
||||||
|
/*
|
||||||
|
This sketch shows the Ethernet event usage
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ETH.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
|
||||||
|
// Set this to 1 to enable dual Ethernet support
|
||||||
|
#define USE_TWO_ETH_PORTS 0
|
||||||
|
|
||||||
|
#define ETH_TYPE ETH_PHY_W5500
|
||||||
|
#define ETH_ADDR 1
|
||||||
|
#define ETH_CS 15
|
||||||
|
#define ETH_IRQ 4
|
||||||
|
#define ETH_RST 5
|
||||||
|
|
||||||
|
// SPI pins
|
||||||
|
#define ETH_SPI_SCK 14
|
||||||
|
#define ETH_SPI_MISO 12
|
||||||
|
#define ETH_SPI_MOSI 13
|
||||||
|
|
||||||
|
#if USE_TWO_ETH_PORTS
|
||||||
|
// Second port on shared SPI bus
|
||||||
|
#define ETH1_TYPE ETH_PHY_W5500
|
||||||
|
#define ETH1_ADDR 1
|
||||||
|
#define ETH1_CS 32
|
||||||
|
#define ETH1_IRQ 33
|
||||||
|
#define ETH1_RST 18
|
||||||
|
ETHClass ETH1(1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static bool eth_connected = false;
|
||||||
|
|
||||||
|
void onEvent(arduino_event_id_t event, arduino_event_info_t info)
|
||||||
|
{
|
||||||
|
switch (event) {
|
||||||
|
case ARDUINO_EVENT_ETH_START:
|
||||||
|
Serial.println("ETH Started");
|
||||||
|
//set eth hostname here
|
||||||
|
ETH.setHostname("esp32-eth0");
|
||||||
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_CONNECTED:
|
||||||
|
Serial.println("ETH Connected");
|
||||||
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_GOT_IP:
|
||||||
|
Serial.printf("ETH Got IP: '%s'\n", esp_netif_get_desc(info.got_ip.esp_netif));
|
||||||
|
ETH.printInfo(Serial);
|
||||||
|
#if USE_TWO_ETH_PORTS
|
||||||
|
ETH1.printInfo(Serial);
|
||||||
|
#endif
|
||||||
|
eth_connected = true;
|
||||||
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_LOST_IP:
|
||||||
|
Serial.println("ETH Lost IP");
|
||||||
|
eth_connected = false;
|
||||||
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_DISCONNECTED:
|
||||||
|
Serial.println("ETH Disconnected");
|
||||||
|
eth_connected = false;
|
||||||
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_STOP:
|
||||||
|
Serial.println("ETH Stopped");
|
||||||
|
eth_connected = false;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void testClient(const char * host, uint16_t port)
|
||||||
|
{
|
||||||
|
Serial.print("\nconnecting to ");
|
||||||
|
Serial.println(host);
|
||||||
|
|
||||||
|
WiFiClient client;
|
||||||
|
if (!client.connect(host, port)) {
|
||||||
|
Serial.println("connection failed");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
client.printf("GET / HTTP/1.1\r\nHost: %s\r\n\r\n", host);
|
||||||
|
while (client.connected() && !client.available());
|
||||||
|
while (client.available()) {
|
||||||
|
Serial.write(client.read());
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println("closing connection\n");
|
||||||
|
client.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
|
Serial.begin(115200);
|
||||||
|
WiFi.onEvent(onEvent);
|
||||||
|
|
||||||
|
SPI.begin(ETH_SPI_SCK, ETH_SPI_MISO, ETH_SPI_MOSI);
|
||||||
|
ETH.begin(ETH_TYPE, ETH_ADDR, ETH_CS, ETH_IRQ, ETH_RST, SPI);
|
||||||
|
#if USE_TWO_ETH_PORTS
|
||||||
|
ETH1.begin(ETH1_TYPE, ETH1_ADDR, ETH1_CS, ETH1_IRQ, ETH1_RST, SPI);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
if (eth_connected) {
|
||||||
|
testClient("google.com", 80);
|
||||||
|
}
|
||||||
|
delay(10000);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,107 @@
|
||||||
|
/*
|
||||||
|
This sketch shows the Ethernet event usage
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ETH.h>
|
||||||
|
|
||||||
|
// Set this to 1 to enable dual Ethernet support
|
||||||
|
#define USE_TWO_ETH_PORTS 0
|
||||||
|
|
||||||
|
#define ETH_TYPE ETH_PHY_W5500
|
||||||
|
#define ETH_ADDR 1
|
||||||
|
#define ETH_CS 15
|
||||||
|
#define ETH_IRQ 4
|
||||||
|
#define ETH_RST 5
|
||||||
|
#define ETH_SPI_HOST SPI2_HOST
|
||||||
|
#define ETH_SPI_SCK 14
|
||||||
|
#define ETH_SPI_MISO 12
|
||||||
|
#define ETH_SPI_MOSI 13
|
||||||
|
|
||||||
|
#if USE_TWO_ETH_PORTS
|
||||||
|
// Second port on shared SPI bus
|
||||||
|
#define ETH1_TYPE ETH_PHY_W5500
|
||||||
|
#define ETH1_ADDR 1
|
||||||
|
#define ETH1_CS 32
|
||||||
|
#define ETH1_IRQ 33
|
||||||
|
#define ETH1_RST 18
|
||||||
|
ETHClass ETH1(1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static bool eth_connected = false;
|
||||||
|
|
||||||
|
void onEvent(arduino_event_id_t event, arduino_event_info_t info)
|
||||||
|
{
|
||||||
|
switch (event) {
|
||||||
|
case ARDUINO_EVENT_ETH_START:
|
||||||
|
Serial.println("ETH Started");
|
||||||
|
//set eth hostname here
|
||||||
|
ETH.setHostname("esp32-eth0");
|
||||||
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_CONNECTED:
|
||||||
|
Serial.println("ETH Connected");
|
||||||
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_GOT_IP:
|
||||||
|
Serial.printf("ETH Got IP: '%s'\n", esp_netif_get_desc(info.got_ip.esp_netif));
|
||||||
|
ETH.printInfo(Serial);
|
||||||
|
#if USE_TWO_ETH_PORTS
|
||||||
|
ETH1.printInfo(Serial);
|
||||||
|
#endif
|
||||||
|
eth_connected = true;
|
||||||
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_LOST_IP:
|
||||||
|
Serial.println("ETH Lost IP");
|
||||||
|
eth_connected = false;
|
||||||
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_DISCONNECTED:
|
||||||
|
Serial.println("ETH Disconnected");
|
||||||
|
eth_connected = false;
|
||||||
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_STOP:
|
||||||
|
Serial.println("ETH Stopped");
|
||||||
|
eth_connected = false;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void testClient(const char * host, uint16_t port)
|
||||||
|
{
|
||||||
|
Serial.print("\nconnecting to ");
|
||||||
|
Serial.println(host);
|
||||||
|
|
||||||
|
WiFiClient client;
|
||||||
|
if (!client.connect(host, port)) {
|
||||||
|
Serial.println("connection failed");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
client.printf("GET / HTTP/1.1\r\nHost: %s\r\n\r\n", host);
|
||||||
|
while (client.connected() && !client.available());
|
||||||
|
while (client.available()) {
|
||||||
|
Serial.write(client.read());
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println("closing connection\n");
|
||||||
|
client.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
|
Serial.begin(115200);
|
||||||
|
WiFi.onEvent(onEvent);
|
||||||
|
ETH.begin(ETH_TYPE, ETH_ADDR, ETH_CS, ETH_IRQ, ETH_RST, ETH_SPI_HOST, ETH_SPI_SCK, ETH_SPI_MISO, ETH_SPI_MOSI);
|
||||||
|
#if USE_TWO_ETH_PORTS
|
||||||
|
// Since SPI bus is shared, we should skip the SPI pins when calling ETH1.begin()
|
||||||
|
ETH1.begin(ETH1_TYPE, ETH1_ADDR, ETH1_CS, ETH1_IRQ, ETH1_RST, ETH_SPI_HOST);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
if (eth_connected) {
|
||||||
|
testClient("google.com", 80);
|
||||||
|
}
|
||||||
|
delay(10000);
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -21,11 +21,59 @@
|
||||||
#ifndef _ETH_H_
|
#ifndef _ETH_H_
|
||||||
#define _ETH_H_
|
#define _ETH_H_
|
||||||
|
|
||||||
|
//
|
||||||
|
// Example configurations for pins_arduino.h to allow starting with ETH.begin();
|
||||||
|
//
|
||||||
|
|
||||||
|
// // Example RMII LAN8720 (Olimex, etc.)
|
||||||
|
// #define ETH_PHY_TYPE ETH_PHY_LAN8720
|
||||||
|
// #define ETH_PHY_ADDR 0
|
||||||
|
// #define ETH_PHY_MDC 23
|
||||||
|
// #define ETH_PHY_MDIO 18
|
||||||
|
// #define ETH_PHY_POWER -1
|
||||||
|
// #define ETH_CLK_MODE ETH_CLOCK_GPIO0_IN
|
||||||
|
|
||||||
|
// // Example RMII ESP32_Ethernet_V4
|
||||||
|
// #define ETH_PHY_TYPE ETH_PHY_TLK110
|
||||||
|
// #define ETH_PHY_ADDR 1
|
||||||
|
// #define ETH_PHY_MDC 23
|
||||||
|
// #define ETH_PHY_MDIO 18
|
||||||
|
// #define ETH_PHY_POWER -1
|
||||||
|
// #define ETH_CLK_MODE ETH_CLOCK_GPIO0_OUT
|
||||||
|
|
||||||
|
// // Example SPI using ESP-IDF's driver
|
||||||
|
// #define ETH_PHY_TYPE ETH_PHY_W5500
|
||||||
|
// #define ETH_PHY_ADDR 1
|
||||||
|
// #define ETH_PHY_CS 15
|
||||||
|
// #define ETH_PHY_IRQ 4
|
||||||
|
// #define ETH_PHY_RST 5
|
||||||
|
// #define ETH_PHY_SPI_HOST SPI2_HOST
|
||||||
|
// #define ETH_PHY_SPI_SCK 14
|
||||||
|
// #define ETH_PHY_SPI_MISO 12
|
||||||
|
// #define ETH_PHY_SPI_MOSI 13
|
||||||
|
|
||||||
|
// // Example SPI using Arduino's driver
|
||||||
|
// #define ETH_PHY_TYPE ETH_PHY_W5500
|
||||||
|
// #define ETH_PHY_ADDR 1
|
||||||
|
// #define ETH_PHY_CS 15
|
||||||
|
// #define ETH_PHY_IRQ 4
|
||||||
|
// #define ETH_PHY_RST 5
|
||||||
|
// #define ETH_PHY_SPI SPI
|
||||||
|
|
||||||
|
// This will be uncommented once custom SPI support is available in ESP-IDF
|
||||||
|
#define ETH_SPI_SUPPORTS_CUSTOM 1
|
||||||
|
|
||||||
#include "WiFi.h"
|
#include "WiFi.h"
|
||||||
|
#if ETH_SPI_SUPPORTS_CUSTOM
|
||||||
|
#include "SPI.h"
|
||||||
|
#endif
|
||||||
#include "esp_system.h"
|
#include "esp_system.h"
|
||||||
#include "esp_eth.h"
|
#include "esp_eth.h"
|
||||||
#include "esp_netif.h"
|
#include "esp_netif.h"
|
||||||
|
|
||||||
|
#if CONFIG_ETH_USE_ESP32_EMAC
|
||||||
|
#define ETH_PHY_IP101 ETH_PHY_TLK110
|
||||||
|
typedef enum { ETH_CLOCK_GPIO0_IN, ETH_CLOCK_GPIO0_OUT, ETH_CLOCK_GPIO16_OUT, ETH_CLOCK_GPIO17_OUT } eth_clock_mode_t;
|
||||||
//Dedicated GPIOs for RMII
|
//Dedicated GPIOs for RMII
|
||||||
#define ETH_RMII_TX_EN 21
|
#define ETH_RMII_TX_EN 21
|
||||||
#define ETH_RMII_TX0 19
|
#define ETH_RMII_TX0 19
|
||||||
|
|
@ -33,94 +81,137 @@
|
||||||
#define ETH_RMII_RX0 25
|
#define ETH_RMII_RX0 25
|
||||||
#define ETH_RMII_RX1_EN 26
|
#define ETH_RMII_RX1_EN 26
|
||||||
#define ETH_RMII_CRS_DV 27
|
#define ETH_RMII_CRS_DV 27
|
||||||
|
#endif /* CONFIG_ETH_USE_ESP32_EMAC */
|
||||||
|
|
||||||
#ifndef ETH_PHY_ADDR
|
#ifndef ETH_PHY_SPI_FREQ_MHZ
|
||||||
#define ETH_PHY_ADDR 0
|
#define ETH_PHY_SPI_FREQ_MHZ 20
|
||||||
|
#endif /* ETH_PHY_SPI_FREQ_MHZ */
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
#if CONFIG_ETH_USE_ESP32_EMAC
|
||||||
|
ETH_PHY_LAN8720, ETH_PHY_TLK110, ETH_PHY_RTL8201, ETH_PHY_DP83848, ETH_PHY_KSZ8041, ETH_PHY_KSZ8081,
|
||||||
|
#endif /* CONFIG_ETH_USE_ESP32_EMAC */
|
||||||
|
#if CONFIG_ETH_SPI_ETHERNET_DM9051
|
||||||
|
ETH_PHY_DM9051,
|
||||||
#endif
|
#endif
|
||||||
|
#if CONFIG_ETH_SPI_ETHERNET_W5500
|
||||||
#ifndef ETH_PHY_TYPE
|
ETH_PHY_W5500,
|
||||||
#define ETH_PHY_TYPE ETH_PHY_LAN8720
|
|
||||||
#endif
|
#endif
|
||||||
|
#if CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL
|
||||||
#ifndef ETH_PHY_POWER
|
ETH_PHY_KSZ8851,
|
||||||
#define ETH_PHY_POWER -1
|
|
||||||
#endif
|
#endif
|
||||||
|
ETH_PHY_MAX
|
||||||
#ifndef ETH_PHY_MDC
|
} eth_phy_type_t;
|
||||||
#define ETH_PHY_MDC 23
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ETH_PHY_MDIO
|
|
||||||
#define ETH_PHY_MDIO 18
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ETH_CLK_MODE
|
|
||||||
#define ETH_CLK_MODE ETH_CLOCK_GPIO0_IN
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ESP_IDF_VERSION_MAJOR > 3
|
|
||||||
typedef enum { ETH_CLOCK_GPIO0_IN, ETH_CLOCK_GPIO0_OUT, ETH_CLOCK_GPIO16_OUT, ETH_CLOCK_GPIO17_OUT } eth_clock_mode_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef enum { ETH_PHY_LAN8720, ETH_PHY_TLK110, ETH_PHY_RTL8201, ETH_PHY_DP83848, ETH_PHY_DM9051, ETH_PHY_KSZ8041, ETH_PHY_KSZ8081, ETH_PHY_MAX } eth_phy_type_t;
|
|
||||||
#define ETH_PHY_IP101 ETH_PHY_TLK110
|
|
||||||
|
|
||||||
class ETHClass {
|
class ETHClass {
|
||||||
private:
|
|
||||||
bool initialized;
|
|
||||||
bool staticIP;
|
|
||||||
#if ESP_IDF_VERSION_MAJOR > 3
|
|
||||||
esp_eth_handle_t eth_handle;
|
|
||||||
esp_netif_t *esp_netif;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
bool _started;
|
|
||||||
int8_t _pin_mcd = -1;
|
|
||||||
int8_t _pin_mdio = -1;
|
|
||||||
int8_t _pin_power = -1;
|
|
||||||
int8_t _pin_rmii_clock = -1;
|
|
||||||
static void eth_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data);
|
|
||||||
#else
|
|
||||||
bool _started;
|
|
||||||
eth_config_t eth_config;
|
|
||||||
#endif
|
|
||||||
public:
|
public:
|
||||||
ETHClass();
|
ETHClass(uint8_t eth_index=0);
|
||||||
~ETHClass();
|
~ETHClass();
|
||||||
|
|
||||||
bool begin(uint8_t phy_addr=ETH_PHY_ADDR, int power=ETH_PHY_POWER, int mdc=ETH_PHY_MDC, int mdio=ETH_PHY_MDIO, eth_phy_type_t type=ETH_PHY_TYPE, eth_clock_mode_t clk_mode=ETH_CLK_MODE, bool use_mac_from_efuse=false);
|
#if CONFIG_ETH_USE_ESP32_EMAC
|
||||||
|
bool begin(eth_phy_type_t type, uint8_t phy_addr, int mdc, int mdio, int power, eth_clock_mode_t clk_mode);
|
||||||
|
#endif /* CONFIG_ETH_USE_ESP32_EMAC */
|
||||||
|
#if ETH_SPI_SUPPORTS_CUSTOM
|
||||||
|
bool begin(eth_phy_type_t type, uint8_t phy_addr, int cs, int irq, int rst, SPIClass &spi, uint8_t spi_freq_mhz=ETH_PHY_SPI_FREQ_MHZ);
|
||||||
|
#endif
|
||||||
|
bool begin(eth_phy_type_t type, uint8_t phy_addr, int cs, int irq, int rst, spi_host_device_t spi_host, int sck=-1, int miso=-1, int mosi=-1, uint8_t spi_freq_mhz=ETH_PHY_SPI_FREQ_MHZ);
|
||||||
|
|
||||||
bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000);
|
bool begin(){
|
||||||
|
#if defined(ETH_PHY_TYPE) && defined(ETH_PHY_ADDR)
|
||||||
|
#if defined(CONFIG_ETH_USE_ESP32_EMAC) && defined(ETH_PHY_POWER) && defined(ETH_PHY_MDC) && defined(ETH_PHY_MDIO) && defined(ETH_CLK_MODE)
|
||||||
|
return begin(ETH_PHY_TYPE, ETH_PHY_ADDR, ETH_PHY_MDC, ETH_PHY_MDIO, ETH_PHY_POWER, ETH_CLK_MODE);
|
||||||
|
#elif defined(ETH_PHY_CS) && defined(ETH_PHY_IRQ) && defined(ETH_PHY_RST)
|
||||||
|
#if ETH_SPI_SUPPORTS_CUSTOM && defined(ETH_PHY_SPI)
|
||||||
|
return begin(ETH_PHY_TYPE, ETH_PHY_ADDR, ETH_PHY_CS, ETH_PHY_IRQ, ETH_PHY_RST, ETH_PHY_SPI, ETH_PHY_SPI_FREQ_MHZ);
|
||||||
|
#elif defined(ETH_PHY_SPI_HOST) && defined(ETH_PHY_SPI_SCK) && defined(ETH_PHY_SPI_MISO) && defined(ETH_PHY_SPI_MOSI)
|
||||||
|
return begin(ETH_PHY_TYPE, ETH_PHY_ADDR, ETH_PHY_CS, ETH_PHY_IRQ, ETH_PHY_RST, ETH_PHY_SPI_HOST, ETH_PHY_SPI_SCK, ETH_PHY_SPI_MISO, ETH_PHY_SPI_MOSI, ETH_PHY_SPI_FREQ_MHZ);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void end();
|
||||||
|
|
||||||
|
// Netif APIs
|
||||||
|
esp_netif_t * netif(void){ return _esp_netif; }
|
||||||
|
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();
|
const char * getHostname();
|
||||||
bool setHostname(const char * hostname);
|
bool setHostname(const char * hostname);
|
||||||
|
|
||||||
bool fullDuplex();
|
|
||||||
bool linkUp();
|
|
||||||
uint8_t linkSpeed();
|
|
||||||
|
|
||||||
bool enableIpV6();
|
|
||||||
IPv6Address localIPv6();
|
|
||||||
|
|
||||||
IPAddress localIP();
|
IPAddress localIP();
|
||||||
IPAddress subnetMask();
|
IPAddress subnetMask();
|
||||||
IPAddress gatewayIP();
|
IPAddress gatewayIP();
|
||||||
IPAddress dnsIP(uint8_t dns_no = 0);
|
IPAddress dnsIP(uint8_t dns_no = 0);
|
||||||
|
|
||||||
IPAddress broadcastIP();
|
IPAddress broadcastIP();
|
||||||
IPAddress networkID();
|
IPAddress networkID();
|
||||||
uint8_t subnetCIDR();
|
uint8_t subnetCIDR();
|
||||||
|
bool enableIpV6();
|
||||||
|
IPv6Address localIPv6();
|
||||||
|
const char * ifkey(void);
|
||||||
|
const char * desc(void);
|
||||||
|
String impl_name(void);
|
||||||
|
|
||||||
|
// Event based getters
|
||||||
|
bool connected();
|
||||||
|
bool hasIP();
|
||||||
|
|
||||||
|
// ETH Handle APIs
|
||||||
uint8_t * macAddress(uint8_t* mac);
|
uint8_t * macAddress(uint8_t* mac);
|
||||||
String macAddress();
|
String macAddress();
|
||||||
|
bool fullDuplex();
|
||||||
|
bool linkUp();
|
||||||
|
uint8_t linkSpeed();
|
||||||
|
bool autoNegotiation();
|
||||||
|
uint32_t phyAddr();
|
||||||
|
|
||||||
void end();
|
// Info APIs
|
||||||
|
void printInfo(Print & out);
|
||||||
|
|
||||||
friend class WiFiClient;
|
friend class WiFiClient;
|
||||||
friend class WiFiServer;
|
friend class WiFiServer;
|
||||||
|
|
||||||
|
#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);
|
||||||
|
static esp_err_t _eth_spi_write(void *ctx, uint32_t cmd, uint32_t addr, const void *data, uint32_t data_len);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
protected:
|
||||||
|
#if ETH_SPI_SUPPORTS_CUSTOM
|
||||||
|
esp_err_t eth_spi_read(uint32_t cmd, uint32_t addr, void *data, uint32_t data_len);
|
||||||
|
esp_err_t eth_spi_write(uint32_t cmd, uint32_t addr, const void *data, uint32_t data_len);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void eth_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool _eth_started;
|
||||||
|
esp_eth_handle_t _eth_handle;
|
||||||
|
esp_netif_t *_esp_netif;
|
||||||
|
uint8_t _eth_index;
|
||||||
|
eth_phy_type_t _phy_type;
|
||||||
|
#if ETH_SPI_SUPPORTS_CUSTOM
|
||||||
|
SPIClass * _spi;
|
||||||
|
#endif
|
||||||
|
uint8_t _spi_freq_mhz;
|
||||||
|
int8_t _pin_cs;
|
||||||
|
int8_t _pin_irq;
|
||||||
|
int8_t _pin_rst;
|
||||||
|
int8_t _pin_sck;
|
||||||
|
int8_t _pin_miso;
|
||||||
|
int8_t _pin_mosi;
|
||||||
|
#if CONFIG_ETH_USE_ESP32_EMAC
|
||||||
|
int8_t _pin_mcd;
|
||||||
|
int8_t _pin_mdio;
|
||||||
|
int8_t _pin_power;
|
||||||
|
int8_t _pin_rmii_clock;
|
||||||
|
#endif /* CONFIG_ETH_USE_ESP32_EMAC */
|
||||||
|
|
||||||
static bool ethDetachBus(void * bus_pointer);
|
static bool ethDetachBus(void * bus_pointer);
|
||||||
|
bool beginSPI(eth_phy_type_t type, uint8_t phy_addr, int cs, int irq, int rst,
|
||||||
|
#if ETH_SPI_SUPPORTS_CUSTOM
|
||||||
|
SPIClass * spi,
|
||||||
|
#endif
|
||||||
|
int sck, int miso, int mosi, spi_host_device_t spi_host, uint8_t spi_freq_mhz);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern ETHClass ETH;
|
extern ETHClass ETH;
|
||||||
|
|
|
||||||
|
|
@ -444,10 +444,13 @@ static void _arduino_event_cb(void* arg, esp_event_base_t event_base, int32_t ev
|
||||||
} else if (event_base == IP_EVENT && event_id == IP_EVENT_ETH_GOT_IP) {
|
} else if (event_base == IP_EVENT && event_id == IP_EVENT_ETH_GOT_IP) {
|
||||||
#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE
|
#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE
|
||||||
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
|
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
|
||||||
log_v("Ethernet got %sip:" IPSTR, event->ip_changed?"new":"", IP2STR(&event->ip_info.ip));
|
log_v("Ethernet got %sip:" IPSTR, event->ip_changed?"new ":"", IP2STR(&event->ip_info.ip));
|
||||||
#endif
|
#endif
|
||||||
arduino_event.event_id = ARDUINO_EVENT_ETH_GOT_IP;
|
arduino_event.event_id = ARDUINO_EVENT_ETH_GOT_IP;
|
||||||
memcpy(&arduino_event.event_info.got_ip, event_data, sizeof(ip_event_got_ip_t));
|
memcpy(&arduino_event.event_info.got_ip, event_data, sizeof(ip_event_got_ip_t));
|
||||||
|
} else if (event_base == ETH_EVENT && event_id == IP_EVENT_ETH_LOST_IP) {
|
||||||
|
log_v("Ethernet Lost IP");
|
||||||
|
arduino_event.event_id = ARDUINO_EVENT_ETH_LOST_IP;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IPv6
|
* IPv6
|
||||||
|
|
@ -870,6 +873,7 @@ const char * WiFiGenericClass::eventName(arduino_event_id_t id) {
|
||||||
case ARDUINO_EVENT_ETH_CONNECTED: return "ETH_CONNECTED";
|
case ARDUINO_EVENT_ETH_CONNECTED: return "ETH_CONNECTED";
|
||||||
case ARDUINO_EVENT_ETH_DISCONNECTED: return "ETH_DISCONNECTED";
|
case ARDUINO_EVENT_ETH_DISCONNECTED: return "ETH_DISCONNECTED";
|
||||||
case ARDUINO_EVENT_ETH_GOT_IP: return "ETH_GOT_IP";
|
case ARDUINO_EVENT_ETH_GOT_IP: return "ETH_GOT_IP";
|
||||||
|
case ARDUINO_EVENT_ETH_LOST_IP: return "ETH_LOST_IP";
|
||||||
case ARDUINO_EVENT_ETH_GOT_IP6: return "ETH_GOT_IP6";
|
case ARDUINO_EVENT_ETH_GOT_IP6: return "ETH_GOT_IP6";
|
||||||
case ARDUINO_EVENT_WPS_ER_SUCCESS: return "WPS_ER_SUCCESS";
|
case ARDUINO_EVENT_WPS_ER_SUCCESS: return "WPS_ER_SUCCESS";
|
||||||
case ARDUINO_EVENT_WPS_ER_FAILED: return "WPS_ER_FAILED";
|
case ARDUINO_EVENT_WPS_ER_FAILED: return "WPS_ER_FAILED";
|
||||||
|
|
@ -1137,6 +1141,8 @@ esp_err_t WiFiGenericClass::_eventCallback(arduino_event_t *event)
|
||||||
gw[0], gw[1], gw[2], gw[3]);
|
gw[0], gw[1], gw[2], gw[3]);
|
||||||
#endif
|
#endif
|
||||||
setStatusBits(ETH_CONNECTED_BIT | ETH_HAS_IP_BIT);
|
setStatusBits(ETH_CONNECTED_BIT | ETH_HAS_IP_BIT);
|
||||||
|
} else if(event->event_id == ARDUINO_EVENT_ETH_LOST_IP) {
|
||||||
|
clearStatusBits(ETH_HAS_IP_BIT);
|
||||||
|
|
||||||
} else if(event->event_id == ARDUINO_EVENT_WIFI_STA_GOT_IP6) {
|
} else if(event->event_id == ARDUINO_EVENT_WIFI_STA_GOT_IP6) {
|
||||||
setStatusBits(STA_CONNECTED_BIT | STA_HAS_IP6_BIT);
|
setStatusBits(STA_CONNECTED_BIT | STA_HAS_IP6_BIT);
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,7 @@ typedef enum {
|
||||||
ARDUINO_EVENT_ETH_CONNECTED,
|
ARDUINO_EVENT_ETH_CONNECTED,
|
||||||
ARDUINO_EVENT_ETH_DISCONNECTED,
|
ARDUINO_EVENT_ETH_DISCONNECTED,
|
||||||
ARDUINO_EVENT_ETH_GOT_IP,
|
ARDUINO_EVENT_ETH_GOT_IP,
|
||||||
|
ARDUINO_EVENT_ETH_LOST_IP,
|
||||||
ARDUINO_EVENT_ETH_GOT_IP6,
|
ARDUINO_EVENT_ETH_GOT_IP6,
|
||||||
ARDUINO_EVENT_WPS_ER_SUCCESS,
|
ARDUINO_EVENT_WPS_ER_SUCCESS,
|
||||||
ARDUINO_EVENT_WPS_ER_FAILED,
|
ARDUINO_EVENT_WPS_ER_FAILED,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue