平台:mtk
一.hal层入口
   Lights.c (vendor\mediatek\proprietary\hardware\liblights)
    char const*const RED_LED_FILE = "/sys/class/leds/red/brightness";
    char const*const RED_DELAY_ON_FILE  = "/sys/class/leds/red/delay_on";
    char const*const RED_DELAY_OFF_FILE = "/sys/class/leds/red/delay_off";
   中间层调用open_lights
          else if (0 == strcmp(LIGHT_ID_NOTIFICATIONS, name)) {  //这里有很多种灯的情况,我们就分析提示的
            set_light = set_light_notifications;
        }
            set_light_notifications
              handle_speaker_battery_locked(dev);
                set_speaker_light_locked(dev, &g_battery); //电池提示
                set_speaker_light_locked(dev, &g_notification); //消息提示
                    blink_red(red, onMS, offMS); //这里有green,red,blue的分支,我们分析red
                        write_str(RED_TRIGGER_FILE, "timer"); //写入timer
                        write_int(RED_DELAY_OFF_FILE, offMS); //生成delay_off节点并写入,在电量低的时候
        write_int(RED_DELAY_ON_FILE, onMS);  //生成delay_on节点并写入,在电量低的时候
 
二.kernel LEDS架构
 1.Cust_leds.c (kernel-3.10\drivers\misc\mediatek\mach\mt6735\ck3_01\leds\mt65xx)
    static struct cust_mt65xx_led cust_led_list[MT65XX_LED_TYPE_TOTAL] = {
        {"red",               MT65XX_LED_MODE_CUST, 1, {0}},
        {"green",             MT65XX_LED_MODE_CUST, 2, {0}},
    }
    struct cust_mt65xx_led *get_cust_led_list(void) //获得这个custom
    {
return cust_led_list;
    }
 
2.Leds.c (kernel-3.10\drivers\misc\mediatek\leds\mt6735)
    struct cust_mt65xx_led * mt_get_cust_led_list(void)
    {
return get_cust_led_list();
    }
 
 3.Leds_drv.c (kernel-3.10\drivers\misc\mediatek\leds)  //mtk里面leds的核心
    mt65xx_leds_probe
        cust_led_list = mt_get_cust_led_list(); //得到所有的led
        g_leds_data[i]->cdev.name = cust_led_list[i].name;  //记录名字
        g_leds_data[i]->cdev.brightness_set = mt65xx_led_set;   //设置相关的操作函数
        g_leds_data[i]->cdev.blink_set = mt65xx_blink_set;   //设置相关的操作函数
        ret = led_classdev_register(&pdev->dev, &g_leds_data[i]->cdev); //注册leds到核心
 
4.Led-class.c (kernel-3.10\drivers\leds)
    led_classdev_register
        led_cdev->dev = device_create(leds_class, parent, 0, led_cdev, "%s", led_cdev->name);  //在sys/leds/生成相应的节点
        list_add_tail(&led_cdev->node, &leds_list); //加入到leds_list
        INIT_WORK(&led_cdev->set_brightness_work, set_brightness_delayed);  //初始化
