AMD Xilinx MPSoC 加载bit文件方法大全
AMD Xilinx MPSoC 加载bit文件方法大全
总结
建议使用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文件。
bootgen -image Bitstream.bif -arch zynqmp -o ./Bitstream.bin -w
上述命令中的bif文件内如如下。
all:
{
[destination_device = pl] vivado.bit /* Bitstream file name */
}
Linux内核配置
在编译Linux内核时,请使能下列选项。可以把下列内容,复制到project-spec/meta-user/recipes-kernel/linux/linux-xlnx/bsp.cfg,从而使能所有需要的配置项。
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"中。
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。
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。
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。为了易于使用,我创建了下面的简单脚本。
#!/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。为了易于使用,也提供了下面的简单脚本。
#!/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的说明如下。
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文件,使用下列命令。
fpgautil -b top.bit.bin -f Full
如果加载完整的bit和Devicetree,使用下列命令。
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full
如果加载部分的bit和Devicetree,使用下列命令。
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的组成文件。
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)成功。
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是否工作正常。
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
fpga-load.sh /lib/firmware/xilinx/base/ base.bit.bin full
Linux sysfs 加载 partial bit
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
fpga-load-dtbo.sh /lib/firmware/xilinx/base/ base.dtbo full
Linux sysfs 加载 partial bit 和 devicetree
fpga-load-dtbo.sh /lib/firmware/xilinx/kr260-bram1-dfx-partial/ kr260-bram1-dfx-partial.dtbo partial
fpgautil
Linux 加载 full bit
fpgautil -b /lib/firmware/xilinx/base/base.bit.bin -f Full
Linux 加载 full bit 和 devicetree
fpgautil -b /lib/firmware/xilinx/base/base.bit.bin -o /lib/firmware/xilinx/base/base.dtbo -f Full -n full
Linux 加载 partial bit
fpgautil -b /lib/firmware/xilinx/$1/$2.bit.bin -f Partial
Linux 加载 partial bit 和 devicetree
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
参考文档
UG909 Dynamic Function eXchange (v2022.1) June 7, 2022
UG1144 PetaLinux Tools Documentation Reference Guide (v2022.1) April 26, 2022