前几天老大让我改一下 led 灯的效果,从闪烁模式改成呼吸模式。我找了前辈的提交,照着改了一下,因为需求紧急,就没有认真看,老大也直接 review 了,然后,对代码的时候,老大跟我说改复杂了,改呼吸灯模式不用动 linux 的 led 子系统,需要客制化的只是 mtk 的内容,改需求的原则就是改动最少的代码,让我回去再研究下。
这里先看 linux 本身有的 led 子系统,来自博客好文:
初探linux子系统集之led子系统

led-core.c :
led_blink_setup
led_blink_set
led_blink_set_oneshot
led-triggers.c:
led_trigger_blink_setup
led_trigger_blink
led_trigger_blink_oneshot

mtk 系统的话就是对 linux 的扩展。
其中 mtk拓展的led设备节点结构体,在想添加功能时,需要从此入手:
leds_sw.h
声明关于led子系统的各个结构体

struct mt65xx_led_data {struct led_classdev cdev;struct cust_mt65xx_led cust;struct work_struct work;int level;int delay_on;int delay_off;};

上面的结构体包括对背光、闪光灯、键盘灯、 led 灯的描述;下面这个结构体是针对 红绿蓝led灯的描述:

struct nled_setting {u8 nled_mode;   //呼吸灯定制模式,包括 pmic、pwm 各种 mode,这个要参考mt6535等 pmic 寄存器手册u32 blink_on_time;   //亮的时间u32 blink_off_time;  //灭的时间};

leds_drv.c 这个文件是对各个 led 设备的驱动文件,其中的流程符合字符设备驱动加载初始化流程:

直接分析probe:

//mt65xx_leds_probe
// 挂载初始化每一个 light-system 元素for (i = 0; i < MT65XX_LED_TYPE_TOTAL; i++) {//kzalloc  alloation memory and memset to 0//assign values to the structure//将亮度设置函数指向 mt65xx_led_set,即后来的设置亮度会调用此函数g_leds_data[i]->cdev.brightness_set = mt65xx_led_set; //将亮度设置函数指向mt65xx_blink_set,即后来的设置亮度会调用此函数g_leds_data[i]->cdev.blink_set = mt65xx_blink_set;//添加一个任务到工作队列,当触发时会调用其中的函数。那什么时候会触发唤醒这个任务呢?INIT_WORK(&g_leds_data[i]->work, mt_mt65xx_led_work);//注册一个 led-class 类,这个符合面向对象的思想,就像 c++ 中实例化一个对象,该对象中能够实现某些功能。这之前的赋值函数功能等就是相当于对该对象的数据封装初始化。其实 linux 内核中面向对象的思想很彻底,led_classdev_register(&pdev->dev, &g_leds_data[i]->cdev);}

下面就是 mt_mt65xx_led_work 和 led_classdev_register 的作用
添加mt_mt65xx_led_work 之后,会根据 cust_leds.c 中的客制化值进行选择,然后进入相应的函数;
这里是mt_brightness_set_pmic(cust->data, level, bl_div_hal) //这个只是设置led灯亮度的地方,不涉及led的闪烁功能。
殊途同归,调度 mt_mt65xx_led_work的过程是:

g_leds_data[i]->cdev.brightness_set = mt65xx_led_set;---> mt65xx_led_set
 ----> mt_mt65xx_led_set
 ----->schedule_work(&led_data->work)

这就解决了上面的一个问题;
上面这个是设置亮度功能的调度过程,下面是对闪烁功能的调度:
g_leds_data[i]->cdev.blink_set = mt65xx_blink_set;
这两个是设置到 cdev中,cdev则对应到注册的设备类中:

//led-core.c
//led_blink_setup
led_cdev->blink_set(led_cdev, delay_on, delay_off)

mtk 的 led 控制是分好几种的,有时会用到 pmic ,这个时候就不需要利用函数来设置参数,直接设置寄存器就可以实现呼吸效果,而其他的控制方式则需要客制化上面过程中的函数。

linux 中对各种驱动的抽象化,使得各种驱动模型使用、定制起来十分方便,十多伟大的人类才会写出这样的系统!致敬前人!


mtk led子系统概略相关推荐

  1. 初探linux子系统集之led子系统(一)【转】

    本文转载自:http://blog.csdn.net/eastmoon502136/article/details/37569789 就像学编程第一个范例helloworld一样,学嵌入式,单片机.f ...

  2. Linux下的LED子系统

    最简单的led驱动就是从端口输出0或1来关闭或点亮灯.而我们这里讲的led子系统,主要是对led事件进行了分装和优化,这里我们主要讲的是可以实现跨平台的led驱动.不管你是使用三星的平台,还是Atme ...

