Rockchip RK3588 - 网卡RTL8211F驱动
一、网卡基础知识
在《Mini2440裸机开发之DM9000》文章中我们对DM9000网卡进行了深入的分析,介绍了其硬件组成以及初始化过程。
在网络通信中,网卡通常由MAC和PHY两个主要部分组成:
MAC负责处理数据链路层的协议和控制;PHY负责处理数据在物理介质上的传输;
本文主要介绍以太网的MAC(Media Access Control,即媒体访问控制子层协议)、PHY(Physical Layer,即物理层)、MAC和PHY之间的MII(Media Independent Interface,媒体独立接口),以及MII的各种衍生版本——GMII、SGMII、RMII、RGMII等。
1.1 以太网接口电路
从硬件的角度看,以太网接口电路主要由MAC控制器和物理层接口PHY两大部分构成。如下图所示:
DMA控制器通常属于CPU的一部分,用虚线放在这里是为了表示DMA控制器可能会参与到网口数据传输中。
但是,在实际的设计中,以上三部分并不一定独立分开的。 由于,PHY整合了大量模拟硬件,而MAC是典型的全数字器件。
考虑到芯片面积及模拟/数字混合架构的原因,通常,将MAC集成进微控制器而将PHY留在片外。更灵活、密度更高的芯片技术已经可以实现MAC和PHY的单芯片整合。可分为下列几种类型:
CPU内部集成了MAC和PHY(难度较高);CPU内部集成MAC,PHY采用独立芯片 (主流方案);CPU不集成MAC和PHY,MAC和PHY采用独立芯片或者集成芯片 (高端采用)。
1.1.1 CPU集成MAC与PHY
目前来说并不多见:

1.1.2 CPU集成MAC,PHY采用独立芯片
比较常见:

1.1.3 CPU不集成MAC与PHY,MAC与PHY采用集成芯片
比较常见,比如我们之前介绍的Mnini2440开发板就是采用的这种方式,S3C2440处理其外接DM9000网卡;

1.2 网卡和网络模型的映射关系
MAC及PHY工作在OSI七层模型的数据链路层和物理层。MAC对应的是数据链路层,PHY对应的是物理层,具体如下:
1.2.1 MAC
MAC(Media Access Control)即媒体访问控制子层协议。该部分有两个概念:MAC可以是一个硬件控制器 及MAC通信以协议。
该协议位于OSI七层协议中数据链路层的下半部分,主要负责控制与连接物理层的物理介质。MAC硬件大约就是下面的样子了:
在发送数据的时候,MAC协议可以事先判断是否可以发送数据,如果可以发送将给数据加上一些控制信息,最终将数据以及控制信息以规定的格式发送到物理层;
在接收数据的时候,MAC协议首先判断输入的信息并是否发生传输错误,如果没有错误,则去掉控制信息发送至LLC(逻辑链路控制)层。该层协议是以太网MAC由IEEE-802. 3以太网标准定义。
以太网数据链路层其实包含MAC(介质访问控制)子层和LLC(逻辑链路控制)子层。一块以太网卡MAC芯片的作用不但要实现MAC子层和LLC子层的功能,还要提供符合规范的PCI界面以实现和主机的数据交换。
以太网MAC芯片的一端接计算机PCI总线,另外一端就接到PHY芯片上,它们之间是通过MII接口链接的。一个MAC的结构图如下图所示:
1.2.2 PHY
PHY(Physical Layer,物理层))是IEEE802.3中定义的一个标准模块,STA(station management entity,管理实体,一般为MAC或CPU)通过SMI(Serial Manage Interface)对PHY的行为、状态进行管理和控制,而具体管理和控制动作是通过读写PHY内部的寄存器实现的。一个PHY的基本结构如下图:

