休眠是把一些部件、外设关掉(掉电或让它进入低功耗模式)。比如:对于platform_device在suspend调用的时候,
freeze、standby、mem、disk
cat /sys/power/state
/sys/power/autosleep:用于取代wakelocks中的自动休眠功能。向该文件写入/sys/power/state返回值的某一种,系统会在适当的时候进入指定的休眠的模式
/sys/power/wake_lock、/sys/power/wake_unlock 休眠锁
wakeup_count:用于解决“system suspend和system wakeup events之间的同步问题”。
/sys/power/pm_async:状态切换开关,允许/禁止User空间对设备进行异步的suspend和resume操作。
/sys/power/pm_freeze_timeout:系统执行休眠时要冻结(freeze)用户控件的进程和内核空间的允许冻结的内核线程,执行这些操作要耗时间吧?该文件指定所需时间的最大值。
当所有唤醒源都处于de-avtive状态后,系统才会进入休眠。
autosleep机制,只要不存在任何active的唤醒源(wakeup_source)了,就进入休眠模式。
电源管理通过监测display的状态,当灭屏时则发起休眠的流程,
首先是在DisplayPowerController中收到MSG_UPDATE_POWER_STATE消息;
随后经过一系列的回调了DisplayBlanker接口的requestDisplayState;
然后是DisplayPowerCallbacks接口的onDisplayStateChange方法
在PowerManagerService中onDisplayStateChange。
config_powerDecoupleAutoSuspendModeFromDisplay
setHalAutoSuspendModeLocked
是否进入休眠和唤醒是由nativeAcquireSuspendBlocker // acquire_wake_lock /sys/power/wake_lock
和nativeReleaseSuspendBlocker // release_wake_lock /sys/power/wake_unlock
是否释放SuspendBlocker决定的。
nativeSetAutoSuspend
autosuspend_enable();
autosuspend_disable();
setHalAutoSuspendModeLocked往下,会调到system/core/libsuspend下面。enable和disable最终对应auto_suspend_wakeup_count.cpp内的
autosuspend_wakeup_count_enable
autosuspend_wakeup_count_disable
通过信号量来做同步开关的控制,enable就sem_post来打开wake_count的写控制,
disable就sem_wait进行阻塞。enable的时候,会把mem写到/sys/power/state,
在进入休眠的过程中会先进入Android的“Early Suspend”路径,然后根据“wakelocks”的存在与否决定是否让系统休眠。
所谓启用autosleep,就是向"/sys/power/autosleep"文件写入系统支持的休眠模式
屏幕点亮的时候,disable autosleep,屏幕暗下来后enable autosleep。