前言

LwIP是Light Weight (轻型)IP协议是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。AX7Z100开发板带有源码和教学视频,但不是AX7Z100开发板的,所以最初移植的时候遇到一些小问题困扰好长时间。因此笔者基于Vivado17.4整理比较详细的移植过程供后面参考。

一、Vivado 工程建立

1、新建一个空工程,名称为net_lwip_ps。

2、FPGA芯片选择xc7z100ffg900-2。

二、配置PS系统硬件

1、单击左侧导航栏的Create Block Design建立图形文件取名top,单击OK。

2、在图形文件中单击+号,在搜索栏输入zynq找到PS端的IP核

3、双击添加ARM核的IP。

4、双击IP核进入配置界面,因为PS端内嵌有两个以太网控制器不需要AXI总线扩展,所以勾选掉默认的AXI GP0接口

5、网络要通过串口测试,所以在Perioheral I/O Pins中开通串口

6、网络MAC的IP核Enet0需要开通

7、网络MACIP核Enet0控制外接PHY芯片的MDIO接口需要开通

8、以太网控制器采用RGMII工作方式,所以工作电压修改为:LVCMOS 1.8V

9、因为开发板DDR内存与默认不同,所以选择MT41J256M16 RE-125,单击OK退出。

10、单击自动连接生成引脚。

11、至此PS端开通网络的系统硬件配置完毕。但是直接编译原理图工程可能报错,所以通过Create HDL Wrapper将原理图工程转换为Verilog顶层工程

三、编译硬件生成bit文件

1、因为在引入PS端ZYNQ的ARM核过程中系统已经默认在工程文件夹下的/net_lwip_ps.srcs/sources_1/bd/top/ip/top_processing_system7_0_0/top_processing_system7_0_0.xdc文件中自动建立了管脚约束参数,其中包括网卡(Enet0)、串口(Uart0)和DDR的引脚约束,而且黑金开发板跟默认工程项目参数与其一致。所以TOP的项目约束文件可以省略,其它系统另行设置。因此直接编译生成bit文件(等待时间较长)

2、单击File菜单,导出bit文件的硬件信息给SDK应用。

3、导出对话框要勾选bit文件,单击OK。

至此,系统硬件部分bit文件编译导出完成,接下来将进入软件编程环节。

四、SDK程序设计

1、LwIP是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。在PS端跑裸机程序的时候因为没有操作系统所以要借助LwIP连接网络。SDK环境内嵌了LwIP的开发库保存在X:\Xilinx\SDK\2017.4\data\embeddedsw\ThirdParty\sw_services中(X为Vivado安装盘),Vivado17.4版本的SDK内嵌的是lwip141_v2_0。

2、但是在黑金的AX7Z100开发板中,以太网PHY芯片采用了MICREL公司的KSZ9031型号的芯片类型,与系统默认的PHY芯片不一致,所以SDK开发包中的LwIP库需要打补丁。打开lwip141_v2_0文件夹,进入lwip141_v2_0\src\contrib\ports\xilinx\netif文件夹找到xemacpsif_physpeed.c文件。

3、打开xemacpsif_physpeed.c文件在宏定义部分添加PHY芯片的ID信息。

#define PHY_DETECT_REG                          1
#define PHY_IDENTIFIER_1_REG                    2
#define PHY_IDENTIFIER_2_REG                    3
#define PHY_DETECT_MASK                     0x1808
#define PHY_MARVELL_IDENTIFIER              0x0141
#define PHY_TI_IDENTIFIER                   0x2000
#define PHY_XILINX_PCS_PMA_ID1          0x0174
#define PHY_XILINX_PCS_PMA_ID2          0x0C00// === Add by Yang ziheng ===//
#define MICREL_PHY_IDENTIFIER                   0x22
#define MICREL_PHY_KSZ9031_MODEL                0x220
// === Add end ===//#define XEMACPS_GMII2RGMII_SPEED1000_FD      0x140
#define XEMACPS_GMII2RGMII_SPEED100_FD      0x2100
#define XEMACPS_GMII2RGMII_SPEED10_FD       0x100
#define XEMACPS_GMII2RGMII_REG_NUM          0x10

4、在代码中搜索get_IEEE_phy_speed函数添加补丁代码。

