基于SPI flash的 Multiboot远程更新
前言
Xilixn FPGA提供了一种在线升级的方式(本文使用的是A7和K7系列fpga,以下所讲述和涉及的都是与此2系列fpga相关)可以通过ICAPE2指令实现。ICAPE2指的是内部配置访问端口,其主要作用是通过内部配置访问端口(ICAPE2),用户可以在FPGA逻辑代码中直接读写FPGA内部配置寄存器(类似SelectMAP),从而实现特定的配置功能,例如Multiboot。FPGA实现IPROG通常有两种方式,一种是通过ICAPE2配置,一种是把相关指令嵌入bit文件中。与通过bit文件实现IPROG相比,通过ICAP更灵活。对Xilinx FPGA的升级其实是Multiboot的操作。如下图所示,基地址存放的是Golden Image(bootloader),而高地址存放的是MultiBoot Image。本文对Xilinx A7和K7系列的MulIboot做一些简单介绍。
一、MultiBoot?
在flash中放置2个固件,一个是Golden image,另一个是updata image,我们使用的是updata image,升级时也是使用updata image,Golden image是为了防止updata image受损、升级时断电或升级时输出出错时无无法使用时,Golden image就会被启用,确保可以进行下一次升级,不然就需要使用JTAG对固件进行升级,这样可以很好的解决远程固件升级、批量板卡升级等工作量重复的工作;
二、ICAPE2 接口
FPGA实现IPROG通常有两种方式,一种是通过ICAPE2配置,一种是把相关指令嵌入bit文件中。与通过bit文件实现IPROG相比,通过ICAPE2更灵活。
三、IPROG指令
IPROG指令的作用跟外部Program_B管脚的作用类似,都是对FPGA芯片进行复位操作,该复位操作对FPGA内部的应用程序进行复位,复位过程中除专用配置管脚和JTAG管脚,其他输入/输出管脚均为高阻态,同时IPROG指令不能复位专用重配置逻辑,如WBSTAR寄存器、TIMER寄存器、BSPI寄存器和BOOTSTS寄存器。IPROG指令能够触发FPGA开启初始化流程,同时拉低INIT和Done信号。完成复位操作后,将默认的加载地址用热启动地址寄存器(Warm Boot Start Address,WB-STAR)中的新地址替换。
通过ICAP发送IPROG指令实现Multiboot的步骤如下:
首先写入同步头 32’hAA995566, 然后将需要跳转到的bit文件的起始地址写入WBSTAR寄存器,最后写入IPROG(internal PROGRAM_B)指令。WBSTAR寄存器的格式,根据自己的要为Update_image分配在FLASH的地址,按照下面的格式生成一个32位数据。例如,我为Update_image分配的flash地址为0X00600000。
#程序及步骤
golden工程
1、需在工程中加入ICAPE2,此ICAPE2在工程中的作用是使用golden固件队upadata固件进行升级完毕后,加载updata固件使用的;
2、需在约束XDC文件中增加图5所示约束,此约束功能是在板卡上电时从golden固件的基地址跳至upadata固件的基地址,我的工程中updata固件基地址是0x00600000;
``图5updata
1、需在工程中加入ICAPE2,此ICAPE2在工程中的作用是使用golden固件队upadata固件进行升级完毕后,加载updata固件使用的;
2、需在约束XDC文件中增加图6所示约束,此约束功能是在板卡上电时从golden固件的基地址跳至upadata固件的基地址,我的工程中updata固件基地址是0x00600000;
图6
步骤
1、做好golden(1颗闪烁灯)、updata(2颗闪烁灯)工程的golden.bit、golden.bin、updata.bit、updata.bin;
2、使用fpga仿真器将updata.bit烧录fpga中,然后使用升级工具将updata.bin升级入flash中;
3、使用fpga仿真器将golden.bin烧录flash中;
4、断电、拔掉fpga仿真器;
5、上电,可以看到2颗灯闪烁;