ls1105
驱动牛犊
驱动牛犊
  • 注册日期2012-08-15
  • 最后登录2014-03-25
  • 粉丝0
  • 关注1
  • 积分25分
  • 威望61点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1307回复:1

深圳荣品开发板告诉你一般的 Android电池管理①

楼主#
更多 发布于:2013-12-16 15:39

本文介绍两种android底层的电池驱动方式,介绍这两种电池的移植和调试方式以及此两种驱动方式的优缺点。后面介绍android上层的电池管理batteryservice.java
先介绍一下,android电池管理框架

描述:android电池管理框架图

图片:M9FYDE`DP]LEUAMHELE$QEX.jpg

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。驱动流程如下:

描述:android电池驱动流程图

图片:I0`{S2BNQ@B9$2{@Q34M8TI.jpg

android电池驱动流程图


这里主要说说在移植和调试的时候需要注意的问题。
本人觉得最大的一个亮点是比较好调试。驱动中,将ADC电压采集的值通过校准的方式与电池实际测量电压相匹配靠拢。然后再利用求和平均的方法找出电池的电量。通过对电量的平滑处理,最终留给上层app获取。
移植和调试中需要注意的问题:
1 硬件调试。
1,          ADC采集通道,本例采用channel 0;通过该函数s3c_adc_register(battery_dev,NULL,NULL,0);注册ADC采样。
2,          ADC基准电压,本例的基准电压为1.8v1800MV)用来修改BATTERY_ADC_VREF宏。这个根据不同平台的电压修改。
3,          ADC采集电平转换成battery电压,battery1/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的采样值,做好曲线的不同阶段的补偿好玩校准。
本驱动的代码实现流程如下:

描述:代码实现流程图

图片:T5VZBFWO6WU}(HLPQ{LLMYT.jpg

代码实现流程图

这就是android电池管理的第一种。






 
 







ls1105
驱动牛犊
驱动牛犊
  • 注册日期2012-08-15
  • 最后登录2014-03-25
  • 粉丝0
  • 关注1
  • 积分25分
  • 威望61点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2013-12-30 15:00
怎么感觉大家都没有激情啊。⊙﹏⊙b汗
游客

返回顶部