基于ZYNQMP的linux更新PL程序的方法
在嵌入式Linux系统中,ZYNQMP(Zynq MPSoC,Zynq多处理器系统级芯片)是一种高度集成的器件,集成了ARM Cortex-A53和Cortex-R5处理系统以及可编程逻辑(FPGA)部分。对于开发和调试阶段,能够快速更新PL(Programmable Logic)程序是至关重要的。本文主要介绍了如何在不重启板卡的情况下,通过Linux系统内部实现ZYNQMP的PL程序在线更新。 理解ZYNQMP的存储介质分配至关重要。通常,QSPI NorFlash用于存放引导加载程序(如FSBL和u-boot),而EMMC(外部多媒体卡)则用于存储内核镜像、设备树以及根文件系统。在进行PL程序更新时,只需要更新EMMC中的pl_system.bit.bin文件,而不需要改动BOOT.BIN。这允许我们直接在Linux环境下操作EMMC分区,完成PL程序的更新。 在进行更新前,我们需要准备bin格式的PL程序文件。Vivado 2018.3之前的版本,我们需要使用bootgen工具将bit文件转换为bin文件;而在2018.3及以后的版本中,Vivado可以直接生成bin文件。 接下来,我们需要修改U-Boot源码。在arch/arm/dts目录下的zynqmp.dtsi文件中添加fpga_full设备的描述,以便U-Boot能够识别和处理FPGA更新。然后,通过SDK将修改后的U-Boot以及其他必要文件合成BOOT.bin,并烧录到QSPI NorFlash中。同时,将设备树文件zynqmp_cj2009_ac2009cb.dtb复制并重命名为devicetree.dtb,存储在EMMC的相应分区。 对于Linux内核源码,我们需要进行如下配置: 1. 在配置界面中启用FPGA配置框架,特别是Xilinx Zynqmp FPGA Device Drivers和Device Tree及Open Firmware支持。 2. 启用Contiguous Memory Allocator和DMA Contiguous Memory Allocator,这些选项对于FPGA更新是必要的。 3. 保存配置到arch/arm64/configs/xilinx_zynqmp_ac2009cb_defconfig文件,并重新编译内核。 完成内核源码修改后,构建新的内核镜像,并将其烧录到EMMC的对应分区。同时,需要确保根文件系统中包含了用于更新PL程序的相关脚本和工具。 在Linux系统运行时,通过挂载EMMC的相应分区,执行更新PL程序的脚本,可以将新的bin文件写入FPGA。此过程无需断电或重启板卡,极大地提高了开发效率和调试速度。 总结来说,基于ZYNQMP的Linux更新PL程序方法主要包括:修改U-Boot源码以支持FPGA更新,调整Linux内核配置以启用FPGA驱动,构建并烧录新的内核镜像,以及在Linux环境中执行更新脚本。这种方法简化了开发流程,提高了开发效率,是ZYNQMP平台开发过程中的一个重要技巧。