Linux 之LED子系统(一)

2023年 8月 17日 33.5k 0

Linux内核的LED子系统是一种重要的框架,用于管理和控制设备上的LED指示灯。在嵌入式系统和物联网设备中,LED子系统发挥着关键作用,为开发者提供了一种统一的方式来控制和定制LED的行为和效果。

1. Linux 子系统框架图

image-20230808131029009.png

内核空间:内核配置LED相关的GPIO,初始化,提供各种控制LED的接口,并且在Linux 系统需要通过设备节点形式呈现,可通过读写设备节点去控制。

用户空间:LED子系统还提供了一组用户空间API,供应用程序使用。这些API可以在应用程序中调用,以实现对LED的控制和操作。API通常包括打开和关闭LED、设置LED亮度和颜色、闪烁和动画效果等。

led子系统主要核心文件:

driver/leds/led-class.c
driver/leds/led-core.c
driver/leds/led-triggers.c
include/linux/leds.h

还有一些其他文件,按照自己配置情况是否选用

ls ./drivers/leds/
Kconfig                 leds-as3645a.c      leds-da903x.c         leds-is31fl32xx.c  leds-lp3944.c         leds-max77650.c   leds-ot200.c        leds-spi-byte.c       led-triggers.c
led-class.c             leds-asic3.c        leds-da9052.c         leds-ktd2692.c     leds-lp3952.c         leds-max77693.c   leds-pca9532.c      leds-ss4200.c         Makefile
led-class-flash.c       leds-aw2013.c       leds-dac124s085.c     leds-lm3530.c      leds-lp50xx.c         leds-max8997.c    leds-pca955x.c      leds-sunfire.c        TODO
led-class-multicolor.c  leds-bcm6328.c      leds-el15203000.c     leds-lm3532.c      leds-lp5521.c         leds-mc13783.c    leds-pca963x.c      leds-syscon.c         trigger
led-core.c              leds-bcm6358.c      leds-fsg.c            leds-lm3533.c      leds-lp5523.c         leds-menf21bmc.c  leds-pm8058.c       leds-tca6507.c        uleds.c
leds-88pm860x.c         leds-bd2802.c       leds-gpio.c           leds-lm355x.c      leds-lp5562.c         leds-mlxcpld.c    leds-powernv.c      leds-ti-lmu-common.c
leds-aat1290.c          leds-blinkm.c       leds-gpio-register.c  leds-lm3601x.c     leds-lp55xx-common.c  leds-mlxreg.c     leds-pwm.c          leds-tlc591xx.c
leds-acer-a500.c        leds-clevo-mail.c   leds.h                leds-lm36274.c     leds-lp55xx-common.h  leds-mt6323.c     leds-rb532.c        leds-tps6105x.c
leds-adp5520.c          leds-cobalt-qube.c  leds-hp6xx.c          leds-lm3642.c      leds-lp8501.c         leds-net48xx.c    leds-regulator.c    leds-turris-omnia.c
leds-an30259a.c         leds-cobalt-raq.c   leds-ip30.c           leds-lm3692x.c     leds-lp8788.c         leds-netxbig.c    leds-s3c24xx.c      leds-wm831x-status.c
leds-apu.c              leds-cpcap.c        leds-ipaq-micro.c     leds-lm3697.c      leds-lp8860.c         leds-nic78bx.c    leds-sc27xx-bltc.c  leds-wm8350.c
leds-ariel.c            leds-cr0014114.c    leds-is31fl319x.c     leds-locomo.c      leds-lt3593.c         leds-ns2.c        leds-sgm3140.c      leds-wrap.c

2. LED子系统使用的场景

  • 可以控制LED的亮灭,闪烁模式,可以灵活改变相关触发方式;
  • 方便控制LED的亮度相关
  • 其他控制GPIO同样适用

3. LED子系统使用

以:imx8mq 为例子

设备树添加:

    leds {
        compatible = "gpio-leds";
        pinctrl-names = "default";
        pinctrl-0 = ;
​
        vibrator {
            label = "vibrator";
            gpios = ;
            default-state = "off";
        };
​
        led0 {
            label = "heartbeat";
            gpios = ;
            default-state = "on";
            /*linux,default-trigger = "heartbeat";*/
        };
​
        led1 {
            label = "led1";
            gpios = ;
            default-state = "on";
        };
​
        led2 {
            label = "led2";
            gpios = ;
            default-state = "off";
        };
    };

内核打开配置文件:

关于Trigger support 根据自己情况选用

image-20230808131525020.png

开启CONFIG_LEDS_TRIGGERS 和 CONFIG_LEDS_TRIGGER_TIMER

编译完毕后,加载是开发板可以看到:

evk_8mq:/ # ls /sys/class/leds
heartbeat led1 led2 mmc0:: mmc1:: vibrator
evk_8mq:/sys/class/leds/led1 # ls
brightness device max_brightness power subsystem trigger uevent

控制LED的亮灭

evk_8mq:/sys/class/leds/led1 # echo 0 > brightness
evk_8mq:/sys/class/leds/led1 # echo 1 > brightness

控制LED亮灭的等级

evk_8mq:/sys/class/leds/heartbeat # cat max_brightness
255

查看触发方式

evk_8mq:/sys/class/leds/led1 # cat trigger
[none] rc-feedback rfkill-any rfkill-none timer transient mmc1 mmc0 tcpm-source-psy-0-0022-online bq25700-charger-online cw2015-battery-charging-or-full cw2015-battery-charging cw2015-battery-full cw2015-battery-charging-blink-full-solid rfkill0

修改触发方式,改为时间,可以实现使得灯亮多久

evk_8mq:/sys/class/leds/heartbeat # echo timer > trigger
evk_8mq:/sys/class/leds/heartbeat # ls
brightness delay_on max_brightness subsystem uevent
delay_off  device  power      trigger
#设置灯亮1秒钟
evk_8mq:/sys/class/leds/heartbeat # echo 1000 > delay_on
#灭1秒钟
evk_8mq:/sys/class/leds/heartbeat # echo 1000 > delay_off

还有一种方式可以实现

evk_8mq:/sys/class/leds/led1 # echo transient > trigger
evk_8mq:/sys/class/leds/led1 # ls
activate  device  max_brightness state   trigger
brightness duration power      subsystem uevent

#控制LED1 亮一秒熄灭:

echo 1 > state

echo 1000 > duration

echo 1 > activate

在设备树中,可以看到里面有一个

/linux,default-trigger = "heartbeat"; /

这个可以选定它做为什么触发,心跳方式

4. LED的trigger

LED的trigger (部分)种类和作用

触发器名称 作用
transient 在特定事件发生时暂时改变LED的状态
timer 基于时间的LED控制,周期性地改变LED的状态
oneshot 在接收到触发事件时触发一次状态改变,并持续一段时间
heartbeat 模拟心跳效果,使LED呼吸或闪烁
cpu 根据CPU使用情况控制LED的状态
timerange 在特定的时间范围内控制LED的状态
gpio 通过与GPIO引脚的状态变化关联,控制LED的状态改变
pattern 允许定义自定义的LED模式,创造各种自定义的视觉效果
audio 将LED与音频输入关联,实现音频可视化效果
backlight 控制背光LED的状态,根据环境亮度或显示状态调整亮度
heartbeat-morse 结合了心跳效果和摩尔斯电码,创造有趣的视觉效果

下一章将会解析LED主要核心实现相关功能

0a03dd524f512b302a001bd452911ba.bmp

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论