static u32_t get_IEEE_phy_speed(XEmacPs *xemacpsp, u32_t phy_addr)
{u16_t phy_identity;u32_t RetStatus;XEmacPs_PhyRead(xemacpsp, phy_addr, PHY_IDENTIFIER_1_REG, &phy_identity);// === Add by Yang ziheng ===//if (phy_identity == MICREL_PHY_IDENTIFIER){RetStatus = get_phy_speed_ksz9031(xemacpsp, phy_addr);} // === Add end ===//else if (phy_identity == PHY_TI_IDENTIFIER) {RetStatus = get_TI_phy_speed(xemacpsp, phy_addr);}else {RetStatus = get_Marvell_phy_speed(xemacpsp, phy_addr);}return RetStatus;
}

5、在文件中添加补丁代码中的KSZ9031型号芯片速度检测函数get_phy_speed_ksz9031

// === Add by Yang ziheng ===//
static u32_t get_phy_speed_ksz9031(XEmacPs* xemacpsp, u32_t phy_addr)
{u16_t temp;u16_t control;u16_t status;u16_t status_speed;u32_t timeout_counter = 0;u32_t temp_speed;u32_t phyregtemp;xil_printf("Start PHY autonegotiation \r\n");XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_PAGE_ADDRESS_REGISTER, 2);XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_MAC, &control);control |= IEEE_RGMII_TXRX_CLOCK_DELAYED_MASK;XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_MAC, control);XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_PAGE_ADDRESS_REGISTER, 0);XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG, &control);control |= IEEE_ASYMMETRIC_PAUSE_MASK;control |= IEEE_PAUSE_MASK;control |= ADVERTISE_100;control |= ADVERTISE_10;XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG, control);XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_1000_ADVERTISE_REG_OFFSET,&control);control |= ADVERTISE_1000;XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_1000_ADVERTISE_REG_OFFSET,control);XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_PAGE_ADDRESS_REGISTER, 0);XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_COPPER_SPECIFIC_CONTROL_REG,&control);control |= (7 << 12); /* max number of gigabit attempts */control |= (1 << 11); /* enable downshift */XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_COPPER_SPECIFIC_CONTROL_REG,control);XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);control |= IEEE_CTRL_AUTONEGOTIATE_ENABLE;control |= IEEE_STAT_AUTONEGOTIATE_RESTART;XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, control);XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);control |= IEEE_CTRL_RESET_MASK;XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, control);while (1) {XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);if (control & IEEE_CTRL_RESET_MASK)continue;elsebreak;}XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET, &status);xil_printf("Waiting for PHY to complete autonegotiation.\r\n");while (!(status & IEEE_STAT_AUTONEGOTIATE_COMPLETE)) {sleep(1);XEmacPs_PhyRead(xemacpsp, phy_addr,IEEE_COPPER_SPECIFIC_STATUS_REG_2, &temp);timeout_counter++;if (timeout_counter == 30) {xil_printf("Auto negotiation error \r\n");return;}XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET, &status);}xil_printf("autonegotiation complete \r\n");XEmacPs_PhyRead(xemacpsp, phy_addr, 0x1f,&status_speed);if ((status_speed & 0x40) == 0x40)/* 1000Mbps */return 1000;else if ((status_speed & 0x20) == 0x20)/* 100Mbps */return 100;else if ((status_speed & 0x10) == 0x10)/* 10Mbps */return 10;elsereturn 0;return XST_SUCCESS;
}
// === Add end ===//

6、单击File菜单SDK选项进入SDK开发环境,新建App工程取名main,单击下一步。

7、选择lwIP Echo Server后单击Finish。

8、工程文件建好后如下图

五、系统测试

1、在SDK开发环境中右击main工程文件,编译工程

2、在运行配置窗口勾选复位和FPGA编程选项,单击Run

3、在打开的UART0口的超级终端程序中显示网络信息(如显示不全,上面操作有误)

4、另打开超级终端程序,以telnet模式登录开发板,键盘输入字符会被回写显示,实验完毕。

