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.

[参考译文] DP83869HM:近端环回

Guru**** 2409930 points


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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1050418/dp83869hm-near-end-loopback

器件型号:DP83869HM
主题中讨论的其他器件:DP83869

我想通过将 PHY 设置为近端回送模式来测试 MAC<->PHY 通信。

接口速度为1000M (RGMII)、OP 模式铜缆。

我尝试遵循数据表中的描述、但这不清楚。

https://www.ti.com/lit/ds/symlink/dp83869hm.pdf

在第9.3.4.1节之后、我应该在 寄存器 0x00FE (LOOPCR)中写入0xE720、问题是没有这样的寄存器、我缺少什么?

我尝试的方法:(没有成功)

方法1.

1) 1)将0x4140写入0x0 (设置环回、禁用 A/N、设置1000M 速度)

2) 2)将0x1写入0x16 (PCS 环回选择、扰频器之前的循环)

3) 3)将0x4000写入0x1F (软件复位)。

方法2.

1)只需将0x1写入寄存器0x16 (PCS 环回选择、扰频器前循环)

方法3.

1) 1)将 0x8000写入0x1f (复位、清零寄存器)

2) 2)将0x40写入0x00 (设置1000M 模式)

3) 3)将0x1写入0x16 (PCS 环回选择、扰频器之前的循环)

4) 4)将0x4000写入0x1F (软件复位、保留寄存器值)。

您能否提供有关如何将 PHY 配置为近端回送(PCS 环回)、1000M 的明确步骤?

谢谢

我还有另一个问题,如何测试与 Linux 的通信(MAC <->PHY,当 PHY 处于环回模式时)? 我正在使用的两个 MAC (CPSW、ICSSG)似乎都不支持测试模式

# ethtool -i eth0
驱动器:am65-cpsw-nuss
版本:5.10.41-00009-g2b4dcfa8d633-dir
固件版本:
扩展 ROM 版本:
总线信息:8000000.ethernet
支持统计信息:是
支持-测试:否
支持 EEPROM 访问:否
支持寄存器转储:是
supports-priv-flags:是


--------------------------------------------------

# ethtool -i eth1
驱动程序:icssg-prueth
版本:5.10.41-00009-g2b4dcfa8d633-dir
固件版本:
扩展 ROM 版本:
总线信息:icssg1-eth
支持统计信息:是
支持-测试:否
支持 EEPROM 访问:否
支持寄存器转储:否
supports-priv-flags:否

如何测试通信?

我曾想在内核驱动程序中添加一个函数来写入 PHY 寄存器、因此 PHY 将进入回送模式、然后仅使用正常接口、数据将环回 RX。 这可以正常工作吗?

