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
還有一些其他文件,按照自己配置情況是否選用
kernel_imx_dev/drivers/leds$ ls
built-in.a leds-apu.c leds-da903x.c leds-ip30.c leds-locomo.c leds-max77693.c leds-pca963x.c leds-ti-lmu-common.c
Kconfig leds-ariel.c leds-da9052.c leds-ipaq-micro.c leds-lp3944.c leds-max8997.c leds-pm8058.c leds-tlc591xx.c
led-class.c leds-as3645a.c leds-dac124s085.c leds-is31fl319x.c leds-lp3952.c leds-mc13783.c leds-powernv.c leds-tps6105x.c
led-class-flash.c leds-asic3.c leds-el15203000.c leds-is31fl32xx.c leds-lp50xx.c leds-menf21bmc.c leds-pwm.c leds-turris-omnia.c
led-class-flash.o leds-aw2013.c leds-fsg.c leds-ktd2692.c leds-lp5521.c leds-mlxcpld.c leds-rb532.c leds-wm831x-status.c
led-class-multicolor.c leds-bcm6328.c leds-gpio.c leds-lm3530.c leds-lp5523.c leds-mlxreg.c leds-regulator.c leds-wm8350.c
led-class.o leds-bcm6358.c leds-gpio.ko leds-lm3532.c leds-lp5562.c leds-mt6323.c leds-s3c24xx.c leds-wrap.c
led-core.c leds-bd2802.c leds-gpio.mod leds-lm3533.c leds-lp55xx-common.c leds-net48xx.c leds-sc27xx-bltc.c led-triggers.c
led-core.o leds-blinkm.c leds-gpio.mod.c leds-lm355x.c leds-lp55xx-common.h leds-netxbig.c leds-sgm3140.c led-triggers.o
leds-88pm860x.c leds-clevo-mail.c leds-gpio.mod.o leds-lm3601x.c leds-lp8501.c leds-nic78bx.c leds-spi-byte.c Makefile
leds-aat1290.c leds-cobalt-qube.c leds-gpio.o leds-lm36274.c leds-lp8788.c leds-ns2.c leds-ss4200.c modules.order
leds-acer-a500.c leds-cobalt-raq.c leds-gpio-register.c leds-lm3642.c leds-lp8860.c leds-ot200.c leds-sunfire.c TODO
leds-adp5520.c leds-cpcap.c leds.h leds-lm3692x.c leds-lt3593.c leds-pca9532.c leds-syscon.c trigger
leds-an30259a.c leds-cr0014114.c leds-hp6xx.c leds-lm3697.c leds-max77650.c leds-pca955x.c leds-tca6507.c uleds.c
2. LED子系統使用的場景
3. LED子系統使用
修改設備樹
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:/ # cd /sys/class/leds/led1
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
查看觸發方式:
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
看到[none],表明是空,沒有使用任何觸發方式,這里將舉例子,設置燈亮1秒鐘:
采用timer 實現
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
采用transient實現
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 (部分)種類和作用
評論
查看更多