器件型号: TDA4VH-Q1
Thread 中讨论的其他器件: TDA4VH
由于 Hawdware 错误地限制或参考、如何解决此问题以及是否可能使用跨域 MDIO 引脚、因此 MDIO 引脚和路由到 PHY 的数据引脚来自不同的 CPSW 实例。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
问题:
一些定制电路板布局布线会将 MDIO 引脚路由到与承载 实际 流量(数据)的 CPSW 实例不同的 CPSW 实例。 这是一种 跨域 MDIO 配置。当流量流经 不同 CPSW 实例的 MAC 端口时、PHY 通过一个 CPSW 实例的 MDIO 总线进行控制。
这是 TDA4VH 上的一个常见问题、TDA4VH 在两个域中有三个 CPSW 实例:
| 实例 | 阻抗 | 符号 |
| CPSW9G | 主要 | Main_cpsw0 |
| CPSW2G | 主要 | Main_cpsw1 |
| CPSW2G | 代替 | mcub_cpsw |
由于 TDA4VH 仅在主域中有两个 CPSW 实例、因此电路板布局布线 的可能性很高、CPSW9G (main_cpsw0) 和 Main CPSW2G (main_cpsw1) 的 MDIO 引脚会被交换、或者在 主域节点下引用 MCU 域 MDIO 引脚的情况下。 在错误节点下配置 MDIO 将导致未检测到 PHY 并且 MAC 端口 无法启动。
重要说明:
当您打算使用主 CPSW2G 时、请参考 main_cpsw0 引脚、这是 TDA4VH 上的常见错误。 在最终确定布局之前、始终验证电路板使用哪些物理 MDIO 引脚并将这些引脚跟踪回正确的 CPSW 实例。
——
解决方案:
启用涉及的两个 CPSW 实例。 在 MDIO 节点下定义/映射与 电路板上物理 MDIO 引脚相对应的 PHY 地址、然后在承载 实际流量的 CPSW 实例的 MAC 端口节点的 CPSW 句柄下引用该地址。 CPSW 支持跨 CPSW 实例的交叉参考 PHY 句柄。
对于 Linux 本机驱动程序:
1) 引用 CPSW 实例中承载 实际 流量的 MAC 端口节点的 phy-handle。
2) 拥有 MDIO 总线的 CPSW 实例必须至少启用一个具有固定链路的端口,以使其驱动程序能够成功探测 — 即使没有流量流经该端口,也无法将其保持禁用状态。
设备树配置:
下面的示例介绍了 TDA4VH、MDIO 引脚上的最常见情况、 这些引脚物理连接到 CPSW9G (main_cpsw0)、而 RGMII 数据连接到主 CPSW2G (main_cpsw1)。
/* CPSW9G - enabled only to bring up the MDIO bus */
&main_cpsw0 {
status = "okay";
};
/* Main CPSW2G - carries actual RGMII traffic */
&main_cpsw1 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&main_cpsw1_pins_default>;
};
/* CPSW9G MDIO bus - physically wired to the PHY on this board */
&main_cpsw0_mdio {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&main_cpsw0_mdio_pins_default>;
eth_phy: ethernet-phy@0 {
reg = <0>;
ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>;
ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_4_B_NIB>;
ti,min-output-impedance;
pinctrl-names = "default";
pinctrl-0 = <ðernet_intr_pin>;
interrupt-parent = <&wkup_gpio0>;
interrupts = <81 GPIO_ACTIVE_HIGH>;
};
};
/* CPSW9G port1 - fixed-link required to allow driver probe */
&main_cpsw0_port1 {
status = "okay";
phys = <&cpsw0_phy_gmii_sel 1>;
phy-mode = "rgmii-rxid";
fixed-link {
speed = <1000>;
full-duplex;
};
};
/* Main CPSW2G port1 - references PHY defined under CPSW9G MDIO */
&main_cpsw1_port1 {
status = "okay";
phys = <&cpsw1_phy_gmii_sel 1>;
phy-mode = "rgmii-rxid";
phy-handle = <ð_phy>;
};
如果 MDIO 引脚来自 MCU CPSW2G (mcu_cpsw0_mdio),但流量流经主域端口,则同样的模式适用 — 在 mcu_cpsw0_mdio 下定义 PHY、通过固定链路端口启用 mc_cpsw0、并从主 域 MAC 端口节点启用参考 phy-handle。
——
副作用 — 额外的网络接口
由于必须启用具有 MDIO 的 CPSW 实例、因此其驱动程序会在启动时创建一个额外的网络接口。 此 接口没有 PHY 且不传输流量、但驱动程序需要存在端口才能成功探测。
使用以下 systemd 文件将未使用的接口重命名为虚拟接口、将活动的 CPSW2G 接口命名为 eth0、并 在网络堆栈启动后取消绑定未使用的 CPSW 实例。
/etc/systemd/network/10-dummy.link — 重命名 CPSW9G 接口
[Match] Path=*platform-c000000.ethernet* [Link] Name=dummy
/etc/systemd/network/10-eth0.link — 重命名 CPSW2G 接口
[Match] Path=*platform-c200000.ethernet* [Link] Name=eth0
/lib/systemd/system/mdio-cross-domain.service — 在网络启动后取消绑定未使用的 CPSW 实例
[Unit] Description=Unbind unused CPSW instance (cross-domain MDIO workaround) After=network-online.target Wants=network-online.target [Service] Type=oneshot ExecStart=/bin/sh -c "echo 'c000000.ethernet' > /sys/bus/platform/drivers/am65-cpsw-nuss/unbind" [Install] WantedBy=multi-user.target
启用服务:
systemctl enable mdio-cross-domain.service
重新启动后、只有 eth0(活动的 CPSW2G)可见。 未使用的 CPSW 实例已取消绑定并删除其接口。