FPGA实现串口升级及MultiBoot(十一)QuickBoot介绍
MultiBoot在流行前官方也推出过QuickBoot作为保证升级的方式,但是不知什么原因,该方式的参考例程已经被官方PASS掉了,下面是官方的说明:
https://adaptivesupport.amd.com/s/article/000036833?language=en_US
至于原因,后面我们总结时候再分析。
介绍
使用MultiBoot进行远程更新的架构如下:
图1:MultiBoot远程更新架构-来源:XAPP1081MultiBoot 的两个程序都需包含 warm boot jump sequence,warm boot jump sequence 包含 WBSTRA(用于指定程序加载地址)、IPROG(用于重启 FPGA 配置并从 WBSTAR 指定的地址开始加载)
而QuickBoot的升级方式则复杂很多,包括QuickBoot header
critical switch word;warm boot jump sequence;golden bitstream image area;update bitstream image area几个部分。
图2:QuickBoot远程更新架构-来源:XAPP1081由于FPGA配置是从flash的0地址开始读取数据,所以将QuickBoot Header放在0地址非常关键。QuickBoot Header包括两个部分,第一部分就是关键开关字,第二部分就是热启动跳转序列。
关键开关字,根据配置模式的不同而不同,如BPI模式就是0x0000BB,而SPI模式就是0x0xAA995566。
如果关键开关字是ON,那么就执行热启动跳转序列,热启动跳转序列包含了需要跳转的地址。然后就跳转到update bitstream area。并且将update bitstream下载下来。
如果关键开关字是OFF,那么就忽略热启动跳转序列,并且继续往下读取数据,这样就可以将golden bitstream area的数据下载到FPGA。
QuickBoot配置模式
支持 4 种配置模式
SPI mode
BPI mode
Encrypted bitstreams
Multiple FPGA configuration daisy-chains
升级程序包组成
图3:QuickBoot升级程序包组成-来源:XAPP1081程序包含 3 部分
QuickBoot header
包括:critical switch word:用于指示 FPGA 是否执行 warm boot jump sequence(warm boot jump sequence:包含 WBSTRA(用于指定程序加载地址)、IPROG(用于重启 FPGA 配置并从 WBSTAR 指定的地址开始加载))
golden bitstream image area-Golden位流
update bitstream image area-Update位流(即我们之前说的MultiBoot区位流,为了和MultiBoot区分,后续都以Update位流代替)
QuickBoot 远程升级步骤
1、擦除存放关键开关字的块或者sector,使得关键开关字变成OFF;
2、擦除更新包存放的区域;
3、将update bitstream 写进到更新包区域;
4、验证update bitstream的正确性;
5、验证完成之后写开关关键字,使之变成ON。
所以在验证update bitstream正确之前不能将关键开关字设置为ON。验证完成之后需要将开关关键字设置为ON。
注:golden 和 QuickBoot hear 的第二部分内容 (warm boot jump sequence) 都不允许更改
接下来就是复杂的运算了,需要根据官方的EXCEL表格进行计算,官方给了BPI FLASH和SPI FLASH两个例子。
说实话很复杂,要根据位流大小计算位置,同时要躲开FLASH的最小擦除单元。
位流在 flash 中的位置
Bitstream 在 flash 中的位置(要适配 flash 最小擦除单位 segment)
QuickBoot header
critical switch word:第 1 个 segment
warm boot jump sequence:第 2 个 segment
gloden bitstream image:跟在 warm boot jump sequence 后面
update bitstream image:跟在 golden 后面,但是不能跟 golden 共用一个 segment
再结合官方的EXCEL就可以选择相应位置。
从0地址开始存放数据,因为一个地址是代表1个字节,所以对于一个32bit的数据需要4个地址来代表,也就是地址的递增是以4为单位递增的。
0x0000_0000~0x0000_0FFC对应的是QuickBoot Header PART1。 0x0000_1000~0x0000_1020是QuickBoot Header PART2。紧接着 PART2存放的是golden bitstream。跳转地址是0x0020_0000,所以从这个地址开始存放的是update bitstrean,紧接着是update bitstrean的是0xfffffff填充字,最后 32bit是CRC校验值。
Bitstream 及 FLASH 大小计算
启动时间
QuickBoot配置时间将比标准的配置时间多一点点,从上图可以看出这一点。
参考设计
官方给了《XAPP1081》的参考设计,以下面两个FLASH为例:
参考例程的架构如下:
远程升级模式对比
图3:远程升级模式对比-来源:XAPP1081总结
QuickBoot被“抛弃”从上面分析可以大致推断出以下几点原因:
复杂性:这个东西太复杂了,需要很长时间进行设计;
稳定性:FPGA系统本来就相对稳定的架构,如果Boot搞得很复杂,就会大大降低系统稳定性;
但是QuickBoot升级方式也有自己的优势,就是可以对Golden区进行升级。
官方文档及参考例程详见《refence_doc\XAPP1081》。目前PDF文档官方已经下载不到了。
https://github.com/suisuisi/Update_MultiBoot/tree/main/refence_doc