@@ -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