4.3.16. 以太网驱动调试指南
4.3.16.1. 概述
在计算机网络和通信中,MAC(介质接入控制)和 PHY(物理层)是两个重要的概念,它们分别涉及到数据链路层和物理层的不同功能。
MAC(Medium Access Control)是数据链路层的一部分,主要负责在共享通信介质上管理数据的传输。它确保了多个设备能够在同一个网络上有效、协调地共享通信信道,避免冲突和干扰。
MAC的主要功能
地址管理:在数据链路层,MAC负责为每个网络设备分配一个唯一的 MAC 地址,用以在网络中标识不同的设备。
帧封装和解封装:MAC 层负责将上层协议传输的数据封装成帧(Frame)。在接收端,它还会解封装数据。
流量控制:通过控制数据的发送速率,避免网络拥塞,确保网络的稳定运行。
冲突避免:在共享信道中,MAC 协议还需要解决数据发送冲突的问题。例如,在以太网中使用 CSMA/CD 协议来检测和避免数据冲突。
传输顺序管理:确保数据按正确的顺序传输,防止丢包和重复。
PHY(Physical Layer)是网络协议栈的最低层,负责在物理介质上传输原始数据比特流。它处理信号的传输、接收以及转换问题,并规定了网络硬件的电气和机械特性。
PHY的主要功能
信号编码与解码:PHY 层将数字数据转换为适合在物理介质上传输的信号格式。接收方会对信号进行解码,恢复原始的比特流。
比特传输:PHY 层负责将数据按比特的形式发送出去。
调制与解调:在无线通信中,PHY 层还包括调制和解调的过程,即将数字信号转化为适合无线电波传输的形式,并在接收端进行反向操作。
信道管理:PHY 层还负责物理信道的选择、管理和监控,包括信号强度、信号噪声比(SNR)等参数,以优化通信质量。
名词解释
| 名词 | 说明 |
|---|---|
| MAC | Medium Access Control,介质接入控制层 |
| PHY | Port Physical Layer,物理层 |
| MII | Media Independent Interface,一种数据链路层接口,用于连接 MAC 和 PHY |
| RMII | Reduced Media Independent Interface,简化版的 MII 接口标准 |
| GMII | Gigabit Media Independent Interface,用于千兆以太网设备的标准接口 |
| RGMII | Reduced Gigabit Media Independent Interface,对传统 GMII 接口的简化版本 |
| MDIO | Management Data Input/Output,在 MAC 和 PHY 之间进行管理控制 |
4.3.16.2. 特点
X5 支持 MAC 10/100/1000M 以太网控制器,其特性如下
支持全双工和半双工操作模式
支持通过 RGMII 接口实现 10/100/1000 Mbps 数据传输速率
支持通过 RMII 接口实现 10/100 Mbps 数据传输速率
符合 IEEE 802.3-2015 以太网 MAC 标准,支持时间敏感网络(TSN)流量
符合 IEEE 1588-2008 标准,用于精准的网络时钟同步
支持 TCP/UDP 卸载功能,以减少 CPU 负载
4.3.16.3. 功能描述
典型应用
典型连接示意图如下:

