欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

ZYNQ+linux网口调试笔记(2)PS-GEM1

最编程 2024-01-06 11:53:16
...

1. 开发环境
  • Windows SDK 2017.4

  • Ubuntu Petalinux 2017.4

  • 硬件平台:米联客ZYNQ开发板MIZ7035

2. 开发目标

在ZYNQ上使用gigE Vision协议的网络接口相机。

第一步:调通PS侧网口GEM0(Xilinx BSP默认配好)。

第二步:调通PS侧网口GEM1(本文阐述)。

第三步:调通PL侧网口。

第四步:在PL侧网口上验证Jumbo Frame特性,并在应用层适配gigE Vision协议。

3. 预备知识

(1) 熟悉ZYNQ网口硬件资源

阅读《xapp1082 - PS and PL Ethernet Performance and Jumbo Frame Support with PL Ethernet.pdf》,在Introduction一节可知,ZYNQ芯片支持三个网口:

  • PS-GEM0:PS侧内置MAC,通过RGMII接口连接到外部PHY芯片。不支持Jumbo Frame。见下图紫线。

  • PS-GEM1:PS侧内置MAC,通过EMIO接口连接PL侧的PHY(1000BASE-X或SGMII)。不支持Jumbo Frame。见下图蓝线。

  • PL侧软核MAC,连接PL侧的PHY(1000BASE-X或SGMII)。支持Jumbo Frame。见下图红线。

其中PS-GEM0是独立的,而PS-GEM1与PL侧软MAC共用一个MAC和输出接口,因此二者不能同时使用。

image.png

(2) 验证网口硬件和hdf文件

我们先从裸机程序入手,来验证硬件和hdf文件的正确性。

利用Xilinx提供的LwIP例程,我们将板子作为TCP echo server,然后在PC上发TCP包给网口GEM1,发现可以收到回应。这说明硬件和hdf文件没问题。

(3) 熟悉petalinux网口驱动开发过程

根据《xapp1082》可知,GEM1的PHY支持1000Base-X和SGMII两种配置,这两种配置对应两种不同的PHY引脚接口(连接到MAC)。而我们的hdf文件使用的是1000Base-X的配置。

关于网口的Linux驱动,我们在官网找到一份资料:Xilinx Wiki - Zynq PL Ethernet。资料很长,我们只看与我们相关的“2.3.1 PS-EMIO BSP installation for 1000Base-X”这一章节就可以了。

下载xapp1082对应的代码资料:https://www.xilinx.com/support/documentation/application_notes/xapp1082.zip

将其解压到我们的工作目录下,得到xapp1082_2017_4/,其内容如下:

image.png

先读一下README.TXT和Readme_workaround.txt.txt:

从README.TXT里可知:Supported Device(s): Zynq-7000 SOC (45T-FFG900, ZC706 board)

从Readme_workaround.txt.txt可知,我们需要在FSBL代码si5324.c里,添加如下两个宏(后文会照做):

#define XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT 0
#define XPAR_GIGE_PCS_PMA_1000BASEX_CORE_PRESENT 1

在开始移植之前,我想先验证一下官方的镜像文件。拷贝app1082_2017_4/ready_to_test/ps_emio_eth_1000base-x/下的BOOT.BIN和image.ub到SD卡根目录下,然后将SD卡插入MIZ7035板子上电启动……竟然无法启动……没有任何打印……这就尴尬了。估计这份镜像文件要在特定的板子上才能跑起来吧。看来只能绕过这个验证过程了。

4. 开发过程

(1) 配置Petalinux

基本配置

首先导入FPGA设计同事提供的hdf文件:

$ cd <PROJECT>
$ petalinux-config --get-hw-description=./user-data/02/hardware

在弹出的图形界面里,进入Subsystem AUTO Hardware Settings——Ethernet Settings——Primary Ethernet,确认可以看到两个网络设备(分别是GEM0和GEM1),说明hdf文件里已包含了必要的网口硬件信息:

image.png

上图中被选中的网口将被U-Boot使用、并成为Linux上的设备eth0。这里我们默认选择ps7_ethernet_0,即使用GEM0作为首选网口。

额外配置

