GMAC网口使用指南¶
REVISION HISTORY¶
| Revision No. | Description |
Date |
|---|---|---|
| 1.0 | 10/16/2024 | |
| 1.1 | 1/14/2025 | |
| 1.2 | 5/15/2025 | |
| 1.3 | 5/22/2026 |
1. 概述¶
Gigabit Media Access Control(千兆媒体访问控制)简称为GMAC,在以太网数据通信中主要负责对物理层和数据链路层之间进行控制和管理。
从硬件角度看:
硬件架构如图,有两个GMAC控制器: GMAC0和GMAC1
GMAC0: 支持RGMII外挂Gphy(千兆)、RMII外挂Ephy(百兆)
GMAC1: 支持RGMII外挂Gphy(千兆)、RMII外挂Ephy(百兆)

从软件角度看:
-
UBOOT
GMAC0: 默认使用RGMII,可切换为RMII
GMAC1: 默认使用RGMII,可切换为RMII
在UBOOT中,同一时刻只能选用一个GMAC,可通过ENV配置切换
-
KERNEL
GMAC0: 默认使用RGMII,可切换为RMII
GMAC1: 默认使用RGMII,可切换为RMII
在KERNEL中,可以同时使用两个GMAC
2. 关键字说明¶
-
GMAC
Gigabit Media Access Control (千兆媒体访问控制)简称为GMAC.
-
Gphy
Gigabit Ethernet Physical Layer (千兆以太网物理层) 简称为Gphy.
-
Ephy
Ethernet Physical Layer(以太网物理接口收发器)简称为Ephy.
-
MII
MII(Media Independent Interface)即媒体独立接口,MII接口是MAC与PHY连接的标准接口,MII接口提供了MAC与PHY之间的互联支持.
-
RMII
RMII(Reduced Media Independant Interface)即简化媒体独立接口,是标准的以太网接口之一,比MII有更少的I/O传输引脚.
-
RGMII
RGMII(Reduced Gigabit Media Independent Interface)即简化千兆媒体独立接口,是标准的以太网接口之一.是GMII的简化版本,将接口信号线数量从24根减少到14根.
-
RX
接收器(Receiver)或接收(Reception)。
-
TX
发射器(Transmitter)或传输(Transmission)。
3. GMAC 功能描述¶
3.1. FLOW CONTROL¶
数据在传输过程中容易出现数据丢失的现象,例如: 两台计算机通过串口传输数据时,或者台式机与单片机之间进行通信时,可能由于两端计算机的处理速度不同,出现接收端的数据缓冲区已满,而发送端依然继续发送数据,则导致数据丢失。
流控制(FLOW CONTROL)的出现就是为了解决这种数据丢失的问题。在全双工应用情形中,会通过PAUSE帧进行流控。
当接收端数据处理不过来时,就发出"不再接收"的信号(PAUSE帧),发送端就停止发送,直到收到"可以继续发送"的信号再发送数据。因此流控制可以控制数据传输的进程,防止数据的丢失。PAUSE帧即链路层实现流量控制的一个封包,由链路自动处理。
例如,当100M 网卡通过交换机向 10M 网卡发送数据帧的时候,10M 网卡由于速率的限制,会存在缓冲区爆掉导致的丢帧问题;10M网卡当发现自己缓冲区快爆掉之前可以发出一个PAUSE帧,请收到PAUSE的设备暂停一段时间再发包。
3.1.1. PAUSE 帧的格式¶
PAUSE帧的格式如下图所示:

