接上一節:
static int suspend_enter(suspend_state_t state)
#endif
arch_suspend_disable_irqs();
bug_on(!irqs_disabled());
if ((error = device_power_down(pmsg_suspend)))
error = sysdev_suspend(pmsg_suspend);
if (!error)
device_power_up(pmsg_resume);
done:
arch_suspend_enable_irqs();
#ifdef config_cpu_freq
if(strnicmp(governor_name, userspace_governor, cpufreq_name_len))
#endif
bug_on(irqs_disabled());
device_pm_unlock();
return error; }
然後回到
suspend_devices_and_enter
()函式中,
使能休眠時候停止掉的非啟動cpu
,繼續喚醒每個裝置,使能終端。
int suspend_devices_and_enter(suspend_state_t state)
suspend_console();
suspend_test_start();
error = device_suspend(pmsg_suspend);
if (error)
suspend_test_finish("suspend devices");
if (suspend_test(test_devices))
goto recover_platform;
if (suspend_ops->prepare)
if (suspend_test(test_platform))
goto finish;
error = disable_nonboot_cpus();
if (!error && !suspend_test(test_cpus))
suspend_enter(state);
//suspend過程完成處
enable_nonboot_cpus();
finish:
if (suspend_ops->finish)
suspend_ops->finish();
resume_devices:
suspend_test_start();
device_resume(pmsg_resume);
suspend_test_finish("resume devices");
resume_console();
close:
if (suspend_ops->end)
suspend_ops->end();
return error;
recover_platform:
if (suspend_ops->recover)
suspend_ops->recover();
goto resume_devices; }
當suspend_devices_and_enter
()執行完成後,系統外設已經喚醒,但程序依然是凍結的狀態,返回到
enter_state
函式中,呼叫
suspend_finish()
函式。
static int enter_state(suspend_state_t state)
在suspend_finish()
函式中,解凍程序和任務,使能使用者空間
helper
程序,廣播乙個系統從
suspend
狀態退出的
notify
,喚醒終端。
static void suspend_finish(void)
當所有的喚醒已經結束以後
,使用者程序都已經開始執行了
,但沒點亮螢幕,
喚醒通常會是以下的幾種原因:
如果是來電
,那麼modem
會通過傳送命令給
rild
來讓rild
通知windowmanager
有來電響應
,這樣就會遠端呼叫powermanagerservice
來寫」on」
到 /sys/power/state 來呼叫
late resume
(),執行
點亮螢幕等
操作。
使用者按鍵事件會送到windowmanager中,
windowmanager會處理這些按鍵事件
,按鍵分為幾種情況
,如果按鍵不是喚醒鍵
,那麼windowmanager
會主動放棄
wakelock
來使系統進入再次休眠
;如果按鍵是喚醒鍵
,那麼windowmanger
就會呼叫
powermanagerservice
中的介面來執行
late resume。
當」on
」被寫入到
/sys/power/state
之後,同early_suspend
過程,request_suspend_state()
被呼叫,只是執行的工作佇列變為
late_resume_work
。在late_resume函式中,喚醒呼叫了early_suspend
的裝置。
static declare_work(late_resume_work, late_resume);
static void late_resume(struct work_struct *work)
if (debug_mask & debug_suspend)
pr_info("late_resume: call handlers\n");
list_for_each_entry_reverse(pos, &early_suspend_handlers, link)
if (pos->resume != null)
pos->resume(pos);
if (debug_mask & debug_suspend)
pr_info("late_resume: done\n");
abort:
mutex_unlock(&early_suspend_lock); }
wince 休眠 喚醒
睡眠過程 1.呼叫setsystempowerstate進入睡眠狀態.2.電源管理驅動裡設定裝置的電源狀態 3.呼叫poweroffsystem 進入核心處理 4.呼叫各裝置驅動的powerdown 5.呼叫oempoweroff 1 儲存晶元所有的暫存器值到乙個靜態陣列 就是堆疊中 2 先進行平台...
Linux 休眠喚醒(一)
說明 1.based on linux2.6.32,only for mem sdr 2.有興趣請先參考閱讀 電源管理方案apm和acpi比較.doc linux系統的休眠與喚醒簡介.doc 4.基於手上的乙個專案來討論,這裡只討論共性的地方 雖然linux支援三種省電模式 standby susp...
Linux 休眠喚醒(一)
說明 1.based on linux2.6.32,only for mem sdr 2.有興趣請先參考閱讀 電源管理方案apm和acpi比較.doc linux系統的休眠與喚醒簡介.doc 4.基於手上的乙個專案來討論,這裡只討論共性的地方 雖然linux支援三種省電模式 standby susp...