linux gpio-leds 作为硬盘指示灯

参考:
https://www.kernel.org/doc/Documentation/devicetree/bindings/leds/leds-gpio.txt
https://linuxreviews.org/HOWTO_Control_LED_Lights
https://www.cnblogs.com/arnoldlu/p/17909607.html

LEDs connected to GPIO lines

Required properties:

  • compatible : should be "gpio-leds".

配置对应的gpio和default-trigger, 就可以实现不同事件触发led发光
比如下面是 disk-activity, 代表有磁盘活动,led就会亮

       leds: leds {
                compatible = "gpio-leds";
                status = "okay";
                hdd1 {
                        label = "disk1_act_led";
                        gpios = <&gpio2 RK_PB5 GPIO_ACTIVE_HIGH>;
                        linux,default-trigger = "disk-activity";
                };
                hdd2 {
                        label = "disk2_act_led";
                        gpios = <&gpio2 RK_PB6 GPIO_ACTIVE_HIGH>;
                        linux,default-trigger = "disk-activity";
                };
        };



root@linaro-alip:/sys/class/leds# ls
disk1_act_led  disk2_act_led  mmc0::  work
root@linaro-alip:/sys/class/leds# find
.
./work
./disk2_act_led
./disk1_act_led
./mmc0::
root@linaro-alip:/sys/class/leds# cd disk1_act_led
root@linaro-alip:/sys/class/leds/disk1_act_led# ls
brightness  device  max_brightness  power  subsystem  trigger  uevent
root@linaro-alip:/sys/class/leds/disk1_act_led# find
.
./uevent
./brightness
./power
./power/runtime_active_time
./power/runtime_active_kids
./power/runtime_usage
./power/runtime_status
./power/autosuspend_delay_ms
./power/async
./power/runtime_suspended_time
./power/runtime_enabled
./power/control
./device
./trigger
./subsystem
./max_brightness
root@linaro-alip:/sys/class/leds/disk1_act_led# cat trigger
none rfkill-any rfkill-none kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock mmc3 mmc1 [disk-activity] disk-read disk-write ide-disk heartbeat mmc0

您可以通过向 LED 灯的 trigger 文件发出有效的指令来更改 LED 灯的"触发器"。例如,

echo 'disk-activity' > /sys/class/leds/phy0-led/trigger

GPIO LED 硬盘指示灯设置

linux gpio-leds 作为硬盘指示灯

Response:

在 Linux 中,gpio-leds 是一个平台设备驱动(位于 /drivers/leds/leds-gpio.c),它允许你通过 GPIO 控制 LED 的开关。你可以将 LED 用作各种用途,例如表示电源状态、网络活动、**硬盘读写指示灯(HDD activity LED)**等。

下面是如何将 GPIO LED 设置为 硬盘指示灯(HDD activity LED) 的完整思路和操作步骤:


🧠 核心思路

Linux 内核中的 LED 子系统支持将 LED 与各种 触发器(trigger) 绑定。我们可以将一个 GPIO 控制的 LED 绑定到 disk-activity 类型的 trigger,比如 mmc0sdanvme0n1 的读写状态。


✅ 前提条件

  1. 已在设备树(或 ACPI、平台文件)中正确配置了 gpio-leds
  2. LED 可以通过 /sys/class/leds/ 访问,比如 /sys/class/leds/status:hdd/
  3. LED 使用的是输出 GPIO(可以亮灭)。

📝 1. 配置设备树(Device Tree)

你需要在设备树中增加类似下面的配置(假设你使用的是 /dev/sda 对应的 GPIO 控制):

leds {
    compatible = "gpio-leds";

    hdd_led: hdd {
        label = "status:hdd";   // 重要:用于触发器命名
        gpios = <&gpio1 5 GPIO_ACTIVE_LOW>;  // 替换为你的 GPIO 控制器和引脚号
        default-state = "off";
        linux,default-trigger = "none";  // 我们稍后手动设置为 disk trigger
    };
};

🔧 2. 引导系统后,确认 LED 是否可控

查看 LED 是否成功注册:

ls /sys/class/leds/

你应该能看到类似:

status:hdd/

测试一下手动控制 LED:

