基于ZYNQ-7000的Ethernet驱动配置

完整Ethernet驱动工程实战!


目录

前言

一、网口驱动运行成功的必要条件

二、创建Vivado硬件平台

[2.1 PS端网口MIO的引脚配置](#2.1 PS端网口MIO的引脚配置)

[2.2 网口时钟配置](#2.2 网口时钟配置)

三、创建Petalinux工程

[3.1 工程搭建流程](#3.1 工程搭建流程)

[3.2 设备树phy的配置](#3.2 设备树phy的配置)

四、Linux系统下网口调配

[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 工程搭建流程

  1. 创建一个名为Zynq_PHY的 Petalinux 工程:
  1. 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系统中调用命令进行修改配置。

  1. 配置 Linux 内核

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

  1. 配置 Linux 根文件系统

3.2 设备树phy的配置

在 system-user.dtsi 中,需要启用 GEM 节点并配置 PHY 信息,

设备树示例:

复制代码
&gem0 {
	local-mac-address = [00 0a 35 00 8b 87];

	phy-handle = <&ethernet_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 = <&ethernet_phy>; 通过 phandle 引用 PHY 子节点,将 GEM0 控制器与特定的 PHY 设备绑定。这样做的好处是:一个 MDIO 总线上可能挂载多个 PHY,phy-handle 能精确定位。

&ethernet_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系统时对网口的调试的一些配置细节。

相关推荐
ShineWinsu1 小时前
对于Linux:模版方法类的解析以及socket、TcpSocket的封装
linux·c++·面试·socket·模板方法模式·封装·tcpsocket
武汉万象奥科2 小时前
万象奥科OpenHarmony 6.1 LTS适配完成,RK3576核心板再添新生态
arm开发·嵌入式硬件·物联网·rk3576·arm核心板
无足鸟ICT2 小时前
【RHCA+】查看变量
linux·运维·服务器
Kina_C2 小时前
Linux DNS 服务器-从高速缓存到辅助 DNS 部署指南
linux·运维·服务器·dns
suaizai_2 小时前
TypeScript 7 正式发布!Vue 暂被 “拒之门外“ !!!
linux·运维·ubuntu
亿道电子Emdoor3 小时前
【Arm】解决Keil MDK无法查看外设寄存器的问题
stm32·单片机·嵌入式硬件
慕伏白3 小时前
【慕伏白】Linux 系统如何根据端口号关闭进程
linux·运维·服务器
letisgo54 小时前
VMware Workstation + Ubuntu 26.04 LTS 小白运维部署手册
linux·运维·ubuntu
IT探索4 小时前
Linux 查找文件指令总结
linux·算法