Skip to content

Commit ee745cd

Browse files
committed
esp32/network: Make EMAC RMII pins configurable on ESP32-P4.
Fixes micropython#19035. Signed-off-by: Dryw Wade <dryw.wade@sparkfun.com>
1 parent 2dc2e30 commit ee745cd

File tree

1 file changed

+70
-1
lines changed

1 file changed

+70
-1
lines changed

ports/esp32/network_lan.c

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,16 @@ typedef struct _lan_if_obj_t {
5454
bool initialized;
5555
int8_t mdc_pin;
5656
int8_t mdio_pin;
57+
#if CONFIG_IDF_TARGET_ESP32P4
58+
int8_t crs_dv_pin;
59+
int8_t rxd0_pin;
60+
int8_t rxd1_pin;
61+
int8_t tx_en_pin;
62+
int8_t txd0_pin;
63+
int8_t txd1_pin;
64+
int8_t clk_in_pin;
65+
int8_t clk_out_pin;
66+
#endif
5767
int8_t phy_reset_pin;
5868
int8_t phy_power_pin;
5969
int8_t phy_cs_pin;
@@ -115,7 +125,12 @@ static mp_obj_t get_lan(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar
115125
}
116126

117127
enum { ARG_id, ARG_mdc, ARG_mdio, ARG_reset, ARG_power, ARG_phy_addr, ARG_phy_type,
118-
ARG_spi, ARG_cs, ARG_int, ARG_ref_clk_mode, ARG_ref_clk };
128+
ARG_spi, ARG_cs, ARG_int, ARG_ref_clk_mode, ARG_ref_clk,
129+
#if CONFIG_IDF_TARGET_ESP32P4
130+
ARG_crs_dv, ARG_rxd0, ARG_rxd1, ARG_tx_en,
131+
ARG_txd0, ARG_txd1, ARG_clk_in, ARG_clk_out,
132+
#endif
133+
};
119134
static const mp_arg_t allowed_args[] = {
120135
{ MP_QSTR_id, MP_ARG_OBJ, {.u_obj = mp_const_none} },
121136
{ MP_QSTR_mdc, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
@@ -129,6 +144,16 @@ static mp_obj_t get_lan(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar
129144
{ MP_QSTR_int, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
130145
{ MP_QSTR_ref_clk_mode, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} },
131146
{ MP_QSTR_ref_clk, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
147+
#if CONFIG_IDF_TARGET_ESP32P4
148+
{ MP_QSTR_crs_dv, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
149+
{ MP_QSTR_rxd0, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
150+
{ MP_QSTR_rxd1, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
151+
{ MP_QSTR_tx_en, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
152+
{ MP_QSTR_txd0, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
153+
{ MP_QSTR_txd1, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
154+
{ MP_QSTR_clk_in, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
155+
{ MP_QSTR_clk_out, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
156+
#endif
132157
};
133158

134159
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
@@ -148,6 +173,16 @@ static mp_obj_t get_lan(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar
148173
self->phy_power_pin = GET_PIN(ARG_power);
149174
self->phy_cs_pin = GET_PIN(ARG_cs);
150175
self->phy_int_pin = GET_PIN(ARG_int);
176+
#if CONFIG_IDF_TARGET_ESP32P4
177+
self->crs_dv_pin = GET_PIN(ARG_crs_dv);
178+
self->rxd0_pin = GET_PIN(ARG_rxd0);
179+
self->rxd1_pin = GET_PIN(ARG_rxd1);
180+
self->tx_en_pin = GET_PIN(ARG_tx_en);
181+
self->txd0_pin = GET_PIN(ARG_txd0);
182+
self->txd1_pin = GET_PIN(ARG_txd1);
183+
self->clk_in_pin = GET_PIN(ARG_clk_in);
184+
self->clk_out_pin = GET_PIN(ARG_clk_out);
185+
#endif
151186

152187
if (args[ARG_phy_addr].u_int < 0x00 || args[ARG_phy_addr].u_int > 0x1f) {
153188
mp_raise_ValueError(MP_ERROR_TEXT("invalid phy address"));
@@ -293,6 +328,40 @@ static mp_obj_t get_lan(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar
293328
}
294329
esp32_config.smi_mdc_gpio_num = self->mdc_pin;
295330
esp32_config.smi_mdio_gpio_num = self->mdio_pin;
331+
332+
#if CONFIG_IDF_TARGET_ESP32P4
333+
if (self->crs_dv_pin != -1) {
334+
esp32_config.emac_dataif_gpio.rmii.crs_dv_num = self->crs_dv_pin;
335+
}
336+
if (self->rxd0_pin != -1) {
337+
esp32_config.emac_dataif_gpio.rmii.rxd0_num = self->rxd0_pin;
338+
}
339+
if (self->rxd1_pin != -1) {
340+
esp32_config.emac_dataif_gpio.rmii.rxd1_num = self->rxd1_pin;
341+
}
342+
if (self->tx_en_pin != -1) {
343+
esp32_config.emac_dataif_gpio.rmii.tx_en_num = self->tx_en_pin;
344+
}
345+
if (self->txd0_pin != -1) {
346+
esp32_config.emac_dataif_gpio.rmii.txd0_num = self->txd0_pin;
347+
}
348+
if (self->txd1_pin != -1) {
349+
esp32_config.emac_dataif_gpio.rmii.txd1_num = self->txd1_pin;
350+
}
351+
if (self->clk_out_pin != -1) {
352+
if (self->clk_in_pin == -1) {
353+
mp_raise_ValueError(MP_ERROR_TEXT("clk_in must be specified if clk_out is specified"));
354+
}
355+
esp32_config.clock_config.rmii.clock_mode = EMAC_CLK_OUT;
356+
esp32_config.clock_config.rmii.clock_gpio = (emac_rmii_clock_gpio_t) self->clk_out_pin;
357+
esp32_config.clock_config_out_in.rmii.clock_mode = EMAC_CLK_EXT_IN;
358+
esp32_config.clock_config_out_in.rmii.clock_gpio = (emac_rmii_clock_gpio_t) self->clk_in_pin;
359+
} else if (self->clk_in_pin != -1) {
360+
esp32_config.clock_config.rmii.clock_mode = EMAC_CLK_EXT_IN;
361+
esp32_config.clock_config.rmii.clock_gpio = (emac_rmii_clock_gpio_t) self->clk_in_pin;
362+
}
363+
#endif
364+
296365
mac = esp_eth_mac_new_esp32(&esp32_config, &mac_config);
297366
}
298367
#endif

0 commit comments

Comments
 (0)