天天看點

Windows CE電源管理的實作 歡迎加入Wince技術讨論群QQ#326444254

歡迎加入Wince技術讨論群QQ#326444254

電源管理的目的是節能,基本的節能方法是使系統适時的進出休眠狀态.比如使用者按下On/Off按鈕,或者監視使用者活動的定時器逾時,或者應用呼叫api都可以使得系統休眠,使用者再次按下On/Off或者其他喚醒中斷将使得系統退出休眠.進而可見,電源管理子產品和使用者活動情況密不可分,電源管理是使用者活動所驅動的. WinCE中處理使用者與系統互動的部分是GWES,是以早期電源管理工作是由GWES來實作.( GWES:Graphics,Windows and Events Subsystem.圖形,視窗和事件子系統.主要負責圖形輸出和使用者互動). 但GWES提供的電源管理子產品功能過于粗糙死闆:所有子裝置隻能有On和Suspend狀态,應用程式無法得到任何狀态轉換通知,等等……直到WinCE4.0才引入了電源管理子產品用以替代GWES中的電源管理功能.(進一步的,為了友善電源管理子產品的集中管理,還需要關閉原來GWES對電源管理功能.方法是系統資料庫HKLM/SYSTEM/CurrentControlSet/Control/Power設定DisableGwesPowerOff=1來禁止GWES插手電源管理.系統是預設禁止的.此外,一些使用者活動情況仍舊依賴GWES獲得,設定系統資料庫HKLM/system/GWE下的ActivityEvent=PowerManager/ActivityTimer/UserActivity.進而告訴GWES,當滑鼠,鍵盤,觸摸屏等輸入發生時候,GWES要SetEvent這個全局事件以通知電源管理子產品.)

新的電源管理子產品提供更完整和靈活的功能,系統電源可以自由靈活設定,子裝置電源狀态可以單獨設定,應用可以獲得電源通知等等.

[系統電源]

OEM可以依據需要任意定義系統電源狀态,比如On,ScreenOff,UserIdle,SystemIdle,Suspend等.系統電源狀态更多的是代表系統電源的一種配置方案,它是各個子裝置電源配置的集合.它設定一種可能出現的情景,并且事先拟定了此情景下電力配置設定政策(哪些子裝置打開,哪些子裝置關閉).比如,也許On可以代表正常工作的情景,所有子裝置打開的狀态; ScreenOff可以代表LCD被使用者請求關閉的情景,LCD背燈電源被關閉的狀态; UserIdle可以代表使用者一段時間沒有操作的情景,cpu/soc将進入low power的狀态; Suspend可以代表裝置空閑很久了可以挂起的情景,所有非必要供電的子裝置電源關閉的狀态;等等…系統的電源狀态的定義很靈活而且自由. 可以在系統資料庫定義系統電源狀态.比如:

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

"Default"=dword:0 ; D0

"Flags"=dword:10000 ; POWER_STATE_ON

上面定義了On狀态,Flags是附加的狀态資訊(hints),對應pm.h中的宏定義POWER_STATE_ON.defaule表示在這個狀态下所有子裝置的預設狀态.

電源管理子產品的重點之一是制訂系統電源管理政策,這包括定義系統電源狀态,決定狀态間轉換的條件.以預設的版本為例子,簡單圖示如下:

子,

On:使用者與系統互動時候的狀态.

UserIdle: 代表使用者停止輸入,但可能仍然在使用的情景,比如閱讀檔案.

SystemIdle: 代表使用者停止使用裝置,但處理器仍然工作的情景,比如,背景檔案傳輸.

Suspend: 代表休眠狀态.

使用者在使用時候,系統處于On狀态,使用者停止輸入,系統自動轉入UserIdle狀态,持續沒有輸入時間後,進入SystemIdle狀态,持續一段時間後,系統将自動進入Suspend狀态.應用程式也可以調用SetSystemPowerState()來進行狀态切換.

在這個基礎上,根據自己的平台特點,增加新的政策就基本可以滿足正常産品需要.

1. On/Off按鍵. (A).電源管理子產品已經支援了電源按鍵功能,最直接的辦法可以在pdd中增加電源按鍵定義,按鍵io的初始化,檢測等等,(B).從外部發送消息給電源管理子產品來通知按鍵事件.(C).使用api直接轉換狀态.即不使用電源管理子產品提供的按鍵功能,直接調用SetSystemPowerState使得系統進入Suspend狀态.這是很常見的做法,我們設計一個電源按鍵的流驅動,檢測到按鍵時候,呼叫api将系統電源轉換到Suspend.

