九鼎创展论坛中文版English
登录 | 立即注册 设为首页收藏本站 切换到宽版
查看: 3413|回复: 0
打印 上一主题 下一主题

Android电源管理系统调研报告-(1)

[复制链接]
跳转到指定楼层
楼主
发表于 2012-2-23 14:55:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如今手持设备中出现的一对不可调和的矛盾就是越来越大的能量消耗与电池容量瓶颈之间的矛盾,就算没有这个瓶颈,相对更持久的续航能力也是众向所归。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,
};

2earlysuspend.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);

3fbearlysuspend.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);
}

4userwakelock.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);

5wakelock.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的各自服务。该文件的分析见后续的调研报告。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳市九鼎创展科技官方论坛 ( 粤ICP备11028681号-2  

GMT+8, 2024-6-13 20:44 , Processed in 0.021015 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表