0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux Led子系统代码框架分析

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-20 10:36 次阅读

代码框架分析

led-class.c (led 子系统框架的入口)

维护 LED 子系统的所有 LED 设备,为 LED 设备提供注册操作函数: 

led_classdev_register()
devm_led_classdev_register()

注销操作函数:
led_classdev_unregister()
devm_led_classdev_unregister();

电源管理的休眠和恢复操作函数: 
led_classdev_suspend()
led_classdev_resume();

用户态操作接口:brightness 、max_brightness

led-core.c

抽象出 LED 操作逻辑,封装成函数导出,供其它文件使用:

led_init_core(): 核心初始化;
led_blink_set(): 设置led闪烁时间:
led_blink_set_oneshot() : 闪烁一次
led_stop_software_blink() : led停止闪烁
led_set_brightness() : 设置led的亮度
led_update_brightness : 更新亮度
led_sysfs_disable : 用户态关闭
led_sysfs enable : 用户态打开
leds_list : leds链表;
leds_list_lock : leds链表锁

led-triggers.c

维护 LED 子系统的所有触发器,为触发器提供注册操作函数: 

led_trigger_register()
devm_led_trigger_register()
led_trigger_register_simple()

注销操作函数: 

led_trigger_unregister()
led_trigger_unregister_simple()

以及其它触发器相关的操作函数

ledtrig-timer.c、ledtrig-xxx.c

ledtrig-timer.c 为例

入口函数调用 led_trigger_register() 注册触发器,
注册时候传入 led_trigger 结构体,里面有 activatedeactivate 成员函数指针,
作用是生成 delay_ondelay_off 文件

同时还提供 delay_ondelay_off 的用户态操作接口
卸载时,使用 led_trigger_unregister() 注销触发器

leds-gpio.c、leds-xxx.c :

leds-gpio.c 为例

在通过设备树或者其它途径匹配到设备信息后,将调用 probe() 函数,
然后再根据设备信息设置 led_classdev,
最后调用 devm_led_classdev_register() 注册 LED 设备。

led_classdev 结构体代表 led 实例:

struct led_classdev {
 const char  *name;//名字
 enum led_brightness  brightness;//亮度
 enum led_brightness  max_brightness;//最大亮度
 int    flags;

 /* Lower 16 bits reflect status */
#define LED_SUSPENDED  (1 < < 0)
 /* Upper 16 bits reflect control information */
#define LED_CORE_SUSPENDRESUME (1 < < 16)
#define LED_BLINK_ONESHOT (1 < < 17)
#define LED_BLINK_ONESHOT_STOP (1 < < 18)
#define LED_BLINK_INVERT (1 < < 19)
#define LED_SYSFS_DISABLE (1 < < 20)
#define SET_BRIGHTNESS_ASYNC (1 < < 21)
#define SET_BRIGHTNESS_SYNC (1 < < 22)
#define LED_DEV_CAP_FLASH (1 < < 23)

//设置亮度API
 void  (*brightness_set)(struct led_classdev *led_cdev,enum led_brightness brightness);
 int  (*brightness_set_sync)(struct led_classdev *led_cdev,enum led_brightness brightness);
          
//获取亮度API
 enum led_brightness (*brightness_get)(struct led_classdev *led_cdev);

//闪烁时点亮和熄灭的时间设置
 int  (*blink_set)(struct led_classdev *led_cdev,unsigned long *delay_on,unsigned long *delay_off);

 struct device  *dev;
 const struct attribute_group **groups;

//leds-list的node
 struct list_head  node;
//默认trigger的名字
 const char  *default_trigger;
//闪烁的开关时间
 unsigned long   blink_delay_on, blink_delay_off;
//闪烁的定时器链表
 struct timer_list  blink_timer;
//闪烁的亮度
 int    blink_brightness;
 void   (*flash_resume)(struct led_classdev *led_cdev);

 struct work_struct set_brightness_work;
 int   delayed_set_value;

#ifdef CONFIG_LEDS_TRIGGERS
//trigger的锁
 struct rw_semaphore  trigger_lock;
//led的trigger
 struct led_trigger *trigger;
//trigger的链表
 struct list_head  trig_list;
//trigger的数据
 void   *trigger_data;
 bool   activated;
#endif
 struct mutex  led_access;
};

led_trigger 结构:

struct led_trigger {
 /* Trigger Properties */
 const char  *name;
 void  (*activate)(struct led_classdev *led_cdev);
 void  (*deactivate)(struct led_classdev *led_cdev);

 /* LEDs under control by this trigger (for simple triggers) */
 rwlock_t   leddev_list_lock;
 struct list_head  led_cdevs;

 /* Link to next registered trigger */
 struct list_head  next_trig;
};

trigger 是控制 LED 类设备的算法,这个算法决定着 LED 什么时候亮什么时候暗。

1、点亮 LED

echo 255 > /sys/class/leds/led1/brightness
cat /sys/class/leds/led1/brightness
cat /sys/class/leds/led1/max_brightness

2、闪烁

cat /sys/class/leds/led1/trigger

会看到 trigger_list
[none] mmc0 mmc1 mmc2 timer
其中的 timer 这个 trigger 是 ledtrig-timer.c 中模块初始化的时候注册进去的

