ZCU106 XRT PetaLinux工程分析【Xilinx Vitis】

1 前言

ZCU106 XRT環境搭建【Xilinx Vitis】中針對我本地的環境,以及ZCU106的需求,生成了最終使用的PetaLinux工程。
PetaLinux工程的創建、編譯都是使用腳本peta_build.sh 來完成的。這篇文章分析一下我本地的不同於ZCU102、ZCU104的區別。

2 工程配置

config.sh文件中可以針對不同硬件平臺進行額外的配置。peta_build.sh在運行中會優先選擇運行config.sh中的功能,而不運行自己的功能。下面進行分析。

2.1 UBOOT

函數:config_peta

# The first argument is the petalinux configure file
#  config_peta <petalinux_project>/project-spec/configs/config
#
config_peta()
{
	PETA_CONFIG_FILE=$1
	echo "CONFIG_YOCTO_ENABLE_DEBUG_TWEAKS=y" >> $PETA_CONFIG_FILE
	echo "CONFIG_YOCTO_LOCAL_SSTATE_FEEDS_URL=\"~/Xilinx/PetaLinux/sstate_aarch64_2019.2/aarch64\"" >> $PETA_CONFIG_FILE
	echo "CONFIG_PRE_MIRROR_URL=\"file://~/Xilinx/PetaLinux/downloads\"" >> $PETA_CONFIG_FILE
}
  • CONFIG_YOCTO_ENABLE_DEBUG_TWEAKS 默認就有的配置,用於跳過用戶名輸入流程
  • CONFIG_YOCTO_LOCAL_SSTATE_FEEDS_URL 用於設置本地sstate目錄地址
  • CONFIG_PRE_MIRROR_URL 用於設置sstate對應donwload目錄地址

設置以上配置的目的是避免每次編譯petalinux工程時從網站去下載第三方庫,而是優先使用本地的相關庫。

2.2 ROOTFS

函數:config_rootfs,rootfs_menu

# The first argument is the rootfs configure file
#  config_rootfs project-spec/configs/rootfs_config
#
config_rootfs()
{
	ROOTFS_CONFIG_FILE=$1
	echo 'CONFIG_xrt=y'                                 >> $ROOTFS_CONFIG_FILE
	echo 'CONFIG_mnt-sd=y'                              >> $ROOTFS_CONFIG_FILE
	echo 'CONFIG_xrt-dev=y'                             >> $ROOTFS_CONFIG_FILE
	echo 'CONFIG_zocl=y'                                >> $ROOTFS_CONFIG_FILE
	echo 'CONFIG_opencl-headers-dev=y'                  >> $ROOTFS_CONFIG_FILE
	echo 'CONFIG_opencl-clhpp-dev=y'                    >> $ROOTFS_CONFIG_FILE
	echo 'CONFIG_packagegroup-petalinux-opencv=y'       >> $ROOTFS_CONFIG_FILE

	echo 'CONFIG_gstreamer-vcu-examples=y'              >> $ROOTFS_CONFIG_FILE
	echo 'CONFIG_gstreamer-vcu-notebooks=y'             >> $ROOTFS_CONFIG_FILE
	echo 'CONFIG_packagegroup-petalinux-v4lutils=y'     >> $ROOTFS_CONFIG_FILE
	echo 'CONFIG_gst-shark=y'                           >> $ROOTFS_CONFIG_FILE
}
# The first argument is the rootfsconfig file
#  rootfs_menu conf/user-rootfsconfig
#
rootfs_menu()
{
	ROOTFSCONFIG=$1
	echo 'CONFIG_xrt'                                   >> $ROOTFSCONFIG
	echo 'CONFIG_mnt-sd'                                >> $ROOTFSCONFIG
	echo 'CONFIG_xrt-dev'                               >> $ROOTFSCONFIG
	echo 'CONFIG_zocl'                                  >> $ROOTFSCONFIG
	echo 'CONFIG_opencl-clhpp-dev'                      >> $ROOTFSCONFIG
	echo 'CONFIG_opencl-headers-dev'                    >> $ROOTFSCONFIG
	echo 'CONFIG_packagegroup-petalinux-opencv'	        >> $ROOTFSCONFIG

	echo 'CONFIG_gstreamer-vcu-examples'                >> $ROOTFSCONFIG
	echo 'CONFIG_gstreamer-vcu-notebooks'               >> $ROOTFSCONFIG
	echo 'CONFIG_packagegroup-petalinux-v4lutils'       >> $ROOTFSCONFIG
	echo 'CONFIG_gst-shark'                             >> $ROOTFSCONFIG
}
  • mnt-sd 是給ROOTFS添加了一個自動加載SD卡的腳本
  • xrt, xrt-dev, zocl, opencl-headers-dev, opencl-clhpp-dev 這些都用於將XRT的相關功能集成到PetaLinux的設置。注意其中的zocl是針對與MPSOC的配置
  • packagegroup-petalinux-opencv 是將OpenCV的相關功能集成到文件系統的配置
  • gstreamer-vcu-examples,gstreamer-vcu-notebooks,gst-shark 是VCU和gstreamer的相關配置
  • packagegroup-petalinux-v4lutils 是V4L2驅動的相關配置,用於處理視頻

