开发环境:
- vivado 2018.3
- lwip-2.0.2 源码
- ACZ702 v2.0开发板
本文主要介绍如何下载LwIP网络协议栈并将其移植到项目中。在使用Xilinx平台时,开发者可能会遇到PHY芯片适配问题,因为Xilinx官方提供的PHY驱动可能与实际使用的芯片不兼容。虽然可以在BSP文件夹中修改PHY相关代码来解决这个问题,但每次更新Vivado工程时,BSP都会被重新生成,之前的修改也会被覆盖。为了避免重复工作,本文将介绍一种更好的解决方案。
注意: 帖子只是简单介绍,更加详细的操作流程,请在下方下载pdf文档!
1、前提
从官方下载lwip-2.0.2 源码:Index of /releases/lwip/
2、移植
LwIP2.0.2移植可以参考xilinx官方LwIP_Echo例程中的bsp/lwip文件夹下的makefile文件,进行删减文件和分析哪些文件是必须使用的。
(1)删除与整理文件夹
为了优化工程结构并减少不必要的代码,我们需要对下载的 LwIP 源码进行精简。LwIP 源码包含了大量文件,但在实际应用中我们只需要其中一部分。具体步骤如下:
①进入下载好的 LwIP 源码目录
②仅保留 src 文件夹,删除其他非必需文件夹
③src 文件夹包含了我们所需的核心代码:
同时,为了进一步简化目录结构,我们将src文件夹中的所有文件移动到其父目录下,然后删除空的src文件夹。这样的扁平化结构更加清晰易用。
LwIP 源码中的 apps 文件夹包含了 HTTP、SNMP、MQTT 等应用层协议的实现。由于当前项目仅需要基础的网络功能,无需使用这些上层协议,因此可以直接删除 apps 文件夹,使项目结构更加精简。
(2)将LwIP添加到sdk工程
现在以ACZ702开发板进行演示(其他ZYNQ开发板操作类似)创建一个空工程,在sdk中创建Lwip_Lib文件夹,将上面整理好的源码移动进去,再将contrib文件夹也移入其中;
继续修改:
① 修改sys.h
找到sys.h头文件,在54行添加上:
typedef u32_t sys_prot_t;
② 删除slipif.c文件
slipif.c 是用于实现 SLIP (Serial Line Internet Protocol, 串行线路网际协议) 接口的代码,我们在ZYNQ平台上用的是RGMII/以太网,所以不需要该文件,删除它。
③ 修改 sys_arch_raw.c
打开sys_arch_raw.c文件在开头添加下面代码:
// 在sys_arch_raw.c开头添加
#include "xil_exception.h" // 包含Xilinx的异常处理头文件
(3)contrib文件夹
conrtib文件夹中主要包含了底层驱动代码。对于Zynq平台来说,Xilinx已经提供了完整的MAC驱动实现,我们只需要关注PHY部分的适配。(Zynq PS端的GEM控制器)
(4)src文件夹
将提供的config_linkspeed.h、echo.c、main.c、platform_config.h、platform_zynq.c、platform.h文件移动到工程中的src文件夹下,自动编译后下载到开发板即可。
其中,config_linkspeed.h文件主要是配置固定速率还是自协商,以及自协商的速率。如下图所示,将CONFIG_LINKSPEED设置为0为自动协商模式,设置1000为固定千兆模式,设置100为固定百兆模式,设置10为固定十兆模式。
上文主要简单介绍了,如何下载lwip源码,以及移植;更加详细的在vivado2018.3中的操作,请下载下面文档阅读,以及下载移植好的程序!
3、PHY适配
可以参考下面这些帖子
【Zynq】【Lwip】解决频繁打印link up/down、绿灯不亮、自协商结束后插入网线无反应的问题
https://www.corecourse.cn/forum.php?mod=viewthread&tid=29789
【Zynq】【Lwip】解决使用官方lwip模板时自动协商失败的问题
https://www.corecourse.cn/forum.php?mod=viewthread&tid=29166
(出处: 芯路恒电子技术论坛)
文档与工程下载