netdev 触发源的设备树配置,以根据 link-status 控制 LED
device-tree config for netdev trigger-sources to control LED based on link-status
我想达到什么目的?
一个 GPIO 连接的 LED 应该是
- ON 如果接口的 link 是 UP 并且
- 如果 link 关闭。
通过设备树配置此逻辑。
现状:使用额外脚本实现的功能
这可以通过 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.org
或 devicetree@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 之间没有令人不安的大延迟。
我想达到什么目的?
一个 GPIO 连接的 LED 应该是
- ON 如果接口的 link 是 UP 并且
- 如果 link 关闭。
通过设备树配置此逻辑。
现状:使用额外脚本实现的功能
这可以通过 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.org
或 devicetree@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 之间没有令人不安的大延迟。