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.

[参考译文] DP8.3867万IR:PHY控制寄存器(PHYCR)中的保留位问题- Linux驱动程序

Guru**** 2479595 points


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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/571313/dp83867ir-problem-with-reserved-bits-in-phy-control-register-phycr---linux-driver

部件号:DP8.3867万IR
主题中讨论的其他部件: DP8.3867万E

尊敬的各位:


我正在为DP8.3867万 PHY IC开发Linux驱动程序。 我使用的是4.9 vanilla内核。

我的主板需要进行一次调整:

通过初始引导设置,“端口镜像”功能已启用:

reg:0x31 (CFG4)- port_mirror_EN位(0)设置为1

要禁用它,我将此寄存器值从0x10b1更改为0x10b0。

Linux驱动程序出现问题:

dp8.3867万_phy_reset()  函数位于./drivers/net/ph/dp8.3867万.c

它在控制寄存器(CTRL - 0x001F)上执行SW_RESET (位15)。 此类复位执行完全复位(包括寄存器)。

问题由此开始:

 dp8.3867万_config_init()函数的默认初始化代码将保留PHYCR寄存器(0x10),其值为0x5848 (重置后的默认值)。

通过此设置,我可以看到链路已建立,但PHY无法正常工作(无数据传输-已通过Wireshark检查)。

要使其正常工作,请将0x4040值写入PHYCR (0x10)寄存器。

为什么我需要这样做?

以下内容的含义是什么:

第3位-我必须清楚地说明

——第11位,12位——我必须清楚地说明

根据IC数据集(SNLS484D–2015年2月–2016年7月修订),这些字段将被保留,RO和写入将被忽略。

DP8.3867万寄存器转储:

PHY_PRINT_STATUS
REG 0x0:0x1140
REG 0x1:0x796d.
REG 0x2:0x2000
REG 0x3:0xa231
REG 0x4:0x1e1
REG 0x5:0xc1e1
REG 0x6:0x6f
REG 0x7:0x2001
REG 0x8:0x6801
REG 0x9:0x300
REG 0xA:0x3800
REG 0xb:0x0
reg 0xc:0x0
REG 0xd:0x401f
reg 0xe:0x10b0
REG 0xF:0x3000
REG 0x10:0x4040
reg 0x11:0xbc02
REG 0x12:0x0
REG 0x13:0x1c40
REG 0x14:0x29c7
REG 0x15:0x0
REG 0x16:0x0
REG 0x17:0x40
REG 0x18:0x6150
REG 0x19:0x4040
REG 0x1a:0x2
REG 0x1b:0x0
reg 0x1c:0x0
reg 0x1d:0x0
REG 0x1E:0x2
REG 0x1f:0x0
PHY_regs_dump:扩展寄存器
EXT REG 0x31:0x10b0
EXT REG 0x32:0xd3
EXT REG 0x33:0x0
EXT REG 0x6e:0x8800
EXT REG 0x6f:0x30
EXT REG 0x86:0x37

重置前和重置后之间的区别仅与有区别  

0x10为0x4040,重置前(从u-boot设置)

和 0x5848之后(执行寄存器重置时)

有人能解释为什么需要清除保留位吗?

致以诚挚的问候,在此提前感谢,

