Android 充电LED控制

1、前言

充电LED灯控制是Android设备的基本功能,主要用于提示设备的电池状态,充电状态,满电状态,低电状态,很多手机厂商还使用呼吸效果来显示,普通的低端设备会使用两个LED灯表示,红灯表示充电和低电,绿灯表示满电。

 

之前写的文章 《Android充电系统介绍》

2、kernel 层控制充电LED

代码位置主要在kernel/driver/power/power_supply_leds.c

 

/* Battery specific LEDs triggers. */
static void power_supply_update_bat_leds(struct power_supply *psy)
{union power_supply_propval status;unsigned long delay_on = 0;unsigned long delay_off = 0;if (power_supply_get_property(psy, POWER_SUPPLY_PROP_STATUS, &status))return;dev_dbg(&psy->dev, "%s %d\n", __func__, status.intval);switch (status.intval) {case POWER_SUPPLY_STATUS_FULL:led_trigger_event(psy->charging_full_trig, LED_FULL);led_trigger_event(psy->charging_trig, LED_OFF);led_trigger_event(psy->full_trig, LED_FULL);led_trigger_event(psy->charging_blink_full_solid_trig,LED_FULL);break;case POWER_SUPPLY_STATUS_CHARGING:led_trigger_event(psy->charging_full_trig, LED_FULL);led_trigger_event(psy->charging_trig, LED_FULL);led_trigger_event(psy->full_trig, LED_OFF);led_trigger_blink(psy->charging_blink_full_solid_trig,&delay_on, &delay_off);break;default:led_trigger_event(psy->charging_full_trig, LED_OFF);led_trigger_event(psy->charging_trig, LED_OFF);led_trigger_event(psy->full_trig, LED_OFF);led_trigger_event(psy->charging_blink_full_solid_trig,LED_OFF);break;}
}

 

如果想在kernel 层控制led灯,就需要在这里修改代码,会需要使用到trigger相关的东西,要理解什么是trigger,可以看下面的链接

https://blog.csdn.net/sgmenghuo/article/details/38322141

 

trigger主要是做led灯的一些效果的东西,默认有default-on 对应打开led的trigger,还有none对应关闭LED的trigger。

 

被[ ]括起来的,就是当前trigger的值,然后回触发对应trigger的.activate函数。

Trigger的代码位置在 kernel/drivers/leds/trigger

3、framework控制led灯

为了统一控制led接口,Android有一个自己的框架控制led灯

Framework->Hal->kernel->hardware

设置对应的LED灯颜色主要在

Framework/base/core/res/res/values/config.xml

    <color name="config_defaultNotificationColor">#ffffffff</color><!-- Default LED on time for notification LED in milliseconds. --><integer name="config_defaultNotificationLedOn">500</integer><!-- Default LED off time for notification LED in milliseconds. --><integer name="config_defaultNotificationLedOff">2000</integer><!-- Default value for led color when battery is low on charge --><integer name="config_notificationsBatteryLowARGB">0xFFFF0000</integer>                                            <!-- Default value for led color when battery is medium charged --><integer name="config_notificationsBatteryMediumARGB">0xFFFF0000</integer><!-- Default value for led color when battery is fully charged --><integer name="config_notificationsBatteryFullARGB">0xFF00FF00</integer><!-- Default value for LED on time when the battery is low on charge in miliseconds --><integer name="config_notificationsBatteryLedOn">125</integer>

 

充电状态灯指示状态函数调用

frameworks\base\services\core\java\com\android\server\BatteryService.java

