摘要:
本文介绍了如何使用ZYNQ的串口实现BOOT.BIN程序的在线升级。在Vivado工程中启用相关支持后,通过vitis裸机实现UART 升级。
基本知识
在线升级程序,是只替换Flash中固化的程序,即BOOT.bin,BOOT.bin一般是FSBL+PL.bit+PS.elf构成,其生成BOOT.bin的大致过程请查看XILINX 手册UG821。
程序固化就是将生成的 BOOT.bin 文件烧写到 QSPI 中,其实质是将 BOOT.bin 文件的数据写入到 QSPI 中。将数据写入到 QSPI 中的方式有多种,通过 Vitis 软件工具使用 JTAG 接口写入是一种常用的方式,但是实际的产品中,不可能会有JTAG这些工具,一般只会有串口或者网口这一个外部接口。所以,在线升级就是利用网口或者串口,将BOOT.bin通过串口或者网口发送到板卡,并调用相关函数操作 QSPI向 QSPI 中写入boot.bin。网口的简单教程网上较多,这里提供串口的在线升级方法。
具体操作
1 vivado
要用函数操控QSPI,就要先在vivado中操控勾选相关信息,如下图一所示,我这里是使用的MLK_ZYNQ7100 ,他的FLASH 连接方式是Dual quad spi ,这个具体看自己板卡的连接方式。
2 vitis
在vitis中,配置好串口,然后设置中断,由于自己不会上位机,就用的网上的,只要能发送文件,都可以。首先是更新命令,只有板卡接收到连续5个aa ,才开始接收更新BOOT.bin,。其中断处理函数如下
if(Event == XUARTPS_EVENT_RECV_DATA || Event == XUARTPS_EVENT_RECV_TOUT || Event == XUARTPS_EVENT_RECV_ERROR){
if(EventData == 0){
XUartPs_Recv(&UartPs, RecvCmd, 5);
}
else if(EventData >0)
{
if((EventData == 5 ) && (RecvCmd[0] == 0xaa && RecvCmd[1] ==0xaa && RecvCmd[2] == 0xaa &&RecvCmd[3] == 0xaa && RecvCmd[4] == 0xaa))
{
// XUartPs_Send(&UartPs, SendCmd, 5); //发送应答
XUartPs_Recv(&UartPs, UartBufferPtr, Uart0_Recive_Max);
recv_updata_start = 1;
}
else if((recv_updata_start == 1)&& (EventData >5) )
{
recv_updata_start = 0;
XUartPs_Recv(&UartPs, UartBufferPtr,Uart0_Recive_Max );//继续更新文件
recv_updata_flag = 1;
}
//XUartPs_Recv(&UartPs, RecvCmd, 500);//继续监听
//printf(" recv_uart_EventData = %d\n\r",EventData);
else {
XUartPs_Recv(&UartPs, RecvCmd, 5); //
}
recv_uart_length = EventData;
recv_uart =1;
}
握手信号完成后,将接收的数据写入DDR3,接收完成后,再将数据写入FLASH,
2 Flash 操作
Flash的操作,可以直接看xilinx的历程,然后改改,设置接收中段,将数据接收完之后,并把数据存入ddr3后,就可以进行Flash的擦除和写操作,具体可以看历程。这里擦除完成之后,会将写入Flash中的数据,再读出来验证。当验证完成之后,即代表更新完成,最后会向上位机发送5个 cc。
if(recv_uart == 1){ //接收到数据,
recv_uart = 0;
if(recv_updata_start == 1)
{
XUartPs_Send(&UartPs, SendCmd, 5); //发送应答
}
if(recv_updata_flag == 1 ) //收到更新数据
{
recv_updata_flag = 0;
update_flash(UartBufferPtr, read_buffer, write_buffer, recv_uart_length);
XUartPs_Send(&UartPs, SendOver, 5);
// recv_updata_start = 0;
}
最后看一个视频串口在线升级的视频,由于板卡不支持在QSPI启动模式下,使用JATG下载,所以每一次在使用JATG下载完成程序,通过串口将程序下载到Flash中后,都要手动修改启动方式。串口助手中的乱码,因为自己定义的发送接收都是16进制,但是其他打印信息使用的是ASCII,并不影响
串口在线升级 ZYNQ
3 multiboot
UG821中,详细说了更为可靠的升级方案,即multiboot,基本原理请看UG821,由于本人能力有限,目前无法对上位机进行编写,这就导致,无法将BOOT.bin 下载到Flash中,指定的位置,但是程序实现程序程序跳转已经实现,即使用JATG工具,实现地址偏移,并让两个程序实现跳转,这与multiboot实现原理基本相同,程序可到资源中心下载。
4 后续进行纯FPGA的在线升级