Łukasz

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

    DP8.3867万IR设备的寄存器0x10的默认设置应为0x5048。

    您的问题是由寄存器0x10的位[11]设置引起的。 这是一个保留字段,不应由驱动程序或用户设置,应清除。 您是否正确实施了驱动程序?

    确保您声明您正在使用的PHY处于RGMII模式。

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

    我正在使用v 4.9 Linux内核中已有的驱动程序。 我确实将接口设置为RGMII-ID。

    我将仔细检查此项,但执行重置后似乎设置了0x5848 (在DP8.3867万_CTRL - 0x001F中设置DP8.3867万_SW_RESET -位15)。

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

    我已仔细检查代码:


    SW_RESET之前

    注册 0x10:0x4040
    EXT REG 0x31:0x10b0
    SW_RESET之后

    注册 0x10:0x5848
    EXT REG 0x31:0x10b1

    上述检查是使用以下代码(v.Linux 4.9 SHA1: 6.9973万b830859bc6529a7a0468ba0d80ee5117826 -./drivers/net/dp83867.c)83.0859万 -./drivers/net/dp83867.c)完成6529完成的0468的:511.7826万:</s>8.3867万


    静态int dp8.3867万_phy_reset (结构phy_device *phydev)

    Int错误;

    PHY_regs_dump (phydev,"SW_RESET\n"之前);
    #IF 1.
    ERR = phy_write (phydev,DP8.3867万_CTRL,DP8.3867万_SW_RESET);
    如果(错误< 0)
    返回错误;
    #endif
    phy_regs_dump (phydev,"sw_reset后\n");
    返回dp8.3867万_config_init(pydev);
    }

    此处sw_reset是在0x1F寄存器(CTRL)中设置位15 -“执行完全重置,包括寄存器。”

    因此,在0x10的重置值为0x5848后,不是您所期望的0x5048。 重置后还会启用"端口镜像"功能。

    我能否提供更多转储/信息?
    您是否知道IC为什么如此工作?

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

    您好 Łukasz:

    执行sw_reset将重新加载您通过束带电阻器选择的束带选项。 您说过您已绑带镜像启用。 您是否在LED_0引脚上使用了上拉手提带至模式4?

    在DP8.3867万IR数据表中,Mirror Enable (镜像启用)条带的模式4为N/A (不适用),这意味着您不应使用该模式。 如果您绑带至模式4,则表示启用寄存器0x10中的bit[11],这会导致错误。

    请通过读取寄存器0x6e来验证此情况。 寄存器0x6e保持由带式电阻器选择的选项。 如果在寄存器0x6e中设置了bit[11],则每次执行重置时,bit[11]将在寄存器0x10中设置,您将丢失RGMII通信。

    此致,

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

    1.如果我错了,请更正我,但在sw_reset后,不会重新评估腕带选项(从HW),但在通电时读取的值将被放入寄存器?

    2.我们的设计将+3V3电源连接到电阻器。 然后,电阻器连接到LED,LED连接到LED_0引脚(47)。 是的,根据SNLS484D中的图23,我们有模式4..........

    3.现在的问题-见表6。 - 4级手提带引脚-镜像启用的默认状态为0。 我们需要强制模式3启用它(根据图23,我们只能设置模式1或模式4)。 它是如何工作的? 我确实有模式4 (N/A)的连接,这显然会导致启用此功能。 您能澄清吗?

    4.您能否揭示寄存器0x10中的Bit[11]的“真实”用途?

    5.寄存器输出包括0x006E (LATE_STS1):

    注册 0x10:0x4040
    EXT REG 0x31:0x10b0
    EXT REG 0x6e:0x8800
    RET:0
    SW_RESET之后

    注册 0x10:0x5848
    EXT REG 0x31:0x10b1
    EXT REG 0x6e:0x8800

    因此,位11设置为0x006E。

    6.您能否解释为什么设置在0x0010寄存器(PHYCR)上的Bit[11]会导致RGMII通信丢失? 为什么我必须将其设置回0以重新获得RGMII连接? 我之所以这样问,是因为我必须为Linux内核社区提供这种"quirk"修补程序。

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

    您好 Łukasz:

    1.如果我错了,请更正我,但在sw_reset后,不会重新评估腕带选项(从HW),但在通电时读取的值将被放入寄存器?

    [Rob先生]这是正确的。  在通电或重置脉冲期间,将在HW级别采样束带,然后将其存储到寄存器0x6e中。  然后,带子填充它们对应的控制位。  在sw_reset期间,不会在HW级别重新评估带值,但会重置所有寄存器,并使用0x6e中的带值再次填充控制位。

    2.我们的设计将+3V3电源连接到电阻器。 然后,电阻器连接到LED,LED连接到LED_0引脚(47)。 是的,根据SNLS484D中的图23,我们有模式4..........

    [Rob] 通过使用模式4,您将启用镜像模式,并且您将在设备中启用保留功能。

    3.现在的问题-见表6。 - 4级手提带引脚-镜像启用的默认状态为0。 我们需要强制模式3启用它(根据图23,我们只能设置模式1或模式4)。 它是如何工作的? 我确实有模式4 (N/A)的连接,这显然会导致启用此功能。 您能澄清吗?

    [Rob]图23中的示例显示了使用绑带在LED上设置模式1和模式4。  要设置模式2或模式3,您需要一个类似于DP8.3867万E客户EVM中的电路。

    4.您能否揭示寄存器0x10中的Bit[11]的“真实”用途?

    [Rob] bit[11]可控制设备内部的隐藏测试模式。

    5. 这种行为是意料之中的。

    6.您能否解释为什么设置在0x0010寄存器(PHYCR)上的Bit[11]会导致RGMII通信丢失? 为什么我必须将其设置回0以重新获得RGMII连接? 我之所以这样问,是因为我必须为Linux内核社区提供这种"quirk"修补程序。

    [Rob (Rob)] 模式4手提带正在激活测试模式,该模式将接口从RGMII中取出。  系统必须清除bit[11]才能将设备放回RGMII。  因为DS中规定不应使用手提带模式4,所以这不是真正的"怪癖"。  

    此致,

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

    Rob,您好!

    我们已将PHY连接至AM57xx。

    因此,RX_CTRL连接到CPU,并且CPU在复位释放时激活了内部PD。 这也可能影响MODE1中的AutoNeg Disable寄存器,这也是不适用的,不允许。

    如果PHY检测到MODE1,是否还启用了隐藏功能?

    应该如何处理?

    此致

    丹尼尔

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

    是的,这是正确的。 RX_CTRL引脚上的模式1和模式2不适用,如果使用,则需要寄存器解决方案。

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

    Rob,您好!

    显然,DP8.3867万在模式3中配置自己,而不使用这些绑带引脚,因为0x006E寄存器(Letap_STS1)值为0x8800。

    如果"AutoNeg"会受到影响,那么我们将在此寄存器中设置位7。

    此致,

    Łukasz