Android wakelock机制是为了防止系统进入suspend或其他低功耗状态,那么首先来看driver API。
那么在driver中需要include一个头文件<linux/wakelock.h>,例如:
加锁使用wake_lock:
释放锁使用wake_unlock:
加锁当然也可以使用wake_lock_timeout,超过一定时间后自动释放:
从这里可以看出wakelock相关API是相对比较简单的。
同样在用户空间我们也可以创建是释放wakelock,创建一个wakelock只需要向/sys/power/wake_lock写一个锁的名字就可以了,而释放锁则向/sys/power/wake_unlock写入锁的名字。
注意:用户空间创建的锁都是suspend类型的锁。
在用户空间,还可以通过cat /proc/wakelocks命令来查看系统中的wakelock。
那么在driver中需要include一个头文件<linux/wakelock.h>,例如:
struct state {
struct wakelock wakelock;
};
init () {
wake_lock_init(&state->wakelock, WAKE_LOCK_SUSPEND, "wakelockname");
}
初始化一个wakelock需要指定锁的类型,目前有两种类型:WAKE_LOCK_IDLE和WAKE_LOCK_SUSPEND,idle类型锁表示阻止系统进入idle状态(低功耗状态),而suspend类型锁则阻止系统进入suspend状态,用的最多的可能是suspend类型锁。
uninit() {
wake_lock_destory(&state->wakelock);
}
加锁使用wake_lock:
wake_lock(&state->wakelock);
释放锁使用wake_unlock:
wake_unlock(&state->wakelock);
加锁当然也可以使用wake_lock_timeout,超过一定时间后自动释放:
wake_lock_timeout(&state->wakelock, HZ);
从这里可以看出wakelock相关API是相对比较简单的。
同样在用户空间我们也可以创建是释放wakelock,创建一个wakelock只需要向/sys/power/wake_lock写一个锁的名字就可以了,而释放锁则向/sys/power/wake_unlock写入锁的名字。
注意:用户空间创建的锁都是suspend类型的锁。
在用户空间,还可以通过cat /proc/wakelocks命令来查看系统中的wakelock。
// 2016-06-13 add
注:在3.4或更高版本的内核中,需要使用命令cat /sys/kernel/debug/wakeup_sources