环境准备

需要先拉取meta-adiAD的Linux分支(2022_R2)、使用的系统是Ubuntu 22.04。

可以参考教程:meta-adi/meta-adi-xilinx/README.md at 2019_R2 · analogdevicesinc/meta-adiBuilding the Zynq Linux kernel and devicetrees from source Analog Devices Wiki]

Petalinux 与meta-adi版本的对应关系如下:

Petalinux versionMeta-adi branchDocumentation
2018.22018_R2README
2018.32019_R1README
2019.12019_R2README
2021.12021_R1README
2021.2masterREADME

与Vivado的对应关系,请移步前面的文章。

cyqsd@cyqsd-virtual-machine:~/Workspace/ad9361_linux_2019$ sudo dpkg-reconfigure dash
cyqsd@cyqsd-virtual-machine:~/Workspace/ad9361_linux_2019$ cd /opt/tools/petalinux
cyqsd@cyqsd-virtual-machine:/opt/tools/petalinux$ ls
petalinux-v2022.2-10141622-installer.run
cyqsd@cyqsd-virtual-machine:/opt/tools/petalinux$ ./petalinux-v2022.2-10141622-installer.run 
INFO: Checking installation environment requirements...
WARNING: This is not a supported OS
INFO: Checking free disk space
INFO: Checking installed tools
INFO: Checking installed development libraries
INFO: Checking network and other services
WARNING: No tftp server found - please refer to "UG1144 2019.2 PetaLinux Tools Documentation Reference Guide" for its impact and solution
INFO: Checking installer checksum...
INFO: Extracting PetaLinux installer...

LICENSE AGREEMENTS

PetaLinux SDK contains software from a number of sources.  Please review
the following licenses and indicate your acceptance of each to continue.

You do not have to accept the licenses, however if you do not then you may 
not use PetaLinux SDK.

Use PgUp/PgDn to navigate the license viewer, and press 'q' to close

Press Enter to display the license agreements
Do you accept Xilinx End User License Agreement? [y/N] > y
Do you accept Third Party End User License Agreement? [y/N] > y
INFO: Installing PetaLinux...
*********************************************
WARNING: You haven't specified the installation location.
*********************************************
*********************************************
WARNING: By default, it will be installed in your working directory: /opt/tools/petalinux
*********************************************
Please input "y" to proceed the installation, "n" to exit otherwise:y
*********************************************
WARNING: PetaLinux installation directory: /opt/tools/petalinux/. is not empty!
*********************************************
Please input "y" to continue to install PetaLinux in that directory?[n]y
INFO: Checking PetaLinux installer integrity...
INFO: Installing PetaLinux SDK to "/opt/tools/petalinux/."
INFO: Installing buildtools in /opt/tools/petalinux/./components/yocto/buildtools
INFO: Installing buildtools-extended in /opt/tools/petalinux/./components/yocto/buildtools_extended
INFO: PetaLinux SDK has been installed to /opt/tools/petalinux/.

创建项目

# 初始化环境
source /opt/tools/Xilinx/Vivado/2022.2/settings64.sh
source /opt/tools/petalinux/settings.sh

petalinux-create -t project --template zynq -n ad9361_linux_2022
# 指定xsa所在的目录(就在项目下就不填了)
petalinux-config --get-hw-description

旧版本(2019)可能会,提示menu config问题。但实际上也别在Ubuntu 22中跑2019,会有各种问题:

ERROR: Failed to menu config project component
ERROR: Failed to config project.
ERROR: Get hw description Failed!.
# 进入/home/cyqsd/Workspace/ad9361_linux_2019/build ,查看日志
cat config.log
# 安装libncursesw5-dev依赖
cyqsd@cyqsd-virtual-machine:~/Workspace/ad9361_linux_2019$ sudo apt-get install libncursesw5-dev libncursesw5

image-20241229225235045.webp

[INFO] generating Kconfig for project
INFO: [Hsi 55-2053] elapsed time for repository (/opt/tools/petalinux/tools/xsct/data/embeddedsw) loading 0 seconds
[INFO] menuconfig project
mconf: error while loading shared libraries: libncursesw.so.5: cannot open shared object file: No such file or directory

