linux gpio-leds 作为硬盘指示灯

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"

相关推荐