news 2026/3/26 18:10:17

Linux LED调试

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux LED调试

目录

目录

前言

DTS配置参考

LEDS_GPIO的DTS配置参考

LEDS_PWM的DTS配置参考

LEDS_GPADC的DTS配置参考

内核配置参考

LEDS_GPIO的内核配置参考

LEDS_PWM的内核配置参考

LEDS_GPADC的内核配置参考

验证测试参考

常见问题

配置了LED的Devicetree和Menuconfig是正确的但是LED控制打开后始终不亮

配置了LED的Devicetree和Menuconfig后发现LED控制打开后LED灯反而是灭的

总结


前言

LED指示灯,即发光二极管指示灯,是一种以发光二极管为核心光源的电子元件,主要用于显示设备或电路的工作状态。‌其核心作用是通过不同颜色和闪烁模式的灯光,直观反映设备的运行情况,例如电源供应、连接状态或信号传输等,从而便于用户快速判断设备是否正常工作或诊断故障。‌

Linux LED驱动开发主要涉及两种方式:一是编写自定义的字符设备驱动直接操作硬件寄存器;二是利用内核内置的LED子系统,通过设备树配置。

Linux内核原生已经支持LED驱动,其中内核文档路径为:linux-x.xx/Documentation/devicetree/bindings/leds,其描述了相应的设备树节点如何编写。

这里推荐使用‌Linux内核内置LED驱动,减少重复的工作。Linux内核提供基于platform框架的GPIO LED驱动(文件路径为:drivers/leds/leds-gpio.c)。


DTS配置参考

LEDS_GPIO的DTS配置参考

leds { compatible = "gpio-leds"; timer_led { gpios = <&gpioc 0 GPIO_ACTIVE_LOW>; label = "timer_led"; linux,default-trigger = "timer"; default-status = "on"; status = "okay"; }; };

LEDS_PWM的DTS配置参考

pwm-leds { compatible = "pwm-leds"; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_pwm1>; pwm-led@1 { label = "pwmled"; pwms = <&pwm 1 50000 1>; max-brightness = <255>; linux,default-trigger = "heartbeat"; }; }; pinctrl: pinctrl@xxxxxxxx { pinctrl_pwm1: pwm1-grp { test,pins = "gpioc-1"; test,pin-function = <6>; test,pin-pud = <ENABLE_PULL_UP>; test,pin-drv = <DRV_LEVEL3>; }; };

LEDS_GPADC的DTS配置参考

leds_gpadc { compatible = "gpadc-leds"; ir_led { label = "ir_led"; gpadc_channel = <1>; linux,default-trigger = "timer"; default-state = "on"; status = "okay"; }; };

内核配置参考

LEDS_GPIO的内核配置参考

CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y CONFIG_LEDS_GPIO=y CONFIG_LEDS_TRIGGERS=y (触发器功能根据实际情况来打开) CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_ONESHOT=y CONFIG_LEDS_TRIGGER_MTD=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_BACKLIGHT=y CONFIG_LEDS_TRIGGER_CPU=y CONFIG_LEDS_TRIGGER_ACTIVITY=y CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_LEDS_TRIGGER_DEFAULT_ON=y CONFIG_LEDS_TRIGGER_TRANSIENT=y CONFIG_LEDS_TRIGGER_CAMERA=y CONFIG_LEDS_TRIGGER_PANIC=y CONFIG_LEDS_TRIGGER_NETDEV=y

LEDS_PWM的内核配置参考

CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y CONFIG_LEDS_PWM=y CONFIG_LEDS_TRIGGERS=y (触发器功能根据实际情况来打开) CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_ONESHOT=y CONFIG_LEDS_TRIGGER_MTD=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_BACKLIGHT=y CONFIG_LEDS_TRIGGER_CPU=y CONFIG_LEDS_TRIGGER_ACTIVITY=y CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_LEDS_TRIGGER_DEFAULT_ON=y CONFIG_LEDS_TRIGGER_TRANSIENT=y CONFIG_LEDS_TRIGGER_CAMERA=y CONFIG_LEDS_TRIGGER_PANIC=y CONFIG_LEDS_TRIGGER_NETDEV=y

LEDS_GPADC的内核配置参考

CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y CONFIG_LEDS_GPADC=y CONFIG_LEDS_TRIGGERS=y(触发器功能根据实际情况来打开) CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_ONESHOT=y CONFIG_LEDS_TRIGGER_MTD=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_BACKLIGHT=y CONFIG_LEDS_TRIGGER_CPU=y CONFIG_LEDS_TRIGGER_ACTIVITY=y CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_LEDS_TRIGGER_DEFAULT_ON=y CONFIG_LEDS_TRIGGER_TRANSIENT=y CONFIG_LEDS_TRIGGER_CAMERA=y CONFIG_LEDS_TRIGGER_PANIC=y CONFIG_LEDS_TRIGGER_NETDEV=y

验证测试参考

1. 配置好LED相关的DTS和内核配置后,编译并烧录固件,主控板正常启动。

2. 验证LEDS_GPIO,输入操作命令并观察对应的LED的亮灭情况,例如:

# cat /sys/class/leds/timer_led/trigger (查看当前的触发器类型。) none [timer] oneshot mtd nand-disk heartbeat backlight gpio cpu cpu0 activity default-on transient flash torch panic netdev mmc0 mmc1 # echo heartbeat > /sys/class/leds/timer_led/trigger(改变触发器类型为心跳触发类型。) # cat /sys/class/leds/timer_led/trigger (查看当前的触发器类型。) none timer oneshot mtd nand-disk [heartbeat] backlight gpio cpu cpu0 activity default-on transient flash torch panic netdev mmc0 mmc1 # echo timer > /sys/class/leds/timer_led/trigger(改变触发器类型为定时器触发类型。) # cat /sys/class/leds/timer_led/trigger(查看当前的触发器类型。) none [timer] oneshot mtd nand-disk heartbeat backlight gpio cpu cpu0 activity default-on transient flash torch panic netdev mmc0 mmc1 # cat /sys/class/leds/timer_led/delay_on (查看当前定时器触发的亮灯延时时间。) 500 # cat /sys/class/leds/timer_led/delay_off (查看当前定时器触发的灭灯延时时间。) 500 # echo 3000 > /sys/class/leds/timer_led/delay_on(改变定时器触发的亮灯延时时间为3000ms。) # cat /sys/class/leds/timer_led/delay_on(查看当前定时器触发的亮灯延时时间。) 3000 # echo 3000 > /sys/class/leds/timer_led/delay_off(改变定时器触发的灭灯延时时间为3000ms。) # cat /sys/class/leds/timer_led/delay_off(查看当前定时器触发的灭灯延时时间。) 3000

3. 验证LEDS_PWM,输入操作命令并观察对应的LED的亮灭情况,例如:

# echo 2 > /sys/class/leds/pwmled/brightness # echo 4 > /sys/class/leds/pwmled/brightness # echo 12 > /sys/class/leds/pwmled/brightness # echo 16 > /sys/class/leds/pwmled/brightness # echo 20 > /sys/class/leds/pwmled/brightness # echo 24 > /sys/class/leds/pwmled/brightness # echo 28 > /sys/class/leds/pwmled/brightness

4. 验证LEDS_GPADC,输入操作命令并观察对应的LED的亮灭情况,例如:

# cat /sys/class/leds/ir_led/trigger none [timer] oneshot mtd nand-disk heartbeat backlight gpio cpu cpu0 activity default-on transient flash torch panic netdev mmc0 mmc1 # cat /sys/class/leds/ir_led/delay_on 500 # cat /sys/class/leds/ir_led/delay_off 500 # echo 3000 > /sys/class/leds/ir_led/delay_off # cat /sys/class/leds/ir_led/delay_off 3000 # echo 3000 > /sys/class/leds/ir_led/delay_off # cat /sys/class/leds/ir_led/delay_off 3000

常见问题

配置了LED的Devicetree和Menuconfig是正确的但是LED控制打开后始终不亮

【问题现象】

调试的PCB板子或整机正常上电后,配置了LED的Devicetree和Menuconfig是正确的但是LED软件控制打开后始终不亮。

【解决方法】

下面以某个LED-红绿双色灯的电路原理图为例。

