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,比如 mmc0、sda、nvme0n1 的读写状态。
✅ 前提条件
- 已在设备树(或 ACPI、平台文件)中正确配置了
gpio-leds。 - LED 可以通过
/sys/class/leds/访问,比如/sys/class/leds/status:hdd/。 - 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"

浙公网安备 33010602011771号