完整Ethernet驱动工程实战!
目录
[2.1 PS端网口MIO的引脚配置](#2.1 PS端网口MIO的引脚配置)
[2.2 网口时钟配置](#2.2 网口时钟配置)
[3.1 工程搭建流程](#3.1 工程搭建流程)
[3.2 设备树phy的配置](#3.2 设备树phy的配置)
[4.1 ifconfig命令](#4.1 ifconfig命令)
[4.2 ethtool命令](#4.2 ethtool命令)
前言
本文介绍了基于Xilinx zynq-7000主控芯片下配置以太网驱动的实际项目工程。主要包含Vivado硬件在PS端的网口配置;搭建Petalinux系统工程时的网口配置;进入板卡Linux系统时对网口的调试配置。
一、网口驱动运行成功的必要条件
首先介绍一下项目相关的软硬件:
本文项目中使用的主要硬件配置:
- FPGA主控芯片:Xilinx zynq-7000系列的XC7Z020芯片
- 网口PHY芯片:YT8521
本文搭建工程的环境版本:
- Vivado环境为2020.2;
- Ubuntu环境为18.04;
- Petalinux环境为2020.2;
实际项目工程中,网口实现通信功能需要打通一条链路:
网口 ---------> phy芯片 --------> PS端以太网控制
整个链路缺一不可,硬件板卡首先需保证从网口到PHY芯片和PHY芯片到FPGA芯片的PS端电路连接正常;其次便是软件配置需根据实际使用PHY芯片的手册和实际使用情况来选择合适的网口驱动,调整设备树中网口相关的代码。最终才可以实现网口通信!
二、创建Vivado硬件平台
本文使用Vivado环境为2020.2版本,从零开始搭建Vivado工程可以参考之前博客Petalinux工程设计流程-CSDN博客 中Vivado 创建硬件平台这一小节,本文重点介绍网口相关参数配置。
实际工程需要根据板卡的硬件电路图,配置PS端的网口,也就是ENET。本文着重讲述硬件电路图与ZYNQ的PS端配置的对应关系。

2.1 PS端网口MIO的引脚配置
根据上文电路原理图,以下是Vivado中PS端网口MIO的引脚分配:

PS端网口MIO的引脚对应的信号名称与实际功能可参考下表:
| MIO 编号 | 信号名称(RGMII) | 功能说明 |
|---|---|---|
| 16 | TX_CLK | 发送时钟(125 MHz,输出) |
| 17 | TXD0 | 发送数据位 0 |
| 18 | TXD1 | 发送数据位 1 |
| 19 | TXD2 | 发送数据位 2 |
| 20 | TXD3 | 发送数据位 3 |
| 21 | TX_CTL | 发送控制(TXEN/TXERR 合并) |
| 22 | RX_CLK | 接收时钟(125 MHz,输入) |
| 23 | RXD0 | 接收数据位 0 |
| 24 | RXD1 | 接收数据位 1 |
| 25 | RXD2 | 接收数据位 2 |
| 26 | RXD3 | 接收数据位 3 |
| 27 | RX_CTL | 接收控制(RXDV/RXERR 合并) |
| 52 | MDIO | 管理数据 I/O |
| 53 | MDC | 管理时钟(输出) |
这里根据硬件电路图,Bank 的 I/O Voltage 设定为 LVCMOS18。
Speed设置这里可以选择默认的slow,实际项目中如果网络速度不理想,可统一调整为fast。
2.2 网口时钟配置
接口时序时钟:
- TX_CLK:由 PS 内部 PLL 产生 125 MHz(RGMII 模式),通过 MIO 输出给 PHY。
- RX_CLK:由外部 PHY 输出 125 MHz,通过 MIO 输入到 PS。
内部 RGMII 适配器利用这两个时钟实现双沿数据采样。
由于本文只使用 PS 网口,所以进入 Clock Configuration 确认 ENET 0的时钟源已使能,通常时钟源为 IOPLL 本文时钟频率设置为1000Mbps对应的实际频率就是 125 MHz。
注意:如果这里不使能时钟,网口将无法工作。
具体配置如下图所示:

三、创建Petalinux工程
创建Petalinux工程的细节可以参考之前博客:Petalinux工程设计流程-CSDN博客 ,本文重点介绍网口相关的操作。
3.1 工程搭建流程
- 创建一个名为Zynq_PHY的 Petalinux 工程:

- petalinux 工程中导入xsa 文件并配置:

在图形化界面中选中: Subsystem AUTO Hardware Settings → Ethernet Settings
找到:\* Obtain IP address automatically 取消勾选,图形化界面就会弹出下图所示的默认固定网址:

这里还可以修改IP地址,本文仅使用默认IP地址来演示:
(192.168.0.10) Static IP address (NEW)
(255.255.255.0) Static IP netmask (NEW)
(192.168.0.1) Static IP gateway (NEW)

当然,网口IP可以在配置Petalinux工程时就设置好,也可以在这里不做配置,等到搭建好工程直接进入板卡Linux系统中调用命令进行修改配置。
- 配置 Linux 内核

这里需要注意已经启动SSH,PetaLinux 会默认帮你向根文件系统中添加 Dropbear SSH 服务Dropbear SSH 轻量级,常用于嵌入式Zynq。而在其他类型的国产化平台配置中需要注意手动打开SSH,若不开启SSH会遇到板卡的IP地址可以ping通,但是无法网络通信。
- 配置 Linux 根文件系统

3.2 设备树phy的配置
在 system-user.dtsi 中,需要启用 GEM 节点并配置 PHY 信息,
设备树示例:
&gem0 {
local-mac-address = [00 0a 35 00 8b 87];
phy-handle = <ðernet_phy>;
ethernet_phy: ethernet-phy@7 { /* yt8521 */
reg = <0x7>;
device_type = "ethernet-phy";
};
};

&gem0引用主设备树中已定义的 gem0 节点(即 Zynq 的 GEM0 控制器),此处的配置会覆盖或补充默认属性。通常这段代码放在 system-user.dtsi 中,由 PetaLinux 编译时合并。
local-mac-address指定本地 MAC 地址,格式为 6 个十六进制字节。这里写死了 00:0a:35:00:8b:87。该属性优先级高于其他动态获取方式(除非内核配置了 mac-address 属性,后者优先级更高)。
phy-handle = <ðernet_phy>; 通过 phandle 引用 PHY 子节点,将 GEM0 控制器与特定的 PHY 设备绑定。这样做的好处是:一个 MDIO 总线上可能挂载多个 PHY,phy-handle 能精确定位。
ðernet_phy 指向下方定义的节点标签 ethernet_phy。
**ethernet_phy: ethernet-phy@7 { ... }**定义 PHY 子节点,挂在 MDIO 总线上(PS 的 GEM 内部集成了 MDIO 控制器,对应设备树中的 mdio 子节点,通常内核驱动会自动创建)。
标签 ethernet_phy:用作 phandle 的名字,供 phy-handle 引用。
节点名 ethernet-phy@7:符合设备树规范,ethernet-phy 是通用节点名,@7 表示 MDIO 总线上的 PHY 地址。
reg = <0x7>;:指定 PHY 在 MDIO 总线上的物理地址为 7。硬件上 YT8521 的 PHYAD0:4 引脚必须被配置为 7(通常通过外部上下拉电阻),否则通信失败。
device_type = "ethernet-phy";声明设备类型,虽然没有强制要求,但可用于系统识别。
在Xilinx的官方文档中也有示例:

以下设备树为PS端网口配置上勾选了复位引脚的设计:
&gem0 {
status = "okay";
phy-mode = "rgmii-id"; /* 内部添加 TX/RX 延时,通常推荐 */
phy-handle = <&phy0>;
pinctrl-names = "default";
phy0: phy@7 { /* PHY 地址根据硬件设定 */
reg = <7>;
reset-gpios = <&gpio0 7 1>; /* 复位 GPIO (MIO 7) 低有效 */
};
};
phy-mode 根据 PCB 走线延时决定使用 rgmii、rgmii-id、rgmii-txid 或 rgmii-rxid。
实际项目中,对于网口设备树的配置需要着重注意实际硬件电路图中PHY的物理地址是多少,PHY地址在设备树中配置错误,网口不能通信成功。
由于PCB板卡设计和使用芯片器件的不同,网口通信不稳定或是检查过其他配置均没有问题时,需要调整下网络通信的启动延时,可以多延长一定的等待时间来匹配实际硬件条件。
最后,编译Petalinux工程,打包BOOT.BIN:

制作好SD卡:

四、Linux系统下网口调配
板卡插入SD卡,连接好串口,进入板卡的Linux系统:
4.1 ifconfig命令
查看系统中的所有网络设备
bash
ifconfig -a
可以看到PS端网口eth0的IP地址就是配置xsa时选择的默认网址:

与之对比的是配置xsa时,默认勾选了自动获取IP地址的选项(\* Obtain IP address automatically)eth0没有固定IP,需要后续用指令配置。

也可以用ifconfig命令打开或关闭网口:
关闭网口:
bash
ifconfig eth0 down
串口端:

这时网络连接失败:

打开网口:
bash
ifconfig eth0 up
串口端:

这时网络连接成功:

还可以使用ifconfig来配置或者改变IP地址:
这里将IP地址从192.168.0.10改为192.168.0.22
bash
ifconfig eth0 192.168.0.22 netmask 255.255.255.0
串口端查看:

这时,新网址就可以ping通了。

4.2 ethtool命令
新设计的板卡调测网口驱动时推荐使用ethtool命令,ethtool命令用于查询和控制网络驱动和硬件设置。
在Linux系统中想要执行这个指令,需要在配置 Linux 根文件系统时,勾选好ethtool,在图形化配置菜单中可以在以下选项中找到:
Filesystem Packages --->
console --->
network --->
\* ethtool
以下指令可以查看 eth0 的详细信息(速率、双工、链路状态等):
bash
ethtool eth0
串口端信息:

可以看到:
- 使用千兆网线,已协商到 1000M 全双工。
- 实际使用的端口类型为 MII(内部 MAC-PHY 接口)。
- PHY 芯片在 MDIO 总线上的地址是 7
- 收发器集成在内部(即 PHY 芯片本身),不是外部独立模块。
- 当前自协商功能开启,速率和双工都是自动协商的结果,而非强制设定。
- 链路物理层已建立,可以正常通信。
总结
以上就是今天要讲的内容,本文介绍了基于Xilinx zynq-7000主控芯片下配置以太网驱动的实际项目工程。主要包含Vivado硬件在PS端的网口配置;搭建Petalinux系统工程时的网口配置;进入板卡Linux系统时对网口的调试的一些配置细节。