1. 从“信号不同步”说起:为什么你的RK3566千兆网卡跑不满速?
你好,我是老李,一个在嵌入式网络这块折腾了十几年的老工程师。最近在玩基于RK3566的开发板,比如泰山派,想把它做成个高性能的NAS或者边缘计算网关,千兆以太网是基础。但很多朋友跟我吐槽,说板子上的千兆口,实际测速经常掉到百兆甚至更低,或者时断时续,极不稳定。插上网线,灯是亮的,但就是跑不快,ping值还忽高忽低,这感觉就像开着一辆跑车却总在堵车。
如果你也遇到了类似问题,别急着怀疑PHY芯片或者驱动有问题。十有八九,问题出在一个非常关键但又容易被忽略的配置上:RGMII延迟线,也就是常说的 delayline。今天,我就结合自己在RK3566平台上的实战踩坑经验,跟你深入聊聊这玩意儿到底是什么,以及怎么把它调教好,让你的千兆网口真正“飞”起来。
简单来说,RGMII延迟线是解决高速信号“时钟对齐”问题的核心机制。在千兆以太网(RGMII接口标准)下,数据线和时钟线是分开传输的。由于PCB板上的走线不可能做到绝对等长,信号从GMAC控制器跑到PHY芯片,或者反着跑回来,会有细微的时间差。这点时间差在百兆模式下可能无所谓,但在千兆的高频率下(时钟频率125MHz),就成了致命伤。数据信号和时钟信号对不上,接收方就会采样错误,导致大量误码,轻则降速,重则直接链路中断。
所以,delayline 的本质,就是在GMAC控制器内部,给发送(TX)或接收(RX)的数据信号或时钟信号人为地增加一个可控的延迟,把这个时间差“找补”回来,让数据和时钟在接收端能够完美同步。RK3566的GMAC控制器提供了非常精细的延迟调整能力,tx_delay 和 rx_delay 就是控制这个延迟量的两个关键参数。我们的所有优化工作,几乎都是围绕着找到这对参数在当前硬件上的“黄金组合”来展开的。
2. 庖丁解牛:深入理解RGMII与Delayline的工作原理
要调好延迟线,不能光靠蛮力瞎试,得先明白它工作的舞台——RGMII接口,以及RK3566 GMAC控制器是怎么玩转这个延迟的。
2.1 RGMII接口的“速度与激情”
RGMII(精简千兆介质无关接口)是目前千兆以太网PHY与MAC之间最常用的接口之一。它比传统的GMII接口引脚少了很多,节约了PCB空间和成本。在千兆模式下,它的工作时钟频率是125MHz。但这里有个关键点:RGMII接口在时钟的上下沿都采样数据。
具体来说,发送方向,GMAC在TXC(发送时钟)的上升沿和下降沿都会把4位数据(TXD[3:0])送到PHY。接收方向亦然,PHY在RXC(接收时钟)的上下沿将数据送给GMAC。这就意味着,数据线上的有效变化速率实际上是250MHz。如此高的速率下,时钟与数据之间的相位关系必须非常精确,哪怕只有几十皮秒(ps)的偏差,都可能导致采样窗口错过最佳位置。
你的PCB设计工程师会尽力让时钟线和数据线等长,但现实中受限于布局、过孔、层叠结构,绝对等长几乎不可能。这就引入了“时序偏移”。delayline 就是GMAC内部的一个数字可编程延迟单元,它能以非常小的步进(例如,RK3566可能是几十皮秒一步),对TXD/RXD数据信号或者TXC/RXC时钟信号进行延迟调整,从而补偿PCB走线带来的偏移。
2.2 RK3566 GMAC的延迟线配置窗口
在RK3566的SDK内核驱动中(通常是 dwmac-rk.c 或相关文件),延迟线的配置值 tx_delay 和 rx_delay 并不是一个直接的物理时间值,而是一个寄存器索引。这个索引值对应着内部延迟链上的一个抽头点。不同的索引,产生不同的延迟量。
那么,什么样的 (tx_delay, rx_delay) 组合是有效的呢?这就引出了“配置窗口”的概念。你可以把它想象成一个二维的扫雷游戏地图:
- 横坐标(X轴):代表
tx_delay的值,范围通常是0x00到0x7F(十进制0-127)。 - 纵坐标(Y轴):代表
rx_delay的值,范围同样。


856

被折叠的 条评论
为什么被折叠?



