一、前提背景
由于在 RK 系列的 SoC 中内置了以太网 MAC 控制器,所以只需要搭配一颗以太网 PHY 芯片,即可实现以太网卡功能。按照规范,即使是不同厂家的 PHY,仍然有一部分寄存器的定义是通用的,只要配置了这些通用的寄存器,基本上 PHY 就可以正常工作。
rk3576 支持双千兆 MAC,为了节约 GPIO,采用主网千兆,副网百兆的方式。
gmac0 走 RGMII 协议,千兆网。
gmac1 走 RMII 协议,接百兆网。
二、配置设备树
当没有晶振时,需要 SoC 给 PHY 一个 25M 的时钟用于芯片的工作,另外需要一个 50M 的主时钟,用于通信,RMII 100M 模式必须 50MHz REF_CLK(MAC 与 PHY 共用同一参考时钟)。
如果未配置25M时钟,PHY芯片probe出错,无法创建eth网络设备。
stmmac_open: Cannot attach to PHY
如果 主时钟没有配置,PHY可以发现,但是无法PING地址,dhcp也无法从路由器自动获取地址。
修改前:rgmii模式
&gmac1 {
/* Use rgmii-rxid mode to disable rx delay inside Soc */
phy-mode = “rgmii”;
clock_in_out = “output”;
snps,reset-gpio = <&gpio2 RK_PD6 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 = <ð1m0_miim ð1m0_tx_bus2 ð1m0_rx_bus2 ð1m0_rgmii_clk ð1m0_rgmii_bus >; ðm0_clk1_25m_out>; tx_delay = <0x1a>; rx_delay = <0x26>; phy-handle = <&rgmii_phy1>; status = "disabled";};
修改后:rmii模式
&gmac1 {
/* Use rgmii-rxid mode to disable rx delay inside Soc */
phy-mode = "rmii"; clock_in_out = "output"; snps,reset-gpio = <&gpio1 RK_PD4 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 = <ð1m0_miim ð1m0_tx_bus2 ð1m0_rx_bus2 ð1m0_mclk ðm0_clk1_25m_out>; phy-handle = <&rgmii_phy1>; status = "okay";};
至此,gmac1 百兆网phy正常工作了。