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.

[参考译文] DP83825I:PHY 检测到链路、但内核显示 eth0:链路未就绪

Guru**** 2756835 points

Other Parts Discussed in Thread: DP83825I

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/929406/dp83825i-phy-detects-link-but-kernel-says-eth0-link-is-not-ready

器件型号:DP83825I
主题中讨论的其他器件: DP83825

大家好、

我们使用 DP83825I 与定制的 imx7板连接。  这是我的设备树

fect1{&fect
pinctrl-names ="default";
pinctrl-0 =<&pinctrl_enet1>;

时钟=<&CLKS IMX7D_ENET_AXI_ROOT_CLK>、
<&CLKS IMX7D_ENET_AXI_ROOT_CLK>、
<&CLKS IMX7D_ENET1_TIME_ROOT_CLK>、
<&CLKS IMX7D_PLL_ENET_MAIN_50M_CLK>;
时钟名称="IPG"、"AHB"、"PTP"、"Enet_clk_ref";
分配的时钟=<&CLKS IMX7D_ENET1_TIME_ROOT_SRC>、
<&CLKS IMX7D_ENET1_TIME_ROOT_CLK>;
分配的时钟父级=<&CLKS IMX7D_PLL_ENET_MAIN_100M_CLK>;
分配的时钟速率=<0>、<100000000 >;
PHY-MODE ="RMII";
PHY-Handle =<&ethphy0>;
PHY-SUPPLY =<&enet3v3>;/*以太网电源使能*/
/delete-property/fsl,magic-packet;
PHY-RESET-GPIO =<&GPIO3 26 GPIO_ACTIVE_HIGH_>;
PHY-RESET-DURATION =<2>;
PHY-RESET-POST-DELAY =<50>;
pinctrl-assert-GPIO =<&GPIO3 24 GPIO_ACTIVE_HIGH_>;
状态="正常";

MDIO{
#address-cells =<1>;
#size-cells =<0>;

ethphy0:以太网 phy@0{
兼容="Eth以 太网-phy-IEEE802.3-C22";
reg =<0>;
device-type ="ethernet-phy";
};
};
};

