恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
RK3588与TRL8367s RGMII调试实战:时序调优与避坑指南
首页
资讯中心
/
RK3588与TRL8367s RGMII调试实战:时序调优与避坑指南
RK3588与TRL8367s RGMII调试实战:时序调优与避坑指南
发布时间:2026/9/28 8:21:02
1. 项目背景与方案选型为什么是TRL8367s配RK3588RK3588这颗芯片这两年在边缘计算和嵌入式视觉领域的热度不用多说四核A76加四核A55的架构自带6TOPS NPU跑YOLOv8这类模型绰绰有余。但很多人把注意力全放在算力和NPU上忽略了网络这块——等到要做多路摄像头RTSP推流、或者部署分布式推理节点的时候才发现板子上的千兆网口根本跑不满甚至出现丢包、协商降速到百兆的情况。我这次的项目需求很明确RK3588作为主控外挂一颗TRL8367s千兆交换芯片实现多网口扩展用于工业现场的多设备接入和数据回传。选TRL8367s的原因有几个一是它支持RGMII接口和RK3588的GMAC原生对接不需要额外的PHY转换二是它本身就是交换机芯片可以省掉外挂多颗PHY的成本和布线复杂度三是这颗芯片在国产工业设备里用得比较多资料相对好找供货也稳定。但实际调试下来RGMII这块踩的坑远比想象中多。RGMII看起来只是简单的四根数据线加时钟和控制线但它对时序的要求非常苛刻尤其是在RK3588这种主频高、IO驱动能力可配置的平台上参数配错一点轻则协商降速重则直接链路不通。下面我把整个调试过程拆开讲包括方案设计、硬件检查、设备树配置、时序调优和问题排查尽量把每个环节的“为什么”说清楚。1.1 RGMII接口的本质与RK3588的GMAC特性RGMII全称Reduced Gigabit Media Independent Interface是GMII的简化版。GMII需要8根数据线跑125MHzRGMII把它砍到4根但在时钟的上下沿都采样等效还是8位。具体来说TX端在GTX_CLK的上升沿发低4位、下降沿发高4位RX端同理在RX_CLK的上下沿分别采样。这就意味着RGMII的时钟频率是125MHz但数据速率等效250Mbps每线四线合计1000Mbps。RK3588的GMAC控制器支持RGMII模式但它的IO电压域和驱动强度是可配置的。这里有个关键点RK3588的GMAC IO默认电压可能是1.8V或3.3V取决于板级设计。TRL8367s的RGMII接口通常要求3.3V或者1.8V具体看芯片版本和供电设计。如果电压域不匹配信号幅度不对链路肯定起不来。另外RK3588的GMAC支持内部延时internal delay配置这个后面会详细讲。简单说RGMII的时钟和数据之间需要满足一定的建立保持时间如果PCB走线等长做得不好或者芯片本身的输出延时不够就需要通过配置内部延时来补偿。这是整个调试中最核心的部分。1.2 为什么不用外挂PHY方案有人可能会问为什么不直接用RK3588的GMAC接一颗普通千兆PHY比如RTL8211然后外面再挂交换机芯片这样不是更简单吗从硬件设计角度外挂PHY确实更“标准”因为PHY和MAC之间的RGMII接口有明确的规范调试起来参考案例多。但问题是如果你需要多个网口每增加一个网口就要多一颗PHYPCB面积、功耗、成本都上去了。而TRL8367s本身就是交换机它内部集成了多个PHY只需要一颗芯片就能扩展出4到5个网口而且支持VLAN、端口镜像这些交换机功能对于工业现场的多设备隔离和流量监控非常有用。所以选TRL8367s不是因为它“好调”而是因为它“值得调”。一旦调通整个方案的性价比和功能完整性是外挂PHY方案比不了的。2. 硬件设计与信号完整性检查要点RGMII调试的第一步永远是硬件检查软件配置再对硬件有问题也是白搭。我这次用的是自己画的四层板RK3588核心板加底板的形式TRL8367s放在底板上通过板对板连接器和核心板的GMAC信号相连。这个结构本身就引入了额外的走线长度和阻抗不连续点所以硬件检查要格外仔细。2.1 电源与电压域确认TRL8367s通常需要多路电源核心电压一般是1.1V或1.2VIO电压可能是3.3V或1.8V具体看型号后缀。我用的这颗是3.3V IO版本所以RGMII信号电平是3.3V。RK3588的GMAC IO电压域需要配置成3.3V这个在设备树里通过io-domains节点设置。这里有个容易忽略的点RK3588的GMAC IO电压域和GPIO电压域是分开的但有些板级设计会把它们共用一路电源。如果电源设计不当比如3.3V和1.8V混用可能导致信号电平不匹配出现链路不稳定或者完全不通。我实测下来用万用表量一下RGMII信号线的静态电平正常应该是3.3V左右对于3.3V IO如果只有1.8V或者更低那就要查电源配置了。2.2 PCB走线等长与阻抗控制RGMII的TX和RX各有4根数据线加1根时钟线这5根线需要做等长处理。等长不是随便说说一般要求误差控制在±50mil以内严格一点可以做到±25mil。为什么因为125MHz的时钟周期是8ns信号在PCB上的传播速度大约是6英寸/ns50mil的走线差异对应大约8.3ps的延时相对于8ns的周期来说很小但如果差异到了500mil那就是83ps已经接近建立保持时间的边缘了。我这次板子画得比较仓促TX组的等长误差大概在80mil左右RX组好一些50mil以内。实测下来TX组勉强能通但眼图已经不太好了。所以如果你还在画板阶段强烈建议把RGMII这10根线TX 5根RX 5根做严格等长并且参考平面完整不要跨分割。阻抗方面RGMII信号一般按50欧姆单端阻抗设计差分线如果有按100欧姆。四层板的话信号层到参考平面的距离要控制好通常用0.2mm左右的介质厚度配合合适的线宽就能做到50欧姆。2.3 时钟线的特殊处理RGMII的时钟线GTX_CLK和RX_CLK是125MHz虽然频率不算特别高但它是整个接口的基准抖动和延时都要控制好。我建议时钟线尽量走内层包地处理避免和其他高速信号平行走线。如果板子空间允许时钟线两边可以加地过孔屏蔽。另外TRL8367s的RX_CLK是从PHY侧发给MAC的这个时钟的延时特性取决于芯片内部设计。有些交换机芯片的RX_CLK默认没有内部延时需要MAC侧提供延时或者通过芯片寄存器配置。这个后面在时序调优里会详细讲。3. 设备树配置与驱动适配硬件检查没问题之后下一步就是软件配置。RK3588跑的是Linux设备树是配置硬件接口的核心。RGMII的配置主要涉及三个部分GMAC节点、PHY/交换机节点、以及IO电压域和引脚复用。3.1 GMAC节点配置详解RK3588的GMAC节点在设备树里通常叫gmac0或gmac1具体看你的硬件接的是哪个控制器。我这次用的是gmac1因为gmac0被板载的另一个功能占用了。配置内容大概是这样gmac1 { phy-mode rgmii; clock_in_out output; snps,reset-gpio gpio3 RK_PB7 GPIO_ACTIVE_LOW; snps,reset-active-low; snps,reset-delays-us 0 20000 100000; assigned-clocks cru SCLK_GMAC1_RX_TX, cru SCLK_GMAC1_RGMII_SPEED; assigned-clock-parents cru SCLK_GMAC1_RGMII_SPEED, cru SCLK_GMAC1; pinctrl-names default; pinctrl-0 gmac1_miim gmac1_tx_bus2 gmac1_rx_bus2 gmac1_rgmii_clk gmac1_rgmii_bus; tx_delay 0x2a; rx_delay 0x1a; phy-handle rgmii_phy; status okay; };这里有几个关键参数需要解释phy-mode rgmii指定了接口模式。注意有些平台支持rgmii-id表示PHY内部自带延时MAC不需要额外配置。但TRL8367s的情况比较特殊它的延时需要根据具体配置来定所以我先用rgmii然后手动调tx_delay和rx_delay。clock_in_out output表示GTX_CLK由RK3588输出这是MAC作为主设备的标准配置。如果设成input那就反过来了一般不用。tx_delay和rx_delay是RK3588 GMAC的内部延时配置单位是tap每个tap大约对应一定的时间延时具体值取决于芯片的时钟频率。这两个值是整个调试中最关键的参数后面会专门讲怎么调。snps,reset-gpio是TRL8367s的复位引脚调试阶段一定要确保复位时序正确否则芯片可能没起来。3.2 交换机节点的处理TRL8367s作为交换机芯片在Linux里通常有两种处理方式一种是把它当成一个普通的PHY只用一个网口另一种是用DSADistributed Switch Architecture框架把每个端口都映射成独立的网络接口。我这次只需要一个上行口和几个下行口做简单交换所以先用最简单的PHY模式只配置一个固定链路。设备树里大概是这样mdio1 { rgmii_phy: ethernet-phy0 { compatible ethernet-phy-ieee802.3-c22; reg 0x0; }; };这里reg 0x0是TRL8367s的MDIO地址具体值要看芯片的strap引脚配置。如果地址不对MDIO读不到PHY ID链路就起不来。我一开始就是地址搞错了MDIO扫描半天没反应后来查了原理图才发现strap电阻贴错了。3.3 IO电压域与引脚复用配置RK3588的引脚复用非常灵活RGMII的引脚需要正确配置成GMAC功能。设备树里的pinctrl节点要包含gmac1_miim、gmac1_tx_bus2、gmac1_rx_bus2、gmac1_rgmii_clk、gmac1_rgmii_bus这几组。如果漏了某一组对应的信号线就不会工作。IO电压域方面需要在io-domains节点里把GMAC1的电压设成3.3Vio_domains { status okay; gmac1-supply vcc_3v3_s0; };这个配置看起来简单但如果漏了IO电压可能默认是1.8V导致信号幅度不够链路不稳定。我实测下来电压域配错的情况下有时候能协商到千兆但跑一会儿就掉到百兆或者直接丢包。4. RGMII时序调优实战时序调优是RGMII调试的核心也是最容易出问题的地方。RK3588的GMAC提供了tx_delay和rx_delay两个参数用来调整时钟和数据之间的相位关系。调这两个参数的过程本质上是在找信号的最佳采样点。4.1 理解tx_delay和rx_delay的作用RGMII的时序要求是在时钟的上升沿和下降沿数据要稳定。对于TX方向RK3588输出的GTX_CLK和数据之间有一个固定的延时如果这个延时不够TRL8367s采样时可能采到数据跳变沿导致误码。tx_delay就是用来增加GTX_CLK相对于数据的延时让数据在时钟边沿更稳定。对于RX方向TRL8367s输出的RX_CLK和数据之间也有延时RK3588采样时需要在这个延时的基础上再调整rx_delay就是干这个的。这两个参数的单位是tapRK3588的GMAC时钟是125MHz一个周期8ns。tap的数量和具体的延时值不是线性的但大致上每个tap对应几十皮秒的延时。具体值需要查RK3588的TRM技术参考手册里面有详细的对应表。4.2 调试步骤与实测记录我的调试步骤是这样的第一步先把tx_delay和rx_delay都设成0看链路能不能通。实测下来链路完全不通ethtool显示link down。这说明默认延时不够需要增加。第二步固定rx_delay 0逐步增加tx_delay从0x00到0x3f每次增加0x05观察链路状态。实测在tx_delay 0x2a左右链路能起来但ping大包有丢包。第三步固定tx_delay 0x2a逐步调整rx_delay从0x00到0x3f。实测在rx_delay 0x1a时丢包率明显下降ping -s 1472基本不丢包。第四步在tx_delay 0x2a、rx_delay 0x1a附近做精细扫描每次调整0x02找最佳组合。最终确定tx_delay 0x2a、rx_delay 0x1a时iperf3跑满千兆CPU占用也正常。这里有个经验调时序的时候不要只看链路能不能通一定要跑流量测试。有些参数组合下链路能起来但一跑大流量就丢包这种就是时序边缘不稳定。4.3 用示波器辅助调试如果有条件用示波器看RGMII的信号质量是最直接的。我这次借了一台500MHz带宽的示波器探头接在TRL8367s的RX_CLK和RX_D0上看数据和时钟的相位关系。实测发现在rx_delay 0x1a时RX_CLK的上升沿正好在RX_D0的数据眼图中心建立保持时间都很充裕。而在rx_delay 0x00时时钟边沿几乎和数据跳变沿重合难怪会丢包。示波器还能看信号幅度和过冲。我这次板子走线没做阻抗匹配信号过冲比较明显但好在幅度还在TRL8367s的容忍范围内。如果过冲太严重可能需要在信号线上串电阻一般22欧姆到33欧姆。5. 常见问题与排查技巧实录调试过程中遇到的问题不少我挑几个典型的整理成速查表方便大家对照排查。5.1 链路不通的排查思路链路完全不通是最常见的问题排查顺序建议如下排查项检查方法常见问题电源万用表量各路电压电压缺失或偏低复位示波器看复位引脚复位时序不对或一直复位时钟示波器看GTX_CLK时钟没输出或频率不对MDIOmdio-tool读PHY ID地址错误或MDIO不通引脚复用查设备树pinctrl漏配或配错电压域查io-domains电压不匹配我遇到的一次链路不通最后查出来是复位引脚的GPIO编号在设备树里写错了导致芯片一直处于复位状态。这种问题很隐蔽因为软件层面看起来一切正常但硬件根本没工作。5.2 协商降速到百兆的原因链路能通但协商到百兆通常有几个原因一是RGMII的时序边缘千兆时序不满足但百兆能凑合二是PCB走线问题比如某根数据线虚焊或阻抗严重不连续三是TRL8367s的配置问题比如强制百兆模式。我遇到的一次降速是因为tx_delay设得太大千兆时序过不了但百兆时钟频率低反而能通。把tx_delay调小之后千兆就正常了。5.3 大流量丢包的解决方法链路显示千兆但iperf3跑不满或者丢包一般是时序边缘或者信号完整性问题。解决方法先用示波器看眼图确认信号质量然后精细调整tx_delay和rx_delay找最佳采样点如果还不行检查PCB走线特别是等长和阻抗。我这次最后能把iperf3跑到940Mbps左右基本跑满千兆丢包率在0.01%以下。这个成绩对于四层板来说已经不错了如果做六层板信号质量会更好。5.4 实操心得与避坑建议最后分享几个我踩过的坑和总结的经验第一调试阶段一定要留出测试点。RGMII的10根线最好都引出测试点方便示波器探头接。我这次板子空间紧张只引了时钟和两根数据线调试时想看其他线就没办法了。第二设备树改完之后一定要用dmesg看内核日志。RK3588的GMAC驱动会打印很多有用信息比如PHY ID、协商速度、延时配置等。如果链路有问题日志里通常有线索。第三TRL8367s的寄存器配置可以通过MDIO读写有些问题需要直接改寄存器。比如端口的强制模式、流控配置等。我建议先把驱动调通再用mdio-tool或phytool去读写寄存器这样效率更高。第四如果条件允许尽量用六层板。四层板做RGMII不是不行但信号质量确实差一些调试起来更费劲。六层板可以把电源和地平面做完整信号回流路径更好眼图会漂亮很多。第五时序参数不要照搬别人的配置。不同的PCB走线、不同的芯片批次最佳延时值可能都不一样。一定要自己实测找到适合自己板子的参数。这个项目后续还可以扩展比如用DSA框架把TRL8367s的每个端口都映射成独立接口做VLAN隔离和端口镜像。或者结合RK3588的NPU做多路摄像头的智能分析和RTSP推流把网络和算力结合起来。这些等我把基础链路调稳之后再慢慢折腾。