zynq linux ip配置,ZYNQ+linux网口调试笔记(2)PS-GEM1

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_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

$ 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

$ petalinux-config -c kernel

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

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

更改内核设备树:

$ cd

$ 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: 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里调试网口:

使用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”?

报出错误的源码:/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

Xilinx Wiki - Zynq PL Ethernet:

Xilinx Wiki - Linux Drivers:

Xilinx Wiki - Linux Drivers - Macb Driver:

Xilinx Wiki - Zynq Ethernet Performance:

(2) Jumbo Frame相关资料

在linux上配置巨型帧:

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

Change the MTU of a network interface:

Handle jumbo frames for lesser frame sizes:

在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简介

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

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

GigE调试笔记:

GigE-V Framework for Linux:

【完】

你可能感兴趣的:(zynq,linux,ip配置)