一、设备树编写
节点属性添加参考内核源码 Documentation/devicetree/bindings/leds/leds-gpio.yaml 文件,设备树插件如下所示:
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/leds/common.h>
leds {
compatible = "gpio-leds";
led-0 {
gpios = <&mcu_pio 0 GPIO_ACTIVE_LOW>;
linux,default-trigger = "disk-activity";
function = LED_FUNCTION_DISK;
};
led-1 {
gpios = <&mcu_pio 1 GPIO_ACTIVE_HIGH>;
/* Keep LED on if BIOS detected hardware fault */
default-state = "keep";
function = LED_FUNCTION_FAULT;
};
};2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
其中最重要的是 linux,default-trigger 属性,可以配置如下:

二、LED 子系统
1、用户态
控制 LED 灯的方法如下:
在用户模式下,可以通过修改设备目录里的文件来控制 LED 灯。每个 LED 对应的目录路径通常是 /sys/class/leds/xxx/,里面主要有以下文件:
① 调整亮度
- brightness:设置 LED 亮度。输入 0-255 之间的数字,0=完全熄灭,255=最亮。
- max_brightness:查看最大亮度值。一般显示 255,表示这个 LED 能调到最亮。
② 设置工作模式(触发模式)
修改 trigger 文件选择 LED 的运作方式:
none:LED 一直熄灭default-on:LED 一直亮着timer:按设定时间闪烁(需配合调整闪烁间隔)heartbeat:模拟心跳节奏闪烁(常用于系统状态提示)cpu0:根据 CPU 使用率变化闪烁(数值越高闪烁越快)mmc0/nand-disk:存储设备工作时闪烁(如 U 盘读写时)oneshot/backlight等:用于特定功能
③ 定时闪烁设置(仅限 timer 模式)
当选择 timer 模式后,通过以下文件调整闪烁节奏:
- delay_on:设置 LED 亮起的时长(单位:毫秒)
- delay_off:设置 LED 熄灭的时长(单位:毫秒)
示例:若要让 LED 每秒闪烁一次(1Hz),可设置:
delay_on = 500(亮 0.5 秒)delay_off = 500(灭 0.5 秒)
INFO
所有设置立即生效,无需重启。通过组合不同模式和参数,可以实现多种灯光效果。
2、内核驱动
LED 驱动程序主要存放在 Linux 内核的 drivers/leds 目录中,核心功能由三个文件实现:
2.1、核心文件作用
led-core.c 处理 LED 的基本操作,比如设置亮度、闪烁等,并提供这些功能给其他文件使用。关键功能包括:
- 初始化 LED 系统(
led_init_core) - 控制 LED 闪烁(设置/停止/单次闪烁)
- 亮度调节(支持休眠/非休眠场景)
- 维护所有 LED 的列表和锁机制
- 支持用户通过
/sys文件系统开关 LED
- 初始化 LED 系统(
led-class.c 管理所有 LED 设备的注册和管理:
- 注册 LED 设备(支持设备树配置)
- 注销设备
- 处理设备休眠/唤醒时的 LED 状态
- 在
/sys创建控制接口(如亮度调节、最大亮度显示)
led-triggers.c 管理所有 LED 的触发机制:
- 注册/注销触发器
- 支持多种触发方式(如定时、CPU 使用率等)
2.2、可选触发方式(触发器)
通过配置可启用以下触发功能,每个触发器对应一个驱动文件:
obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o //定时触发
obj-$(CONFIG_LEDS_TRIGGER_ONESHOT) += ledtrig-oneshot.o //单次触发
obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK) += ledtrig-ide-disk.o //硬盘触发
obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT) += ledtrig-heartbeat.o //心跳触发
obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT) += ledtrig-backlight.o //背光设置
obj-$(CONFIG_LEDS_TRIGGER_GPIO) += ledtrig-gpio.o //GPIO触发
obj-$(CONFIG_LEDS_TRIGGER_CPU) += ledtrig-cpu.o //CPU触发
obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON) += ledtrig-default-on.o //默认开
obj-$(CONFIG_LEDS_TRIGGER_TRANSIENT) += ledtrig-transient.o
obj-$(CONFIG_LEDS_TRIGGER_CAMERA) += ledtrig-camera.o2
3
4
5
6
7
8
9
10
2.3、设备驱动与触发器实现
LED 设备驱动(如 GPIO LED)
- 硬件连接:LED 接在 GPIO 引脚上时,无需自己编写驱动。
- 配置方法:只需在设备树(Device Tree)中添加 LED 的 GPIO 引脚等信息,内核会自动加载已有驱动(如
leds-gpio.c)。 - 注册流程:驱动通过
probe()函数读取设备树配置,设置 LED 属性后调用注册函数(如devm_of_led_classdev_register)完成设备注册。
触发器实现(以定时触发为例)
- 注册过程:触发器模块(如
ledtrig-timer.c)通过led_trigger_register()注册自身,需提供激活/停用函数。 - 用户控制:生成控制文件(如
delay_on/delay_off),允许用户设置闪烁时长。 - 注销:卸载时通过
led_trigger_unregister()清理资源。
三、驱动代码
1、平台设备驱动的注册

- 第 1-4 行:
of_match_table表用于驱动和设备匹配,这里将匹配主设备树leds节点。 - 第 5 行:宏
MODULE_DEVICE_TABLE(gtype,name),在这里该宏会会生成一个符号表,把该设备加入到设备队列中,该方式支持使用平台设备匹配驱动。 - 第 7-14 行:定义平台驱动结构体,填充
of_match_table段,设备树的方式匹配驱动。 - 第 16 行:使用
module_platform_driver宏注册平台驱动,该 LED 驱动是一个platform_driver的对象。
关于 module_platform_driver() 宏,在内核源码 /include/linux/platform_device.h 中有定义:

继续展开 module_driver() 宏:

可以看到,最终该宏是执行 module_init() 和 module_exit() 进行驱动模块的注册和注销,其中 "" 表示前后两部分粘和起来。
2、平台设备驱动的 probe


create_gpio_led
-- devm_of_led_classdev_register
drivers/leds/led-class.c


led_update_brightness
led_init_core
led-core.c
四、数据结构

五、使用方法
重启加载设备树后,驱动已经编译进内核,会在 /sys/class/leds 目录下多个 led_test 目录。进入 led_test 目录。
led-class.c

brightness max_brightness subsystem uevent
device power trigger2
可以通过 echo 0 > brightness 来关闭 LED 灯,通过 echo timer > trigger 改变触发模式。同时,cat trigger 可以显示支持的触发模式,以及当前的触发模式:
none nand-disk mmc0 cpu0 [heartbeat] timer default-on oneshot backlight gpio