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.

[参考译文] Linux/AM3352:MDIO 错误

Guru**** 2966500 points

Other Parts Discussed in Thread: DP83620, AM3352

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/675711/linux-am3352-mdio-error

器件型号:AM3352
主题中讨论的其他器件:DP83620、

工具/软件:Linux

大家好。

我使用 SDK 04.00.00.04、Linux 版本为4.9.28。 在我将以太网设置为 RMII 模式后、我遇到如下错误:

[1.556382] DaVinci_MDIO 4a101000.MDIO:达芬奇 MDIO 修订版1.6
[1.562893] DaVinci_MDIO 4a101000.MDIO:无实时 phy、可扫描全部
[1.569968] DaVinci_MDIO:4a101000.MDIO 的探测失败、错误-5
[1.578211] cpsw 4a100000.ethernet:无从器件[1] phy_id、phy-handle 或固定链路属性

我使用的 phy 是 dp83620。下面是我关于以太网的 DTS:

cpsw_default:cpsw_default{
pinctrl-single、pins =<
/*从属设备1 */
AM33XX_IOPAD (0x90C、PIN_INPUT_PULLUGDOWN | MUX_MODE1)/* mii1_crs.rmii1_crs_dv *
AM33XX_IOPAD (0x910、PIN_INPUT 下拉| MUX_MODE1)/* mii1_rxerr.rmii1_rxer*
AM33XX_IOPAD (0x914、PIN_OUTPUT | MUX_MODE1)/* mii1_txen.rmii1_txen *
AM33XX_IOPAD (0x924、PIN_OUTPUT | MUX_MODE1)/* mii1_txd1.rmii1_txd1 *
AM33XX_IOPAD (0x928、PIN_OUTPUT | MUX_MODE1)/* mii1_txd0.rmii1_txd0 *
AM33XX_IOPAD (0x944、PIN_INPUT_PULLDOWN | MUX_MODE0)/* mii1_REFCLK/rmii1_REFCLK *
AM33XX_IOPAD (0x93c、PIN_INPUT 下拉| MUX_MODE1)/* mii1_rxd1.rmii1_rxd1 *
AM33XX_IOPAD (0x940、PIN_INPUT 下拉| MUX_MODE1)/* mii1_rxd0.rmii1_rxd0 *
>;
};

cpsw_sleep:cpsw_sleep{
pinctrl-single、pins =<
/*从器件1复位值*/
AM33XX_IOPAD (0x90C、PIN_INPUT 下拉| MUX_MODE7)
AM33XX_IOPAD (0x910、PIN_INPUT 下拉| MUX_MODE7)
AM33XX_IOPAD (0x914、PIN_INPUT 下拉| MUX_MODE7)
AM33XX_IOPAD (0x924、PIN_INPUT 下拉| MUX_MODE7)
AM33XX_IOPAD (0x928、PIN_INPUT 下拉| MUX_MODE7)
AM33XX_IOPAD (0x944、PIN_INPUT 下拉| MUX_MODE7)
AM33XX_IOPAD (0x93c、PIN_INPUT 下拉| MUX_MODE7)
AM33XX_IOPAD (0x940、PIN_INPUT 下拉| MUX_MODE7)
>;
};
DaVinci_MDIO_DEFAULT:DaVinci_MDIO_DEFAULT{
pinctrl-single、pins =<
/* MDIO */
AM33XX_IOPAD (0x948、PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE0)/* MDIO_DATA.MDIO_DATA *
AM33XX_IOPAD (0x94c、PIN_OUTPUT 上拉| MUX_MODE0)/* MDIO_clk.MDIO_clk *
>;
};

DaVinci_MDIO_SLEEP:DaVinci_MDIO_SLEEP{
pinctrl-single、pins =<
/* MDIO 复位值*/
AM33XX_IOPAD (0x948、PIN_INPUT 下拉| MUX_MODE7)
AM33XX_IOPAD (0x94c、PIN_INPUT 下拉| MUX_MODE7)
>;
};

Mac{(&M)
pinctrl-names ="default"、"sleep";
pinctrl-0 =<&cpsw_default>;
pinctrl-1 =<&cpsw_sleep>;
状态="正常";
};

DaVinci_MDIO{
pinctrl-names ="default"、"sleep";
pinctrl-0 =<&Davinc_MDIO_default>;
pinctrl-1 =<&Davinc_MDIO_SLEEP>;
状态="正常";
};

cpsw_emac0{&cpsw_emac0}
PHY_ID =<&Davinci_MDIO>、<5>;
PHY-MODE ="RMII";
};

