博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android电池驱动【转】
阅读量:6593 次
发布时间:2019-06-24

本文共 3298 字,大约阅读时间需要 10 分钟。

本文转载自:

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

 

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

源代码路径如下:

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

BatteryService中实现了一个UEvent的观察者。ueventLinux内核用来向用户空间主动上报事件的机制,对于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_updatesysfs中读取相关状态。

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相关的ueventbattery driver主要提供具体的电池信息。

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

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

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

你可能感兴趣的文章
Mybatis3.3——源码阅读笔记
查看>>
oracle中的trunc函数操作
查看>>
EventCache表太大, 怎么办?
查看>>
Top 10 mistakes in Eclipse Plug-in Development
查看>>
Directx教程(23) 简单的光照模型(2)
查看>>
Java 并发性和多线程
查看>>
IE6下frameset横向滚动条BUG
查看>>
Python线程专题9:线程终止与挂起、实用工具函数
查看>>
用ASP.NET Core 2.1 建立规范的 REST API -- 翻页/排序/过滤等
查看>>
哈默尔的核心竞争力--《可以量化的管理学》
查看>>
Unity中关于作用力方式ForceMode的功能注解
查看>>
view生命周期的一个找父类的控件的方法
查看>>
物理读之LRU(最近最少被使用)的深入解析
查看>>
写给将要毕业的学弟学妹们的感言
查看>>
mybatis-ehcache 用法配置备忘
查看>>
Python2.7升级到3.0 HTMLTestrunner报错解决方法
查看>>
去掉VS2012中的红色波浪下划线
查看>>
建立Git版本库管理框架例子
查看>>
nginx防止部分DDOS攻击
查看>>
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字......
查看>>