--- a/libraries/Ethernet/src/ETH.h +++ b/libraries/Ethernet/src/ETH.h @@ -119,6 +119,10 @@ #endif #ifndef ETH_RMII_CLK #define ETH_RMII_CLK 50 +#endif +// Input for an RMII clock generated by the EMAC (EMAC_CLK_OUT) and looped back externally, -1 if unused +#ifndef ETH_RMII_CLK_IN +#define ETH_RMII_CLK_IN -1 #endif #endif #endif /* CONFIG_ETH_USE_ESP32_EMAC */ --- a/libraries/Ethernet/src/ETH.cpp +++ b/libraries/Ethernet/src/ETH.cpp @@ -223,7 +223,7 @@ .clock_config_out_in = { \ .rmii = { \ .clock_mode = EMAC_CLK_EXT_IN, \ - .clock_gpio = (emac_rmii_clock_gpio_t) - 1 \ + .clock_gpio = (emac_rmii_clock_gpio_t)ETH_RMII_CLK_IN \ } \ }, \ } @@ -277,8 +277,13 @@ _pin_power = digitalPinToGPIONumber(power); if (!perimanClearPinBus(_pin_rmii_clock)) { + return false; + } +#if CONFIG_IDF_TARGET_ESP32P4 && ETH_RMII_CLK_IN >= 0 + if (!perimanClearPinBus(ETH_RMII_CLK_IN)) { return false; } +#endif if (!perimanClearPinBus(_pin_mdc)) { return false; } @@ -429,8 +434,13 @@ _eth_started = true; if (!perimanSetPinBus(_pin_rmii_clock, ESP32_BUS_TYPE_ETHERNET_CLK, (void *)(this), -1, -1)) { + goto err; + } +#if CONFIG_IDF_TARGET_ESP32P4 && ETH_RMII_CLK_IN >= 0 + if (!perimanSetPinBus(ETH_RMII_CLK_IN, ESP32_BUS_TYPE_ETHERNET_CLK, (void *)(this), -1, -1)) { goto err; } +#endif if (!perimanSetPinBus(_pin_mdc, ESP32_BUS_TYPE_ETHERNET_MDC, (void *)(this), -1, -1)) { goto err; }