add esp_eth component

* Original commit: espressif/esp-idf@90c4827bd2
This commit is contained in:
suda-morris
2019-04-10 16:24:50 +08:00
committed by suren-gabrielyan-espressif
parent 271665e0cb
commit 680bad646f
3 changed files with 63 additions and 215 deletions

View File

@ -3049,13 +3049,13 @@ void _mdns_disable_pcb(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_protoc
/** /**
* @brief Dispatch interface changes based on system events * @brief Dispatch interface changes based on system events
*/ */
static void _mdns_handle_system_event(esp_event_base_t event_base, static void _mdns_handle_system_event(esp_event_base_t event_base,
int32_t event_id, tcpip_adapter_if_t interface) int32_t event_id, tcpip_adapter_if_t interface)
{ {
if (!_mdns_server) { if (!_mdns_server) {
return; return;
} }
tcpip_adapter_dhcp_status_t dcst; tcpip_adapter_dhcp_status_t dcst;
if (event_base == WIFI_EVENT) { if (event_base == WIFI_EVENT) {
switch(event_id) { switch(event_id) {
@ -3723,7 +3723,7 @@ static void _mdns_execute_action(mdns_action_t * action)
switch(action->type) { switch(action->type) {
case ACTION_SYSTEM_EVENT: case ACTION_SYSTEM_EVENT:
_mdns_handle_system_event(action->data.sys_event.event_base, _mdns_handle_system_event(action->data.sys_event.event_base,
action->data.sys_event.event_id, action->data.sys_event.interface); action->data.sys_event.event_id, action->data.sys_event.interface);
break; break;
case ACTION_HOSTNAME_SET: case ACTION_HOSTNAME_SET:
@ -4120,7 +4120,7 @@ esp_err_t mdns_handle_system_event(void *ctx, system_event_t *event)
return ESP_OK; return ESP_OK;
} }
static void event_handler(void* arg, esp_event_base_t event_base, static void event_handler(void* arg, esp_event_base_t event_base,
int32_t event_id, void* event_data) int32_t event_id, void* event_data)
{ {
if (!_mdns_server) { if (!_mdns_server) {
@ -4142,7 +4142,7 @@ static void event_handler(void* arg, esp_event_base_t event_base,
if (xQueueSend(_mdns_server->action_queue, &action, (portTickType)0) != pdPASS) { if (xQueueSend(_mdns_server->action_queue, &action, (portTickType)0) != pdPASS) {
free(action); free(action);
} }
} }
esp_err_t mdns_init() esp_err_t mdns_init()

View File

@ -30,119 +30,39 @@ menu "Example Connection Configuration"
WiFi password (WPA or WPA2) for the example to use. WiFi password (WPA or WPA2) for the example to use.
Can be left blank if the network has no security set. Can be left blank if the network has no security set.
choice EXAMPLE_ETH_PHY_MODEL
choice EXAMPLE_PHY_MODEL
prompt "Ethernet PHY"
depends on EXAMPLE_CONNECT_ETHERNET depends on EXAMPLE_CONNECT_ETHERNET
default EXAMPLE_PHY_TLK110 prompt "Ethernet PHY Device"
default EXAMPLE_ETH_PHY_IP101
help help
Select the PHY driver to use for the example. Select the PHY driver to use for the example.
config EXAMPLE_PHY_IP101 config EXAMPLE_ETH_PHY_IP101
bool "IP101" bool "IP101"
help help
IP101 is a single port 10/100 MII/RMII/TP/Fiber Fast Ethernet Transceiver. IP101 is a single port 10/100 MII/RMII/TP/Fiber Fast Ethernet Transceiver.
Goto http://www.icplus.com.tw/pp-IP101G.html for more information about it. Goto http://www.icplus.com.tw/pp-IP101G.html for more information about it.
config EXAMPLE_PHY_TLK110 config EXAMPLE_ETH_PHY_RTL8201
bool "TI TLK110 PHY" bool "RTL8201/SR8201"
help help
Select this to use the TI TLK110 PHY RTL8201F/SR8201F is a single port 10/100Mb Ethernet Transceiver with auto MDIX.
Goto http://www.corechip-sz.com/productsview.asp?id=22 for more information about it.
config EXAMPLE_PHY_LAN8720 config EXAMPLE_ETH_PHY_LAN8720
bool "Microchip LAN8720 PHY" bool "LAN8720"
help help
Select this to use the Microchip LAN8720 PHY LAN8720A is a small footprint RMII 10/100 Ethernet Transceiver with HP Auto-MDIX Support.
Goto https://www.microchip.com/LAN8720A for more information about it.
config EXAMPLE_ETH_PHY_DP83848
bool "DP83848"
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 endchoice
config EXAMPLE_PHY_ADDRESS
int "PHY Address (0-31)"
depends on EXAMPLE_CONNECT_ETHERNET
default 31
range 0 31
help
Select the PHY Address (0-31) for the hardware configuration and PHY model.
TLK110 default 31
LAN8720 default 1 or 0
choice EXAMPLE_PHY_CLOCK_MODE
prompt "EMAC clock mode"
depends on EXAMPLE_CONNECT_ETHERNET
default EXAMPLE_PHY_CLOCK_GPIO0_IN
help
Select external (input on GPIO0) or internal (output on GPIO16 or GPIO17) clock
config EXAMPLE_PHY_CLOCK_GPIO0_IN
bool "GPIO0 input"
depends on EXAMPLE_CONNECT_ETHERNET
help
Input of 50MHz PHY clock on GPIO0.
config EXAMPLE_PHY_CLOCK_GPIO0_OUT
bool "GPIO0 Output"
help
Output the internal 50MHz RMII clock on GPIO0.
config EXAMPLE_PHY_CLOCK_GPIO16_OUT
bool "GPIO16 output"
depends on EXAMPLE_CONNECT_ETHERNET
help
Output the internal 50MHz APLL clock on GPIO16.
config EXAMPLE_PHY_CLOCK_GPIO17_OUT
bool "GPIO17 output (inverted)"
depends on EXAMPLE_CONNECT_ETHERNET
help
Output the internal 50MHz APLL clock on GPIO17 (inverted signal).
endchoice
config EXAMPLE_PHY_CLOCK_MODE
int
depends on EXAMPLE_CONNECT_ETHERNET
default 0 if EXAMPLE_PHY_CLOCK_GPIO0_IN
default 1 if EXAMPLE_PHY_CLOCK_GPIO0_OUT
default 2 if EXAMPLE_PHY_CLOCK_GPIO16_OUT
default 3 if EXAMPLE_PHY_CLOCK_GPIO17_OUT
config EXAMPLE_PHY_USE_POWER_PIN
bool "Use PHY Power (enable/disable) pin"
depends on EXAMPLE_CONNECT_ETHERNET
default y
help
Use a GPIO "power pin" to power the PHY on/off during operation.
Consult the example README for more details
config EXAMPLE_PHY_POWER_PIN
int "PHY Power GPIO"
depends on EXAMPLE_CONNECT_ETHERNET
default 17
range 0 33
depends on EXAMPLE_PHY_USE_POWER_PIN
help
GPIO number to use for powering on/off the PHY.
config EXAMPLE_PHY_SMI_MDC_PIN
int "SMI MDC Pin"
depends on EXAMPLE_CONNECT_ETHERNET
default 23
range 0 33
help
GPIO number to use for SMI clock output MDC to PHY.
config EXAMPLE_PHY_SMI_MDIO_PIN
int "SMI MDIO Pin"
depends on EXAMPLE_CONNECT_ETHERNET
default 18
range 0 33
help
GPIO number to use for SMI data pin MDIO to/from PHY.
config EXAMPLE_CONNECT_IPV6 config EXAMPLE_CONNECT_IPV6
bool "Obtain IPv6 link-local address" bool "Obtain IPv6 link-local address"
default y default y

View File

@ -21,24 +21,23 @@
#include "lwip/err.h" #include "lwip/err.h"
#include "lwip/sys.h" #include "lwip/sys.h"
#define GOT_IPV4_BIT BIT(0) #define GOT_IPV4_BIT BIT(0)
#define GOT_IPV6_BIT BIT(1) #define GOT_IPV6_BIT BIT(1)
#ifdef CONFIG_EXAMPLE_CONNECT_IPV6 #ifdef CONFIG_EXAMPLE_CONNECT_IPV6
#define CONNECTED_BITS (GOT_IPV4_BIT | GOT_IPV6_BIT) #define CONNECTED_BITS (GOT_IPV4_BIT | GOT_IPV6_BIT)
#else #else
#define CONNECTED_BITS (GOT_IPV4_BIT) #define CONNECTED_BITS (GOT_IPV4_BIT)
#endif #endif
static EventGroupHandle_t s_connect_event_group; static EventGroupHandle_t s_connect_event_group;
static ip4_addr_t s_ip_addr; static ip4_addr_t s_ip_addr;
static const char* s_connection_name; static const char *s_connection_name;
#ifdef CONFIG_EXAMPLE_CONNECT_IPV6 #ifdef CONFIG_EXAMPLE_CONNECT_IPV6
static ip6_addr_t s_ipv6_addr; static ip6_addr_t s_ipv6_addr;
#endif #endif
static const char *TAG = "example_connect"; static const char *TAG = "example_connect";
/* set up connection, Wi-Fi or Ethernet */ /* set up connection, Wi-Fi or Ethernet */
@ -47,20 +46,20 @@ static void start();
/* tear down connection, release resources */ /* tear down connection, release resources */
static void stop(); static void stop();
static void on_got_ip(void* arg, esp_event_base_t event_base, static void on_got_ip(void *arg, esp_event_base_t event_base,
int32_t event_id, void* event_data) int32_t event_id, void *event_data)
{ {
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;
memcpy(&s_ip_addr, &event->ip_info.ip, sizeof(s_ip_addr)); memcpy(&s_ip_addr, &event->ip_info.ip, sizeof(s_ip_addr));
xEventGroupSetBits(s_connect_event_group, GOT_IPV4_BIT); xEventGroupSetBits(s_connect_event_group, GOT_IPV4_BIT);
} }
#ifdef CONFIG_EXAMPLE_CONNECT_IPV6 #ifdef CONFIG_EXAMPLE_CONNECT_IPV6
static void on_got_ipv6(void* arg, esp_event_base_t event_base, static void on_got_ipv6(void *arg, esp_event_base_t event_base,
int32_t event_id, void* event_data) int32_t event_id, void *event_data)
{ {
ip_event_got_ip6_t* event = (ip_event_got_ip6_t*) event_data; ip_event_got_ip6_t *event = (ip_event_got_ip6_t *)event_data;
memcpy(&s_ipv6_addr, &event->ip6_info.ip, sizeof(s_ipv6_addr)); memcpy(&s_ipv6_addr, &event->ip6_info.ip, sizeof(s_ipv6_addr));
xEventGroupSetBits(s_connect_event_group, GOT_IPV6_BIT); xEventGroupSetBits(s_connect_event_group, GOT_IPV6_BIT);
} }
@ -98,17 +97,17 @@ esp_err_t example_disconnect()
#ifdef CONFIG_EXAMPLE_CONNECT_WIFI #ifdef CONFIG_EXAMPLE_CONNECT_WIFI
static void on_wifi_disconnect(void* arg, esp_event_base_t event_base, static void on_wifi_disconnect(void *arg, esp_event_base_t event_base,
int32_t event_id, void* event_data) int32_t event_id, void *event_data)
{ {
ESP_LOGI(TAG, "Wi-Fi disconnected, trying to reconnect..."); ESP_LOGI(TAG, "Wi-Fi disconnected, trying to reconnect...");
ESP_ERROR_CHECK( esp_wifi_connect() ); ESP_ERROR_CHECK(esp_wifi_connect());
} }
#ifdef CONFIG_EXAMPLE_CONNECT_IPV6 #ifdef CONFIG_EXAMPLE_CONNECT_IPV6
static void on_wifi_connect(void* arg, esp_event_base_t event_base, static void on_wifi_connect(void *arg, esp_event_base_t event_base,
int32_t event_id, void* event_data) int32_t event_id, void *event_data)
{ {
tcpip_adapter_create_ip6_linklocal(TCPIP_ADAPTER_IF_STA); tcpip_adapter_create_ip6_linklocal(TCPIP_ADAPTER_IF_STA);
} }
@ -155,87 +154,13 @@ static void stop()
} }
#endif // CONFIG_EXAMPLE_CONNECT_WIFI #endif // CONFIG_EXAMPLE_CONNECT_WIFI
#ifdef CONFIG_EXAMPLE_CONNECT_ETHERNET #ifdef CONFIG_EXAMPLE_CONNECT_ETHERNET
#include "driver/gpio.h"
#ifdef CONFIG_EXAMPLE_PHY_LAN8720
#include "eth_phy/phy_lan8720.h"
#define DEFAULT_ETHERNET_PHY_CONFIG phy_lan8720_default_ethernet_config
#endif
#ifdef CONFIG_EXAMPLE_PHY_TLK110
#include "eth_phy/phy_tlk110.h"
#define DEFAULT_ETHERNET_PHY_CONFIG phy_tlk110_default_ethernet_config
#elif CONFIG_EXAMPLE_PHY_IP101
#include "eth_phy/phy_ip101.h"
#define DEFAULT_ETHERNET_PHY_CONFIG phy_ip101_default_ethernet_config
#endif
#define PIN_PHY_POWER CONFIG_EXAMPLE_PHY_POWER_PIN
#define PIN_SMI_MDC CONFIG_EXAMPLE_PHY_SMI_MDC_PIN
#define PIN_SMI_MDIO CONFIG_EXAMPLE_PHY_SMI_MDIO_PIN
#ifdef CONFIG_EXAMPLE_PHY_USE_POWER_PIN
/**
* @brief re-define power enable func for phy
*
* @param enable true to enable, false to disable
*
* @note This function replaces the default PHY power on/off function.
* If this GPIO is not connected on your device (and PHY is always powered),
* you can use the default PHY-specific power on/off function.
*/
static void phy_device_power_enable_via_gpio(bool enable)
{
assert(DEFAULT_ETHERNET_PHY_CONFIG.phy_power_enable);
if (!enable) {
DEFAULT_ETHERNET_PHY_CONFIG.phy_power_enable(false);
}
gpio_pad_select_gpio(PIN_PHY_POWER);
gpio_set_direction(PIN_PHY_POWER, GPIO_MODE_OUTPUT);
if (enable == true) {
gpio_set_level(PIN_PHY_POWER, 1);
ESP_LOGI(TAG, "Power On Ethernet PHY");
} else {
gpio_set_level(PIN_PHY_POWER, 0);
ESP_LOGI(TAG, "Power Off Ethernet PHY");
}
vTaskDelay(1); // Allow the power up/down to take effect, min 300us
if (enable) {
/* call the default PHY-specific power on function */
DEFAULT_ETHERNET_PHY_CONFIG.phy_power_enable(true);
}
}
#endif
/**
* @brief gpio specific init
*
* @note RMII data pins are fixed in esp32:
* TXD0 <=> GPIO19
* TXD1 <=> GPIO22
* TX_EN <=> GPIO21
* RXD0 <=> GPIO25
* RXD1 <=> GPIO26
* CLK <=> GPIO0
*
*/
static void eth_gpio_config_rmii(void)
{
phy_rmii_configure_data_interface_pins();
phy_rmii_smi_configure_pins(PIN_SMI_MDC, PIN_SMI_MDIO);
}
#ifdef CONFIG_EXAMPLE_CONNECT_IPV6 #ifdef CONFIG_EXAMPLE_CONNECT_IPV6
/** Event handler for Ethernet events */ /** Event handler for Ethernet events */
static void on_eth_event(void* arg, esp_event_base_t event_base, static void on_eth_event(void *arg, esp_event_base_t event_base,
int32_t event_id, void* event_data) int32_t event_id, void *event_data)
{ {
switch (event_id) { switch (event_id) {
case ETHERNET_EVENT_CONNECTED: case ETHERNET_EVENT_CONNECTED:
@ -249,30 +174,33 @@ static void on_eth_event(void* arg, esp_event_base_t event_base,
#endif // CONFIG_EXAMPLE_CONNECT_IPV6 #endif // CONFIG_EXAMPLE_CONNECT_IPV6
static esp_eth_handle_t s_eth_handle = NULL;
static esp_eth_mac_t *s_mac = NULL;
static esp_eth_phy_t *s_phy = NULL;
static void start() static void start()
{ {
eth_config_t config = DEFAULT_ETHERNET_PHY_CONFIG; ESP_ERROR_CHECK(tcpip_adapter_set_default_eth_handlers());
config.phy_addr = CONFIG_EXAMPLE_PHY_ADDRESS;
config.gpio_config = eth_gpio_config_rmii;
config.tcpip_input = tcpip_adapter_eth_input;
config.clock_mode = CONFIG_EXAMPLE_PHY_CLOCK_MODE;
#ifdef CONFIG_EXAMPLE_PHY_USE_POWER_PIN
/* Replace the default 'power enable' function with an example-specific one
that toggles a power GPIO. */
config.phy_power_enable = phy_device_power_enable_via_gpio;
#endif
ESP_ERROR_CHECK(esp_eth_init(&config));
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_ETH_GOT_IP, &on_got_ip, NULL)); ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_ETH_GOT_IP, &on_got_ip, NULL));
#ifdef CONFIG_EXAMPLE_CONNECT_IPV6 #ifdef CONFIG_EXAMPLE_CONNECT_IPV6
ESP_ERROR_CHECK(esp_event_handler_register(ETH_EVENT, ETHERNET_EVENT_CONNECTED, &on_eth_event, NULL)); ESP_ERROR_CHECK(esp_event_handler_register(ETH_EVENT, ETHERNET_EVENT_CONNECTED, &on_eth_event, NULL));
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_GOT_IP6, &on_got_ipv6, NULL)); ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_GOT_IP6, &on_got_ipv6, NULL));
#endif #endif
eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG();
s_mac = esp_eth_mac_new_esp32(&mac_config);
eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG();
#if CONFIG_EXAMPLE_ETH_PHY_IP101
s_phy = esp_eth_phy_new_ip101(&phy_config);
#elif CONFIG_EXAMPLE_ETH_PHY_RTL8201
s_phy = esp_eth_phy_new_rtl8201(&phy_config);
#elif CONFIG_EXAMPLE_ETH_PHY_LAN8720
s_phy = esp_eth_phy_new_lan8720(&phy_config);
#elif CONFIG_EXAMPLE_ETH_PHY_DP83848
s_phy = esp_eth_phy_new_dp83848(&phy_config);
#endif
esp_eth_config_t config = ETH_DEFAULT_CONFIG(s_mac, s_phy);
ESP_ERROR_CHECK(esp_eth_enable()); ESP_ERROR_CHECK(esp_eth_driver_install(&config, &s_eth_handle));
s_connection_name = "Ethernet"; s_connection_name = "Ethernet";
} }
@ -283,9 +211,9 @@ static void stop()
ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_GOT_IP6, &on_got_ipv6)); ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_GOT_IP6, &on_got_ipv6));
ESP_ERROR_CHECK(esp_event_handler_unregister(ETH_EVENT, ETHERNET_EVENT_CONNECTED, &on_eth_event)); ESP_ERROR_CHECK(esp_event_handler_unregister(ETH_EVENT, ETHERNET_EVENT_CONNECTED, &on_eth_event));
#endif #endif
ESP_ERROR_CHECK(esp_eth_driver_uninstall(s_eth_handle));
ESP_ERROR_CHECK(esp_eth_disable()); ESP_ERROR_CHECK(s_phy->del(s_phy));
ESP_ERROR_CHECK(esp_eth_deinit()); ESP_ERROR_CHECK(s_mac->del(s_mac));
} }
#endif // CONFIG_EXAMPLE_CONNECT_ETHERNET #endif // CONFIG_EXAMPLE_CONNECT_ETHERNET