基于UDP/TCP的远程更新QSPI Flash#

到目前为止,所有的程序都是通过JTAG下载,QSPI Flash,均是现场下载启动方式。在实际工作中,会遇到产品升级问题,也许产品生产时并没有预留JTAG口,而是预先将程序烧到FLASH里,那么升级过程就比较痛苦。本章介绍一种通过网络远程更新FLASH程序的方法,包含UDP和TCP两种方法。

硬件环境搭建#

基于course_s1的“ps_hello”工程,另存一份。

Vitis程序开发#

UDP传输方式#

  1. LWIP部分主要处理BIN文件的接收,程序为lwip_app.c

../_images/image1158.png
  1. 在创建工程后,需要使能lwip库,并进行设置,使能DHCP功能,将memory空间尽可能设置大一些,增大缓存空间,提高效率。

../_images/image2139.png
  1. udp_receive函数为设置的接收回调函数,主要功能是接收数据,并将接收到的数据缓存到FlashRxBuffer空间,留待更新Flash使用,在发送数据后,再发送“update”命令,开始更新flash,在函数中判断此命令。

  2. 在while循环语句中,判断StartUpdate变量值,更新Flash。

../_images/image3108.png

TCP传输方式#

  1. TCP的LWIP部分同样也是lwip_app.c文件,控制部分参考lwip echo server例程,建立一个TCP Server

../_images/image474.png
  1. LWIP库设置如下,使能DHCP,增大memory空间,增大tcp窗口

../_images/image563.png
  1. 与UDP类似,在recv_callback接收回调函数中,缓存接收到的BIN文件,启动更新命令同样是update,其他部分也与UDP类似。

QSPI Flash读写控制#

UDP和TCP两种方式使用的是同样的QSPI读写文件qspi.c和qspi.h

../_images/image655.png
  1. qspi.c文件是根据xqspips_flash_polled_example做的修改

../_images/image752.png
  1. 主要有以下一些函数,写使能及关闭,flash擦除,flash写,flash读,读Flash ID等。

../_images/image852.png
  1. 主要的函数为update_qspi,其中TotalLen为要更新的总字节数,FlashDataToSend为存放更新数据的缓存区域,流程也比较简单,首先是擦除,在这里没选择擦除整个Flash,而是根据TotalLen大小进行Sector擦除,因此擦除的空间会比TotalLen稍微大一点;然后是写Flash,利用FlashWrite函数进行写入;最后是校验,从Flash里读出数据,并与写入的数据进行对比。

../_images/image943.png

板上验证#

我们以OV5640摄像头采集显示一的BOOT.bin文件做举例,当然也可以用其他例程。我们是设定网络环境理想状态下做的实验,在做此实验时,不要打开其他有关以太网传输的上位机软件,由于端口号一样,可能会造成冲突。

  1. 首先连接开发板如下,将网线连接到ETH1网口,连接上双目摄像头

../_images/image10.jpeg

AX7015硬件连接图

../_images/image11.jpeg

AX7021硬件连接图(J16扩展口)

2. 如果有DHCP服务器,会自动分配IP给开发板;如果没有DHCP服务器,默认开发板IP地址为192.168.1.11,需要将PC的IP地址设为同一网段,如下图所示。同时要确保网络里没有192.168.1.11的IP地址,否则会造成IP冲突,导致无法显示。可以在板子未上电前在CMD里输入ping 192.168.1.11查看是否能ping通,如果ping通,说明网络中有此IP地址,就无法验证。 没有问题之后打开putty软件。

../_images/image1238.png

UDP方式#

  1. UDP方式下载程序

../_images/image1336.png
  1. 可以看putty里的信息

../_images/image1434.png
  1. 打开工程目录下的板卡网络升级软件

../_images/image1534.png
  1. 填入板卡的IP地址和端口号,选择UDP发送方式,选择BOOT.bin文件,点击发送

../_images/image1630.png
  1. 发送完毕后,会显示发送的字节数

../_images/image1729.png
  1. 在putty窗口可以看到板卡接收到的字节数,以及擦除,烧写,校验过程。

../_images/image1828.png
  1. 断电通拨码开关选择QSPI启动方式,打开电源启动,即可看到程序运行起来。

TCP方式#

  1. TCP下载程序

../_images/image1929.png
  1. 可以看到putty信息

../_images/image2028.png
  1. 打开工程目录下的板卡网络升级软件

../_images/image1534.png
  1. 填入IP地址和端口号,选择TCP发送方式,选择BOOT.bin文件,点击发送

../_images/image2140.png
  1. 与UDP一样,也能看到发送的字节数

../_images/image2230.png
  1. 在putty窗口可以看到板卡接收到的字节数,以及擦除,烧写,校验过程。

../_images/image2328.png
  1. 断电通过拨码开关选择QSPI启动方式,打开电源启动,即可看到程序运行起来。

本章小结#

虽然在功能上实现了要求,但是并不完美,程序并未实现网络数据校验,握手,数据重传等功能,一旦网络不太好,或中途停止,就需要重新来一遍。但用户可在此基础上,编写代码,使其更具备实用性。