文章目录
1、环境介绍
硬件:飞凌ok3568-c开发板
软件:原厂rk356x sdk
2、PHY原理图查看
这里调试使用的是realtek rtl8211fsi-cf。
2.1、收发器接口
PHY与RJ45连接的接口。
2.2、时钟
PHY 25M 时钟由晶振提供。
2.3、RGMII
PHY的RGMII接口连接到主控的GMAC0。
2.4、RESET
PHY复位引脚连接到主控的GPIO3_A4。
2.5、模式选择(通过硬件配置)
2.5.1、PHY地址配置
PHY地址为:001
2.5.2、RGMII I/O 电压配置
RGMII IO电压配置为1.8V,对应的GMAC0接口电压也要配置为1.8V。
2.5.3、操作模式配置
配置为UTP RGMII模式。
2.5.4、RXDLY
硬件启用了PHY的Rx delay。
3、dts配置
如果有两个PHY,建议先调通一个,再下一个,避免过多的配置导致问题不容易发现。
&gmac0 {
phy-mode = "rgmii-rxid"; /* 因为硬件启用了PHY的RX delay,所以这里要改成“rgmii-rxid” */
clock_in_out = "output";
snps,reset-gpio = <&gpio3 RK_PA4 GPIO_ACTIVE_LOW>;
snps,reset-active-low;
/* Reset time is 20ms, 100ms for rtl8211f */
snps,reset-delays-us = <0 20000 100000>;
assigned-clocks = <&cru SCLK_GMAC0_RX_TX>, <&cru SCLK_GMAC0>, <&cru CLK_MAC0_OUT>;
assigned-clock-parents = <&cru SCLK_GMAC0_RGMII_SPEED>;
assigned-clock-rates = <0>, <125000000>, <25000000>;
pinctrl-names = "default";
pinctrl-0 = <&gmac0_miim
&gmac0_tx_bus2
&gmac0_rx_bus2
&gmac0_rgmii_clk
&gmac0_rgmii_bus
ð0_pins>;
tx_delay = <0x36>;
/* rx_delay = <0x00>; */ /* 因为硬件启用了PHY的RX delay,所以rx_delay不用填写 */
phy-handle = <&rgmii_phy0>;
status = "okay";
};
&mdio0 {
rgmii_phy0: phy@0 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <0x0>;
clocks = <&cru CLK_MAC0_OUT>;
};
};
关于设备树配置可以参考官方手册《Rockchip Developer Guide Linux GMAC Mode Configuration》
。
4、kernel配置
CONFIG_REALTEK_PHY=y
5、扫描delayline窗口
查看相关启动日志:
root@rk3568-buildroot:/# dmesg | grep mac
[ 3.397712] dma-pl330 fe530000.dmac: Loaded driver for PL330 DMAC-241330
[ 3.397735] dma-pl330 fe530000.dmac: DBUFF-128x8bytes Num_Chans-8 Num_Peri-32 Num_Events-16
[ 3.399406] dma-pl330 fe550000.dmac: Loaded driver for PL330 DMAC-241330
[ 3.399421] dma-pl330 fe550000.dmac: DBUFF-128x8bytes Num_Chans-8 Num_Peri-32 Num_Events-16
[ 3.439002] rk_gmac-dwmac fe2a0000.ethernet: IRQ eth_lpi not found
[ 3.439251] rk_gmac-dwmac fe2a0000.ethernet: supply phy not found, using dummy regulator
[ 3.439393] rk_gmac-dwmac fe2a0000.ethernet: clock input or output? (output).
[ 3.439407] rk_gmac-dwmac fe2a0000.ethernet: TX delay(0x36).
[ 3.439416] rk_gmac-dwmac fe2a0000.ethernet: Can not read property: rx_delay.
[ 3.439423] rk_gmac-dwmac fe2a0000.ethernet: set rx_delay to 0xffffffff
[ 3.439438] rk_gmac-dwmac fe2a0000.ethernet: integrated PHY? (no).
[ 3.439715] rk_gmac-dwmac fe2a0000.ethernet: init for RGMII_RXID
[ 3.439965] rk_gmac-dwmac fe2a0000.ethernet: User ID: 0x30, Synopsys ID: 0x51
[ 3.439979] rk_gmac-dwmac fe2a0000.ethernet: DWMAC4/5
[ 3.439990] rk_gmac-dwmac fe2a0000.ethernet: DMA HW capability register supported
[ 3.439998] rk_gmac-dwmac fe2a0000.ethernet: RX Checksum Offload Engine supported
[ 3.440005] rk_gmac-dwmac fe2a0000.ethernet: TX Checksum insertion supported
[ 3.440012] rk_gmac-dwmac fe2a0000.ethernet: Wake-Up On Lan supported
[ 3.440068] rk_gmac-dwmac fe2a0000.ethernet: TSO supported
[ 3.440077] rk_gmac-dwmac fe2a0000.ethernet: Enable RX Mitigation via HW Watchdog Timer
[ 3.440085] rk_gmac-dwmac fe2a0000.ethernet: TSO feature enabled
[ 3.440093] rk_gmac-dwmac fe2a0000.ethernet: Using 32 bits DMA width
查看eth0节点:
root@rk3568-buildroot:/# ifconfig -a
eth0 Link encap:Ethernet HWaddr D2:A6:C0:C3:C9:1D
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:59
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:74 errors:0 dropped:0 overruns:0 frame:0
TX packets:74 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4888 (4.7 KiB) TX bytes:4888 (4.7 KiB)
使能eth0(如果出现类似phy not found的错误,建议检查设备树配置):
root@rk3568-buildroot:/# ifconfig eth0 up
[ 152.194458] rk_gmac-dwmac fe2a0000.ethernet eth0: PHY [stmmac-0:00] driver [RTL8211F Gigabit Ethernet] (irq=POLL)
[ 152.198510] dwmac4: Master AXI performs any burst length
[ 152.198574] rk_gmac-dwmac fe2a0000.ethernet eth0: No Safety Features support found
[ 152.198625] rk_gmac-dwmac fe2a0000.ethernet eth0: IEEE 1588-2008 Advanced Timestamp supported
[ 152.199185] rk_gmac-dwmac fe2a0000.ethernet eth0: registered PTP clock
[ 152.199884] rk_gmac-dwmac fe2a0000.ethernet eth0: configuring for phy/rgmii-rxid link mode
[ 154.261389] rk_gmac-dwmac fe2a0000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
[ 154.261566] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
扫描delayline窗口,确认tx_delay值:
root@rk3568-buildroot:/# ehco 1000 >
这里不知道为什么不会扫描,不知道是不是启用了硬件rx_delay的原因,把0x3e替换到设备树里:
重新编译kernel,更新镜像。
6、联网测试
网口插上网线,连接至路由器。
root@rk3568-buildroot:/# ifconfig eth0 up
root@rk3568-buildroot:/# dhcpcd eth0
dhcpcd-9.4.1 starting
DUID 00:01:00:01:2f:01:29:c0:d2:a6:c0:c3:c9:1d
eth0: IAID c0:c3:c9:1d
eth0: soliciting an IPv6 router
eth0: soliciting a DHCP lease
eth0: offered 192.168.2.100 from 192.168.2.1
eth0: probing address 192.168.2.100/24
eth0: leased 192.168.2.100 for 7200 seconds
eth0: adding route to 192.168.2.0/24
eth0: adding default route via 192.168.2.1
forked to background, child pid 1087
root@rk3568-buildroot:/# ifconfig
eth0 Link encap:Ethernet HWaddr D2:A6:C0:C3:C9:1D
inet addr:192.168.2.100 Bcast:192.168.2.255 Mask:255.255.255.0
inet6 addr: fe80::d0a6:c0ff:fec3:c91d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:59 errors:0 dropped:0 overruns:0 frame:0
TX packets:33 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:7666 (7.4 KiB) TX bytes:2882 (2.8 KiB)
Interrupt:59
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:224 errors:0 dropped:0 overruns:0 frame:0
TX packets:224 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:13888 (13.5 KiB) TX bytes:13888 (13.5 KiB)
root@rk3568-buildroot:/# ping baidu.com -I eth0
PING baidu.com (39.156.66.10) from 192.168.2.100 eth0: 56(84) bytes of data.
64 bytes from 39.156.66.10: icmp_seq=1 ttl=51 time=43.5 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=2 ttl=51 time=43.6 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=3 ttl=51 time=43.0 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=4 ttl=51 time=43.3 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=5 ttl=51 time=43.3 ms
7、PHY网灯配置
7.1、配置目标
RTL8211FSI-CF有3个LED控制脚,分别是LED0、LED1、LED2。其中LED0被用作PHY的地址配置:
所以实际只用到了LED1、LED2脚来控制LED。其中LED1控制绿灯,LED2控制橙灯:
每个LED的配置围绕两个指标:
- 物理链路正常连接时,你想亮还是不亮?
- 在物理连接正常的情况下,有数据活动时,你想闪烁还是不闪烁?
所以,现在制定LED配置目标:
- LED1绿灯:1000M物理链路正常连接时,灯亮。有数据活动时,灯闪烁。
- LED2橙灯:10/100M物理链路正常连接时,灯亮。有数据活动时,灯闪烁。
7.2、确认寄存器配置值
最终是通过配置PHY的某个寄存器来实现网灯的控制。
下图可以看出,要配置LED1、LED2就是控制寄存器16,其中是0xd04页的寄存器16。
LED1:配置寄存器16的Bit5(10Mbps)、Bit6(100Mbps)、Bit8(1000Mbps)、Bit9(Active)。
LED2:配置寄存器16的Bit10(10Mbps)、Bit11(100Mbps)、Bit13(1000Mbps)、Bit14(Active)。
下图是LED状态真值表:
根据我们的配置目标,LED1绿灯配置为,Bit5(0)、Bit6(0)、Bit8(1)、Bit9(1):
LED2橙灯配置为,Bit10(1)、Bit11(1)、Bit13(0)、Bit14(1):
最终寄存器16用二进制表示为:0b0100 1111 0000 0000,16进制表示为:0x4F00
7.3、寄存器配置值临时验证
# 切换到Page 0xd04
root@rk3568-buildroot:/# echo 0x1f 0xd04 > /sys/bus/mdio_bus/devices/stmmac-0:00/phy_registers
# 查看修改前的寄存器16
root@rk3568-buildroot:/# cat /sys/bus/mdio_bus/devices/stmmac-0:00/phy_registers
# 设置配置值
root@rk3568-buildroot:/# echo 0x10 0x4F00 > /sys/bus/mdio_bus/devices/stmmac-0:00/phy_registers
# 查看修改后的寄存器16
root@rk3568-buildroot:/# cat /sys/bus/mdio_bus/devices/stmmac-0:00/phy_registers
我目前是连接到路由器,自协商后的速率为100Mbps,只亮橙灯并在数据活动时闪烁,所以配置正确。
7.4、驱动程序中配置寄存器值
上面只是临时验证,现在修改驱动程序,在程序中配置LED寄存器。
驱动文件为:/kernel/drivers/net/phy/realtek.c
/* <sdk>/kernel/drivers/net/phy/realtek.c */
static int rtl8211f_config_init(struct phy_device *phydev)
{
...
phy_write(phydev, 0x1f, 0xd04);
phy_write(phydev, 0x10, 0x4f00);
return 0;
}
8、总结
嵌入式Linux学习交流群:424571391
参考文章:
《Rockchip_Developer_Guide_Linux_GMAC_CN.pdf》
《Rockchip_Developer_Guide_Linux_GMAC_Mode_Configuration_CN.pdf》
《Rockchip_Developer_Guide_Linux_GMAC_RGMII_Delayline_CN.pdf》
Rockchip平台GMAC网卡(RTL8211FD)Phy网灯调试——RK3568 Android13平台_realtek led 0 1 2-CSDN博客