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。