/**
* Synchronize on BatteryService.
*/public void updateLightsLocked() {final int level = mBatteryProps.batteryLevel;final int status = mBatteryProps.batteryStatus;if (level < mLowBatteryWarningLevel) {if (status == BatteryManager.BATTERY_STATUS_CHARGING) {// Solid red when battery is chargingmBatteryLight.setColor(mBatteryLowARGB);} else {// Flash red when battery is low and not chargingmBatteryLight.setFlashing(mBatteryLowARGB, Light.LIGHT_FLASH_TIMED,mBatteryLedOn, mBatteryLedOff);}} else if (status == BatteryManager.BATTERY_STATUS_CHARGING|| status == BatteryManager.BATTERY_STATUS_FULL) {if (status == BatteryManager.BATTERY_STATUS_FULL || level >= 90) {// Solid green when full or charging and nearly fullmBatteryLight.setColor(mBatteryFullARGB);} else {if (isHvdcpPresent()) {// Blinking orange if HVDCP chargermBatteryLight.setFlashing(mBatteryMediumARGB, Light.LIGHT_FLASH_TIMED,mBatteryLedOn, mBatteryLedOn);} else {// Solid orange when charging and halfway fullmBatteryLight.setColor(mBatteryMediumARGB);}}} else {// No lights if not charging and not lowmBatteryLight.turnOff();}}}

 

LightsService 管理LED

frameworks\base\services\core\java\com\android\server\lights\LightsService.java

private void setLightLocked(int color, int mode, int onMS, int offMS, int brightnessMode);{//调用JNI函数设置状态setLight_native(mNativePointer, mId, color, mode, onMS, offMS, brightnessMode);}
static void setLight_native(JNIEnv* /* env */, jobject /* clazz */, jlong ptr,jint light, jint colorARGB, jint flashMode, jint onMS, jint offMS, jint brightnessMode){//调用HAL层接口设置指示灯状态devices->lights[light]->set_light(devices->lights[light], &state);}

 

获取HAL层接口函数

static jlong init_native(JNIEnv* /* env */, jobject /* clazz */){int err;hw_module_t* module;Devices* devices;devices = (Devices*)malloc(sizeof(Devices));err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);if (err == 0) {devices->lights[LIGHT_INDEX_BACKLIGHT] = get_device(module, LIGHT_ID_BACKLIGHT);devices->lights[LIGHT_INDEX_KEYBOARD] = get_device(module, LIGHT_ID_KEYBOARD);devices->lights[LIGHT_INDEX_BUTTONS] = get_device(module, LIGHT_ID_BUTTONS);devices->lights[LIGHT_INDEX_BATTERY] = get_device(module, LIGHT_ID_BATTERY);devices->lights[LIGHT_INDEX_NOTIFICATIONS] = get_device(module, LIGHT_ID_NOTIFICATIONS);devices->lights[LIGHT_INDEX_ATTENTION] = get_device(module, LIGHT_ID_ATTENTION);devices->lights[LIGHT_INDEX_BLUETOOTH] = get_device(module, LIGHT_ID_BLUETOOTH);devices->lights[LIGHT_INDEX_WIFI] = get_device(module, LIGHT_ID_WIFI);} else {memset(devices, 0, sizeof(Devices));}return (jlong)devices;}

 

中间层的代码位置主要在

Hardware/rockchip/liblight/

一个字节对应一种颜色,一共有三个颜色,想最终控制颜色就需要修改上面说的xml文件,比如0x00ffffff,表示红蓝绿三个灯同时亮。具体代码如下

int set_battery_light(struct light_device_t* dev, struct light_state_t const* state)
{                                     int err = 0;                      char red,blue,green;              unsigned int colorRGB = state->color & 0x00ffffff;red = (colorRGB >> 16) & 0xFF; green = (colorRGB >> 8) & 0xFF;                                                                                    blue = colorRGB & 0xFF;           pthread_mutex_lock(&g_lock);   LOGI(">>>weiqifa set_battery_light 0x%x",state->color);err = write_int(RED_LED_PATH, red?1:0);err = write_int(BLUE_LED_PATH, blue?1:0);err = write_int(GREEN_LED_PATH, green?1:0);pthread_mutex_unlock(&g_lock); return 0;                         
}    

 

然后控制的主要是led的设备节点,led的设备节点主要是驱动层生成,代码的位置如下:kernel/driver/leds/

#define RED_LED_PATH "sys/class/leds/red/brightness"
#define GREEN_LED_PATH "sys/class/leds/green/brightness"
#define BLUE_LED_PATH "sys/class/leds/blue/brightness"

 

 

Led驱动对应的dts代码如下:

   leds: gpio-leds {compatible = "gpio-leds";led-green {┊   label = "green";gpios = <&gpio7 8 GPIO_ACTIVE_HIGH>;inux,default-trigger = "timer";default-state = "off";}; led-blue {┊   label = "blue";gpios = <&gpio7 14 GPIO_ACTIVE_HIGH>;inux,default-trigger = "timer";default-state = "off";}; led-red {┊   label = "red";gpios = <&gpio7 15 GPIO_ACTIVE_HIGH>;inux,default-trigger = "timer";                                                                            default-state = "off";};};  

里面的linux,default-trigger 表示默认的trigger模式,如果设置为none就是表示关闭,现在我们的代码设置为timer表示用定时器的模式,实际上我们没有编译定时器模式,所以设置并没有生效。

 

欢迎关注微信公众号-嵌入式Linux

觉得不错,请帮忙转发,点赞,您的每一次支持,我都将铭记于心

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468887.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PyAutoGUI操作指南】04 消息框功能+Question+Waring+Critical+自定义消息框

PyAutoGUI利用PyMsgBox中的消息框函数提供跨平台的纯Python方式来显示JavaScript样式的消息框。 5.1 alert&#xff08;&#xff09; import pyautoguipyautogui.alert(text这里写内容, title通知框标题位置, buttonOK)5.2 confirm() import pyautoguipyautogui.alert(text这…

js 弹出层的点击事件影响到底层的点击事件_聊一聊 Node.js 错误处理

个人博客&#xff1a;https://blog.skrskrskrskr.com错误分类软件程序中&#xff0c;我们可以将错误大致分为外部错误和内部错误两大类。外部错误是正确编写的程序在运行时产生的错误。它并不是程序本身的 bug&#xff0c;更多是一些外部原因导致的问题&#xff0c;比如请求超时…

spring-data-mongodb查询结果返回指定字段

方法1 DBObject dbObject new BasicDBObject(); dbObject.put("status", 1); DBObject fieldObject new BasicDBObject(); fieldObject.put("catalogName", true); fieldObject.put("_id", true); Query query new BasicQuery(dbObject, fiel…

老王带你理解算法复杂度O(1),O(N),O(N^2)

上图对应的是算法复杂度的图片&#xff0c;X轴对应的是n(问题规模)&#xff0c;Y轴对应的是执行的运行时间。 我们先从简单的复杂度解读O(1) 从上面的图片我们可以看到O(1)的复杂度是恒定的&#xff0c;一点波澜都没有&#xff0c;什么是O(1)呢&#xff0c;就比如你是一个酒店…

【PyAutoGUI操作指南】05 屏幕截图与图像定位:截图+定位单个目标+定位全部目标+灰度匹配+像素匹配+获取屏幕截图中像素的RGB颜色

6 屏幕截图与图像定位 PyAutoGUI可以拍摄屏幕截图&#xff0c;将其保存到文件中&#xff0c;并在屏幕中定位图像。OSX使用操作系统附带的screencapture命令。Linux使用scrot命令&#xff0c;可以通过运行sudo-apt-get-install-scrot来安装该命令。 功能介绍&#xff1a;一个需…

C语言-数组a 和a 的区别

面试经典题目 #include "stdio.h"int main() {int a[5] { 1,2,3,4,5 };int *ptr (int *)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));/*getchar是用VS编写方便查看输出*/getchar();return 0; }请思考一下上面的输出结果&#xff0c;如果你非常自…

使用export/import导出和导入docker容器

1、导出容器如果要导出本地某个容器&#xff0c;可以使用 docker export 命令&#xff0c;导出容器快照到本地文件。$ sudo docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAM…

前端为什么有的接口明明是成功回调却执行了.catch失败回调_前端进阶高薪必看-手写源码篇(高频技术点)...

前言此系列作为笔者之前发过的前端高频面试整理的补充 会比较偏向中高前端面试问题 当然大家都是从新手一路走过来的 感兴趣的朋友们都可以看哈初衷我相信不少同学面试的时候最怕的一个环节就是手写代码 大家一定听过这句话talk is cheap, show me the code 没事 此文章不仅包含…

C/C++函数指针与指针函数

前面说的话 面试的时候&#xff0c;经常有面试官问这个问题&#xff0c;在Linux内核里面也是经常被使用的&#xff0c;在看很多大神的代码里面&#xff0c;我们也经常遇到函数指针与指针函数&#xff0c;一样&#xff0c;如果你自己没问题了&#xff0c;就不用往下看了。 定义…

ImportError: TensorBoard logging requires TensorBoard with Python summary writer installed.

Tensorboard原本是Google TensorFlow的可视化工具&#xff0c;可以用于记录训练数据、评估数据、网络结构、图像等&#xff0c;并且可以在web上展示&#xff0c;对于观察神经网络的过程非常有帮助。 项目场景&#xff1a; 突然报如下错误&#xff0c;我以为是环境坏掉了&#…

jsp人事管理系统_Jsp+Ssm+Mysql实现的医院人事管理系统源码附带视频运行教程

项目地址&#xff1a;jspssmmysql实现的医院人事管理系统源码附带视频运行教程|猿来入此【beta】多用户版IT项目教程源码分享网站​www.yuanlrc.com今天给大家演示的是一款由jspssm&#xff08;springspringMVCmybatis&#xff09;实现的医院人事管理系统&#xff0c;系统比较简…

CODVES 5929 亲戚

5929 亲戚 时间限制: 1 s空间限制: 128000 KB题目等级 : 黄金 Gold题目描述 Description若某个家族人员过于庞大&#xff0c;要判断两个是否是亲戚&#xff0c;确实还很不容易&#xff0c;现在给出某个亲戚关系图&#xff0c;求任意给出的两个人是否具有亲戚关系。 规定&#x…

深度学习·理论篇(2023版)·第001篇快速了解人工智能与Pytorch:机器/表示/深度学习定义+端到端的学习+神经网络在计算机视觉应用+深度学习的技术蓝图

💕恭喜本博客浏览量达到两百万,CSDN内容合伙人,CSDN人工智能领域实力新星~ 🧡本文章为2021版本迭代更新版本,在结合有效知识的基础上对文章进行合理的增加,使得整个文章时刻顺应时代需要 🧡本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理进行讲…

linux kernel编译 undefined reference to `__ae

问题代码 ktime_t calltime, delta, rettime;unsigned long long duration;calltime = ktime_get();/*获取当前时间*/ rettime = ktime_get(); /*计算时间差 ktime_sub(A,B) 计算A-B的时间差 返回纳秒*/ delta = ktime_sub(rettime,calltime); /*转换成微秒*/ duration = (unsi…

CodeForces - 796D Police Stations bfs

思路&#xff1a;删除尽量多的边使得所有点都能在限制距离之内到达一个警局&#xff0c;删除边会形成多棵子树&#xff0c;最多只能k棵。其实就是以每个警局为根结点&#xff0c;把整棵树划分为以警局为根结点的k棵树&#xff0c;说明要删除的边的数量就是k-1条&#xff0c;即删…

python中list函数中variables变量_如何在Python中使用变量,浅谈,Pytorch,的,Variable,方法...

Variable的基本概念autograd.Variable 是包的核心类。它包装了张量&#xff0c;并且支持几乎所有的操作。一旦你完成了你的计算&#xff0c; 就可以调用.backward() 方法来自动计算所有的梯度。你还可以通过.data 属性来访问原始的张量&#xff0c;而关于该 variable(变量)的梯…

深度学习·理论篇(2023版)·第002篇深度学习和计算机视觉中的基础数学知识01:线性变换的定义+基于角度的线性变换案例(坐标变换)+点积和投影+矩阵乘法的几何意义+图形化精讲

💕恭喜本博客浏览量达到两百万,CSDN内容合伙人,CSDN人工智能领域实力新星~ 🧡本文章为2021版本迭代更新版本,在结合有效知识的基础上对文章进行合理的增加,使得整个文章时刻顺应时代需要 🧡本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理进行讲…

RK3288/RK3399 CPU定频方法

直接上方法 查看cpu能支持的频率 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies 写入userspace说明要用户设定频率 echo userspace > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor 写入上面列出的cpu频率 echo 1608000 > …

notepad++正则表达式去掉关键字所在行

如下图 1、选择正则表达式 2、选择匹配大小写 3、^(.*)KERNEL(.*)$\n 加上\n就是把去除的行删除&#xff0c;不加就算把删除的行替换为空格

深度学习·理论篇(2023版)·第003篇深度学习和计算机视觉中的基础数学知识02:特征向量和特征值+矩阵乘法的几何意义(2)+奇异值分解+线性可分性和维度+非线性变换

&#x1f495;恭喜本博客浏览量达到两百万&#xff0c;CSDN内容合伙人&#xff0c;CSDN人工智能领域实力新星~ &#x1f9e1;本文章为2021版本迭代更新版本&#xff0c;在结合有效知识的基础上对文章进行合理的增加&#xff0c;使得整个文章时刻顺应时代需要 &#x1f9e1;本…