随笔四、以太网延迟线获取

摘要:泰山派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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值