AMD Xilinx MPSoC 加载bit文件方法大全
目录
- 总结
- 介绍
- Bit文件
- Linux内核配置
- PetaLinux Template Fpgamanager
- 加载工具
- sysfs
- configfs (DTBO)
- fpgautil
- 实际测试
- FSBL 加载bit
- U-BOot加载bit
- Linux sysfs 加载 bit
- Linux sysfs 加载 full bit
- Linux sysfs 加载 partial bit
- Linux configfs (DTBO) 加载 bit 和 devicetree
- Linux sysfs 加载 full bit 和 devicetree
- Linux sysfs 加载 partial bit 和 devicetree
- fpgautil
- Linux 加载 full bit
- Linux 加载 full bit 和 devicetree
- Linux 加载 partial bit
- Linux 加载 partial bit 和 devicetree
- 测试环境
- 工具
- 测试单板
- 参考文档
总结
建议使用fpgautil加载,更简单。
介绍
Bit文件
对于FPGA设计,传统设计都是一个FPGA一个设计,产生一个Bit文件。这就是完整bit文件(full bit)。 有些文章中也称之为全工程比特文件。
Xilinx很早之前有PR(Partial Re-Configuration)特性,最近更新成DFX(Dynamic Functi on eXchange )特性。FPGA设计分为两个部分。一部分加载后就不再更改,称之为静态设计。另外一部分可以对应多个设计,可以被重新配置,每个可被重配置的设计产生一个Bit文件, 称之为部分bit文件(partial bit), 有些文章中也称之为动态区部分比特文件。
Vivado输出的是bit或者bin文件。在U-Boot或者Linux下,需要使用boogen产生的.bit.bin文件。 对于2018.1及其后续版本,需要使用下面的命令,将bit文件转换为.bit.bin文件。
代码语言:javascript复制bootgen -image Bitstream.bif -arch zynqmp -o ./Bitstream.bin -w
上述命令中的bif文件内如如下。
代码语言:javascript复制all:
{
[destination_device = pl] vivado.bit /* Bitstream file name */
}
Linux内核配置
在编译Linux内核时,请使能下列选项。可以把下列内容,复制到project-spec/meta-user/recipes-kernel/linux/linux-xlnx/bsp.cfg,从而使能所有需要的配置项。
代码语言:javascript复制CONFIG_FPGA=y
CONFIG_FPGA_MGR_DEBUG_FS=y
CONFIG_XILINX_AFI_FPGA=y
CONFIG_FPGA_BRIDGE=y
CONFIG_XILINX_PR_DECOUPLER=y
CONFIG_FPGA_REGION=y
CONFIG_OF_FPGA_REGION=y
CONFIG_FPGA_MGR_ZYNQMP_FPGA=y
CONFIG_OF_OVERLAY=y
CONFIG_OF_CONFIGFS=y
CONFIG_OVERLAY_FS=y
CONFIG_CMA=y
CONFIG_CMA_DEBUGFS=y
CONFIG_CMA_SYSFS=y
CONFIG_CMA_AREAS=7
CONFIG_DMA_CMA=y
PetaLinux Template Fpgamanager
PetaLinux提供向系统添加bit、dts的模板fpgamanager。使用下列命令,能向PetaLinux工程添加bit文件和设备树。 PetaLinux会自动编译bit文件和设备树,添加到单板的Linux文件系统的目录"/lib/firmware/xilinx"中。
代码语言:javascript复制petalinux-create -t apps --template fpgamanager -n can-interface --
srcuri "<path-to-dtsi>/pl.dtsi <path-to-bitfile>/system.bit" --enable
其中的Bit文件,可以是完整bit文件,也可以是部分bit文件(partial bit)。 其中的pl.dtsi,需要与Bit文件对应。
在2022.1里,使用PetaLinux Template Fpgamanager添加后,创建的是app。
代码语言:javascript复制hankf@XSZGS4:recipes-apps$ pwd
/proj/hankf/kr260/v221/kr260-221-bsp-peta/project-spec/meta-user/recipes-apps
hankf@XSZGS4:recipes-apps$ tree
.
dfx-bram1-dfx-partial
dfx-bram1-dfx-partial.bb
files
kr260_starter_kit_bram1_partial.bit
kr260_starter_kit_bram1_partial.dtsi
shell.json
README
dfx-bram1-static
dfx-bram1-static.bb
files
kr260_starter_kit_bram1_base.bit
kr260_starter_kit_bram1_static.dtsi
shell.json
README
dfx-bram2-dfx-partial
dfx-bram2-dfx-partial.bb
files
kr260_starter_kit_bram2_partial.bit
kr260_starter_kit_bram2_partial.dtsi
shell.json
README
......
12 directories, 30 files
在2022.2里,使用PetaLinux Template Fpgamanager添加后,创建的是firmware。
代码语言:javascript复制hankf@XSZGS4:recipes-firmware$ pwd
/proj/hankf/kr260/v222/kr260-v222-bsp-dfx-ol-peta/project-spec/meta-user/recipes-firmware
hankf@XSZGS4:recipes-firmware$ tree
.
kr260-bram1-dfx-partial
files
kr260_bram1_dfx_partial.bit
kr260_bram1_dfx_partial.dtsi
shell.json
kr260-bram1-dfx-partial.bb
README
kr260-bram1-static
files
kr260_bram1_base.bit
kr260_bram1_static.dtsi
shell.json
kr260-bram1-static.bb
README
kr260-bram2-dfx-partial
files
kr260_bram2_dfx_partial.bit
kr260_bram2_dfx_partial.dtsi
shell.json
kr260-bram2-dfx-partial.bb
README
......
22 directories, 58 files
加载工具
sysfs
Linux内核的FPGA Manager框架,支持所有Xilinx Zynq-7000和MPSoC。 它通过sysfs,提供了加载Bit文件的办法。 sysfs的使用办法,可以参考MPSoC PL Programming。为了易于使用,我创建了下面的简单脚本。
代码语言:javascript复制#!/bin/bash
# fpga-load.sh
echo -e "Usage directory_name file_name flag(full, partial)"
# Steps for programming the Bitstream
if [ "$3" = "partial" ]; then
echo 1 > /sys/class/fpga_manager/fpga0/flags
elif [ "$3" = "full" ]; then
echo 0 > /sys/class/fpga_manager/fpga0/flags
else
echo -e "No .bit.bin partial/full flag"
exit 1
fi
mkdir -p /lib/firmware
# Load the Bitstream
echo "bitstream file is $1/$2"
cp $1/$2 /lib/firmware/
ls -l /lib/firmware/$2
# FPGA programming using sysfs attributes
echo $2 > /sys/class/fpga_manager/fpga0/firmware
通过sysfs,既可以加载完整bit文件(full bit),也可以加载部分bit文件(partial bit) 。 对于部分bit文件(partial bit) 的功能,要特别小心。设计部分bit文件(partial bit)时,最好加上保护,比如AXI Shutdown Manager, DFX Decoupler。 如果没有保护,部分bit文件(partial bit)的功能不一定正确,比如访问部分bit文件(partial bit)里的AXI 寄存器时可能出现挂死。
configfs (DTBO)
在sysfs的基础上, configfs也通过加载DTBO, 提供了加载Bit文件的办法。 DTBO文件对应的dts文件里的firmware-name,指定了对应的.bit.bin。 configfs的使用办法,可以参考MPSoC PL Programming。为了易于使用,也提供了下面的简单脚本。
代码语言:javascript复制#!/bin/bash
# fpga-load-dtbo.sh
echo -e "Usage directory_name dtbo_file_name partial/full"
dmesg -c > /dev/null
# Set flags for Bitstream, 0 : full, 1: partial
if [ "$3" = "partial" ]; then
echo 1 > /sys/class/fpga_manager/fpga0/flags
# Remove existing partial dtbo
echo -e "Remove existing partial dtbo:"
rm -f /configfs/device-tree/overlays/*PR*
rmdir /configfs/device-tree/overlays/*PR*
rm -f /configfs/device-tree/overlays/*partial*
rmdir /configfs/device-tree/overlays/*partial*
mkdir /configfs/device-tree/overlays/fpga_partial
elif [ "$3" = "full" ]; then
echo 0 > /sys/class/fpga_manager/fpga0/flags
# Remove existing dtbo
echo -e "Remove existing dtbo:"
rm -f /configfs/device-tree/overlays/*
rmdir /configfs/device-tree/overlays/*
mkdir /configfs/device-tree/overlays/fpga_full
else
echo -e "No .dtbo partial/full flag"
exit 1
fi
cp -f $1/* /lib/firmware/
echo -e "Directory /lib/firmware content:"
ls -l /lib/firmware/$2
if [ "$3" = "partial" ]; then
echo -n "$2" > /configfs/device-tree/overlays/fpga_partial/path
else
echo -n "$2" > /configfs/device-tree/overlays/fpga_full/path
fi
dmesg -c
fpgautil
另外, Xilinx另外提供了一个工具fpgautil, 提供了比sysfs和configfs更简便的加载Bit文件的办法。 fpgautil的说明如下。
代码语言:javascript复制xilinx-kr260-starterkit-20222:/home/petalinux# fpgautil
fpgautil: FPGA Utility for Loading/reading PL Configuration
Usage: fpgautil -b <bin file path> -o <dtbo file path>
Options: -b <binfile> (Bin file path)
-o <dtbofile> (DTBO file path)
-f <flags> Optional: <Bitstream type flags>
f := <Full | Partial >
-n <Fpga region info> FPGA Regions represent FPGA's
and partial reconfiguration
regions of FPGA's in the
Device Tree
Default: <full>
-s <secure flags> Optional: <Secure flags>
s := <AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM>
-k <AesKey> Optional: <AES User Key>
-r <Readback> Optional: <file name>
Default: By default Read back contents will be stored in readback.bin file
-t Optional: <Readback Type>
0 - Configuration Register readback
1 - Configuration Data Frames readback
Default: 0 (Configuration register readback)
-R Optional: Remove overlay from a live tree
Examples:
(Load Full bitstream using Overlay)
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full
(Load Partial bitstream using Overlay)
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0
(Load Full bitstream using sysfs interface)
fpgautil -b top.bit.bin -f Full
(Load Partial bitstream using sysfs interface)
fpgautil -b rm0.bit.bin -f Partial
(Load Authenticated bitstream through the sysfs interface)
fpgautil -b top.bit.bin -f Full -s AuthDDR
(Load Parital Encrypted Userkey bitstream using Overlay)
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k <32byte key value>
(Read PL Configuration Registers)
fpgautil -b top.bit.bin -r
(Remove Partial Overlay)
fpgautil -R -n PR0
(Remove Full Overlay)
fpgautil -R -n full
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.
如果只加载bit文件,使用下列命令。
代码语言:javascript复制fpgautil -b top.bit.bin -f Full
如果加载完整的bit和Devicetree,使用下列命令。
代码语言:javascript复制fpgautil -b top.bit.bin -o can.dtbo -f Full -n full
如果加载部分的bit和Devicetree,使用下列命令。
代码语言:javascript复制fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0
实际测试
FSBL 加载bit
把bit文件,加入到BOOT.BIN中, FSBL在启动过程中会自动加载bit。 如果使用PetaLinux产生BOOT.BIN中,对应的命令是“petalinux-package --boot --u-boot --fpga --force”。 在PetaLinux的工程目录执行上述命令后,在工程的build目录下有文件bootgen.bif,说明了BOOT.BIN的组成文件。
代码语言:javascript复制the_ROM_image:
{
[bootloader, destination_cpu=a53-0] /proj/hankf/kr260/v222/kr260-v222-bsp-peta/images/linux/zynqmp_fsbl.elf
[pmufw_image] /proj/hankf/kr260/v222/kr260-v222-bsp-peta/images/linux/pmufw.elf
[destination_cpu=a53-0, exception_level=el-3, trustzone] /proj/hankf/kr260/v222/kr260-v222-bsp-peta/images/linux/bl31.elf
[destination_cpu=a53-0, load=0x00100000] /proj/hankf/kr260/v222/kr260-v222-bsp-peta/images/linux/system-zynqmp-sck-kr-g-revB.dtb
[destination_cpu=a53-0, exception_level=el-2] /proj/hankf/kr260/v222/kr260-v222-bsp-peta/images/linux/u-boot.elf
}
在FSBL启动过程中,会打印信息“PL Configuration done successfully”,提示加载FPGA(PL)成功。
代码语言:javascript复制Xilinx Zynq MP First Stage Boot Loader
Release 2022.2 Oct 25 2022 - 05:46:55
MultiBootOffset: 0x40
Reset Mode : System Reset
Platform: Silicon (4.0), Running on A53-0 (64-bit) Processor, Device Name: XCZUUNKNEG
QSPI 32 bit Boot Mode
FlashID=0x20 0xBB 0x20
Non authenticated Bitstream download to start now
PL Configuration done successfully
U-BOot加载bit
在U-Boot下, 先把.bit.bin文件加载到内存,再用命令“fpga load”加载FPGA。 后,可以使用命令“md.l“访问FPGA的寄存器,检查FPGA是否工作正常。
代码语言:javascript复制ZynqMP> fatload usb 0 0x800000 kr260-base.bit.bin
6134400 bytes read in 410 ms (14.3 MiB/s)
ZynqMP> fpga load 0 0x800000 0x57CDF3
ZynqMP> md.l 0xb0000000
b0000000: 00000000 ffffffff 00000000 ffffffff ................
b0000010: 00000000 ffffffff 00000000 ffffffff ................
Linux sysfs 加载 bit
Linux sysfs 加载 full bit
代码语言:javascript复制fpga-load.sh /lib/firmware/xilinx/base/ base.bit.bin full
Linux sysfs 加载 partial bit
代码语言:javascript复制fpga-load.sh /lib/firmware/xilinx/kr260-bram1-dfx-partial/ kr260-bram1-dfx-partial.bit.bin partial
Linux configfs (DTBO) 加载 bit 和 devicetree
Linux sysfs 加载 full bit 和 devicetree
代码语言:javascript复制fpga-load-dtbo.sh /lib/firmware/xilinx/base/ base.dtbo full
Linux sysfs 加载 partial bit 和 devicetree
代码语言:javascript复制fpga-load-dtbo.sh /lib/firmware/xilinx/kr260-bram1-dfx-partial/ kr260-bram1-dfx-partial.dtbo partial
fpgautil
Linux 加载 full bit
代码语言:javascript复制fpgautil -b /lib/firmware/xilinx/base/base.bit.bin -f Full
Linux 加载 full bit 和 devicetree
代码语言:javascript复制fpgautil -b /lib/firmware/xilinx/base/base.bit.bin -o /lib/firmware/xilinx/base/base.dtbo -f Full -n full
Linux 加载 partial bit
代码语言:javascript复制fpgautil -b /lib/firmware/xilinx/$1/$2.bit.bin -f Partial
Linux 加载 partial bit 和 devicetree
代码语言:javascript复制fpgautil -b /lib/firmware/xilinx/$1/$2.bit.bin -o /lib/firmware/xilinx/$1/$2.dtbo -f Partial -n PR0
测试环境
工具
X86 Ubuntu 18.04 Vitis 2022.1 PetaLinux 2022.1
测试单板
KR260
参考文档
MPSoC PL Programming
Zynq-7000 PL Programming
KR260 Web Page
UG909 Dynamic Function eXchange (v2022.1) June 7, 2022
UG1144 PetaLinux Tools Documentation Reference Guide (v2022.1) April 26, 2022