LWIP库定制:解决SFP光通信中的GTX与PS协同设计难题

高速接口----使用sfp完成以太网传输   最近在做以太网相关的东西,最近参考xapp1082完成了一个通过光口以太网完成数据传输的简单的例子。xapp1082的链接地址如下:xapp1082   xapp1082所对应的工程需要在xilinx的官网注册账号后进行下载。里面包含了ZYNQ中各种以太网的使用情况。xapp1082中介绍了4中以太网的应用。如下表: 名称 作用 pl_eth_1000basex 使用AXI Ethernet 完成通过sfp完成以太网的使用 协议为1000BaseX pl_eth_sgmii 使用AX 阅读详情

1. 问题背景:为什么需要定制LWIP库

在实际的Zynq项目开发中,我遇到过这样一个棘手的问题:使用Vivado 2017.4版本搭建了一个通过GTX高速串行接口驱动SFP光模块的系统,硬件设计看起来完美无缺,但软件端就是无法建立网络连接。经过深入排查,发现问题出在Xilinx SDK自带的LWIP协议栈上。

这个问题的根源有两个方面。首先是Vivado 2017.4版本的一个新bug:在早期版本中,当你在PL部分使用1G/2.5G Ethernet PCS/PMA或SGMII IP核时,Vivado会自动在生成的xparameters.h头文件中添加相关的宏定义。这些宏定义包括XPAR_GIGE_PCS_PMA_1000BASEX_CORE_PRESENT和XPAR_PCSPMA_1000BASEX_PHYADDR(对于1000BASEX模式),或者是XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT和XPAR_PCSPMA_SGMII_PHYADDR(对于SGMII模式)。

这些宏定义在LWIP库的底层驱动代码中被用作编译选项,特别是在xemacpsif_physpeed.c和xemacpsif_hw.c这两个文件中。它们决定了MDIO接口如何配置外部PHY器件。由于1000BASEX PHY、SGMII PHY和普通PHY芯片的寄存器定义和配置方式存在显著差异,这些宏定义对于正确配置1G/2.5G Ethernet PCS/PMA或SGMII IP核至关重要。

然而在2017.4版本中,这些宏定义不再自动生成,导致LWIP库无法正确配置这些IP核。第二个问题是LWIP底层驱动自身的设计缺陷:只要在PL部分使用了这些IP核,LWIP就会强制使用特定的MDIO配置策略,即使你同时使用了与PS直接连接的RGMII接口PHY芯片,也会导致这些PHY无法被正常检测和配置。

2. 解决方案总览:定制化LWIP库的修改策略

面对上述问题,我采取的解决方案是对LWIP库进行深度定制。这个方案的核心思想是通过修改LWIP库的配置文件和底层驱动代码,手动添加缺失的宏定义,并解决MDIO接口配置的限制问题。

具体来说,我需要完成以下几个关键修改:首先修改LWIP库的元数据文件(.mld和.tcl文件),在BSP设置中添加自定义的配置选项;然后在底层驱动代码中调整条件编译的逻辑,使得MDIO接口的配置策略更加灵活;最后确保这些修改能够正确生成所需的宏定义,并适应不同的工作模式(1000BASEX或SGMII)。

这个方案的优点在于它不需要修改硬件设计,完全通过软件层面的调整解决问题。而且修改后的LWIP库保持了向后兼容性,既支持传统的RGMII接口PHY芯片,也支持通过GTX连接的SFP光模块。在实际项目中,这种灵活性非常重要,因为不同的应用场景可能需要不同的网络接口方案。

从实现难度来看,这个方案需要开发者对LWIP协议栈有一定的了解,特别是对Xilinx的移植版本的结构和配置机制要熟悉。但相对于重新设计硬件或等待官方修复,这个方案的实施周期和风险都更加可控。我在多个项目中采用了这个方案,都取得了良好的效果。

3. 详细实施步骤:修改LWIP库的具体操作

3.1 准备LWIP库副本

第一步是创建LWIP库的定制版本。找到Xilinx SDK安装目录下的LWIP库路径,通常是C:\Xilinx\SDK\2017.4\data\embeddedsw\ThirdParty\sw_services\lwip141_v2_0。将这个文件夹完整复制到你的工程目录下的sdk_repo\bsp文件夹中,并将副本重命名为lwip141_v2_05(版本号可以根据实际情况调整)。

