设置88E6390芯片地址为1,设置YT8521S芯片地址为0,将两者接在同一MDIO总线上,为什么MDIO总线获取88E6390芯片失败
时间: 2024-05-25 20:11:37 浏览: 68
MDIO总线是由MDC时钟和MDIO数据线组成的双线串行通信接口,用于与PHY芯片进行通信。在这种情况下,通过将88E6390芯片地址设置为1,使其与YT8521S芯片地址不同,以便在总线上区分两个设备。
如果MDIO总线不能成功获取88E6390芯片,可能有以下原因:
1. 连接问题:请检查MDIO总线和PHY芯片之间的连接是否正确,包括电缆、接头和插座等。
2. 时钟问题:请确保MDC时钟频率和占空比符合PHY芯片的要求,并且时钟信号在PHY芯片和总线上都正常传输。
3. 芯片配置问题:请检查PHY芯片的寄存器配置是否正确,特别是与MDIO总线相关的寄存器,例如PHY地址寄存器、MDIO控制寄存器等。
4. 其他问题:由于PHY芯片和MDIO总线都是复杂的系统,还可能存在其他影响总线通信的因素,例如总线负载、电源稳定性、环境电磁干扰等。如果以上方法都无法解决问题,请尝试更详细地分析和诊断故障。
相关问题
在dts里添加接在pcie上的rtl8111网卡的子节点,并使其与连接在mdio总线上的mv88e6390网卡连接
好的,您的问题是如何在dts中添加接在pcie上的rtl8111网卡的子节点,并使其与连接在mdio总线上的mv88e6390网卡连接。
首先,在dts中添加pcie节点:
```
pcie@<base_address> {
compatible = "pci-host-ecam-generic";
device_type = "pci";
#address-cells = <3>;
#size-cells = <2>;
ranges;
reg = <0x00000000 0x00000000 0x00000000 <base_address> 0x00000000 0x00010000>;
// 添加RTL8111网卡子节点
rtl8111@0,0 {
compatible = "rtl8111";
reg = <0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000 0x00000000>;
};
};
```
然后,添加mdio节点:
```
mdio {
#address-cells = <1>;
#size-cells = <0>;
compatible = "mdio-bus";
// 添加MV88E6390网卡子节点
mv88e6390@0 {
compatible = "marvell,mv88e6390";
reg = <0x0>;
mdio-mux {
#address-cells = <1>;
#size-cells = <0>;
// 建立RTL8111和MV88E6390之间的连接
rtl8111_mdio_mux: mdio-mux@0 {
compatible = "mdio-mux";
#address-cells = <1>;
#size-cells = <0>;
mux-reg = <0x0>;
mux-val = <0x0>;
mux-mask = <0x1f>;
mdio0: mdio@0 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "smi";
reg = <0x0>;
phy0: ethernet-phy@0 {
reg = <0x0>;
};
};
mdio1: mdio@1 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "smi";
reg = <0x1>;
phy1: ethernet-phy@1 {
reg = <0x1>;
};
};
};
};
};
};
```
最后,需要在设备树中将RTL8111网卡与MV88E6390网卡连接起来:
```
&rtl8111 {
mdio-mux = <&rtl8111_mdio_mux>;
};
```
这样就完成了RTL8111网卡和MV88E6390网卡的连接。
Linux5.10版本mv88e6390芯片驱动程序代码初始化全流程详解
在Linux 5.10版本中,MV88E6390芯片的驱动程序代码初始化流程大致如下:
1. 注册设备节点:在设备树中注册MV88E6XXX设备节点,包括设备地址、中断号等信息。例如:
```
mdio {
#address-cells = <1>;
#size-cells = <0>;
switch0: switch@0 {
compatible = "marvell,mv88e6390";
reg = <0>;
interrupt-parent = <&gpio3>;
interrupts = <3 IRQ_TYPE_EDGE_FALLING>;
phy-mode = "rgmii";
ports = <8>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_switch0>;
status = "okay";
};
};
```
2. 初始化控制器:执行MV88E6390控制器的初始化,包括设置寄存器、初始化参数等。初始化代码位于mv88e6xxx.c文件中,主要包括以下几个函数:
- mv88e6xxx_setup_global_regs:设置全局寄存器,包括芯片ID、芯片类型等信息。
- mv88e6xxx_setup_port_regs:设置端口寄存器,包括速率、双工模式、帧过滤等参数。
- mv88e6xxx_setup_vlan_regs:设置VLAN寄存器,包括VLAN ID、VLAN成员等参数。
- mv88e6xxx_setup_qos_regs:设置QoS寄存器,包括流表规则、优先级等参数。
- mv88e6xxx_setup_stp_regs:设置STP寄存器,包括端口状态、协议版本等参数。
3. 注册网络设备:在网络子系统中注册MV88E6390网络设备,包括MAC地址、MTU等信息。注册代码位于mv88e6xxx.c文件中,主要包括以下几个函数:
- mv88e6xxx_probe_port:探测端口状态,包括速率、双工模式等信息。
- mv88e6xxx_port_setup_tc:设置端口的Traffic Class(TC)和队列映射关系。
- mv88e6xxx_set_rx_mode:设置接收模式,包括广播、多播、单播等。
- mv88e6xxx_set_mac_addr:设置MAC地址,包括全局MAC地址和端口MAC地址。
4. 处理网络数据包:启动MV88E6390控制器,开始处理网络数据包。数据包处理代码位于mv88e6xxx.c文件中,主要包括以下几个函数:
- mv88e6xxx_get_tag_protocol:获取数据包的Tag协议类型,包括802.1Q和802.1AD。
- mv88e6xxx_xmit:发送数据包,包括添加Tag信息、计算校验和等。
- mv88e6xxx_poll_rx:接收数据包,包括解析Tag信息、计算校验和等。
上述流程仅为MV88E6390驱动程序初始化的基本流程,具体实现可能因不同的硬件平台、网络配置等而有所不同。在实际应用中,还需要根据具体的需求进行配置和调优,以达到最佳的网络性能和稳定性。
阅读全文