netdev 触发源的设备树配置,以根据 link-status 控制 LED

device-tree config for netdev trigger-sources to control LED based on link-status

我想达到什么目的?

一个 GPIO 连接的 LED 应该是

通过设备树配置此逻辑。

现状:使用额外脚本实现的功能

这可以通过 Kconfig 的 CONFIG_LEDS_TRIGGER_NETDEV=y、DTS 条目和 用户空间中的一个小脚本。

leds {
        compatible = "gpio-leds";
        eth1_link {
                gpios = <&pioD 9 GPIO_ACTIVE_LOW>;
                default-state = "off";
                linux,default-trigger = "netdev";
        };
};


echo eth1 > /sys/class/leds/eth1_link/device_name
echo 1 > /sys/class/leds/eth1_link/link

问题:这不是已经可以通过 DTS 实现了吗?

来自 Documentation/devicetree/bindings/leds/common.txt 的文档建议 这应该已经可用,但我找不到一个有效的例子,并且 到目前为止,我尝试过的方法没有用。

* Trigger source providers

Each trigger source should be represented by a device tree node. It may be e.g.
a USB port or an Ethernet device.

我尝试添加 trigger-sources = <&macb1>; 但没有成功。 (macb1 因为我的主板配置 arch/arm/boot/dts/sama5d3_emac.dtsi

作为内核新手,我问自己在内核开发领域的行动是什么?

将此类问题发送给 linux-leds@vger.kernel.orgdevicetree@vger.kernel.org 是要做的事情还是直接联系某些维护者?

===

UPDATE-1

我缺少 macb1 节点中的一个 PHY 节点。我重新尝试了 phy 节点的 phandle 但还没有成功。 (但现在选择了匹配的驱动程序,而不是通用驱动程序。)

我会进一步尝试。

===

更新 2

使用 link from 0audriy 我可以或多或少地回溯到 phy 注册的地方:

phylink_of_phy_connect
  of_phy_attach
    phy_attach_direct
      phy_led_triggers_register
        phy_led_trigger_register
          led_trigger_register

这里有 3 种代码尝试解析 phy 节点的方法:

    phy_node = of_parse_phandle(dn, "phy-handle", 0);
    if (!phy_node)
        phy_node = of_parse_phandle(dn, "phy", 0);
    if (!phy_node)
        phy_node = of_parse_phandle(dn, "phy-device", 0);

所以我添加了phy-handle = <&phywan>;属性。 仍然没有成功:/

我想对于 micrel,ksz8081 这条路甚至都没有走。

也许需要porting from PHYLIB to PHYLINK...

(我很遗憾的另一个解决方案是扩展 micrel.c 驱动程序,以便可以单独打开基于 link 的 IRQ 并根据该中断控制 LED... )

最后:

最后一次在 xconfig 中搜索 'phy' 显示了正确的设置:CONFIG_LED_TRIGGER_PHY=y

因此,各种触发选项被添加到 led:

cat /sys/class/leds/eth1_link/trigger
none fixed-0:00:link fixed-0:00:100Mbps [f802c000.ethernet-ffffffff:00:link] f802c000.ethernet-ffffffff:00:100Mbps f802c000.ethernet-ffffffff:00:10Mbps timer heartbeat gpio netdev dsa-0.0:00:link dsa-0.0:00:100Mbps dsa-0.0:00:10Mbps dsa-0.0:01:link dsa-0.0:01:100Mbps dsa-0.0:01:10Mbps

并带有设备树条目:

leds {
        compatible = "gpio-leds";
        eth1_link {
                gpios = <&pioD 9 GPIO_ACTIVE_LOW>;
                default-state = "off";
                linux,default-trigger = "f802c000.ethernet-ffffffff:00:link";
        };
};

完全可以配置我想要的逻辑,无需任何 user-space 脚本。 (和内核源更改。)

这可能只是我的看法,但我认为基于“netdev”的解决方案也较慢。现在 ip link set down/up dev X 软件和硬件控制的 LED 之间没有令人不安的大延迟。