最近工程需要远程进行代码的更新,查阅了一些资料,找到了multiBoot来实现。
zynq启动顺序依次是BootROM、fsbl、应用层。
根据boot的帧头查找过程,
正常的flash下载过程如下图:
需要下载的程序,每包分成了0x20000(128k)byte,下载到flash中。从地址0开始擦除,4325376 bytes擦除完成。
修改偏移量如下图所示。
可以更改下载到flash中的位置,但偏移量必须是64k的整数倍。
下载过程如下图所示,数据存储从地址0x10000(64kByte)处开始存储。
从地址0x10000开始擦除,4325376 bytes擦除完成。每包分成了0x20000(128k)byte,下载到flash中。
2、以上的操作,出现的问题
由于程序的大小超过了64k,而只偏移了64kByte,而fsbl的大小超过了该区域,因此如果启动模式还是QSPI启动,则一直启动不了,而再次从0地址开始烧写时,出现错误:
Downloading FSBL…
Running FSBL…
Finished running FSBL.
===== mrd->addr=0xF8000110, data=0x000FA220 =====
…
Problem in running uboot
Flash programming initialization failed.
ERROR: Flash Operation Failed
如下图的错误
提示,程序还一直处于uboot过程中,对flash的操作失败。
解决该问题的办法,是更改ZYNQ的启动模式,MIO5接地,JTAG模式启动。在JTAG模式下,重新对FLASH进行烧写,再改为QSPI启动。
3、增加FLASH烧写的过程打印
在fsbl_debug.h文件中,加入
#define FSBL_DEBUG_INFO
则会打印出烧写的调试信息,便于寻找问题,解决问题。