1. 可以先检查LED部分的电路是否正常。比如LED-R软件控制打开后始终不亮,可以先检查D11是否贴反或虚贴,然后再检查R778是否漏贴或虚贴,最后LED-R直接飞线
接地,查看D11的R灯是否可以正常亮。

2. LED部分的电路检查正常后,可以跑软件进行控制下LED(比如:LED-R)。

配置了LED的Devicetree和Menuconfig后发现LED控制打开后LED灯反而是灭的


【问题现象】

配置了LED的Devicetree和Menuconfig后发现LED控制打开后LED指示灯反而是灭的。

【解决方法】

1. 可以先检查DTS的LED部分配置是否正确。比如下面的LED节点配置中,“gpios = <&gpioc 18 1>”配置的led2实际上打开时GPIOC18置为低电平了,因为此时的GPIO_ACTIVE_LOW的值实际上就是1而不是0,GPIO_ACTIVE_HIGH的值实际上就是0而不是1,建议使“GPIO_ACTIVE_LOW”或“GPIO_ACTIVE_HIGH”来表示。

leds { compatible = "gpio-leds"; led@0 { label = "led0"; gpios = <&gpioc 14 GPIO_ACTIVE_LOW>; default-state = "on"; ; led@1 { label = "led1"; gpios = <&gpioc 15 GPIO_ACTIVE_LOW>; default-state = "on"; }; led@2 { label = "led2"; gpios = <&gpioc 18 1>; default-state = "on"; }; };

2. 检查并正确修改DTS的LED部分配置后,跑软件进行控制LED(比如:led2),观察LED指示灯的亮灭情况。


总结

像 LED 这样非常基础的设备驱动, Linux内核已经集成了。 Linux内核的LED驱动采用platform框架,因此我们只需按要求在设备树(DTS)文件中添加相应的 LED 节点配置即可。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/12 18:37:58

深入理解Java线程池:从核心参数到实战避坑指南

引言 大家好&#xff0c;我是小码&#xff0c;一个在Java开发路上摸爬滚打的研二学生。最近在优化我们那个大营销抽奖系统时&#xff0c;频繁遇到了线程管理的问题——内存溢出、响应变慢、甚至服务直接挂掉。痛定思痛&#xff0c;我花了整整一周时间重新梳理了Java线程池的方方…

作者头像 李华
网站建设 2026/3/25 20:31:09

46、网络文件共享与管理全解析

网络文件共享与管理全解析 1. 符号与数字相关 在文件配置和使用中,一些符号和数字有着特定的含义和用途。例如,在 smb.conf 文件里, # 和 ; 用于添加注释;以 . 开头的文件名有其特殊性质,像点文件(dot files),这类文件在某些系统中可能具有隐藏性,其可见性可…

作者头像 李华
网站建设 2026/3/26 17:06:24

百度网盘极速下载方案:告别限速烦恼的完整教程

还在为百度网盘的下载速度而烦恼吗&#xff1f;这款百度网盘下载工具为你提供完美的解决方案&#xff01;通过智能解析技术&#xff0c;轻松获取有效下载地址&#xff0c;让你享受快速稳定的下载体验。 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 …

作者头像 李华
网站建设 2026/3/23 11:35:24

4、构建容器镜像全解析

构建容器镜像全解析 在容器化技术的世界里,构建容器镜像是至关重要的一环。本文将详细介绍构建容器镜像的相关指令、最佳实践以及具体的构建方法。 1. Dockerfile 指令详解 1.1 LABEL 指令 LABEL 指令用于为镜像添加额外信息,这些信息可以是版本号、描述等。建议限制标签的…

作者头像 李华
网站建设 2026/3/23 1:05:44

downkyi视频下载终极指南:10个技巧让你成为下载高手

快速入门指南&#xff08;5分钟上手&#xff09; 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xff09;。 项目地…

作者头像 李华
网站建设 2026/3/24 23:35:48

18、在公共云及本地环境中运行 Docker 并使用 Portainer 进行管理

在公共云及本地环境中运行 Docker 并使用 Portainer 进行管理 1. Amazon Elastic Container Service for Kubernetes(Amazon EKS) Amazon EKS 是我们要介绍的最后一个 Kubernetes 服务,它是三个服务中最新推出的。由于 Amazon 的命令行工具不太友好,我们使用由 Weave 开发…

作者头像 李华