由于项目需要,我们的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_supply/battery/present"
#define BATTERY_CAPACITY_PATH "/sys/class/power_supply/battery/capacity"
#define BATTERY_VOLTAGE_PATH "/sys/class/power_supply/battery/batt_vol"
#define BATTERY_TEMPERATURE_PATH "/sys/class/power_supply/battery/batt_temp"
#define BATTERY_TECHNOLOGY_PATH "/sys/class/power_supply/battery/technology"
update然后根据读到的状态更新

本文介绍了Android设备的电源管理,特别是电池检测和管理。通过分析kernel/driver/power/路径下的电源芯片驱动,如max17040+max8989,探讨了如何通过Linux内核和用户空间交互来获取电池状态。BatteryService作为电池服务,监听UEvent并读取sysfs状态。当电源状态改变时,会更新BatteryService的成员变量并发送ACTION_BATTERY_CHANGED Intent,通知系统各组件。此外,文中还提到了Kernel如何提供电源状态信息,以及Android框架如何读取和处理这些信息。
最低0.47元/天 解锁文章
1599

被折叠的 条评论
为什么被折叠?



