由于项目需要,我们的android手机及上网本都需要做一个电池的电量检测与电池管理,所以,在开始动手做这一块之前,先整理一下电源管理方面的资料。
首先,看看一下电源芯片驱动在内核的位置:kernel/driver/power/ 路径下,看了一下samsung I9000的kernel用的是max17040+max8989,max1740是I2C接口,需要烧写一些寄存器和通过读写寄存器来获取电池的信息,max8998则是通过控制它的GPIO口来工作。两者相互协调完成底层电源管理的驱动,通过接口与android的中间层交互。里注册了充电器(ac)、 usb和电池(battery)三个power_supply。各个power_supply提供的属性和上述文件是对应的,从这些文件中可以读到充电器 (ac)、usb和电池(battery)三个power_supply的相应状态。
BatteryService作为电池及充电相关的服务
监听UEvent,读取sysfs里中的状态。
实现了一个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中读取相关状态(com_android_server_BatteryService.cpp)
Linux驱动提供了下列文件,供应用程序获取电源相关状态:
#define AC_ONLINE_PATH "/sys/class/power_supply/ac/online"
#define USB_ONLINE_PATH "/sys/class/power_supply/usb/online"
#define BATTERY_STATUS_PATH "/sys/class/power_supply/battery/status"
#define BATTERY_HEALTH_PATH "/sys/class/power_supply/battery/health"
#define BATTERY_PRESENT_PATH "/sys/class/power