suspend流程借用其他图和链接,比较详细了http://www.wowotech.net/linux_kenrel/suspend_and_resume.html
我这边记录下wakelock的相关接口和suspend过程中的frozenthread实现原理,还有部分idle流程。
wakelock内核和应用使用的相关接口
static inline void wake_lock(struct wake_lock *lock)
{
__pm_stay_awake(&lock->ws);
}
static inline void wake_lock_timeout(struct wake_lock *lock, long timeout)
{
__pm_wakeup_event(&lock->ws, jiffies_to_msecs(timeout));
}
static inline void wake_unlock(struct wake_lock *lock)
{
__pm_relax(&lock->ws);
}
wakelock通过一个32位值来表示,高16位表示总的wakeevent发生次数,低16位标志当前置位的wakelock数量
没有wakelock时候触发suspend流程
wakeup.c可以看wakelock当前状态,是debug接口
在kernel\power\main.c封装着给应用层使用的接口,应用通过写文件来设置wakelock,/sys/power/wake_lock|wake_unlock
#ifdef CONFIG_PM_WAKELOCKS
static ssize_t wake_lock_show(struct kobject *kobj,
struct kobj_attribute *attr,