# 打开 LED
echo 1 > /sys/class/leds/status:hdd/brightness

# 关闭 LED
echo 0 > /sys/class/leds/status:hdd/brightness

如果 LED 正常亮灭,说明 GPIO 配置成功 ✅。


🌟 3. 设置为硬盘读写触发器

列出支持的触发器:

cat /sys/class/leds/status\:hdd/trigger

你会看到类似:

[none] timer heartbeat disk-activity disk-read disk-write ...

其中可能包括:

  • disk-activity:读或写都会闪烁
  • disk-read:只有读操作闪烁
  • disk-write:只有写操作闪烁

设置为硬盘读写:

echo disk-activity > /sys/class/leds/status\:hdd/trigger

此时,只要系统对硬盘进行读写操作,LED 就会自动闪烁了。


💡 注意事项

多块磁盘怎么办?

你可以选择绑定到特定磁盘(根据触发器名字区分):

echo disk-activity:mmc0 > /sys/class/leds/status\:hdd/trigger
echo disk-activity:nvme0n1 > /sys/class/leds/status\:hdd/trigger

你可以通过以下命令找到你磁盘的设备名:

ls /sys/class/block/

🛠️ 启动时自动配置(可选)

为了每次开机自动设置 LED 触发器,可以添加一段 udev 规则:

创建 udev 规则文件:

sudo nano /etc/udev/rules.d/99-hdd-led.rules

内容如下:

SUBSYSTEM=="leds", KERNEL=="status:hdd", ATTR{trigger}="disk-activity"

保存后运行:

sudo udevadm control --reload
sudo udevadm trigger

📚 参考资料

  • /drivers/leds/trigger/ledtrig-disk.c:硬盘触发器实现
  • /drivers/leds/leds-gpio.c:GPIO 控制实现
  • 官方文档: Documentation/leds/leds-class.txt

如果你希望我帮你写出一个完整的设备树 LED 配置,或者你想通过 C 程序 / Shell 脚本控制这个 LED,也欢迎告诉我 😄

加油!你正在用 Linux 玩出嵌入式高手的感觉!🌟

Prompt:

SUBSYSTEM\"leds", KERNEL"status:hdd", ATTR{trigger}="disk-activity"

这个规则是什么意思

Response:

你问的这句 udev 规则:

SUBSYSTEM=="leds", KERNEL=="status:hdd", ATTR{trigger}="disk-activity"

我们来一行一行解释清楚它的含义 👇


✨ 这是在做什么?

它的作用是:
当系统检测到一个名字为 status:hdd 的 LED 设备时,自动将它的触发器设置为 disk-activity,也就是硬盘读写时自动闪烁。


🔍 逐部分解释

SUBSYSTEM=="leds"

只匹配 leds 子系统的设备。
也就是说,这条规则只会对 /sys/class/leds/ 下的设备生效。


KERNEL=="status:hdd"

匹配设备名为 status:hdd 的 LED。
这对应你在设备树(或系统)中定义的 LED 名称(即 label = "status:hdd")。
你也可以写成其他名字,只要和 /sys/class/leds/ 下的目录一致。


ATTR{trigger}="disk-activity"

表示将这个 LED 的 trigger 属性设置为 "disk-activity"
这个等价于你在终端中手动执行:

echo disk-activity > /sys/class/leds/status:hdd/trigger

🧠 udev 是干什么的?

udev 是 Linux 的设备管理器,用来在设备插入、识别、注册时执行一些规则和自动化操作。

这条规则的作用是:在系统启动过程中、LED 设备刚刚被创建时就立即设置好 trigger,不需要手动操作


✅ 总结(通俗理解)

这句话就像是在对 Linux 说:

“嘿!以后每当系统发现一个叫 status:hdd 的 LED 时,记得把它的工作模式设置成 disk-activity 哦,这样它就会随硬盘读写而闪烁了~!”


如果你希望它对多个 LED 生效,比如还有一个叫 status:ssd,你可以再加一行:

SUBSYSTEM=="leds", KERNEL=="status:ssd", ATTR{trigger}="disk-activity:nvme0n1"

posted @ 2025-08-06 16:24  katago  阅读(74)  评论(0)    收藏  举报