Linux下LED灯的控制

2020-08-19T18:13:00

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,就应该很清楚这两个概念的区别)

当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »