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.
大家好、我需要在器件树(DT)中配置 DP83826 PHY、才能将 WoL 中断信号用作唤醒源
嵌入式 Linux 系统处于挂起至 RAM 电源模式(存储器状态)。
我看到 TI 开发的 Linux 设备驱动程序支持此功能、但我无法使其正常工作。
这是 DT 中的当前 PHY 节点:Fullscreen1234567891011121314151617&mdio0 {#address-cells = <1>;#size-cells = <0>;dp83826: ethernet-phy@0 {compatible = "ethernet-phy-ieee802.3-c22";reg = <0x0>;interrupt-parent = <&gpio0>;interrupts = <RK_PD3 IRQ_TYPE_EDGE_FALLING>;pinctrl-names = "default";pinctrl-0 = <ð_wake_intn ð_phy_rstn>;reset-assert-us = <1000>;reset-deassert-us = <2000>;reset-gpios = <&gpio0 RK_PD4 GPIO_ACTIVE_LOW>;wakeup-source;};};XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&mdio0 { #address-cells = <1>; #size-cells = <0>; dp83826: ethernet-phy@0 { compatible = "ethernet-phy-ieee802.3-c22"; reg = <0x0>; interrupt-parent = <&gpio0>; interrupts = <RK_PD3 IRQ_TYPE_EDGE_FALLING>; pinctrl-names = "default"; pinctrl-0 = <ð_wake_intn ð_phy_rstn>; reset-assert-us = <1000>; reset-deassert-us = <2000>; reset-gpios = <&gpio0 RK_PD4 GPIO_ACTIVE_LOW>; wakeup-source; }; };
其中 RK_PD3定义为 GPIO。
我可以使用 WoL 数据包以"冻结"电源状态(简单的软件电源状态)唤醒系统、
但这在挂起至 RAM 中不起作用、因为中断引脚不会切换
WoL 数据包时。 这意味着 PHY 会对数据包做出反应、但没有反应
按预期生成中断。 因此、我只需要通过 PHY 正确配置
设备驱动程序、但我的 DT 节点似乎不够。
感谢您发送编修。
如果可能会有所帮助,我使用 MII-diag 获取以下报告( mii-diag -v):
mii-diag.c:v2.11 3/21/2005 Donald Becker (becker@scyld.com) www.scyld.com/.../index.html Using the default interface 'eth0'. Using the new SIOCGMIIPHY value on PHY 0 (BMCR 0x3100). The autonegotiated capability is 01e0. The autonegotiated media type is 100baseTx-FD. Basic mode control register 0x3100: Auto-negotiation enabled. You have link beat, and everything is working OK. This transceiver is capable of 100baseTx-FD 100baseTx 10baseT-FD 10baseT. Able to perform Auto-negotiation, negotiation complete. Your link partner advertised c1e1: 100baseTx-FD 100baseTx 10baseT-FD 10baseT. End of basic transceiver information. libmii.c:v2.11 2/28/2005 Donald Becker (becker@scyld.com) www.scyld.com/.../index.html MII PHY #0 transceiver registers: 3100 786d 2000 a131 0de1 c1e1 000d 2001 0000 0000 0100 0000 0000 4007 0000 0000 0215 010b 00fc 00f7 0000 0000 0100 0065 0480 ec00 0000 007d 05ee 0000 0102 0000. Basic mode control register 0x3100: Auto-negotiation enabled. Basic mode status register 0x786d ... 786d. Link status: established. Capable of 100baseTx-FD 100baseTx 10baseT-FD 10baseT. Able to perform Auto-negotiation, negotiation complete. Vendor ID is 08:00:28:--:--:--, model 19 rev. 1. No specific information is known about this transceiver type. I'm advertising 0de1: Flow-control 100baseTx-FD 100baseTx 10baseT-FD 10baseT Advertising no additional info pages. IEEE 802.3 CSMA/CD protocol. Link partner capability is c1e1: 100baseTx-FD 100baseTx 10baseT-FD 10baseT. Negotiation completed.
编辑: 一些额外信息... 如果需要、我可以使用 MDIO_TOOL 来读取和写入单个 MII 寄存器。 我使用该工具设置寄存器0x11 (PHYSCR)的位2 (测试中断)、并且根据需要将中断引脚设置为0。 这确认了硬件没有阻止引脚切换、因此必须存在配置问题。
Javier、您好!
让我向团队核实这一点。 我们将在本周中与您联系。
谢谢。
大卫
感谢您的回复、有没有这方面的消息?
为了提高速度、我尝试通过 MDIO_TOOL 手动设置 WoL/中断寄存器、直到我在 DT 中获得了合适的解决方案。 这只是一个检查系统是否根据需要对中断做出反应的实验、但最终解决方案不应手动设置寄存器、而是仅依赖于 Linux 器件驱动程序和 DT 中的正确定义。
我已经注意到、如果我尝试将 RXFCFG1寄存器(0x4A0)的位0 (WoL 魔术包使能)置位、当我再次读取该寄存器时、它的值仍然为0、这样在魔术包到达时不会产生中断。 正如我说过的、在"冻结"状态下、系统会在我发送 Magic Packet 时唤醒、但我想这是因为 GMAC 会对其作出反应、而不是 PHY 本身。
这可能与真正的问题有关? 当我在启动后立即读取该寄存器时(并保持 DT 为0x3100、根据数据表、这看起来不正确。
Javier、您好!
我不熟悉冻结和挂起至 RAM 电源模式之间的区别。 您可以向 MAC 团队进行核实。
您是否在寄存器0x11的 bit [1]中启用了中断、并在 bit [0]中将 INT/PWDN 引脚作为中断? 也应该在寄存器0x13 bit [1]中启用 WOL 数据包中断。
寄存器0x4A1包含魔术包状态、不是0x4A0。 发送魔法包后、请读取0x4A1的第[0]位,并告知我结果。
谢谢。
大卫
正如我说过的、我将使用 MDIO-TOOL 来读取您提到的寄存器、但我刚刚意识到、只能读取前32个寄存器、并且0x1F 之外的任何地址都将移动到该范围、例如0x20 = 0x00、0x21 = 0x01等 因此、我从0x4A0寄存器读取了一些奇怪的值、当我尝试读取0x4A1时也会发生同样的情况、该值返回0x786D ->、即寄存器0x01。 我看了一下代码、该工具本身不是瓶颈、因为它没有任何地址限制。 我还对 MII-diag 进行了一些黑客攻击、以便使用-v 标志同时比较和读取所有 PHY 寄存器、并出现同样的问题。 最初 MII-diag -v 仅读取前32个寄存器、这可能不是巧合。。 您使用什么工具来读取0x1F 以外的寄存器? 设备驱动程序或 API 中似乎存在某种限制...
Javier、您好!
有关访问扩展寄存器空间(>0x1F)的说明,请参阅数据表的第9.3.11.1节。 请告诉我您何时能够读取/写入寄存器0x4A0、0x4A1等
谢谢。
大卫
我可以按如下方式读取寄存器0x4A1:
mdio-tool w eth0 0x0D 0x001F -> the value written to 0x0E (ADDAR register) is an address mdio-tool w eth0 0x0E 0x04A1 -> Register 0x04A1 mdio-tool w eth0 0x0D 0x401F -> the value written to 0x0E is data mdio-tool r eth0 0x0E -> read value from 0x04A1: 0x1000
我读取的值似乎正确、因为0x1000是寄存器复位值。 但是、如果我发送魔术包、我仍然可以读取相同的值、并且位0不会切换。配置的其余部分似乎是正确的:
mdio-tool r eth0 0x11: 0x010B mdio-tool r eth0 0x13: 0x00F7
而且、当 Magic Packet 可用时(无深度待机模式)、MAC 会接收并确认它。 我知道这是因为我可以通过这种方式唤醒系统。 什么可能导致 PHY 不响应魔术包? 是否有任何限制、例如它必须是 UDP/TCP? 顺便说一下、我正在使用 WakeOnLAN 发送魔术包。
编辑:我也尝试过 etherwake 但我得到了相同的结果。
Javier、您好!
此处缺失部分是必须在 RXFPMD 寄存器(0x4A2 - 0x4A4)中对目标地址进行编程。 请尝试以下操作、让我知道结果。
谢谢。
大卫