摘要:泰山派RK3566支持千兆以太网,为确保数据准确传输,需要配置延迟线delayline,来实现发送和接收时钟的对齐,数据延迟与时钟延迟保持一致。
1. 相关概念
RK3566的千兆以太网实现采用了GMAC控制器(Gigabit Media Access Controller),与PHY的接口是RGMII(Reduced Gigabit Media Independent Interface)。RGMII接口包括4条数据信号线TXD[3:0]和RXD[3:0]、发送时钟TXC和接收时钟RXC。由于PCB走线长度及其他各种缘故,要达到千兆通信,就要对当前硬件开发板电路单独适配,准确配置延迟线delayline,通过延迟线来实现发送和接收时钟的对齐,数据延迟与时钟延迟保持一致。
根据泰山派官方文档20240603补丁说明,目前开发板ET100百兆通信应该是采用了自动扫描获取delayline,底板扩展板说明文档提示千兆接口还在测试调制过程中。
以下描述均在kernel完成20240603补丁后进行。
2. 自动扫描获取
SDK在内核中开启了自动扫描功能的宏CONFIG_DWMAC_RK_AUTO_DELAYLINE。
<sdk>/kernel/.config
按照Rickchip的官方文档说法:
如果遇到一组 delayline 的值无法适配所有硬件板子的时候,原因可能是硬件比较差,窗口很小冗余度差;可以打开自动扫描功能,menuconfig 上打开CONFIG_DWMAC_RK_AUTO_DELAYLINE 。这边需要注意的是窗口很小的问题没有解决的话,打开这个宏也不能完全解决问题,一般来说不需要打开这个宏。
该功能只会在第一次开机的时候做一次探测,做完后会将 delayline 值存储到 vendor storage,之后的每次开机都是直接从 vendor storage 出来并覆盖 dts 的配置。只有在 vendor storage 被擦除后,才会在下次开机后执行该操作一次。
泰山派开机后显示如下,可以看到tx_delay = 0x1d, rx_delay = 0x08,自动扫描获取的结果。
3. 手动获取
源码实现部分也是gmac驱动位于
<sdk>/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.c
设备树文件的gmac1节点配置
<sdk>/kernel/arch/arm64/boot/dts/rockchip/tspi-rk3566-gmac1-v10.dtsi
&gmac1 {
phy-mode = "rgmii";
clock_in_out = "output";
snps,reset-gpio = <&gpio0 RK_PC7 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_GMAC1_RX_TX>, <&cru SCLK_GMAC1>;
assigned-clock-parents = <&cru SCLK_GMAC1_RGMII_SPEED>, <&cru CLK_MAC1_2TOP>;
assigned-clock-rates = <0>, <125000000>;
pinctrl-names = "default";
pinctrl-0 = <&gmac1m1_miim
&gmac1m1_tx_bus2
&gmac1m1_rx_bus2
&gmac1m1_rgmii_clk
&gmac1m1_rgmii_bus>;
tx_delay = <0x4f>;
rx_delay = <0x25>;
phy-handle = <&rgmii_phy0>;
status = "okay";
};
可以看到默认的tx_delay=0x4f,rx_delay=0x25
编译烧写镜像后运行开发板,到/sys/devices/platform/路径下,执行ls,查看ethernet的节点地址,然后检查节点。如果没有生成节点,说明没打补丁或者补丁有问题
ls -l /sys/devices/platform/fe010000.ethernet
泰山派扩展板上的PHY芯片使用的是RTL8211F,注意如果使用的是RTL8211E扫描前需要拔掉网线。扫面delayline窗口,进入fe010000.ethernet文件夹,先使用千兆扫描
echo 1000 > phy_lb_scan
上面红框是扫描的窗口,窗口横轴表示TX方向的delayline,纵轴表示RX方向的delayline,其中"0" 表示该点的坐标是可以pass,空白处是 failed。从窗口看效果不佳,failed太多。下面是扫描结果
效果不佳,这个结果仅做参考
再用百兆扫描
echo 100 > phy_lb_scan
扫描窗口里几乎没出现failed,扫描结果为
Find suitable tx_delay = 0x3f, rx_delay = 0x3f
和自动扫描的结果不一样啊,估计百兆通信情况下,延迟线不同数值影响不大
测试扫描结果中间值
echo (tx delayline) (rx delayline) > rgmii_delayline
cat rgmii_delayline
echo 1000 > phy_lb
测试了千兆的delayline,也pass了
下面就是将扫描获取的结果填写到设备树里
tx_delay = <0x3f>;
rx_delay = <0x3f>;
然后重新编译烧写固件,如果用这个结果,应该还需要关闭自动扫描宏功能。
下一步继续百兆通信的性能测试。如果要实现千兆通信,看样子还要等官方发布补丁消息啦。
参考:Rockchip_Developer_Guide_Linux_GMAC_RGMII_Delayline_CN.pdf