这个步骤很重要,因为直接修改SDK自带的LWIP库会影响其他项目,而且升级SDK时修改可能会被覆盖。创建独立的副本可以确保修改的隔离性和可维护性。我建议为每个重要项目都维护一个独立的LWIP库副本,这样可以根据项目的具体需求进行定制化调整。

3.2 修改MLD文件添加配置选项

接下来修改lwip141_v2_05\data\lwip141.mld文件。这个文件定义了LWIP库在BSP配置中的选项界面。使用文本编辑器(如Notepad++)打开该文件,首先将版本号从OPTION VERSION = 2.0;修改为OPTION VERSION = 2.05;,这样可以确保BSP能够识别这是我们自定义的版本。

然后在该文件中添加新的配置类别和参数。需要添加的代码如下:

BEGIN CATEGORY pcs_pma_core_options
  PARAM name = pcs_pma_core_options, desc = "Options setting the pcs pma core related parameters"
  PARAM name = use_pcs_pma_core_on_zynq, desc = "Option if set to 1 ensures emacps is used as emio, and connect to pcs_pma_core in pl. Valid only for Zynq", type = bool, default = false;
  PARAM name = use_1000basex, desc = "Option if set to 1 to ensures pcs_pma_core is using 1000basex mode", type = bool, default = false;
  PARAM name = use_sgmii, desc = "Option if set to 1 to ensures pcs_pma_core is using sgmii mode", type = bool, default = false;
  PARAM name = 1000basex_phy_address, desc = "Option to define the phy address corresponding to the set in pcs_pma_core in 1000basex mode", type = int, default = 0;
  PARAM name = sgmii_phy_address, desc = "Option to define the phy address corresponding to the set in pcs_pma_core in sgmii mode", type = int, default = 0;
END CATEGORY

这段代码的作用是在BSP设置的LWIP参数窗口中增加一个名为pcs_pma_core_options的配置栏目,其中包含5个子选项:use_pcs_pma_core_on_zynq表示是否在PL端使用了1G/2.5G Ethernet PCS/PMA或SGMII IP核;use_1000basex和use_sgmii分别表示IP核的工作模式;1000basex_phy_address和sgmii_phy_address则分别对应两种模式下的PHY地址。

3.3 修改TCL文件生成宏定义

修改lwip141_v2_05\data\lwip141.tcl文件,这个文件负责根据BSP设置生成相应的宏定义。在文件中添加以下代码:

# PCS PMA CORE options
set use_pcs_pma_core_on_zynq [common::get_property CONFIG.use_pcs_pma_core_on_zynq $libhandle]
set use_1000basex [common::get_property CONFIG.use_1000basex $libhandle]
set use_sgmii [common::get_property CONFIG.use_sgmii $libhandle]
set 1000basex_phy_address [common::get_property CONFIG.1000basex_phy_address $libhandle]
set sgmii_phy_address [common::get_property CONFIG.sgmii_phy_address $libhandle]

if { $use_pcs_pma_core_on_zynq == true } {
  puts $lwipopts_fd "#define USE_PCS_PMA_CORE 1"
}

if { $use_1000basex == true } {
  puts $lwipopts_fd "#define XPAR_GIGE_PCS_PMA_1000BASEX_CORE_PRESENT 1"
  puts $lwipopts_fd "#define XPAR_PCSPMA_1000BASEX_PHYADDR $1000basex_phy_address"
}

if { $use_sgmii == true } {
  puts $lwipopts_fd "#define XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT 1"
  puts $lwipopts_fd "#define XPAR_PCSPMA_SGMII_PHYADDR $sgmii_phy_address"
}

puts $lwipopts_fd ""

这段代码的作用是根据BSP中的设置,在工程对应的lwipopts.h头文件中生成所需的宏定义。例如,如果你在BSP中设置了使用1000BASEX模式且PHY地址为6,那么就会生成#define XPAR_GIGE_PCS_PMA_1000BASEX_CORE_PRESENT 1和#define XPAR_PCSPMA_1000BASEX_PHYADDR 6这两个宏定义。这样就弥补了Vivado 2017.4版本中宏定义缺失的问题。

3.4 修改底层驱动代码解决配置限制

最后需要修改LWIP库的底层驱动代码,解决MDIO接口配置的限制问题。需要修改的文件是lwip141_v2_05\src\contrib\ports\xilinx\netif\xemacpsif_physpeed.c和xemacpsif_hw.c。

在这两个文件中,找到以下代码段:

#if XPAR_GIGE_PCS_PMA_1000BASEX_CORE_PRESENT == 1 || \
    XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT == 1
