1
6
16
17
18
19
20
21
22
23
24
25
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
54
55
56
57
58
59
60
61
62
63
71
72
76
77
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
106
107
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
147
148
149
150
151
152
153
154
155
156
158
159
161
162
163
164
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
185
186
188
189
191
192
194
195
197
198
200
201
202
203
204
205
206
207
208
209
210
213
216
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
245
246
247
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
278
279
280
281
282
283
284
285
286
287
288
289
295
297
298
304
305
311
312
318
319
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
351
352
353
356
357
358
359
360
363
366
369
370
371
372
373
374
375
376
377
378
379
380
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
413
414
415
416
418
419
420
421
422
423
429
430
431
432
433
434
435
436
438
439
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
477
478
479
480
481
482
483
499
500
501
503
504
505
506
509
510
511
512
519
520
521
522
523
528
529
530
/* ... */
#include <stdio.h>
#include <unistd.h>
#include "ethernet_init.h"
#include "esp_log.h"
#include "esp_event.h"
#include "esp_check.h"
#include "esp_mac.h"
#include "driver/gpio.h"
#include "esp_idf_version.h"
#include "sdkconfig.h"10 includes
#if CONFIG_ETH_USE_SPI_ETHERNET
#include "driver/spi_master.h"
#endif
#if CONFIG_ETHERNET_PHY_LAN867X
#include "esp_eth_phy_lan867x.h"
#endif
#if CONFIG_ETHERNET_USE_CH390
#include "esp_eth_mac_ch390.h"
#include "esp_eth_phy_ch390.h"/* ... */
#endif
#if CONFIG_ETHERNET_USE_ENC28J60
#include "esp_eth_enc28j60.h"
#endif
#if CONFIG_ETHERNET_SPI_NUMBER
#define SPI_ETHERNETS_NUM CONFIG_ETHERNET_SPI_NUMBER
#else
#define SPI_ETHERNETS_NUM 0
#endif
#if CONFIG_ETHERNET_INTERNAL_SUPPORT
#define INTERNAL_ETHERNETS_NUM 1
#else
#define INTERNAL_ETHERNETS_NUM 0
#endif
#define INIT_SPI_ETH_MODULE_CONFIG(eth_module_config, num) \
do { \
eth_module_config[num].spi_cs_gpio = CONFIG_ETHERNET_SPI_CS ##num## _GPIO; \
eth_module_config[num].int_gpio = CONFIG_ETHERNET_SPI_INT ##num## _GPIO; \
eth_module_config[num].poll_period_ms = CONFIG_ETHERNET_SPI_POLLING ##num## _MS; \
eth_module_config[num].phy_reset_gpio = CONFIG_ETHERNET_SPI_PHY_RST ##num## _GPIO; \
eth_module_config[num].phy_addr = CONFIG_ETHERNET_SPI_PHY_ADDR ##num; \
}{...} while(0)...
#if !defined(CONFIG_ETHERNET_INTERNAL_SUPPORT)
#define CONFIG_ETHERNET_INTERNAL_SUPPORT 0
#endif
#if !defined(CONFIG_ETHERNET_SPI_NUMBER)
#define CONFIG_ETHERNET_SPI_NUMBER 0
#endif
typedef struct {
uint8_t spi_cs_gpio;
int8_t int_gpio;
uint32_t poll_period_ms;
int8_t phy_reset_gpio;
uint8_t phy_addr;
uint8_t *mac_addr;
}{ ... } spi_eth_module_config_t;
typedef enum {
DEV_STATE_UNINITIALIZED,
DEV_STATE_INITIALIZED,
}{ ... } dev_state;
typedef struct {
esp_eth_handle_t eth_handle;
esp_eth_mac_t *mac;
esp_eth_phy_t *phy;
dev_state state;
eth_dev_info_t dev_info;
}{ ... } eth_device;
static const char *TAG = "ethernet_init";
static uint8_t eth_cnt_g = 0;
static eth_device eth_instance_g[CONFIG_ETHERNET_INTERNAL_SUPPORT + CONFIG_ETHERNET_SPI_NUMBER];
static void eth_event_handler(void *arg, esp_event_base_t event_base,
int32_t event_id, void *event_data)
{
uint8_t pin1 = 0, pin2 = 0;
uint8_t mac_addr[ETH_ADDR_LEN] = {0};
esp_eth_handle_t eth_handle = *(esp_eth_handle_t *)event_data;
eth_dev_info_t dev_info = ethernet_init_get_dev_info(eth_handle);
if (dev_info.type == ETH_DEV_TYPE_INTERNAL_ETH) {
pin1 = dev_info.pin.eth_internal_mdc;
pin2 = dev_info.pin.eth_internal_mdio;
}{...} else if (dev_info.type == ETH_DEV_TYPE_SPI) {
pin1 = dev_info.pin.eth_spi_cs;
pin2 = dev_info.pin.eth_spi_int;
}{...}
switch (event_id) {
case ETHERNET_EVENT_CONNECTED:
esp_eth_ioctl(eth_handle, ETH_CMD_G_MAC_ADDR, mac_addr);
ESP_LOGI(TAG, "Ethernet(%s[%d,%d]) Link Up", dev_info.name, pin1, pin2);
ESP_LOGI(TAG, "Ethernet(%s[%d,%d]) HW Addr %02x:%02x:%02x:%02x:%02x:%02x", dev_info.name, pin1, pin2,
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
break;...
case ETHERNET_EVENT_DISCONNECTED:
ESP_LOGI(TAG, "Ethernet(%s[%d,%d]) Link Down", dev_info.name, pin1, pin2);
break;...
case ETHERNET_EVENT_START:
ESP_LOGI(TAG, "Ethernet(%s[%d,%d]) Started", dev_info.name, pin1, pin2);
break;...
case ETHERNET_EVENT_STOP:
ESP_LOGI(TAG, "Ethernet(%s[%d,%d]) Stopped", dev_info.name, pin1, pin2);
break;...
default:
ESP_LOGI(TAG, "Default Event");
break;...
}{...}
}{ ... }
#if CONFIG_ETHERNET_INTERNAL_SUPPORT
/* ... */
static esp_eth_handle_t eth_init_internal(eth_device *dev_out)
{
esp_eth_handle_t ret = NULL;
if (dev_out == NULL) {
ESP_LOGE(TAG, "eth_device NULL");
return ret;
}{...}
eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG();
mac_config.rx_task_stack_size = CONFIG_ETHERNET_RX_TASK_STACK_SIZE;
eth_esp32_emac_config_t esp32_emac_config = ETH_ESP32_EMAC_DEFAULT_CONFIG();
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)
esp32_emac_config.smi_gpio.mdc_num = CONFIG_ETHERNET_MDC_GPIO;
esp32_emac_config.smi_gpio.mdio_num = CONFIG_ETHERNET_MDIO_GPIO;/* ... */
#else
esp32_emac_config.smi_mdc_gpio_num = CONFIG_ETHERNET_MDC_GPIO;
esp32_emac_config.smi_mdio_gpio_num = CONFIG_ETHERNET_MDIO_GPIO;/* ... */
#endif
#if CONFIG_ETHERNET_SPI_SUPPORT
esp32_emac_config.dma_burst_len = ETH_DMA_BURST_LEN_4;/* ... */
#endif
dev_out->mac = esp_eth_mac_new_esp32(&esp32_emac_config, &mac_config);
eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG();
phy_config.phy_addr = CONFIG_ETHERNET_PHY_ADDR;
phy_config.reset_gpio_num = CONFIG_ETHERNET_PHY_RST_GPIO;
#if CONFIG_ETHERNET_PHY_GENERIC
dev_out->phy = esp_eth_phy_new_generic(&phy_config);
#elif CONFIG_ETHERNET_PHY_IP101
dev_out->phy = esp_eth_phy_new_ip101(&phy_config);
sprintf(dev_out->dev_info.name, "IP101");/* ... */
#elif CONFIG_ETHERNET_PHY_RTL8201
dev_out->phy = esp_eth_phy_new_rtl8201(&phy_config);
sprintf(dev_out->dev_info.name, "RTL8201");/* ... */
#elif CONFIG_ETHERNET_PHY_LAN87XX
dev_out->phy = esp_eth_phy_new_lan87xx(&phy_config);
sprintf(dev_out->dev_info.name, "LAN87XX");/* ... */
#elif CONFIG_ETHERNET_PHY_DP83848
dev_out->phy = esp_eth_phy_new_dp83848(&phy_config);
sprintf(dev_out->dev_info.name, "DP83848");/* ... */
#elif CONFIG_ETHERNET_PHY_KSZ80XX
dev_out->phy = esp_eth_phy_new_ksz80xx(&phy_config);
sprintf(dev_out->dev_info.name, "KSZ80XX");/* ... */
#elif CONFIG_ETHERNET_PHY_LAN867X
dev_out->phy = esp_eth_phy_new_lan867x(&phy_config);
sprintf(dev_out->dev_info.name, "LAN867x");/* ... */
#endif
esp_eth_handle_t eth_handle = NULL;
esp_eth_config_t config = ETH_DEFAULT_CONFIG(dev_out->mac, dev_out->phy);
ESP_GOTO_ON_FALSE(esp_eth_driver_install(&config, ð_handle) == ESP_OK, NULL,
err, TAG, "Ethernet driver install failed");
return eth_handle;
err:
if (eth_handle != NULL) {
esp_eth_driver_uninstall(eth_handle);
}{...}
if (dev_out->mac != NULL) {
dev_out->mac->del(dev_out->mac);
}{...}
if (dev_out->phy != NULL) {
dev_out->phy->del(dev_out->phy);
}{...}
return ret;
}{...}
/* ... */#endif
#if CONFIG_ETHERNET_SPI_SUPPORT
/* ... */
static esp_err_t spi_bus_init(void)
{
esp_err_t ret = ESP_OK;
ret = gpio_install_isr_service(0);
if (ret != ESP_OK) {
if (ret == ESP_ERR_INVALID_STATE) {
ESP_LOGW(TAG, "GPIO ISR handler has been already installed");
ret = ESP_OK;
}{...} else {
ESP_LOGE(TAG, "GPIO ISR handler install failed");
goto err;
}{...}
}{...}
spi_bus_config_t buscfg = {
.miso_io_num = CONFIG_ETHERNET_SPI_MISO_GPIO,
.mosi_io_num = CONFIG_ETHERNET_SPI_MOSI_GPIO,
.sclk_io_num = CONFIG_ETHERNET_SPI_SCLK_GPIO,
.quadwp_io_num = -1,
.quadhd_io_num = -1,
}{...};
ESP_GOTO_ON_ERROR(spi_bus_initialize(CONFIG_ETHERNET_SPI_HOST, &buscfg, SPI_DMA_CH_AUTO),
err, TAG, "SPI host #%d init failed", CONFIG_ETHERNET_SPI_HOST);
err:
return ret;
}{...}
/* ... */
static esp_eth_handle_t eth_init_spi(spi_eth_module_config_t *spi_eth_module_config, eth_device *dev_out)
{
esp_eth_handle_t ret = NULL;
if (dev_out == NULL) {
ESP_LOGE(TAG, "eth_device NULL");
return ret;
}{...}
eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG();
mac_config.rx_task_stack_size = CONFIG_ETHERNET_RX_TASK_STACK_SIZE;
eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG();
phy_config.phy_addr = spi_eth_module_config->phy_addr;
phy_config.reset_gpio_num = spi_eth_module_config->phy_reset_gpio;
spi_device_interface_config_t spi_devcfg = {
.mode = 0,
.clock_speed_hz = CONFIG_ETHERNET_SPI_CLOCK_MHZ * 1000 * 1000,
.queue_size = 20,
.spics_io_num = spi_eth_module_config->spi_cs_gpio
}{...};
/* ... */
#if CONFIG_ETHERNET_USE_KSZ8851SNL
eth_ksz8851snl_config_t ksz8851snl_config = ETH_KSZ8851SNL_DEFAULT_CONFIG(CONFIG_ETHERNET_SPI_HOST, &spi_devcfg);
ksz8851snl_config.int_gpio_num = spi_eth_module_config->int_gpio;
ksz8851snl_config.poll_period_ms = spi_eth_module_config->poll_period_ms;
dev_out->mac = esp_eth_mac_new_ksz8851snl(&ksz8851snl_config, &mac_config);
dev_out->phy = esp_eth_phy_new_ksz8851snl(&phy_config);
sprintf(dev_out->dev_info.name, "KSZ8851SNL");/* ... */
#elif CONFIG_ETHERNET_USE_DM9051
eth_dm9051_config_t dm9051_config = ETH_DM9051_DEFAULT_CONFIG(CONFIG_ETHERNET_SPI_HOST, &spi_devcfg);
dm9051_config.int_gpio_num = spi_eth_module_config->int_gpio;
dm9051_config.poll_period_ms = spi_eth_module_config->poll_period_ms;
dev_out->mac = esp_eth_mac_new_dm9051(&dm9051_config, &mac_config);
dev_out->phy = esp_eth_phy_new_dm9051(&phy_config);
sprintf(dev_out->dev_info.name, "DM9051");/* ... */
#elif CONFIG_ETHERNET_USE_W5500
eth_w5500_config_t w5500_config = ETH_W5500_DEFAULT_CONFIG(CONFIG_ETHERNET_SPI_HOST, &spi_devcfg);
w5500_config.int_gpio_num = spi_eth_module_config->int_gpio;
w5500_config.poll_period_ms = spi_eth_module_config->poll_period_ms;
dev_out->mac = esp_eth_mac_new_w5500(&w5500_config, &mac_config);
dev_out->phy = esp_eth_phy_new_w5500(&phy_config);
sprintf(dev_out->dev_info.name, "W5500");/* ... */
#elif CONFIG_ETHERNET_USE_CH390
eth_ch390_config_t ch390_config = ETH_CH390_DEFAULT_CONFIG(CONFIG_ETHERNET_SPI_HOST, &spi_devcfg);
ch390_config.int_gpio_num = spi_eth_module_config->int_gpio;
ch390_config.poll_period_ms = spi_eth_module_config->poll_period_ms;
dev_out->mac = esp_eth_mac_new_ch390(&ch390_config, &mac_config);
dev_out->phy = esp_eth_phy_new_ch390(&phy_config);
sprintf(dev_out->dev_info.name, "CH390");/* ... */
#elif CONFIG_ETHERNET_USE_ENC28J60
spi_devcfg.cs_ena_posttrans = enc28j60_cal_spi_cs_hold_time(CONFIG_ETHERNET_SPI_CLOCK_MHZ);
eth_enc28j60_config_t enc28j60_config = ETH_ENC28J60_DEFAULT_CONFIG(CONFIG_ETHERNET_SPI_HOST, &spi_devcfg);
enc28j60_config.int_gpio_num = spi_eth_module_config->int_gpio;
dev_out->mac = esp_eth_mac_new_enc28j60(&enc28j60_config, &mac_config);
ESP_GOTO_ON_FALSE(dev_out->mac, NULL, err, TAG, "creation of ENC28J60 MAC instance failed");
ESP_GOTO_ON_FALSE(emac_enc28j60_get_chip_info(dev_out->mac) >= ENC28J60_REV_B5 || CONFIG_ETHERNET_SPI_CLOCK_MHZ >= 8,
NULL, err, TAG, "SPI frequency must be at least 8 MHz for chip revision less than 5");
phy_config.autonego_timeout_ms = 0;
phy_config.reset_gpio_num = -1;
dev_out->phy = esp_eth_phy_new_enc28j60(&phy_config);
sprintf(dev_out->dev_info.name, "ENC28J60");/* ... */
#endif
esp_eth_handle_t eth_handle = NULL;
esp_eth_config_t eth_config_spi = ETH_DEFAULT_CONFIG(dev_out->mac, dev_out->phy);
ESP_GOTO_ON_FALSE(esp_eth_driver_install(ð_config_spi, ð_handle) == ESP_OK, NULL, err, TAG, "SPI Ethernet driver install failed");
if (spi_eth_module_config->mac_addr != NULL) {
ESP_GOTO_ON_FALSE(esp_eth_ioctl(eth_handle, ETH_CMD_S_MAC_ADDR, spi_eth_module_config->mac_addr) == ESP_OK,
NULL, err, TAG, "SPI Ethernet MAC address config failed");
}{...}
#if CONFIG_ETHERNET_ENC28J60_DUPLEX_FULL
eth_duplex_t duplex = ETH_DUPLEX_FULL;
ESP_ERROR_CHECK(esp_eth_ioctl(eth_handle, ETH_CMD_S_DUPLEX_MODE, &duplex));/* ... */
#endif
return eth_handle;
err:
if (eth_handle != NULL) {
esp_eth_driver_uninstall(eth_handle);
}{...}
if (dev_out->mac != NULL) {
dev_out->mac->del(dev_out->mac);
}{...}
if (dev_out->phy != NULL) {
dev_out->phy->del(dev_out->phy);
}{...}
return ret;
}{...}
/* ... */#endif
esp_err_t ethernet_init_all(esp_eth_handle_t *eth_handles_out[], uint8_t *eth_cnt_out)
{
esp_err_t ret = ESP_OK;
esp_eth_handle_t *eth_handles = NULL;
static int called = 0;
if (called == 0) {
ESP_ERROR_CHECK(esp_event_handler_register(ETH_EVENT, ESP_EVENT_ANY_ID, ð_event_handler, NULL));
called = 1;
}{...}
#if CONFIG_ETHERNET_INTERNAL_SUPPORT || CONFIG_ETHERNET_SPI_SUPPORT
ESP_GOTO_ON_FALSE(eth_handles_out != NULL && eth_cnt_out != NULL, ESP_ERR_INVALID_ARG,
err, TAG, "invalid arguments: initialized handles array or number of interfaces");
eth_handles = calloc(SPI_ETHERNETS_NUM + INTERNAL_ETHERNETS_NUM, sizeof(esp_eth_handle_t));
ESP_GOTO_ON_FALSE(eth_handles != NULL, ESP_ERR_NO_MEM, err, TAG, "no memory");
#if CONFIG_ETHERNET_INTERNAL_SUPPORT
eth_handles[eth_cnt_g] = eth_init_internal(ð_instance_g[eth_cnt_g]);
ESP_GOTO_ON_FALSE(eth_handles[eth_cnt_g], ESP_FAIL, err, TAG, "internal Ethernet init failed");
eth_instance_g[eth_cnt_g].state = DEV_STATE_INITIALIZED;
eth_instance_g[eth_cnt_g].eth_handle = eth_handles[eth_cnt_g];
eth_instance_g[eth_cnt_g].dev_info.type = ETH_DEV_TYPE_INTERNAL_ETH;
eth_instance_g[eth_cnt_g].dev_info.pin.eth_internal_mdc = CONFIG_ETHERNET_MDC_GPIO;
eth_instance_g[eth_cnt_g].dev_info.pin.eth_internal_mdio = CONFIG_ETHERNET_MDIO_GPIO;
eth_cnt_g++;/* ... */
#endif
#if CONFIG_ETHERNET_SPI_SUPPORT
ESP_GOTO_ON_ERROR(spi_bus_init(), err, TAG, "SPI bus init failed");
spi_eth_module_config_t spi_eth_module_config[CONFIG_ETHERNET_SPI_NUMBER] = { 0 };
/* ... */
uint8_t local_mac_0[ETH_ADDR_LEN];
#if CONFIG_ETHERNET_SPI_AUTOCONFIG_MAC_ADDR0 || CONFIG_ETHERNET_SPI_AUTOCONFIG_MAC_ADDR1
uint8_t base_mac_addr[ETH_ADDR_LEN];
ESP_GOTO_ON_ERROR(esp_efuse_mac_get_default(base_mac_addr), err, TAG, "get EFUSE MAC failed");/* ... */
#endif
#if CONFIG_ETHERNET_SPI_AUTOCONFIG_MAC_ADDR0
esp_derive_local_mac(local_mac_0, base_mac_addr);
#else
sscanf(CONFIG_ETHERNET_SPI_MAC_ADDR0, "%2x:%2x:%2x:%2x:%2x:%2x", (unsigned int *) & (local_mac_0[0]),
(unsigned int *)&local_mac_0[1],
(unsigned int *)&local_mac_0[2],
(unsigned int *)&local_mac_0[3],
(unsigned int *)&local_mac_0[4],
(unsigned int *)&local_mac_0[5]);/* ... */
#endif
INIT_SPI_ETH_MODULE_CONFIG(spi_eth_module_config, 0);
spi_eth_module_config[0].mac_addr = local_mac_0;
#if CONFIG_ETHERNET_SPI_NUMBER > 1
uint8_t local_mac_1[ETH_ADDR_LEN];
#if CONFIG_ETHERNET_SPI_AUTOCONFIG_MAC_ADDR1
base_mac_addr[ETH_ADDR_LEN - 1] += 1;
esp_derive_local_mac(local_mac_1, base_mac_addr);/* ... */
#else
sscanf(CONFIG_ETHERNET_SPI_MAC_ADDR1, "%2x:%2x:%2x:%2x:%2x:%2x", (unsigned int *) & (local_mac_1[0]),
(unsigned int *)&local_mac_1[1],
(unsigned int *)&local_mac_1[2],
(unsigned int *)&local_mac_1[3],
(unsigned int *)&local_mac_1[4],
(unsigned int *)&local_mac_1[5]);/* ... */
#endif
INIT_SPI_ETH_MODULE_CONFIG(spi_eth_module_config, 1);
spi_eth_module_config[1].mac_addr = local_mac_1;/* ... */
#endif
#if CONFIG_ETHERNET_SPI_NUMBER > 2
#error Maximum number of supported SPI Ethernet devices is currently limited to 2 by this example.
#endif
for (int i = 0; i < CONFIG_ETHERNET_SPI_NUMBER; i++) {
eth_handles[eth_cnt_g] = eth_init_spi(&spi_eth_module_config[i], ð_instance_g[eth_cnt_g]);
ESP_GOTO_ON_FALSE(eth_handles[eth_cnt_g], ESP_FAIL, err, TAG, "SPI Ethernet init failed");
eth_instance_g[eth_cnt_g].state = DEV_STATE_INITIALIZED;
eth_instance_g[eth_cnt_g].eth_handle = eth_handles[eth_cnt_g];
eth_instance_g[eth_cnt_g].dev_info.type = ETH_DEV_TYPE_SPI;
eth_instance_g[eth_cnt_g].dev_info.pin.eth_spi_cs = CONFIG_ETHERNET_SPI_CS0_GPIO;
eth_instance_g[eth_cnt_g].dev_info.pin.eth_spi_int = CONFIG_ETHERNET_SPI_INT0_GPIO;
eth_cnt_g++;
}{...}
#endif/* ... */
/* ... */
#else
ESP_LOGD(TAG, "no Ethernet device selected to init");
#endif
*eth_handles_out = eth_handles;
*eth_cnt_out = eth_cnt_g;
return ret;
#if CONFIG_ETHERNET_INTERNAL_SUPPORT || CONFIG_ETHERNET_SPI_SUPPORT
err:
ethernet_deinit_all(eth_handles);
return ret;/* ... */
#endif
}{ ... }
void ethernet_deinit_all(esp_eth_handle_t *eth_handles)
{
while (eth_cnt_g) {
eth_cnt_g--;
if ((eth_instance_g[eth_cnt_g].state == DEV_STATE_INITIALIZED) &&
(eth_instance_g[eth_cnt_g].eth_handle != NULL)) {
if (esp_eth_driver_uninstall(eth_instance_g[eth_cnt_g].eth_handle) != ESP_OK) {
ESP_LOGE(TAG, "Unable to deinitialize ethernet handle: %d", eth_cnt_g);
}{...}
if (eth_instance_g[eth_cnt_g].mac != NULL) {
eth_instance_g[eth_cnt_g].mac->del(eth_instance_g[eth_cnt_g].mac);
}{...}
if (eth_instance_g[eth_cnt_g].phy != NULL) {
eth_instance_g[eth_cnt_g].phy->del(eth_instance_g[eth_cnt_g].phy);
}{...}
}{...}
}{...}
#if CONFIG_ETHERNET_SPI_SUPPORT
spi_bus_free(CONFIG_ETHERNET_SPI_HOST);
gpio_uninstall_isr_service();/* ... */
#endif
free(eth_handles);
if (eth_cnt_g != 0) {
ESP_LOGE(TAG, "Something is very wrong. eth_cnt_g is not zero(%d).", eth_cnt_g);
}{...}
}{ ... }
/* ... */
eth_dev_info_t ethernet_init_get_dev_info(esp_eth_handle_t *eth_handle)
{
eth_dev_info_t ret = {.type = ETH_DEV_TYPE_UNKNOWN};
for (int i = 0; i < eth_cnt_g; i++) {
if (eth_handle == eth_instance_g[i].eth_handle) {
return eth_instance_g[i].dev_info;
}{...}
}{...}
return ret;
}{ ... }