Suspend 状态是将 CPU 中,所有外围和cpu core的clock ,power 都停掉,只留下
• DRAM refresh
• RTC
• INT
三个部份还有动作,这样的目的是要减少电源消耗,同时尽量维持执行状态。
让装置回到正常状态的方式有
• 外部中断
• RTC TimerUp (也是中断)
从PowerOff中恢复后,要尽量让系统回到当初power Off的状态。
Suspend/Recover的动作有一点像Task Switch,就是Stack Frame的操作:在断电前将StackFrame保存在固定的地方,Recover时到那个地方拿回Stack Frame回存,动作跟TaskSwitch一模一样。
CE 的Suspend/Resume 动作 需要driver的配合,所以所有Driver都要implement (and export) PowerUp/PowerDown function。另外GUI 的部份也要response to WM_XX 这个power state change message。
在PUBLIC\COMMON\OAK\DRIVERS\PM\MDD\pmresume.cpp 的comment中有说明:
Application (Drvier) 中不可以直接呼叫 PowerOffSystem( )来suspend system,要藉由 SetSystemPowerState ( ) 这个 Win32 funtion 来转换 power status 到 suspend/resume 状态才行。 因为 SetSystemPowerState( ) 在呼叫PowerOffSystem( ) 之前,还会呼叫PM 的function 一一呼叫所有Device 的 PowerOn/PowerDown function,还会post necessary message to GWES server,最后才呼叫PowerOffSystem( )将所有cpu core关闭。
SetSystemPowerState()是一个手套,会去呼叫PlatformSetSystemPowerState(),