#define PCM_PMA_CORE_PRESENT

将其修改为:

#if USE_PCS_PMA_CORE == 1 && (XPAR_GIGE_PCS_PMA_1000BASEX_CORE_PRESENT == 1 || \
    XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT == 1)
#define PCM_PMA_CORE_PRESENT

这个修改的关键在于增加了USE_PCS_PMA_CORE == 1 &&这个条件。这样,只有当在BSP中明确设置了使用PCS/PMA核心时(即use_pcs_pma_core_on_zynq设为1),MDIO接口才会采用1G/2.5G Ethernet PCS/PMA或SGMII IP核的配置策略。如果这个选项设为0,LWIP库会使用标准的MDIO配置策略,从而不影响与PS直接连接的网口的正常使用。

这个修改解决了原始驱动中的设计缺陷,使得LWIP库能够同时支持传统的RGMII接口PHY和通过GTX连接的SFP光模块,大大提高了设计的灵活性。

4. 实际应用与测试:修改后的效果验证

完成上述修改后,需要在实际项目中验证修改的效果。首先在Vivado中创建或打开一个已有的项目,确保硬件设计包含了1G/2.5G Ethernet PCS/PMA或SGMII IP核,并且正确配置了GTX接口和SFP模块的连接。

导出硬件设计到SDK后,创建或修改BSP。在BSP的设置中,现在应该能看到新添加的pcs_pma_core_options配置栏目。根据实际硬件设计,正确设置这些选项:如果使用了PCS/PMA核心,将use_pcs_pma_core_on_zynq设为1;根据IP核的工作模式设置use_1000basex或use_sgmii;并正确设置PHY地址,这个地址必须与Vivado中IP核的配置完全一致。

然后创建一个LWIP示例工程,如echo server或http server,编译并下载到目标板中。通过串口终端观察程序输出,应该能看到PHY自动协商成功完成的消息,以及开发板的IP地址信息。如果使用1000BASEX模式,协商完成的消息可能会显示"autonegotiation complete"和"link speed for phy address 6: 1000"(假设PHY地址为6)。

在实际的网络通信测试中,可以使用网络调试工具(如ping或iperf)测试网络连接的稳定性和带宽。对于SFP光接口,特别注意检查光模块的发射和接收功率是否在正常范围内,这对于长期稳定运行至关重要。

我在多个项目中使用了这个修改方案,包括工业控制和通信设备,都取得了良好的效果。修改后的LWIP库不仅解决了Vivado 2017.4版本的兼容性问题,还提供了更灵活的配置选项,能够适应不同的网络接口需求。

5. 常见问题与调试技巧

在实际应用中,可能会遇到一些问题。一个常见的问题是PHY地址设置不正确。务必确保在BSP中设置的PHY地址与Vivado中IP核的配置完全一致,否则MDIO接口无法正确访问PHY寄存器。

另一个常见问题是时钟配置。1G/2.5G Ethernet PCS/PMA IP核需要正确的参考时钟,通常由PS提供一路200MHz的时钟。确保这个时钟的设置正确,并且在实际硬件中能够测量到稳定的时钟信号。

对于SFP光模块,需要注意不同型号的光模块可能有不同的特性。有些光模块需要额外的初始化序列或配置参数。如果遇到光模块无法正常工作的问題,可以尝试更换不同型号的光模块进行测试。

在调试MDIO接口时,可以通过在驱动代码中添加调试输出,打印MDIO读写操作的状态和结果。这有助于确定MDIO通信是否正常,以及PHY寄存器是否正确配置。

如果遇到网络连接不稳定或带宽不达标的问题,可以使用示波器或逻辑分析仪检查GTX接口的信号质量。确保GTX的发送和接收眼图符合规范要求,这是高速串行通信稳定性的基础。

最后,记得在修改LWIP库后,彻底清理和重新编译工程,包括BSP和应用程序。有时候旧的编译结果可能会影响新修改的效果,导致一些难以理解的问题。

【Ultrascale+ MPSOC学习记录】12、PL端以太网使用lwip 还是参考ALINX教程,学习PL端以太网如何使用,从教程中可以看到,开发板使用了一个xilinx默认不支持的phy JL2121,所以需要修改lwip的库源码。修改位置是:之前实现了,现在来实现PL端。 阅读详情

相关推荐

基于ZYNQ PS与GTX的SFP光通信系统设计与实现