参照:libncursesw.so.5: cannot open shared object file: No such file or directory - Ubuntu 20.04 - petalinux-config,网上检索的时候还看到终端窗口尺寸过小也报错的。

没有问题后,会弹出System Configuration

image-20241230013651666.webp

编译配置

进入Yocto Settings → User Layers中配置meta-adi,第一项得是core

image-20241230013732634.webp

指定Analog Devices的内核,并不使用xilinx的内核。

image-20241230013816777.webp

Linux Components Selection → External linux-kernel local source settings中指定内核路径。

image-20241230013844576.webp

我的开发板是从内存卡启动的,文件系统类型还需要配置EXT4类型,根据实际情况选择即可。

image-20241230013938808.webp

一开始没安装tftpboot,取消勾选 Copy final images to tftpboot

image-20241230013920933.webp

cyqsd@cyqsd-virtual-machine:~/Workspace/ad9361_linux_2022$ petalinux-config --get-hw-description
[INFO] Sourcing buildtools
INFO: Getting hardware description...
INFO: Renaming system_top.xsa to system.xsa
[INFO] Generating Kconfig for project
[INFO] Menuconfig project


*** End of the configuration.
*** Execute 'make' to start the build or try 'make help'.

[INFO] Extracting yocto SDK to components/yocto. This may take time!
[INFO] Sourcing build environment
[INFO] Generating kconfig for Rootfs
[INFO] Silentconfig rootfs
[INFO] Generating plnxtool conf
[INFO] Adding user layers
[INFO] Generating workspace directory

U-Boot

此处的U-Boot是使用原版,没有特别需要的话,不用再次修改。U-Boot的启动配置从内核中传递,内核配置好就行。

image-20241230175150917.webp

配置设备树

不使用xilinx的内核后,指定AD的内核。会提示找不到KERNEL_DTB:

WARNING: KERNEL_DTB is not defined. Your build is likely to fail! Make sure to define it in a conf file...
ERROR: device-tree-xilinx-... do_configure: Error: Could not find "pl-delete-nodes-.dtsi" in ...
# ...等等各种的类似错误...

petalinuxbsp.conf中指定设备树:

cd /home/cyqsd/Workspace/linux-2022_R2/arch/arm/boot/dts
# 找到合适的设备树,比如zynq-zed-adv7511-ad9361-fmcomms2-3

// SPDX-License-Identifier: GPL-2.0
/*
 * Analog Devices AD-FMCOMMS2-EBZ/AD-FMCOMMS3-EBZ
 * https://wiki.analog.com/resources/eval/user-guides/ad-fmcomms2-ebz
 * https://wiki.analog.com/resources/eval/user-guides/ad-fmcomms3-ebz
 *
 * hdl_project: <fmcomms2/zc702>
 * board_revision: <>
 *
 * Copyright (C) 2014-2019 Analog Devices Inc.
 */


# 编辑
/home/cyqsd/Workspace/ad9361_linux_2022/project-spec/meta-user/conf/petalinuxbsp.conf

# 如果不是官方设备,需要考虑的设备树文件及依赖,手搓要一起加上
 - zynq-zed-adv7511-ad9361-fmcomms2-3.dts
 - adi-fmcomms2.dtsi
 - adi-fmcomms3-up-down-converter.dtsi

增加KERNEL_DTB

#User Configuration

#OE_TERMINAL = "tmux"

KERNEL_DTB = "zynq-zed-adv7511-ad9361-fmcomms2-3"

遇到fatal: unable to access 'https://github.com/analogdevicesinc/libad9361-iio.git/': Empty reply from server等类似网络问题,使用魔法解决。

然后就是等待了。

image-20241230014631216.webp

配置好的Kernel Configuration中可以看到Analog Devices的项目,可以减少自己从头移植的成本。

image-20241230091430292.webp

image-20241230091504650.webp

指定启动参数

meta-adi中设计了适配的设备,编译时设备树会移除指定节点,如果开发板需要适配的话,得考虑这一点,否则不能直接编译通过。

/home/cyqsd/Workspace/meta-adi-2022_R2/meta-adi-xilinx/recipes-bsp/device-tree/files目录中,会有比如pl-delete-nodes-zynq-zed-adv7511-ad9361-fmcomms2-3.dtsipl-delete-nodes-zynq-zc702-adv7511-ad9361-fmcomms5.dtsi,这种使用pl-delete-nodes-开头的,打开后是这样的内容:

/*Delete nodes from pl.dtsi which are redefined in ADI dts*/
/delete-node/ &axi_ad9361;
/delete-node/ &axi_ad9361_dac_dma;
/delete-node/ &axi_ad9361_adc_dma;
/delete-node/ &axi_hdmi_dma;
/delete-node/ &axi_hdmi_clkgen;
/delete-node/ &axi_hdmi_core;
/delete-node/ &axi_i2s_adi;
/delete-node/ &axi_iic_fmc;
/delete-node/ &axi_iic_main;
/delete-node/ &axi_spdif_tx_core;
/delete-node/ &misc_clk_0;
/delete-node/ &misc_clk_1;
/delete-node/ &misc_clk_2;
/delete-node/ &axi_sysid_0;

要注意以下问题:

  1. 编译时,会自动复制到/home/cyqsd/Workspace/ad9361_linux_2022/build/tmp/work/zynq_generic-xilinx-linux-gnueabi/device-tree/xilinx-v2022.2+gitAUTOINC+24d29888d0-r0目录下,所以修改/build/tmp/里面的内容是没有意义的,需要从上游(meta-adi-xilinx)修改。
  2. /home/cyqsd/Workspace/meta-adi-2022_R2/meta-adi-xilinx/recipes-bsp/device-tree/device-tree.bbappend文件中,指定了pl-delete-nodes-文件,需要保证你新增的与此处能一一对应。

    FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
    
    SRC_URI:append:zynq = " \
            file://pl-delete-nodes-zynq-zed-adv7511-ad9361-fmcomms2-3.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511-ad9434-fmc-500ebz.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511-fmcdaq2.dtsi \
            file://pl-delete-nodes-zynq-zed-adv7511.dtsi \
            file://pl-delete-nodes-zynq-zed-adv7511-ad9467-fmc-250ebz.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511-adrv9009.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511-adrv9371.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511-ad6676-fmc.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511-ad9739a-fmc.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511-ad9625-fmcadc2.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511-ad9265-fmc-125ebz.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511-ad9361-fmcomms2-3.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511-ad9361-fmcomms5.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511-fmcomms11.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511-fmcdaq3-revC.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511-fmcjesdadc1.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511-adrv9008-1-jesd204-fsm.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511-adrv9008-2-jesd204-fsm.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511-ad9172-fmc-ebz.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511-adrv9375-jesd204-fsm.dtsi \
            file://pl-delete-nodes-zynq-zc706-adv7511-ad9081.dtsi \
            file://pl-delete-nodes-zynq-zed-imageon.dtsi \
            file://pl-delete-nodes-zynq-zed-adv7511-adrv9002.dtsi \
            file://pl-delete-nodes-zynq-zed-adv7511-adrv9002-rx2tx2.dtsi \
            file://pl-delete-nodes-zynq-adrv9361-z7035-bob-cmos.dtsi \
            file://pl-delete-nodes-zynq-adrv9361-z7035-bob.dtsi \
            file://pl-delete-nodes-zynq-adrv9361-z7035-fmc.dtsi \
            file://pl-delete-nodes-zynq-adrv9364-z7020-bob-cmos.dtsi \
            file://pl-delete-nodes-zynq-adrv9364-z7020-bob.dtsi \
            file://pl-delete-nodes-zynq-zc702-adv7511-ad9361-fmcomms5.dtsi \
            file://pl-delete-nodes-zynq-zc701-fmcomms2-3.dtsi \
            file://pl-delete-nodes-zynq-zc702-adv7511.dtsi"
            
    ... 下面省略了一堆内容 ...
    1. 新增的dtsi需要无嵌套依赖,否则内核无法启动。

根据实际情况进行适配,酌情修改/meta-adi-xilinx/recipes-bsp/device-tree/files中的pl-delete-nodes-文件,比如此次我使用的开发板和原版的设备树节点名称并不能对应上,我直接将此处内容注释,从system-user.dtsi中手搓。