如果是PAUSE_ON pkt, 则time_unit不为0。 当前默认都是 0xFFFF。
如果是PAUSE_OFF pkt, 则time_unit为0。 当收到PAUSE_OFF pkt时,则说明流控已经关闭,可以正常发送数据包了,即具有唤醒功能。
time-unit 是暂停传送时间参数,单位是当前速率下传输512bit的时间,即slot time;一些常用值可以在下表查看。
| value | 10M 暂停时间 | 100M 暂停时间 | 1000M 暂停时间 |
|---|---|---|---|
| 20 | 1ms | 100us | 10us |
| 200 | 10ms | 1ms | 100us |
| 2000 | 100ms | 10ms | 1ms |
| 20000 | 1s | 100ms | 10ms |
| 60000 | 3s | 300ms | 30ms |
| 65535 | 3.27s | 327ms | 32.7ms |
3.1.2. 如何启用关闭PAUSE¶
-
可以通过配置 dtsi 文件中的 disable-txfc 属性开关FLOW CONTROL TX, 默认设置为关闭。
gmac0 { …… disable-txfc = /bits/ 8 <1>; //最后的 <1> 表示关闭 FLOW CONTROL TX,设置为 <0> 则开启 FLOW CONTROL TX。 …… }; -
可以通过配置menuconfig中的SGS_SNPS_SW_TX_FLOW_CTL切换为软件flow_ctrl。默认不使能,使用hw flow control。
Device Drivers ---> Sgs SoC platform drivers ---> SGS GMAC ---> <*> SGS GMAC [ ] SGS_SNPS_SW_TX_FLOW_CTL -
可以通过ethtool控制, tx指的传输方向流控,表示eth0在传输流量时收到PAUSE帧,能否暂停传输;rx指的接收方向流控,表示eth0能否在接收流量时向对端发送PAUSE帧。
./ethtool -a eth0 => 显示当前的流控状态 ./ethtool -A eth0 rx on tx on => 打开tx rx 的流控 ./ethtool -A eth0 rx off tx off => 关闭tx rx 的流控
3.2. NETWORK STORM¶
广播风暴(broadcast storm):指广播数据充斥网络无法处理,占用大量网络带宽,导致正常业务不能运行,甚至彻底瘫痪。
针对该问题,可以开启网络风暴保护功能,网卡可以限制unicast、multicast和broadcast的收发带宽。针对广播风暴场景,选择使用对broadcast流量限制就能解决问题。
3.2.1. 封包的过滤速率¶
-
NETWORK STORM的理论限制速率 = RX_CLK / 过滤值(consume)。可以通过修改过滤值即可得到想要的限制速率。
-
在不同速率下,RX_CLK的值不同:
SPEED RX_CLK 1000 125MHz 100 25MHz 10 2.5MHz
因此当consume为2500时,100M 速率下的限制速率为 25MHz / 2500 = 10000 Packets/s。
此外, max 表示一开始可以全速收 (max / consume) 个封包。当收满这么多封包后,之后的收包速率按照上文描述的 (RX_CLK / consume)。
3.2.2. 过滤值配置参考¶
当前提供五个可供参考的配置挡位,在不同情况下的限制速率如下:
| level | consume | 1000M下限制速率 Packets/s | 100M下限制速率 Packets/s | 10M下限制速率 Packets/s |
|---|---|---|---|---|
| 1 | 2500 | 50000 | 10000 | 1000 |
| 2 | 5000 | 25000 | 5000 | 500 |
| 3 | 10000 | 12500 | 2500 | 250 |
| 4 | 20000 | 6250 | 1250 | 125 |
| 5 | 40000 | 3125 | 625 | 62.5 |
实际过滤效果会略有误差。可以根据实际使用表现调整consume。
3.2.3. 使用寄存器启用网络风暴保护¶
当前默认未开启网络风暴保护,需要通过配置寄存器启用网络风暴保护。
3.2.3.1. gmac0¶
-
unicast 单包保护
/customer/riu_w 1510 10 9C40 //最大值 max 低16位 /customer/riu_w 1510 11 0000 //最大值 max 高16位 /customer/riu_w 1510 12 9C40 //过滤值 counsume 低16位 [15,0] /customer/riu_w 1510 13 0000 //过滤值 counsume 高12位 [27,16] /customer/riu_w 1510 28 0001 //bit 0 使能 -
multicast 多包保护
/customer/riu_w 1510 18 9C40 //最大值 max 低16位 /customer/riu_w 1510 19 0000 //最大值 max 高16位 /customer/riu_w 1510 1a 9C40 //过滤值 counsume 低16位 [15,0] /customer/riu_w 1510 1b 0000 //过滤值 counsume 高12位 [27,16] /customer/riu_w 1510 28 0002 //bit 1 使能 -
broadcast 广播包保护
/customer/riu_w 1510 20 9C40 //最大值 max 低16位 /customer/riu_w 1510 21 0000 //最大值 max 高16位 /customer/riu_w 1510 22 9C40 //过滤值 counsume 低16位 [15,0] /customer/riu_w 1510 23 0000 //过滤值 counsume 高12位 [27,16] /customer/riu_w 1510 28 0004 //bit 2 使能
3.2.3.2. gmac1¶
-
unicast 单包保护
/customer/riu_w 1513 10 9C40 //最大值 max 低16位 /customer/riu_w 1513 11 0000 //最大值 max 高16位 /customer/riu_w 1513 12 9C40 //过滤值 counsume 低16位 [15,0] /customer/riu_w 1513 13 0000 //过滤值 counsume 高12位 [27,16] /customer/riu_w 1513 28 0001 //bit 0 使能 -
multicast 多包保护
/customer/riu_w 1513 18 9C40 //最大值 max 低16位 /customer/riu_w 1513 19 0000 //最大值 max 高16位 /customer/riu_w 1513 1a 9C40 //过滤值 counsume 低16位 [15,0] /customer/riu_w 1513 1b 0000 //过滤值 counsume 高12位 [27,16] /customer/riu_w 1513 28 0002 //bit 1 使能 -
broadcast 广播包保护
/customer/riu_w 1513 20 9C40 //最大值 max 低16位 /customer/riu_w 1513 21 0000 //最大值 max 高16位 /customer/riu_w 1513 22 9C40 //过滤值 counsume 低16位 [15,0] /customer/riu_w 1513 23 0000 //过滤值 counsume 高12位 [27,16] /customer/riu_w 1513 28 0004 //bit 2 使能
3.3. IPV6¶
kernel提供了ipv6功能,如果需要使用IPV6功能,需要开启对应的CONFIG, (默认开启) 。
- kernel 中打开 ipv6 支持
-> Networking support (NET [=y]) -> Networking options -> TCP/IP networking (INET [=y]) <*> The IPv6 protocol
4. 硬件连接介绍¶
以 mhera-ssm004a-s01a gmac0为例, RGMII/RMII接线如下图:

5. Uboot用法介绍¶
5.1. uboot config 配置说明¶
- 启用或者关闭 GMAC config 配置路径。
Sgs drivers ---> (SGS_DRIVERS [=y]) Sgs GMAC ---> [*] Sgs GMAC
5.2. Dts配置 & Padmux配置¶
5.2.1 Dts配置¶
以mhera为例,GMAC0的DTS需要根据实际使用,在对应的chipname.dtsi中配置信息:
gmac0: gmac0 {
compatible = "sgs,gmac","snps,dwmac-5.10a";
reg = <0x1F34A000 0x1300>;
gmac-bank = <0x1A50>, <0x1A51>, <0x1A52>, <0x1A53>, <0x1A54>, <0x1A55>, <0x1A56>, <0x1A57>;
gmac-id = <0>;
clock-names = "gmac-clk", "mclk";
mclk = /bits/ 8 <25>; // Mclk frequency : 0, 25M, 50M
mclk-refmode = /bits/ 8 <1>; //mclk padmux : 1 or 2
reset-io = /bits/ 8 <PAD_RGMII0_RSTN>;
phy-mode = "rgmii";
max-speed = <1000>;
status = "okay";
};
DTS配置说明:
| 属性 | 描述 | 设定值 |
|---|---|---|
| compatible | 属性信息,驱动版本信息 | |
| reg | 寄存器映射的物理地址 | |
| gmac-bank | 寄存器对应的bank地址 | |
| gmac-id | gmac 编号 | |
| clocks-name | gmac 使用到的clock 名字 | |
| mclk | 配置是否输出mclk(若想省PHY的外挂晶振,可让主控芯片产生时钟给PHY) | 0: 不输出;25: 输出25MHz |
| mclk-refmode | 指定要输出的PAD,1 : RGMIIX_MCLK, 2: RGMIIX_RSTN。 | <1>/<2> |
| reset-io | 指定给phy做reset的io引脚 | <PAD_RGMII0_RSTN>/<PAD_RGMII0_MCLK> |
| phy-mode | phy 接口提供三种接口选择(需要结合概述中描述的规格) | "rmii"/"rgmii" |
| max-speed | 限制自协商下的最大速率,三个档位选择 | <10>/<100>/<1000> |
| status | Driver 开关 | "ok"/"disabled" |
- mclk-refmode当前仅支持 RGMIIX_MCLK 输出。
5.2.2 Padmux配置¶
需要根据选择的引脚在对应的padmux.dtsi中加入如下所示的代码:
-
GMAC0的RGMII PADMUX配置:
// GMAC0 RGMII <PAD_RGMII0_RSTN PINMUX_FOR_GPIO_MODE MDRV_PUSE_ETH0_PHY_RESET>, <PAD_RGMII0_MCLK PINMUX_FOR_RGMII0_MCLK_MODE_1 MDRV_PUSE_ETH0_MCLK>, <PAD_RGMII0_RXCLK PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_RX_CLK>, <PAD_RGMII0_RXCTL PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_RX_CTL>, <PAD_RGMII0_RXD0 PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_RXD0>, <PAD_RGMII0_RXD1 PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_RXD1>, <PAD_RGMII0_RXD2 PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_RXD2>, <PAD_RGMII0_RXD3 PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_RXD3>, <PAD_RGMII0_TXCLK PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_TX_CLK>, <PAD_RGMII0_TXCTL PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_TX_CTL>, <PAD_RGMII0_TXD0 PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_TXD0>, <PAD_RGMII0_TXD1 PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_TXD1>, <PAD_RGMII0_TXD2 PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_TXD2>, <PAD_RGMII0_TXD3 PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_TXD3>, <PAD_RGMII0_MDIO PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_MDIO>, <PAD_RGMII0_MDC PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_MDC>, -
GMAC0的RMII PADMUX配置:
// GMAC0 RMII <PAD_RGMII0_RSTN PINMUX_FOR_GPIO_MODE MDRV_PUSE_ETH0_PHY_RESET>, <PAD_RGMII0_RXCLK PINMUX_FOR_RMII0_MODE_1 MDRV_PUSE_ETH0_RX_CLK>, <PAD_RGMII0_RXCTL PINMUX_FOR_RMII0_MODE_1 MDRV_PUSE_ETH0_RX_CTL>, <PAD_RGMII0_RXD0 PINMUX_FOR_RMII0_MODE_1 MDRV_PUSE_ETH0_RXD0>, <PAD_RGMII0_RXD1 PINMUX_FOR_RMII0_MODE_1 MDRV_PUSE_ETH0_RXD1>, <PAD_RGMII0_TXCTL PINMUX_FOR_RMII0_MODE_1 MDRV_PUSE_ETH0_TX_CTL>, <PAD_RGMII0_TXD0 PINMUX_FOR_RMII0_MODE_1 MDRV_PUSE_ETH0_TXD0>, <PAD_RGMII0_TXD1 PINMUX_FOR_RMII0_MODE_1 MDRV_PUSE_ETH0_TXD1>, <PAD_RGMII0_MDIO PINMUX_FOR_RMII0_MODE_1 MDRV_PUSE_ETH0_MDIO>, <PAD_RGMII0_MDC PINMUX_FOR_RMII0_MODE_1 MDRV_PUSE_ETH0_MDC>, -
GMAC1的RGMII PADMUX配置:
// GMAC1 RGMII <PAD_RGMII1_RSTN PINMUX_FOR_GPIO_MODE MDRV_PUSE_ETH1_PHY_RESET>, <PAD_RGMII1_MCLK PINMUX_FOR_RGMII1_MCLK_MODE_1 MDRV_PUSE_ETH1_MCLK>, <PAD_RGMII1_RXCLK PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_RX_CLK>, <PAD_RGMII1_RXCTL PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_RX_CTL>, <PAD_RGMII1_RXD0 PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_RXD0>, <PAD_RGMII1_RXD1 PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_RXD1>, <PAD_RGMII1_RXD2 PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_RXD2>, <PAD_RGMII1_RXD3 PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_RXD3>, <PAD_RGMII1_TXCLK PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_TX_CLK>, <PAD_RGMII1_TXCTL PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_TX_CTL>, <PAD_RGMII1_TXD0 PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_TXD0>, <PAD_RGMII1_TXD1 PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_TXD1>, <PAD_RGMII1_TXD2 PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_TXD2>, <PAD_RGMII1_TXD3 PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_TXD3>, <PAD_RGMII1_MDIO PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_MDIO>, <PAD_RGMII1_MDC PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_MDC>, -
GMAC1的RMII PADMUX配置:
// GMAC1 RMII <PAD_RGMII1_RSTN PINMUX_FOR_GPIO_MODE MDRV_PUSE_ETH1_PHY_RESET>, <PAD_RGMII1_RXCLK PINMUX_FOR_RMII1_MODE_1 MDRV_PUSE_ETH1_RX_CLK>, <PAD_RGMII1_RXCTL PINMUX_FOR_RMII1_MODE_1 MDRV_PUSE_ETH1_RX_CTL>, <PAD_RGMII1_RXD0 PINMUX_FOR_RMII1_MODE_1 MDRV_PUSE_ETH1_RXD0>, <PAD_RGMII1_RXD1 PINMUX_FOR_RMII1_MODE_1 MDRV_PUSE_ETH1_RXD1>, <PAD_RGMII1_TXCTL PINMUX_FOR_RMII1_MODE_1 MDRV_PUSE_ETH1_TX_CTL>, <PAD_RGMII1_TXD0 PINMUX_FOR_RMII1_MODE_1 MDRV_PUSE_ETH1_TXD0>, <PAD_RGMII1_TXD1 PINMUX_FOR_RMII1_MODE_1 MDRV_PUSE_ETH1_TXD1>, <PAD_RGMII1_MDIO PINMUX_FOR_RMII1_MODE_1 MDRV_PUSE_ETH1_MDIO>, <PAD_RGMII1_MDC PINMUX_FOR_RMII1_MODE_1 MDRV_PUSE_ETH1_MDC>,
5.2.3 Dts 配置成RGMII(外挂Gphy RTL8211)¶
-
GMAC0配置为rgmii
修改"gmac0"dts node,将phy-mode 修改为"rgmii",设定示例如下:

图5-1 UBOOT GMAC0 RGMII DTS(默认如此) 放开"gmac0"的pinmux,设定如下图,需要改为"#if 1":

图5-2 UBOOT GMAC0 RGMII PINMUX(默认如此) -
GMAC1配置为rgmii
修改"gmac1"dts node,将phy-mode 修改为"rgmii",设定示例如下图:

图5-3 UBOOT GMAC1 RGMII DTS 放开"gmac1"的pinmux,设定如下图,需要改为"#if 1":

图5-4 UBOOT GMAC1 RGMII PINMUX
5.2.3.1 CONFIG 配置¶
RTL8211 默认使用Generic PHY Driver,无需启用config。以GMAC0 RGMII为例,按照图5-1和图5-2配置即可正常使用。
5.2.3.2 PHY DRIVER 路径¶
5.2.4 Dts 配置成RMII (外挂Ephy)¶
-
GMAC0配置为rmii
修改"gmac0"dts node,将phy-mode 修改为"rmii",max-speed =
<100>,设定示例如下图:
图5-5 UBOOT GMAC0 RMII DTS 放开"gmac0"的pinmux,设定如下图,需要改为"#if 1":

图5-6 UBOOT GMAC0 RMII PINMUX -
GMAC1配置为rmii
修改"gmac1"dts node,将phy-mode 修改为"rmii",max-speed =
<100>,设定示例如下图:
图5-7 UBOOT GMAC1 RMII DTS 放开"gmac1"的pinmux,设定如下图,需要改为"#if 1":

图5-8 UBOOT GMAC1 RMII PINMUX
5.2.4.1 CONFIG 配置¶
若使用的PHY无特别要求可以使用默认的Generic PHY Driver,无需启用config。
5.2.4.2 PHY DRIVER 路径¶
5.3. Uboot cmd参数说明¶
Uboot 下网络主要使用到ping dhcp tftp 命令,在使用这些命令之前需要配置网络使用的环境变量
5.3.1 ENV配置使用GMAC0的静态IP¶
setenv -f ethact gmac0
setenv -f ethaddr xx:xx:xx:xx:xx:xx
setenv -f ipaddr xxx.xxx.xxx.xxx
setenv -f netmask xxx.xxx.xxx.xxx
setenv -f serverip xxx.xxx.xxx.xxx
5.3.2 ENV配置使用GMAC1的静态IP¶
setenv -f ethact gmac1
setenv -f eth1addr xx:xx:xx:xx:xx:xx
setenv -f ipaddr xxx.xxx.xxx.xxx
setenv -f netmask xxx.xxx.xxx.xxx
setenv -f serverip xxx.xxx.xxx.xxx
5.3.3 ENV配置使用GMAC0的动态IP¶
5.3.4 ENV配置使用GMAC1的动态IP¶
5.4 Uboot cmd使用实例¶
5.4.1 Ping cmd 演示¶
# set -f ethaddr 00:00:83:94:00:01
# set -f serverip 10.21.2.38
# set -f ipaddr 10.24.16.142
# save
# ping 10.21.2.38
Using gmac0 device
host 10.21.2.38 is alive
5.4.2 dhcp cmd 演示¶
# set -f ethaddr 00:00:83:94:00:01
# set -f serverip 10.21.2.38
# save
Saving Environment to NAND...
ENV: offset = 0x500000 size = 0x40000
Erasing NAND...
Erasing at 0x520000 -- 100% complete.
Writing to NAND... OK
OK
# dhcp
gmac0 Waiting for PHY auto negotiation to complete....... done
BOOTP broadcast 1
BOOTP broadcast 2
BOOTP broadcast 3
BOOTP broadcast 4
BOOTP broadcast 5
BOOTP broadcast 6
DHCP client bound to address 10.24.16.142 (5778 ms)
5.4.3 tftp cmd 演示¶
# tftp 0x21000000 boot.bin
Using gmac0 device
TFTP from server 10.21.2.38; our IP address is 10.24.16.142; sending through gateway 10.24.16.254
Filename 'boot.bin'.
Load address: 0x21000000
Loading: T #################################################################
##################################
237.3 KiB/s
done
Bytes transferred = 1441792 (160000 hex)
6. Kernel用法介绍¶
6.1. Kernel Config配置¶
-
GMAC 模块需要启用STMICRO & SGS GMAC
-
STMICRO (默认启用)

图6-1 KNENEL STMICRO -
SGS GMAC(默认启用)

图6-2 KNENEL SGS GMAC
6.2. Dts 配置参数说明¶
-
gmac0 dts 节点 :
gmac0 { compatible = "sgs,gmac","snps,dwmac-5.10a"; //interrupts = <GIC_SPI INT_IRQ_NET_GP_TOP0 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI INT_IRQ_GMAC0 IRQ_TYPE_LEVEL_HIGH>; interrupt-names = "macirq"; reg = <0x0 0x1F34A000 0x1300>; reset-io = /bits/ 8 <PAD_RGMII0_RSTN>; gmac-id = <0>; gmac-bank = <0x1A50>, <0x1A51>, <0x1A52>, <0x1A53>, <0x1A54>, <0x1A55>, <0x1A56>, <0x1A57>; mclk = /bits/ 8 <25>; // Mclk frequency : 0, 25M, 50M disable-txfc = /bits/ 8 <1>; clocks = <&CLK_gmac0_gmii>, <&CLK_gphy0_ref>; clock-names = "gmac-clk", "mclk"; snps,tso; phy-handle = <&phy0>; phy-mode = "rgmii"; max-speed = <1000>; //snps,txpbl = <16>; //snps,rxpbl = <16>; //snps,aal; status = "ok"; mdio-bus@gmac0 { compatible = "snps,dwmac-mdio"; phy0: ethernet-phy@0 { }; }; }; -
gmac1 dts 节点 :
gmac1 { compatible = "sgs,gmac","snps,dwmac-5.10a"; //interrupts = <GIC_SPI INT_IRQ_NET_GP_TOP0 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI INT_IRQ_GMAC1 IRQ_TYPE_LEVEL_HIGH>; interrupt-names = "macirq"; reg = <0x0 0x1F34B400 0x1300>; reset-io = /bits/ 8 <PAD_RGMII1_RSTN>; gmac-id = <1>; gmac-bank = <0x1A5A>, <0x1A5B>, <0x1A5C>, <0x1A5D>, <0x1A5E>, <0x1A5F>, <0x1A60>, <0x1A61>; mclk = /bits/ 8 <25>; // Mclk frequency : 0, 25M, 50M disable-txfc = /bits/ 8 <1>; clocks = <&CLK_gmac1_gmii>, <&CLK_gphy1_ref>; clock-names = "gmac-clk", "mclk"; snps,tso; phy-handle = <&phy1>; phy-mode = "rgmii"; max-speed = <1000>; //snps,txpbl = <16>; //snps,rxpbl = <16>; //snps,aal; status = "disabled"; mdio-bus@gmac1 { compatible = "snps,dwmac-mdio"; phy1: ethernet-phy@1 { }; }; }; -
gmac dts 节点如上展示,释义分别为:
参数 释义 备注 compatible 属性信息,驱动版本信息 interrupts 中断脚 interrupt-names 中断名 reg 寄存器映射的物理地址 reset-io phy reset pin gmac-id gmac编号 gmac-bank 寄存器对应的bank 地址 mclk 配置是否输出mclk 0: 不输出;25: 输出25MHz disable-txfc 是否关闭硬件流控 1: 关闭;0: 启用 enable-eee 是否开启EEE功能 1: 启用;0: 关闭 clocks gmac 使用到的clock节点 clocks-name gmac 使用到的clock 名字 snps,tso 使能TSO,即TCP Segment Offload 注释该行则关闭TSO phy-handle phy节点 phy-mode phy 接口提供三种接口选择 "rmii"/"rgmii" max-speed 限制自协商下的最大速率,三个档位选择 <10>/<100>/<1000>snps,txpbl snps设置tx burst snps,rxpbl snps设置rx burst snps,aal 地址对齐 (Address-Aligned) status Driver 开关 "ok"/"disabled" -
mclk-refmode当前仅支持 RGMIIX_MCLK 输出。
-
强制speed和全/半双工,需要通过添加fixed-link控制,具有以下内容:
参数 释义 备注 speed 表示连接速度有10、100、1000供选择 整数,必填 full-duplex 表示是否全双工,如果不填代表半双工 可选 pause 表示启用asym-pause 可选 link-gpios 表示是否可以读取gpio来确定链接是否正常 "gpio-list", 可选 例如:
fixed-link { speed = <100>; full-duplex; pause; }以上例子表示强制100M 全双工。
注意:
RMII 接百兆switch,一定要force 100 full-duplex
RGMII 接千兆switch,一定要force 1000 full-duplex
-
mclk(若想省PHY的外挂晶振,可让主控芯片产生时钟给PHY)
mclk: 可指定的频率,0: 不出clock,25: 输出25MHz
mclk信号通过PAD_RGMII0_MCLK输出
-
disable-txfc: 是否关闭硬件tx flow control
<0>: 启用tx flow control<1>: 关闭tx flow control
6.3 Padmux配置¶
需要根据选择的引脚在对应的padmux.dtsi中加入如下所示的代码:
-
GMAC0的RGMII PADMUX配置:
// GMAC0 RGMII <PAD_RGMII0_RSTN PINMUX_FOR_GPIO_MODE MDRV_PUSE_ETH0_PHY_RESET>, <PAD_RGMII0_MCLK PINMUX_FOR_RGMII0_MCLK_MODE_1 MDRV_PUSE_ETH0_MCLK>, <PAD_RGMII0_RXCLK PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_RX_CLK>, <PAD_RGMII0_RXCTL PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_RX_CTL>, <PAD_RGMII0_RXD0 PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_RXD0>, <PAD_RGMII0_RXD1 PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_RXD1>, <PAD_RGMII0_RXD2 PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_RXD2>, <PAD_RGMII0_RXD3 PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_RXD3>, <PAD_RGMII0_TXCLK PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_TX_CLK>, <PAD_RGMII0_TXCTL PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_TX_CTL>, <PAD_RGMII0_TXD0 PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_TXD0>, <PAD_RGMII0_TXD1 PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_TXD1>, <PAD_RGMII0_TXD2 PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_TXD2>, <PAD_RGMII0_TXD3 PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_TXD3>, <PAD_RGMII0_MDIO PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_MDIO>, <PAD_RGMII0_MDC PINMUX_FOR_RGMII0_MODE_1 MDRV_PUSE_ETH0_MDC>, -
GMAC0的RMII PADMUX配置:
// GMAC0 RMII <PAD_RGMII0_RSTN PINMUX_FOR_GPIO_MODE MDRV_PUSE_ETH0_PHY_RESET>, <PAD_RGMII0_RXCLK PINMUX_FOR_RMII0_MODE_1 MDRV_PUSE_ETH0_RX_CLK>, <PAD_RGMII0_RXCTL PINMUX_FOR_RMII0_MODE_1 MDRV_PUSE_ETH0_RX_CTL>, <PAD_RGMII0_RXD0 PINMUX_FOR_RMII0_MODE_1 MDRV_PUSE_ETH0_RXD0>, <PAD_RGMII0_RXD1 PINMUX_FOR_RMII0_MODE_1 MDRV_PUSE_ETH0_RXD1>, <PAD_RGMII0_TXCTL PINMUX_FOR_RMII0_MODE_1 MDRV_PUSE_ETH0_TX_CTL>, <PAD_RGMII0_TXD0 PINMUX_FOR_RMII0_MODE_1 MDRV_PUSE_ETH0_TXD0>, <PAD_RGMII0_TXD1 PINMUX_FOR_RMII0_MODE_1 MDRV_PUSE_ETH0_TXD1>, <PAD_RGMII0_MDIO PINMUX_FOR_RMII0_MODE_1 MDRV_PUSE_ETH0_MDIO>, <PAD_RGMII0_MDC PINMUX_FOR_RMII0_MODE_1 MDRV_PUSE_ETH0_MDC>, -
GMAC1的RGMII PADMUX配置:
// GMAC1 RGMII <PAD_RGMII1_RSTN PINMUX_FOR_GPIO_MODE MDRV_PUSE_ETH1_PHY_RESET>, <PAD_RGMII1_MCLK PINMUX_FOR_RGMII1_MCLK_MODE_1 MDRV_PUSE_ETH1_MCLK>, <PAD_RGMII1_RXCLK PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_RX_CLK>, <PAD_RGMII1_RXCTL PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_RX_CTL>, <PAD_RGMII1_RXD0 PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_RXD0>, <PAD_RGMII1_RXD1 PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_RXD1>, <PAD_RGMII1_RXD2 PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_RXD2>, <PAD_RGMII1_RXD3 PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_RXD3>, <PAD_RGMII1_TXCLK PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_TX_CLK>, <PAD_RGMII1_TXCTL PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_TX_CTL>, <PAD_RGMII1_TXD0 PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_TXD0>, <PAD_RGMII1_TXD1 PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_TXD1>, <PAD_RGMII1_TXD2 PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_TXD2>, <PAD_RGMII1_TXD3 PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_TXD3>, <PAD_RGMII1_MDIO PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_MDIO>, <PAD_RGMII1_MDC PINMUX_FOR_RGMII1_MODE_1 MDRV_PUSE_ETH1_MDC>, -
GMAC1的RMII PADMUX配置:
// GMAC1 RMII <PAD_RGMII1_RSTN PINMUX_FOR_GPIO_MODE MDRV_PUSE_ETH1_PHY_RESET>, <PAD_RGMII1_RXCLK PINMUX_FOR_RMII1_MODE_1 MDRV_PUSE_ETH1_RX_CLK>, <PAD_RGMII1_RXCTL PINMUX_FOR_RMII1_MODE_1 MDRV_PUSE_ETH1_RX_CTL>, <PAD_RGMII1_RXD0 PINMUX_FOR_RMII1_MODE_1 MDRV_PUSE_ETH1_RXD0>, <PAD_RGMII1_RXD1 PINMUX_FOR_RMII1_MODE_1 MDRV_PUSE_ETH1_RXD1>, <PAD_RGMII1_TXCTL PINMUX_FOR_RMII1_MODE_1 MDRV_PUSE_ETH1_TX_CTL>, <PAD_RGMII1_TXD0 PINMUX_FOR_RMII1_MODE_1 MDRV_PUSE_ETH1_TXD0>, <PAD_RGMII1_TXD1 PINMUX_FOR_RMII1_MODE_1 MDRV_PUSE_ETH1_TXD1>, <PAD_RGMII1_MDIO PINMUX_FOR_RMII1_MODE_1 MDRV_PUSE_ETH1_MDIO>, <PAD_RGMII1_MDC PINMUX_FOR_RMII1_MODE_1 MDRV_PUSE_ETH1_MDC>,
6.4. Dts 节点PHY 切换示例¶
6.4.1 KERNEL GMAC RGMII(外挂Gphy RTL8211)¶
-
DTS 配置: 用法与UBOOT一致,phy-mode配置rgmii,max-speed配置为1000,pinmux需要放开
-
CONFIG 配置: RTL8211 默认使用Generic PHY Driver,无需特别开启
-
PHY Driver路径: drivers/net/phy/phy_device.c
6.4.2 KERNEL GMAC RMII(外挂Ephy)¶
-
DTS 配置: 用法与UBOOT一致,phy-mode配置rmii,max-speed配置为100,pinmux需要放开
-
CONFIG 配置: 若使用的PHY 无特别要求,则默认使用Generic PHY Driver即可
-
PHY Driver路径: drivers/net/phy/phy_device.c
6.5. Kernel 模块化配置¶
6.5.1 Kernel Config配置¶
-
gmac相关: 设置 SGS_GMAC = m,参考如下配置,编译后会生成sgs_gmac.ko

图6-4 SGS_GMAC modular -
stmmac: 设置 STMMAC_ETH = m 和 STMMAC_PLATFORM = m,参考如下配置,编译后会生成phylink.ko/mii.ko/stmmac.ko/stmmac-platform.ko

图6-5 STMMAC_ETH modular 
图6-6 STMMAC_PLATFORM modular
6.5.2 ko加载顺序¶
insmod stmmac.ko
insmod stmmac-platform.ko
insmod sgs_gmac.ko
6.6. Kernel cmd 使用实例¶
-
查看所有网卡信息
ifconfig -a -
eth0网卡使能
ifconfig eth0 up -
配置网卡eth0的mac地址为 00:00:83:94:40:01
ifconfig eth0 hw ether 00:00:83:94:40:01 -
配置网卡eth0的静态ip地址为 40.1.1.1/24
ifconfig eth0 40.1.1.1 netmask 255.255.255.0 -
网卡eth0 dhcp获取ip
udhcpc -i eth0 -s /etc/init.d/udhcpc.script -
挂载nfs目录
mount -t nfs -o nolock xxx.xxx.xxx.xxx:/c/nfs /mnt参数 说明 xxx.xxx.xxx.xxx nfs服务器ip地址 /c/nfs nfs服务器的目录路径 /mnt 将nfs目录 挂载在设备的 /mnt 路径 -
挂载cifs目录
mount -t cifs //xxx.xxx.xxx.xxx/cifs /mnt -o username=xxx,password=xxx,sec=ntlm,iocharset=utf8,vers=1.0参数 说明 xxx.xxx.xxx.xxx cifs服务器ip地址 /cifs cifs服务器的共享目录路径 /mnt 将cifs目录 挂载在设备的 /mnt 路径 -
tftp get
tftp -g xxx.xxx.xxx.xxx -r kernel参数 说明 -g xxx.xxx.xxx.xxx 从 server_ip xxx.xxx.xxx.xxx 获取文件 -r file_name 需要从Server获取的文件名 -
tftp put
tftp -p xxx.xxx.xxx.xxx -r kernel参数 说明 -p xxx.xxx.xxx.xxx 向 xxx.xxx.xxx.xxx 传输文件 -r file_name 需要传输给Server的文件名
6.7. 常用第三方工具和常用命令¶
6.7.1. iperf3¶
-
iperf3 服务端模式
./iperf3 -s -i 1选项 说明 -s 服务端模式 -i 1 打印回显间隔(单位: 秒),这里是 1秒 -
iperf3 客户端模式
./iperf3 -c xxx.xxx.xxx.xxx -i 1 -t 36000 -b 95M选项 说明 -c 客户端模式 xxx.xxx.xxx.xxx 对端的ip地址 -i 1 打印回显间隔,单位 秒,这里是 1秒 -t 36000 打流时间,单位 秒,最高 86400 (24小时) -b 95M 打流速率 95Mbits/sec
6.7.2. tcpdump¶
-
使用 tcpdump 捕获eth0 网卡的报文并缓存到 pkt.cap
./tcpdump -s 0 -i eth0 -w /tmp/pkt.cap选项 说明 -s 0 指定抓包大小,0表示不限制 -i eth0 表示连接的接口,any表示所有接口 -w /tmp/pkt.cap 表示抓的包写到指定path中。文件为.pcap
6.7.3. ethtool¶
-
查看 eth0 网卡信息
ethtool eth0 -
切换 eth0 的网卡速率和双工模式
ethtool -s eth0 speed 100 duplex full -
开启/关闭 eth0 自协商
ethtool -s eth0 autoneg on/off -
开启流控 Flow Control
ethtool -A eth0 rx on tx on -
查看 eth0 收包 statistics
ethtool -S eth0
6.7.4. phytool¶
-
读取phy reg的值
read IFACE/ADDR/REG选项 说明 IFACE eth0 or eth1 ADDR mdio bus 上的位置 REG 读取的phy reg eg: 读取 eth0 addr0 reg2
phytool read eth0/0/2 -
往phy reg 写入值
write IFACE/ADDR/REG <0-0xffff>参数 说明 IFACE eth0 or eth1 ADDR mdio bus 上的位置 REG 写入的phy reg <0-0xffff>要写入的值 eg: 写入 eth0 的 loopback bit
phytool write eth0/0/0 4000
6.8. 常用DEBUG节点使用方法¶
6.8.1. phy_wr phy读写 debug节点¶
- Usage
# cat phy_wr Usage: echo phy_r phyid phyaddress > phy_wr echo phy_w phyid phyaddress phyvalue > phy_wr eg: / # echo phy_r 0 0 > /proc/gmac_0/phy_wr phy_r phy_id[0] address[0] value[1040] / # echo phy_w 0 0 0x1000 > /proc/gmac_0/phy_wr phy_w phy_id[0] address[0] value[1000] / # echo phy_r 0 0 > /proc/gmac_0/phy_wr phy_r phy_id[0] address[0] value[1000]
6.8.2. driving 驱动能力调试节点¶
-
Uboot Usage
gmac drv <gmac number> <io index> <gear> <gmac number> = 0: gmac0 , 1: gmac1 <io index> = from 0 to 7 mapping to GMAC_MDC, GMAC_MDIO, GMAC_RGMII_TX_CLK, GMAC_RGMII_TX_D0, GMAC_RGMII_TX_D1, GMAC_RGMII_TX_D2, GMAC_RGMII_TX_D3, GMAC_RGMII_TX_CTL, GMAC_RGMII_MCLK, <gear> = driving gear, from 0 to (4 or 15) eg: # gmac drv 0 3 2 GMAC[0] : RGMII_TX_CLK driving changed to gear 2 -
Kernel Usage
cat driving => show current driving echo [io_idx] [gear] > driving => Set the [io_idx] to [gear] level, 0 <= gear < 4 eg: / # cat /proc/gmac_0/driving gmac0 driving: index 0 MDC = 1 index 1 MDIO = 1 index 2 MCLK = 0 index 3 RGMII_TX_CLK = 1 index 4 RGMII_TX_D0 = 1 index 5 RGMII_TX_D1 = 1 index 6 RGMII_TX_D2 = 1 index 7 RGMII_TX_D3 = 1 index 8 RGMII_TX_CTL = 1 / # echo 3 2 > /proc/gmac_0/driving RGMII_TX_CLK driving = 2 / # cat /proc/gmac_0/driving gmac0 driving: index 0 MDC = 1 index 1 MDIO = 1 index 2 MCLK = 0 index 3 RGMII_TX_CLK = 2 index 4 RGMII_TX_D0 = 1 index 5 RGMII_TX_D1 = 1 index 6 RGMII_TX_D2 = 1 index 7 RGMII_TX_D3 = 1 index 8 RGMII_TX_CTL = 1
7. API参考¶
GMAC无对外API
8. FAQ¶
Q1: 启机无法扫到phy
该问题根因是 mdio读写异常 或 phy 初始化失败,因此有以下几点排查:
-
检查padmux.dtsi中RMII/RGMII的引脚配置是否打开,并且确认引脚配置是否有冲突。
-
确认使用的phy的reset时序。同时需确认保持电平的时间是否符合phy要求
-
若使用的phy非公版支持,则需要找对应phy厂商确认是否需要专用的phy驱动支持
-
检查硬件接线是否正确,有无接错、虚焊、短接等等情况
Q2: 设备出现丢包多,网络速率上不去现象
-
需检查设备和对端的link mode是否一致,可通过"./ethtool eth0"命令查看当前的phy link mode
-
需检查网线物理连接是否松动,以及网线本身质量是否合格
-
检查网络环境是否正常,如是否开启了防火墙,是否中转设备(路由器, 交换机)有做了影响带宽的qos策略等等。可以改为直连环境验证排查(如DUT直连PC)。
-
检查设备的cpu负载是否过大,使得设备无法及时处理网络报文导致丢包。
-
检查信号质量,可以通过配置对应的phy寄存器,调整phy端驱动能力。