以太网 GMAC 驱动
1. 概述
1.1 功能简介
GMAC(Gigabit Media Access Control)千兆以太网控制器,是嵌入式系统中最常用的有线网络接口。RK3576 内置 GMAC 控制器,支持 10/100/1000Mbps 自适应以太网,支持 RGMII/RMII 接口模式,适用于网络通信、工业控制、数据传输等场景。M4-R2 底板提供 2 路千兆以太网接口(RJ45,eth0/eth1)。
1.2 应用场景
- 网络通信:有线以太网连接,支持 TCP/IP 协议栈
- 工业控制:工业以太网通信(Modbus TCP、PROFINET)
- 数据传输:高速数据采集和传输
- 远程管理:通过网络进行远程调试和管理
- NAS 存储:网络附加存储服务
1.3 工作原理
RK3576 的 GMAC 控制器支持以下特性:
| 特性 | 说明 |
|---|---|
| 速率 | 10/100/1000Mbps 自适应 |
| 接口 | RGMII / RMII |
| PHY | 支持外部 PHY 芯片 |
| DMA | 支持 DMA 传输 |
| TSO | 支持 TCP Segmentation Offload |
| VLAN | 支持 802.1Q VLAN 标记 |
详见 RK 官方文档:[《Rockchip_Developer_Guide_Linux_Software_CN.pdf》]
2. 硬件准备
2.1 硬件清单
| 组件 | 型号/规格 | 数量 | 备注 |
|---|---|---|---|
| 主控板 | C-3576BQ 核心板 + M4-R2 底板 | 1 | |
| 调试串口线 | USB 转 TTL(3.3V) | 1 | 波特率 1500000 |
| 网线 | CAT5e/CAT6 | 1 | 用于以太网连接 |
| 路由器/交换机 | 任意 | 1 | 用于网络测试 |
2.2 引脚连接
M4-R2 底板已集成 2 路 RJ45 千兆网口(含网络变压器和 PHY 芯片),直接连接网线即可。
| 主控板引脚 | RJ45 引脚 | 功能说明 |
|---|---|---|
| GMAC_TXD[0:3] | TX+/- | 发送数据 |
| GMAC_RXD[0:3] | RX+/- | 接收数据 |
| GMAC_TX_CLK | — | 发送时钟 |
| GMAC_RX_CLK | — | 接收时钟 |
| GMAC_TX_EN | — | 发送使能 |
| GMAC_CRS_DV | — | 载波侦听 |
网口 PHY 芯片型号和连接方式详见底板原理图(S-04)。
2.3 硬件确认
# 查看网络接口
ip link show
# 输出示例:eth0: <BROADCAST,MULTICAST,UP> ...
# 查看以太网 PHY 信息
ethtool eth0
# 输出示例:Speed: 1000Mb/s, Duplex: Full
# 查看网络统计
ifconfig eth03. 软件准备
3.1 内核配置
确认以下内核配置已启用:
CONFIG_NETDEVICES=y
CONFIG_NET_VENDOR_ROCKCHIP=y
CONFIG_STMMAC_ETH=y
CONFIG_DWMAC_ROCKCHIP=y
CONFIG_PHYLIB=y
CONFIG_ROCKCHIP_PHY=y
CONFIG_OF=y
CONFIG_OF_NET=y
CONFIG_STMMAC_ETH是 Synopsys DesignWare MAC 驱动,RK3576 使用该 IP。CONFIG_DWMAC_ROCKCHIP是 Rockchip 平台适配层。
3.2 设备树
RK3576 的 GMAC 控制器在设备树中定义(以下为 RK 平台通用结构示例):
gmac0: ethernet@fe1c0000 {
compatible = "rockchip,rk3576-gmac", "snps,dwmac";
reg = <0x0 0xfe1c0000 0x0 0x10000>;
interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru CLK_GMAC0_SRC>, <&cru CLK_GMAC0_PCLK_REF>,
<&cru CLK_GMAC0_TX_OUT>, <&cru CLK_GMAC0_RX_OUT>,
<&cru HCLK_GMAC0>, <&cru PCLK_GMAC0>,
<&cru CLK_GMAC0PTP_REF>;
clock-names = "stmmaceth", "pclk",
"tx", "rx",
"master_bus", "slave_bus",
"ptp_ref";
resets = <&cru SRST_A_GMAC0>;
reset-names = "stmmaceth";
phy-mode = "rgmii";
phy-handle = <&rgmii_phy0>;
pinctrl-names = "default";
pinctrl-0 = <&gmac0_miim &gmac0_tx_bus2 &gmac0_rx_bus2
&gmac0_rgmii_clk &gmac0_rgmii_bus>;
snps,reset-gpio = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>;
snps,reset-delays-us = <0 20000 100000>;
status = "disabled";
mdio0: mdio {
#address-cells = <1>;
#size-cells = <0>;
rgmii_phy0: phy@0 {
compatible = "ethernet-phy-ieee802.22-c22";
reg = <0>;
resets = <&cru SRST_PHY0>;
reset-assert-us = <20000>;
reset-deassert-us = <100000>;
};
};
};以上寄存器基地址、中断号与时钟标识为 RK 平台通用结构示例,具体数值以实际发布的 RK3576 SDK 设备树为准(待板上确认)。
4. 操作步骤
4.1 配置网络接口
# 查看网络接口(M4-R2 提供 2 路:eth0/eth1)
ip link show eth0
# 配置 IP 地址
ifconfig eth0 192.168.1.100 netmask 255.255.255.0
# 或使用 ip 命令
ip addr add 192.168.1.100/24 dev eth0
ip link set eth0 up
# 配置默认网关
ip route add default via 192.168.1.1
# 配置 DNS
echo "nameserver 8.8.8.8" > /etc/resolv.conf4.2 测试网络连通性
# ping 网关
ping -c 4 192.168.1.1
# ping 外网
ping -c 4 8.8.8.8
# DNS 解析测试
nslookup www.baidu.com
# 网络速度测试(需安装 iperf3)
iperf3 -c 192.168.1.1 # 客户端模式
iperf3 -s # 服务端模式4.3 ethtool 网络管理
# 查看网卡信息
ethtool eth0
# 输出示例:
# Speed: 1000Mb/s
# Duplex: Full
# Auto-negotiation: on
# 查看网卡统计
ethtool -S eth0
# 调整 Ring Buffer
ethtool -g eth0
ethtool -G eth0 rx 512 tx 512
# 查看网卡驱动信息
ethtool -i eth04.4 设备树中配置 GMAC
&gmac0 {
status = "okay";
phy-mode = "rgmii";
phy-handle = <&rgmii_phy0>;
// 配置 RGMII 延迟
rx_delay = <0x4f>;
tx_delay = <0x26>;
};5. 代码详解
5.1 内核中 GMAC 驱动的注册
// RK3576 GMAC 控制器驱动(简化)
// drivers/net/ethernet/stmicro/stmmac/dwmac-rk3576.c
static struct platform_driver rockchip_gmac_driver = {
.probe = rockchip_gmac_probe,
.remove = rockchip_gmac_remove,
.driver = {
.name = "rockchip-gmac",
.of_match_table = rockchip_gmac_match,
},
};
static const struct of_device_id rockchip_gmac_match[] = {
{ .compatible = "rockchip,rk3576-gmac" },
{ /* sentinel */ }
};5.2 用户空间网络操作的内核调用链
用户空间 send()
→ sock_sendmsg()
→ dev_queue_xmit()
→ stmmac_xmit()
→ 设置 DMA 描述符
→ 将数据写入 DMA 发送缓冲区6. 常见问题
6.1 网络无法连接
现象: ip link show eth0 显示 DOWN 状态
解决方案:
# 检查网络接口
ip link show eth0
# 检查 PHY 状态
ethtool eth0
# 检查 GMAC 时钟
cat /sys/kernel/debug/clk/clk_gmac0_src/clk_rate
# 检查设备树中 GMAC 节点状态
# 具体节点路径以实际 DTB 反编译结果为准
dtc -I dtb -O dts /sys/firmware/fdt | grep -A3 "ethernet@"确认设备树中 GMAC 节点 status = "okay",检查 PHY 芯片供电和连接。
6.2 网络速度慢
现象: 千兆网卡只有百兆速度
解决方案:
# 查看网卡速度
ethtool eth0
# 强制千兆模式
ethtool -s eth0 speed 1000 duplex full autoneg off
# 检查 RGMII 延迟配置
cat /sys/kernel/debug/stmmac.eth0/des0确认 PHY 芯片支持千兆,检查 RGMII 延迟配置(rx_delay/tx_delay)。
6.3 网络丢包
现象: 网络通信丢包率高
解决方案:
# 查看网络统计
ifconfig eth0
# 关注 errors、dropped 计数
# 调整 Ring Buffer 大小
ethtool -g eth0
ethtool -G eth0 rx 1024
# 启用 RSS(Receive Side Scaling)
ethtool -l eth0检查网线质量,排查网络风暴和 CRC 错误。
