|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本文介绍两种android底层的电池驱动方式,主要介绍这两种电池的移植和调试方式以及此两种驱动方式的优缺点。后面介绍android上层的电池管理batteryservice.java。
先介绍一下,android电池管理框架:
android电池管理框架图
由上图可以看出,android的电池管理主要是由两个部分构成,linux kernel部分和android部分。
Android的上层有一batteryservice.java,主要任务是监听kernel电池的上报事件和调用JNI接口访问kernel更新的电池信息,以及以广播形式发送电池信息。Com_android_server_BatteryService.cpp android电池管理访问kernel电池的接口。当kernel上报电池事件时,将触发batteryservice.java调用Com_android_server_BatteryService.cpp的接口,访问kernel电池信息。
下面先介绍kernel部分的两种驱动方式。
第一种,求平均法。
例子:本驱动的驱动流程和源码,目前应用在三星平台,源码位于…/drivers/urbetter/battery.c。驱动流程如下:
电池驱动流程图
这里主要说说在移植和调试的时候需要注意的问题。本人觉得最大的一个亮点是比较好调试。驱动中,将ADC电压采集的值通过校准的方式与电池实际测量电压相匹配靠拢。然后再利用求和平均的方法找出电池的电量。通过对电量的平滑处理,最终留给上层app获取。
移植和调试中需要注意的问题:1 硬件调试。
1, ADC采集通道,本例采用channel 0;通过该函数s3c_adc_register(battery_dev,NULL,NULL,0);注册ADC采样。2, ADC基准电压,本例的基准电压为1.8v(1800MV)用来修改BATTERY_ADC_VREF宏。这个根据不同平台的电压修改。
3, ADC采集电平转换成battery电压,battery的1/3电平。目前这个参数是用在计算出实际battery的电压时候,根据四季电路修改。4, 其他GPIO的修改,根据实际电路设计:POWER_STATE_CHARGE、POWER_STATE_AC。
2 软件调试,更换电池盒兼容机型。做一些ADC采样值得校准都在poll_adc_raw函数内进行。具体的校准值要以实际调试为准。 此例子在补偿ADC采样后,采用ADC平均值法,对照电压-电量表,计算出单曲电量值(d_vol=table[i+1].vol – table.vol;d_cap=table[i+1].cap – table.cap;percent=table.cap+(voltage-table.vol)*d_cap/d_vol;),让上报的电池电量值更加贴近真实值。为了解决电压的突然增大后迅速减小,造成电量误报的情况,采用电量的平滑处理,具体做法是累加16次采集的电池电量然后求平均值(具体表现在睡眠后唤醒)。
以上为第一种求平均值的电池驱动方式,移植和调试的加班要点以上都基本提到了,但在实际的调用中,还要记录ADC的采样值,做好曲线的不同阶段的补偿好玩校准。本驱动的代码实现流程如下:
驱动代码实现流程图
以上是android电池管理的第一种方法。
|
|