前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AMD Xilinx MPSoC 加载bit文件方法大全

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

作者头像
hankfu
发布2022-11-14 16:56:41
1.8K0
发布2022-11-14 16:56:41
举报
文章被收录于专栏:hankhank

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文件。

代码语言: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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 总结
  • 介绍
    • 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
            • 测试环境
              • 工具
                • 测试单板
                • 参考文档
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档