本文详细介绍了基于ZYNQ PS与GTX的SFP光通信系统设计与实现方案。通过EMIO接口将PS端以太网控制器与PL端GTX收发器结合,利用1G/2.5G Ethernet PCS/PMA IP核驱动SFP光模块,实现高速稳定的光纤网络通信。该方案适用于工业数据采集、医疗影像等对传输距离和抗干扰性要求高的场景,并支持lwIP协议栈优化。

t8u9v0的博客 180

PS通过GTX实现SFP网络通信2

PS通过GTX实现SFP网络通信2

cckkppll的博客 1278

ZYNQ PS通过GTX与SFP光口实现LWIP网络通信的库修改实践

本文详细介绍了在Vivado 2017.4环境下,针对ZYNQ PS端通过GTX与SFP光口实现LWIP网络通信时遇到的库兼容性问题及解决方案。通过修改LWIP底层驱动和BSP配置,成功解决了SFP光口链路无法建立的问题,为高速网络通信应用提供了稳定可靠的实践指导。

dapp9builder的博客 450

10G以太网光口与Aurora接口回环实验

10G以太网光口与高速串行接口的使用越来越普遍,本文拟通过一个简单的回环实验,来说明在常见的接口调试中需要注意的事项。各种Xilinx FPGA接口学习的秘诀:Example Design...

OpenFPGA的博客 8160

88E111的252页datasheet+zynq lwip+88E111R的影印版

88E111的252页完整datasheet,里面还有寄存器配置+zynq lwip,还有88E111R的影印版

SpringBoot+Vue+Mysql社区医院信息平台(源码+文档)

SpringBoot+Vue+Mysql学生宿舍信息管理系统 WEB端软件项目(源码+文档) 项目包含:①完整源码(后端+管理后台+用户前台);②数据库脚本文件;③万字论文文档;④开题报告;⑤答辩PPT;⑥项目运行视频教程。 项目架构: B/S 架构、MVC 分层设计 技术栈: Java、MySQL、SpringBoot、MyBatis-Plus、Token 权限校验、管理后台 Vue+ElementUI+ECharts、用户前台 Layui+jQuery、Maven 构建。 一、角色设计 学生用户: 注册登录、浏览宿舍信息、查询宿舍安排、在线报修、缴费查询、失物招领、桶装水预订、评论交流、收藏等。 商家用户: 注册登录、桶装水品牌与商品信息维护、预订订单查看与处理。 维修人员: 注册登录、查看待处理报修、接单维修、填写报修处理结果与进度反馈。 管理员: 学生管理、班级管理、宿舍信息管理、宿舍安排管理、报修处理管理、缴费信息管理、卫生检查与文明宿舍管理、失物招领管理、桶装水与商家管理、维修人员管理、公告资讯与轮播图管理等。 二、前台功能模块(学生端) 1. 首页展示:轮播图、宿舍公告、最新动态推荐、常用服务快速入口 2. 宿舍信息模块:宿舍列表、楼栋与房间条件筛选、宿舍详情查看、我的宿舍安排查询 3. 在线报修模块:在线提交宿舍设施报修申请、上传故障描述、查看报修进度与维修处理结果 4. 缴费模块:水电等缴费记录查询、缴费状态查看 5. 卫生检查与文明宿舍:宿舍卫生检查结果公示、文明宿舍展示 6. 失物招领模块:失物信息发布、招领信息发布、详情查看、评论互动 7. 桶装水预订:桶装水品牌与商品浏览、在线预订、我的预订记录查询 8. 假期留宿:假期留校申请提交、申请记录查询 9. 评论与收藏:信息评论、查看他人评论、评论回复互动、收藏感兴趣的内容 10. 个人中心...

关于使用两个GTP/GTX出现[DRC RTSTAT-1]error([route 35-54] critical warning)的问题详解

本文用于记录在用xilinx的FPGA时,使用VIVADO编译两个GTP/GTX IP时出现的[DRC RTSTAT-1]错误/[route 35-54]警告的问题,并说明问题原因与解决思路。 使用的编译软件:vivado 2017.4 使用的GTP IP:7 series FPGAs Transceivers Wizard

风中月隐的博客——FPGA加速者 1万+

YOLOv8作物病害检测实战源码

