NXP i.MX8系列平台开发讲解 - 3.1 Linux 之LED子系统(一)

专栏文章目录传送门返回专栏目录


文章目录

Linux 之LED子系统(一)

1. Linux 子系统框架图

2. LED子系统使用的场景

3. LED子系统使用

4. LED的trigger


        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子系统使用的场景

  1. 可以控制LED的亮灭,闪烁模式,可以灵活改变相关触发方式;

  2. 方便控制LED的亮度相关

  3. 其他控制GPIO同样适用

3. LED子系统使用

以:imx8mq 为例子

设备树添加:

    leds {
        compatible = "gpio-leds";
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_leds>;
​
        vibrator {
            label = "vibrator";
            gpios = <&gpio5 2 GPIO_ACTIVE_HIGH>;
            default-state = "off";
        };
​
        led0 {
            label = "heartbeat";
            gpios = <&gpio4 10 GPIO_ACTIVE_LOW>;
            default-state = "on";
            /*linux,default-trigger = "heartbeat";*/
        };
​
        led1 {
            label = "led1";
            gpios = <&gpio3 20 GPIO_ACTIVE_HIGH>;
            default-state = "on";
        };
​
        led2 {
            label = "led2";
            gpios = <&gpio1 15 GPIO_ACTIVE_HIGH>;
            default-state = "off";
        };
    };

内核打开配置文件:

开启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主要核心实现相关功能。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值