Adding new Ethernet Phy to IDF v3
Posted: Fri Sep 06, 2024 4:56 pm
Hi,
I'm currently struggling to add custom drivers for a KSZ8863RLL Ethernet-Phy to my Project using ESP-IDF v3.3.6.
Sadly I'm stuck on this old IDF version, otherwise it would be much easier.
The KSZ8863RLL is a three port ethernet switch. Two ports have normal phys, driving magnetics (port 1 and port 2). Port 3 of the switch is accessible with an RMII. I've connected an ESP32-WROVER-E module to this RMII interface.
IDF v5 has an example for the KSZ8863 already available. I've compiled this example and it's working fine so I know that my custom hardware is fine.
Now I'm trying to get it to run using the ESP-IDF v3.3.6 as mentioned above.
To do that I've started with the espressif example for ethernet and patched my own code into there. I cannot communicate with the Phy using SMI because it has too many registers, so I'm using I2C. The I2C interface is working, I can read the registers and they mach what I expect according to the datasheet.
I've started with a fresh eth_config_t structure and filled it with my custom functions.
Now the problem is: It doesn't communicate.
If I see through my logfile I can see this:
It's resting the phy, reseting the emac, then it will start to read the Port3 mode from the phy (100Mbps, Full Duplex).
The ethernet event handler gets the SYSTEM_EVENT_ETH_START event ("Ethernet Started"), followed by the SYSTEM_EVENT_ETH_CONNECTED ("Ethernet Link Up").
But it never receives the SYSTEM_EVENT_ETH_GOT_IP event.
I've looked onto the RMII pins with my oscilloscope. There I can see data communication from the PHY to the ESP32 (signals on RXD0, RXD1 and CRS_DV), but the signals in the other direction from ESP32 to PHY are not doing anything (TXD0, TXD1 and TX_EN).
I'm really stuck on this problem and a deadline is approaching soon so I would be very grateful if someone has an idea where to look for this problem.
I've attached the full example sourecode and a picture of the board (for curiosity)
Best Regards
Torben
I'm currently struggling to add custom drivers for a KSZ8863RLL Ethernet-Phy to my Project using ESP-IDF v3.3.6.
Sadly I'm stuck on this old IDF version, otherwise it would be much easier.
The KSZ8863RLL is a three port ethernet switch. Two ports have normal phys, driving magnetics (port 1 and port 2). Port 3 of the switch is accessible with an RMII. I've connected an ESP32-WROVER-E module to this RMII interface.
IDF v5 has an example for the KSZ8863 already available. I've compiled this example and it's working fine so I know that my custom hardware is fine.
Now I'm trying to get it to run using the ESP-IDF v3.3.6 as mentioned above.
To do that I've started with the espressif example for ethernet and patched my own code into there. I cannot communicate with the Phy using SMI because it has too many registers, so I'm using I2C. The I2C interface is working, I can read the registers and they mach what I expect according to the datasheet.
I've started with a fresh eth_config_t structure and filled it with my custom functions.
Now the problem is: It doesn't communicate.
If I see through my logfile I can see this:
Code: Select all
I (465) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
I (465) KSZ: ksz_phy_init
W (475) KSZ: Except next write to fail because of SW reset
I (575) I2C: i2c_master_cmd_begin failed
E (575) I2C: I2C_read failed
I (575) KSZ: ChipID ok
I (575) emac: emac reset done
I (575) KSZ: Port 3 speed mode: 100M
I (575) eth_example: Ethernet Started
I (2575) eth_example: Port 1 Link good
I (2575) eth_example: Port 2 Link good
I (2585) KSZ: Port 3 speed mode: Full Duplex
I (2585) KSZ: Port 3 speed mode: 100M
I (2595) KSZ: Port 3 speed mode: Full Duplex
I (2595) KSZ: Port 3 speed mode: 100M
I (2605) KSZ: Port 3 speed mode: Full Duplex
I (2605) KSZ: Port 3 speed mode: 100M
I (2615) KSZ: Port 3 speed mode: Full Duplex
I (2615) KSZ: Port 3 speed mode: 100M
I (2625) KSZ: Port 3 speed mode: Full Duplex
I (2625) KSZ: Port 3 speed mode: 100M
I (2635) KSZ: Port 3 speed mode: Full Duplex
I (2635) KSZ: Port 3 speed mode: 100M
I (2635) eth_example: Ethernet Link Up
I (4575) eth_example: Port 1 Link good
I (4575) eth_example: Port 2 Link good
The ethernet event handler gets the SYSTEM_EVENT_ETH_START event ("Ethernet Started"), followed by the SYSTEM_EVENT_ETH_CONNECTED ("Ethernet Link Up").
But it never receives the SYSTEM_EVENT_ETH_GOT_IP event.
I've looked onto the RMII pins with my oscilloscope. There I can see data communication from the PHY to the ESP32 (signals on RXD0, RXD1 and CRS_DV), but the signals in the other direction from ESP32 to PHY are not doing anything (TXD0, TXD1 and TX_EN).
I'm really stuck on this problem and a deadline is approaching soon so I would be very grateful if someone has an idea where to look for this problem.
I've attached the full example sourecode and a picture of the board (for curiosity)
Best Regards
Torben