如今手持设备中出现的一对不可调和的矛盾就是越来越大的能量消耗与电池容量瓶颈之间的矛盾,就算没有这个瓶颈,相对更持久的续航能力也是众向所归。 Android 系统一般应用于高端智能设备,能源消耗尤其突出,因此对 Android 的电源管理系统的调研有很必要。
Android 系统是基于标准 Linux 内核之上的,在 Linux 内核在原有的 power manager 系统之上增加了相应了文件,为 Android 系统的 power manager 提供底层服务支持。因此,调研工作在两个层面展开: Linux 内核层、 Android 系统层。
Linux 内核层:
针对 Android 系统而增添的 power manager 文件有如下五个:
/Linux-2.6.29/kernel/power/ |-consoleearlysuspend.c |-earlysuspend.c |-fbearlysuspend.c |-userwakelock.c |-wakelock.c |
这五个文件配合 Linux 层的 power manager 柜架和与功耗相关的设备驱动,向 Android 层提供了 power manager 的底层支持。与功耗相关的设备主要包括 LCD 屏和键盘及其它设备的 LED 灯。因些,在这类设备的驱动中应该增加相应的 power manager 功能。
在该调研报告中,仅简单地罗出列出各文件中定义的功能函数以及向上提供的接口,其具体的功能调用及整个 power manager 柜架地实现在后期的调研报告中阐述。
1 )、 consoleearlysuspend.c
功能函数:
static void console_early_suspend(struct early_suspend *h) ; static void console_late_resume(struct early_suspend *h) ; static int __init console_early_suspend_init(void) ; static void __exit console_early_suspend_exit(void) ; |
数据结构:
static struct early_suspend console_early_suspend_desc = { .level = EARLY_SUSPEND_LEVEL_STOP_DRAWING, .suspend = console_early_suspend, .resume = console_late_resume, }; |
2 、 earlysuspend.c
功能函数:
void register_early_suspend(struct early_suspend *handler) ; void unregister_early_suspend(struct early_suspend *handler); static void early_suspend(struct work_struct *work); static void late_resume(struct work_struct *work); void request_suspend_state(suspend_state_t new_state); suspend_state_t get_suspend_state(void); |
供驱动使用的函数接口:
EXPORT_SYMBOL(register_early_suspend); EXPORT_SYMBOL(unregister_early_suspend); |
在 earlysuspend.h 文件中定义了注册接口函数:
#ifdef CONFIG_HAS_EARLYSUSPEND void register_early_suspend(struct early_suspend *handler); void unregister_early_suspend(struct early_suspend *handler); |
3 、 fbearlysuspend.c
功能函数:
static void stop_drawing_early_suspend(struct early_suspend *h); static void start_drawing_late_resume(struct early_suspend *h) ; static ssize_t wait_for_fb_sleep_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) ; static ssize_t wait_for_fb_wake_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) ; static int __init android_power_init(void) ; static void __exit android_power_exit(void) |
主要的数据结构:
static struct early_suspend stop_drawing_early_suspend_desc = { .level = EARLY_SUSPEND_LEVEL_STOP_DRAWING, .suspend = stop_drawing_early_suspend, .resume = start_drawing_late_resume, }; |
在以上面的几个函数中,都调用了 __wake_up :
在 sched.c 中定义了这个函数
/** * __wake_up - wake up threads blocked on a waitqueue. * @q: the waitqueue * @mode: which threads * @nr_exclusive: how many wake-one or wake-many threads to wake up * @key: is directly passed to the wakeup function */ void __wake_up(wait_queue_head_t *q, unsigned int mode, int nr_exclusive, void *key) { unsigned long flags; spin_lock_irqsave(&q->lock, flags); __wake_up_common(q, mode, nr_exclusive, 0, key); spin_unlock_irqrestore(&q->lock, flags); } |
4 、 userwakelock.c
static struct user_wake_lock *lookup_wake_lock_name(const char *buf, int allocate, long *timeoutptr); ssize_t wake_lock_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf); ssize_t ssixe_t wake_lock_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t n); ssize_t wake_unlock_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf); ssize_t wake_unlock_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t n); |
5 、 wakelock.c
提供了接口函数有:
EXPORT_SYMBOL(wake_lock_init); EXPORT_SYMBOL(wake_lock_destroy); EXPORT_SYMBOL(wake_lock); EXPORT_SYMBOL(wake_lock_timeout); EXPORT_SYMBOL(wake_unlock); EXPORT_SYMBOL(wake_lock_active); |
以上函数仅提供了一个 android power manager 实现的底层柜架,要使其很好的 work 起来,需要相关设备 driver 的支持和与 Android 层 power manager 系统很好的配合。
Android 系统层
Android 层的电源管理主要在 framework 层实现,其中 battery 的管理包括充放电状态、电量显示等,但这部分暂不在调研范围之间。该部分调研的重点在于 LCD 以及相关设备 LED 状态的切换。
相关文件包括:
/frameworks/base/services/java/com/android/server/PowerManagerService.java
/platform/frameworks/base/core/java/android/os/PowerManager.java
/platform/frameworks/base/core/java/android/os/Power.java
/frameworks/base/core/jni/android_os_Power.cpp
/hardware/libhardware_legacy/power/power.c
引用一张比较全面的 power manager 框架图,我们可以看到 power manager 的核心代码在 PowerManagerService.java 中,该文件通过利用 PowerManager.java 提供的类, android_os_Power.cpp 提供的一些本地方法以及 power.c 对底层的调用,完成了 android 系统 power manager 的各自服务。该文件的分析见后续的调研报告。