黑金AX7Z100 FPGA开发板移植LWIP库(一)PS端相关推荐

  1. iMX6UL开发板移植libcurl库

    前言 libcurl 是一个功能全面的客户端 URL 传输库,支持常见的各种传输协议(官方介绍),并且具有高可移植性,命令行工具 curl 就是使用的这个库.在嵌入式开发板上,有 http/https ...

  2. arm开发板移植ALSA库与ALSA工具

    目录 首先我们需要下载两个所要用到的库文件(基于Ubuntu) 一:先配置ALSA库文件 1.先解压放到家目录下ALSA的源文件: 2.解压后进去解压得到的文件夹执行以下命令: 3.配置好以后执行 二 ...

  3. [2021]Linux下C语言qrencode二维码生成库的基本使用和ARM开发板移植

    文章目录 一.前言 二.准备所用到的环境以及版本信息 1.Ubuntu和内核版本 2.gcc和g++版本 3.交叉编译gcc和g++版本 4.开发板信息 三.开发环境编译&安装qrencode ...

  4. 异步fifo_正点原子开拓者FPGA开发板资料连载第十五章 IP核之FIFO实验

    1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...

  5. imx6ull 开发板移植mjpg-streamer

    imx6ull 移植mjpg-streamer 参考链接:https://blog.csdn.net/mucheni/article/details/109447610 前期准备: PC端:Ubunt ...

  6. arm开发板移植 curl

    arm开发板移植 curl 一,下载curl源码 二,配置curl 三,移植到arm平台上 三,arm平台curl测试 一,下载curl源码 地址:https://curl.haxx.se/downl ...

  7. 国产荔枝糖FPGA开发板实现FM发射

    之前在ZEDBOARD上实现了FM发射,移植到荔枝糖FPGA开发板上,运行异常,抓波形看,波形紊乱,由于最高时钟为450M,估计是荔枝糖FPGA开发板跑不了这么高,那就降频吧,降到18M果然可以发射了 ...

  8. fpga驱动rgb液晶屏_正点原子开拓者FPGA开发板资料连载第五十四章基于的数字识别实验...

    1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...

  9. html抽奖源码_开源FPGA开发板OpenICE 介绍及抽奖

    首先呢,先强调一遍,我做板子不是为了挣钱,因为国内目前的形式比较严峻,只是为了体验一下开源的工具和环境,也为了后人能对FPGA有个新的认识,所以不会触碰到任何人的蛋糕. 本来今天不准备发文了,还是熬夜 ...

  10. 荔枝糖FPGA开发板相关博客

    Hello World on the Lichee Tang RISC-V/FPGA board https://justanotherelectronicsblog.com/?p=470 Liche ...

最新文章

  1. Ubuntu之GCC:GCC编译器的简介、安装、使用方法之详细攻略
  2. C#数据本地存储方案之SQLite
  3. CF1271D Portals
  4. 分析启动耗时 android,Android app启动耗时分析
  5. Activity 生命周期与状态保存
  6. HTML5网站大观:10个精美的复古风格 HTML5 网站作品
  7. Socket 套接字和解决粘包问题
  8. 软件项目管理案例教程第四版 答案
  9. C语言常见编程题及答案40题
  10. Markdown记录
  11. HTML5七夕情人节表白网页制作【一起跨年表白代码】HTML+CSS+JavaScript
  12. 猫眼电影排行榜前100爬取案例学习笔记
  13. 2022届浙江工业大学考研计算机技术专硕上岸经验 初试复试经验
  14. Swiper实现手风琴式的图片展示
  15. pc控制iphone的软件_评论:苹果M1芯片版MacBook和Mac Mini将颠覆整个PC行业?
  16. python,selenium爬取微博热搜存入Mysql
  17. 尚硅谷Redis6基础教程-秒杀案例中库存遗留问题
  18. 套用模板,又申请了两张软著证书
  19. 【互联网金融】(学习笔记)2、互联网金融概述
  20. C++ 特殊成员函数

热门文章

  1. 生物特征识别:小面积指纹识别算法(三)
  2. AssertionError: Override list has odd length: [‘\r‘]; it must be a list of pairs
  3. 关于地图矢量下载器的使用感受
  4. Mac:小米手机刷机
  5. Java-RPC通信--HSF框架
  6. ZKTime5.0 考勤管理系统设置
  7. 互联网数据响应时间计算公式
  8. IT十八掌徐培成第二天笔记
  9. Android 中WebView的使用详解
  10. RANSAC算法思想与实现点云粗配准