1,首先需要了解sz18201跟rk3568的通讯方式,其实rk3568通过gmac跟phy也就是sz18201通讯,通讯方式有RMII,MII这个详细看手册
2.phy地址,我们需要通过手册得到phy的地址,如果地址不对通讯不上。
3.确认时钟的输入输出,是自己内部给还是主控芯片提供,原理图按照实际硬件来
这里我的硬件接法是两个时钟都是由rk主控提供的,接法简介图,其中晶振提供的是25Mhz的。
4.这些都清楚之后可以配置设备树了,设备树可以参考一部分rk的文档Rockchip_Developer_Guide_Linux_GMAC_Mode_Configuration_CN.pdf,不过不能完全参考,因为rk3568的时钟rmii接法只提供了一个,需要在此基础上进行修改。这里clock_in_out相当于时钟是由谁提供的,output代表时钟由rk主控提供,input代表由phy芯片提供的,这里只是针对于一个时钟TXC这个时钟,晶振的时钟是另外一个引脚,时钟的值的话参考文档,百兆宽带配置的是50MhzTXC,25Mhz的晶振时钟,reset时间就按照rk文档延时即可,正常工作起来的话50Mhz,25Mhz时钟都会有,MDC时钟有通讯的时候才存在,没有通讯的时候都是低电平。
&gmac0 {
phy-mode = "rmii";
clock_in_out = "output";
assigned-clocks = <&cru SCLK_GMAC0_RX_TX>, <&cru SCLK_GMAC0>, <&cru CLK_MAC0_OUT>;
assigned-clock-parents = <&cru SCLK_GMAC0_RMII_SPEED>;
assigned-clock-rates = <0>, <50000000>, <25000000>;
snps,reset-gpio = <&gpio2 RK_PC6 GPIO_ACTIVE_LOW>;
snps,reset-active-low;
/* Reset time is 20ms, 100ms for rtl8211f */
snps,reset-delays-us = <0 20000 100000>;
pinctrl-names = "default";
pinctrl-0 = <&gmac0_miim
&gmac0_tx_bus2
&gmac0_rx_bus2
&gmac0_clkinout
ð0_pins>;
tx_delay = <0x3c>;
rx_delay = <0x2f>;
phy-handle = <&rmii_phy0>;
status = "okay";
};
&mdio0 {
rmii_phy0: phy@1 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <0x1>;
clocks = <&cru CLK_MAC0_OUT>;
};
};
5.log打印
2|console:/ # dmesg | grep -i "gmac"
[ 1.923520] rk_gmac-dwmac fe2a0000.ethernet: IRQ eth_lpi not found
[ 1.923858] rk_gmac-dwmac fe2a0000.ethernet: no regulator found
[ 1.923875] rk_gmac-dwmac fe2a0000.ethernet: clock input or output? (output).
[ 1.923886] rk_gmac-dwmac fe2a0000.ethernet: TX delay(0x3c).
[ 1.923896] rk_gmac-dwmac fe2a0000.ethernet: RX delay(0x2f).
[ 1.923919] rk_gmac-dwmac fe2a0000.ethernet: integrated PHY? (no).
[ 1.923960] rk_gmac-dwmac fe2a0000.ethernet: cannot get clock clk_mac_ref
[ 1.924219] rk_gmac-dwmac fe2a0000.ethernet: init for RMII
[ 1.924448] rk_gmac-dwmac fe2a0000.ethernet: User ID: 0x30, Synopsys ID: 0x51
[ 1.924464] rk_gmac-dwmac fe2a0000.ethernet: \x09DWMAC4/5
[ 1.924476] rk_gmac-dwmac fe2a0000.ethernet: DMA HW capability register supported
[ 1.924485] rk_gmac-dwmac fe2a0000.ethernet: RX Checksum Offload Engine supported
[ 1.924494] rk_gmac-dwmac fe2a0000.ethernet: TX Checksum insertion supported
[ 1.924502] rk_gmac-dwmac fe2a0000.ethernet: Wake-Up On Lan supported
[ 1.924571] rk_gmac-dwmac fe2a0000.ethernet: TSO supported
[ 1.924583] rk_gmac-dwmac fe2a0000.ethernet: Enable RX Mitigation via HW Watchdog Timer
[ 1.924595] rk_gmac-dwmac fe2a0000.ethernet: TSO feature enabled
[ 1.924604] rk_gmac-dwmac fe2a0000.ethernet: Using 32 bits DMA width
[ 21.039538] rk_gmac-dwmac fe2a0000.ethernet eth0: PHY [stmmac-0:01] driver [YT8512 100M Ethernet] (irq=POLL)
[ 21.052695] rk_gmac-dwmac fe2a0000.ethernet eth0: No Safety Features support found
[ 21.052725] rk_gmac-dwmac fe2a0000.ethernet eth0: IEEE 1588-2008 Advanced Timestamp supported
[ 21.055428] rk_gmac-dwmac fe2a0000.ethernet eth0: registered PTP clock
[ 21.067759] rk_gmac-dwmac fe2a0000.ethernet eth0: configuring for phy/rmii link mode
[ 23.144059] rk_gmac-dwmac fe2a0000.ethernet eth0: Link is Up - 100Mbps/Full - flow control off
[ 78.876213] rk_gmac-dwmac fe2a0000.ethernet eth0: Link is Down
[ 81.917944] rk_gmac-dwmac fe2a0000.ethernet eth0: Link is Up - 100Mbps/Full - flow control off
[ 2726.715569] rk_gmac-dwmac fe2a0000.ethernet eth0: Link is Down
[ 2954.717547] rk_gmac-dwmac fe2a0000.ethernet eth0: Link is Up - 100Mbps/Full - flow control off
这个就是正常的log,如果你遇到什么DMA初始化失败,phy地址识别失败,那么基本上要么时钟没有配对,要么就是你的模式没有配对,注意一点就是rk3568的sz18201驱动是有问题的,如果你的情况是这样子的,识别到了网卡,phy_registers寄存器也能读出来,但是没有link状态,这个时候需要问原厂更新驱动。
鼓励各位多多开源不要,多多分享调试经验,都是打工人,互帮互助。