ZynqMP Vitis PS加载PL代码

前言:

1、PL只是PS的一个外设,且PL的代码也是可以更新的。

2、尝试做一个让PS运行后根据当前运行环境加载不同的PL代码。

3、xilinx在vitis工具有个BSP库叫xilfpga,封装了全部的加载PL代码API,

故调用这个接口就能完成该实验。很简单的过程。

4、这个BSP库支持PL代码格式有Vivado生成的bit和bin文件 及 bootgen生成的bin文件。

这个BSP库路径在vitis的安装路径下,文件夹下还有doc可以看一下:

/Vitis/2021.1/data/embeddedsw/lib/sw_services/xilfpga_v6_0

这个路径下有很多xilfpga_vx_x版本,具体根据实际情况定。

1、准备:

1、创建一个Platform工程。

2、由Vivado生成的1s闪烁LED的PL代码的bit 及 bin文件。

Vivado生成bin文件流程 : 点击Tools -->> Settings... -->>Project Settings -->> Bitstream 

 生成的文件在Vivado工程目录下的

./project_fsbl_fpga.runs/impl_1/design_1_wrapper.bit

./project_fsbl_fpga.runs/impl_1/design_1_wrapper.bin

2、bootgen的bin文件生成

说起bootgen工具可能点陌生,这是什么东西?

不知道的可以去xilinx官网搜索文件索引号《ug1283 Bootgen 用户指南》中文版。

实际上,下图就是bootgen界面,boot image partitions只设置一个bit文件路径,

然后创建image就是bootgen生成的boot.bin文件了。

当然也可以使用命令行生成bootgen的bin文件。

 3、Platform 工程添加BSP xilfpga 库

选中Platform工程中的Platform.spr -->> standalone on psu_cortexa53_0 -->> Board Support Package -->> Modify BSP Settings.

勾中所需的三个BSP库:xilfpga xilsecure。        点击OK。     

最后按下键盘的 Ctrl + B 全部编译一下。

 注:不勾选xilsecure这个库的话会报错,因为xilfpga库的API调用到了xilsecure库的API.

这个时候就可以导入xfpga库的相关examples了。

4、编程PL端代码文件加载

准备好了Vivado的bit和bin文件,还有bootgen的bin文件。一共三个文件。

xfpga这个bsp库支持上面这三种的PL代码格式加载,故都打算测试一下。

先把这三个文件转变成C语言数组,我使用的是工具是<Bin2C.exe>这个工具。

注:使用WinHex打开文件然后打算按照C语言数组复制出来,发现文件太大了,复制失败。

下面程序单个bin文件加载:

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xilfpga.h"
#include "vivado_bin_design_1_wrapper.h"

#define VIVADO_BIN_BITSTREAM_SIZE 		7797692

/*****************************************************************************/
int main(void)
{
	u64 addr = (u64)acvivado_bin_design_1_wrapper;
	XFpga XFpgaInstance = {0U};
	UINTPTR KeyAddr = (UINTPTR)NULL;
	s32 Status;

	xil_printf("Loading Bitstream for DDR location :0x%x\n\r", addr);
	xil_printf("Trying to configure the PL ......\n\r");

	Status = XFpga_Initialize(&XFpgaInstance);
	if (Status != XST_SUCCESS) {
		goto done;
	}

	Status = XFpga_BitStream_Load(&XFpgaInstance, addr, KeyAddr,
			VIVADO_BIN_BITSTREAM_SIZE, XFPGA_FULLBIT_EN);

 done:
	if (Status == XFPGA_SUCCESS)
		xil_printf("PL Configuration done successfully");
	else
		xil_printf("PL configuration failed\n\r");
	
	while(1);

	return 0;
}

5、函数API说明

函数XFpga_Initialize :

                此 API 在调用时会使用默认设置初始化 XFPGA 接口。

