Linux内核的LED子系统是一种重要的框架,用于管理和控制设备上的LED指示灯。在嵌入式系统和物联网设备中,LED子系统发挥着关键作用,为开发者提供了一种统一的方式来控制和定制LED的行为和效果。
1. Linux 子系统框架图
内核空间:内核配置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 根据自己情况选用
开启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主要核心实现相关功能