Wince電源管理(二) ---- Windows CE設備驅動開發之電源管理

Windows CE設備驅動開發之電源管理      第二部分

4.7.2、電源狀態

電源管理器期望所有被管理的設備能支持一個或多個設備電源狀態。設備電源狀態的數量是有限的。設備必須通知電源管理器其功耗特性。設備常以功耗換取性能。

電源管理器在OEM定義的系統電源狀態下管理設備電源狀態。系統電源狀態在註冊表中定義,可以用任意數字定義。系統電源狀態會給設備電源狀態設置一個上限。

某些應用程序可能需要特定設備保持運行在指定的設備功率等級上。例如:當一個音頻播放程序在播放音樂時,可能需要網卡及音頻解碼器保持運行在高功率等級。視頻播放程序可能需要網絡、音頻,同時可能要使顯示設備在進入屏幕保護模式後一直顯示,並保持背光常亮。應用程序可以請求電源管理器設置最小設備電源狀態,電源管理器會調用SetPowerRequirement和ReleasePowerRequirement系統API來進行設置。

4.7.2.1              設備電源狀態

設備電源狀態是預定義的靜態值。電源管理器將設備狀態傳給驅動程序,驅動程序負責將其映射爲自身的設備性能,然後在物理設備上進行狀態轉換。

下表是對各種設備電源狀態的描述。

一種物理設備並不能支持上述所有的設備電源狀態。但是,所有的設備都必須支持D0設備電源狀態。如果驅動程序收到請求,要求其將設備進入它不支持的電源狀態,驅動程序應使設備進入下一個支持的電源狀態。例如:電源管理器請求設備進入D2電源狀態,但設備並不支持D2狀態,這時如果設備支持D3或D4狀態,驅動程序應使設備進入D3或D4狀態。如果某一設備需要進入D3狀態,但是此設備卻不能喚醒系統,那麼應使此設備進入D4狀態。上述這些規則可以使驅動程序的執行簡單化。

電源管理器有選擇的將系統電源狀態映射爲對應的設備電源狀態。例如:如果設備僅支持D0及D4電源狀態,那麼,電源管理器不會直接請求設備進入D4電源狀態。如果D3或D4被設爲此設備的最小電源狀態,電源管理器會一直等待直到系統進入D3或D4狀態時,再將設備設爲D4狀態。如果此設備的最小電源狀態被設爲D0、D1或D2,電源管理器將使設備一直運行於D0狀態。

當設備驅動程序被加載時,應將設備設爲D0狀態。在驅動程序被卸載時,應將設備設爲D4狀態。如果在啓動時設備進入了D0外的其他設備電源狀態,那麼可以在處理IOCTL_POWER_CAPABILITIES時發出一個DevicePowerNotify請求。

 

4.7.2.2              系統電源狀態

系統電源狀態由OEM定義,並由OEM引用。OEM可以將其命名爲像On,SystemIdle,OnBattery,InCradle,OutOfCradle等名稱。這些名稱並沒有被系統預定義,也不要求將其定義爲線性序列。系統電源狀態在系統配置註冊表鍵中定義。Windows CE並沒有限制可以定義多少種系統電源狀態。

當然,也可以創建系統電源狀態與預定義的設備電源狀態的顯式映射。顯式映射需要在註冊表中定義。系統電源狀態明確的制定系統中所有設備的最大設備電源狀態。

電源管理器示例定義了On,UserIdle,SystemIdle及Suspend四種系統電源狀態。當用戶使用系統時,電源狀態設爲On。如果用戶停止使用,電源狀態被設爲UserIdle。當用戶在一定的週期內(如30s)不使用系統,則進入SystemIdle狀態;只要設備驅動程序處於活動狀態,系統將一直保持在SystemIdle狀態。如果設備驅動程序停止活動,系統進入Suspend狀態。

UserIdle狀態用於用戶正在使用設備,但卻沒有操作設備。例如,用戶一直觀看屏幕顯示,但沒有手動操作。SystemIdle狀態被用於用戶沒有直接使用設備,但處理器仍在繼續運行。例如,在傳輸文件期間,用戶可能人爲設備已處於空閒狀態,但實際上處理器依舊在持續運行,直到文件傳輸完成。

電源管理器示例實現了根據UserActivity和SystemActivity定時器對用戶及系統活動進行判斷。在定時器超時後,根據當前系統供電狀況(使用外接電源或電池)進行不同的系統電源狀態切換。

Platform Builder提供的Windows CE運行時image示例均使用外接電源供電模式。你可以選擇實現一套在使用電池供電時的電源狀態。複製電源管理器示例代碼的PDD目錄,並對其做適當的修改即可。

4.7.2.2.1   將系統電源狀態映射爲設備電源狀態