函数XFpga_BitStream_Load:

                Addr :内存中PL代码文件数组基地址。

                KeyAddr:用于解密的 Aes 密钥地址。没有就写NULL。

                Size:内存中PL代码文件数组大小。

                Flags Flags 用于指定比特流文件的类型。
                          * * BIT(0) - 比特流类型
                                  * * 0 - 完整比特流
                                  * * 1 - 部分比特流
                          * * BIT(1) - 使用 DDR 进行身份验证
                                  * * 1 - 启用
                                  * * 0 - 禁用
                          * * BIT(2) - 使用 OCM 进行身份验证
                                  * * 1 - 启用
                                  * * 0 - 禁用
                          * * BIT(3) - 用户密钥加密
                                  * * 1 - 启用
                                  * * 0 - 禁用
                          * * BIT(4) - 设备密钥加密
                                  * * 1 - 启用
                                  * * 0 - 禁用

注意:XFpga_BitStream_Load这个函数只支持加密和身份验证,至于bootgen生成的bin文件可以的checksum(sha3)校验和是不支持的,

        即不进行checksum验证。即使PL代码出现问题也不会影响代码加载。

6、PL端三个代码文件循环加载

由于全是1s的LED闪烁,我修改了其中一个编程400ms闪烁一次,现象比较明显。

每隔10s切换一个PL代码。

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xilfpga.h"
//#include "vivado_bin_design_1_wrapper.h"
#include "vivado_bin_design_1_wrapper_400ms.h"
#include "vivado_bit_design_1_wrapper.h"
#include "bootgen_bin_design_1_wrapper.h"
#include "sleep.h"



#define VIVADO_BIN_BITSTREAM_SIZE 			7797692
#define VIVADO_BIN_MS_BITSTREAM_SIZE 		7797692
#define VIVADO_BIT_BITSTREAM_SIZE 			7797812
#define BOOTGEN_BIN_BITSTREAM_SIZE 			7807932

u64 addr[3] = {
		(u64)acvivado_bin_design_1_wrapper_400ms,
		(u64)acvivado_bit_design_1_wrapper,
		(u64)acbootgen_bin_design_1_wrapper,
};

u32 lens[3] = {
		VIVADO_BIN_MS_BITSTREAM_SIZE,
		VIVADO_BIT_BITSTREAM_SIZE,
		BOOTGEN_BIN_BITSTREAM_SIZE,
};

u8 name[3][50] = {
		{"vivado_bin_design_1_wrapper_400ms"},
		{"vivado_bit_design_1_wrapper"},
		{"bootgen_bin_design_1_wrapper"},
};

/*****************************************************************************/
int main(void)
{
	int index = 0;
	s32 Status;
	XFpga XFpgaInstance = {0U};
	UINTPTR KeyAddr = (UINTPTR)NULL;

	while(1)
	{
		xil_printf("Trying to configure the PL ......\n\r");
		xil_printf("Loading Bitstream for DDR location :%s\n\r", &name[index]);

		Status = XFpga_Initialize(&XFpgaInstance);
		if (Status != XST_SUCCESS) {
			xil_printf("PL XFpga_Initialize configuration failed\n\r");
			return 1;
		}

		Status = XFpga_BitStream_Load(&XFpgaInstance, addr[index], KeyAddr,
				lens[index], XFPGA_FULLBIT_EN);
		if (Status != XST_SUCCESS) {
			xil_printf("PL XFpga_BitStream_Load configuration failed\n\r");
			return 2;
		}

		xil_printf("PL Configuration done successfully");
		index = (index + 1) % 3;

		sleep(10);
	}
}

现象:

400ms闪烁切换到1s闪烁。

全篇完。

本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解,记录成长笔记。
笔记是以最简单的方式,只展示最核心的原理。
若有与 大神大大 见解有歧义,我绝对坚信 大神大大 见解是对的,我的是错的。
若无积分等无法下载源码,可私聊留下邮箱。
感谢~!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值