路径kernel/power/main.c
1.Android的休眠可以通过以下的配置文件来设置电源状态:
.echo "mem" >/sys/power/state
.echo "disk" >/sys/power/state
2.Wakelock是一种锁机制,只要这把锁被占用,系统就无法进入休眠。wakelock只是其中的一把锁,并且它有两种,超时和不超时的区分。
在系统启动后,会自己添加一把名为“main”的锁,当系统进入休眠之前需要释放“main”锁,在函数early_suspend()函数的最后一步去释放,但释放之后,还要判断其他锁的状态,来决定是否休眠。
3.early_suspend在Linux睡眠过程前被调用。
4.Android休眠
当用户修改sys/power/state,文件linux_source/kernel/power/main.c中的state_store()函数将被调用。
static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t n) { #ifdef CONFIG_SUSPEND #ifdef CONFIG_EARLYSUSPEND suspend_state_t state = PM_SUSPEND_ON; #else suspend_state_t state = PM_SUSPEND_STANDBY; #endif const char * const *s; #endif char *p; int len; int error = -EINVAL; p = memchr(buf, '\n', n); len = p ? p - buf : n; /* First, check if we are requested to hibernate */ if (len == 4 && !strncmp(buf, "disk", len)) { error = hibernate(); goto Exit; } #ifdef CONFIG_SUSPEND for (s = &pm_states[state]; state < PM_SUSPEND_MAX; s++, state++) { if (*s && len == strlen(*s) && !strncmp(buf, *s, len)) break; } if (state < PM_SUSPEND_MAX && *s) #ifdef CONFIG_EARLYSUSPEND if (state == PM_SUSPEND_ON || valid_state(state)) { error = 0; request_suspend_state(state); } #else error = enter_state(state); #endif #endif Exit: return error ? error : n; }
1)Linux休眠会执行error=enter_state(state);
2) android休眠会执行 request_suspend_state(state);
在request_suspend_state()中,会调用early_suspend_work的工作队列已进入early_suspend()函数,在进入early_suspend中,先判断state,确保状态为suspend后调用具体的suspend方法(Linux_source/arch/xxx/mach-xxx/pm.c)
5唤醒:也是在suspend中实现,跳出循环,一步步的还原,但是有也做法是用watchdog来重启系统