AMD Xilinx MPSoC 加载bit文件方法大全

作者:付汉杰 hankf@amd.com,AMD赛灵思工程师

总结

建议使用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

参考文档

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

最新文章

最新文章