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。