NXP MCU 技术论坛
直播中

维生素B2

13年用户 1093经验值
私信 关注
[问答]

S32G3 GMAC0为什么无法连接自定义phy?

我目前正在使用 S32G3 SoC 和带有 Auto Linux BSP 35.0 S32G399ARDB3定制板。

我们的设计是通过 PCIe 将 SerDes 1 连接到以太网交换机。
GMAC0 通过 MDC/MDIO 将 2 个具有地址 0x1 和 0x3 的自定义 phys。
以太网交换机通过 HSGMII 连接 2 个 phy
以太网交换机可以正常工作,phy register 可以通过 mdio 工具访问。
但是现在 gmac0 不能挂载到 phy 上,我们应该修改 gmac 驱动吗?
root@s32g399ardb3:~# dmesg | grep "s32cc-dwmac"
[ 0.954524] s32cc-dwmac 4033c000.ethernet: IRQ eth_wake_irq not found
[ 0.961096] s32cc-dwmac 4033c000.ethernet: IRQ eth_lpi not found
[ 0.967351] s32cc-dwmac 4033c000.ethernet: no reset control found
[ 0.973685] s32cc-dwmac 4033c000.ethernet: phy mode set to RGMII
[ 0.979917] s32cc-dwmac 4033c000.ethernet: User ID: 0x10, Synopsys ID: 0x52
[ 0.987025] s32cc-dwmac 4033c000.ethernet: DWMAC4/5
[ 0.992094] s32cc-dwmac 4033c000.ethernet: DMA HW capability register supported
[ 0.999548] s32cc-dwmac 4033c000.ethernet: RX Checksum Offload Engine supported
[ 1.007002] s32cc-dwmac 4033c000.ethernet: TX Checksum insertion supported
[ 1.014017] s32cc-dwmac 4033c000.ethernet: Wake-Up On Lan supported
[ 1.020443] s32cc-dwmac 4033c000.ethernet: Enabled workarounds for s32g274a platform
[ 1.028342] s32cc-dwmac 4033c000.ethernet: Enable RX Mitigation via HW Watchdog Timer
[ 1.036336] s32cc-dwmac 4033c000.ethernet: device MAC address 3e:c7:70:9f:25:b4
[ 1.043795] s32cc-dwmac 4033c000.ethernet: Enabled Flow TC (entries=8)
[ 1.050459] s32cc-dwmac 4033c000.ethernet: Enabling HW TC (entries=256, max_off=256)
[ 1.058358] s32cc-dwmac 4033c000.ethernet: Using 32 bits DMA width
[ 6.308041] s32cc-dwmac 4033c000.ethernet eth0: validation of rgmii-id with support 0000000,00000000,000062c0 and advertisement 0000000,00000000,000062c0 failed: -22
[ 6.308076] s32cc-dwmac 4033c000.ethernet eth0: no phy at addr -1
[ 6.308082] s32cc-dwmac 4033c000.ethernet eth0: stmmac_open: Cannot attach to PHY (error: -19)
这是我们关于 s32gxxxardb.dtsi 上的 phy 配置的设备树
  gmac0 {        status = "okay";        pinctrl-names = "default";        pinctrl-0 = < gmac0rgmiia_pins>, < gmac0mdioa_pins>;        phy-handle = < gmac_mdio_a_phy1>;        phy-mode = "rgmii-id";}; gmac0_mdio {        /* KSZ9031 GMAC */        // gmac_mdio_a_phy0: ethernet-phy@0 {        //         reg = <0>;        // };        gmac_mdio_a_phy1: ethernet-phy@1 {                reg = <1>;        };        gmac_mdio_a_phy3: ethernet-phy@3 {                reg = <3>;        };};
                                                                                                                                                                    

回帖(1)

刘桂英

2025-3-2 13:16:35

根据你提供的信息,以下是解决S32G3 GMAC0无法识别自定义PHY的分步指南:




1. 验证设备树配置




  • 确认MDIO总线绑定:


    &gmac0 {
      status = "okay";
      phy-mode = "hsgmii"; // 确保模式与PHY类型匹配
      mdio0: mdio {
          compatible = "snps,dwmac-mdio";
          #address-cells = <1>;
          #size-cells = <0>;

          phy1: ethernet-phy@1 {
              reg = <1>;
              compatible = "ethernet-phy-idXXXX.XXXX"; // 替换为PHY的实际ID
              // 必要时添加PHY特有属性(复位、时钟等)
          };

          phy3: ethernet-phy@3 {
              reg = <3>;
              compatible = "ethernet-phy-idYYYY.YYYY";
          };
      };
    };


    • 检查reg地址是否与硬件一致(0x1和0x3)。

    • phy-mode需与PHY接口类型匹配(如HSGMII、RGMII等)。




  • 检查时钟和复位信号:


    clocks = <&clk GMAC0_CLK>;
    clock-names = "stmmaceth";
    resets = <&reset GMAC0_RST>;

    确保时钟和复位控制器配置正确,无冲突。






2. 检查PHY兼容性



  • 匹配驱动支持的PHY ID:

    • 在Linux内核源码中搜索ethernet-phy-idXXXX.XXXX(如drivers/net/phy/目录)。

    • 如果PHY未内置支持,需在设备树添加:
      compatible = "ethernet-phy-id0134.0d04", "ethernet-phy-ieee802.3-c45";

    • 或添加自定义PHY驱动,注册ID匹配表。





3. 调试MDIO总线通信




  • 使用mdio-tool验证PHY访问:


    mdio-tool -v /dev/mdio0 -- --phy=1 --reg=0 --read
    mdio-tool -v /dev/mdio0 -- --phy=3 --reg=0 --read

    确保能正确读取PHY ID寄存器(0x2和0x3)。




  • 检查MDIO总线频率:



    • 过高的频率可能导致通信失败,尝试在设备树降低:
      mdio0: mdio {
      max-frequency = <1000000>; // 调整至1MHz
      };






4. 修改GMAC驱动




  • 启用调试日志:
    drivers/net/ethernet/stmicro/stmmac/dwmac-s32cc.c中增加打印:


    dev_dbg(priv->device, "Probing PHY at addr %dn", addr);

    重新编译内核,查看是否尝试探测PHY 1和3。




  • 绕过PHY检测(临时测试):


    // 在stmmac_platform.c中,注释掉PHY检测失败的条件
    if (!phydev) {
      //dev_err(dev, "No PHY foundn");
      //return -ENODEV;
    }

    强制GMAC使用指定PHY地址(仅测试用)。






5. 检查硬件信号




  • 测量MDIO/MDC波形:



    • 使用示波器确认MDIO有数据交换,无信号完整性问题。

    • 确认上拉电阻正确,无总线冲突。




  • 验证PHY电源和复位:



    • 检查PHY的VDD电压(通常1.8V或3.3V)。

    • 确保复位引脚已正确释放(非保持低电平)。






6. 更新或适配驱动



  • 适配自定义PHY初始化:
    若PHY需要特殊初始化序列,在设备树添加复位配置:
    reset-gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
    reset-assert-us = <1000>;
    reset-deassert-us = <20000>;

    或在驱动中添加phy_register_fixup_for_uid()处理。





7. 关键日志分析



  • 检查内核启动日志:
    dmesg | grep -E 'mdio|phy|gmac0'

    查找类似以下错误:


    phy phy_mdio0.1: failed to connect to PHY
    mdio_bus mdio0: MDIO device at address 1 is missing.

    此类信息提示驱动未能成功绑定PHY。





总结步骤:  



  1. 确认设备树PHY节点正确无误,尤其是regcompatible。  

  2. 验证MDIO通信能否通过用户空间工具访问PHY。  

  3. 检查驱动探测逻辑,必要时添加调试打印或修改PHY匹配机制。  

  4. 确保硬件信号(MDIO、电源、复位)符合PHY要求。  


若上述步骤仍无法解决,建议在设备树中明确指定PHY地址并捕获MDIO总线通信,对比正常与异常情况下的波形差异。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分