现在的位置: 首页 > 综合 > 正文

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

2013年09月08日 ⁄ 综合 ⁄ 共 4140字 ⁄ 字号 评论关闭

如今手持设备中出现的一对不可调和的矛盾就是越来越大的能量消耗与电池容量瓶颈之间的矛盾,就算没有这个瓶颈,相对更持久的续航能力也是众向所归。
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
的各自服务。该文件的分析见后续的调研报告。

抱歉!评论已关闭.