关于Android电池管理系统(一)Linux驱动部分

一、概述

android系统电池部分的驱动程序,继承了传统linux系统下的Power Supply驱动程序架构,Battery驱动程序通过Power Supply驱动程序生成相应的sys文件系统,从而向用户空间提供电池各种属性的接口。Linux标准的
Power Supply驱动程序所使用的文件系统路径为:/sys/class/power_supply ,其中的每个子目录表示一种能源供应设备。

二、驱动头文件

Power Supply驱动程序头文件kernel/include/linux/power_supply.h,注册和注销驱动程序的函数如下:

intpower_supply_register(struct device *parent,struct power_supply *psy);

voidpower_supply_unregister(struct power_supply *psy);

structpower_supply {

constchar *name; /*设备名称*/

enumpower_supply_type type; /* 类型 */

enumpower_supply_property *properties; /* 属性指针 */

size_tnum_properties; /*属性的数目*/

char**supplied_to;

size_tnum_supplicants;

int(*get_property)(struct power_supply *psy, /*获得属性*/

enumpower_supply_property psp,

unionpower_supply_propval *val);

void(*external_power_changed)(struct power_supply *psy);

/* ...... 省略部分内容 */

};

三、power supply core

对应的驱动程序:power_supply

来看看power_supply_sysfs.c这个文件。这里主要是对诸如如下这些电源设备属性创建uevent!

这些uevent节点不一定都会创建,节点创建与否还和具体的电源设备驱动传进来的num_properties和properties有关,在创建uevent函数power_supply_uevent中可以很容易的看出这一点:

四、battery driver

目前项目(T808、T828)中所使用的电池检测与管理方式是POC ADC方式,对应的驱动文件是:

mediatek/kernel/drivers/power/battery_common.c

在此文件的probe函数里有如下内容:

可以看出,在这里将ac、usb及battery三种电源供应设备注册到了power supply core中去了,而相应的全局结构体变量ac_main、usb_main及battery_main作了如下定义:

各个电源设备所需要创建的uevent节点由这里传入的xx_props决定,相应的定义如下:

可发现:ac和usb只创建了一个online属性,上层app通过判断ac和usb的online状态便可知道当前系统是由什么设备在充电了;而battery则创建了如:status、health、present、capacity、batt_vol等等和电池相关的诸多属性,上层app通过这些电池属性uevent便可监控电池的当前工作状态了。

举例说明一下这些属性的状态改变后是如何向系统发送更新消息的,来看看ac online的状态更新。

该函数在power supply sysfs中show property的时候得到调用,而AC_ONLINE作为ac电源唯一的属性会在ac_update中得到更新:

ac_update则最终会在bat_thread_kthread中进行轮循,在这里有一个全局的BMT_status,作为整个电源供应设备的各种属性传达!另外再来看看CHARGING_CONTROL battery_charging_control这个全局的函数指针,原型定义如下:

chr_control_interface函数原型如下:

对应文件路径:

mediatek/platform/mt6572/kernel/drivers/power/charging_hw_pmic.c

charging_func函数指针数组定义如下:

可以看出通过如下的调用关系:

最终会调用到由:

这些枚举类型所一一对应的函数中去,如上面调用关系CHARGING_CMD_GET_CHARGER_TYPE,则是获取charger type,函数原型如下:

在这里通过pmic的硬件状态来获取相应的信息。

五、充电误差纠正

理想中的电池是没有内阻的,电池电压的消耗都在外部的负载上。

但实际情况却不是这样的,正由于电池内阻的存在,通过直接测量电池电压(ADC)的方式获得的电池电量都会存在一定的误差,不管电池是处于供电还是放电的状态,这种误差都会存在,特别是在电池电量满、电池电量空及关机充电的情况下这种误差很容易被用户察觉,从而带来不好的用户体验。

那么针对电池内阻导致的这个误差,完全可以通过数学方式进行纠正。

通过上图可知,只要知道了电池内阻,就可以很容易地纠正这种误差。但电池的内阻不是不变的,而是随着电池电量的变化而变化的,不同型号的电池,这种特性还不一样,那么要想得到比较准确的电池电量,就很有必要让电池厂提供一组完整的电池电压与电池内阻的关系表了!

充放电过程中误差的纠正代码:

mediatek/kernel/drivers/power/battery_meter.c

在oam_run中有如下代码:

函数mtk_imp_tracking就是针对充放电过程中电池内阻所产生的压降所作的一个△V的修正。

另外一个是,由于电池特性,在开关机的时候会出现电量跳变的问题,在系统中采用了将关机时的UI电量保存到RTC中,在下次开机的过程中用实际检测到的电量值与保存到RTC中的UI电量值进行比较判断,由于用户可能会更换电池,这两者之间的差值控制在了20%的范围内,也就是说:实际检测到的电量值在RTC中保存的UI电量值的20%范围内则使用保存在RTC中的UI电量值作为当前电池的电量值;如果实际检测到的电量值超过了RTC中UI电量值的20%,则认为用户更换了电池,用实际检测到的电量值作为当前电池的电量值。

相应的判断代码如下:

在头文件:

mediate/custiom/mt6572/kernel/battery/battery/cust_battery_meter.h

中有如下定义

各能源设备属性概况如下:

/sys/class/power_supply/ac/online AC 电源连接状态

/sys/class/power_supply/usb/online USB电源连接状态

/sys/class/power_supply/battery/status 充电状态

/sys/class/power_supply/battery/health 电池状态

/sys/class/power_supply/battery/present 使用状态

