本文转载自:http://blog.sina.com.cn/s/blog_66a6a5ec0100n6ej.html

Android的电池的管理分为三个部分:Java部分,JNI部分以及kenel部分。

1.Java部分主要是BatteryService,作为电池及充电相关的服务,它的主要功能就是监听power_supply的uenvnt事件,读取sysfs中电池信息,然后通过intent广播给所有相关Activity。

源代码路径如下:

android_froyo/frameworks/base/services/java/com/android/server/BatteryService.java

BatteryService中实现了一个UEvent的观察者。uevent是Linux内核用来向用户空间主动上报事件的机制,对于JAVA程序来说,只实现UEventObserver的虚函数onUEvent,然后注册即可。

private UEventObserver mUEventObserver = new UEventObserver() {
        @Override
        public void onUEvent(UEventObserver.UEvent event) {
            update();
        }
    };
这里只关注power_supply的事件:
mUEventObserver.startObserving("SUBSYSTEM=power_supply");
当有power_supply相关的事件上报时,就会调用update函数。
update先调用native_update从sysfs中读取相关状态。

update然后根据读到的状态更新BatteryService的成员变量,并广播一个Intent来通知其它关注电源状态的组件。

private final void sendIntent() {
        //  Pack up the values and broadcast them to everyone
        Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
        intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
        try {
            mBatteryStats.setOnBattery(mPlugType == BATTERY_PLUGGED_NONE, mBatteryLevel);
        } catch (RemoteException e) {
            // Should never happen.
        }
        int icon = getIcon(mBatteryLevel);
        intent.putExtra("status", mBatteryStatus);
        intent.putExtra("health", mBatteryHealth);
        intent.putExtra("present", mBatteryPresent);
        intent.putExtra("level", mBatteryLevel);

...........
        ActivityManagerNative.broadcastStickyIntent(intent, null);
    }

2.JNI部分提供接口给上层的 battery_service.java 调用,直接读取设备文件,取得信息后,用来更新battery状态。源代码路径如下:

android_froyo/frameworks/base/services/jni/com_android_server_BatteryService.cpp

com_android_server_BatteryService.cpp中主要实现了android_server_BatteryService_update函数,即Java层的BatteryService中调用的native_update函数,它直接读取设备文件。

static void android_server_BatteryService_update(JNIEnv* env, jobject obj)

{

setBooleanField(env, obj, gPaths.acOnlinePath, gFieldIds.mAcOnline);

...............

const int SIZE = 128;

char buf[SIZE];

if (readFromFile(gPaths.batteryStatusPath, buf, SIZE) > 0)

env->SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));

else

env->SetIntField(obj, gFieldIds.mBatteryStatus,

gConstants.statusUnknown);

if (readFromFile(gPaths.batteryHealthPath, buf, SIZE) > 0)

env->SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));

if (readFromFile(gPaths.batteryTechnologyPath, buf, SIZE) > 0)

env->SetObjectField(obj, gFieldIds.mBatteryTechnology, env->NewStringUTF(buf));

}

static JNINativeMethod sMethods[] = {

{"native_update", "()V", (void*)android_server_BatteryService_update},

};

3.kernel部分又可分为两部分:power_supply_core以及具体芯片的battery driver。

power_supply_core部分的源代码路径:

trunk/android_froyo/kernel/common/drivers/power/power_supply_core.c
trunk/android_froyo/kernel/common/drivers/power/power_supply_sysfs.c

battery driver(bq27541)部分的源代码路径:

android_froyo/kernel/common/drivers/power/bq27x00_battery.c

power_supply_core主要提供统一设备文件的创建以及发送power_supply相关的uevent;battery driver主要提供具体的电池信息。

以bq27541电池芯片为例,首先要注册i2c驱动,在zylonite_pxa300.c文件中声明bq27541芯片的type以及i2c地址,使用i2c_add_driver(&bq27x00_battery_driver)注册驱动时会调用bq27x00_battery_probe函数,该函数中完成i2c设备的探测,充放电中断的申请以及设备文件的创建。

每当产生充放电中断时,驱动会调用中断函数ext_power_isr,该函数调用power_supply_core的power_supply_changed(&(di->bat))函数,发送一个power_supply属性的uevent,Java层的BatteryService接收到该事件后就会调用JNI层的native_update函数来获得电池信息,然后通过intent广播给相应的activity。

由于电池电量变化时不能产生中断来通知上层读取电池信息,所以设置了一个定时器,每隔30s发送一个uevent事件让BatteryService来读取电池信息是否有变化。

转载于:https://www.cnblogs.com/zzb-Dream-90Time/p/6556168.html