这是一套基于YOLOv8n的农田病虫害目标检测系统,对叶片照片做目标检测,识别健康叶片、褐斑病、白粉病、锈病四类,并给出对应防治建议。全流程纯CPU可跑,配套交付完整Python源码、9章实战教程(md/html/pdf三种格式)、100张自造样本及YOLO标签、训练曲线与混淆矩阵截图、Tkinter界面和答辩PPT。 系统围绕五项功能展开:同一套推理逻辑覆盖图像、视频、摄像头三种来源;图形界面选文件即检测,画面叠彩色框标注病名与置信度,右侧面板同步给出症状与防治措施;检测记录自动写入CSV,统计页一键生成四类病害占比饼图;训练结束自动产出损失与精度曲线;内置防治建议文案库,检测命中即回填面板。 选型用YOLOv8n nano档,参数量约320万、权重约6.2MB,CPU单帧几十毫秒,小样本训练5到8分钟完成。数据由data_gen.py程序化绘制100张叶片图,固定随机种子,重跑分布一致,不依赖公开数据集。依赖全部锁版本,教程第7章整理了19条真实报错及排查方法,第8章给出换模型档、换PlantVillage数据集的迁移路径。 适合做计算机视觉方向课程设计或毕业设计的学生,也适合智慧农业方向想了解检测模型如何落进业务面板的学习者。不需要GPU,不需要系统学过目标检测,教程第3章会按需补齐原理。 使用时先pip install -r requirements.txt装好依赖,download_data.py下载预训练权重,data_gen.py生成样本后train.py训练,完成后用main.py infer批量检测或main.py gui启动界面。

跨越PS与PL的边界:GTX与SFP光通信中的LWIP协议栈优化实战

本文深入探讨在Zynq平台上优化LWIP协议栈,实现PS与PL间高速数据交互的实战经验。通过针对GTX收发器与SFP光模块的LWIP协议栈深度定制,解决了官方库的兼容性问题,显著提升了网络通信的稳定性和吞吐量,为光通信和工业网络设备开发提供了可行的技术方案。

fanta的博客 170

数据挖掘实战:决策树 + 聚类 + 关联规则,零 Key 离线可跑(Python 源码)

数据挖掘实战包。用 Python 标准库实现 CART 风格决策树、K-Means 聚类与 Apriori 关联规则,在虚构「星河便利店」会员表和购物篮上跑通分类、分群与购物篮分析,并给出准确率、轮廓系数、支持度/置信度/提升度。零第三方依赖、零 API Key 即可离线跑通。含 4 个样例、离线冒烟、中文 README(含「使用方法」)。均为作者原创可运行源码。MIT。作者 blog.youkuaiyun.com/mtl1994

科技中介服务机构在技术供需对接中如何实现服务流程的自动化与标准化?.docx

科技中介服务机构在技术供需对接中如何实现服务流程的自动化与标准化?

从硬件到协议的协同设计:SFP光通信中的LWIP驱动优化实践

本文探讨了在ZYNQ平台下,针对SFP光通信场景的LWIP驱动优化实践。通过分析PS端与PL端的协同设计,解决了LWIP驱动与硬件配置的耦合问题,实现了多模式支持的BSP层配置方案,并提供了驱动层优化和性能提升的具体方法,助力开发者构建高效稳定的嵌入式网络通信系统。

CAT789的专栏 151

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

Xilinx FFT IP核仿真报错?手把手教你解决初始化状态问题(Vivado 2017.4实测)

本文针对Vivado 2017.4环境下Xilinx FFT IP核仿真时常见的初始化状态错误(如add_1范围错误),深入剖析了其根源在于AXI-Stream协议握手时序问题。文章提供了手把手的解决方案,通过构建稳健的初始化状态机,严格分离配置与数据通道的启动顺序,从而彻底解决仿真报错并确保IP核稳定运行。

3a9bq4r8t2y的博客 202

国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

国央企创新负责人如何实现科技成果的精准识别与高效筛选?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

lwip 一个服务器连接多个客户端_「正点原子FPGA连载」第三十三章基于lwip的echo实验...

1)摘自【正点原子】领航者 ZYNQ 之嵌入式开发指南2)实验平台:正点原子领航者ZYNQ开发板3)平台购买地址:https://item.taobao.com/item.htm?&id=6061601087614)全套实验源码+手册+视频下载:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)对正点原子FPGA感兴趣的同...

weixin_39630498的博客 2568

高校技术转移办公室人员如何系统化管理科技成果信息?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

上一篇: 从零构建:N32G430C8L7的GPIO与EXTI中断实战避坑指南
下一篇: HardFault调试实战:从异常触发到精准定位的完整指南
gitlab7runner
博客等级 码龄4年 78粉丝 1747原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值