/*Delete nodes from pl.dtsi which are redefined in ADI dts*/
/*/delete-node/ &axi_ad9361_0;
/delete-node/ &misc_clk_0;
/delete-node/ &axi_ad9361_1;
/delete-node/ &axi_ad9361_adc_dma;
/delete-node/ &axi_ad9361_dac_dma;
/delete-node/ &axi_hdmi_clkgen;
/delete-node/ &axi_hdmi_core;
/delete-node/ &misc_clk_1;
/delete-node/ &axi_hdmi_dma;
/delete-node/ &axi_iic_main;
/delete-node/ &axi_spdif_tx_core;
/delete-node/ &misc_clk_2;*/
/delete-node/ &axi_sysid_0;

默认的配置是从flash上启动的。

console=ttyPS0,115200n8 root=/dev/ram rw initrd=0x00800000,16M earlyprintk mtdparts=physmap-flash.0:512K(nor-fsbl),512K(nor-u-boot),5M(nor-linux),9M(nor-user),1M(nor-scratch),-(nor-rootfs) 

稍加修改,能从内存卡或者emmc中启动。

console=ttyPS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait

直接在/home/cyqsd/Workspace/ad9361_linux_2022/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi中配置。

此处我参考了:zynq+ad9361 petalinux使用官方IIO示波器调试记录_zynq示波器-CSDN博客,我的开发板和ZED+fmcomms2的配置并不相同,但是和文章描述的zynq-zc702-adv7511-ad9361-fmcomms5开发板相近,只是去掉设备树上的多出来的AD9361就行,再次额外指定调试用的串口。

我推荐的是如果确实要手搓设备树,那就优先在system-user.dtsi中添加调试串口,以反馈问题,不然有问题也不一定清楚问题在哪里。

/include/ "system-conf.dtsi"
/ {
    model = "cyqsd ZYNQ Development Board";
    chosen {
        bootargs = "console=ttyPS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait";
        stdout-path = "serial0:115200n8";
    };
    pinctrl_uart1_default: uart1-default {
        mux {
            groups = "uart1_10_grp";
            function = "uart1";
        };

        conf {
            groups = "uart1_10_grp";
            slew-rate = <0>;
            power-source = <1>;
        };

        conf-rx {
            pins = "MIO49";
            bias-high-impedance;
        };

        conf-tx {
            pins = "MIO48";
            bias-disable;
        };
    };
};

&phy0 {
/delete-property/ marvell,reg-init;
};
&cf_ad9361_adc_core_0{
/delete-property/ slavecore-reg ;
};
&cf_ad9361_dac_core_0 {
/delete-property/ slavecore-reg;
};

///delete-node/ &adc0_ad9361;
/delete-node/ &cf_ad9361_adc_core_1;
/delete-node/ &cf_ad9361_dac_core_1;

&uart1 {
    u-boot,dm-pre-reloc;
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_uart1_default>;
};

打包

使用petalinux-package进行打包。

# 使用打包命令 petalinux-package --boot --fsbl --fpga --u-boot --force

cyqsd@cyqsd-virtual-machine:~/Workspace/ad9361_linux_2022$ petalinux-package --boot --fsbl --fpga ./images/linux/system.bit  --u-boot --force
[INFO] Sourcing buildtools
INFO: Getting system flash information...
INFO: File in BOOT BIN: "/home/cyqsd/Workspace/ad9361_linux_2022/images/linux/zynq_fsbl.elf"
INFO: File in BOOT BIN: "/home/cyqsd/Workspace/ad9361_linux_2022/images/linux/system.bit"
INFO: File in BOOT BIN: "/home/cyqsd/Workspace/ad9361_linux_2022/images/linux/u-boot.elf"
INFO: File in BOOT BIN: "/home/cyqsd/Workspace/ad9361_linux_2022/images/linux/system.dtb"
INFO: Generating zynq binary package BOOT.BIN...


****** Xilinx Bootgen v2022.2
  **** Build date : Sep 26 2022-06:24:42
    ** Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.

#[WARNING]: Partition zynq_fsbl.elf.0 range is overlapped with partition system.bit.0 memory range
#[WARNING]: Partition system.bit.0 range is overlapped with partition system.dtb.0 memory range

[INFO]   : Bootimage generated successfully

INFO: Binary is ready.

image-20241231235537179.webp

文章目录