zynq linux 双网卡实现

  Vivado:2016.4

  Linux:Ubuntu16.4

  ZYNQ:xc7z020

  

  下载文件名称

  2016.4-zed-release.tar.xz

  device-tree-xlnx-xilinx-v2016.4.zip

  linux-xlnx-xilinx-v2016.4.zip

  u-boot-xlnx-xilinx-v2016.4.zip

  arm_ramdisk.image.gz

  参考链接:http://www.fpgadeveloper.com/2016/05/multi-port-ethernet-in-petalinux.html

  ZYNQ下PS端有两个网口,GEM0、GEM1,GEM0默认通过MIO端口接到外部PHY。GEM1通过EMIO连接芯片外部PHY。

  一、FPGA在搭建block design的时候选中eth1,同时选中eth1的MDIO。

  二、系统识别GEM1的时候,根据DT可能需要访问MDIO,也可能不需要访问。

    1. 如果需要访问MDIO的话,在uboot启动完成后需加载FPGA的bit文件,由于正常生成的FPGA文件过大,因此此处重新生成 一个简化版的FPGA系统,只包括了ARM部分的block design,然后选中压缩bit文件,生成的bit文件大概500多k,加上fsbl.elf+uboot 不超过1M,在范围内,这样的话在uboot启动后EMIO部分在FPGA中的硬件就连通可以访问了。

    2. 如果不需要访问MDIO的话,linux启动完成后再去加载FPGA即可。

  三、设备树种关于两个网口的描述

    

    Note:注意phy1的compatible描述,只能是按照id这种描述,之前照猫画虎的按照marvell的描述成“ICPlus,IP1001"死活都识别不了,后来发现时Marvell的PHY支持的特别好,在White list中,因此没问题,但是别的PHY只能是按照id去描述!!!

    在Of_mdio.c中函数of_get_phy_id可以看到是按照id去匹配的。

    

  2. 编译内核的时候,make menuconfig将ICPlus的驱动选中,如下图:

  

 

  以上,修改完设备树和内核后,一切正常的话,系统起来后你会在启动日志中发现gem1已经加载成功了,ifconfig eth1也会出现网卡了。

  Note:

    加载完成后linux系统下发现了eth1,但是ping的时候死活ping不通,后来发现ARM可以发送数据包到PC,PC发数据包ARM收不到!折腾许久,最后还是Google上找到了一些线索:

    https://forums.xilinx.com/t5/Embedded-Processor-System-Design/Problem-with-xapp1082-ethernet-on-gem1-and-zc706/td-p/642704

    https://lists.yoctoproject.org/pipermail/meta-xilinx/2016-March/001519.html

    原来是gem1_clk_ctrl这个寄存器搞的鬼,由于GEM1 是通过EMIO接到外部PHY的,因此在配置时钟的时候需要跟默认配置不一样。

    由于我一直使用刚开始的FSBL.elf,Vivado工程更新为双网卡后并没有更新FSBL导致初始化寄存器的时候没有设置寄存器gem1_clk_ctrl!!!

    血的教训,切记Vivado工程改变的时候重新生成FSBL.elf。 包括DDR等一些外设接口的寄存器设置都是在FSBL阶段完成的,因此需要修改完Vivado工程,根据Vivado工程自动生成FSBL.elf。

猜你喜欢

转载自www.cnblogs.com/huakaimanlin/p/9292084.html