Add initial support for Ethernet and examples
This commit is contained in:
parent
5c1b10f3bb
commit
3af1710a92
81
libraries/WiFi/examples/ETH_LAN8720/ETH_LAN8720.ino
Normal file
81
libraries/WiFi/examples/ETH_LAN8720/ETH_LAN8720.ino
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
This sketch shows the Ethernet event usage
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ETH.h>
|
||||||
|
|
||||||
|
static bool eth_connected = false;
|
||||||
|
|
||||||
|
void WiFiEvent(WiFiEvent_t event)
|
||||||
|
{
|
||||||
|
switch (event) {
|
||||||
|
case SYSTEM_EVENT_ETH_START:
|
||||||
|
Serial.println("ETH Started");
|
||||||
|
//set eth hostname here
|
||||||
|
ETH.setHostname("esp32-ethernet");
|
||||||
|
break;
|
||||||
|
case SYSTEM_EVENT_ETH_CONNECTED:
|
||||||
|
Serial.println("ETH Connected");
|
||||||
|
break;
|
||||||
|
case SYSTEM_EVENT_ETH_GOT_IP:
|
||||||
|
Serial.print("ETH MAC: ");
|
||||||
|
Serial.print(ETH.macAddress());
|
||||||
|
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;
|
||||||
|
break;
|
||||||
|
case SYSTEM_EVENT_ETH_DISCONNECTED:
|
||||||
|
Serial.println("ETH Disconnected");
|
||||||
|
eth_connected = false;
|
||||||
|
break;
|
||||||
|
case SYSTEM_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(WiFiEvent);
|
||||||
|
ETH.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
if (eth_connected) {
|
||||||
|
testClient("google.com", 80);
|
||||||
|
}
|
||||||
|
delay(10000);
|
||||||
|
}
|
87
libraries/WiFi/examples/ETH_TLK110/ETH_TLK110.ino
Normal file
87
libraries/WiFi/examples/ETH_TLK110/ETH_TLK110.ino
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
This sketch shows the Ethernet event usage
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ETH.h>
|
||||||
|
|
||||||
|
#define ETH_ADDR 31
|
||||||
|
#define ETH_POWER_PIN 17
|
||||||
|
#define ETH_MDC_PIN 23
|
||||||
|
#define ETH_MDIO_PIN 18
|
||||||
|
#define ETH_TYPE ETH_PHY_TLK110
|
||||||
|
|
||||||
|
static bool eth_connected = false;
|
||||||
|
|
||||||
|
void WiFiEvent(WiFiEvent_t event)
|
||||||
|
{
|
||||||
|
switch (event) {
|
||||||
|
case SYSTEM_EVENT_ETH_START:
|
||||||
|
Serial.println("ETH Started");
|
||||||
|
//set eth hostname here
|
||||||
|
ETH.setHostname("esp32-ethernet");
|
||||||
|
break;
|
||||||
|
case SYSTEM_EVENT_ETH_CONNECTED:
|
||||||
|
Serial.println("ETH Connected");
|
||||||
|
break;
|
||||||
|
case SYSTEM_EVENT_ETH_GOT_IP:
|
||||||
|
Serial.print("ETH MAC: ");
|
||||||
|
Serial.print(ETH.macAddress());
|
||||||
|
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;
|
||||||
|
break;
|
||||||
|
case SYSTEM_EVENT_ETH_DISCONNECTED:
|
||||||
|
Serial.println("ETH Disconnected");
|
||||||
|
eth_connected = false;
|
||||||
|
break;
|
||||||
|
case SYSTEM_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(WiFiEvent);
|
||||||
|
ETH.begin(ETH_ADDR, ETH_POWER_PIN, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_TYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
if (eth_connected) {
|
||||||
|
testClient("google.com", 80);
|
||||||
|
}
|
||||||
|
delay(10000);
|
||||||
|
}
|
243
libraries/WiFi/src/ETH.cpp
Normal file
243
libraries/WiFi/src/ETH.cpp
Normal file
@ -0,0 +1,243 @@
|
|||||||
|
/*
|
||||||
|
ETH.h - espre ETH PHY support.
|
||||||
|
Based on WiFi.h from Ardiono WiFi shield library.
|
||||||
|
Copyright (c) 2011-2014 Arduino. All right reserved.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ETH.h"
|
||||||
|
#include "eth_phy/phy.h"
|
||||||
|
#include "eth_phy/phy_tlk110.h"
|
||||||
|
#include "eth_phy/phy_lan8720.h"
|
||||||
|
#include "lwip/err.h"
|
||||||
|
#include "lwip/dns.h"
|
||||||
|
|
||||||
|
extern void tcpipInit();
|
||||||
|
|
||||||
|
static int _eth_phy_mdc_pin = -1;
|
||||||
|
static int _eth_phy_mdio_pin = -1;
|
||||||
|
static int _eth_phy_power_pin = -1;
|
||||||
|
static eth_phy_power_enable_func _eth_phy_power_enable_orig = NULL;
|
||||||
|
|
||||||
|
static void _eth_phy_config_gpio(void)
|
||||||
|
{
|
||||||
|
if(_eth_phy_mdc_pin < 0 || _eth_phy_mdio_pin < 0){
|
||||||
|
log_e("MDC and MDIO pins are not configured!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
phy_rmii_configure_data_interface_pins();
|
||||||
|
phy_rmii_smi_configure_pins(_eth_phy_mdc_pin, _eth_phy_mdio_pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _eth_phy_power_enable(bool enable)
|
||||||
|
{
|
||||||
|
pinMode(_eth_phy_power_pin, OUTPUT);
|
||||||
|
digitalWrite(_eth_phy_power_pin, enable);
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
ETHClass::ETHClass():initialized(false),started(false),staticIP(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ETHClass::~ETHClass()
|
||||||
|
{}
|
||||||
|
|
||||||
|
bool ETHClass::begin(uint8_t phy_addr, int power, int mdc, int mdio, eth_phy_type_t type)
|
||||||
|
{
|
||||||
|
esp_err_t err;
|
||||||
|
if(initialized){
|
||||||
|
err = esp_eth_enable();
|
||||||
|
if(err){
|
||||||
|
log_e("esp_eth_enable error: %d", err);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
started = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
_eth_phy_mdc_pin = mdc;
|
||||||
|
_eth_phy_mdio_pin = mdio;
|
||||||
|
_eth_phy_power_pin = power;
|
||||||
|
|
||||||
|
if(type == ETH_PHY_LAN8720){
|
||||||
|
eth_config_t config = phy_lan8720_default_ethernet_config;
|
||||||
|
memcpy(ð_config, &config, sizeof(eth_config_t));
|
||||||
|
} else if(type == ETH_PHY_TLK110){
|
||||||
|
eth_config_t config = phy_tlk110_default_ethernet_config;
|
||||||
|
memcpy(ð_config, &config, sizeof(eth_config_t));
|
||||||
|
} else {
|
||||||
|
log_e("Bad ETH_PHY type: %u", (uint8_t)type);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
eth_config.phy_addr = (eth_phy_base_t)phy_addr;
|
||||||
|
eth_config.gpio_config = _eth_phy_config_gpio;
|
||||||
|
eth_config.tcpip_input = tcpip_adapter_eth_input;
|
||||||
|
if(_eth_phy_power_pin >= 0){
|
||||||
|
_eth_phy_power_enable_orig = eth_config.phy_power_enable;
|
||||||
|
eth_config.phy_power_enable = _eth_phy_power_enable;
|
||||||
|
}
|
||||||
|
|
||||||
|
tcpipInit();
|
||||||
|
err = esp_eth_init(ð_config);
|
||||||
|
if(!err){
|
||||||
|
initialized = true;
|
||||||
|
err = esp_eth_enable();
|
||||||
|
if(err){
|
||||||
|
log_e("esp_eth_enable error: %d", err);
|
||||||
|
} else {
|
||||||
|
started = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log_e("esp_eth_init error: %d", err);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
bool ETHClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1, IPAddress dns2)
|
||||||
|
{
|
||||||
|
if(!initialized){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
tcpip_adapter_ip_info_t info;
|
||||||
|
info.ip.addr = static_cast<uint32_t>(local_ip);
|
||||||
|
info.gw.addr = static_cast<uint32_t>(gateway);
|
||||||
|
info.netmask.addr = static_cast<uint32_t>(subnet);
|
||||||
|
|
||||||
|
if(!staticIP){
|
||||||
|
tcpip_adapter_dhcpc_stop(TCPIP_ADAPTER_IF_ETH);
|
||||||
|
}
|
||||||
|
if(tcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_ETH, &info) == ESP_OK) {
|
||||||
|
staticIP = true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ip_addr_t d;
|
||||||
|
|
||||||
|
if(dns1 != (uint32_t)0x00000000) {
|
||||||
|
// Set DNS1-Server
|
||||||
|
d.u_addr.ip4.addr = static_cast<uint32_t>(dns1);
|
||||||
|
dns_setserver(0, &d);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dns2 != (uint32_t)0x00000000) {
|
||||||
|
// Set DNS2-Server
|
||||||
|
d.u_addr.ip4.addr = static_cast<uint32_t>(dns2);
|
||||||
|
dns_setserver(1, &d);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
IPAddress ETHClass::localIP()
|
||||||
|
{
|
||||||
|
tcpip_adapter_ip_info_t ip;
|
||||||
|
if(tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_ETH, &ip)){
|
||||||
|
return IPAddress();
|
||||||
|
}
|
||||||
|
return IPAddress(ip.ip.addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
IPAddress ETHClass::subnetMask()
|
||||||
|
{
|
||||||
|
tcpip_adapter_ip_info_t ip;
|
||||||
|
if(tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_ETH, &ip)){
|
||||||
|
return IPAddress();
|
||||||
|
}
|
||||||
|
return IPAddress(ip.netmask.addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
IPAddress ETHClass::gatewayIP()
|
||||||
|
{
|
||||||
|
tcpip_adapter_ip_info_t ip;
|
||||||
|
if(tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_ETH, &ip)){
|
||||||
|
return IPAddress();
|
||||||
|
}
|
||||||
|
return IPAddress(ip.gw.addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
IPAddress ETHClass::dnsIP(uint8_t dns_no)
|
||||||
|
{
|
||||||
|
ip_addr_t dns_ip = dns_getserver(dns_no);
|
||||||
|
return IPAddress(dns_ip.u_addr.ip4.addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char * ETHClass::getHostname()
|
||||||
|
{
|
||||||
|
const char * hostname;
|
||||||
|
if(tcpip_adapter_get_hostname(TCPIP_ADAPTER_IF_ETH, &hostname)){
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return hostname;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ETHClass::setHostname(const char * hostname)
|
||||||
|
{
|
||||||
|
return tcpip_adapter_set_hostname(TCPIP_ADAPTER_IF_ETH, hostname) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ETHClass::fullDuplex()
|
||||||
|
{
|
||||||
|
return eth_config.phy_get_duplex_mode();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ETHClass::linkUp()
|
||||||
|
{
|
||||||
|
return eth_config.phy_check_link();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t ETHClass::linkSpeed()
|
||||||
|
{
|
||||||
|
return eth_config.phy_get_speed_mode()?100:10;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ETHClass::enableIpV6()
|
||||||
|
{
|
||||||
|
return tcpip_adapter_create_ip6_linklocal(TCPIP_ADAPTER_IF_ETH) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
IPv6Address ETHClass::localIPv6()
|
||||||
|
{
|
||||||
|
static ip6_addr_t addr;
|
||||||
|
if(tcpip_adapter_get_ip6_linklocal(TCPIP_ADAPTER_IF_ETH, &addr)){
|
||||||
|
return IPv6Address();
|
||||||
|
}
|
||||||
|
return IPv6Address(addr.addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t * macAddress(uint8_t* mac)
|
||||||
|
{
|
||||||
|
if(!mac){
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
esp_eth_get_mac(mac);
|
||||||
|
return mac;
|
||||||
|
}
|
||||||
|
|
||||||
|
String ETHClass::macAddress(void)
|
||||||
|
{
|
||||||
|
uint8_t mac[6];
|
||||||
|
char macStr[18] = { 0 };
|
||||||
|
esp_eth_get_mac(mac);
|
||||||
|
sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
||||||
|
return String(macStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
ETHClass ETH;
|
88
libraries/WiFi/src/ETH.h
Normal file
88
libraries/WiFi/src/ETH.h
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
ETH.h - espre ETH PHY support.
|
||||||
|
Based on WiFi.h from Ardiono WiFi shield library.
|
||||||
|
Copyright (c) 2011-2014 Arduino. All right reserved.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ETH_H_
|
||||||
|
#define _ETH_H_
|
||||||
|
|
||||||
|
#include "WiFi.h"
|
||||||
|
#include "esp_eth.h"
|
||||||
|
|
||||||
|
#ifndef ETH_PHY_ADDR
|
||||||
|
#define ETH_PHY_ADDR 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ETH_PHY_TYPE
|
||||||
|
#define ETH_PHY_TYPE ETH_PHY_LAN8720
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ETH_PHY_POWER
|
||||||
|
#define ETH_PHY_POWER -1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ETH_PHY_MDC
|
||||||
|
#define ETH_PHY_MDC 23
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ETH_PHY_MDIO
|
||||||
|
#define ETH_PHY_MDIO 18
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef enum { ETH_PHY_LAN8720, ETH_PHY_TLK110, ETH_PHY_MAX} eth_phy_type_t;
|
||||||
|
|
||||||
|
class ETHClass {
|
||||||
|
private:
|
||||||
|
bool initialized;
|
||||||
|
bool started;
|
||||||
|
bool staticIP;
|
||||||
|
eth_config_t eth_config;
|
||||||
|
public:
|
||||||
|
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);
|
||||||
|
|
||||||
|
// NOT WORKING YET!
|
||||||
|
//bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000);
|
||||||
|
|
||||||
|
const char * getHostname();
|
||||||
|
bool setHostname(const char * hostname);
|
||||||
|
|
||||||
|
bool fullDuplex();
|
||||||
|
bool linkUp();
|
||||||
|
uint8_t linkSpeed();
|
||||||
|
|
||||||
|
bool enableIpV6();
|
||||||
|
IPv6Address localIPv6();
|
||||||
|
|
||||||
|
IPAddress localIP();
|
||||||
|
IPAddress subnetMask();
|
||||||
|
IPAddress gatewayIP();
|
||||||
|
IPAddress dnsIP(uint8_t dns_no = 0);
|
||||||
|
|
||||||
|
uint8_t * macAddress(uint8_t* mac);
|
||||||
|
String macAddress();
|
||||||
|
|
||||||
|
friend class WiFiClient;
|
||||||
|
friend class WiFiServer;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern ETHClass ETH;
|
||||||
|
|
||||||
|
#endif /* _ETH_H_ */
|
Loading…
Reference in New Issue
Block a user