linux内核有一套电源管理的机制,休眠/唤醒在嵌入式Linux中是非常重要的部分,而android是基于linux内核的,它在此机制基本上作了改进。
本文只是针对参考代码总结的具体性的知识,其它有关系统知识网上一大堆,可自己搜索学习。
关于这部分我曾经写了份PPT作为内部技术交流稿,可下载参考下:http://download.csdn.net/detail/yunjinwang/4698512
一,设备文件的生成:/sys/power/state
内核中的相关文件:
Kernel/power/main.c
Kernel/power/suspend.c
注册pm的流程:
static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t n);
static struct attribute * g[] = {&state_attr.attr, ……
static struct attribute_group attr_group = {.attrs = g,};
static int __init pm_init(void);
core_initcall(pm_init);
注册后生成/sys /power/state 文件,用户可以通过读写sys文件/sys /power/state 是实现控制系统休眠\唤酲
echo on/mem > /sys/power/state
enter_state 是负责处理进入何种状态的函数。在linux里,电源管理基本都经过如下几步:
1. suspend_prepare():分配console终端、广播notify、冻结所有进程、保存当前状态
2. suspend_enter():休眠所有外设、关闭irq、休眠系统设备和总线、cpu省电状态
3. suspend_finish():恢复所有的进程
休眠的三个主要步骤:
a,冻结用户态进程和内核态任务
b,调用注册设备的suspend回调函数
c,停止内核态所有进程,保存上下文,使CPU进入休眠。
唤醒条件:中断或事件唤醒系统
唤醒顺序:
系统设备与总线最先唤醒
恢复内核态进程
重启各个设备