1
6
7
8
13
14
15
16
17
18
19
20
24
25
33
34
35
41
42
43
47
48
49
50
51
52
53
54
55
56
57
58
64
65
66
73
74
75
79
80
81
85
86
87
88
93
94
95
99
109
110
113
117
118
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
143
144
145
146
147
148
149
150
151
152
153
161
162
163
167
168
175
176
177
178
179
180
181
182
183
184
185
186
187
191
196
197
201
202
203
209
210
216
217
218
219
220
221
222
227
228
236
237
238
239
240
241
242
247
248
256
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
/* ... */
#pragma once
#include <stdbool.h>
#include "soc/soc_caps.h"
#include "esp_eth_com.h"
#include "esp_eth_mac.h"
#include "sdkconfig.h"5 includes
#ifdef __cplusplus
extern "C" {
#endif
#if CONFIG_ETH_USE_ESP32_EMAC
/* ... */
typedef enum {
/* ... */
EMAC_CLK_DEFAULT __attribute__((deprecated)),
/* ... */
EMAC_CLK_EXT_IN,
/* ... */
EMAC_CLK_OUT
}{ ... } emac_rmii_clock_mode_t;
#if CONFIG_IDF_TARGET_ESP32
/* ... */
typedef enum {
/* ... */
EMAC_CLK_IN_GPIO = 0,
/* ... */
EMAC_APPL_CLK_OUT_GPIO = 0,
/* ... */
EMAC_CLK_OUT_GPIO = 16,
/* ... */
EMAC_CLK_OUT_180_GPIO = 17
}{ ... } emac_rmii_clock_gpio_t;/* ... */
#else
/* ... */
typedef int emac_rmii_clock_gpio_t;/* ... */
#endif
/* ... */
typedef union {
struct {
}{ ... } mii;
struct {
emac_rmii_clock_mode_t clock_mode;
emac_rmii_clock_gpio_t clock_gpio;
}{ ... } rmii;
}{ ... } eth_mac_clock_config_t;
/* ... */
typedef struct {
int mdc_num;
int mdio_num;
}{ ... } emac_esp_smi_gpio_config_t;
/* ... */
typedef struct {
int tx_clk_num;
int tx_en_num;
int txd0_num;
int txd1_num;
int txd2_num;
int txd3_num;
int rx_clk_num;
int rx_dv_num;
int rxd0_num;
int rxd1_num;
int rxd2_num;
int rxd3_num;
int col_in_num;
int crs_in_num;
int tx_er_num;
int rx_er_num;
}{ ... } eth_mac_mii_gpio_config_t;
/* ... */
typedef struct {
int tx_en_num;
int txd0_num;
int txd1_num;
int crs_dv_num;
int rxd0_num;
int rxd1_num;
}{ ... } eth_mac_rmii_gpio_config_t;
#if SOC_EMAC_USE_MULTI_IO_MUX || SOC_EMAC_MII_USE_GPIO_MATRIX
/* ... */
typedef union {
eth_mac_mii_gpio_config_t mii;
eth_mac_rmii_gpio_config_t rmii;
}{...} eth_mac_dataif_gpio_config_t;/* ... */
#endif
/* ... */
typedef struct {
union {
emac_esp_smi_gpio_config_t smi_gpio;
struct {
int smi_mdc_gpio_num __attribute__((deprecated("Please use smi_gpio instead")));
int smi_mdio_gpio_num __attribute__((deprecated("Please use smi_gpio instead")));
}{ ... };
}{ ... };
eth_data_interface_t interface;
eth_mac_clock_config_t clock_config;
eth_mac_dma_burst_len_t dma_burst_len;
int intr_priority;
#if SOC_EMAC_USE_MULTI_IO_MUX || SOC_EMAC_MII_USE_GPIO_MATRIX
eth_mac_dataif_gpio_config_t emac_dataif_gpio;
#endif
#if !SOC_EMAC_RMII_CLK_OUT_INTERNAL_LOOPBACK
eth_mac_clock_config_t clock_config_out_in;
#endif
}{ ... } eth_esp32_emac_config_t;
/* ... */
typedef enum {
ETH_MAC_ESP_CMD_SET_TDES0_CFG_BITS = ETH_CMD_CUSTOM_MAC_CMDS_OFFSET,
ETH_MAC_ESP_CMD_CLEAR_TDES0_CFG_BITS,
ETH_MAC_ESP_CMD_PTP_ENABLE,
}{ ... } eth_mac_esp_io_cmd_t;
/* ... */
#if CONFIG_IDF_TARGET_ESP32
#if CONFIG_ETH_RMII_CLK_INPUT
#define DEFAULT_RMII_CLK_MODE EMAC_CLK_EXT_IN
#if CONFIG_ETH_RMII_CLK_IN_GPIO == 0
#define DEFAULT_RMII_CLK_GPIO CONFIG_ETH_RMII_CLK_IN_GPIO
#else
#error "ESP32 EMAC only support input RMII clock to GPIO0"
#endif /* ... */
#elif CONFIG_ETH_RMII_CLK_OUTPUT
#define DEFAULT_RMII_CLK_MODE EMAC_CLK_OUT
#if CONFIG_ETH_RMII_CLK_OUTPUT_GPIO0
#define DEFAULT_RMII_CLK_GPIO EMAC_APPL_CLK_OUT_GPIO
#else
#define DEFAULT_RMII_CLK_GPIO CONFIG_ETH_RMII_CLK_OUT_GPIO
#endif /* ... */
#else
#error "Unsupported RMII clock mode"
#endif
#define ETH_ESP32_EMAC_DEFAULT_CONFIG() \
{ \
.smi_gpio = \
{ \
.mdc_num = 23, \
.mdio_num = 18 \
}{...}, \
.interface = EMAC_DATA_INTERFACE_RMII, \
.clock_config = \
{ \
.rmii = \
{ \
.clock_mode = DEFAULT_RMII_CLK_MODE, \
.clock_gpio = (emac_rmii_clock_gpio_t) DEFAULT_RMII_CLK_GPIO \
}{...} \
}{...}, \
.dma_burst_len = ETH_DMA_BURST_LEN_32, \
.intr_priority = 0, \
}{...}
...#elif/* ... */ CONFIG_IDF_TARGET_ESP32P4
#define ETH_ESP32_EMAC_DEFAULT_CONFIG() \
{ \
.smi_gpio = \
{ \
.mdc_num = 31, \
.mdio_num = 27 \
}{...}, \
.interface = EMAC_DATA_INTERFACE_RMII, \
.clock_config = \
{ \
.rmii = \
{ \
.clock_mode = EMAC_CLK_EXT_IN, \
.clock_gpio = (emac_rmii_clock_gpio_t) 50 \
}{...} \
}{...}, \
.clock_config_out_in = \
{ \
.rmii = \
{ \
.clock_mode = EMAC_CLK_EXT_IN, \
.clock_gpio = (emac_rmii_clock_gpio_t) -1 \
}{...} \
}{...}, \
.dma_burst_len = ETH_DMA_BURST_LEN_32, \
.intr_priority = 0, \
.emac_dataif_gpio = \
{ \
.rmii = \
{ \
.tx_en_num = 49, \
.txd0_num = 34, \
.txd1_num = 35, \
.crs_dv_num = 28, \
.rxd0_num = 29, \
.rxd1_num = 30 \
}{...} \
}{...}, \
}{...}
...#endif/* ... */
/* ... */
esp_eth_mac_t *esp_eth_mac_new_esp32(const eth_esp32_emac_config_t *esp32_config, const eth_mac_config_t *config);/* ... */
#endif
#ifdef __cplusplus
}{...}
#endif