android电源管理资料整理

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于项目需要,我们的android手机及上网本都需要做一个电池的电量检测与电池管理,所以,在开始动手做这一块之前,先整理一下电源管理方面的资料。

 

      首先,看看一下电源芯片驱动在内核的位置:kernel/driver/power/ 路径下,看了一下samsung I9000kernel用的是max17040+max8989max1740I2C接口,需要烧写一些寄存器和通过读写寄存器来获取电池的信息,max8998则是通过控制它的GPIO口来工作。两者相互协调完成底层电源管理的驱动,通过接口与android的中间层交互。里注册了充电器(ac) usb和电池(battery)三个power_supply。各个power_supply提供的属性和上述文件是对应的,从这些文件中可以读到充电器 (ac)usb和电池(battery)三个power_supply的相应状态。

 

BatteryService作为电池及充电相关的服务

 

监听UEvent,读取sysfs里中的状态。

 

实现了一个UEvent的观察者。ueventLinux内核用来向用户空间主动上报事件的机制,对于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_updatesysfs中读取相关状态(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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值