phy_SEL{&
RMII-时钟-外部;
};

我的 DTS 中是否有任何错误? 我如何解决这个问题?  

谢谢!

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

    您的 MDIO 引脚多路复用器看起来正确。 您可能需要连接一个范围来查看 MDIO 数据线上是否有任何流量。 如果是、则 PHY 可能状态不好。 如果 MDIO 数据线上有通信、请查看 PHY 数据表、了解 PHY 为何不响应 MDIO 轮询的可能提示。

    此致、
    Schuyler
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    我确信 PHY 是良好的、因为该电路板可以在 Linux 3.2中正常运行。
    我发现 cpsw_gmii_SEL_am3352函数未执行、因此不会设置 gmii_SEL 寄存器。 为什么不执行该函数?
    static const struct of _device_id cpsw_phy_SEL_id_table[]={
    {
    .compatible="ti、am3352-cpsw-phy-SEL"、
    .data= cpsw_gmii_SEL_am3352、
    }、
    {
    .compatible="ti、dra7xx-cpsw-phy-SEL"、
    .data= cpsw_gmii_SEL_dra7xx、
    }、
    {
    .compatible="ti、am43xx-cpsw-phy-SEL"、
    .data= cpsw_gmii_SEL_am3352、
    }、
    {}
    };
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好
    我读取 gmii-SEL 寄存器并打印它、该寄存器的值为0xC5、我认为它是正确的。
    引脚多路复用配置也是对的吗?
    phy 地址是5、这取决于硬件、我在 DTS 中进行了类似配置、对吗?
    cpsw_emac0{&cpsw_emac0}
    PHY_ID =<&Davinci_MDIO>、<5>;
    PHY-MODE ="RMII";
    };

    我是否需要在 DTS 中写入 phy 信息消息?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    继续:
    我的内核出现"Davinci_MDIO:probe of 4a101000.MDIO failed with error -5"错误。 这意味着执行的 MDIO 探测器功能失败。 我尝试在内核中读取 phy 寄存器失败、同时返回-1。 它喜欢 MDIO 总线无法正常工作、但我已经配置了 MDIO 的引脚多路复用器、我无法找到引脚多路复用器设置的任何错误、除此之外、我是否需要做任何其他工作来使 MDIO 正常工作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您是否能够在 MDIO 时钟线上放置示波器? MDIO 引脚多路复用器在我看来是正确的、达芬奇 MDIO 驱动器设置为正常、但您在探针上遇到错误。 如果您能够示波时钟线、则最好查看时钟线是否切换。

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

    你好

    我在内核启动期间对 MDC 进行示波器、MDC 信号只保持同位、然后保持高电平。 但是、当我将内核更改为 linux3.2时、在启动期间、MDC 信号始终存在。

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

    继续:
    MDC 信号仅保留的原因是 PHY 确认状态寄存器为0、在 Davinci_MDIO_RESET 函数中、DATA->BUS->phy_mask 将为0、然后在_mdiobus_register 函数中、fllow 代码只会被一次性使用:
    对于(I = 0;I < PHY_MAX_ADDR;I++){
    如果((bus->phy_mask &(1 << i))=0){//phy_mask=0、则此处为 true
    struct phy_device * phydev;

    phydev = mdiobus_scan (bus、i);//使用 MDIO 读取 phy、但返回错误
    if (is _ERR (phydev)&&(ptr_ERR (phydev)!=-ENODEV)){
    ERR = PTR_ERR (phydev);
    转至错误;//转出
    }
    }
    }
    当我示波 MDC 时、我得到了 AMOMENT MDC 信号。

    我尝试修改代码、如下所示:
    对于(I = 0;I < PHY_MAX_ADDR;I++){
    if ((bus->phy_mask &(1 << i))=0){
    struct phy_device * phydev;

    phydev = mdiobus_scan (bus、I);
    if (is _ERR (phydev)&&(ptr_ERR (phydev)!=-ENODEV)){
    ERR = PTR_ERR (phydev);
    //转到错误;
    }
    }
    }
    因此、代码将扫描所有32个 phy id、并打印 MDIO 用户访问寄存器0、我得到0x40FFFF~0x5ffff、这意味着 phy 芯片未被确认(MDIO 用户访问寄存器0位29 ACK=0)。
    我同时对 MDC 和 MDIO 进行示波、我可以对所有信号进行示波、这是否意味着 MDIO 总线已经工作了?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    问题已解决:
    phy 有一个复位引脚、我忘记将此引脚设置为 GPIO 并保持高电平、这会使 phy 处于复位模式、因此 phy 无法回复 MDIO。