@typeof

Linux下LED灯的控制

LED 灯 sysfs 接口简介

Linux 为用户态程序控制 LED 灯提供了位于 /sys/class/leds 的接口,可通过读取文件获取 LED 灯的状态,通过写文件改变状态。通过这个接口,我们可以比较简单地操纵 LED 灯。

文件夹结构

博主电脑上 /sys/class/leds 文件夹中的内容:

input0::capslock  input0::scrolllock  platform::micmute  tpacpi::power    tpacpi::thinklight
input0::numlock   mmc0::              platform::mute     tpacpi::standby  tpacpi::thinkvantage

在这个文件夹中,每个子文件夹表示一个 LED 灯(未必实际存在,尤其是在电脑上),例如 ThinkLight(键盘灯,位于 ThinkPad 屏幕上边框,从上方照亮键盘)。
总的来说,命名规则如下:
[设备名]:[颜色]:[名称]
并非三个参数都存在。

一些设备名:

子文件夹中有如下内容:

brightness  device  max_brightness  power  subsystem  trigger  uevent

其中:

$ cat /sys/class/leds/tpacpi::power/max_brightness
255

$ cat /sys/class/leds/tpacpi::power/brightness
255

# echo 128 > /sys/class/leds/tpacpi::power/brightness

触发器

触发器在满足一定条件时会点亮或熄灭 LED 灯。

触发器大致分类:

查看和设置触发器

查看:读取 LED 灯目录下的 trigger 文件。
例如:

$ cat /sys/class/leds/tpacpi::power/trigger
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 disk-activity disk-read disk-write ide-disk mtd nand-disk cpu cpu0 cpu1 cpu2 cpu3 panic AC-online rfkill-any rfkill-none audio-mute audio-micmute usb-gadget usb-host BAT0-charging-or-full BAT0-charging BAT0-full BAT0-charging-blink-full-solid rfkill0 mmc0 phy0rx phy0tx phy0assoc [phy0radio] rfkill1 rfkill4 r8169-400:00:link r8169-400:00:1Gbps r8169-400:00:100Mbps r8169-400:00:10Mbps backlight heartbeat timer transient oneshot

输出为所有可用的触发器清单,其中,被方括号[]括起的触发器为正在使用的触发器。

更改:
向相应的 trigger 文件中写入触发器名称。
例:

# echo disk-activity > /sys/class/leds/tpacpi::power/trigger

注意:可能需要 root 权限。

none 触发器

这个触发器没有什么功能。

键盘灯:kbd-

根据键盘功能键状态控制 LED 灯。
常用触发器名称:

磁盘活动:disk-

磁盘发生活动时, LED 灯点亮。在很多笔记本没有硬盘灯的情况下,可模拟传统硬盘灯(当然,不如从芯片组引出的硬盘灯靠谱)
触发器名称:

ide-disk:与 IDE 硬盘有关,在现代计算机上没有用处。

CPU 状态:cpu(全系统 CPU)cpu[n](相应的 CPU 线程,从 0 开始技术)

当 CPU 启动时,点亮灯光;CPU 关闭/休眠 时,关闭灯光。

panic

当内核 panic 时,闪烁灯光(几年前内核 panic 时默认如此)。

声音:audio-

触发器名称:

USB

触发器名称:

电源

触发器名称:

无线电

触发器名称:

有线网卡

触发器名称:

无线网卡

触发器名称:

心跳:heartbeat

内核模块:ledtrig-heartbeat
根据系统一分钟负载(load)闪烁灯光。负载越大,灯光闪烁的间隔时间越短。负载为 0 时间隔 1260 毫秒,为 1 时间隔 860 毫秒,为 5 时间隔 510 毫秒,当负载趋向无穷大时,间隔趋近 300 毫秒。

定时器:timer

内核模块:ledtrig-timer
与上面其它触发器都不同,此触发器有额外参数。在 LED 灯目录中会多出两个文件:

一次性触发:oneshot

内核模块:ledtrig-oneshot
额外参数:除了 timer 的两个参数以外,还有 shot。向 shot 文件执行写操作可触发 LED 灯点亮。触发时,先关闭 LED 灯 delay_off 中的时间,再点亮 delay_on 中的时间。

其余的触发器在电脑等设备上没有太大意义,主要用于嵌入式系统开发。

触发机制

这些触发器大多为边缘触发(Edge Trigger),即状态的变化使 LED 灯点亮或熄灭,而非水平触发(事件本身引起灯的点亮或熄灭)。(如果理解 epoll 等事件驱动 IO,就应该很清楚这两个概念的区别)

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »