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.

[参考译文] AM2432:集成 bcm8984时、返回第45条失败

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1520634/am2432-clause-45-returned-failed-when-integrating-bcm89884

器件型号:AM2432

工具/软件:

您好 TI

我们希望在需要第45条访问方法的项目中使用 bcm8984。

在 EnetApp_waitForPhyAlive 中、我们检测到 CPSW_MDIO_Alive_REG 为0x01、因此我们的 PHY 地址为0。

然后、我们尝试通过第45条函数 EnetExtPhyMdioDflt_readC45读取 phy 寄存器。 但得到了如下所示的故障日志

Mdio_readRegCompleteC45: failed to read PHY 0 C45 MMD 1 register 2: -1
Mdio_normal_ioctl_handler_ENET_MDIO_IOCTL_C45_ASYNC_READ_COMPLETE: failed to read PHY 0 C45 MMD 1 reg 2: -1
EnetMod_ioctl: cpsw3g.mdio: Failed to do IOCTL cmd 0x0100060e: -1
EnetPer_ioctl: cpsw3g: Failed to do IOCTL cmd 0x0100060e: -1
Enet_ioctl: cpsw3g: IOCTL 0x0100060e failed: -1

我们跟踪了日志、发现函数 MDIO_readRegCompleteC45中出现错误。

static int32_t Mdio_readRegCompleteC45(CSL_mdioHandle mdioRegs,
                               uint32_t userCh,
                               uint32_t mmd,
                               uint32_t phyAddr,
                               uint16_t reg,
                               uint16_t *val)
{
    uint32_t c45EnMask;
    int32_t status = CSL_EFAIL;
    bool accessRegBusy = true;

    c45EnMask = CSL_MDIO_getClause45EnableMask(mdioRegs);
    if (ENET_IS_BIT_SET(c45EnMask, phyAddr))
    {
    /* Wait for register read transaction to complete */
        if (CSL_MDIO_isPhyRegAccessComplete(mdioRegs, userCh))
        {
            accessRegBusy = false;
        }

        if(accessRegBusy == false)
        {
            uint32_t regPhyAddr, regPhyRegNum;
            regPhyAddr = CSL_FEXT(mdioRegs->USER_GROUP[userCh].USER_ACCESS_REG, MDIO_USER_GROUP_USER_ACCESS_REG_PHYADR);
            regPhyRegNum = CSL_FEXT(mdioRegs->USER_GROUP[userCh].USER_ACCESS_REG, MDIO_USER_GROUP_USER_ACCESS_REG_REGADR);
            if ((regPhyAddr == phyAddr)
                &&
                (regPhyRegNum == reg))
            {
                status = CSL_MDIO_phyGetRegReadVal(mdioRegs, userCh, val);
            }
            if(status != CSL_PASS)
            {
                ENETTRACE_ERR_IF(status == CSL_ETIMEOUT,
                                    "C45 register read %u was not acknowledged by PHY %u: %d\n",
                                    reg, phyAddr, status);
                ENETTRACE_ERR_IF(status == CSL_EFAIL,
                                    "failed to read PHY %u C45 MMD %u register %u: %d\n",
                                    phyAddr, mmd, reg, status);
            }
        }
    }
    else
    {
        ENETTRACE_ERR("PHY %u is not configured for C45 access\n", phyAddr);
        status = ENET_EPERM;
    }

    return status;
}

我们感到困惑的是, 此函数中的 regPhyRegNum 应该是 MMD,但为什么它与 reg value 进行比较? 在本例中、PHY 地址为0、MMD 为1 (PMA_PMD)、寄存器地址为0x02。 所以  

regPhyRegNum 为1、但寄存器为0x02。

我们的 SDK 版本为 mcu_plus_sdk_am243x_09_02_01_05。 期待您的答复。 非常感谢。

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

    尊敬的 

    感谢您的查询。

    我们将查看该问题并返回给您。

    此致

    Ashwani

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

    谢谢 Ashwani

    为了使用 clause45、我将 MDIO 工作模式从 MANAL 更改为 NORMAL

    我们不确定这是否正常?

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

    你(们)好 Ashwani

    我们更改了函数 MDIO_readRegCompleteC45中的 SDK 代码、它现在可以正常工作。 我们现在可以解决这个问题,感谢您的支持。