2. 加入背燈控制.比如在On狀态下打開請求顯示驅動打開背燈,在UserIdle和SystemIdle狀态下請求顯示驅動關閉背燈.

[裝置電源]

支援電源管理的裝置驅動的實作,存在有大量的例子.簡單介紹如下:

電源管理子產品并不直接實作對子裝置的電源開關控制,子裝置的電源控制是由各個裝置驅動來控制的.電源管理子產品透過裝置驅動的IOCTLs來請求裝置控制自身電源.系統電源狀态是靈活自由設定的,而裝置電源狀态是固定的,最多有5個:D0,D1,D2,D3,D4代表Full on,Low on, Standby, Sleep, Off這5個狀态.

不是所有的裝置驅動都支援電源管理(至少,在電源管理出現前的早期的裝置驅動不會支援).電源管理子產品對裝置驅動提出了一個規範和架構,滿足規範的驅動納入電源管理.對于流驅動控制的裝置,要支援電源管理要滿足的條件,簡單來說有:1.聲明自己是支援電源管理的(Iclass值).2.驅動中實作電源管理子產品所要求的IOCTLs.3.驅動加載時候要彙報所支援的電源狀态和相關特征.4.***_PowerDown和***_PowerUp接口接收系統休眠和喚醒通知.此外,設計驅動還應該了解:裝置不一定具備所有5種狀态,但至少可以工作在D0;電源管理子產品可能會要求裝置進入任何裝置電源狀态,并不僅僅是裝置所彙報自己支援的那幾個;如果被要求進入不支援的狀态,應該進入另一個它所支援的更高功耗的狀态;目前狀态不需要重複設定;裝置電源狀态不一定和系統的電源狀态同步.除了流驅動外,還有許多内建驅動需要支援電源管理功能.簡單總結:1.顯示驅動通過ExtCode接口(SETPOWERMANAGEMENT指令,類似IOCTLs)來控制顯示驅動的電源,還控制背燈.2鍵盤驅動的接口KeybdDriverPowerHandler.3.觸摸屏是TouchPanelPowerHandler.4.内建網絡miniport驅動是MiniportReset接口.5.PCMCIA驅動是PowerUp和PowerDown.還有列印機,紅外等一些内建驅動.

[OAL對電源管理的支援]

[系統的 idle狀态]

當沒有線程準備運作時候,核心就調用OEMIdle().這個函數在bsp中,可以由OEM來修改定制.一般我們在這個函數裡面會要求cpu進入low power狀态節省電流消耗.一般的cpu/soc都提供了對應idle的睡眠模式.當中斷發生或者喚醒事件發生時候,要保證cpu快速離開idle狀态,傳回運作狀态.

系統idle狀态和前面說的UserIdle狀态是不同概念,前者是cpu負荷情況驅動,代表系統空閑;後者是使用者活動驅動,代表使用者空閑.

一個OEMIdle()的推薦流程:

根據dwReschedTime變量來計算下次喚醒時間

判斷sleep類型,假如需要,調整喚醒時間

Idle處理器和時鐘

中斷發生

判斷喚醒源

更新CurMSec, idle計數值.

[系統suspend狀态]

當使用者按下OFF按鈕或者應用調用api進入suspend狀态時候,核心會調用OEMPowerOff()函數.在OEMPowerOff()函數裡面實作系統挂起,并且系統喚醒後繼續從OEMPowerOff()被挂起處執行. OEMPowerOff()時候要進入睡眠模式,睡眠模式根據cpu晶片的sleep模式來選擇,要選擇最低功耗的模式.如果cpu晶片提供的最低功耗模式是PowerDown模式,處理工作比較複雜,因為喚醒後是從reset處開始執行,要恢複挂起時候的環境,使得應用程式不知道自己被挂起過.一般按照這樣流程來處理:關屏,清framebuffer, 儲存必須的寄存器到記憶體, 設定io, 儲存通用寄存器, 儲存wakeup位址, 靜止中斷,清除cache, 使能喚醒源中斷, 設定sdram自重新整理, cpu進入PowerDown. 喚醒後的流程相反即可. 對于PowerDown模式之外的其他模式,比如慢時鐘模式, 處理則簡單很多,最重要的是設定喚醒源(一般是任何中斷可喚醒), sdram進入自重新整理狀态. 

[SDRAM的控制]

SDRAM的耗電比較大,一般是系統裡面除了lcd背光外,sdram是最大的電力消耗裝置.常見有mobile sdram和normal sdram這2種,mobile sdram相對于normal sdram增加了溫度補償自重新整理,局部陣列自重新整理,深度休眠特性,更加适合功耗限制裝置,(但mobile sdram工作在更低電壓(1.8~2.5v),我想,對有些3.3v總線的cpu未必适合,因為總線會增加很多電平轉換的電路.)

