Xilinx Zynq 7000 双网口配置要点

1. 概述

SDR-B1是我司推出的采用Xilinx Zynq XC7Z045及ADI AD9361芯片的软件无线无线电平台,具备两个百兆以太网口,特别适合用于自组网产品。近期有客户在使用双网口时遇到了一些困难,本文给出Zynq使用双网口的配置要点。

2. 涉及到的软件

3. 硬件框图

不同于市面上常见的板卡,我司的SDR-B1采用了比较特殊的网口设计方式,我们同时使用了Zynq PS侧的两个以太网控制器,ENET0与ENET1都通过RGMII连接至以太网PHY,另外,两个以太网PHY共用一组MDIO/MDC管理接口,如下图所示。

4. 创建Vivado工程

参照SDR-B1软件无线电平台开发环境搭建一文,只是将Vivado版本改为2021.1,以及将HDL版本改为2021_r1,特别需要注意的是ENET1的时钟配置,默认是External,需要将其改为IO PLL,如下图,否则进入Linux系统后会提示无法配置时钟的错误。

还有一点需要注意的是,Vivado 2021.1版本导出硬件得到的文件是xsa格式。

5. 搭建Petalinux工程

我们假定客户已经对Zynq的开发环境搭建已经很熟悉,所以本文只给出搭建过程的文字说明,不做详细阐述。

#for petalinux v2021.1 and meta-adi 2021.1
cd ~
cd data/code
mkdir petalinux_2021
cd petalinux_2021
cp /home/lics/data/share/petalinux-v2021.1-final-installer.run .
chmod +x petalinux-v2021.1-final-installer.run
./petalinux-v2021.1-final-installer.run
source /home/lics/data/code/petalinux_2021/settings.sh
petalinux-create --type project --template zynq --name sdr_b1_v12
git clone https://github.com/analogdevicesinc/meta-adi.git
cd meta-adi
git checkout 2021_R1
#修改meta-adi-xilinx/recipes-bsp/device-tree/files/pl-delete-nodes-zynq-adrv9361-z7035-bob.dtsi
#删除/delete-node/ &axi_pz_xcvrlb;一行

#修改meta-adi-xilinx/dynamic-layers/meta-petalinux/recipes-core/images/petalinux-image-minimal.bbappend
#变更root密码且允许ssh登录
cd sdr_b1_v12
#上一步得到的xsa及bit文件存放于/home/lics/data/share/sdr_b1_v12_2021/目录
cp -a /home/lics/data/share/sdr_b1_v12_2021/* .
petalinux-config --get-hw-description=/home/lics/data/code/petalinux_2021/sdr_b1_v12
#增加meta-adi layer
#layer0为/home/lics/data/code/petalinux_2021/meta-adi/meta-adi-core
#layer1为/home/lics/data/code/petalinux_2021/meta-adi/meta-adi-xilinx

#将eth0改为静态IP的方式

#修改project-spec/meta-user/conf/petalinuxbsp.conf, 增加一行KERNEL_DTB = "zynq-adrv9361-z7035-bob"
#修改project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi, 增加phy0与phy1的配置
#修改project-spec/meta-user/conf/user-rootfsconfig, 增加iperf3
petalinux-config -c rootfs
#勾选iperf3
petalinux-build
cd images/linux/
petalinux-package --boot --format BIN --fsbl zynq_fsbl.elf --fpga system.bit --u-boot --force
cd ../..
rm -rf /home/lics/data/share/linux
cp -a images/linux /home/lics/data/share/

修改完成后的petalinux-image-minimal.bbappend文件内容如下:

IMAGE_INSTALL_append = " libiio  \
                         libiio-tests \
                         libiio-iiod \
                         libiio-python3 \
                         fru-tools \
                         libad9361-iio \
                         jesd-status \
                         adrv9009-zu11eg-fan-control"

# The petalinux default root password is root. To change it, one
# has to run petalinux-config -c rootfs and change the passoword. This lines below
# force the root password to be analog. To keep the petalinux way, just comment this lines...
EXTRA_USERS_PARAMS = "  \
        usermod -P root root;"

# added by lics 20250105

# SSHD_CONFIG
SSHD_CONFIG_FILE ?= "${IMAGE_ROOTFS}${sysconfdir}/ssh/sshd_config"
# DROPBEAR config
DROPBEAR_CONFIG_FILE ?= "${IMAGE_ROOTFS}${sysconfdir}/default/dropbear"

l_permit_sshrootlogin () {
        if [ -f ${SSHD_CONFIG_FILE} ]; then
            sed -i 's/#PermitRootLogin.*/PermitRootLogin yes/' ${SSHD_CONFIG_FILE}
        fi
        if [ -f ${DROPBEAR_CONFIG_FILE} ]; then
            sed -i 's/-w//g' ${DROPBEAR_CONFIG_FILE}
        fi
}

ROOTFS_POSTPROCESS_COMMAND_append = "l_permit_sshrootlogin;"

#end

修改完成后的system-user.dtsi内容如下,其中/delete-node/ &phy0;这一行很重要,因为在其它文件中已经有phy0节点了,但是其定义不符合要求,所以首先将phy0节点删除,然后再重新定义。

/include/ "system-conf.dtsi"
/ {
};

/delete-node/ &phy0;

&gem0 {
        status = "okay";
        phy-mode = "rgmii-id";
        phy-handle = <&phy0>;

        //local-mac-address = [b8 8e df 01 96 d7];

        mdio {
        #address-cells = <1>;
        #size-cells = <0>;
        phy0: phy@0 {
                compatible = "marvell,88e1510";
                device_type = "ethernet-phy";
                reg = <0x0>;
        };
        phy1: phy@1 {
                compatible = "marvell,88e1510";
                device_type = "ethernet-phy";
                reg = <0x1>;
        };
        };
};

&gem1 {
        status = "okay";
        phy-mode = "rgmii-id";
        phy-handle = <&phy1>;

        //local-mac-address = [b8 8e df 01 96 d8];
};

其它文件的修改比较简单,本文档不给出完整内容。

6. 固件验证

将上一步得到的BOOT.BIN,boot.scr及image.ub复制到TF卡中,然后将TF卡插入SDR-B1的插座,为SDR-B1上电,待系统启动完成后,依次输入以下命令:

ifconfig eth1 up
brctl addbr br0
brctl addif br0 eth0
brctl addif br0 eth1
ifconfig br0 up
ifconfig br0 192.168.20.55

这时就可以分别将网线连接至ETH0与ETH1进行ping测试或者使用iperf3进行吞吐量测试。