功能原理
MII(媒体独立接口)是以太网设备中常见的标准接口,用于连接 MAC 层和 PHY 层。MII 定义了一组信号和协议,允许 MAC 和 PHY 之间的数据交换独立于物理媒介(如电缆或无线电波)。它使得 MAC 和 PHY 之间的交互可以在不同的物理层技术(如10Mbps、100Mbps、1000Mbps以太网)上进行。
RMII
MII 接口是传统以太网设备中常用的接口,用于连接 MAC(介质接入控制层)和 PHY(物理层)之间。在标准 MII 中,需要使用20条引脚来传输数据、时钟、控制信号等,这在很多应用场合可能会导致硬件成本较高。RMII 是为了解决这一问题而提出的,它通过减少信号线的数量,简化了 MII 接口,使得硬件设计更加紧凑、成本更低。
RMII 的主要特性
引脚数减少:与标准 MII 接口相比。RMII 的数据线仅需要2bit,大大减少了连接的复杂度和所需引脚数,从而降低了芯片和电路板的成本。
数据传输速率:RMII支持 10Mbps 和 100Mbps 的以太网传输速率。
时钟频率:RMII接口使用更高频率的时钟来驱动数据传输。与 MII 相比,RMII 的时钟频率通常为50 MHz,这意味着数据传输是基于每时钟周期传输两位数据。
RMII 引脚定义如下
| 管脚 | 描述 | 方向 |
|---|---|---|
| REF_CLK | 发送参考时钟,速率50M | 参考时钟可以是外部时钟源,也可以是 MAC -> PHY,或者是 PHY -> MAC |
| TXD[0:1] | 发送数据线 | MAC -> PHY |
| RXD[0:1] | 接收数据线 | PHY -> MAC |
| TXEN | 发送使能 | MAC -> PHY |
| RXER | 接收错误 | PHY -> MAC |
| CRS/CRS_DV | 载波侦听/接收数据有效。当接收介质非空闲时,CRS_DV 必须被 PHY 置位 | PHY -> MAC |
RGMII
RGMII(Reduced Gigabit Media Independent Interface)是以太网设备中用于连接 MAC(介质接入控制层)和PHY(物理层)的接口标准,专为支持千兆以太网(Gigabit Ethernet,1Gbps)的设备设计。它是对传统 GMII(Gigabit Media Independent Interface)接口的简化版本,旨在减少硬件成本和复杂性,同时保留支持千兆速率的功能。
RGMII 的主要特性
引脚数减少:与传统的 GMII 接口相比,RGMII 通过简化设计减少了引脚数量
支持千兆以太网:RGMII 能够支持 1Gbps 的以太网速率
时钟频率:RGMII 使用125 MHz的时钟频率来传输数据
RGMII 引脚定义如下
| 管脚 | 描述 | 方向 |
|---|---|---|
| TXC | 发送参考时钟,根据 PHY工作模式选择 125M / 25M / 2.5M | MAC -> PHY |
| TXD[0:3] | 发送数据线 | MAC -> PHY |
| TXCTL | 发送控制 | MAC -> PHY |
| RXC | 接收参考时钟,根据 PHY工作模式选择 125M / 25M / 2.5M | PHY -> MAC |
| RXD[0:3] | 接收数据线 | PHY -> MAC |
| RXCTL | 接收控制 | PHY -> MAC |
MDIO
MDIO(Management Data Input/Output)是一个用于以太网设备中的管理功能的接口标准,它是IEEE 802.3(以太网标准)中的一部分,主要用于在 MAC(介质接入控制层)和PHY(物理层)之间进行管理数据的通信。MDIO 接口通常用于读取和配置PHY的状态、速率设置、链路状态等信息。
MDIO 主要作用
链路状态监测:可以用来读取 PHY 的链路状态,判断物理链路是否正常、是否已经建立连接。
速率和双工模式配置:通过 MDIO 接口,MAC 可以设置 PHY 的工作速率(如10/100/1000Mbps)和双工模式(全双工或半双工)。
自协商功能:MDIO 可以用于启动或读取PHY的自协商过程,这允许设备根据网络条件自动选择最佳的工作速率和模式。
故障诊断:MDIO 可用于诊断 PHY 的工作状态,例如读取错误计数、诊断信息等。
4.3.16.4. 驱动代码
uboot 驱动说明
注意: uboot 目前仅支持 PHY 工作模式在 RGMII
uboot 设备树
X5 uboot 设备树路径位于目录uboot/arch/arm/dts,用户修改项目对应的设备树文件,此处以 X5 EVB 主板配置文件 x5-soc.dtsi 为例。MAC 与 PHY 相关配置位于节点 x5_soc_ethernet_tsn。如下所示
x5_soc_ethernet_tsn: gmac-tsn@35010000 {
compatible = "horizon,sunrise5-dwmac";
status = "okay";
reg = <0x35010000 0x10000>;
reg-names = "stmmaceth";
clock-names = "stmmaceth",
"mac-clk-tx",
"mac-clk-rx",
"ethstp",
"syscfg-clk";
clocks = <&refclk>,
<&refclk>,
<&refclk>,
<&refclk>,
<&refclk>;
phy-mode = "rgmii-id";
phy-handle = <&x5_soc_ethphy0>;
max-speed = <1000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet &pinctrl_lsio_gpio0_31_output_normal>;
mdio {
compatible = "snps,dwmac-mdio";
#address-cells = <1>;
#size-cells = <0>;
x5_soc_ethphy0: ethernet-phy@1 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <1>;
max-frequency = <125000000>;
};
};
};
x5_soc_ethernet_tsn 节点属性说明
status: GMAC 驱动使能状态,需确保值为okayphy-mode: PHY 工作模式,uboot 目前仅支持 RGMIImax-speed: PHY 工作速率,RGMII 对应 1000Mbpspinctrl-0: 管脚复用,此处使用示例&pinctrl_enet: 复用为 RGMII 功能管脚&pinctrl_lsio_gpio0_31_output_normal: PHY 复位管脚,此处使用lsio_gpio0_31,用户以实际使用为准
x5_soc_ethphy0 节点属性说明
reg: PHY 地址,0表示使用广播发送,非0表示对应 PHY 地址max-frequency: PHY 时钟,RGMII 使用 125M 时钟
uboot 驱动源码
uboot GMAC 驱动源码位于 uboot/drivers/net/dwc_eth_qos.c
新增新的 PHY 厂商驱动的典型方法
本示例以新厂商命名为 new phy,用户根据实际使用的 PHY 厂商替换其命名即可。
在 uboot 中添加厂商驱动源码
uboot PHY 厂商驱动源码位于 uboot/drivers/net/phy 目录下,例如:将 new_phy.c 放置到该目录下。
修改 Makefile 修改
uboot/drivers/net/phy/Makefile,添加new phy源码的编译项。
obj-$(CONFIG_NEW_PHY) += new_phy.o
注意: 需确保板级 uboot 配置文件中 CONFIG_NEW_PHY=y
在 PHY 框架初始化过程中,增加对厂商
new_phy驱动的入口调用。 修改 uboot 源码uboot/drivers/net/phy/phy.c,添加new phy的初始化函数。
int phy_init(void)
{
...(省略代码)...
#ifdef CONFIG_NEW_PHY
phy_new_phy_init(); // 添加厂商 new phy 的初始化函数,该函数由 new_phy.c 实现
#endif
...(省略代码)...
}
new_phy.c 将实现其初始化函数,示例如下:
/* Support for NEW PHY */
static struct phy_driver new_phy_driver = {
.name = "new phy",
.uid = 0x12ABCD, // 对应 new phy 的网卡 PHY ID,注意: 需要 PHY ID 匹配后才会调用对应的驱动函数
.mask = 0xffffff, // PHY ID 掩码,注意: PHY ID = uid & mask
.features = PHY_GBIT_FEATURES,
.probe = &new_phy_probe,
.config = &new_phy_config,
.startup = &new_phy_startup,
.shutdown = &new_phy_shutdown,
};
int new_phy_init(void)
{
phy_register(&new_phy_driver);
return 0;
}
kernel 驱动说明
注意: kernel 目前支持 PHY 工作模式在 RMII 和 RGMII,默认使用 RGMII
kernel 设备树
X5 kernel 设备树路径位于目录kernel/arch/arm64/boot/dts/hobot,用户修改项目对应的设备树文件,此处以 X5 EVB 主板配置文件 x5-evb.dtsi 为例。
MAC 与 PHY 相关配置位于这三个节点 gmac_tsn hobot_tsn horizon_tsn,分别对应三个驱动。
注意: 用户使用 RGMII 推荐使用 horizon_tsn,使用 RMII 推荐使用 gmac_tsn
下面以 horizon_tsn 为例说明
horizon_tsn: horizon_tsn@35010000 {
compatible = "snps,dwc-qos-ethernet-5.10a";
status = "disabled";
reg = <0x35010000 0x10000>,
<0x35050000 0x4>;
interrupt-parent = <&gic>;
interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "mac-irq";
clocks = <&hpsclks X5_HSIO_ENET_AXI_CLK>,
<&hpsclks X5_HSIO_ENET_RGMII_CLK>,
<&hpsclks X5_HSIO_ENET_PCLK>,
<&hpsclks X5_HSIO_ENET_REF_CLK>,
<&hpsclks X5_HSIO_ENET_PTP_REFCLK>;
clock-names = "axi_clk", "rgmii_clk", "apb_clk",
"ref_clk", "ptp_ref";
resets = <&socrst HSIO_ENET_RESET>;
reset-names = "enet_rst";
snps,write-requests = <8>;
snps,read-requests = <8>;
snps,txpbl = <4>;
snps,rxpbl = <4>;
snps,clk_csr = <2>;
snps,tso;
snps,aal;
//snps,fp;
snps,force_sf_dma_mode = <1>;
phy-mode = "rgmii-id";
phy-handle = <&horizon_ethphy0>;
mdio {
compatible = "snps,dwmac-mdio";
#address-cells = <1>;
#size-cells = <0>;
horizon_ethphy0: horizon_ethernet-phy@1 {
compatible =
"ethernet-phy-ieee802.3-c22";
reg = <0>;
};
};
}
&horizon_tsn {
status = "disabled";
phy-mode = "rgmii-id"; // PHY 工作模式为 RGMII
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet &hsio_gpio0_16>; // 配置复用功能: RGMII 和 复位管脚
phyreset-gpio = <&hs_gpio0_porta 16 GPIO_ACTIVE_HIGH>; // 配置复位管脚,此处使用 hsio_gpio0_16
};
horizon_tsn 节点属性说明
status: GMAC 驱动使能状态,需确保要使用的节点,其status值为okayphy-mode: PHY 工作模式,目前支持rmiirgmii-idpinctrl-0: 管脚复用,此处使用示例&pinctrl_enet: 复用为 RGMII 功能管脚,若使用 RMII,需复用为pinctrl_enet_rmii&hsio_gpio0_16: PHY 复位管脚,此处使用hsio_gpio0_16,用户以实际使用为准
phyreset-gpio: 复位管脚,此处使用hsio_gpio0_16
x5_soc_ethphy0 节点属性说明
reg: PHY 地址,0表示使用广播发送,非0表示对应 PHY 地址
注意: PHY 复位管脚需确认复位为 GPIO 功能,有关 GPIO 复用配置的方法,请参考GPIO调试指南
kernel 驱动源码
kernel GMAC 驱动源码位于 kernel/drivers/net/ethernet/stmicro/stmmac
开启 PHY 驱动
PHY 驱动位于 kernel/drivers/net/phy 目录,包含各个 PHY 厂商的驱动源码,以 realtek 为例,通过 menuconfig 开启 realtek PHY 驱动。