为了加快Linux启动速度,我们将网口配置为固定IP:进入petalinux-config图像界面的Subsystem AUTO Hardware Settings——Ethernet Settings,取消选中Obtain IP address automatically,填入固定的IP。最终的配置如下图:

image.png

(2) 配置内核

启用Xilinx PHY驱动:

$ cd <project>
$ petalinux-config -c kernel

进入Device Drivers -- Network device support -- PHY Device support and infrastructure -- <*> Drivers for xilinx PHYs

注:PS-GEM0和PS-GEM1的MAC驱动源码是共用的,路径为:<project>/build/tmp/work-shared/plnx_arm/kernel-source/drivers/net/ethernet/cadence/macb.c,对应的内核Kconfig配置项名为CONFIG_MACB。由于GEM0是可以正常使用的,因此其MAC驱动肯定已经启用了。

更改内核设备树:

$ cd <project>
$ vi project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
/include/ "system-conf.dtsi"
/ {
};

&gem1 {
        local-mac-address = [00 0a 35 00 00 01];
        phy-mode = "rgmii-id";
        status = "okay";
        xlnx,ptp-enet-clock = <0x69f6bcb>;
        phy-handle = <&phy1>;

        phy1: phy@1 {
                //compatible = "Xilinx PCS/PMA PHY";
                device_type = "ethernet-phy";
                xlnx,phy-type = <5>;
                reg = <1>;
        };
};

注意:

1. PHY地址必须与hdf里指定的PHY地址一致!

2. phy1的compatible字段必须注释掉。如果这两点没有照做,在插入网线的时候会报出如下故障,且网口无法使用:

image.png

3. 在设备树里配置PHY的类型:

xlnx,phy-type = <0x5>; 代表PHY接口类型为1000base-X

xlnx,phy-type = <0x4>; 代表PHY接口类型为SGMII

(3) 为FSBL打补丁