在OEMPowerOff()函數裡面,儲存好目前環境到sdram,然後使得sdram進入自重新整理狀态,cpu就可以進入最低功耗的sleep模式.喚醒後需要退出自重新整理狀态.

[應用層于電源管理]

電源管理子產品也提供了應用層接口,使得應用程式也可以參與到電源管理.

應用層可以通過SetSystemPowerState()來設定系統電源狀态,可以通過SetDevicePower來設定子裝置電源狀态,可以通過SetPowerRequirement通知電源管理子產品将子裝置設定在特殊電源狀态下,不随系統電源改變.此外,電源管理還提供了消息隊列,應用層還可以通過RequestPowerNotifications函數請求電源管理子產品發送相關消息(PBT_RESUME, PBT_POWERSTATUSCHANGE, PBT_TRANSITION, PBT_POWERINFOCHANGE).

設計應用程式也許有幾點值得考慮:不要無謂占用cpu,盡可能快的讓出cpu.比如一個很小的動畫,哪怕隻占1%的cpu也會導緻一些系統無法進入低功耗.這裡是2點建議:(1)當應用不在foreground時候,停止占用cpu.(2)使用者沒有和應用互動時候,停止應用對cpu的占用.另外一些應用也許是相反情況的,播放媒體檔案時候,當開始播放時候,不希望自動進入suspend模式.可以(1)每隔一些時間就reset一次定時器.(2)或者設定所有定時器為0,停止電源管理(tcpmp就是這樣的).

[電源管理的系統實作]

電源管理子產品實體是一個動态連結庫pm.dll來實作的.可以在pb的catalog視窗中選擇電源管理元件添加到os中.如下圖,微軟提供了2個選擇(二選一).第一個代表完整功能,所有api全功能實作,第二個代表空實作(形式上提供接口,但空函數). 

電源管理子產品的代碼結構是分層的,MDD PDD.MDD是抽象公共庫,不需要改動,PDD是平台相關,主要改動都在PDD.針對平台特性,微軟提供了2種類型PDD示例.一種是default,另外一種是pda版本的.預設的情況,使用的是default.如果要使用pda版本的,需要在系統中指定環境變量SYSGEN_PM_PDA. default和pda版本的主要差別:

default版本定義了4種狀态:On, UserIdle, SystemIdle, Suspend;

PDA版本定義了On, ScreenOff, Unattended, Resume, Suspend.

default版本的簡單描述:UserIdle狀态是描述使用者在使用但沒有操作,比如閱讀.SystemIdle狀态描述使用者停止使用,但系統仍然工作,比如檔案傳輸.

PDA版本簡單描述:ScreenOff狀态描述使用者請求把螢幕背燈關閉.是使用者主動關閉的情況,差別于UserIdle,UserIdle是自動的.Unattended狀态表示背景工作,使用者不會對其察覺的情景,比如ActiveSync每5分鐘喚醒系統同步,然後繼續suspend; Resume狀态描述喚醒後情景,比如喚醒後在指定時間内決定轉到哪個狀态,否則繼續suspend.

[定制電源管理子產品的方法]

Pm.dll是由device.exe加載的,首先device.exe當然是必須的,在pb的catalog中檢查Device Manager元件,或者檢查SYSGEN_DEVICE變量.其次,仍舊應該選擇上圖的電源管理元件power management full.

方案一(推薦方案):在bsp的驅動目錄中建立一個pm目錄,在這裡完成電源管理子產品PDD部分的實作,并連結MDD最終生成一個pm.dll替代原來系統的pm.dll.

PDD參考微軟提供的代碼platform.cpp,主要修改是增加狀态轉換的動作執行單元.

方案二:完全不修改電源管理部分,因為預設的PDD在狀态轉換時候雖然沒有動作,但是廣播了PBT_TRANSITION消息,可以截獲這個消息來進行狀态轉換.這樣作法不如方案一直接.如果是程序實作,還浪費一個寶貴程序資源.

[影響系統功耗各方面考慮]

1.系統時鐘周期

典型的WinCE系統時鐘周期是1ms,增加時鐘周期有助進一步降低裝置功耗.在OEMInit()àOALTimerInit()修改系統時鐘.

2.可變系統時鐘節拍Variable Tick Scheduler

