Android linux的休眠和喚醒

1. Early suspend/ late resume 是android 添加的機制,用戶關閉LCD, TS, Sensors等爲了省電。可稱之爲淺度休眠


2. Linux的Suspend/resume 仍然有效,可稱之爲深度休眠


3. echo mem > sys/power/state 會觸發early suspend,


   echo on > sys/power/state 會觸發late resume,


   cat sys/power/state 會顯示當前支持的休眠狀態,有mem, on, standby選項,但針對android 則只有mem, 同時無條件支持on


4. LCD, TS, Sensors等設備會註冊early suspend 和late resume 回調函數,用於early suspend/late resume時逐個執行。


5. User space 通過操作 sys/power/wake_lock, sys/power/wake_unlock 可以向kernel申請一個wake lock;


   cat sys/power/wake_lock 或wake_unlock 只是顯示User Space 申請的wake lock, kernel 申請的wake lock顯示不出來


6. cat proc/wakelocks 可以顯示所有的wake lock的信息


7. Early suspend/Late resume中有一個關鍵wake lock是main_wake_lock, 執行early suspend後會unlock main_wake_lock;執行late resume之前會lock main_wake_lock.


8. 當任何一個wake lock被unlock時,會檢測是否有其他wake lock處於locked狀態?如果沒有則系統進入 linux 常規suspend


9. 一般而言android系統是否休眠,是由user space發起的,而kernel space 是不能主動進入休眠的;當android系統需要進入休眠時,user space 執行echo mem > sys/power/state;強迫kernel 進入early suspend狀態,如果還沒有任何wake lock被locked,則進入linux 常規suspend.


10. 如果android系統沒有進入深度休眠,則user space發起echo on> sys/power/state, 則系統馬上執行late resume, 喚醒LCD,TS,sensor等;如果已經進入深度休眠,則另外處理


11. kernel會依次同步文件系統,執行各設備註冊的suspend, 執行system core 的suspend disble bus和irq等,然後進入深度休眠後會在suspend_enter@kernel/kernel/power/suspend.c中的  suspend_ops->enter(state) 系統掛起,直到有硬件的操作喚醒;一旦被喚醒則依次執行system core resume, device resume等,最後還會執行late resume.


12. User space 向kernel申請wake lock時, 寫入sys/power/wake_lock 的buf格式爲<wakelock名稱> [延時的納秒數];但是User space 沒有這麼使用,android在java層自己實現了 計數wake lock和記次wake lock.


13. Early suspend/late resume 針對LCD,TS等設備來說,所起的作用與suspend/resume是一樣的。一般而言 兩者不會同時使用 , Early suspend/late resume只是在Linux kernel 系統不能深度休眠時,還能執行從而關掉某些設備,達到省電的目的。
 


主要源代碼路徑
[Kernel]
1. @kernel/drivers/base/power/main.c
2. @kernel/kernel/power/suspend.c
3. @kernel/kernel/power/main.c
4. @kernel/kernel/power/earlysuspend.c
5. @kernel/kernel/power/wakelock.c
6. @kernel/drivers/base/syscore.c
7. @kernel/kernel/power/userwakelock.c
[User space]
1. @frameworks/base/services/java/com/android/server/powermanagerservice.java
2. @frameworks/base/services/jni/com_android_server_powermanagerservice.cpp
3. @system/core/libsuspend/autosuspend.c
4. @system/core/libsuspend/autosuspend_earlysuspend.c
5. @frameworks/base/services/java/com/android/server/systemserver.java
6. @hardware/libhardware_legacy/power/power.c
7. @frameworks/base/core/java/android/os/powermanager.java


轉自:http://blog.csdn.net/pillarbuaa/article/details/9117299

發佈了10 篇原創文章 · 獲贊 13 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章