PHY是物理接口收发器,它实现OSI模型的物理层。IEEE-802.3标准定义了以太网PHY。包括MII/GMII(介质独立接口)子层、PCS(物理编码子层)、PMA(物理介质附加)子层、PMD(物理介质相关)子层、MDI子层。它符合IEEE-802.3k中用于10BaseT(第14条)和100BaseTX(第24条和第25条)的规范。
注:PHY寄存器在IEEE802.3标准的22.2.4 Management functions节有介绍,但不涉及所有的寄存器,个别寄存器需要到其它章节中看,当然,文档里面也提到该在哪里找到哪个寄存器。
1.3 MII
MII(Media Independent Interface)即媒体独立接口,MII接口是MAC与PHY连接的标准接口。它是IEEE-802.3定义的以太网行业标准。
MII接口提供了MAC与PHY之间、PHY与STA(Station Management)之间的互联技术,该接口支持10Mb/s与100Mb/s的数据传输速率,数据传输的位宽为4位。
"媒体独立"表明在不对MAC硬件重新设计或替换的情况下,任何类型的PHY设备都可以正常工作。802.3协议最多支持32个PHY,但有一定的限制:要符合协议要求的connector特性。MII接口如下图所示:
为了支持更高的传输速率,后来还有GMII(1Gbps)、10GMII、25GMII、200GMII和500GMII等。
1.3.1 RS与MII
提到MII,就有可能涉及到RS,PLS,STA等名词术语,下面讲一下他们之间对应的关系。
所谓RS即Reconciliation sublayer,它的主要功能主要是提供一种MII和MAC/PLS之间的信号映射机制。它们(RS与MII)之间的关系如下图:
MII的Management Interface是与STA(Station Management)相连的。
1.3.2 MII接口定义
MII接口主要包括四个部分:
- 一是从
MAC层到PHY层的发送数据接口; - 二是从
PHY层到MAC层的接收数据接口; - 三是从
PHY层到MAC层的状态指示信号; - 四是
MAC层和PHY层之间传送控制和状态信息的MDIO接口。
MII接口共包含18个主要信号引脚,分为数据通道、控制信号和管理接口三类:
| 信号类型 | 信号名称 | 方向(MAC侧) | 描述 |
|---|---|---|---|
| 数据发送 | TX_CLK | 输入 | 发送时钟(由PHY提供,频率:10Mbps=2.5MHz,100Mbps=25MHz) |
| TXD[3:0] | 输出 | 4位发送数据(MAC → PHY) | |
| TX_EN | 输出 | 发送使能信号(高电平有效) | |
| TX_ER | 输出 | 发送错误指示(可选,高电平表示数据错误) | |
| 数据接收 | RX_CLK | 输入 | 接收时钟(由PHY提供,频率同TX_CLK) |
| RXD[3:0] | 输入 | 4位接收数据(PHY → MAC) | |
| RX_DV | 输入 | 接收数据有效(高电平有效) | |
| RX_ER | 输入 | 接收错误指示(可选) | |
| 载波侦听 | CRS | 输入 | 载波侦听(高电平表示信道被占用) |
| 冲突检测 | COL | 输入 | 冲突检测(仅半双工模式下有效) |
| 管理接口 | MDC | 输出 | 管理时钟(≤2.5MHz),用于配置PHY寄存器 |
| MDIO | 双向 | 管理数据线(遵循IEEE 802.3 Clause 22协议) | |
| 其他 | RESET | 输出 | PHY复位信号(低电平有效) |
| CLK_25MHz | 输出 | 可选,MAC为PHY提供25MHz参考时钟(某些PHY需要) |
1.3.2.1 数据发送通道(MAC → PHY):
TX_CLK:- 来源:
PHY生成的时钟,频率由当前速率决定(10Mbps=2.5MHz,100Mbps=25MHz); - 作用:同步
TXD、TX_EN、TX_ER信号,上升沿有效。
- 来源:
TXD[3:0]:- 数据格式:每个时钟周期传输
4位数据(半字节),组成完整字节需2个周期; - 时序规则:在
TX_EN=1时有效,数据按大端序传输(TXD[3]为最高位)。
- 数据格式:每个时钟周期传输
TX_EN:- 高电平:表示
TXD数据有效,PHY应开始发送数据帧; - 低电平:数据无效,
PHY发送空闲码(IDLE)。
- 高电平:表示
TX_ER:- 可选信号:用于指示当前发送的数据存在错误(如
CRC错误),需在TX_EN=1期间触发。
- 可选信号:用于指示当前发送的数据存在错误(如
1.3.2.2 数据接收通道(PHY → MAC)
RX_CLK:- 频率:与
TX_CLK同步,由PHY提供。
- 频率:与
RXD[3:0]:- 数据有效条件:
RX_DV=1时,数据为有效帧内容;RX_DV=0时,可能为前导码或空闲码。
- 数据有效条件:
RX_DV:- 作用:标识
RXD数据是否属于有效帧(高电平期间为有效数据)。
- 作用:标识
RX_ER:- 触发条件:
PHY检测到接收错误(如帧校验错误或冲突)。
- 触发条件:
1.3.2.3 冲突与载波管理
CRS(Carrier Sense):- 高电平:表示网络介质上有数据传输(信道忙);
- 低电平:信道空闲。
COL(Collision Detect):- 仅半双工模式有效:高电平表示检测到数据冲突(需
MAC层重发)。
- 仅半双工模式有效:高电平表示检测到数据冲突(需
1.3.3 MII接口工作模式
10Mbps模式:
- 时钟频率:
TX_CLK/RX_CLK = 2.5MHz; - 数据速率:
4位 × 2.5MHz = 10Mbps; - 数据对齐:每
2个时钟周期传输1字节(8位)。
100Mbps模式:
-
时钟频率:
TX_CLK/RX_CLK = 25MHz; -
数据速率:
4位 × 25MHz = 100Mbps; -
数据对齐:每
2个时钟周期传输1字节(8位)。
1.4 MAC层与PHY层的核心分工
| 层级 | MAC层 | PHY层 |
|---|---|---|
| 所属OSI模型 | 数据链路层(Layer 2) | 物理层(Layer 1) |
| 核心功能 | 数据帧封装、流量控制、错误校验(CRC) | 信号调制、电平转换、时钟恢复、介质驱动 |
| 数据形式 | 数字信号(逻辑0/1) | 模拟信号(电压/光脉冲/电磁波) |
| 典型操作 | 以太网帧组装、MAC地址过滤 | 差分信号驱动、阻抗匹配、信号整形 |
1.4.1 什么不能仅保留MAC层
1)信号转换需求
MAC输出的是数字信号,无法直接驱动物理介质(如电缆、光纤)。例如:
- 以太网双绞线需要 差分曼彻斯特编码信号(
±2.5V电平); - 光纤需要光脉冲调制(通过激光/
LED驱动)。
PHY的核心作用:将MAC的数字信号转换为物理介质支持的模拟信号(反之亦然)。
2)物理介质适配
不同介质需要不同的电气特性:
| 介质类型 | PHY处理要点 |
|---|---|
| 双绞线(RJ45) | 差分信号驱动、阻抗匹配(100Ω)、回波抵消 |
| 光纤(SFP) | 光模块驱动、光功率控制 |
| 同轴电缆 | 信号放大、噪声抑制 |
若只有MAC:无法适配多种介质,需为每种介质单独设计硬件。
3)信号完整性与抗干扰
PHY负责信号增强:长距离传输时,信号会衰减并引入噪声。PHY通过均衡器(EQ)和时钟恢复电路补偿信号畸变;例如:
- 千兆以太网
PHY使用自适应均衡技术消除码间干扰(ISI)。
MAC无法处理模拟问题: MAC层仅处理数字逻辑,无法解决信号衰减、反射、串扰等物理层问题。
4)协议标准化
PHY实现物理层标准,例如IEEE 802.3对10BASE-T、100BASE-TX、1000BASE-T的电气特性有严格规范,PHY确保符合标准。
若跳过PHY:不同厂商设备间可能因电平、时序差异无法互通。
1.4.2 总结
PHY的必要性:MAC层处理数字逻辑,PHY解决物理信号转换、介质适配和信号完整性问题。两者缺一不可。
类比:MAC如同“交通规则制定者”,而PHY是“道路建设者和信号灯控制器”。没有PHY,MAC的规则无法在现实世界中落地执行。
最终结论:网卡需要PHY的根本原因在于数字世界与物理世界的鸿沟——MAC负责数据组织,PHY负责让数据在现实介质中可靠传输。
二、硬件原理图
2.1 RK3588侧
RK3588芯片拥有2个GMAC控制器(GMAC是千兆MAC),提供RMII或RGMII接口连接外置的Ethernet PHY;
GMAC控制器支持以下功能:
- 支持
10/100/1000 Mbps数据传输速率的RGMII接口; - 支持
10/100 Mbps数据传输速率的RMII接口。 GMAC0的RGMII/RMII接口复用在VCCIO3电源域;
RK3588平台默认支持的是RTL8211F,以太网模块的硬件相关的驱动代码主要包括GMAC和PHY。
2.1.1 RGMII接口
RGMII接口分为 发送方向(TX)和接收方向(RX),共12个引脚:
| 引脚类型 | 信号名称 | 方向(MAC侧) | 描述 |
|---|---|---|---|
| 发送方向 | TX_CLK | 输出 | 125MHz时钟(MAC → PHY),DDR模式,上升沿和下降沿均有效 |
| TXD[3:0] | 输出 | 4位发送数据,每个时钟周期传输2次(DDR模式) | |
| TX_CTL | 输出 | 控制信号:TX_EN(数据有效) + TX_ERR(错误指示) | |
| 接收方向 | RX_CLK | 输入 | 125MHz时钟(PHY → MAC),DDR模式,上升沿和下降沿均有效 |
| RXD[3:0] | 输入 | 4位接收数据,每个时钟周期传输2次(DDR模式) | |
| RX_CTL | 输入 | 控制信号:RX_DV(数据有效) + RX_ERR(错误指示) | |
| 管理接口 | MDC | 输出 | 管理时钟(≤2.5MHz),用于配置PHY寄存器 |
| MDIO | 双向 | 管理数据线,遵循IEEE 802.3 Clause 22/45协议 |
在RK3588电路原理图中除了如上引脚,我们还看到了:
TX_EN:RMII接口使用;REFCLKO_25M:RMII接口使用;RXDV_CRS:RMII接口使用;
RMII接口通过减少引脚数量(仅需 7个核心信号)实现100Mbps以太网通信,适用于资源受限的嵌入式系统,这里不做过多介绍。
此外还有一个MCLKINOUT接口,MCLKINOUT是RK3588与外部以太网PHY芯片时钟交互的核心引脚,其灵活的双向设计支持多种PHY配置方案;
- 时钟源模式:当外部
PHY芯片无内置振荡器时,RK3588通过MCLKINOUT输出参考时钟供PHY使用; - 时钟接收模式:当
PHY芯片自带振荡器时,RK3588通过MCLKINOUT接收PHY提供的时钟信号。
2.1.2 时序与DDR模式
时钟频率:125MHz(千兆模式下),每个时钟周期传输 8位数据(4位×2次)。
DDR传输规则:
- 发送端(
MAC→PHY)- 上升沿:发送低
4位(TXD[3:0]=D[3:0]); - 下降沿:发送高
4位(TXD[3:0]=D[7:4]);
- 上升沿:发送低
- 接收端(
PHY→MAC)- 上升沿:捕获低
4位(RXD[3:0]=D[3:0]); - 下降沿:捕获高
4位(RXD[3:0]=D[7:4])。
- 上升沿:捕获低
2.2 RTL8211F
Realtek的RTL8211F是一款10/100/1000Mbps的PHY芯片, PHY芯片广泛用于机顶盒,瘦客户机,路由器,工业产品等。
RTL8211F是一个系列的产品,还有很多子型号,不同的型号与主控接口会有区别,适应不同平台的使用。例如:
-
RTL8211F-CG: 只支持RGMII, 不支持SGMII; -
RTL8211FS-CG: 同时支持SGMII和RGMII。
所以针对不同的应用,RTL8211F均可以提供不同型号的对应的芯片,满足实际应用的需要。
PHY芯片电路相对简单,有了PHY芯片后,可以为一个设备增加一个网口,使产品有了与网络互联互通的能力,PHY芯片与主控芯片(如瑞芯微RK3588)可以通过RGMII/RMII/MII进行连接,可以与各种带有不同接口的主控进行连接。

