android休眠

休眠是把一些部件、外设关掉(掉电或让它进入低功耗模式)。比如:对于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。

 

 

 

 

你可能感兴趣的:(android休眠)