在註冊表系統配置中明確定義系統電源狀態名稱。系統電源狀態到設備電源狀態的映射在註冊表的每一個電源狀態名稱鍵值下被枚舉。如下示例代碼:

[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Power/State/Example]   

Default=dword:0; D0   

Flags=dword:10000; POWER_STATE_ON   

COM1:=dword1; D1

上面的註冊表片段定義了名爲Example的系統電源狀態,並設置了除COM1:被限制爲最高運行於D1設備電源狀態外,其他的所有設備最高均可運行於D0設備電源狀態。其中Flags列是一個標識碼,用於表示Pm.h頭文件中定義的POWER_STATE_ON標記。如果需要,OEM可以定義自己的電源狀態標記。

下表列出了鍵值名稱及其描述。

電源管理器支持多種設備類型的映射。例如:NDIS迷你接口及塊設備驅動器設備類型在Pm.h中會被指定爲其自身的GUID類型。其他類型被管理設備的默認值也可以在註冊表中指定。例如:

[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Power/State/Example/{98C5250D-C29A-4985-AE5F-AFE5367E5006}]   

Default=dword:1; D1   

"CISCO1"=dword:0; D0

上面註冊表片段設置電源管理器限值所有NDIS迷你接口設備在Example系統電源狀態下時均運行於D1設備電源狀態,只有名爲CISCO1的設備最高可運行於D0狀態。

 

4.7.2.2.2   系統電源狀態切換

電源管理器在下列情況下進行系統電源狀態切換:

l         OEM定義的狀態切換事件發生。

l         應用程序調用SetSystemPowerState。

OEM定義的事件可能包含設備供電從外接電源切換爲使用電池供電,延長系統空閒週期,將設備插入底座(Cradle),電池電量低等。OEM需要根據情況修改電源管理器,以便判斷兩種系統電源狀態間的切換是否合理,並在必要時切換系統電源狀態。Platform Builder提供的電源管理器源代碼僅支持在設備從外接電源切換爲使用電池供電時進行系統電源狀態切換。

應用程序可以使用系統電源狀態名或表示系統電源狀態的數值爲參數調用SetSystemPowerState函數。如果應用程序瞭解OEM定義的系統電源狀態,那麼可以選擇使用電源狀態名進行顯式調用。對於獨立於平臺的應用程序,則設置數值進行調用,並允許電源管理器決定如何進行電源狀態映射。電源管理器可對應用程序能請求的狀態進行限制。

 

4.7.2.2.3   系統電源狀態示例

下面的註冊表片段是表示系統電源狀態到設備電源狀態映射的示例。

[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Power/State/On]   

"Default"=dword:0           ; D0   

"Flags"=dword:10000         ; POWER_STATE_ON[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Power/State/UserIdle]   

"Default"=dword:1           ; D1   

"Flags"=dword:0[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Power/State/SystemIdle]    "Default"=dword:2           ; D2   

 "Flags"=dword:0

[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Power/State/Suspend]   

"Default"=dword:3           ; D3   

"Flags"=dword:200000        ; POWER_STATE_SUSPEND

; @CESYSGEN IF CE_MODULES_NDIS[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Power/State/Suspend/{98C5250D-C29A-4985-AE5F-AFE5367E5006}]   

 "Default"=dword:4           ; D4

; @CESYSGEN ENDIF CE_MODULES_NDIS

下表描述了上面註冊表片段的映射方式。

當系統使用上面的註冊表配置,並進入Suspend狀態,除了NDIS迷你接口會被關閉外,其他可喚醒源都將處於可激活狀態。如果有設備不支持D3狀態,它將自動進入D4狀態。

應用程序可以使用SetPowerRequirement創建設備電源要求。也可以使用電源管理器控制面板程序創建附加的設備電源要求。

 

4.7.2.3              設備及系統電源狀態名稱

電源管理器要求使用小寫字母命名設備及系統電源狀態名稱。一些類似於wsprintf(buf, "%u", n)或不區分大小寫的比較這樣的操作,會涉及區位表(Locale table)查詢。區位表(Locale table)在Wince.nls內存映射文件中被實現。在掛起期間,電源管理器不能使用FileSystemPowerFunction訪問文件系統。從掛起的線程中訪問文件系統可能造成操作系統死鎖。如果Wince.nls中必須的頁面無法在內存中找到,就會產生死鎖。

在處理API調用時,電源管理器將名稱轉換爲小寫字母。然而,在掛起及恢復狀態時,電源管理器在文件系統操作被禁止後訪問註冊表。這時不能將註冊表設置項轉換爲小寫。所以必須將系統電源狀態註冊表設置改爲小寫字母。例如:WAV1:應被描述爲wav1:。其他類似於註冊表HKLM/Drivers/Builtin下的用於控制設備驅動加載的設置項不用修改。


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/Fenstein/archive/2009/01/10/3746312.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章