首先我们说下linux的几种状态,完全就是简单的看了下Document下的文档
内核支持三种电源管理的状态,每一种的底层详细状态都依赖于板机代码的实现。本文件主要描述每种状态。什么情况下被调用,对应于那些acpi的状态和写什么样的字符到/sys/power/state进入相应的状态
State: Standby/Power-OnSuspend
ACPIState: S1
String: “standby”
该状态提供了一种很小功耗。没有丢失任何东西,如果需要,系统将会在极短的时间里启动
State:Suspend-to-RAM
ACPIState: S3
String:mem
这种情况给系统进入低功耗状态提供了一种极好的方案,除了memory还在不断的自刷新
而系统和外设的状态还被保存在memory中,所有的设备都被挂起并进入了D
3的状态。在一些案例中,当进入STR时,所有的的外设总线都掉电了,所以所有的外设都必须能够自己回到on状态
从S3回到on状态需要3-5秒
State: Suspned-to-disk
ACPIState: S4
String:“disk”
这种状态是最省功耗的了,都写入硬盘了阿
然后呢,我们知道了有这些状态,还是写入了/sys/power/state下的节点,那么可知,它是一个sys接口,然后呢,底层肯定实现了store和show的函数,找阿找,路径位linuxsrc/kernel/power/main.c
show函数就不用说了
constchar *const pm_states[PM_SUSPEND_MAX] = {
[PM_SUSPEND_STANDBY] = "standby",
[PM_SUSPEND_MEM] = "mem",
};
staticssize_t state_show(struct kobject *kobj, struct kobj_attribute*attr,
char*buf)
{
char*s = buf;
#ifdefCONFIG_SUSPEND
inti;
for(i = 0; i < PM_SUSPEND_MAX; i++) {//打印linux支持的系统状态pm_state
if(pm_states[i] && valid_state(i))
s+= sprintf(s,"%s ", pm_states[i]);
}
#endif
#ifdefCONFIG_HIBERNATION//如果支持最牛笔的方式把,还可以支持挂起到硬盘
s+= sprintf(s, "%s\n", "disk");
#else
if(s != buf)
/*convert the last space to a newline */
*(s-1)= '\n';
#endif
return(s - buf);
}
show函数还是比较简单的就是打印下支持的状态,那么接下来就是重点了,state_store,以前我很纠结为什么手机会在关屏之后休眠阿,凭什么阿,后来听了各位老大的指导,才知道一定是主动出发的阿,那么是怎么出发的阿,肯定是灭屏的时候出发的阿。。不管是power键出发灭屏,还是时间到了灭屏只要屏幕灭了就刮起呗,现在看来就是调用的state_store
staticssize_t state_store(struct kobject *kobj, struct kobj_attribute*attr,
constchar *buf, size_t n)
{
#ifdefCONFIG_SUSPEND