init_timer(&led_cdev->blink_timer);
led_cdev->blink_timer.function = led_timer_function;  //timer
led_cdev->blink_timer.data = (unsigned long)led_cdev;  //timer
            led_trigger_set_default //加入到trigger
                
 
        led_brightness_store //给上层调节亮度的接口
            __led_set_brightness
                led_cdev->brightness_set(led_cdev, value); //调用相应的设备的brightness_set,这里是Leds_drv.c中的mt65xx_led_set函数
                    mt65xx_led_set
                        mt_mt65xx_led_set(led_cdev, level);
                            mt_mt65xx_led_set_cust(&led_data->cust, level);
                                switch (cust->mode) //对不同模式调用不同函数
                                    case MT65XX_LED_MODE_CUST: 这种模式
                                        1 == cust->data //这个私有数据
 
        
        led_trigger_store  //给上层trigger的接口,用于呼吸灯
            list_for_each_entry(trig, &trigger_list, next_trig)  //遍历trigger_list,找不到相应的
                led_trigger_set(led_cdev, trig);  //调用这个函数
                    trig->activate(led_cdev); //这个函数在Ledtrig-timer.c (kernel-3.10\drivers\leds\trigger)中初始化.activate = timer_trig_activate, deactivate = timer_trig_deactivate,
                        timer_trig_activate
                            rc = device_create_file(led_cdev->dev, &dev_attr_delay_on); //创建"/sys/class/leds/red/delay_on";节点
                            rc = device_create_file(led_cdev->dev, &dev_attr_delay_off); //创建"/sys/class/leds/red/delay_off";节点
                            led_blink_set(led_cdev, &led_cdev->blink_delay_on, &led_cdev->blink_delay_off); //调用相应接口
                                led_blink_setup(led_cdev, delay_on, delay_off);
                                    led_cdev->blink_set(led_cdev, delay_on, delay_off) //执行这个//调用相应的设备的brightness_set,这里是Leds_drv.c中的mt65xx_blink_set函数
                                        mt_mt65xx_blink_set
                                            else if(led_data->cust.mode == MT65XX_LED_MODE_CUST) //对应的模式
                    if (1 == led_data->cust.data)  //对应的私有变量
                                led_set_software_blink(led_cdev, *delay_on, *delay_off); //如果前面if (!(led_cdev->flags & LED_BLINK_ONESHOT) && led_cdev->blink_set &&  !led_cdev->blink_set(led_cdev, delay_on, delay_off))
             不成立就调用这个函数
                                    __led_set_brightness(led_cdev, led_cdev->blink_brightness); //设置亮度函数
                                    mod_timer(&led_cdev->blink_timer, jiffies + 1); //重复点亮熄灭
 
         led_delay_off_store
            led_blink_set(led_cdev, &led_cdev->blink_delay_on, &state);
                led_blink_setup(led_cdev, delay_on, delay_off);
                         与led_trigger_store的led_blink_setup 一样
    
        led_delay_on_store
            与led_delay_off_store差不多
 
四.呼吸灯驱动
 
 
  1.在drivers/misc/mediatek/mach/mt6735/CK3_01/core/board.c中的mt_power_off函数中
     加上ktd2xx_led_off();
    如果不加上会在关机充电的时候拔出充电器,led还是亮着的。
   
 

Android呼吸灯添加的更多相关文章

  1. Android 呼吸灯流程分析

    一.Android呼吸灯Driver实现 1.注册驱动 代码位置:mediatek/kernel/drivers/leds/leds_drv.c 602static struct platform_d ...

  2. Android呼吸灯效果实现

    最近需要做一个搜索动画的呼吸灯效果,在网上查了下有以下两种实现方式,现记录下来. 实现呼吸灯效果本质上都是使用ImageView动画,实现alpha值变化. 第一种方式,直接使用动画实现,代码如下: ...

  3. MT6753/MT6755 呼吸灯功能添加

    利用mtk pmic自带的呼吸灯模式: 主要修改代码: kernel-3.10/drivers/misc/mediatek/leds/mt6755/leds.c   int mt_brightness ...

  4. ZYNQ自定义AXI总线IP应用——PWM实现呼吸灯效果

    一.前言 在实时性要求较高的场合中,CPU软件执行的方式显然不能满足需求,这时需要硬件逻辑实现部分功能.要想使自定义IP核被CPU访问,就必须带有总线接口.ZYNQ采用AXI BUS实现PS和PL之间 ...

  5. 无法开机 如果您的手机黑屏无法开机,可以按照以下方式操作尝试: 如果是,使用原装充电器或使用弱电流方式充电(例如使用电脑USB接口充电)充电15-30分钟后尝试重新开机;注意:电量过低引起的无法开机,刚插入充电器时可能不亮屏但呼吸灯闪烁状态。

    https://www.mi.com/service/support/startup 无法开机 如果您的手机黑屏无法开机,可以按照以下方式操作尝试: 技术支持 如何刷机 无法开机 手机自动关机.重启 ...

  6. Android Studio快速添加Gson以及GsonFormat的使用

    目录: 一.Android Studio快速添加Gson 二.Android Studio中GsonFormat的使用 三.在线JSON校验格式化工具 一.Android Studio快速添加Gson ...

  7. Android.mk中添加宏定义

    在Boardconfig.mk 中添加一个 IS_FLAG := true 由于Boardconfig.mk和各目录的Android.mk是相互关联的 所以我们可以在Android.mk 中添加 一个 ...

  8. Android Studio如何添加override

    而Android Studio如何添加呢?方法如下: 右键(或者Alt + Insert) ---  Generate... ---- Override Method...  或者 Implement ...

  9. 解决 Cocos2d-x 中 Android.mk 手动添加源文件

    转自:http://blog.csdn.net/ypfsoul/article/details/8909178 Makefile Android.mk 引发的思索 在我们编写 Android 平台 c ...