按照Wiki的说法,要在FSBL里通过I2C接口配置SFP和时钟芯片SI5324,具体做法是将补丁(xapp1082_2017_4/software/petalinux/fsbl_patch_files/*)打到components/bootloader/zynq_fsbl/这个目录下。但是无论在petalinux的安装目录还是我们的工程目录下都没有找到此路径。我们打开补丁文件xapp1082_2017_4/software/petalinux/0001-fsbl-clock-patch-for-SFP.patch,找到被更改的源码路径:lib/sw_apps/zynq_fsbl/src/,据此定位到完整的路径为:sdk/petalinux/tools/hsm/data/embeddedsw/lib/sw_apps/zynq_fsbl/src/。就在我打算将0001-fsbl-clock-patch-for-SFP.patch的内容拆解出来放到此路径下的时候,FPGA同事告诉我,咱们的MIZ7035板子上并没有使用Si5324这个芯片,而是使用了固定的时钟。因此可以不必添加Si5324的驱动。前面提到的两个宏也就不必添加了。

(4) 更改rootfs

启用ethtool和tcpdump(调试用,非必须):

$ petalinux-config -c rootfs
image.png
image.png

(5) 编译打包

$ petalinux-build
$ cd images/linux/; petalinux-package --boot --fsbl zynq_fsbl.elf --fpga system.bit --u-boot --force

然后将生成的BOOT.BIN和image.ub拷贝到SD卡根目录下,将SD卡插入板子上,上电运行。

(6) 功能验证

上电后,看到内核里的如下启动信息,说明GEM0和GEM1都已经枚举成功了:

image.png

在Linux shell里输入命令ifconfig eth1 192.168.1.11 up:

image.png

插入网线有提示信息(但不知道报出unable to generate xxx是怎么回事,测试发现不影响功能):

image.png

测试网络通路,ping PC是通的。说明GEM1工作正常。

5. 问题记录

在启用网卡的时候,

image.png

图中报出的错误信息“Unable to generate xxx”很让人费解。

之后我们给板子插入网线,又报出了link becomes ready。

我们尝试从PC上ping板子,不通。

在板子上使用devmem命令来读取GEM相关寄存器,对比eth0和eth1的寄存器,发现如下异常:

image.png

注意eth1的0x34寄存器,这个寄存器值是错的,而且无法使用devmem更改其值。

在U-Boot里调试网口:

https://www.cnblogs.com/pengdonglin137/p/3682637.html

使用SDK下载裸机程序,查看MAC寄存器:

image.png
image.png

发现差别还是挺大的。GEM0的配置看上去更像是对的,但奇怪的是我们使用的是GEM1,竟然是通的!

MAC回环测试:

先要ifconfig eth0 up ,否则无法更改寄存器

//eth0:
//TBI disabled:
devmem 0xE000B004 32 0x10EA940
//Loop back local:
devmem 0xE000B000 32 0x1E
//eth1:
//TBI disabled:
devmem 0xE000C004 32 0x10EAD42
//Loop back local:
devmem 0xE000C000 32 0x10
devmem 0xE000C000 32 0x12
devmem 0xE000C000 32 0x1E

ping eth1的IP地址:ping 192.168.1.11 -I eth1,发现还是不通……是不是不能用ping的方式?

在PHY层loopback测试?

在变压器之后loopback测试?

read《ug585-TRM》for more information about ethernet

最终发现,问题在于PHY地址配置有误:FPGA同事给出的hdf文件里指定的PHY地址是6,而我们的dts里配置的PHY地址是1。另外,phy1的compatible字段必须注释掉。进行这两点更改后,网口恢复正常。

@TODO:

1 为何eth1 up的时候仍报出“macb e000c000.ethernet eth1: unable to generate target frequency: 125000000 Hz”?

报出错误的源码:<project>/build/tmp/work-shared/plnx_arm/kernel-source/drivers/net/ethernet/cadence/macb.c +377

分析源码,初步得知报出此警告是由于时钟存在50ppm以上的偏差导致的。具体偏差有多大,有何影响,暂未测算。

2 总结一下网口的调试方法:网线回环?PHY输出端回环?MAC内部回环?回环后能否ping通?

6. 参考文档

(1) ZYNQ网口与驱动相关资料

Xilinx xapp1082-zynq-eth.pdf (v5.0) July 16, 2018

https://www.xilinx.com/support/documentation/application_notes/xapp1082-zynq-eth.pdf

Xilinx Wiki - Zynq PL Ethernet:

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841633/Zynq+PL+Ethernet

Xilinx Wiki - Linux Drivers:

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841873/Linux+Drivers

Xilinx Wiki - Linux Drivers - Macb Driver:

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841740/Macb+Driver

Xilinx Wiki - Zynq Ethernet Performance:

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841743/Zynq+Ethernet+Performance

(2) Jumbo Frame相关资料

在linux上配置巨型帧:

https://docs.oracle.com/cd/E19530-01/821-3092/p85.html#scrolltoc

网卡最大传输单位MTU和巨型帧(Jumbo frame)设置:

https://blog.****.net/linsan2008/article/details/23991519

Change the MTU of a network interface:

http://www.microhowto.info/howto/change_the_mtu_of_a_network_interface.html

Handle jumbo frames for lesser frame sizes:

https://lore.kernel.org/patchwork/patch/939535/

在Zynq上测试,网口sit0可设的MTU最大值是65508:

$ ifconfig sit0 192.168.0.2 mtu 65508

PS:sit0接口用在IPv4及IPv6的数据包转换。

而eth0和eth1的MTU无法更改,提示“ifconfig: SIOCSIFMTU: Device or resource busy”

查阅文档《ug585-Zynq-7000 SoC Technical Reference Manual.pdf》可知,ZYNQ的PS侧网口不支持Jumbo Frame:

image.png

(3) GigE Vision相关资料

GigE Vision简介

https://blog.****.net/carson2005/article/details/56030625

GigE-V Framework FOR LINUX 32/64-BIT:

http://www.teledynedalsa.com/en/products/imaging/vision-software/linux-gige-v-framework/

该死的GigEVison,终于能够在Linux下运行了!

https://blog.****.net/jtop0/article/details/6990160

GigE调试笔记:

https://download.****.net/download/hzkkk/7185689

GigE-V Framework for Linux:

https://www.teledynedalsa.com/en/support/downloads-center/software-development-kits/132/

【完】