Android电池驱动【转】相关推荐

  1. Android电池驱动

    学习要点:1.电池驱动的架构: 2.电池电压的获取,百分比的转换(包括不同用电情况下的分析): 3.充电管理: 当我们要写一个驱动的时候,首先要知道内核提供给驱动的接口,就是当驱动挂载到内核上的时候, ...

  2. 【转】android电池(四):电池 电量计(MAX17040)驱动分析篇

    关键词:android 电池  电量计  MAX17040 任务初始化宏 power_supply 平台信息: 内核:linux2.6/linux3.0 系统:android/android4.0  ...

  3. android电池(五):电池 充电IC(PM2301)驱动分析篇

    android电池(五):电池 充电IC(PM2301)驱动分析篇 关键词:android 电池  电量计  PL2301任务初始化宏 power_supply 中断线程化 平台信息: 内核:linu ...

  4. android 电池(三):android电池系统

    android 电池(三):android电池系统 关键词:android电池系统电池系统架构 uevent power_supply驱动 平台信息: 内核:linux2.6/linux3.0 系统: ...

  5. android 电池(一):锂电池基本原理篇 .

    http://blog.csdn.net/xubin341719/article/details/8497830 关键词:android  电池关机充电 androidboot.mode charge ...

  6. Android 电池管理

    Android4.4电池管理 一.概述 Android4.4的电池管理功能用于管理电池的充.放电功能.整个电池管理的部分包括Linux电池驱动.Android电池服务.电池属性和参数.电池曲线优化四个 ...

  7. android 电池(一):锂电池基本原理篇

    关键词:android  电池关机充电 androidboot.mode charger 平台信息: 内核:linux2.6/linux3.0 系统:android/android4.0  平台:S5 ...

  8. android电池管理软件,Android实现电池管理系统

    一.Android 电池服务 Android电池服务,用来监听内核上报的电池事件,并将最新的电池数据上报给系统,系统收到新数据后会去更新电池显示状态.剩余电量等信息.如果收到过温报警和低电报警,系统会 ...

  9. Android 电池管理系统

    一.Android 电池服务 Android电池服务,用来监听内核上报的电池事件,并将最新的电池数据上报给系统,系统收到新数据后会去更新电池显示状态.剩余电量等信息.如果收到过温报警和低电报警,系统会 ...

  10. Android电池管理系统框架整理

    一.Android 电池服务 Android电池服务,用来监听内核上报的电池事件,并将最新的电池数据上报给系统,系统收到新数据后会去更新电池显示状态.剩余电量等信息.如果收到过温报警和低电报警,系统会 ...

最新文章

  1. 企业网远程协助的小能手
  2. CIKM 2020 | 知识库问答复杂问题的分层查询图生成方法
  3. 前端开发中如何将文件夹中的图片变为背景图_Web中的图像技术全面总结,长文干货!...
  4. Win7 格式化U盘
  5. windows录屏_ApowerREC for Mac(屏幕录屏工具) V1.2.7.10激活版
  6. 一天学会php(下)
  7. andoridstudio run图标是灰色两步解决
  8. NetBSD Make源代码阅读二:链表之创建与销毁
  9. Chrome 新功能:因更新或崩溃而重启后,PWA应用将自动恢复运行!
  10. editplus php格式化,让Editplus自动格式化css和js
  11. 华为服务器找不到阵列卡_DELL R730服务器配置RAID及安装服务器系统
  12. 腾讯云公网IP网络带宽收费价格表2023更新
  13. LeetCode——自除数
  14. JWT最全知识点-动力节点
  15. 转:旅游推荐系统的演进
  16. python中exception方法_python中try except处理程序异常的三种常用方法
  17. 含文档+PPT+源码等]精品基于Uniapp实现的Android的餐饮管理系统实现的App[包运行成功]计算机毕业设计安卓项目源码
  18. 电子学报、计算机研究与发展中文期刊投稿过程记录
  19. 国内外经典开源数据大全!
  20. 兰州大学hdtv列表文件 python 自动生成脚本

热门文章

  1. 错过了蓝月亮,你还有我们~~只此一次!
  2. python+Selenium之操作滚动条
  3. Redis数据类型SortedSET
  4. js关于两个字符串的加减乘除运算
  5. (转载)make的-j命令(加速Linux程序编译)
  6. 无敌打印(适用各种浏览器自带打印功能)
  7. border做三角符号
  8. buffer正确的拼接方式
  9. eclipse与myeclipse恢复已删除的文件和代码
  10. Deepin-15.10-custom-LiveCD 定制版本已经发布