2.3 H5007网络变压器
在以太网接口设计中,除了PHY芯片(如RTL8211F),网络变压器(如H5007) 是必不可少的组件,
2.3.1 核心功能
网络变压器(H5007)的核心功能:
| 功能 | 说明 | 未使用变压器的风险 |
|---|---|---|
| 电气隔离 | 隔离PHY芯片与外部网络(隔离电压通常≥1500V) | 雷击或电源浪涌直接损坏PHY芯片 |
| 阻抗匹配 | 将PHY输出阻抗(如50Ω)转换为双绞线标准阻抗(100Ω差分) | 信号反射导致眼图闭合,误码率升高 |
| 共模噪声抑制 | 滤除双绞线引入的共模干扰(如电源噪声、EMI) | 数据被噪声淹没,通信稳定性下降 |
| 直流偏置隔离 | 阻隔PHY与网线间的直流电位差 | 接地环路电流导致设备损坏或数据错误 |
| 信号电平转换 | 将PHY输出的低压差分信号(如1.1V)提升至网线标准电平(±2.5V) | 传输距离大幅缩短(从100米降至不足10米) |
2.3.2 数据传输流
开发板的千兆以太网接口数据传输流如下:
RK3588 MAC → RGMII接口 → RTL8211F PHY → H5007变压器 → RJ45插座 → 外部网络
发送路径:
RTL8211F将RGMII的4位DDR信号转换为串行差分信号(TXP/TXN);H5007将TXP/TXN的1.1V低压差分信号升压至±2.5V,并通过阻抗匹配网络驱动双绞线。
接收路径:
H5007从双绞线接收±2.5V信号,降压至1.1V后送入RTL8211F的RXP/RXN;PHY内部均衡器补偿信号衰减,恢复出干净的数字化信号。
三、GMAC设备树配置
以太网模块的硬件相关的驱动代码主要包括GMAC和PHY。其中PHY驱动一般使用通用PHY驱动,
如果有需要修改特殊寄存器,请使用对应的PHY驱动,代码都在drivers/net/phy。
3.1 mac配置
DTS的配置参考Documentation/devicetree/bindings/net/rockchip-dwmac.yaml,这个配置文件描述Rockchip 10/100/1000 以太网控制器(GMAC)驱动的设备树(Device Tree)配置。
以如下配置为例:
gmac: ethernet@ff290000 {
compatible = "rockchip,rk3288-gmac";
reg = <0xff290000 0x10000>;
interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "macirq";
rockchip,grf = <&grf>;
clocks = <&cru SCLK_MAC>,
<&cru SCLK_MAC_RX>, <&cru SCLK_MAC_TX>,
<&cru SCLK_MACREF>, <&cru SCLK_MACREF_OUT>,
<&cru ACLK_GMAC>, <&cru PCLK_GMAC>;
clock-names = "stmmaceth",
"mac_clk_rx", "mac_clk_tx",
"clk_mac_ref", "clk_mac_refout",
"aclk_mac", "pclk_mac";
phy-mode = "rgmii";
pinctrl-names = "default";
pinctrl-0 = <&rgmii_pins /*&rmii_pins*/>;
clock_in_out = "input";
snps,reset-gpio = <&gpio4 7 0>;
snps,reset-active-low;
snps,reset-delays-us = <0 10000 1000000>;
assigned-clocks = <&cru SCLK_MAC>;
assigned-clock-parents = <&ext_gmac>;
tx_delay = <0x30>;
rx_delay = <0x10>;
status = "ok";
};
其中:
compatible:用于指定硬件设备的兼容性标识符,设备树中的compatible属性决定了设备驱动如何识别和处理这个硬件设备。可选的配置有rockchip,rk3528-gmac、rockchip,rk3562-gmac、rockchip,rk3568-gmac、rockchip,rk3588-gmac等;reg:指定了设备的物理内存映射地址和大小;0xff290000是以太网控制器(GMAC)寄存器的起始地址;0x10000是该寄存器区域的大小,单位是字节(16KB);
interrupts: 属性指定了设备中断的类型和配置。在设备树中,它通常是一个数组,其中每个条目表示一个中断源的配置;在这个例子中:GIC_SPI表示该中断是一个Shared Peripheral Interrupt(共享外设中断),这种中断由ARM的通用中断控制器(GIC)来管理;27是该中断的编号,表示该中断在GIC中的具体标识符。IRQ_TYPE_LEVEL_HIGH表示该中断是一个电平触发(level-triggered)中断,并且是高电平触发的(即只有在中断信号处于高电平时,才会触发中断请求);
interrupt-names: 为每个中断指定一个名称。在此例中,"macirq"是该中断的名称;rockchip,grf:这是Rockchip系统的一个通用寄存器文件(GRF)的引用。这个寄存器文件通常用于控制系统的多个硬件模块,并且需要通过该设备树节点来进行访问;clocks:定义了该设备需要的时钟源,要求最少5个,最多8个时钟源;clock-names:列出了这些时钟源的名称,包括stmmaceth(以太网控制器时钟),mac_clk_tx(发送时钟),mac_clk_rx(接收时钟),以及其他与以太网硬件相关的时钟信号;phy-mode:主要分为RMII和RGMII模式;pinctrl:RGMII和RMII模式下配置不一样,另外对于时钟方式,如果是输出时钟的pin脚,该pin脚驱动强度一般也是不一样的,例如RMII模式下ref_clock pin脚输出时钟时,驱动强度也会配置更大;clock_in_out:描述了时钟的输入输出方向。对于不同类型的以太网接口(如RGMII和RMII),时钟的来源不同;- 如果是
RGMII,主时钟(125MHz)是由PHY提供的,而不是由SoC(系统单芯片)的PLL提供; - 对于
RMII,时钟的输入和输出方向可能不同,具体取决于PHY和GMAC的设置。
- 如果是
snps,reset-gpio:PHY的硬件复位脚;snps,reset-delays-us:PHY的复位时序,三个时间分别表示PHY的不同阶段的复位时序,不同的PHY的复位时序是不一样的;- 如果是
snps,reset-active-low属性,则表示三个时间分别表示Reset pin脚拉高,拉低,再拉高的时间; - 如果是
snps,reset-active-high属性,则反之;
- 如果是
tx_delay和rx_delay:这两个属性用于控制以太网传输和接收数据时的延迟。RGMII模式下需要配置该属性,它们的值范围是0到0x7F(即0到127),默认值分别为0x30和0x10;phy-supply:如果PHY的电源是常供方式,可以不用配置;否则,需要配置对应的regulator;
该设备树节点中必须包含的属性包括 compatible(硬件兼容性),clocks(时钟源),和 clock-names(时钟源名称)。
3.2 gmac0
gmac0定义在arch/arm64/boot/dts/rockchik/rk3588.dtsi文件;
gmac0: ethernet@fe1b0000 {
compatible = "rockchip,rk3588-gmac", "snps,dwmac-4.20a";
reg = <0x0 0xfe1b0000 0x0 0x10000>;
interrupts = <GIC_SPI 227 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 226 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "macirq", "eth_wake_irq";
rockchip,grf = <&sys_grf>;
rockchip,php_grf = <&php_grf>;
clocks = <&cru CLK_GMAC_125M>, <&cru CLK_GMAC_50M>,
<&cru PCLK_GMAC0>, <&cru ACLK_GMAC0>,
<&cru CLK_GMAC0_PTP_REF>;
clock-names = "stmmaceth", "clk_mac_ref",
"pclk_mac", "aclk_mac",
"ptp_ref";
resets = <&cru SRST_A_GMAC0>;
reset-names = "stmmaceth";
power-domains = <&power RK3588_PD_GMAC>;
snps,mixed-burst;
snps,tso;
snps,axi-config = <&gmac0_stmmac_axi_setup>;
snps,mtl-rx-config = <&gmac0_mtl_rx_setup>;
snps,mtl-tx-config = <&gmac0_mtl_tx_setup>;
status = "disabled";
mdio0: mdio {
compatible = "snps,dwmac-mdio";
#address-cells = <0x1>;
#size-cells = <0x0>;
};
gmac0_stmmac_axi_setup: stmmac-axi-config {
snps,wr_osr_lmt = <4>;
snps,rd_osr_lmt = <8>;
snps,blen = <0 0 0 0 16 8 4>;
};
gmac0_mtl_rx_setup: rx-queues-config {
snps,rx-queues-to-use = <1>;
queue0 {};
};
gmac0_mtl_tx_setup: tx-queues-config {
snps,tx-queues-to-use = <1>;
queue0 {};
};
};
3.3 gmac1
gmac1定义在arch/arm64/boot/dts/rockchik/rk3588s.dtsi文件;
gmac1: ethernet@fe1c0000 {
compatible = "rockchip,rk3588-gmac", "snps,dwmac-4.20a";
reg = <0x0 0xfe1c0000 0x0 0x10000>;
interrupts = <GIC_SPI 234 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 233 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "macirq", "eth_wake_irq";
rockchip,grf = <&sys_grf>;
rockchip,php_grf = <&php_grf>;
clocks = <&cru CLK_GMAC_125M>, <&cru CLK_GMAC_50M>,
<&cru PCLK_GMAC1>, <&cru ACLK_GMAC1>,
<&cru CLK_GMAC1_PTP_REF>;
clock-names = "stmmaceth", "clk_mac_ref",
"pclk_mac", "aclk_mac",
"ptp_ref";
resets = <&cru SRST_A_GMAC1>;
reset-names = "stmmaceth";
power-domains = <&power RK3588_PD_GMAC>;
snps,mixed-burst;
snps,tso;
snps,axi-config = <&gmac1_stmmac_axi_setup>;
snps,mtl-rx-config = <&gmac1_mtl_rx_setup>;
snps,mtl-tx-config = <&gmac1_mtl_tx_setup>;
status = "disabled";
mdio1: mdio {
compatible = "snps,dwmac-mdio";
#address-cells = <0x1>;
#size-cells = <0x0>;
};
gmac1_stmmac_axi_setup: stmmac-axi-config {
snps,wr_osr_lmt = <4>;
snps,rd_osr_lmt = <8>;
snps,blen = <0 0 0 0 16 8 4>;
};
gmac1_mtl_rx_setup: rx-queues-config {
snps,rx-queues-to-use = <1>;
queue0 {};
};
gmac1_mtl_tx_setup: tx-queues-config {
snps,tx-queues-to-use = <1>;
queue0 {};
};
};
四、GMAC调试
4.1 PHY寄存器读写调试
驱动提供了读写寄存器的接口,这里我们以linux 5.10为例;
例如, 往Reg0写入0xabcd;
echo 0x00 0xabcd > /sys/bus/mdio_bus/devices/stmmac-0:00/phy_registers
读:
cat /sys/bus/mdio_bus/devices/stmmac-0:00/phy_registers
该命令会读取0~31的所有寄存器,所以可以查看对应的寄存器值,其中 stmmac-0:00表示PHY地址是0。
4.2 MAC地址
目前对MAC地址的读取策略是,优先使用DTB里面的MAC地址(uboot也会写入),之后是烧写在IDB中的MAC地址,若该地址符合规范,则使用,若不符合或没有烧写,则使用随机生成的地址(重启开机MAC地址会变化)。
在RK3399、RK3328/RK3228H及以后的版本中,对策略进行了完善:优先使用烧写在IDB或vendor Storage中的MAC地址,若该地址符合规范,则使用,若不符合或没有烧写,则随机生成MAC地址保存到Vendor分区中并使用,重启或恢复出厂设置不会丢失。
MAC地址烧写工具参考文档《Rockchip_User_Guide_RKDevInfoWriteTool_CN.pdf》。
4.3 回环测试
回环测试主要有MAC和PHY两种回环,具体可参考《Rockchip_Developer_Guide_Linux_GMAC_RGMII_Delayline_CN.pdf》文档里面,对phy_lb和mac_lb节点的说明。
4.4 RGMII Delayline
RGMII接口提供了tx和rx的delayline,用于调整RGMII时序,如何获取合适的RGMII Delayline,请参
考文档 《Rockchip_Developer_Guide_Linux_GMAC_RGMII_Delayline_CN.pdf》。
4.5 LED灯
PHY有各自的LED控制,下面是RK3228和RK3328里面的macphy,其它外部PHY请参考其datasheet。下面是RK3228和RK3328 LED 配置:
phy: phy@0 {
compatible = "ethernet-phy-id1234.d400", "ethernet-phy-ieee802.3-c22";
reg = <0>;
clocks = <&cru SCLK_MAC2PHY_OUT>;
resets = <&cru SRST_MACPHY>;
pinctrl-names = "default";
pinctrl-0 = <&fephyled_rxm1 &fephyled_linkm1>;
phy-is-integrated;
};
4.6 WOL
Wake On Lan功能,对于每个PHY来说配置的寄存器是不一样的。目前收录的补丁,包含了RTL8211E/F,RTL8201F。
4.7 硬件信号测试
参考Rockchip硬件发布的信号测试文档,包括RMII或RGMII, PHY 眼图测试。《瑞芯硬件部100base-t测试指南-V1.1.doc》,《瑞芯硬件部1000base-t测试指南_V1.0.doc》。
4.8 问题分析
4.8.1 DMA Initialization Failed
如果GMAC的驱动开机log上出现打印: DMA engine initialization failed,可以认为是GMAC的工作时钟出问题了。先测量时钟引脚是否有时钟,时钟频率以及幅度等指标是否正常,主要确认以下几个方面:
IOMUX出错,检查时钟脚寄存器值是否正确;- 时钟方向以及配置与硬件不匹配,参考本文第四章节的时钟设置;
- 检查
clock tree和CRU寄存器,确认时钟频率大小和时钟是否有使能。
4.8.2 PHY初始化失败
如果GMAC的驱动开机log上出现打印:No PHY found或者Cannot attach to PHY,表示找不到PHY。
驱动会通过MDIO先读取PHY的ID,可以测量MDC和MDIO波形,波形是否正常,该总线类似于I2C,MDC频率要求是小于2.5M。一般来说,找不到PHY有以下几个原因:
- 检查
MDC/MDIO IOMUX寄存器值是否正确; PHY供电是否正常;Reset IO配置不正确;Reset IO时序不满足PHY datasheet要求,不同PHY的时序要求不一致,具体配置参考本文DTS配置;- 测试
MDIO/MDC波形是否异常,其中MDC时钟频率要求小于2.5M。
4.8.3 Link问题
如果出现了Link问题,有个排除法,即将MDC/MDIO与主控断开,与电脑直连,查看电脑端是否有同样的问题,以此排除软件上的干扰,那么需要重点排查下硬件上的影响,先测试TXN/P以及RXN/P是否有Link波形。
如果不断出现Link up/Link down,可能原因PHY收到了错误的数据;
EEE模式下,发送的波形在delayline配置错误的情况下可能会导致不断link up/down;- 供给
PHY的时钟不对也会导致该问题。
4.8.4 数据不通
首先排查一下是否是TX问题,或者RX,还是二者都有问题。
4.8.4.1 TX
通过ifconfig -a查看eth0节点的TX packets是否在不断增加,如果为0,则有可能网线没有link 上。
通过查看节点可以看到网线是否是连接上的,carrier为1表示是link up,反之0为link down。
例如RK3328:
console:/ # cat /sys/devices/platform/ff550000.ethernet/net/eth0/carrier
eth0 Link encap:Ethernet HWaddr 16:21:8d:d9:67:0b Driver rk_gmac-dwmac
inet6 addr: fe80::c43d:3e5d:533:b7ea/64 Scope: Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:19 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 TX bytes:
假设TX packets是在不断增加,表示TX数据在GMAC有发出数据。将板卡与PC连在同一个局域网内,在板卡上ping PC,同时在PC 端通过抓包工具(比如 Wireshark)抓包查看,如果有抓到板卡发过来的数据,表示TX数据是通的。如果没有抓到,需要确认TX在哪链
路位置上出现了异常,可以测试GMAC的TX Clock与TX Data的波形,来排除是MAC还是PHY出现了问题。
MAC可以检查以下几个方面:
- 检查
TX Clock/TX Data的iomux; TXC时钟是否正确;RGMII模式时,Tx Delayline配置是否正确;
PHY端也可以测试PHY的TXN/P信号确认PHY是否有数据发出;对于不同的PHY来说,其配置可能是不一样,具体需要查看其 Datasheet。
4.8.4.2 TX
通过以上排查确定不是TX问题,重点排查RX;连接上网线后通过ifconfig -a查看eth0节点的RX``packets是否在不断增加,如果为0,表示GMAC RX没有收到数据;
eth0 Link encap:Ethernet HWaddr 16:21:8d:d9:67:0b Driver rk_gmac-dwmac
inet6 addr: fe80::c43d:3e5d:533:b7ea/64 Scope: Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:341 errors:0 dropped:0 overruns:0 frame:0
TX packets:26 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:48928 TX bytes:3741
Interrupt:355
同样可以测试PHY的RXN/P,以及GMAC的RX Clock/RX Data,来排除是MAC还是PHY出现了问题。MAC可以检查以下几个方面:
- 检查
RX Clock/RX Data的iomux; RXC时钟是否正确;RGMII Tx Delayline配置是否正确;RGMII模式时,Rx Delayline配置是否正确。
假设TX packets是在不断增加,但以太网还是不正常通讯,则有可能是以下原因:
RMII模式下MAC和PHY的参考时钟不是同一个;PHY模式配置不对,例如硬件上配置成了MII模式。
4.8.5 TX queue0 timeout
认为是TX无法发出,一般是控制器异常了,可能是以下几个原因引起的控制器异常:
- 时钟问题,检查时钟配置是否正确;
PHY时序问题,PHY的复位时序不对导致PHY给的时钟不对;PHY硬件问题,导致出现了冲突检测,无法发送数据;- 逻辑电压太低。
参考文章
[1] 以太网扫盲——MAC/PHY与MII(GMII/SGMII/RGMII)
[2] RK3588 调试 phy
[4] 《Rockchip_Developer_Guide_Linux_GMAC_CN.pdf》
[5] 《Rockchip_Developer_Guide_Linux_GMAC_Mode_Configuration_CN.pdf》
[6] 《Rockchip_User_Guide_RKDevInfoWriteTool_CN.pdf》
[7] 《Rockchip_Developer_Guide_Linux_GMAC_RGMII_Delayline_CN.pdf》

浙公网安备 33010602011771号