




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Android電源管理內(nèi)核模塊總體框架2初始化與接口模塊4early suspend/late resume模塊8Early suspend/late resume概述8Early suspend/late resume流程9流程1 :創(chuàng)建earlysuspend的核心工作隊列線程suspend_work_queue10流程2 :系統(tǒng)啟動完成后,相關(guān)的驅(qū)動程序通過register_early_suspend()函數(shù)注冊了early suspendlateresume特性10流程 3:用戶空間,通過調(diào)用set_screen_state函數(shù)來觸發(fā)suspend的流程13流程 4:先valid_st
2、ate()一下,這給了平臺相關(guān)的代碼一個機(jī)會確認(rèn)該平臺是否支持所請求的電源狀態(tài)13流程 5:調(diào)用request_suspend_state()函數(shù)13流程 6:early_suspend()完成最主要工作13Wakelock模塊14Suspend 及平臺相關(guān)驅(qū)動模塊14參考資料17Android電源管理內(nèi)核模塊總體框架Android電源管理內(nèi)核模塊,主要是由以下幾個基本模塊組成,詳細(xì)分析如下:電源管理內(nèi)核模塊總體組成電源管理內(nèi)核模塊總體組成圖電源管理內(nèi)核模塊從功能角度出發(fā),各模塊關(guān)系示意圖如下:電源管理內(nèi)核模塊各模塊關(guān)系示意圖1簡單說明:內(nèi)核空間提供3個sys接口,即加鎖,解鎖,休眠喚醒,當(dāng)所
3、有的鎖解開的時候,會執(zhí)行標(biāo)準(zhǔn)linux的suspend.ealry_suspend: 設(shè)備:觸摸屏,按鍵,gpu,電子羅盤,攝像頭,led,wifi等linux suspend設(shè)備:usb cpu 總線等。電源管理內(nèi)核模塊各模塊關(guān)系示意圖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. 函數(shù)執(zhí)行后,會在生成/sys/power目錄,該目錄下會建立一系列屬性文件,其中一個就是/sys/power/state文件.從core_initcall(pm_init))可以知道:函數(shù)在初始化時被執(zhí)行關(guān)于此函數(shù)可見1,同樣,我們從main.c中可以看
6、到,/sys/power目錄下應(yīng)該還有的屬性文件有:如果內(nèi)核:#ifdef CONFIG_PM_SLEEPpower_attr(pm_async);/line 70則有:/sys/power/pm_async功能:cat/sys/power/pm_async用于判斷當(dāng)前設(shè)備的suspend、resume操作是否是同步操作echo/sys/power/pm_async用于控制是否異步的執(zhí)行設(shè)備的suspend、resume操作#ifdef CONFIG_USER_WAKELOCKpower_attr(wake_lock);power_attr(wake_unlock);#endif則有:/sys
7、/power/wake_lock,sys/power/unwake_lock文件注意其對應(yīng)的SHOW與STORE功能實現(xiàn)函數(shù)在:/kernel/power/userwakelock.c功能:cat/sys/power/wake_lock查看系統(tǒng)的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,在終端上打印出上面數(shù)組中的字符串,當(dāng)前的模式用表示出來。echo devices > pm_test的時候會最終調(diào)用到函數(shù)pm_test_store()中去,該函數(shù)中設(shè)置全局變量pm_test_level的值,可以是0-5,分別代表上none freezer。該全局變量會在后面的suspend和resume中被引用到。#ifdef CONFIG_PM_SLEEPpower_attr(wakeup_c
9、ount);則有:/sys/power/wakeup_count注意其對應(yīng)的SHOW與STORE功能實現(xiàn)函數(shù)在:/drivers/base/power/wakeup.c功能:cat/sys/power/wakeup_count讀取當(dāng)前已經(jīng)注冊wakeup事件數(shù)目echo/sys/power/wakeup_count寫入時,只有寫入值和當(dāng)前已經(jīng)注冊wakeup事件數(shù)目相同時,才會有作用,如果成功了,會使內(nèi)核進(jìn)入一段連續(xù)睡眠如果在寫入后沒有任何的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事件點,這樣可以用來調(diào)試時使用。/sys/power/pm_trace則是如果使用了pm_trace,此文件中可以包含和最后的PM事件點有關(guān)的設(shè)備的名稱。這些文件接口使用例子:1) cat /sys/power/state
11、 -查看系統(tǒng)狀態(tài),echo mem > /sys/power/state -將系統(tǒng)設(shè)置為進(jìn)入休眠2) echo "name" > /sys/power/wake_lock -申請一個鎖cat /sys/power/wake_lock -查看系統(tǒng)的wake lock情況wake_unlock同樣??偨Y(jié):cat會調(diào)用相應(yīng)的xxx_show();echo會調(diào)用相應(yīng)的xxx_store()來實現(xiàn)一定的獲取狀態(tài)或設(shè)置等功能。early suspend/late resume模塊Early suspend/late resume概述android引入了新的機(jī)制來管理電源,e
12、arly suspend、late resume和wake lock。Early Suspend和Late Resume是Android在標(biāo)準(zhǔn)Linux的基礎(chǔ)上增加的一項特性。當(dāng)用戶空間的向內(nèi)核請求進(jìn)入suspend時,這時候會先進(jìn)入early suspend狀態(tài),驅(qū)動程序可以注冊early suspend的回調(diào)函數(shù),當(dāng)進(jìn)入該狀態(tài)時,內(nèi)核會逐一地調(diào)用這些回調(diào)函數(shù)。例如顯示屏的驅(qū)動程序通常會注冊early suspend,在他的回調(diào)函數(shù)中,驅(qū)動程序會把屏幕和背光都關(guān)閉。在這種狀態(tài)下,所有的后臺進(jìn)程都還在活動中,該播放歌曲的播放歌曲,該下載數(shù)據(jù)的依然在下載,只是顯示屏不良而已。進(jìn)入early su
13、spend狀態(tài)以后,一旦所有的電源鎖(wake lock)被釋放,系統(tǒng)馬上會進(jìn)入真正的suspend流程,直到最后系統(tǒng)停止工作,等待外部事件的喚醒。Early suspend用于在關(guān)閉顯示的時候使一些與顯示有關(guān)的設(shè)備(如LCD背光、重力感受器、觸摸屏等)都關(guān)掉,但是系統(tǒng)可能仍處于運行狀態(tài)并處理著任務(wù),在嵌入式設(shè)備中,背光會消耗大量的電量,所以android引入了early suspend。進(jìn)入early suspend狀態(tài)以后,一旦所有的電源鎖(wake lock)被釋放,系統(tǒng)馬上會進(jìn)入真正的suspend流程,直到最后系統(tǒng)停止工作,等待外部事件的喚醒2。加入后early suspend電源狀
14、態(tài)整體狀態(tài)轉(zhuǎn)換圖:加入后early suspend電源狀態(tài)整體狀態(tài)轉(zhuǎn)換圖用戶空間的接口創(chuàng)建,見 初始化與接口模塊部分存在/sys/power/state的SYS接口Early suspend/late resume流程Early suspend/late resume 調(diào)用流程圖Early suspend調(diào)用流程詳細(xì)說明流程1 :創(chuàng)建earlysuspend的核心工作隊列線程suspend_work_queue源碼位置:(平臺不同源碼實際位置不定,目錄及文件固定kernel/power/wakelock.cstatic int _initwakelocks_init(void) .
15、suspend_work_queue = create_singlethread_workqueue("suspend"); .流程2 :系統(tǒng)啟動完成后,相關(guān)的驅(qū)動程序通過register_early_suspend()函數(shù)注冊了early suspendlateresume特性源碼位置:(平臺不同源碼實際位置不定,目錄及文件固定)kernel/power/earlysuspend.cvoid register_early_suspend(struct early_suspend *handler)希望執(zhí)行early suspend的設(shè)備,他的設(shè)備驅(qū)動
16、程序需要向電源管理系統(tǒng)注冊earlysuspend/lateresume,當(dāng)電源管理系統(tǒng)啟動suspend流程時,回調(diào)函數(shù)suspend會被調(diào)用,相反,resume的最后階段,回調(diào)函數(shù)resume會被調(diào)用。所有注冊到系統(tǒng)中的early_suspend結(jié)構(gòu)都會按level值按順序加入到全局鏈表early_suspend_handlers中。suspend時,level的數(shù)值越小,回調(diào)函數(shù)的被調(diào)用的時間越早,resume時則反過來。例:在PANDA平臺上,我們通過命令查看可以看到哪些設(shè)備在哪里注冊了earlysuspend,其中有明顯的網(wǎng)上,觸摸屏的身影;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:用戶空間,通過調(diào)用set_screen_state函數(shù)來觸發(fā)suspend的流程可參考:Android能耗管理機(jī)制及優(yōu)化-電源鍵事件處理流程 4:先valid_state()一下,這給了
26、平臺相關(guān)的代碼一個機(jī)會確認(rèn)該平臺是否支持所請求的電源狀態(tài)源碼位置:/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:調(diào)用request_suspend_state()函數(shù)request_suspend_state()只是簡單地向suspend_work_queue中加入early_suspend_work或者是late_resume_work并調(diào)度他們執(zhí)行。源碼位置:kernel/power/earlysuspend.cvoid request_suspend_state(suspend_state_t new_state) 流程 6:early_su
28、spend()完成最主要工作在 early_suspend()函數(shù)中,首先要判斷當(dāng)前請求的狀態(tài)是否還是suspend,若不是,則退出了;若是,early_suspend()遍歷 early_suspend_handlers鏈表,從中取出各個驅(qū)動程序注冊的early_suspend結(jié)構(gòu),然后調(diào)用它的suspend回調(diào)函數(shù)。 最后,釋放main_wake_lock鎖,至此整個earlysuspend的流程完成。這時整個系統(tǒng)只是處于所謂的idle狀態(tài),cpu還在工作,后臺進(jìn)程也在工作中,某些設(shè)備可以選擇進(jìn)入某種功耗較低的狀態(tài),比如LCD可以降低亮度或滅掉。源碼位置:kernel/power/earl
29、ysuspend.cstatic void early_suspend(struct work_struct *work)Wakelock模塊Wake lock -是一種鎖的機(jī)制,只要有task拿著這個鎖,系統(tǒng)就無法進(jìn)入休眠,可以被用戶態(tài)進(jìn)程和內(nèi)核線程獲得。這個鎖可以是有超時的或者是沒有超時的,超時的鎖會在時間過去以后自動解鎖。如果沒有鎖了或者超時了,內(nèi)核就會啟動標(biāo)準(zhǔn)linux的那套休眠機(jī)制機(jī)制來進(jìn)入休眠。詳細(xì)內(nèi)核實現(xiàn)可參見:Wakelock相關(guān)機(jī)制之wakelock 內(nèi)核實現(xiàn)Suspend 及平臺相關(guān)驅(qū)動模塊在wake_unlock()中(可參見上面wakelock模塊內(nèi)容),刪除鏈表中wake_lock節(jié)點,判斷當(dāng)前是否存在wake_lock,若wake_lock的數(shù)目為0,則調(diào)用工作隊列suspend_work,進(jìn)入suspend狀態(tài)。static DECLARE_WORK(suspend_work, suspend);其詳細(xì)如下:susp
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教學(xué)流程設(shè)計規(guī)范
- 網(wǎng)絡(luò)批發(fā)商風(fēng)險管理及應(yīng)對策略考核試卷
- 禽類屠宰行業(yè)發(fā)展趨勢與挑戰(zhàn)考核試卷
- 虛擬時尚設(shè)計平臺考核試卷
- 2023中國彩妝洞察報告
- 2025年過熱蒸汽干燥設(shè)備項目建議書
- 中醫(yī)外科學(xué)多媒體課件-皮膚病疾患
- 2024年全球及中國別墅裝修服務(wù)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 玖舍文化課件
- 2019-2025年安全員之B證(項目負(fù)責(zé)人)題庫與答案
- 碳酸乙酯(碳酸二乙酯)的理化性質(zhì)及危險特性表
- 模具保養(yǎng)記錄表
- 三年級語文下冊第七單元(集體備課)教材分析說課稿課件
- SAP零售行業(yè)解決方案
- 四川大學(xué)年《系統(tǒng)解剖學(xué)》期末試題及答案
- 博德之門BG+TOSC細(xì)節(jié)攻略
- 西南交通大學(xué)《行車組織》區(qū)段站工作組織課程設(shè)計(附大圖)
- 正畸沙龍專用宣教PPT-口腔正畸正當(dāng)時
- 阿帕套裝汽車改燈燈光升級ppt課件
- 年產(chǎn)12.5萬噸鹽酸工程二段吸收工序工藝設(shè)計
- 衛(wèi)生監(jiān)督稽查規(guī)范
評論
0/150
提交評論