Windows CE電源管理的實現(轉)

電源管理的目的是節能,基本的節能方法是使系統適時的進出休眠狀態.比如用戶按下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

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/zhongnanjun_3/archive/2009/08/05/4413204.aspx

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