/sys/class/power_supply/battery/capacity 电池 level

/sys/class/power_supply/battery/batt_vol 电池电压

/sys/class/power_supply/battery/batt_temp 电池温度

/sys/class/power_supply/battery/technology 电池技术

当供电设备的状态发生变化时,driver会更新这些文件

时间: 2024-10-11 07:55:32

关于Android电池管理系统(一)Linux驱动部分的相关文章

android应用程序访问linux驱动第一步:实现并测试Linux驱动

一直都想亲自做一次使用android应用程序访问Linux内核驱动的尝试,但总是没能做到.最近抽出时间,下决心重新尝试一次.尝试的开始当然是先写一个Linux内核驱动了. 我希望写一个简单测驱动程序,实现写一个字符串进去,然后再把它读出来的功能.驱动中会创建dev/hello设备节点和/sys/class/hello/hello/val 设备节点,没有实现proc/下的对应的设备节点./sys/class/hello/hello/val 主要用于快速测试,而dev/hello则主要用于供上层应用

android电池管理系统从上层的java到底层驱动的调用(转载)

1.概述 随着移动智能设备的快速发屏,电池的续航能力在很大情况下诱导了大众消费者的购买选择,android系统对电源管理的合理与否直接影响到电池的续航能力,而电池系统作为其中的一部分,主要用于对电池状态的监控(电池电量.电池状态及电池温度等).下面将详细分析android的电池系统架构. 2.Android电池系统架构 Android系统中对电池的管理驱动层继承了linux下的power supply class,而在用户层则是在BatteryService.java中通过广播的方式将如下一些电

android电池管理系统

原文:http://www.2cto.com/kf/201408/326462.html 1.概述 随着移动智能设备的快速发屏,电池的续航能力在很大情况下诱导了大众消费者的购买选择,android系统对电源管理的合理与否直接影响到电池的续航能力,而电池系统作为其中的一部分,主要用于对电池状态的监控(电池电量.电池状态及电池温度等).下面将详细分析android的电池系统架构. 2.Android电池系统架构 Android系统中对电池的管理驱动层继承了linux下的power supply cl

Android深度探索与HAL驱动开发(卷1)-- 第九章随笔

第9章 硬件抽象层:HAL Hal(Hardware Abstract Layer,硬件抽象层)是建立在Linux驱动之上的一套程序库.这套程序库并不属于Linux内核,而是属于Linux内核层之上的应用层. 编写支持HAL的Linux驱动程序的步骤: 第一步:编写Linux驱动 第二步:编写HAL Library 第三步:编写 Service Library 编写HAL 模块的步骤和原理如下: 第一步:定义结构体和宏 第二步:编写HAL模块的open函数 第三步:定义hw_module_met

Android深度探索--HAL与驱动开发第一章读后感

第一章:Android系统移植与驱动开发概述 第一章其实就是对安卓与Linux驱动做了一个总体的介绍. 现如今,Android已经成为现在智能手机操作系统的老大,市场占有率已经远远超过iOS,主要的原因主要在于Android的可移植,所有人都可以利用Android的源代码制作属于自己的系统,而且Android的体系结构也近乎完美.但在移植过程中进行最多开发的就是支持各种硬件设备Linux的驱动程序,所以讲移植必定先讲Liunx驱动开发. Android的体系结构主要由Linux内核.C/C++代

Android深度探索HAL与驱动开发-——第9章

第九章:   只要讲的是硬件抽象层HAL,HAL是建立在Linux驱动上的一套程序库.HAL不是Linux内核的一部分而是位于Android的系统运行库层.首先讲的是要加入HAL的好处.包括:统一硬件的调用借口.解决GPL版权问题.针对一些特殊的要求.HAL架构的基本原理是在Android系统中使用程序库调用位于内核空间的Linux驱动,然后Android应用程序可通过NDK程序访问HAL中的程序库,或直接在Android应用程序中访问HAL中的程序库.android HAL的源代码存储的位置并

第六章——使用实例来理解Linux驱动开发及心得

在这一章中主要介绍了一个Linux驱动程序,以实战的方式向我们介绍了一个Linux驱动程序的例子. Linux驱动的工作和访问方式是Linux的亮点之一,同时受到了业界的广泛好评. Linux系统 将每一个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目录中.这种 设计理念使得与Linux驱动进行交互就像与普通文件进行交互一样容易.当然,也比访问LinuxAPI 更容易. 由于大多数Linux驱动都有与其对应的设备文件, 因此与Linux驱动交换数据就变成了与 设备文件交

Android深度探索HAL与驱动开发 第四章

Android深度探索HAL与驱动开发 第四章 源代码的下载和编译 读书笔记 一.下载编译和测试Android源代码 1.配置Android源代码下载环境 创建一个用于存放下载脚本文件的目录(可将该文件放到任何一个目录在这里使用-/bin) # mkdir ~/bin # PATH=~/bin:$PATH 2.下载repo脚本文件(用于下载Android源代码) # curl htttps://dl-ssl.google.com/dl/googlesource/git-repo/repo> ~/

Linux驱动经典面试题目

1.  linux驱动分类 2.  信号量与自旋锁 3.  platform总线设备及总线设备如何编写 4.  kmalloc和vmalloc的区别 5.  module_init的级别 6.  添加驱动 7.  IIC原理,总线框架,设备编写方法,i2c_msg 8.  kernel panic 9.  USB总线,USB传输种类,urb等 10.android boot 流程 11.android init解析init.rcLinux驱动经典面试题目,布布扣,bubuko.com