Linux下LED灯的控制
August 19, 2020 默认分类
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 屏幕上边框,从上方照亮键盘)。
总的来说,命名规则如下:[设备名]:[颜色]:[名称]
并非三个参数都存在。
一些设备名:
input
:键盘mmc
:(多半是)读卡器。(读卡器在 Linux 中作为 mmc 处理)platform
:平台tpacpi
:ThinkPad 专用,通过 ACPI 操纵 LED 灯- ……
子文件夹中有如下内容:
brightness device max_brightness power subsystem trigger uevent
其中:
brightness
:LED 灯的亮度。读取获得灯的亮度,写入数字改变亮度。max_brightness
:LED 灯的最大亮度。trigger
:触发器,有条件地点亮、熄灭 LED 灯。读取获得触发器状态,写入触发器名称改变正在使用的触发器
例:
$ 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 灯。
触发器大致分类:
- 键盘灯
- 磁盘活动
- CPU 活动
- rfkill(关闭无线电)
- 电源
- 声音
- 网络
- 定时器类
查看和设置触发器
查看:读取 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 灯。
常用触发器名称:
kbd-capslock
kbd-numlock
kbd-scrolllock
其它触发器对应的功能很少见,(注:kanalock
用于日语键盘)
磁盘活动:disk-
磁盘发生活动时, LED 灯点亮。在很多笔记本没有硬盘灯的情况下,可模拟传统硬盘灯(当然,不如从芯片组引出的硬盘灯靠谱)
触发器名称:
disk-activity
:磁盘发生读写时点亮灯光disk-read
:读取时亮灯disk-write
:写入时亮灯mmc[n]
:MMC(包括 eMMC、存储卡、读卡器)活动时亮灯nand-disk
:NAND 闪存活动时亮灯
ide-disk
:与 IDE 硬盘有关,在现代计算机上没有用处。
CPU 状态:cpu
(全系统 CPU)cpu[n]
(相应的 CPU 线程,从 0 开始技术)
当 CPU 启动时,点亮灯光;CPU 关闭/休眠 时,关闭灯光。
panic
当内核 panic 时,闪烁灯光(几年前内核 panic 时默认如此)。
声音:audio-
触发器名称:
audio-mute
:静音时点亮 LED 灯audio-micmute
:麦克风静音时点亮 LED 灯
USB
触发器名称:
usb-host
:作为 USB 主机时点亮灯光usb-gadget
:作为 USB 外设时点亮灯光(在电脑上没什么用)
电源
触发器名称:
AC-online
:电源适配器插入时点亮 LED 灯BAT[n]-charging
:第 n 号(从 0 开始计数)电池充电时点亮 LED 灯BAT[n]-full
:电池满电时点亮 LED 灯BAT[n]-charging-or-full
:电池充电或满电时点亮 LED 灯BAT[n]-charging-blink-full-solid
:电池充电时 LED 灯闪烁,满电时 LED 灯常亮
无线电
触发器名称:
rfkill[n]
:当对应的无线电设备被禁用时,点亮 LED 灯。\
可以使用rfkill
命令查看和设置无线电设备的禁用状态。
有线网卡
触发器名称:
[名称]:link
:该网卡的接口已连接时亮灯[名称]:[速率]
:当网口速率为指定速率(如 10Mbps,100Mbps,1Gbps)时,点亮 LED 灯。
无线网卡
触发器名称:
phy[n]rx
:无线网卡接收数据时点亮 LED 灯phy[n]tx
:无线网卡发送数据时点亮 LED 灯phy[n]assoc
:无线网卡关联(associate)至某个无线网络时点亮 LED 灯phy[n]radio
:无线网卡接口启用时点亮 LED 灯
心跳:heartbeat
内核模块:ledtrig-heartbeat
根据系统一分钟负载(load)闪烁灯光。负载越大,灯光闪烁的间隔时间越短。负载为 0 时间隔 1260 毫秒,为 1 时间隔 860 毫秒,为 5 时间隔 510 毫秒,当负载趋向无穷大时,间隔趋近 300 毫秒。
定时器:timer
内核模块:ledtrig-timer
与上面其它触发器都不同,此触发器有额外参数。在 LED 灯目录中会多出两个文件:
delay_on
:点亮的时间delay_off
:熄灭的时间
向这两个文件写入时间(单位为毫秒)设置相应时间。
一次性触发:oneshot
内核模块:ledtrig-oneshot
额外参数:除了 timer
的两个参数以外,还有 shot
。向 shot
文件执行写操作可触发 LED 灯点亮。触发时,先关闭 LED 灯 delay_off
中的时间,再点亮 delay_on
中的时间。
其余的触发器在电脑等设备上没有太大意义,主要用于嵌入式系统开发。
触发机制
这些触发器大多为边缘触发(Edge Trigger),即状态的变化使 LED 灯点亮或熄灭,而非水平触发(事件本身引起灯的点亮或熄灭)。(如果理解 epoll 等事件驱动 IO,就应该很清楚这两个概念的区别)