  3. Linux内核LED子系统、请务必看

    前言 LED子系统你要是说很难嘛,但是它就是控制一些简单的GPIO口,但是你要是说它很简单嘛,但是我也不见得一个初学者很快就能掌握,你如果是刚入门这部分的话,我觉得你还是要去仔细研究下这些驱动.前两天 ...

  4. LINUX系统子系统DEMON,【linux】led子系统

    目录 前言 led子系统 led子系统实战-系统调用-ARM平台 前言 接下来记录的是 led子系统 目前不涉及驱动源码 linux子系统 在 Linux 系统中 绝大多数硬件设备都有非常成熟的驱动框 ...

  5. 基于PM8916 MPP创建一个Linux led子系统

    基于PM8916 MPP创建一个Linuxled子系统 首先,从kernel文件系统层面上创建sys文件系统节点/sys/class/leds/button-backlight/brightness的 ...

  6. MTK led闪烁改为呼吸灯模式

    1) PMIC的LED: 平台上本身就定义了呼吸函数: (以o1.mp1,MT6739平台为例) 修改文件: mtk_leds.c(参考路径: /kernel- 4.4/drivers/misc/me ...

  7. MTK led驱动测试 (adb)

    1) MT6370/MT6371上的LED测试 进入对应led的文件中进行(sys/class/leds/ 下面会有对应led结点的文件夹) 闪烁测试需要4步: 1.echo pwm_mode > ...

  8. 【LED子系统深度剖析】七、触发器实现

    个人主页:董哥聊技术 我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强公司! 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 文章目录 1.前言 ...

  9. dev 点击子控件触发panelcontrol事件_LINUX IIO子系统分析之二 IIO子系统数据结构分析...

    上一章我们简要说明了IIO子系统的架构,本章我们通过数据结构的定义,分析IIO子系统的设计实现,本章的主要内容如下: 一.IIO子系统各数据结构说明 二.数据结构间的关联说明 一.IIO子系统各数据结 ...

  10. LINUX IIO子系统分析之二 IIO子系统相关数据结构分析

    上一章我们简要说明了IIO子系统的架构,本章我们通过数据结构的定义,分析IIO子系统的设计实现,本章的主要内容如下: 一.IIO子系统各数据结构说明 二.数据结构间的关联说明 一.IIO子系统各数据结 ...

最新文章

  1. Linux内存管理大图(第三稿)
  2. css3绘制环形_HTML5 + CSS3 gt;gt;gt; 015
  3. 一文读懂深度学习框架下的目标检测(附数据集)
  4. KindEditor富文本编辑器, 从客户端中检测到有潜在危险的 Request.Form 值
  5. 使用 frida+dexdump对apk脱壳
  6. 报表工具实现单据套打
  7. 机器学习集成模型学习——Boosting集成学习(四)
  8. 跨境电商是什么?跨境电商有哪些模式?
  9. 坐火车太无聊,我溜入微软 VS Code官方GitHub仓库,但没敢发动供应链攻击
  10. mysql所有选修课程都及格_Day37:MySQL 数据库 ---(7)
  11. 最常用的PHP正则表达式收集整理
  12. linux 添加raid0驱动,网众linux添加新raid驱动.doc
  13. android dex2oat 编译,dex2oat代码阅读笔记
  14. 鞠今日截语2014.05.11火星合月
  15. 苹果乔布斯的成功启示,看完要被惊醒!
  16. 试题 算法提高 字符串跳步
  17. u盘文件看得见却打不开_u盘文件夹打不开怎么办【图解】
  18. 视频直播APP开发费用多少钱?
  19. java实验:矩形类的定义与封装
  20. 流式布局使用鸿洋大神写的库:com.hyman:flowlayout-lib:1.1.2

热门文章

  1. sd卡烧写linux内核,linux下怎样烧写sd卡
  2. 调用微信扫码接口实现扫一扫功能
  3. F2FS之磁盘NAT和SIT布局及相关函数分析
  4. 易语言excel内容查找助手
  5. 如何成为一个优秀的互联网营销人员?(互联网销售/网络营销职位从菜鸟到大神应该学习的内容)
  6. 苹果真伪查询_二手MacBook Pro Air等苹果笔记本验货 鉴定 基本方法 流程
  7. 在线自定义编辑网络拓扑图
  8. Windows搭建邮件服务器,实现收发邮件(对第三方邮箱,例如QQ邮箱等)
  9. 【蓝牙sbc协议】sbc源码阅读笔记(二)——sbc_struct详解(上)
  10. web绿色服务器单文件,Web个人临时共享服务器