echo timer > /sys/class/leds/led1/trigger
这一句会调用
led_trigger_store()- >
   led_trigger_set()- >
     trigger- >activate(led_cdev);
从而调用 ledtrig-timer.c 文件里 的timer_trig_activate(),
在 /sys/class/leds/led1/ 下创建 delay_on、delay_off 两个文件

echo 100 > /sys/class/leds/led1/delay_on
echo 200 > /sys/class/leds/led1/delay_off
这样会闪烁,亮 100ms 灭 200ms

3、关闭 LED

echo 0 > /sys/class/leds/led1/delay_on
或
echo 0 > /sys/class/leds/led1/brightness
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    237

    文章

    22454

    浏览量

    645895
  • Linux
    +关注

    关注

    87

    文章

    10991

    浏览量

    206742
  • 系统
    +关注

    关注

    1

    文章

    981

    浏览量

    21036
收藏 人收藏

    评论

    相关推荐

    Linux LED子系统详解

    Linux LED子系统详解
    的头像 发表于 06-10 10:37 992次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>LED</b><b class='flag-5'>子系统</b>详解

    Linux时间子系统之ARM generic timer驱动代码分析

    郭健 Linux时间子系统之ARM generic timer驱动代码分析
    发表于 07-17 09:30

    输入子系统的作用与框架

    了一个底层驱动(成为serio)的集合,支持对串口和键盘控制器等硬件输入的访问  输入子系统使得应用编程人员和驱动编程人员编程的时候变得简单统一。3、输入子系统框架linux输入
    发表于 10-19 17:13

    介绍下input子系统

    文章目录前言input子系统按键检测C代码微信公众号前言这是前3篇:嵌入式Linux i.MX开发板嵌入式Linux NFS嵌入式Linux
    发表于 11-04 08:14

    浅析input输入子系统框架嵌入式Linux驱动

    )------USB键盘驱动程序嵌入式Linux驱动笔记(五)------学习platform设备驱动嵌入式Linux驱动笔记(六)------浅析input输入子系统框架嵌入式
    发表于 11-05 06:47

    linux I2C子系统的相关资料分享

    文章目录linux I2C子系统框架在设备树中添加从设备信息,mpu5060I2C driver 程序的编写mpu6050 I2C程序具体实现linux I2C
    发表于 02-10 06:06

    Hi3516的SAMGR--系统服务框架子系统-5-切入小型系统

    简直是皮毛而已,真的详细说起来,需要单独的篇章,下一篇就从它开始。主要的分析工作,还是在 samgr_lite 目录内,在一头扎进去之前,最好先回顾一下《Hi3861的SAMGR--系统服务框架子系统-1
    发表于 04-20 10:27

    从misc子系统到3+2+1设备识别驱动框架

    misc子系统Linux中是一个非常简单的子系统,但是其清晰的框架结构非常适合用来研究设备识别模型。本文从misc子系统的使用出发,通过了
    发表于 05-07 10:56 496次阅读

    从misc子系统到3+2+1设备识别驱动框架

    misc子系统Linux中是一个非常简单的子系统,但是其清晰的框架结构非常适合用来研究设备识别模型。
    发表于 05-10 10:48 590次阅读

    linux I2C子系统(及相关程序设计MPU6050)

    文章目录linux I2C子系统框架在设备树中添加从设备信息,mpu5060I2C driver 程序的编写mpu6050 I2C程序具体实现linux I2C
    发表于 12-06 13:36 9次下载
    <b class='flag-5'>linux</b> I2C<b class='flag-5'>子系统</b>(及相关程序设计MPU6050)

    Linux系统中NFC子系统架构分析

    目前在Linux系统中,每个厂家都使用不同的方式实现NFC驱动,然后自己在应用层上面做适配。但是Linux也已经推出NFC子系统,很多厂家也逐步在统一。
    发表于 01-04 14:01 1398次阅读

    从软件角度分析linux内核USB子系统的热插拔过程

    本文从软件角度分析linux内核USB子系统的热插拔过程,以实际分析思路和过程行文,基于linux内核版本:4.19.4,记录
    的头像 发表于 01-15 09:28 4336次阅读

    Linux内核之LED子系统(一)

    Linux内核的LED子系统是一种重要的框架,用于管理和控制设备上的LED指示灯。在嵌入式系统
    发表于 10-02 16:53 287次阅读
    <b class='flag-5'>Linux</b>内核之<b class='flag-5'>LED</b><b class='flag-5'>子系统</b>(一)

    Linux内核之LED子系统(二)

    这里说一说LED子系统的一些核心源代码文件,是如何实现LED子系统
    发表于 10-02 16:55 278次阅读
    <b class='flag-5'>Linux</b>内核之<b class='flag-5'>LED</b><b class='flag-5'>子系统</b>(二)

    Linux clock子系统是什么

    clock子系统 Linux的时钟子系统由CCF(common clock framework)框架管理, CCF向上给用户提供了通用的时钟接口,向下给驱动开发者提供硬件操作的接口 。
    的头像 发表于 09-27 14:25 382次阅读
    <b class='flag-5'>Linux</b> clock<b class='flag-5'>子系统</b>是什么