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.

[FAQ] [参考译文] 【常见问题解答】TDA4VH-Q1:如何使用 CPSW 的跨域 MDIO 引脚

Guru**** 2952510 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1657329/faq-tda4vh-q1-how-to-use-cross-domain-mdio-pins-of-cpsw

器件型号: TDA4VH-Q1
Thread 中讨论的其他器件: TDA4VH

由于 Hawdware 错误地限制或参考、如何解决此问题以及是否可能使用跨域 MDIO 引脚、因此 MDIO 引脚和路由到 PHY 的数据引脚来自不同的 CPSW 实例。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    问题:

    一些定制电路板布局布线会将 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 = <&ethernet_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 = <&eth_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 实例已取消绑定并删除其接口。