




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Android電源管理內核模塊總體框架2初始化與接口模塊4early suspend/late resume模塊8Early suspend/late resume概述8Early suspend/late resume流程9流程1 :創建earlysuspend的核心工作隊列線程suspend_work_queue10流程2 :系統啟動完成后,相關的驅動程序通過register_early_suspend()函數注冊了early suspendlateresume特性10流程 3:用戶空間,通過調用set_screen_state函數來觸發suspend的流程13流程 4:先valid_st
2、ate()一下,這給了平臺相關的代碼一個機會確認該平臺是否支持所請求的電源狀態13流程 5:調用request_suspend_state()函數13流程 6:early_suspend()完成最主要工作13Wakelock模塊14Suspend 及平臺相關驅動模塊14參考資料17Android電源管理內核模塊總體框架Android電源管理內核模塊,主要是由以下幾個基本模塊組成,詳細分析如下:電源管理內核模塊總體組成電源管理內核模塊總體組成圖電源管理內核模塊從功能角度出發,各模塊關系示意圖如下:電源管理內核模塊各模塊關系示意圖1簡單說明:內核空間提供3個sys接口,即加鎖,解鎖,休眠喚醒,當所
3、有的鎖解開的時候,會執行標準linux的suspend.ealry_suspend: 設備:觸摸屏,按鍵,gpu,電子羅盤,攝像頭,led,wifi等linux suspend設備:usb cpu 總線等。電源管理內核模塊各模塊關系示意圖2初始化與接口模塊主要涉及文件:/kernel/power/main.c;/kernel/power/userwakelock.c在kernel/power/main.c中,定義了一組sysfs的屬性文件,其中一個定義是:power_attr(state);line215把這個宏展開后:1. kernel/power/main.h line65732. sta
4、tic struct kobj_attribute state_attr = 3. 4. .attr = 5. 6. .name = "state", 7. 8. .mode = 0644, 9. 10. , 11. 12. .show =state_show, 13. .store =state_store, 14. 15. 源碼位置:kernel/power/main.c在此文件中,定義了一組sysfs的屬性文件,并且main.c的入口:1. static int _init pm_init(voi
5、d)2. 3. 4. 5. .6. 7. power_kobj =kobject_create_and_add("power", NULL);8. 9. .10. 11. 12. 13. core_initcall(pm_init);14. 函數執行后,會在生成/sys/power目錄,該目錄下會建立一系列屬性文件,其中一個就是/sys/power/state文件.從core_initcall(pm_init))可以知道:函數在初始化時被執行關于此函數可見1,同樣,我們從main.c中可以看
6、到,/sys/power目錄下應該還有的屬性文件有:如果內核:#ifdef CONFIG_PM_SLEEPpower_attr(pm_async);/line 70則有:/sys/power/pm_async功能:cat/sys/power/pm_async用于判斷當前設備的suspend、resume操作是否是同步操作echo/sys/power/pm_async用于控制是否異步的執行設備的suspend、resume操作#ifdef CONFIG_USER_WAKELOCKpower_attr(wake_lock);power_attr(wake_unlock);#endif則有:/sys
7、/power/wake_lock,sys/power/unwake_lock文件注意其對應的SHOW與STORE功能實現函數在:/kernel/power/userwakelock.c功能:cat/sys/power/wake_lock查看系統的wake lock情況echo/sys/power/wake_lock申請一個wake lockunwake_lock類似。#ifdef CONFIG_PM_SLEEP#ifdef CONFIG_PM_DEBUGpower_attr(pm_test);/line 132則有:/sys/power/pm_test功能:none>>core &
8、gt;> processors >> platform >> devices >> freezer, 控制范圍示意;cat pm_test,在終端上打印出上面數組中的字符串,當前的模式用表示出來。echo devices > pm_test的時候會最終調用到函數pm_test_store()中去,該函數中設置全局變量pm_test_level的值,可以是0-5,分別代表上none freezer。該全局變量會在后面的suspend和resume中被引用到。#ifdef CONFIG_PM_SLEEPpower_attr(wakeup_c
9、ount);則有:/sys/power/wakeup_count注意其對應的SHOW與STORE功能實現函數在:/drivers/base/power/wakeup.c功能:cat/sys/power/wakeup_count讀取當前已經注冊wakeup事件數目echo/sys/power/wakeup_count寫入時,只有寫入值和當前已經注冊wakeup事件數目相同時,才會有作用,如果成功了,會使內核進入一段連續睡眠如果在寫入后沒有任何的wakeup事件到來。#ifdef CONFIG_PM_TRACEpower_attr(pm_trace);power_attr(pm_trace_dev
10、_match);則有:/sys/power/pm_trace,/sys/power/pm_trace_dev_match功能:cat/sys/power/pm_trace下面就會顯示 1 或者 0echo/sys/power/pm_traceThe /sys/power/pm_trace 本文件可以在保存重啟過程中RTC中的最后一個PM事件點,這樣可以用來調試時使用。/sys/power/pm_trace則是如果使用了pm_trace,此文件中可以包含和最后的PM事件點有關的設備的名稱。這些文件接口使用例子:1) cat /sys/power/state
11、 -查看系統狀態,echo mem > /sys/power/state -將系統設置為進入休眠2) echo "name" > /sys/power/wake_lock -申請一個鎖cat /sys/power/wake_lock -查看系統的wake lock情況wake_unlock同樣??偨Y:cat會調用相應的xxx_show();echo會調用相應的xxx_store()來實現一定的獲取狀態或設置等功能。early suspend/late resume模塊Early suspend/late resume概述android引入了新的機制來管理電源,e
12、arly suspend、late resume和wake lock。Early Suspend和Late Resume是Android在標準Linux的基礎上增加的一項特性。當用戶空間的向內核請求進入suspend時,這時候會先進入early suspend狀態,驅動程序可以注冊early suspend的回調函數,當進入該狀態時,內核會逐一地調用這些回調函數。例如顯示屏的驅動程序通常會注冊early suspend,在他的回調函數中,驅動程序會把屏幕和背光都關閉。在這種狀態下,所有的后臺進程都還在活動中,該播放歌曲的播放歌曲,該下載數據的依然在下載,只是顯示屏不良而已。進入early su
13、spend狀態以后,一旦所有的電源鎖(wake lock)被釋放,系統馬上會進入真正的suspend流程,直到最后系統停止工作,等待外部事件的喚醒。Early suspend用于在關閉顯示的時候使一些與顯示有關的設備(如LCD背光、重力感受器、觸摸屏等)都關掉,但是系統可能仍處于運行狀態并處理著任務,在嵌入式設備中,背光會消耗大量的電量,所以android引入了early suspend。進入early suspend狀態以后,一旦所有的電源鎖(wake lock)被釋放,系統馬上會進入真正的suspend流程,直到最后系統停止工作,等待外部事件的喚醒2。加入后early suspend電源狀
14、態整體狀態轉換圖:加入后early suspend電源狀態整體狀態轉換圖用戶空間的接口創建,見 初始化與接口模塊部分存在/sys/power/state的SYS接口Early suspend/late resume流程Early suspend/late resume 調用流程圖Early suspend調用流程詳細說明流程1 :創建earlysuspend的核心工作隊列線程suspend_work_queue源碼位置:(平臺不同源碼實際位置不定,目錄及文件固定kernel/power/wakelock.cstatic int _initwakelocks_init(void) .
15、suspend_work_queue = create_singlethread_workqueue("suspend"); .流程2 :系統啟動完成后,相關的驅動程序通過register_early_suspend()函數注冊了early suspendlateresume特性源碼位置:(平臺不同源碼實際位置不定,目錄及文件固定)kernel/power/earlysuspend.cvoid register_early_suspend(struct early_suspend *handler)希望執行early suspend的設備,他的設備驅動
16、程序需要向電源管理系統注冊earlysuspend/lateresume,當電源管理系統啟動suspend流程時,回調函數suspend會被調用,相反,resume的最后階段,回調函數resume會被調用。所有注冊到系統中的early_suspend結構都會按level值按順序加入到全局鏈表early_suspend_handlers中。suspend時,level的數值越小,回調函數的被調用的時間越早,resume時則反過來。例:在PANDA平臺上,我們通過命令查看可以看到哪些設備在哪里注冊了earlysuspend,其中有明顯的網上,觸摸屏的身影;1. cd /omap2. fi
17、nd -name "*.*"| xargs grep -rn "register_early_suspend"3. 4. ./drivers/staging/brcm80211/brcmfmac/dhd_linux.c:2023: register_early_suspend(&dhd->early_suspend);5. ./drivers/staging/brcm80211/brcmfmac/dhd_linux.c:2263: unregister_ear
18、ly_suspend(&dhd->early_suspend);6. ./drivers/staging/msm/mddi.c:231: register_early_suspend(&mfd->mddi_early_suspend);7. ./drivers/staging/msm/mdp.c:1087: register_early_suspend(&early_suspend);8. ./drivers/staging/msm/msm_fb.c:986: register_early_suspend(&mfd-&g
19、t;early_suspend);9. ./drivers/staging/msm/mddi_ext.c:222: register_early_suspend(&mfd->mddi_ext_early_suspend);10. ./drivers/leds/ledtrig-sleep.c:67: register_early_suspend(&ledtrig_sleep_early_suspend_handler);11. ./drivers/leds/ledtrig-sleep.c:73: unregister_early_suspend
20、(&ledtrig_sleep_early_suspend_handler);12. ./drivers/video/omap2/dsscomp/gralloc.c:559: register_early_suspend(&early_suspend_info);13. ./drivers/video/omap2/dsscomp/gralloc.c:598: unregister_early_suspend(&early_suspend_info);14. ./drivers/misc/akm8975.c:664: register_ear
21、ly_suspend(&akm->early_suspend);15. ./drivers/input/touchscreen/synaptics_i2c_rmi.c:539: register_early_suspend(&ts->early_suspend);16. ./drivers/input/touchscreen/synaptics_i2c_rmi.c:561: unregister_early_suspend(&ts->early_suspend);17. ./drivers/input/misc/gpio_event
22、.c:177: register_early_suspend(&ip->early_suspend);18. ./drivers/input/misc/gpio_event.c:203: unregister_early_suspend(&ip->early_suspend);19. ./drivers/input/misc/gpio_event.c:227: unregister_early_suspend(&ip->early_suspend);20. ./drivers/gpu/pvr/display/omap_sg
23、x_displayclass.c:1594: register_early_suspend(&driver_early_suspend);21. ./drivers/gpu/pvr/display/omap_sgx_displayclass.c:1611: unregister_early_suspend(&driver_early_suspend);22. ./drivers/gpu/pvr/omaplfb/omaplfb_linux.c:841: register_early_suspend(&psDevInfo->sEarlyS
24、uspend);23. ./drivers/gpu/pvr/omaplfb/omaplfb_linux.c:852: unregister_early_suspend(&psDevInfo->sEarlySuspend);24. ./drivers/net/wireless/bcmdhd/dhd_linux.c:2674: register_early_suspend(&dhd->early_suspend);25. ./drivers/net/wireless/bcmdhd/dhd_linux.c:3472: unregister_e
25、arly_suspend(&dhd->early_suspend);26. ./drivers/net/wireless/bcm4329/dhd_linux.c:2206: register_early_suspend(&dhd->early_suspend);27. ./drivers/net/wireless/bcm4329/dhd_linux.c:2559:流程 3:用戶空間,通過調用set_screen_state函數來觸發suspend的流程可參考:Android能耗管理機制及優化-電源鍵事件處理流程 4:先valid_state()一下,這給了
26、平臺相關的代碼一個機會確認該平臺是否支持所請求的電源狀態源碼位置:/kernel/power/suspend.cbool valid_state(suspend_state_t state) /* * All states need lowlevel support and need to be valid to the lowlevel * implementation, no valid callback implies that none are valid. */ return suspend_ops &&
27、suspend_ops->valid && suspend_ops->valid(state); 流程 5:調用request_suspend_state()函數request_suspend_state()只是簡單地向suspend_work_queue中加入early_suspend_work或者是late_resume_work并調度他們執行。源碼位置:kernel/power/earlysuspend.cvoid request_suspend_state(suspend_state_t new_state) 流程 6:early_su
28、spend()完成最主要工作在 early_suspend()函數中,首先要判斷當前請求的狀態是否還是suspend,若不是,則退出了;若是,early_suspend()遍歷 early_suspend_handlers鏈表,從中取出各個驅動程序注冊的early_suspend結構,然后調用它的suspend回調函數。 最后,釋放main_wake_lock鎖,至此整個earlysuspend的流程完成。這時整個系統只是處于所謂的idle狀態,cpu還在工作,后臺進程也在工作中,某些設備可以選擇進入某種功耗較低的狀態,比如LCD可以降低亮度或滅掉。源碼位置:kernel/power/earl
29、ysuspend.cstatic void early_suspend(struct work_struct *work)Wakelock模塊Wake lock -是一種鎖的機制,只要有task拿著這個鎖,系統就無法進入休眠,可以被用戶態進程和內核線程獲得。這個鎖可以是有超時的或者是沒有超時的,超時的鎖會在時間過去以后自動解鎖。如果沒有鎖了或者超時了,內核就會啟動標準linux的那套休眠機制機制來進入休眠。詳細內核實現可參見:Wakelock相關機制之wakelock 內核實現Suspend 及平臺相關驅動模塊在wake_unlock()中(可參見上面wakelock模塊內容),刪除鏈表中wake_lock節點,判斷當前是否存在wake_lock,若wake_lock的數目為0,則調用工作隊列suspend_work,進入suspend狀態。static DECLARE_WORK(suspend_work, suspend);其詳細如下:susp
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江蘇省蘇州平江中學2025年初三第一次聯考英語試題文試題含答案
- 浙江省湖州市吳興區2025年初三五校聯誼期中考試試卷數學試題含解析
- 上海市徐匯區2025年初三TOP20三月聯考(全國II卷)生物試題含解析
- 股權無償轉移合同范本大全
- BIM技術研究與開發合同
- 遼寧省大連市中山區2019-2020學年八年級上學期期末測試物理試題【含答案】
- 人教版地理七上第五章《發展與合作》表格教學設計
- Brand KPIs for pet supply online shop Zee.Dog in Brazil-外文版培訓課件(2025.2)
- 山東省煙臺市黃務中學六年級歷史下冊 第8課 輝煌的隋唐文化(二)教學設計 魯教版五四制
- 2024年七月三角形分類教學中的多模態資源整合
- A類供應商績效評價表
- 攝影攝像知識競賽考試題庫500題(含答案)
- 2024至2030年中國丹參行業市場發展監測及投資潛力預測報告
- 《無人機測繪技能訓練模塊》課件-模塊7:無人機航測影像獲取
- 2024招商引資協議書范本
- (完整版)12123交管學法減分考試題及答案
- (高清版)JTG 3810-2017 公路工程建設項目造價文件管理導則
- 慢性腎臟病健康宣教
- 幼兒詩歌《家》課件
- 備孕知識講座課件
- 腹瀉便秘課件
評論
0/150
提交評論