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.

[参考译文] RTOS/PROCESSOR-SDK-AM437X:以太网链路状态

Guru**** 2589265 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/638890/rtos-processor-sdk-am437x-ethernet-link-status

器件型号:PROCESSOR-SDK-AM437X

工具/软件:TI-RTOS


我想读取 AM437x 以太网接口的链路状态。


我´ve 通过 NC_setLinkHook()将挂钩函数传递到 NDK。 这不奏效。


我正在调用 EMAC_POLL ()、它始终返回 EMAC_LINKSTATUS_NOLINK。

初始化时、这会显示在终端上、这很奇怪:
SetPhyMode:000021e1自动:1、FD10:64、HD10:32、FD100:256、HD100:128、 FD1000:8192 LPBK:0

当我断开 并再次连接电缆时、终端上会显示以下信息:
PHY:4、NegMode 011、NWAYadvertis广播011、NWAYRE45e1
协商连接:全双工100 Mbs。

驱动程序检测到更改,但 EMAC_POLL ()始终返回 EMAC_LINKSTATUS_NOLINK。

如果看起来 ENETPHY_GetLinked 正在读取正确的值、但 EMAC_POLL_v4仅在(tickChange = 1)时调用它。 在这种情况下,p_info->link_status 是否应设置为0? 它是否可以保持先前的值?

已安装的组件:
CCS 7.2
GCC ARM 编译器4.9.3
PROCESSOR_SDK_RTOS_AM437X 4.00.04
AM437x PDK v1.0.7
BIOS 6.46.05.55
xdctools 3.32.02.25_core

电路板:AM437X 入门套件


此致、
Marcio。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Marcio、

    我不太关注为什么需要将 p_info->link_status 设置为0。 我想、如果 ENETPHY_GetLinked 正在读取正确的值、则预期 tickChange = 1。 您可以尝试进入 board\src\evmAM437x\device\enet_phy.c 函数中的 ENETPHY_Tic ()、以找出 tickChange 不为1的原因。

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

    您好、Garrett、

    好的。 I´ll DEBUG ENETPHY_Tic ()。

    ENETPHY_GetLinking()在初始化时被其他代码片段(可能是 NDK)调用。 如果在 ENETPHY_GetLinked()中放置断点 ,程序会在那里停止。 PhyState 的值似乎是正确的。

    关于初始化时显示的消息、您能否检查 ENETPHY_SetPhyMode 中的此设置是否正确? 我不知道确切地说该程序要显示。 例如、FD100:1而不是 FD100:256。

    Enet_PHY_log ("设置物理模式:%08X 自动:%d、FD10:%d、HD10:%d、FD100:%d、HD100:%d、 FD1000:%d LPBK:%d\n"、PhyMode、
    (PhyMode 和 NWay_Auto)、(PhyMode 和 MII_NWay_FD10)、(PhyMode 和 MII_NWay_HD10)、(PhyMode 和 MII_NWay_FD100)、
    (PhyMode 和 MII_NWay_HD100)、(PhyMode 和 NWay_FD1000)、
    (PhyMode & NWay_LPBK));
    

    此致、

    Marcio。

    已编辑:

    注释为"ENETPHY_Tic 每隔10毫秒调用一次以处理 PHY 状态"。

    另一条注释显示"每100毫秒调用一次、如果模式发生更改、则返回 true "。

     当链路状态未改变时、ENETPHY_Tic 返回0、并且 mdioStatus = MDIO_EVENT_NOCHANGE。

    如果 ENETPHY_Tic 仅在链路状态发生更改时返回1、则 EMAC_POLL_v4将仅在链路状态发生更改时返回1、而在其他所有时间返回0 (链路断开)。 最坏的情况是、EMAC_POLL_v4将返回 EMAC_DRV_RESULT_OK。

    如果 EMAC_POLL_v4仅在链路状态发生更改时才评估 p_info->link_status、例如、当 ENETPHY_Tic 返回1时、p_info->link_status 将保留先前的值、这似乎正常。

    编辑了2:

    我´ve 了 EMAC_POLL_v4、将链路状态信息存储在名为 mLinkStatusInfo 的静态数组中。 链接状态仅在状态发生更改时更新。 这似乎解决了我的问题。

    我´d 文件。如果您修改更改,我将不胜感激。
     
    在 emac_drv.h 中定义的常量不会引用由 emac_poll_v4返回的值。 我不知道 EMAC_POLL_v4或常量是否应该被修复。 我不知道他们是否在另一个地方使用过。 EMAC_POLL_v4返回以下值:

    #define EMAC_LINKSTATUS_NOLINK         0
    /**<链接状态:无链接                                                  */
    #define EMAC_LINKSTATUS_HD10           2.
    /**<链接状态:半双工10Mbps                                       */
    #define EMAC_LINKSTATUS_FD10           3.
    /**<链接状态:全双工10Mbps                                       */
    #define EMAC_LINKSTATUS_HD100          4.
    /**<链接状态:半双工100Mbps                                      */
    #define EMAC_LINKSTATUS_FD100          5.
    /**<链接状态:全双工100Mbps                                      */
    #define EMAC_LINKSTATUS_FD1000         7.
    /**<链接状态:全双工1000Mbps      

    e2e.ti.com/.../MB_2D00_AM437x_2D00_EMAC_2D00_20171113.zip   

     

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

    该语句用于在 AM437x IDK 上显示 PHY KSZ9031RNX 寄存器的每个位、请参阅 ww1.microchip.com/downloads/en/DeviceDoc/KSZ9031RNX.pdf 中的寄存器定义、例如:FD100:256表示全双工-寄存器0的位8。 如果显示十六进制值、可能会更清楚一点。

    感谢您提供详细信息。 您的更改是有道理的。 我将在内部与团队讨论。

    此致、
    Garrett