再次感谢

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

    您好!

    您能否尝试以下 PC 环回配置:

    寄存器0x0000 = 0x0140

    寄存器0x0010 = 0x5008

    寄存器0x0016 = 0x0001

    寄存器0x001F = x4000

    或者,您也可以尝试使用以下方法进行数字回送:  

    寄存器0x0000 = 0x0140

    寄存器0x0010 = 0x5008

    寄存器0x0016 = 0x0004

    寄存器0x001F = x4000

    成功回送后、寄存器0x0001中 PHY 的链路状态应变为高电平。

    是的、上面的从 MAC 侧的环回数据将被环回到 MAC。 但是、您需要在 MAC 中使用一些实用程序来将传出数据与传入数据匹配、以验证通信是否正常。

    --

    此致、

    Vikram

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

    感谢您的回复。

    我尝试过您 的建议、但这不起作用(PCS 环回和数字环回)。

    写入这些值后、我在 BMSR 寄存器中得到0x7949值。

    这是我在 PHY 驱动程序中使用的代码:

    static int dp83869_set_loopback(struct phy_device *phydev)
    {
    	int ret = 0;
    	
    	ret = phy_write(phydev, 0x00, 0x140);
    	if(ret) 
    		return ret;
    	
    
    	ret = phy_write(phydev, 0x10, 0x5008);
    	if(ret) 
    		return ret;
    	
    
    	ret = phy_write(phydev, 0x16, 0x1);
    	if(ret) 
    		return ret;
    	
    
    	ret = phy_write(phydev, 0x1f, 0x4000);
    	if(ret) 
    		return ret;
    	
    
    	phydev_info(phydev, "BMSR Value IS: 0x%4X\n", phy_read(phydev, 0x0001) );
    
    	return ret;
    }

    此函数是从 dp83869_config_init 函数调用的。

    以下是引导日志中的相关消息:

    TI DP83869 300b240.MDIO:03:BMSR 值为:0x7949

    TI DP83869 300b240.MDIO:0f:BMSR 值为:0x7949

    TI DP83869 8000f00.MDIO:00:BMSR 值为:0x7949

    所有3个 PHY 都是如此。

    您知道我的错误吗?

    我不会从任何 phy_write 调用中得到任何错误。

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

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

    写入寄存器后、您是否能够读回这些寄存器以确认写入正在进行?

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

    我能够读取所有写入的值、但写入 GEN_CTRL 寄存器的值除外(我不确定是 可以 读取复位值、还是始终读取为0)

    static int dp83869_set_loopback(struct phy_device *phydev)
    {
    	int ret = 0;
    
    
    	ret = phy_write(phydev, 0x00, 0x140);
    	if(ret) 
    		return ret;
    
    
    	phydev_info(phydev, "PHYDEBUG: Value 0x140 was written to register 0x0, read value: 0x%4x\n", phy_read(phydev, 0x00));
    
    	ret = phy_write(phydev, 0x10, 0x5008);
    	if(ret) 
    		return ret;
    	
    
    	phydev_info(phydev, "PHYDEBUG: Value 0x5008 was written to register 0x10, read value: 0x%4x\n", phy_read(phydev, 0x10));
    
    
    	ret = phy_write(phydev, 0x16, 0x1);
    	if(ret)
    		return ret;
    	
    
    	phydev_info(phydev, "PHYDEBUG: Value 0x1 was written to register 0x16, read value: 0x%4x\n", phy_read(phydev, 0x16));
    
    
    	ret = phy_write(phydev, 0x1f, 0x4000);
    	if(ret) 
    		return ret;
    
    	phydev_info(phydev, "PHYDEBUG: Value 0x4000 was written to register 0x1F, read value: 0x%4x\n", phy_read(phydev, 0x1f));
    
    
    
    	phydev_info(phydev, "SECOND PHYDEBUG: Value 0x140 was written to register 0x0, read value: 0x%4x\n", phy_read(phydev, 0x00));
    	phydev_info(phydev, "SECOND PHYDEBUG: Value 0x5008 was written to register 0x10, read value: 0x%4x\n", phy_read(phydev, 0x10));
    	phydev_info(phydev, "SECOND PHYDEBUG: Value 0x1 was written to register 0x16, read value: 0x%4x\n", phy_read(phydev, 0x16));
    
    
    	phydev_info(phydev, "PHYDEBUG: BMSR Value Is: 0x%4X\n", phy_read(phydev, 0x0001) );
    
    	return ret;
    }

    这是"dmesg | grep PHYDEBUG"输出(我有3个 PHY)

    [    2.936147] TI DP83869 300b2400.mdio:0f: PHYDEBUG: Value 0x140 was written to register 0x0, read value: 0x 140
    [    2.946886] TI DP83869 300b2400.mdio:0f: PHYDEBUG: Value 0x5008 was written to register 0x10, read value: 0x5008
    [    2.957724] TI DP83869 300b2400.mdio:0f: PHYDEBUG: Value 0x1 was written to register 0x16, read value: 0x   1
    [    2.968285] TI DP83869 300b2400.mdio:0f: PHYDEBUG: Value 0x4000 was written to register 0x1F, read value: 0x   0
    [    2.978906] TI DP83869 300b2400.mdio:0f: SECOND PHYDEBUG: Value 0x140 was written to register 0x0, read value: 0x 140
    [    2.989965] TI DP83869 300b2400.mdio:0f: SECOND PHYDEBUG: Value 0x5008 was written to register 0x10, read value: 0x5008
    [    3.001205] TI DP83869 300b2400.mdio:0f: SECOND PHYDEBUG: Value 0x1 was written to register 0x16, read value: 0x   1
    [    3.012173] TI DP83869 300b2400.mdio:0f: PHYDEBUG: BMSR Value Is: 0x7949
    [    3.037834] TI DP83869 300b2400.mdio:03: PHYDEBUG: Value 0x140 was written to register 0x0, read value: 0x 140
    [    3.048489] TI DP83869 300b2400.mdio:03: PHYDEBUG: Value 0x5008 was written to register 0x10, read value: 0x5008
    [    3.059329] TI DP83869 300b2400.mdio:03: PHYDEBUG: Value 0x1 was written to register 0x16, read value: 0x   1
    [    3.069898] TI DP83869 300b2400.mdio:03: PHYDEBUG: Value 0x4000 was written to register 0x1F, read value: 0x   0
    [    3.080513] TI DP83869 300b2400.mdio:03: SECOND PHYDEBUG: Value 0x140 was written to register 0x0, read value: 0x 140
    [    3.091582] TI DP83869 300b2400.mdio:03: SECOND PHYDEBUG: Value 0x5008 was written to register 0x10, read value: 0x5008
    [    3.102823] TI DP83869 300b2400.mdio:03: SECOND PHYDEBUG: Value 0x1 was written to register 0x16, read value: 0x   1
    [    3.113796] TI DP83869 300b2400.mdio:03: PHYDEBUG: BMSR Value Is: 0x7949
    [    3.266729] TI DP83869 8000f00.mdio:00: PHYDEBUG: Value 0x140 was written to register 0x0, read value: 0x 140
    [    3.277092] TI DP83869 8000f00.mdio:00: PHYDEBUG: Value 0x5008 was written to register 0x10, read value: 0x5008
    [    3.287600] TI DP83869 8000f00.mdio:00: PHYDEBUG: Value 0x1 was written to register 0x16, read value: 0x   1
    [    3.297840] TI DP83869 8000f00.mdio:00: PHYDEBUG: Value 0x4000 was written to register 0x1F, read value: 0x   0
    [    3.308135] TI DP83869 8000f00.mdio:00: SECOND PHYDEBUG: Value 0x140 was written to register 0x0, read value: 0x 140
    [    3.318862] TI DP83869 8000f00.mdio:00: SECOND PHYDEBUG: Value 0x5008 was written to register 0x10, read value: 0x5008
    [    3.329759] TI DP83869 8000f00.mdio:00: SECOND PHYDEBUG: Value 0x1 was written to register 0x16, read value: 0x   1
    [    3.340395] TI DP83869 8000f00.mdio:00: PHYDEBUG: BMSR Value Is: 0x7949
    [    3.448680] TI DP83869 300b2400.mdio:0f: PHYDEBUG: Value 0x140 was written to register 0x0, read value: 0x 140
    [    3.459093] TI DP83869 300b2400.mdio:0f: PHYDEBUG: Value 0x5008 was written to register 0x10, read value: 0x5008
    [    3.469685] TI DP83869 300b2400.mdio:0f: PHYDEBUG: Value 0x1 was written to register 0x16, read value: 0x   1
    [    3.480011] TI DP83869 300b2400.mdio:0f: PHYDEBUG: Value 0x4000 was written to register 0x1F, read value: 0x   0
    [    3.490386] TI DP83869 300b2400.mdio:0f: SECOND PHYDEBUG: Value 0x140 was written to register 0x0, read value: 0x 140
    [    3.501199] TI DP83869 300b2400.mdio:0f: SECOND PHYDEBUG: Value 0x5008 was written to register 0x10, read value: 0x5008
    [    3.512182] TI DP83869 300b2400.mdio:0f: SECOND PHYDEBUG: Value 0x1 was written to register 0x16, read value: 0x   1
    [    3.522904] TI DP83869 300b2400.mdio:0f: PHYDEBUG: BMSR Value Is: 0x7949
    [    3.545839] TI DP83869 300b2400.mdio:0f: PHYDEBUG: Value 0x140 was written to register 0x0, read value: 0x 140
    [    3.556251] TI DP83869 300b2400.mdio:0f: PHYDEBUG: Value 0x5008 was written to register 0x10, read value: 0x5008
    [    3.566839] TI DP83869 300b2400.mdio:0f: PHYDEBUG: Value 0x1 was written to register 0x16, read value: 0x   1
    [    3.577164] TI DP83869 300b2400.mdio:0f: PHYDEBUG: Value 0x4000 was written to register 0x1F, read value: 0x   0
    [    3.587540] TI DP83869 300b2400.mdio:0f: SECOND PHYDEBUG: Value 0x140 was written to register 0x0, read value: 0x 140
    [    3.598354] TI DP83869 300b2400.mdio:0f: SECOND PHYDEBUG: Value 0x5008 was written to register 0x10, read value: 0x5008
    [    3.609337] TI DP83869 300b2400.mdio:0f: SECOND PHYDEBUG: Value 0x1 was written to register 0x16, read value: 0x   1
    [    3.620059] TI DP83869 300b2400.mdio:0f: PHYDEBUG: BMSR Value Is: 0x7949
    [    3.650993] TI DP83869 300b2400.mdio:03: PHYDEBUG: Value 0x140 was written to register 0x0, read value: 0x 140
    [    3.661410] TI DP83869 300b2400.mdio:03: PHYDEBUG: Value 0x5008 was written to register 0x10, read value: 0x5008
    [    3.671999] TI DP83869 300b2400.mdio:03: PHYDEBUG: Value 0x1 was written to register 0x16, read value: 0x   1
    [    3.682324] TI DP83869 300b2400.mdio:03: PHYDEBUG: Value 0x4000 was written to register 0x1F, read value: 0x   0
    [    3.692707] TI DP83869 300b2400.mdio:03: SECOND PHYDEBUG: Value 0x140 was written to register 0x0, read value: 0x 140
    [    3.703516] TI DP83869 300b2400.mdio:03: SECOND PHYDEBUG: Value 0x5008 was written to register 0x10, read value: 0x5008
    [    3.714499] TI DP83869 300b2400.mdio:03: SECOND PHYDEBUG: Value 0x1 was written to register 0x16, read value: 0x   1
    [    3.725221] TI DP83869 300b2400.mdio:03: PHYDEBUG: BMSR Value Is: 0x7949
    [    3.748154] TI DP83869 300b2400.mdio:03: PHYDEBUG: Value 0x140 was written to register 0x0, read value: 0x 140
    [    3.758570] TI DP83869 300b2400.mdio:03: PHYDEBUG: Value 0x5008 was written to register 0x10, read value: 0x5008
    [    3.769155] TI DP83869 300b2400.mdio:03: PHYDEBUG: Value 0x1 was written to register 0x16, read value: 0x   1
    [    3.779480] TI DP83869 300b2400.mdio:03: PHYDEBUG: Value 0x4000 was written to register 0x1F, read value: 0x   0
    [    3.789856] TI DP83869 300b2400.mdio:03: SECOND PHYDEBUG: Value 0x140 was written to register 0x0, read value: 0x 140
    [    3.800665] TI DP83869 300b2400.mdio:03: SECOND PHYDEBUG: Value 0x5008 was written to register 0x10, read value: 0x5008
    [    3.811647] TI DP83869 300b2400.mdio:03: SECOND PHYDEBUG: Value 0x1 was written to register 0x16, read value: 0x   1
    [    3.822371] TI DP83869 300b2400.mdio:03: PHYDEBUG: BMSR Value Is: 0x7949
    

    你建议什么?

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

    写入后、寄存器0x001F 的是值将恢复为默认值。 我将尝试在实验中重新创建您的设置。 我应该能够在11月16日之前回来。

    --

    此致、

    Vikram

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

    您好!

    以下内容对我在实验中很有用:  

    01DF 0040 //启用 RGMII 到铜缆模式
    00FE E720
    0000 0140
    0010 5008.
    0016 0008
    001F 4000

    我必须额外写入01DF、因为默认情况下它显示为0041。  您还在寄存器01DF 中看到0041吗?

    数据表提到了写入00FE,因此我将其保留在 我的设置中,但没有它,我也会看到环回生成链路状态为 HIGH:reg = x794D

    --

    此致、

    Vikram

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

    感谢您的回复。

    我无法写入寄存器0x1df、我收到错误。

    下面是 U-boot 的一个示例:

    # reading register 0x0 - works
    => mii read 0 0x0
    1100
    
    
    # reading register 0x1f - works
    => mii read 0 0x1f
    0000
    
    
    # reading register 0x1df - fails
    => mii read 0 0x1df
    Error reading from the PHY addr=00 reg=df
    
    #using mdio commands:
    
    # reading register 0x0 - works
    => mdio read 0x0
    Reading from bus ethernet@8000000
    PHY at address 0:
    0 - 0x1100
    
    
    
    # reading register 0x1f - works
    => mdio read 0x1f
    Reading from bus ethernet@8000000
    PHY at address 0:
    31 - 0x0
    
    
    
    # reading register 0x1df - fails
    => mdio read 0x1df
    Reading from bus ethernet@8000000
    PHY at address 0:
    Error
    
    
    
    
    

    与 Linux 内核相同、此行 会返回 错误:

    phy_write(phydev, 0x01df, 0x40);

    我还使用了 phy_write_md 函数、它没有返回任何错误、但随后读取了值0

    ret = phy_write_mmd(phydev,0, 0x01df, 0x40);
    
    if(ret) 
    	return ret;
    
    phydev_info(phydev, "PHYDEBUG: Value 0x40 Was written into register 0x1df, read value: 0x%4x\n", phy_read_mmd(phydev,0, 0x1df));
    
    
    

    输出:

    [    3.292681] TI DP83869 8000f00.mdio:00: PHYDEBUG: Value 0x40 Was written into register 0x1df, read value: 0x   0

    我不确定为什么要将0x40写入 OP_MODE_DEDECODE 寄存器

    0x40 -> SGMII 至 Copper

    我需要 RGMII 到 Copper、因此该值应为0 (或者我错了?)、这是默认值(根据 phy_read_md)。

    我也无法写入/读取0xFE (并且无法在数据表的寄存器映射中找到它)

    https://www.ti.com/lit/ds/symlink/dp83869hm.pdf

    => mdio read 0xfe
    Reading from bus ethernet@8000000
    PHY at address 0:
    Error
    

    一般来说、我可以对地址0x1f、地址0x20及 更高的寄存器进行读写操作、这会导致 U-boot 中出现错误。

    有什么想法吗?

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

    寄存器0x01DF = x40将为"RGMII 至铜线"

    2.对大于 x1F 的寄存器地址使用以下命令:  

    MMD "1F"寄存器的写入过程:

    写入 REG<000d>= 0x001F
    写入 REG<000E>=


    写入 REG<000d>= 0x401F
    写入 REG<000E>=

    针对 MMD "1F"寄存器的读取程序:

    写入 REG<000d>= 0x001F
    写入 REG<000E>=


    写入 REG<000d>= 0x401F
    阅读 REG<000E>

    注:要读取/写入 MMD“1”寄存器,请用01替换1F。
    注意:上述写入和读取过程通常用于地址大于0x001F 的寄存器。 但它也可用于一般的任何地址。

    --

    此致、

    Vikram

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

    好的、我发现了这个问题、在读取 BMSR 寄存器之前、似乎需要一些延迟。

     我只需要添加一点延迟。

    有一点问题:

    如果    BMSR 寄存器中的 LINK_STS1位置位、则表明 MAC<->PHY 连接正常?

    我只需要知道连接是否正常、不需要发送数据、并检查我是否接收到与我发送的数据相同的数据。

    感谢您的支持和耐心。

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

    LINK_STS1不指示 MAC-PHY 连接。 它指示电缆侧或成功环回期间的连接状态。 要检查 MAC-PHY 连接、您必须从 MAC 侧发送和接收数据。

    --

    此致、

    Vikram

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

    我能够在2个 PHY 中读取 Link_STS1='1'、第三个 PHY 是'0'。

    这是什么原因? 如何进行调试?

    地址0x0 -> CPSW ->   Link_STS1='1'处的 PHY。 (此 MII 总线中的单个 PHY)

    地址0xF 上的 PHY -> ICSSG1 ->  Link_STS1='1'

    地址0x3上的 PHY -> ICSSG1 ->  Link_STS1='0'(与地址0xF 中的 PHY 相同的 MII 总线)

     

      在 PHY 处于环回模式时,您能否推荐一种 Linux 工具来测试 MAC<->PHY 连接?

    我无法连接回路...

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

    当您说地址为0x3的 PHY 的 LINK_STS1 = 0时、是否在环回情况下如此? 您是否已经通过读回寄存器写入来检查此 PHY 的正确性? 此 PHY 还有什么不同(搭接/配置?)

    MAC <-> PHY 连接通常由基于 MAC 的实用程序检查(MAC 发送的数据与传入数据匹配、而 PHY 处于环回模式)。 我不知道任何特定的工具。

    --

    此致、

    Vikram

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

    您好!

    是的、我将 PHY 设置为环回模式并读取  LINK_STS1位。

    对于2个 PHY、值为1、对于一个 PHY、值为0。

    我确实通过读回来验证所有写入的数据、并且所有写入的数据都被读回、即使在0x3 PHY 中也是如此。

    唯一的区别是地址自举、这是可以的、因为我确实检测了地址0x3中的 PHY。

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

    如果 PHY 的配置相同、并且您能够确认寄存器写入正确、那么我不能认为其中一个 PHY 在环回情况下运行方式不同的逻辑原因。 必须有不同的东西。 您可以检查寄存器 x6E 以查看 PHY 是否在不同模式下捆绑。

    --

    此致、

    Vikram