典型設計裡wince每毫秒産生系統時鐘中斷,那麼每隔1ms都會使得idle退出,如果發現沒有線程就緒時候繼續idle. 對有功耗限制的設計,可以考慮改變系統時鐘節拍後進入idle狀态.這樣在預期的時間段裡,idle狀态不會被無謂的系統時鐘中斷喚醒.

3.LCD背燈的調節政策

早期的設計使用一個獨立的驅動來實作背燈的控制和調節政策.簡單介紹背燈驅動原理:背燈驅動啟動一個監視工作線程,不停等待3個事件:

1. BackLightChangeEvent

2. PowerChangedEvent(供電電源發生變化,比如插手了AC電源,會獲得了這個事件)

3. PowerManager/ActivityTimer/UserActivity(使用者輸入事件)

從系統資料庫中讀取逾時值,當逾時事件發生,則将系統背燈關閉.背燈關閉期間,使用者重新活動時候,發生第3個事件,則打開背燈.系統資料庫的逾時值決定了背燈工作時間.類同pc上設定螢幕保護時間.此外,背燈驅動也需要提供對系統電源狀态切換的支援.power down時候要關閉背燈,power up時候打開背燈.

電源管理子產品可以定義一種系統電源狀态來描述背燈關閉的情景(比如在UserIdle或者ScreenOff狀态時候關閉背燈,On狀态時候打開背燈)是以,背燈驅動可以被取消.

4.IO口的漏電流

空載IO避免設定成為輸入口,考慮懸空輸入導緻門電路開關,造成電流消耗.負載IO依照情況設定,一般設定輸出低.

5.電池驅動

電池驅動最主要的功能是監視系統電力.它提供了其他子產品和應用對系統電源狀态的查詢,查詢是AC,還是battary供電,查詢電池電量等.

本文來源:資料大全網

原文連結:http://www.sql163.com/html/2009-3/2009328161247_2.html

Windows CE裝置驅動開發之電源管理      第二部分

4.7.2、電源狀态

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

電源管理器在OEM定義的系統電源狀态下管理裝置電源狀态。系統電源狀态在系統資料庫中定義,可以用任意數字定義。系統電源狀态會給裝置電源狀态設定一個上限。

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

4.7.2.1              裝置電源狀态

裝置電源狀态是預定義的靜态值。電源管理器将裝置狀态傳給驅動程式,驅動程式負責将其映射為自身的裝置性能,然後在實體裝置上進行狀态轉換。

下表是對各種裝置電源狀态的描述。

裝置電源狀态

 系統資料庫鍵值

 描述 

Full on

 D0

 此狀态表示裝置已開啟或正在運作。裝置将以系統允許的最大功耗及最高性能運作。 

Low on

 D1

 此狀态表示裝置已開啟或正在運作,但以低于D0狀态的功耗及性能運作。D1狀态适用于裝置已經被使用,但以較低的性能運作即可,沒有必要以最大性能運作,會産生額外的功率消耗。 

Standby

 D2

 此狀态表示裝置被部分供電,保證裝置在需要時能自動喚醒。

Sleep

 D3

 睡眠狀态。保證喚醒的最小供電,在需要時能自動喚醒并初始化。

Off

 D4

 關閉狀态,不供電。

一種實體裝置并不能支援上述所有的裝置電源狀态。但是,所有的裝置都必須支援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可以定義自己的電源狀态标記。

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

鍵名

 描述

Name

 系統電源狀态名稱

Flags

 辨別碼。用于表示在Pm.h頭檔案中預定義的類似于POWER_STATE_ON的标記。

Default

 表示在此系統電源狀态下時,所有裝置的預設裝置電源狀态。此鍵值用數字表示,0代表D0,1代表D1,以此類推。

DeviceName

 設定在此系統電源狀态下指定裝置的最大裝置電源狀态。可以對任意數目的裝置進行定義。

 電源管理器支援多種裝置類型的映射。例如: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下表描述了上面系統資料庫片段的映射方式。

系統電源狀态

 裝置電源狀态 

On

 D0

UserIdle

 D1

SystemIdle

 D2

Suspend

 D3。NDIS迷你接口單獨被映射為D4。

當系統使用上面的系統資料庫配置,并進入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  

constantine 

1.測試的時候沒有接USB 

2.如果用電池供電 

  如果在eboot時配置成disable battery,系統會按照SETTING-POWER-Schemes裡的AC Power設定的時間進入3個模式 

  如果在eboot時配置成enable battery,系統會按照SETTING-POWER-Schemes裡的AC Power設定的時間進入useridle 和systemidle,但不進入suspend或者很久才進入suspend 

3如果用外部電源供電 

  結果同2

繼續閱讀