ZYNQ在Petalinux系统下双网口同网段的实现
1.开发环境
- 采用了赛灵思zynq xc7z100芯片,外部挂载了两个网口phy芯片(marvell 88e1510),且两个网口phy芯片公用MDIO管脚,bd配置如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/0add69e0bd0b4eb3995f5dffb9b5d403.png)
- 软件环境采用petalinux进行配置和编译。
- 我的内核源码采用自己下载的源码linux-xlnx-xilinx-v2018.3,在petalinux-config 中需要配置为本地内核源码。
2.问题说明
- 系统起来后eth0可以正常的link up,可以ping通,eth1无法link up,显示no phy found或者是cannot found device。
3.问题原因
- 两片phy公用mdio和mdc,在初始化阶段会通过寄存器reg<0/1>来区分两片,并分别进行配置。
4.解决办法
- 在system-user.dtsi中增加设备树mdio的描述,我的设备如下:
/include/ "system-conf.dtsi"
/ {
mdio{
#address-cells = <1>;
#size-cells = <0>;
compatible = "cdns,macb-mdio";
reg = <0xe000b000 0x1000>;
clocks = <&clkc 30>,<&clkc 30>,<&clkc 13>;
clock-names = "pclk","hclk","tx_clk";
ethernet_phy0:ethernet-phy@0{
compatible="marvell,88E1510";
reg = <0>;
};
ethernet_phy1:ethernet-phy@1{
compatible = "marvell,88E1510";
reg = <1>;
};
};
};
&gem0{
status = "okay";
phy-mode = "rgmii-id";
local-mac-address = [00 0a 35 00 1e 53];
phy-handle = <ðernet_phy0>;
};
&gem1{
status = "okay";
phy-mode = "rgmii-id";
local-mac-address = [00 0a 35 00 1e 54];
phy-handle = <ðernet_phy1>;
};
- 由于petalinux系统中,对mido的默认驱动支持不好需要打一个mido的补丁,在源码根目录下执行:patch -p1 <./0001-net-macb-Add-MDIO-driver-for-accessing-multiple-PHY-.patch
- 补丁的连接Xilinx官方补丁包,注意补丁的版本和自己linux源码匹配,例如linux-xlnx-xilinx-v2018.3,则需要下载Xilinx_Answer_69132_Files_v2018_3_AR69132_Patch.zip这个补丁包。
- 完成上面几步后重新编译,祝你编译愉快。