1.1基本原理
Android 中定义了几种低功耗状态:earlysuspend,suspend,hibernation。
earlysuspend 是一种低功耗的状态,某些设备可以选择进入某种功耗较低的状态,比如
LCD 可以降低亮度或灭掉;
suspend 是指除电源管理以外的其他外围模块以及 cpu 均不工作,只有内存保持自刷新的
状态;
hibernation 是指所有内存镜像都被写入磁盘中,然后系统关机,恢复后系统将能恢复到
“关机”之前的状态。
1.2 电源管理机制的实现
系统进入 hibernation 状态。如果是其他字符串则调用 request_suspend_state()(如果未定义
CONFIG_EARLYSUSPEND)或者调用 enter_state()(如果未定义 CONFIG_EARLYSUSPEND)。
request_suspend_state()函数是 android 相对标准 linux 改动的地方,它实现在 earlysuspend.c
中。
在标准 linux 内核中,用户通过 sysfs 写入“mem”“standby” 会直接调用 enter_state(),
进入 suspend 模式,但在 android 中则会调用 request_suspend_state()函数进入 early suspend
状态。request_suspend_state()函数代码如下:
可 见 实 际 工 作 的 是 early_suspend 和 late_resume 这 两 个 函 数 。 Android 提 供 了
register_early_suspend 和 unregister_early_suspend 两个函数供驱动调用,分别完成设备
earlysuspend 的注册和注销。系统将所有注册支持 early_suspend 的设备驱动对应的 handler
挂在一个称为 early_suspend_handler 的链表上。函数 early_suspend 和 late_resume 完成的事
情很简单,就是遍历这个链表,依次调用每个设备注册的 handler,late_resume 是唤醒处于
early_suspend 的那些设备。代码如下:
Android 中定义了几种低功耗状态:earlysuspend,suspend,hibernation。
earlysuspend 是一种低功耗的状态,某些设备可以选择进入某种功耗较低的状态,比如
LCD 可以降低亮度或灭掉;
suspend 是指除电源管理以外的其他外围模块以及 cpu 均不工作,只有内存保持自刷新的
状态;
hibernation 是指所有内存镜像都被写入磁盘中,然后系统关机,恢复后系统将能恢复到
“关机”之前的状态。
1.2 电源管理机制的实现
电源管理机制的源代码主要在 kernel/power/文件夹下面。main.c 文件是整个框架的入口。
用户可以通过读写 sys 文件/sys/power/state 实现控制系统进入低功耗状态。用户对于
/sys/power/state 的读写会调用到 main.c 中的 state_store(),用户可以写入
const char * const pm_states[] 中定义的字符串, 比如“on”“mem”“standby”“disk”
系统进入 hibernation 状态。如果是其他字符串则调用 request_suspend_state()(如果未定义
CONFIG_EARLYSUSPEND)或者调用 enter_state()(如果未定义 CONFIG_EARLYSUSPEND)。
request_suspend_state()函数是 android 相对标准 linux 改动的地方,它实现在 earlysuspend.c
中。
在标准 linux 内核中,用户通过 sysfs 写入“mem”“standby” 会直接调用 enter_state(),
进入 suspend 模式,但在 android 中则会调用 request_suspend_state()函数进入 early suspend
状态。request_suspend_state()函数代码如下:
void request_suspend_state(suspend_state_t new_state)
{
unsigned long irqflags;
int old_sleep;
spin_lock_irqsave(&state_lock, irqflags);
old_sleep = state & SUSPEND_REQUESTED;
......
if (!old_sleep && new_state != PM_SUSPEND_ON) {
state |= SUSPEND_REQUESTED;
//判断是否为省电请求,如果是排队一个 early_suspend_work
queue_work(suspend_work_queue, &early_suspend_work);
} else if (old_sleep && new_state == PM_SUSPEND_ON) {
state &= ~SUSPEND_REQUESTED;
wake_lock(&main_wake_lock);
//否则,是唤醒请求,排队 late_resume_work
queue_work(suspend_work_queue, &late_resume_work);
}
requested_suspend_state = new_state;
spin_unlock_irqrestore(&state_lock, irqflags);
}
early_suspend_work 和 late_resume_work 定义为
static DECLARE_WORK(early_suspend_work, early_suspend);
static DECLARE_WORK(late_resume_work, late_resume);
可 见 实 际 工 作 的 是 early_suspend 和 late_resume 这 两 个 函 数 。 Android 提 供 了
register_early_suspend 和 unregister_early_suspend 两个函数供驱动调用,分别完成设备
earlysuspend 的注册和注销。系统将所有注册支持 early_suspend 的设备驱动对应的 handler
挂在一个称为 early_suspend_handler 的链表上。函数 early_suspend 和 late_resume 完成的事
情很简单,就是遍历这个链表,依次调用每个设备注册的 handler,late_resume 是唤醒处于
early_suspend 的那些设备。代码如下:
static void early_suspend(struct work_struct *work)
{
struct early_suspend