pinctrl_enet1:enet1grp{
FSL、引脚=<
MX7D_PAD_ENET1_RGMII_TD0_ENET1_RGMII_TD0 (MX7D_PAD_CTL_DSE_X2)
MX7D_PAD_ENET1_RGMII_TD1_ENET1_RGMII_TD1 (MX7D_PAD_CTL_DSE_X2)
MX7D_PAD_ENET1_RGMII_TX_CTL__ENET1_RGMII_TX_CTL (MX7D_PAD_CTL_DSE_X2)

MX7D_PAD_ENET1_RGMII_RD0__ENET1_RGMII_RD0 (MX7D_PAD_CTL_DSE_X2)
MX7D_PAD_ENET1_RGMII_RD1__ENET1_RGMII_RD1 (MX7D_PAD_CTL_DSE_X2)
MX7D_PAD_ENET1_RGMII_RXC_ENET1_RX1_ER (MX7D_PAD_CTL_DSE_X2)

MX7D_PAD_ENET1_TX_CLK_CCM_ENET_REF_CLK1 (MX7D_PAD_ION | MX7D_PAD_CTL_DSE_X2)
MX7D_PAD_EPDC_BDR0_CCM_ENET_REF_CLK2 (MX7D_PAD_ION | MX7D_PAD_CTL_DSE_X2)

MX7D_PAD_SD2_WP_ENET1_MDC (MX7D_PAD_CTL_DSE_X2)
MX7D_PAD_SD2_CD_B_ENET1_MDIO (MX7D_PAD_CTL_DSE_X2)

MX7D_PAD_ENET1_RGMII_RX_CTL__ENET1_RGMII_RX_CTL (MX7D_PAD_CTL_DSE_X2)

MX7D_PAD_LCD_DATA21__GPIO3_IO26 (MX7D_PAD_CTL_PUS_100K_DOWN | MX7D_PAD_CTL_PUE | MX7D_PAD_CTL_SRE_SLOW | MX7D_PAD_CTL_DSE_X1)/* n_ENET_RST *
MX7D_PAD_LCD_DATA19__GPIO3_IO24 (MX7D_PAD_CTL_PUS_100K_DOWN | MX7D_PAD_CTL_PUE | MX7D_PAD_CTL_SRE_SLOW | MX7D_PAD_CTL_DSE_X1)/* n_ENET_PWDN *
>;
};

PHY 被检测为 DP8382S。  我读取寄存器0x01 BMSR、其值为0x786D、即检测到链路。 但是、内核显示 eth0链接未就绪。 ethtool 表示未检测到链接。

CLK 线路处于激活状态

RD1和 CRS_DV 上的活动

但是、来自 iMX7的所有发射信号都是静默的。 完全没有活动。  

问题可能出在哪呢? 感谢您的任何帮助。

谢谢、

Asma

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

    尊敬的 Asma:

    我会将您的帖子发送给驱动程序和软件团队。 DP83825I 似乎正常工作、可以让您深入了解您提供的软件。

    此致、
    Justin  

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

    好极了。 我真的很期待这件事

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

    您好

    对此进行了任何更新?  

    我们非常感谢您提供的任何帮助。

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

    你好

    在 phy 内核的 genphy_update_link 中读取 BMSR 状态此函数经过轮询、是一个通用 Linux 函数。

    https://elixir.bootlin.com/linux/latest/source/drivers/net/phy/phy_device.c#L2149

    825驱动程序仅管理中断和 WoL。  825驱动程序不报告由 PHY 内核负责的链路状态。

    如果器件在 BMSR 中报告0x786d、我希望您在 genphy_update_link 函数中放置一些调试语句、以确定内核读取的内容。

    Dan

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

    尊敬的 Asma:

    在初始化 PHY 并建立链路时、您能否提供您正在使用的内核版本和内核日志?

    此致、
    Justin  

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

    您好 Justin 和 Dan、

    非常感谢您的回答。 我正在使用内核版本4.19.35。 我已使用 DP83825补丁更新了驱动程序。

    很抱歉、我之前说过已检测到链接。 我错了、但这是为了其他一些事情。  我无法检测到任何链路、  

    这是我通过 phytool 读取的所有 PHY 寄存器的输出。

    root@qt850:~ phytool read eth0/0/0x00
    
    0x3100
    
    root@qt850:~# phytool read eth0/0/0x01
    
    0x7849
    
    Link is not detected
    
    root@qt850:~# phytool read eth0/0/0/0x02
    
    0x2000
    
    root@etht850:~# phytool read 0/0/0/0/0x0-0x08/phyq850
    
    
    
    @root 用户指南0x08/080-0x0100~
    
    
    
    
    
    
    
    –qt850
    
    
    
    
    
    
    
    :root 用户指南0x0000-0x0-0x0100@–qt850:root 用户指南读操作系统0x0x0x0100~–0x0000x0100–qt850@
    
    
    
    –qt850~–q0x0x0x0100–qt850@–qt850–q0x0x0x0x0x0x0x0100–qt850~–qt850@–qtqtqtqt850~@~–qtq0x0x0x0100 phytool read eth0/0/0/0x09
    
    0000
    
    root@qt850:~# phytool read eth0/0/0x0a
    
    0x0100
    
    root@qt850:~# phytool read eth0/0/0/0x0B
    
    0000
    
    root@qt850:~# phytool read eth0/0/0x0c
    
    root
    
    @qt850:~# phytool read eth0
    
    
    
    
    
    
    
    –0x0/q0100 root@~@~
    
    
    
    @~尚未
    
    
    
    完成 半双工
    
    
    
    @qt850:~ phytool read eth0/0/0x11
    
    0x0108
    
    root@qt850:~# phytool read eth0/0/0/0x12
    
    0000
    
    root@qt850:~# phytool read eth0/0/0/0x13
    
    0x6800
    
    root@qt850:~# phytool read eth0/0/0/00x180
    
    
    
    @phyetht工具 读取
    
    0x100~
    
    
    
    
    
    
    
    
    
    eth0 root 用户指南0x000/q850#
    
    0x180@phyetq0100 root 用户指南:0x000/qt850~ eth0 root 用户指南0x000-0x0180080 root 用户指南:0x000/qt180@eth0 root 用户指南0x80000~–0x80000
    
    
    
    
    
    
    
    –0x000100 phyetqt180@–0x000100~–qt180@–qt180~–qt180@~–qt180–qt180读出 读取 eth0/0/0x1a
    
    0x0010
    
    root@qt850:~# phytool read eth0/0/0x1b
    
    0x007d
    
    root@qt850:~# phytool read eth0/0/0/0x850
    
    0x05ee
    
    root@qt850:~# phytool read eth0/0/0x1d
    
    0000
    
    @phyqt850:~ 0/0x102t root 用户/qt850:
    
    
    
    @~ 01t1t 读取 eth1eq1t et1e0/et1t 工具
    
    

    Dan Murphy (1554927) 我检查了您在 genphy 更新链接中询问的寄存器。 它不会检测到任何链路。 这里是驱动程序代码、我对其进行了修改、以将其设置为主模式  

    //
    *德州仪器(TI) DP83822 PHY 的驱动程序
    *
    *版权所有(C) 2017 Texas Instruments Inc.
    *
    *本程序是免费软件;您可以根据
    
    * Free Software Foundation 发布的 GNU 通用公共许可证条款重新分发和/或修改*本许可证的第2版。
    *
    **本计划的发布目的是希望其有用
    、*但没有任何保证;甚至没有*
    适销性或特定用途适用性的暗示保证。 有关
    更多详细信息、请参阅* GNU 通用公共许可证。
    */
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    #define DP83822_PHY_ID0x2000a240
    #define DP83825S_PHY_ID0x2000a140
    #define DP83825I_PHY_ID0x2000a150
    #define DP83825CM_PHY_ID0x2000a160
    #define DP83825CS_PHY_ID0x2000a170
    #define DP83826C_PHY_ID 0x2000a130
    #define DP83822_DP83822_PHYI
    
    
    
    
    
    
    
    
    #define
    DP83822_DP83822 #define DP83822_DP83822_PHY0_TRI #define DP83822 #define DP83822_DP83822_DP83822_DP83822_DP83822_DP83822_PHYST_DP83822_TRI #define #define DP83822_DP83822_DP83812_DP83822_DP83822_DP83822_DP83822_DP83822_DP83822_PHYST_DP0_DP83822_DP83822#define #define #define #define DP83822_DP83822_DP0_DP83822_DP83822_DP83822_DP83822_
    
    
    位(0)/*中断输出使能*/
    #define DP83822_PHYSCR_INTEN位(1)/*中断使能
    
    
    
    
    
    
    
    
    
    
    
    */* MISR1位*/#define DP83822_RX_ERR_HF_INT_EN 位(0)#define DP83822_INT_INT_INT_INT_INT_INT_BIT #define DP83822_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_BIT (1)#define DP83822_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_
    
    位(1)
    #define DP83822_SLEEP_MODE_INT_EN位(2)
    #define DP83822_MDI_XOVER_INT_EN位(3)
    #define DP83822_LB_FIFO_INT_EN位(4)
    #define DP83822_RXEP_INT_EN位(5)
    #define DP83822_INT_TXEP_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INDP83822 #define
    
    
    
    
    
    
    
    
    
    
    DP83822*#define DP83822*#define DP83822*#define DP83822*#define DP83822*#define DP83822*#define DP83822_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_TX
    
    
    0x04a2
    #defineMII_DP83822_WOL_DA20x04a3
    #defineMII_DP83822_WOL_DA30x04a4
    
    // WoL 位*/
    #define DP83822_WOL_EN位(0)
    #define DP83822_WOL_SECURE_ON位(5)
    #define DP83822_WOL_WOL_EN_WOL_DR_EN 位
    (0)#define DP83822_EN_WL_OL_DRL_EN_EN_INTOOL_INN
    
    
    
    位(#define DP83822_EN_NOL 位#define DP83822 #define DP83822_EN_NOT_WL_DRL_EN_NOT_WL_ARN 位#define DP83822_EN_EN_
    (0x0467)
    #define DP83822_Rcsr_clock_selectbit (7)
    
    /*为 GPIO3控制添加了*
    /#define DP83822_IOCTRL1_ADDR (0x0462)
    #define DP83822_IOCTRL1_GPIO3_CLOCK (bit (9)| bit (8))
    #define DP83822_IOCTRL1_GPIO3_MASK (bit (10)| bit (9)| bit (8)
    #define DP83822_IOCTRL1_CLK_SRC_MASTER (位(14)
    )#define DP83822_IOCTRL1_CLK_SRC_MASK (位(14)|位(13)|位(12)
    )#define DP83822_DEV_ADDR (0x1f)
    
    static int dp83822_ack_interrupt (struct phy_device * phydev)
    {
    int err;
    
    err = phy_read (phydev、MII_DP83822_ethR1);
    if (err < 0)
    return err;
    
    err = phy_read (phydev、MII_DP83822_misR2);
    if (err_ev_wip_t_t_set);if
    
    
    
    
    
    
    
    
    (static = wipt_t_mstructure = nature_t_net_ev_wm= nevn)
    
    const u8 *mac;
    
    if (wol->wolopts &(WAKE_Magic | WAKE_MAGICSECURE)){
    mac =(const u8 *) ndev->dev_addr;
    
    if (!ies_valid_ete_addr (Mac)
    )返回-EINVAL;
    
    // mac 地址以字节5开头,但存储在 mac[0]中。
    * 822 PHY 存储字节4|5、2|3、0|1
    */
    phy_write_MMD (phydev、DP83822_DEVADDR、MII_DP83822_WOL_DA1、
    (MAC[1]<<8)| MAC[0]);
    phy_write_MMD (phydev、DP83822_DEVADDR、MII_DP83822_WOL_DA2、
    (MAC[3]<<8)| MAC[2]);
    phy_write_MMD (phydev、DP83822_DEVADDR、MII_DP83822_WOL_DA3、
    (MAC[5]<< 8)| MAC[4]);
    
    value = phy_read_md (phydev、DP83822_DEVADDR、
    MII_DP83822_WOL_CFG);
    IF (wol->phyopts & wake_magic)
    值|= DP83822_WOL_Magic_EN;
    else
    值&=~DP83822_WOL_Magic_EN;
    
    IF (wol->wolopts & wake_MASECURE){WRITE_MMDD_DEV_MAGICDP83822
    、DP83822 DEV_EVANGICDP83822、DP83822
    MII_DP83822_RXSOP1、
    (WOL->SOPAS[1]<<8)| WOL->SOPAS[0]);
    phy_write_MMD (phydev、DP83822_DEVADDR、
    MII_DP83822_RXSOP2、
    (WOL->SOPAS[3]<<8)| WOL->SOPAS[2]);
    phy_write_MMD (phydev、DP83822_DEVADDR、
    MII_DP83822_RXSOP3、
    (WOL->sopass[5]<< 8)| wol->sopass[4]);
    value |= DP83822_WOL_SECURE_ON;
    }否则{
    value &=~DP83822_WOL_SECURE_ON;
    }
    
    value |=(DP83822_WOL_ENEN | DP83822_WOL_STOP_ING_ON;DP83822_WOL_DRL_DP83822_DEV_WL_D
    、DP83822_WL_DP83822_WL_DP83822_WL_DP83822_DEV_WL_D 指示;DP83822_DP83822_DP83822_WL_WL_DR_WL_WL_WL_W
    
    value);
    }否则{
    value = phy_read_md (phydev、DP83822_DEVADDR、
    MII_DP83822_WOL_CFG);
    值&=~DP83822_WOL_EN;
    phy_write_MMD (phydev、DP83822_DEVADDR、MII_DP83822_WOL_CFG、
    值);
    }
    
    返回0;
    }
    
    静态空 dp83822_get_wol (struct phy_device * phydev、
    struct ethtool_wolinfo *wol)
    {
    int value;
    u16 sopass_val;
    
    wol->supported =(WAKE_魔术| WAKE_MAGICSECURE);
    wol->wolopts = 0;
    
    value = phy_read_md (phydev、DP83822_DEVADDR、MII_DP83822_WOL_CFG);
    
    if (value & DP83822_WOL_MASS_EN)
    wol->DPOPS|= WAKE_MAKE;
    
    if (value & DP83822_WOL_SECURE_ON){
    sopass_val = phy_read_md (phydev、DP83822_Dval DDR、
    MII_RXSOP1);sopass
    = sopwv_sw_sw_swi_sw_s=
    
    
    sv_sv_swap_sw_sw_sw_s= sv_swap_sv_sw_swap_sw_s=
    
    (v_swi_sv_sw_swi_sw_swi_sw_swi_swi_sw_swi_swi_swi_swi_swi_swi_swi_swi_swi_swi_v_swi_swi_swi_sw_swi_swi_v_swi_swi_swi=)
    
    
    ;(sv_sw_sw_swi_v_swi_v_swi_swi_sw_sw_
    
    WoL->sopass[4]=(sopass_val & 0xff);
    wol->sopass[5]=(sopass_val >> 8);
    
    wol->wolopts |= WAKE_MAGICURE;
    }
    
    // WoL 未启用,因此将 wolopts 设置为0 */
    if (!!status &
    
    
    
    evol_static)= wole_sepic sepic sepic sepic sepic;}sepic supt = 0*s = wolsepwol_sepic sepic sepic sepic sepic sepic sepic sepic sepy = 0*s;}
    
    
    
    
    
    if (phydev->interrupts =PHY_INTERRUPT_ENABLED){
    misr_status = phy_read (phydev、MII_DP83822_MISR1);
    if (misr_status < 0)
    return misr_status;
    
    misr_status |=(DP83822_RX_HF_INT_INT_EN |
    DP83822_INT_INT_INT_RETURN
    
    
    
    
    
    
    
    | DP83822_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_RETURN | DP83822_INT_EN_INT_INT_INT_INT_INT_INT_INT_EN_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_EN_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INP_RETURN
    
    
    
    )| DP83822 | DP3822_INT_INT_INT_INT_INT_INT_INT_INT_IN
    if (misr_status < 0)
    return misr_status;
    
    misr_status |=(DP83822_Jabber_DET_INT_EN |
    DP83822_WL_PKT_INT_EN |
    DP83822_SLEEP_MODE_INT_EN |
    DP83822_INT_INT_INT_INT_EN | DP83822_INT_INT_INT_PR_INT_INT_INT_INT_INT_INT_EN|
    DP83822
    
    
    
    
    
    
    
    
    
    | DP83822_INT_INT_INT_EN_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_EN_INT_INT_INT_INT_EN_INT_INT_INESR
    
    
    
    
    | DP83822 | DP83822 | DP83822_IN_IN_IN_IN_IN_IN_IN_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_INT_ 否则{
    err = phy_write (phydev、MII_DP83822_MISR1、0);
    if (err < 0)
    return err;
    
    err = phy_write (phydev、MII_DP83822_MISR1、0);
    if (err < 0)
    return err;
    
    physcr_status = phy_read (phydev、MII_DP83822、physcr_status
    
    
    
    ~
    );physcr_physcr_physcr_physcr_status = physcr_physcr_phy0_physcr_physcr_physcr_phy0_physcr_physcr_physcr_physcr_physcr_phyr;}
    
    
    
    
    static int dp83822_config_init (struct phy_device * phydev)
    {
    int err;
    int value;
    
    err = genphy_config_init (phydev);
    if (err < 0)
    return err;
    
    值= phy_read (phydev、MII_DP83822_RCSR);
    
    值&=~(DP83822_Rcsr_clock_select);
    PHY_WRITE (phydev、MII_DP83822_RCSR、值);
    
    值= phy_read_md (phydev、DP83822_DEV_ADDR、DP83825_SOR1_ADDR);
    
    值&=~(bit (3));
    err = phy_write_MMD (phydev、DP83822_DEV_ADDR、DP83825_SOR1_ADDR、value); 
    值= phy_read_md (phydev、DP83822_DEV_ADDR、DP83825_SOR1_ADDR); pr_warn ("SOR1 =%d"、value); //禁用 WOL 以便我们可以转到睡眠 值= phy_read_md (phydev、DP83822_DEVADDR、MII_DP83822_WOL_CFG); 值= DP83822_WOL_Magic_EN | DP83822_WOL_SECURE_ON | DP83822_WOL_EN; 返回 phy_write_MMD (phydev、DP83822_DEVADDR、MII_DP83822_WOL_CFG、 值); } 静态 int dp83822_phy_reset (struct phy_device * phydev) { int err; err = phy_write (phydev、MII_DP83822_RESET_CTRL、DP83822_SW_RESET); if (err < 0) return err; while (DP83822_SW_RESET 和 phy_read (phydev、MII_DP83822_RESET_CTRL); dp83822_config_init (phydev); return 0; } static int dp83822_suspend (struct phy_device * phydev) ; value = phy_read_md (phydev_yv_evel) ;md 3822_ybum_ev_en_y_resume (md)、md (v_ev_yv_yv_yb_en_yb_en_yb_ev_y2_de_en_en_ev_y_y_y_yb_yb_yb_yb_yb_yb_yb_ybt); PHY_WRITE_MMD (phydev、DP83822_DEVADDR、MII_DP83822_WOL_CFG、值| DP83822_WOL_CLR_Indication); 返回0; } #define DP83822_PHY_DRIVER (_id、_name) \ { \ PHY_ID_MATH_MODEL (_id)、 \ phy_id_mask = 0xfffffff0、 \ 名称 =(_name)、 \ .features = PHY_basic_features、 \ /* PHY_basic_features */ \ .SOFT_RESET = dp83822_phy_reset、 \ config_init = dp83822_config_init、 \ get_wol = dp83822_get_wol、 \ Set_wol = dp83822_set_wol、 \ .ack_interrupt = dp83822_ack_interrupt、 \ config_intr = dp83822_config_intr、 \ .suspend = dp83822_suspend、 \ .resume = dp83822_resume、 \} 静态结构 phy_driver dp83822_driver[]={ DP83822_PHY_DRIVER (DP83822_PHY_ID、"TI DP83822")、 DP83822_PHY_DRIVER (DP83825I_PHY_ID、"TI DP83825I")、 DP83822_PHY_DRIVER (DP83826C_PHY) "TI DP83826C")、 DP83822_PHY_DRIVER (DP83826NC_PHY_ID、"TI DP83826NC")、 DP83822_PHY_DRIVER (DP83825S_PHY_ID、"TI DP83825S")、 DP83822_PHY_DRIVER (DP83825CM_PHY_ID、"TI DP83825M")、 DP83822_PHY_DRIVER (DP83825CS_PHY_ID、"TI DP83825CS") 、}; MODULE_PHY_DRIVER (dp83822_driver); 静态结构 MDIO_DEVICE_ID __POR_UNused dp83822_tbl[]={ DP83822_PHY_ID、0xfffffff0}、 {DP83825I_PHY_ID、0xffffff0}、 {DP83826C_PHY_ID、 0xffffff0}、 {DP83826NC_PHY_ID、0xffffff0}、 {DP83825S_PHY_ID、0xffffff0}、 {DP83825CM_PHY_ID、0xffffff0}、 {DP83825CS_PHY_ID、0xffffff0}、 {}、 }; module_device_table (mDIO、dp83822_tbl); module_description ("Texas Instruments DP83822 PHY 驱动程序"); module_Author ("Dan Murphy <dmurphy@ti.com); module_license ("GPL v2");

    如果我有什么问题、可以查看一下吗? 我们非常感谢您的帮助

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

    你好

    好的、我查看了代码。

    首先、您不能向 SOR1寄存器写入只读值

      ERR = phy_write_md (phydev、DP83822_DEV_ADDR、DP83825_SOR1_ADDR、value);

    接下来、代码显示禁用 WoL、但代码片段正在启用 WoL

    //禁用 WOL,以便我们可以进入睡眠状态

    值= DP83822_WOL_魔术_EN | DP83822_WOL_SECURE_ON | DP83822_WOL_EN;//这会将所有位设置为1

    我不确定下面的代码是否正在执行任何操作、因为位(7)的默认值为0、这似乎是您设置的值

    值= phy_read (phydev、MII_DP83822_RCSR);

    SOR1和 SOR2的值是多少?

    Dan

    值&=~(DP83822_Rcsr_clock_select);

    PHY_WRITE (phydev、MII_DP83822_RCSR、值);

    也许您应该看看当前的上游驱动程序。  它会正确禁用 WoL

    https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/net/phy/dp83822.c

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

    Dan、您好!

    在 DP83825I 数据表中、对于 SOR1 寄存器、它没有提到它是只读的、根据我的理解、我可以将位3和位0配置为未提及 R 类型。 SOR2也是如此。




    我已将我的驱动程序更新到同一链接、但没有更改输出。
    我获取的 SOR1和 SOR2值如下:
    SOR1 = 0x533
    SOR2 = 0x1290

    BMSR = 0x7849

    BMCR = 0x3100、

    这会导致自动协商未完成。  

    您能告诉我、如何在不使用自举的情况下设置为主模式吗?

    此外、在器件树中、以下引脚的引脚配置、上拉/下拉是什么?

    RX_D0、RX_D1、TX_D0、TX_D1和 CRS_DV。

    谢谢、

    Asma

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

    尊敬的 Asma:

    您不能写入寄存器 SOR1或 SOR2、它们应该被视为只读。 这些寄存器提供有关在加电和复位时锁存的引导配置的信息。  

    DP83825I 器件从寄存器0x0467[3]=0捆绑到 RMII 主模式。

    您能否提供有关您所选择的操作模式的说明、并且我可以提供引导配置或寄存器写入来实现这一点?

    此致、
    Justin  

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

    您好 Justin、

    我的目标是 RMII 主模式。

    谢谢、

    Asma

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

    尊敬的 Asma:

    您能否通过寄存器0x0017[7]=0确认器件是否配置为该模式?

    此致、
    Justin  

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

    您好 Justin、

    我将0x0017的值设为0x60、因此第7位为0。

    这是否意味着我的设置正确?

    我仍然没有获得链接、如果我共享原理图或0x00至0x1F 的所有寄存器的寄存器值、会有所帮助吗?

    此致、

    Asma

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

    尊敬的 Asma:

    是的、这会很有帮助。 您能否澄清一下您在哪些条件下能够检测到链路以及何时不能检测到链路? 我最初的理解是 PHY 可以连接、但软件未检测到、这是否发生了变化?

    此致、
    Justin  

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

    尊敬的 Asma:

    我正在关闭此主题、因为我没有听到响应。 如果您需要帮助、请创建新帖子并参考此主题。

    此致、
    Justin