随机推荐

  1. JS错误写法[清除DOM]

    前言 我现在总结一下我之前敲代码犯的错误,清除DOM元素,我们开始写代码吧! HTML <h1 style="font-size: 18px;font-weight: bold;col ...

  2. 微信小程序学习心得

    我们写小程序时都要跳转页面的,也会有底部导航来进行切换 这个时候就要介绍下窗口是怎样配置的 要在app.json文件里写一个tabBer对象 里面在定义一个list数组里面放我们定义的几个需要切换的页 ...

  3. CSS选择器的关系

    .selector > box 的使用 该方式,只会选择其第一级子盒子 .selector + box 的使用 除了其本身,选择其兄弟盒子,但会受到其他元素的影响,如在兄弟间添加其他元素,则无法 ...

  4. python识别视频黑屏或者低清晰度

    第一步:获取视频第一帧图片 https://www.cnblogs.com/pythonywy/p/13749735.html 第二步:进行识别 import os import numpy as n ...

  5. javascript模块化(简)

    这里书写一个个人理解以及整理的东西,关于模块化以及ES6语法推荐大家阅读阮一峰老师的ES6入门教程 地址:https://es6.ruanyifeng.com/ 比较散,请见谅 以前的js是没有模块化 ...

  6. 基于Python与命令行人脸识别项目(系列二)

    接着系统一,继续开始我们face_recognition. Python 模块:face_recognition 在Python中,你可以导入face_recognition模块,调用丰富的API接口 ...

  7. LC滤波器简单设计法 - 一文读懂LC滤波器简单设计方法及原理介绍,LC值计算方法

    LC滤波器概述 LC滤波器也称为无源滤波器,是传统的谐波补偿装置.LC滤波器之所以称为无源滤波器,顾名思义,就是该装置不需要额外提供电源.LC滤波器一般是由滤波电容器.电抗器和电阻器适当组合而成,与谐 ...

  8. kubectl命令小妙招

    kubectl命令使用大全   中文: http://docs.kubernetes.org.cn/683.html [root@master-test ~]# kubectl --help kube ...

  9. C# NModbus RTU通信实现

    Modbus协议时应用于电子控制器上的一种通用语言.通过此协议,控制器相互之间.控制器经由网络/串口和其它设备之间可以进行通信.它已经成为了一种工业标准.有了这个通信协议,不同的厂商生成的控制设备就可 ...

  10. 1.DRF初始化

    1.DRF框架的8个核心功能   1.认证(用户登录校验用户名密码或者token是否合法) 2.权限(根据不同的用户角色,可以操作不同的表) 3.限流(限制接口访问速度) 4.序列化(返回json) ...