正常工作模式在系统规定时间内没有任何活动就进入早期睡眠earlysuspend模式。
触摸屏幕或者一些外部中断是android从earlysuspend模式进入正常工作模式。
earlysuspend进入suspend挂起模式的条件是所有锁都被释放。
挂起suspend模式进去earlysuspend模式的触发条件是当设定的外中断唤醒。。
在android系统中设定了一种特殊的电源管理模式即早期睡眠earlysuspend,他是系统进入待机的第一种状态,在android中设定了一些特殊的设备在此阶段关闭,主要是lcd及其背光。这些设备可以通过编程设定,主要实在设备的驱动程序中通过调用register_early_suspend()函数来注册。当系统在设定的空闲时间内没有任何活动事件发生时,系统就会自动进入earlysuspend状态。进入earlysuspend状态后系统会检测锁链表,看是否存在处于活动的锁,如果没有则进入挂起状态,如果有则等待。当系统进入挂起状态后,系统里的所有外设都已经处于掉电状态,这些设备挂起之前的状态都保存在内存中,当系统被设定的外中断唤醒时,这些设备均能通过设备驱动程序中已经注册的resume()函数来恢复原状态。
android电源管理待机过程分析
系统进入earlysuspend状态后,会调用wake_unlock(&main_wake_lock),此函数主要作用是检测系统中除掉main锁以外还有没有其他活动的锁,如果没有就解开main锁进入挂起状态。其主要流程为:
suspend()---准备挂起suspend_prepare()---------冻结用户太进程和内核太任务suspend_freeze_processes()--------挂起外设suspend_devices_and_enter(state)——等待外中断唤醒。
android的电源管理主要是通过锁和定时器来切换系统的状态。
系统正常开机之后进入到AWAKE状态,Backlight会从最亮慢慢调节到用户设定的亮度,系统screen_off_timer(setting->sound & display->Display settings->Screen timeout)开始计时,计时时间到来之前,如果有任何的activity事件发生,如touch click,keyboard pressed等事件,则将reset screen off timer系统保持在AWAKE状态,
如果screen off timer时间到并且没有full wake lock或者用户按了power key,那么系统状态将被切换到NOTIFICATION,并且调用所有已经注册的g_early_suspend_handlers函数,通常会将LCD和backlight驱动注册成early suspend类型,如果有需要也可以把别的驱动注册成early suspend,这样就会在第一阶段被关闭,接下来系统会判断是否有partial wake lock acquired,如果有则等待其释放,在等待过程中如果有user activity事件发生,系统则马上回到AWAKE状态,如果没有partial wake lock acquired,则系统会马上调用函数pm_suspend关闭其他相关的驱动,让CPU进入休眠状态。
系统在sleep状态时如果检测到任何一个wakeup source,则CPU会从sleep状态被唤醒,并且调用相关的驱动的resume函数。
wakelock屏幕锁