zynq ps linux设备驱动,ZYNQ+linux网口调试笔记(1)PS-GEM0

1. 开发环境

Windows SDK 2017.4

Ubuntu Petalinux 2017.4

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

2. 开发目标

在ZYNQ上使用网络接口。调通PS侧网口GEM0(本文阐述)。

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和输出接口,因此二者不能同时使用。

a4e25e8b2f5e

image.png

(2) 我们所使用的网口硬件资源

我们使用的PS-GEM0网口由如下几部分组成:PS侧MAC + PS侧 GMII to RGMII转换器 + PS侧外接PHY芯片(Micrel KSZ9031RN)。因此我们的Linux驱动也需要从这三方面来着手。

4. Linux设备驱动

(1) MAC驱动

PS侧MAC驱动对应的内核驱动:

名称:CONFIG_MACB

路径:

a4e25e8b2f5e

image.png

驱动源码:

drivers/net/ethernet/cadence/macb.c

相关链接:

(2) GMII to RGMII转换器的驱动

PS侧 GMII to RGMII转换器驱动对应的内核驱动:

名称:CONFIG_XILINX_GMII2RGMII

路径:

a4e25e8b2f5e

image.png

驱动源码:

drivers/net/phy/xilinx_gmii2rgmii.c

相关链接:

a4e25e8b2f5e

image.png

(3) 外部PHY芯片的驱动

PS侧外接PHY芯片(Micrel KSZ9031RN)的内核驱动:

名称:CONFIG_MICREL_PHY

路径:

a4e25e8b2f5e

image.png

驱动源码:

drivers/net/phy/micrel.c

分析此源码,找到关键字PHY_ID_KSZ9031:

a4e25e8b2f5e

image.png

可以看到头文件micre_phy.h里定义了PHY_ID为0x00221620。

相关链接:

(4) 驱动适配

我们更改设备树,增加对GMII2RGMII和外部PHY芯片的描述信息:

a4e25e8b2f5e

image.png

a4e25e8b2f5e

image.png

编译BOOT.bin下载到板子上运行,启动过程中报出“macb xxxx: Could not attach to phy”。启动后发现找不到网口eth0。

失败。

与硬件工程师沟通,得知外部PHY的地址为4而不是7。据此更改设备树如下:

a4e25e8b2f5e

image.png

编译烧写后,发现可以找到PHY设备了,网口也eth0出现了。插拔网线能够正常识别,但在网口up的时候会报出“macb e000b000.ethernet eth0: unable to generate target frequency: 125000000 Hz”,不知为何以及影响如何。

另外的一个问题是无法ping通。

上网查阅资料发现如下信息:

(1)《米联《ZYNQ SOC修炼秘籍》网手版20170510(已更1183页未完).pdf》P830:

a4e25e8b2f5e

image.png

a4e25e8b2f5e

image.png

以上两点线索都指向同一个问题:我们需要更改Linux网卡驱动源码,根据当前外部PHY协商得到的速率来配置PL GMII2RGMII IP的寄存器0x10,以便GMII2RGMII可以正常工作。

在网上找到了两份补丁,第一份(https://www.xilinx.com/support/answers/67923.html)似乎用于更老的内核版本和petalinux 2016.2,无法对应到我们的内核源码里去,第二份来自上述(2)的网址,似乎是用于较新的内核版本,经小心比对后可以打patch到我们的内核里去。

将第二份补丁打入我们的内核,然后编译烧写,启动发现:无法找到网卡eth0了……shit。

继续排查,追到内核GMII2RGMII驱动(drivers/net/phy/xilinx_gmii2rgmii.c),发现这里其实已经实现了上文提到的补丁,即对GMII2RGMII IP的0x10寄存器进行配置。我们对该寄存器的内容进行打印,发现在插拔网线时该寄存器已经被正确配置了。

【完】

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ZYNQ平台上进行PL-PS协同设计时,需要考虑如何将PL中的网口PS中的网口进行连接。一种常用的方式是使用AXI Ethernet IP核,将PL中的网口接到AXI总线上,然后通过AXI总线与PS中的网口进行连接。 在Linux中使用PL中的网口时,需要进行如下调试步骤: 1. 确认AXI Ethernet IP核已经正确配置,并且在硬件中已经成功实现了网口的功能。 2. 在Linux内核中,需要加载相应的驱动程序。以常见的AXI Ethernet驱动程序axienet为例,可以使用以下命令加载驱动程序: ``` modprobe axienet ``` 3. 确认网口设备节点已经正确创建。可以使用以下命令查看网口设备节点: ``` ls /sys/class/net ``` 如果成功创建了网口设备节点,应该能够看到类似于eth0、eth1等设备节点。 4. 使用ifconfig命令配置网口IP地址等参数。例如,可以使用以下命令将eth0网口的IP地址设置为192.168.1.100: ``` ifconfig eth0 192.168.1.100 ``` 5. 确认网口是否能够正常工作。可以使用ping命令测试与其他主机的连通性: ``` ping <目标IP地址> ``` 如果能够ping通目标主机,则说明网口已经正确工作。 6. 如果出现网络连接问题,可以使用tcpdump命令进行网络抓包分析,以便确定问题的原因: ``` tcpdump -i eth0 ``` 这将在eth0网口上抓取所有的网络数据包,并将它们输出到屏幕上。可以使用Ctrl+C停止抓包,并分析输出的数据包内容以确定问题的原因。 以上就是在ZYNQ平台上使用PL中的网口进行Linux开发时常见的调试步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值