匹配 PHY ID
以 realtek 为例, struct phy_driver 数组是内核用来注册和管理多个 PHY 设备驱动的关键数据结构。它通常用于通过 phy_driver 描述多个支持的 PHY 驱动,并通过数组形式进行注册和处理。
以 RTL8211F 为例
static struct phy_driver realtek_drvs[] = {
{
// ...(省略代码)...
{
PHY_ID_MATCH_EXACT(0x001cc916), // PHY ID,可通过 datasheet 获取,驱动通过读取 register 2 和 3 获取
.name = "RTL8211F Gigabit Ethernet", // 驱动名称
.probe = rtl821x_probe,
.config_init = &rtl8211f_config_init,
.read_status = rtlgen_read_status,
.config_intr = &rtl8211f_config_intr,
.handle_interrupt = rtl8211f_handle_interrupt,
.suspend = genphy_suspend,
.resume = rtl821x_resume,
.read_page = rtl821x_read_page,
.write_page = rtl821x_write_page,
},
// ...(省略代码)...
}
当驱动匹配到 PHY ID,将显示如下打印
[ 5.684946] hobot_gmac 35010000.horizon_tsn eth0: PHY [hobot-mac-mdio-35010000:00] driver [RTL8211F Gigabit Ethernet] (irq=POLL)
[ 5.705015] hobot_gmac 35010000.horizon_tsn eth0: mac_config_rx_queues_routing, not support packet mode :
[ 5.714742] hobot_gmac 35010000.horizon_tsn eth0: configuring for phy/rgmii-id link mode
PHY 驱动匹配检查
kernel 可通过 sysfs 检查当 PHY 设备匹配到的驱动。操作如下
查看系统支持的 PHY 驱动
系统当前支持的 PHY 驱动在目录 /sys/bus/mdio_bus/drivers下,以子目录形式存在。
root@buildroot:/sys/bus/mdio_bus/drivers# ls -al
total 0
drwxr-xr-x 24 root root 0 Jan 1 00:00 .
drwxr-xr-x 4 root root 0 Jan 1 00:00 ..
drwxr-xr-x 2 root root 0 Jan 1 00:00 'Generic Clause 45 PHY'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'Generic FE-GE Realtek PHY'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'Generic PHY'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL8201CP Ethernet'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL8201F Fast Ethernet'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL8208 Fast Ethernet'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL8211 Gigabit Ethernet'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL8211B Gigabit Ethernet'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL8211C Gigabit Ethernet'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL8211DN Gigabit Ethernet'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL8211E Gigabit Ethernet'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL8211F Gigabit Ethernet'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL8211F-VD Gigabit Ethernet'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL8221B-VB-CG 2.5Gbps PHY'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL8221B-VM-CG 2.5Gbps PHY'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL8226 2.5Gbps PHY'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL8226-CG 2.5Gbps PHY'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL8226B-CG_RTL8221B-CG 2.5Gbps PHY'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL8226B_RTL8221B 2.5Gbps PHY'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL8365MB-VC Gigabit Ethernet'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL8366RB Gigabit Ethernet'
drwxr-xr-x 2 root root 0 Jan 1 00:00 'RTL9000AA_RTL9000AN Ethernet'
查看系统匹配的 PHY 驱动
X5 系统 GMAC 驱动在目录 /sys/bus/mdio_bus/devices/hobot-mac-mdio-35010000:00,同样是以目录形式存在。其中 driver 目录是一个软连接,指向当前系统匹配到的 PHY 驱动,如下所示
root@buildroot:/sys/bus/mdio_bus/devices/hobot-mac-mdio-35010000:00# ls
attached_dev driver of_node phy_dev_flags phy_has_fixups phy_id phy_interface power statistics subsystem uevent
root@buildroot:/sys/bus/mdio_bus/devices/hobot-mac-mdio-35010000:00# ls -al driver/hobot-mac-mdio-35010000\:00/driver
lrwxrwxrwx 1 root root 0 Jan 1 00:04 driver/hobot-mac-mdio-35010000:00/driver -> '../../../../../../../../bus/mdio_bus/drivers/RTL8211F Gigabit Ethernet'
可看到 driver 指向 /sys/bus/mdio_bus/drivers/RTL8211F Gigabit Ethernet 表示当前系统匹配到的 PHY 驱动是 RTL8211F。
4.3.16.5. 使用方法
uboot 使用方法
uboot 设置静态 IP
设置 X5 uboot 为静态IP
Hobot>setenv ipaddr 192.168.1.10
uboot 动态获取 IP
将 X5 网口连接到路由器或 DHCP 服务器,X5 进入 uboot 后设置 DHCP 服务器 IP 地址,并通过 dhcp 命令获取动态IP。如下所示:
Hobot>setenv serverip 192.168.1.1
Hobot>setenv autoload no
Hobot>dhcp
uboot 验证 PHY 连通性
uboot下可以通过 ping 命令验证连通性,需要先设置本地 IP 地址
Hobot>setenv ipaddr 192.168.1.10
Hobot>ping 192.168.1.11
gmac-tsn@35010000 Waiting for PHY auto negotiation to complete..... done
Using gmac-tsn@35010000 device
host 192.168.1.11 is alive
如果打印出 host 192.168.1.11 is alive 则表示网络正常
uboot 读写 phy 寄存器
在 uboot 下可通过 mii 命令集读写 PHY 寄存器
查看当前 mii 设备列表
Hobot>mii device
MII devices: 'gmac-tsn@35010000'
Current device: 'gmac-tsn@35010000'
可以看到当前 uboot 下可用以及选择的 mii 设备是 gmac-tsn@35010000
查看 PHY 寄存器值,并显示每一位状态
格式 mii dump <addr> <reg>,参数说明如下
addr: PHY 地址reg: 寄存器地址,仅支持[0:5]
注意: 推荐使用该命令读取 PHY 标准寄存器,可以直观显示每一位状态
例如:读取寄存器0状态
Hobot>mii dump 1 0
0. (1040) -- PHY control register --
(8000:0000) 0.15 = 0 reset
(4000:0000) 0.14 = 0 loopback
(2040:0040) 0. 6,13 = b10 speed selection = 1000 Mbps
(1000:1000) 0.12 = 1 A/N enable
(0800:0000) 0.11 = 0 power-down
(0400:0000) 0.10 = 0 isolate
(0200:0000) 0. 9 = 0 restart A/N
(0100:0000) 0. 8 = 0 duplex = half
(0080:0000) 0. 7 = 0 collision test enable
(003f:0000) 0. 5- 0 = 0 (reserved)
读取 PHY 寄存器值
格式 mii read <addr> <reg>
注意: 可以使用该命令读取 PHY 所有寄存器值,包括标准寄存器和自定义寄存器
例如:读取寄存器0状态
Hobot>mii read 1 0
1040
kernel 使用方法
设置 IP 参数
Linux 网卡通过配置文件 /etc/network/interfaces 配置 IP 参数
设置静态 IP
设置 eth0 静态 IP 可参考如下配置
auto eth0
iface eth0 inet static # 设置 eth0 为静态 IP
address 192.168.1.10 # 设置静态 IP 地址
netmask 255.255.255.0 # 设置子网掩码
gateway 192.168.1.1 # 设置网关地址
broadcast 192.168.1.255 # 设置广播地址
metric 700 # 设置 metric 值
设置动态 IP
设置 eth0 通过 hdcp 动态获取 IP 可参考如下配置
auto eth0
iface eth0 inet dhcp
系统常用命令
查看网卡状态
ls /sys/class/net
每个网卡以子目录形式存在 /sys/class/net 目录下,每个目录下包含其可配置参数文件,用户可通过该目录下的节点,配置或查看网卡的状态。
常用配置文件如下
| 参数文件 | 描述 |
|---|---|
| address | MAC地址 |
| broadcast | 广播地址 |
| carrier | 物理连接状态,1代表已连接,0代表未连接 |
| carrier_changes | 记录网卡连接状态变化的次数 |
| dev_id | 用于系统中网卡设备的唯一标识 |
| duplex | 显示网卡的工作模式,full 表示全双工,half 表示半双工 |
| mtu | 最大传输单元,单位字节 |
| speed | 网卡速率,单位Mbps |
| tx_queue_len | 网卡的传输队列长度,在网络高负载时,调整该值可以影响发送性能 |
| statistics | 网络接口的详细统计信息,用于诊断网络问题 |
打开/关闭 eth0
ifconfig eth0 up # 打开 eth0
ifconfig eth0 down # 关闭 eth0
配置 eth0 参数
ifconfig eth0 192.168.1.10 # 配置静态 IP
ifconfig eth0 hw ether 00:11:22:aa:bb:cc # 设置 MAC 地址
ifconfig eth0 netmask 255.255.255.0 # 设置子网掩码
route add default gw 192.168.1.1 # 添加网关
ethtool
ethtool 用于查询和设置网卡参数的命令行工具。它允许用户查看网卡的配置、运行状态、以及支持的特性,并且可以修改某些设置,如网络速率、双工模式、启用/禁用特性等。ethtool 是一个非常强大的工具,广泛用于网络管理员和开发人员进行网络设备的管理和调试。
查看网卡状态
下面以 eth0 为例,并简单说明下输出信息含义
# ethtool eth0
Settings for eth0:
Supported ports: [ TP MII ]
Supported link modes: 10baseT/Full # 当前网卡支持的能力
100baseT/Full
1000baseT/Full
Supported pause frame use: Symmetric Receive-only
Supports auto-negotiation: Yes # 支持自动协商
Supported FEC modes: Not reported
Advertised link modes: 10baseT/Full # 广播的连接模式
100baseT/Full
1000baseT/Full
Advertised pause frame use: Symmetric Receive-only
Advertised auto-negotiation: Yes # 自动协商开启
Advertised FEC modes: Not reported
Link partner advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Link partner advertised pause frame use: Symmetric Receive-only
Link partner advertised auto-negotiation: Yes
Link partner advertised FEC modes: Not reported
Speed: 1000Mb/s # 当前网卡速率
Duplex: Full # 网卡工作模式
Port: Twisted Pair
PHYAD: 0 # PHY 地址
Transceiver: external
Auto-negotiation: on
MDI-X: Unknown
Supports Wake-on: ug
Wake-on: d
Link detected: yes
网卡统计信息
ethtool -S eth0 显示网卡的详细统计信息,如接收字节数、发送字节数、丢包数、错误数等,有助于网络管理员诊断网络性能、错误和流量问题,常用的统计项如下
接收统计信息
rx_packets:接收到的数据包总数。
rx_bytes:接收到的字节总数。
rx_errors:接收过程中发生的错误数量。例如,CRC 错误、帧错误等。
rx_dropped:接收到的数据包被丢弃的数量。可能因为缓冲区溢出或其他原因导致数据包丢失。
rx_fifo_errors:接收队列溢出错误的数量。表示接收 FIFO 队列已满,数据包无法处理。
rx_length_errors:接收数据包的长度错误(如超出最大长度)的数量。
rx_crc_errors:接收过程中的CRC错误数。表示数据包在传输过程中发生了数据损坏。
发送统计信息
tx_packets:发送的数据包总数。
tx_bytes:发送的字节总数。
tx_errors:发送过程中发生的错误数量。例如,校验和错误、设备错误等。
tx_dropped:发送的数据包被丢弃的数量。通常发生在网络拥堵或设备资源不足时。
tx_fifo_errors:发送队列溢出错误的数量。表示发送 FIFO 队列已满,数据包无法传送。
tx_collisions:发生的碰撞次数(在以太网中,只有在半双工模式下可能出现)。
tx_carrier_errors:发生的载波错误数量,通常与链路层的物理连接问题有关。
设置网卡速率与工作模式
设置网卡速率为 1000Mbps,并启用全双工
ethtool -s eth0 speed 1000 duplex full autoneg off
网卡速率测试
uboot 没有完整的协议栈,所以速率/模式测试建议在 kernel 下进行。
注意: 测试速率需要将网卡切换到不同模式,可以调整对端的速率并最终通过协商达到目标速率/模式,也可以通过 ethtool 强制切换指定的速率/模式,并使用 iperf 进行速率测试
下面使用 1000M 全双工进行速率测试。
设置网卡速率为 1000Mbps,并启用全双工
ethtool -s eth0 speed 1000 duplex full autoneg off
PC 端启动 iperf3,作为 server 等待板端连接
> .\iperf3.exe -s
-----------------------------------------------------------
Server listening on 5201 (test #1)
-----------------------------------------------------------
板端作为 client 进行速率测试
# iperf3 -p 5201 -c 192.168.1.11
Connecting to host 192.168.1.11, port 5201
[ 5] local 192.168.1.10 port 52942 connected to 192.168.1.11 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 114 MBytes 956 Mbits/sec 0 345 KBytes
[ 5] 1.00-2.00 sec 113 MBytes 950 Mbits/sec 0 345 KBytes
[ 5] 2.00-3.00 sec 113 MBytes 947 Mbits/sec 0 345 KBytes
[ 5] 3.00-4.00 sec 113 MBytes 949 Mbits/sec 0 345 KBytes
[ 5] 4.00-5.00 sec 113 MBytes 950 Mbits/sec 0 345 KBytes
[ 5] 5.00-6.00 sec 113 MBytes 949 Mbits/sec 0 345 KBytes
[ 5] 6.00-7.00 sec 113 MBytes 950 Mbits/sec 0 345 KBytes
[ 5] 7.00-8.00 sec 113 MBytes 951 Mbits/sec 0 345 KBytes
[ 5] 8.00-9.00 sec 113 MBytes 947 Mbits/sec 0 345 KBytes
可以看到速率满足要求
注意: 其他模式/速率请参考以上方法,此处不做赘述
4.3.16.6. 常见问题
网卡问题速查
与 PHY 相关的网络问题主要分为网络不通或丢包严重,可以参考以下方法速查

加载网卡提示 “Cannot attach to PHY”
错误信息如下
root@ubuntu:~# ifconfig eth0 up
[ 222.582785] dwc-eth-dwmac 35010000.gmac-tsn eth0: __stmmac_open: Cannot attach to PHY (error: -19)
SIOCSIFFLAGS: No such device
网卡 MDIO 通信失败,可按照以下思路排查
网卡供电是否正常
复位管脚是否复用成 GPIO,复位时序是否满足 datasheet 要求,一般 PHY 要求复位管脚拉低一定时长才是有效复位
MDIO 通信是否异常,例如是否有波形,MDC 速率是否满足要求(一般不超过2.5M)
MAC 复位失败”
uboot 下有如下打印
EQOS_DMA_MODE_SWR stuck
Kernel 在 link up 网卡时提示 “DMA engine initialization failed
错误信息如下
原因分析: 一般都是 MAC 复位失败,通常是因为没有 RGMII-RX 时钟导致,可按以下思路分析
检查是否有参考时钟,时钟频率、幅值是否满足要求
检查 PHY 供电是否正常,检查 PHY 复位管脚
检查 PHY datasheet,是否特殊寄存器配置,例如在给出 RGMII-RX 时钟 前需要进行必要的寄存器配置
自协商失败”
分析方法
通过交叉对比,判断是本地还是对端问题
uboot 下协商失败,可以尝试延长 timeout 看是否改善
ethtool eth0查看板端和对端的 PHY 协商能力是否与期望的一致,是否板端或者对端限制了自协商
uboot / kernel 无法 ping 通
使用第三方设备、线缆进行交叉验证,排除对端或者线缆问题,最好是直连测试,不要通过路由器或交换机
检查 uboot 是否正确设置了
ipaddr,确保和对端在同一网段,同时避免 IP 地址冲突检查 kernel 是否正确设置了 ip、子网掩码,确保和对端在同一网段,同时避免 IP 地址冲突
对端进行抓包分析
如果收到板端发出的 ARP 包,但是对端没有回 ARP包,需检查 IP 冲突问题
如果 ARP 包交互正常,可以收到 ICMP 包,但是没有回复 ICMP 包,需排查对端网络配置策略。例如确保 windows 防火墙关闭,是否开启 ICMP 入站规则等等。

丢包严重或者大量收发报错
分析方法
眼图测试信号质量是否满足要求。
确认 PHY 是否使能了 clock delay。
测量时钟是否稳定。
ethtool -S eth0 | grep crc可以统计由于 CRC 错误而丢弃的包,如果该值随着时间大量增加,大概率是信号完整性问题。