ZYNQ+linux网口调试笔记(3)PL-ETH

ZYNQ+linux网口调试笔记(3)PL-ETH,第1张

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

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

第二步:调通PS侧网口GEM1(见前一篇文档:开发笔记(1))。

第三步:调通PL侧网口(本文阐述)。

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

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

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

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

在d出的图形界面里,进入Subsystem AUTO Hardware Settings——Ethernet Settings——Primary Ethernet,确认可以看到PL侧网络设备axi_ethernet_0,说明hdf文件里已包含了必要的网口硬件信息:

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

启用Xilinx AXI Ethernet驱动

进入Device Drivers -- Network device support – 选中Xilinx AXI Ethernet(以及Xilinx Ethernet GEM,这是PS侧网口的驱动)

进入Networking support – 选中 Random ethaddr if unset

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

进入~~~~Device Drivers -- DMA Engine Support -– 禁用~~~~Xilinx AXI DMAS Engine~~~ (对应的配置项名为 ~~ CONFIG_XILINX_DMA ~~~)

注意: Xilinx Wiki里对设备树节点的引用有误(&axi_ethernet),导致编译报错,应改为&axi_ethernet_0。

注:PL-ETH驱动所在路径:<project>/build/tmp/work-shared/plnx_arm/kernel-source/drivers/net/ethernet/xilinx/xilinx_axienet_main.c和xilinx_axienet_mdio.c。对应的内核配置项为CONFIG_NET_VENDOR_XILINX和CONFIG_XILINX_AXI_EMAC。

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

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

上电后,使用ifconfig eth1查看网口信息,观察MAC地址与设置的一致,且ifconfig eth1 192.168.1.11 up没有报错。

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

Linux下eth1(即PL-ETH)的MAC地址有误

问题描述:

开机打印:

注意:

MAC地址是错的,驱动里解析出的是GEM0的MAC地址。

试验发现,即使在system-user.dtsi里不写local-mac-address,也照样解析出的是GEM0的MAC。

而将system-user.dtsi里的local-mac-address改名为pl-mac-address,并将驱动里解析的字符串也对应更改为pl-mac-address,则可以正确解析出来:

Passing MAC address to kernel via Device Tree Blob and U-Boot:

http://zedboard.org/content/passing-mac-address-kernel-device-tree-blob

通过更改u-boot环境变量和设备树,为每个板子设置一个独特的MAC地址:

https://www.xilinx.com/support/answers/53476.html

U-Boot里的环境变量ethaddr会覆盖掉设备树里pl-eth的local-mac-addr字段,从而影响Linux启动后的网卡MAC地址;

但U-Boot里的环境变量ipaddr不会对Linux启动后的配置产生任何影响。因为设备树里根本就没有关于IP地址的配置。

phy-mode怎么会是sgmii?查了下官方的提供的BSP里,也是“sgmii”。说明这个没问题。具体原因不清楚。

@TODO: 设备树里的中断号的顺序如何影响功能?

为何读出来的IRQ号不对呢?这是因为这里读到的不是硬件的中断号,而是经过系统映射之后的软件IRQ number。两者不具有线性关系。

关于中断号的疑问:

Linux上的网口eth0、eth1的顺序,似乎是按照phy地址从小到大来排布的。

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

查到关于Jumbo frame MTU的定义,当前值为9000,可否改大一些?

驱动源码里关于jumbo frame的说明:

设置MTU为9000,发现ping包最大长度只能设为ping 192.168.1.10 -s 1472

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

【完】

ubuntu双网卡双IP.不同网关.不同子网.如何同时ping通两块网卡的解决方法,服务器环境如下:、系统:Ubuntu 9.04 X64 server电信IP(TEL):114.80.0.4 netmask 255.255.255.128 gateway 114.80.0.3联通IP(CNC):112.65.0.2 netmask 255.255.255.0 gateway 112.65.0.11.配置网卡信息# vi /etc/network/interfacesauto lo iface lo inet loopback# The primary network interface auto eth0 iface eth0 inet static address 114.80.0.4 netmask 255.255.255.128 gateway 114.80.0.3 # dns-* options are implemented by the resolvconf package, if installed dns-nameservers 202.96.209.133auto eth1 iface eth1 inet static address 112.65.0.2 netmask 255.255.255.0保存配置信息并重新启动网卡# /etc/init.d/networking restart2.增加2个路由表分别是电信:tel 联通:cnc # vi /etc/iproute2/rt_tables 252 tel 251 cnc保存并推出3.增加路由规则 # ip route flush table tel # ip route add default via 114.80.0.3 dev eth0 src 114.80.0.4 table tel # ip ruleadd from 114.80.0.4 table tel此处是设置电信的网关,并可实现让电信的资源访问只从eth0网卡出去# ip route flush table cnc # ip route add default via 112.65.0.1 dev eth1 src 112.65.0.2 table cnc # ip rule add from 112.65.0.2 table cnc此处是设置联通的网关,并可实现让联通的资源访问只从eth1网卡出去4.配置networking启动脚本文件 在结尾exit 0之前增加如下内容# vi /etc/init.d/networkingip route flush table tel ip route add default via 114.80.0.3 dev eth0 src 114.80.0.4 table tel ip rule add from 114.80.0.4 table telip route flush table cnc ip route add default via 112.65.0.1 dev eth1 src 112.65.0.2 table cnc ip rule add from 112.65.0.2 table cncexit 05,退出并重启网络# /etc/init.d/networking restart此时再测试机器网络情况,就会发现电信和联通的地址都可以正常访问了。此方法还可以实现让从电信IP过来的请求按照电信路由返回,从网通IP过来的请求从网通路由返回。补充:网上有些大神说如果服务器重启,或者网络服务重启,上述的路由规则就失效了,所以你需要把上面这段命令写入系统启动脚本和网络启动脚本如果是ubuntu/debian,系统启动脚本是/etc/rc.local 如果是RedHat/CentOS,系统启动脚本是/etc/rc.d/rc.local如果是ubuntu/debian,网络启动脚本是/etc/init.d/networking 如果是RedHat/centos,网络启动脚本是/etc/rc.d/init.d/network


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8393764.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-16
下一篇2023-04-16

发表评论

登录后才能评论

评论列表(0条)

    保存