2.3 DEVICE-TREE

函數:config_dts

# The first argument is the rootfs configure file
#  config_dts recipes-bsp/device-tree/files/system-user.dtsi
#
config_dts()
{
	DTS_FILE=$1
	#GLOB_DTS=${XRT_REPO_DIR}/src/runtime_src/core/edge/fragments/xlnk_dts_fragment_mpsoc.dts
	#echo "cat ${XRT_REPO_DIR}/src/runtime_src/core/edge/fragments/xlnk_dts_fragment_mpsoc.dts >> recipes-bsp/device-tree/files/system-user.dtsi"
	#cat ${XRT_REPO_DIR}/src/runtime_src/core/edge/fragments/xlnk_dts_fragment_mpsoc.dts >> recipes-bsp/device-tree/files/system-user.dtsi
	echo "cat ${THIS_CONFIG_SCRIPT_DIR}/zcu106vcu_base_fragment.dts >> $DTS_FILE"
	cat ${THIS_CONFIG_SCRIPT_DIR}/zcu106vcu_base_fragment.dts >> $DTS_FILE
}

其它平臺類似,都有這個函數。用於針對ZCU106添加特定的設備樹配置。
zcu106vcu_base_fragment.dts文件內容如下:

/ {
    chosen {
        bootargs = "earlycon clk_ignore_unused consoleblank=0 cma=1000M uio_pdrv_genirq.of_id=generic-uio";
        stdout-path = "serial0:115200n8";
    };
};

&axi_intc_0 {
    compatible = "xlnx,xps-intc-1.00.a";
    xlnx,kind-of-intr = <0x0>;
    interrupt-parent = <&gic>;
    interrupts = <0 89 4>;
};

&amba_pl {
    zyxclmm_drm {
        compatible = "xlnx,zocl";
        status = "okay";
        interrupt-parent = <&axi_intc_0>;
        interrupts = <0  4>, <1  4>, <2  4>, <3  4>,
                 <4  4>, <5  4>, <6  4>, <7  4>,
                 <8  4>, <9  4>, <10 4>, <11 4>,
                 <12 4>, <13 4>, <14 4>, <15 4>,
                 <16 4>, <17 4>, <18 4>, <19 4>,
                 <20 4>, <21 4>, <22 4>, <23 4>,
                 <24 4>, <25 4>, <26 4>, <27 4>,
                 <28 4>, <29 4>, <30 4>, <31 4>;
    };
    vcu_apm: apm@0xb0040000 {
        #address-cells = <0x1>;
        #size-cells = <0x1>;
        compatible = "generic-uio";
        reg = <0x0 0xb0040000 0x0 0x10000>;
        reg-names = "generic";
    };
};

我在處理的時候沒有使用其它板子的方法刪除掉自身的pl.dtsi,所以與其它平臺略有區別。

  • chosen 修改了默認的配置,添加了1000MB的CMA,添加了UIO的驅動
  • axi_intc_0 添加了關於中斷編號的信息
  • zyxclmm_drm就是上面rootfs中的zocl相關的信息(非常重要,不添加的話後面不能正常加載xclbin)
  • vcu_apm 是仿照VCU TRD添加的uio設備信息,可以用於監控HP端口上的數據帶寬

2.4 總結

以上最核心的配置還是rootfs和device-tree,它門影響了驅動層面的東西,處理時候必須要注意。

3 其它

以後補充其它信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章