平台: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 呼吸灯流程分析
一.Android呼吸灯Driver实现 1.注册驱动 代码位置:mediatek/kernel/drivers/leds/leds_drv.c 602static struct platform_d ...
- Android呼吸灯效果实现
最近需要做一个搜索动画的呼吸灯效果,在网上查了下有以下两种实现方式,现记录下来. 实现呼吸灯效果本质上都是使用ImageView动画,实现alpha值变化. 第一种方式,直接使用动画实现,代码如下: ...
- MT6753/MT6755 呼吸灯功能添加
利用mtk pmic自带的呼吸灯模式: 主要修改代码: kernel-3.10/drivers/misc/mediatek/leds/mt6755/leds.c int mt_brightness ...
- ZYNQ自定义AXI总线IP应用——PWM实现呼吸灯效果
一.前言 在实时性要求较高的场合中,CPU软件执行的方式显然不能满足需求,这时需要硬件逻辑实现部分功能.要想使自定义IP核被CPU访问,就必须带有总线接口.ZYNQ采用AXI BUS实现PS和PL之间 ...
- 无法开机 如果您的手机黑屏无法开机,可以按照以下方式操作尝试: 如果是,使用原装充电器或使用弱电流方式充电(例如使用电脑USB接口充电)充电15-30分钟后尝试重新开机;注意:电量过低引起的无法开机,刚插入充电器时可能不亮屏但呼吸灯闪烁状态。
https://www.mi.com/service/support/startup 无法开机 如果您的手机黑屏无法开机,可以按照以下方式操作尝试: 技术支持 如何刷机 无法开机 手机自动关机.重启 ...
- Android Studio快速添加Gson以及GsonFormat的使用
目录: 一.Android Studio快速添加Gson 二.Android Studio中GsonFormat的使用 三.在线JSON校验格式化工具 一.Android Studio快速添加Gson ...
- Android.mk中添加宏定义
在Boardconfig.mk 中添加一个 IS_FLAG := true 由于Boardconfig.mk和各目录的Android.mk是相互关联的 所以我们可以在Android.mk 中添加 一个 ...
- Android Studio如何添加override
而Android Studio如何添加呢?方法如下: 右键(或者Alt + Insert) --- Generate... ---- Override Method... 或者 Implement ...
- 解决 Cocos2d-x 中 Android.mk 手动添加源文件
转自:http://blog.csdn.net/ypfsoul/article/details/8909178 Makefile Android.mk 引发的思索 在我们编写 Android 平台 c ...
随机推荐
- 深入理解Java的抽象类和接口
对于面向对象来说,抽象是其重要特征之一.对于之中的抽象类和接口,两者有很多相似的地方,又有两者之间区别的地方. 用几个简单的例子让你快速的理解两者之间的概念和区别 鸣谢 一.抽象类 在了解抽象类之前, ...
- cgdb安装
cgdb官网:http://cgdb.github.io/ 一.cgdb安装 可使用wget命令下载,wget http://cgdb.me/files/cgdb-0.7.0.tar.gz 之后解压 ...
- oracle索引失效情况(转)
1.隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给Orac ...
- Vue项目入门实例
前言 本文记录Vue2.x + Element-UI + TypeScript语法入门实例 为什么要用TypeScript? 1.TypeScript是JavaScript的超集,利用es6语法,实现 ...
- [Luogu P4215] 踩气球 (线段树)
题面 传送门:https://www.luogu.org/problemnew/show/P4215 Solution 这题十分有意思. 首先,我们可以先想想离线做法,因为在线做法可以从离线做法推出. ...
- C++在C的基础上改进了哪些细节
C++ 是在C语言的基础上改进的,C语言的很多语法在 C++ 中依然广泛使用,例如: C++ 仍然使用 char.short.int.long.float.double 等基本数据类型: ...
- Lte Design Documentation之RRC
RRC 特点 RRC模型在模拟器中提供以下功能 生成(在eNB中)和解释(在UE中)信息块(尤其是MIB和SIB1, SIB2) 初始化小区选择 RRC连接建立过程 RRC重新配置程序, 支持以下方式 ...
- JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
HTML代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <l ...
- 为什么大多数IOC容器使用ApplicationContext,而不用BeanFactory
1. 引言 Spring框架附带了两个IOC容器– BeanFactory 和 ApplicationContext. BeanFactory是IOC容器的最基本版本,ApplicationConte ...
- ElementUI表格行编辑单元格编辑支持(输入框,选择框)Demo
嗯,需要做成这个样子,所以网上查了些资料.整理了下.提供几个一个思路.不足之处请小伙伴指出来. 普通版的table可编辑内嵌select选择框,输出框,编辑删除添加等 <!DOCTYPE ht ...