日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

WINCE电源管理

發(fā)布時(shí)間:2025/4/16 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WINCE电源管理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

********************************LoongEmbedded************************

作者:LoongEmbedded(kandi)

時(shí)間:2011.03.07

類別:WINCE嵌入式系統(tǒng)開發(fā)

********************************LoongEmbedded************************

?

?

1.?????? WINCE電源管理的架構(gòu)

1

使用電源管理器,設(shè)備可以接收電源狀態(tài)改變的通知,這個(gè)通知是以I/O控制的方式(IOCTL控制碼)的方式來和設(shè)備驅(qū)動(dòng)通信的。因?yàn)?/span>I/O控制運(yùn)行在線程上下文環(huán)境中,驅(qū)動(dòng)開發(fā)者可以很靈活去實(shí)現(xiàn)電源狀態(tài)的改變。使用I/O控制的方式來管理電源也可以讓設(shè)備電源狀態(tài)獨(dú)立于整體的OS電源狀態(tài)。所以,當(dāng)OS在運(yùn)行的時(shí)候一些設(shè)備可以關(guān)閉,而在OS掛起的時(shí)候一些設(shè)備可以繼續(xù)保持正常的工作狀態(tài)。

電源管理器除了管理設(shè)備電源之外,它可以通知應(yīng)用程序相關(guān)的電源事件,比如,當(dāng)OS從掛起的狀態(tài)恢復(fù)的時(shí)候,電源管理器會(huì)通知感興趣的應(yīng)用程序。電源管理器作為設(shè)備驅(qū)動(dòng)和應(yīng)用程序的中間層(傳遞者),它定義了OS電源狀態(tài),并且在這三者之間的通信中實(shí)現(xiàn)下面這些功能

OS電源狀態(tài)決定了所有的設(shè)備的最大的電源消耗。

應(yīng)用程序通過強(qiáng)制限制特定的設(shè)備最小的電源功耗來讓此設(shè)備獲得最小的性能水平。

電源管理器允許設(shè)備聰明地管理自己的電源,只要設(shè)備的電源等級(jí)在最大和最小的限制值之間。

如果設(shè)置最小的電源功耗大于它本身的最大值,只要應(yīng)用程序需要設(shè)備,那么這個(gè)設(shè)備就會(huì)保持在高的電源功耗狀態(tài)。

設(shè)備可以有一個(gè)或者多個(gè)設(shè)備電源狀態(tài),但被限制在D0D4之間。

如果OS轉(zhuǎn)變?yōu)閽炱鸬臓顟B(tài),應(yīng)用程序決定設(shè)備的最小功耗的限制。

?

設(shè)備驅(qū)動(dòng)可以調(diào)用DevicePowerNotify函數(shù)來調(diào)整設(shè)備自身的功耗水平,并且應(yīng)用程序可以調(diào)用SetPowerRequirement來核實(shí)設(shè)備需要運(yùn)行在可以受的性能水平上。

?

WinCE電源管理器通過一個(gè)名為Pm.dll的動(dòng)態(tài)鏈接庫(kù)與設(shè)備管理器Device.exe鏈接。Pm.dll動(dòng)態(tài)鏈接庫(kù)支持三類接口:一是驅(qū)動(dòng)程序接口:為需要進(jìn)行電源管理的設(shè)備的驅(qū)動(dòng)程序使用;二是應(yīng)用程序接口:為需要利用電源管理的應(yīng)用程序使用;三是提醒接口(Notification):為需要接受電源事件提醒的應(yīng)用程序使用。

?

2.?????? 系統(tǒng)電源狀態(tài)

系統(tǒng)電源狀態(tài)明確指定了系統(tǒng)中所有設(shè)備的最大設(shè)備電源狀態(tài),并且由OEM來定義系統(tǒng)的電源狀態(tài),而系統(tǒng)電源狀態(tài)大概有以下幾種

on

用戶與系統(tǒng)交互時(shí)的狀態(tài),在common.reg中的相關(guān)信息如下:

2

BacklightOff

在一段時(shí)間內(nèi),如果一直沒有用戶操作(比如按下某個(gè)鍵或者觸摸屏幕),就關(guān)閉背光,這時(shí)其他的設(shè)備也可以關(guān)閉,這需要看設(shè)計(jì)的需要了,這個(gè)timeout值可以通過控制面板進(jìn)行設(shè)置。

?

UserIdle

在一段時(shí)間內(nèi),如果一直沒有用戶操作,LCD屏工作在低功耗模式或者關(guān)閉顯示 (這取決于OEM的設(shè)計(jì)了),在common.reg中的相關(guān)信息如下:

3

SystemIdle

用戶沒有直接使用系統(tǒng),這種狀態(tài)下認(rèn)為設(shè)備處于空閑的狀態(tài),當(dāng)處理器仍然在工作,比如在進(jìn)行文件傳輸,在common.reg中的相關(guān)信息如下:

4

Suspended

睡眠狀態(tài),沒有線程在運(yùn)行。CPU處于idle的狀態(tài),這時(shí)候只能通過硬件的喚醒中斷才能喚醒系統(tǒng)。

5

?

?

3.?????? 設(shè)備電源狀態(tài)

設(shè)備電源狀態(tài)是預(yù)先定義的,電源管理器遞給一個(gè)設(shè)備狀態(tài)給設(shè)備驅(qū)動(dòng),然后這個(gè)驅(qū)動(dòng)負(fù)責(zé)根據(jù)設(shè)備的能力來映射為相應(yīng)的電源狀態(tài),并且讓設(shè)備工作在恰當(dāng)?shù)碾娫礌顟B(tài)下。

Full on

D0,此狀態(tài)表示設(shè)備已開啟或正在運(yùn)行,系統(tǒng)要求設(shè)備工作在最大功耗和最高性能的狀態(tài)。

?

Low on

D1,此狀態(tài)表示設(shè)備已開啟或正在運(yùn)行,但以低于D0狀態(tài)的功耗及性能運(yùn)行。D1狀態(tài)適用于設(shè)備已經(jīng)被使用,但以較低的性能運(yùn)行即可,沒有必要以最大性能運(yùn)行,會(huì)產(chǎn)生額外的功率消耗。

?

Standby

D2,此狀態(tài)表示設(shè)備被部分供電,且設(shè)備在需要時(shí)可以自動(dòng)喚醒。

?

Sleep

D3,睡眠狀態(tài)。保證喚醒的最小供電,在需要時(shí)能自動(dòng)喚醒并初始化。

?

Off

D4,關(guān)閉狀態(tài),不供電。

?

6

?

?

?

4.?????? 電源管理器接口

4.1??? 應(yīng)用程序電源管理接口

應(yīng)用程序可以利用這些接口來調(diào)整系統(tǒng)及設(shè)備的電源狀態(tài),這些接口中,只有GetSystemPowerState()SetPowerRequirement()ReleasePowerRequirement()函數(shù)是為一般的應(yīng)用程序設(shè)計(jì)的。比如,應(yīng)用程序可以調(diào)用SetSystemPowerState函數(shù)來掛起系統(tǒng),但電源管理器可以限制應(yīng)用程序請(qǐng)求系統(tǒng)進(jìn)入掛起狀態(tài)的情況,所以其他一些應(yīng)用程序電源管理接口函數(shù)SetSystemPowerState()GetDevicePower?? ()SetDevicePower()是為OEM應(yīng)用來設(shè)計(jì)的,比如控制面板應(yīng)用程序,下面來學(xué)習(xí)這些函數(shù)

GetSystemPowerState函數(shù)

這個(gè)函數(shù)用戶返回系統(tǒng)電源狀態(tài)(比如是on),在power按鍵驅(qū)動(dòng)中加入下面的代碼

dwErr = GetSystemPowerState(wPState, 20, &dFlag);

輸出的wPState=on”,dFlag=0x12010000,這個(gè)dFlag的值表示什么意思呢?見下圖

是在pm.h下定義的

7

SetSystemPowerState函數(shù)

SetSystemPowerState函數(shù)可被OEM程序或者其他應(yīng)用程序調(diào)用,來把系統(tǒng)電源狀態(tài)設(shè)置為需要值,相關(guān)描述見VS2005中的相關(guān)文檔

8

如可以像下面一樣來使用

Result = SetSystemPowerState(NULL, POWER_STATE_ON, POWER_FORCE);

?

SetPowerRequirement函數(shù)

?

調(diào)用SetSystemPowerState是一個(gè)直接改變電源狀態(tài)的方法。更巧妙的方法是通過調(diào)用SetPowerRequirement來請(qǐng)求系統(tǒng)維持應(yīng)用程序所需最低限度的電源狀態(tài)。SetSystemPowerState是假定應(yīng)用程序知道所需狀態(tài),而調(diào)用SetPowerRequirement是允許系統(tǒng)對(duì)電源設(shè)定做優(yōu)化以滿足應(yīng)用程序的需要。一個(gè)使用SetPowerRequirement會(huì)比較方便的例子是,一個(gè)使用串口的應(yīng)用程序需要串口在進(jìn)行通信時(shí)保持住電源狀態(tài)。SetPowerRequirement被定義如下

9

第一個(gè)參數(shù)指定了應(yīng)用程序需要維護(hù)電源狀態(tài)的設(shè)備。DeviceState參數(shù)定義了設(shè)備的電源狀態(tài)。CEDEVICE_POWER_STATE指定了狀態(tài)范圍是從D0(意味著設(shè)備是處于最大功耗狀態(tài))到D4(表示設(shè)備被關(guān)閉)(譯者注:其實(shí)D0D4的狀態(tài)的具體表現(xiàn),完全是由OEM廠商可自定義的,對(duì)應(yīng)用程序開發(fā)者來說,比如是在D1關(guān)LCD背光還是在D2,都是不確定的,微軟只給出標(biāo)準(zhǔn)定義,而不是實(shí)際定義)。DeviceFlags參數(shù)由兩個(gè)標(biāo)志合并而成:POWER_NAME,表示設(shè)備名有效;POWER_FORCE,表示設(shè)備應(yīng)當(dāng)維持當(dāng)前狀態(tài)甚至當(dāng)系統(tǒng)掛起時(shí)。如果pvSystemState不為NULL,它表示只有對(duì)于在pvSystemState中已命名的電源請(qǐng)求才是有效的。設(shè)備可能無法更改請(qǐng)求的狀態(tài),應(yīng)用如下:

const WCHAR VideoCallDialog_t::sc_BacklightDeviceName[] = L"bkl1:";

m_BacklightPowerRequirementHandle = SetPowerRequirement(

??????????? (PVOID)(sc_BacklightDeviceName),

??????????? D0,

??????????? POWER_NAME,

??????????? NULL, 0

??????????? );

舉例來說,假設(shè)有一個(gè)條形碼閱讀器連接在COM1端口,并COM1只有在最高電源等級(jí)(D0)時(shí)才能驅(qū)動(dòng)這個(gè)條形碼閱讀器。為了使其正常工作,應(yīng)用程序?qū)⒄{(diào)用SetPowerRequirementCOM1指定D0狀態(tài)。假設(shè)之后串口驅(qū)動(dòng)自身決定降低一個(gè)電源等級(jí),驅(qū)動(dòng)調(diào)用DevicePowerNotify通知電源管理器它期望的設(shè)備電源狀態(tài),驅(qū)動(dòng)程序的這個(gè)請(qǐng)求將不起作用,直到應(yīng)用程序調(diào)用ReleasePowerRequirement為止。繼續(xù)這個(gè)例子,假設(shè)這時(shí)的系統(tǒng)電源狀態(tài)轉(zhuǎn)換為低能耗等級(jí),雖然與之相關(guān)的COM1電源等級(jí)為D3,由于應(yīng)用程序的電源請(qǐng)求,COM1將繼續(xù)維持在D0狀態(tài)。

在調(diào)用SetPowerRequirement函數(shù)時(shí),指定POWER_FORCE標(biāo)志將強(qiáng)制設(shè)備不進(jìn)入休眠狀態(tài),即使這時(shí)系統(tǒng)已處于休眠狀態(tài)。

?

ReleasePowerRequirement函數(shù)

這個(gè)函數(shù)請(qǐng)求電源管理器釋放SetPowerRequirement函數(shù)的電源請(qǐng)求,應(yīng)用程序和驅(qū)動(dòng)應(yīng)該在停止電源請(qǐng)求的時(shí)候明確地釋放掉此電源請(qǐng)求。

?

GetDevicePower函數(shù)

返回某個(gè)設(shè)備當(dāng)前的電源狀態(tài)

10

?

SetDevicePower函數(shù)

這個(gè)函數(shù)用于某個(gè)設(shè)備為某種電源狀態(tài),這個(gè)函數(shù)使用的時(shí)候需要注意下面的原則

If a device is requested to go into a power state that the device does not support, Power Manager sets the device power state to the next highest supported power level, where D0 (full power) is the highest level.

?

For example, if the D4 state is requested and the device does not support D4, then D4 is mapped to D3. If D3 is not supported, then D3 is mapped to D2 and so on. All devices must at least support D0. For more information about the power states, see CEDEVICE_POWER_STATE. The Power Manager code is located in the public/common/oak/drivers/pm directory.

?

4.2??? 設(shè)備驅(qū)動(dòng)電源管理接口

電源管理器默認(rèn)的實(shí)現(xiàn)可以檢測(cè)到下面幾種GUIDglobally unique identifier,全球唯一標(biāo)識(shí)符),分別如下:

11

我們的工程中interfacescommon.reg中的注冊(cè)表項(xiàng)內(nèi)容如下:

; Power Manager interfaces.? These list the interface classes that the Power

; Manager will monitor for new devices.

;

[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Power/Interfaces]

??? "{A32942B7-920C-486b-B0E6-92A702A99B35}"="Generic power-manageable devices"

??? "{8DD679CE-8AB4-43c8-A14A-EA4963FAA715}"="Power-manageable block devices"

; @CESYSGEN IF CE_MODULES_NDIS

??? "{98C5250D-C29A-4985-AE5F-AFE5367E5006}"="Power-manageable NDIS miniports"

; @CESYSGEN ENDIF CE_MODULES_NDIS

; @CESYSGEN IF CE_MODULES_GWES

??? "{EB91C7C9-8BF6-4a2d-9AB8-69724EED97D1}"="Power-manageable display"

; @CESYSGEN ENDIF CE_MODULES_GWES

?

電源管理器用兩種機(jī)制來和支持電源管理的驅(qū)動(dòng)通信:

4.2.1電源管理器調(diào)用DeviceIoControl控制設(shè)備電源狀態(tài)

電源管理器通過DeviceIoControl及對(duì)應(yīng)的ControlCode可以查詢?cè)O(shè)備支持電源管理的能力及可以更新設(shè)備的電源狀態(tài),電源管理器使用下面的控制碼來和設(shè)備通信

IOCTL_POWER_CAPABILITIES

電源管理器請(qǐng)求設(shè)備驅(qū)動(dòng)返回設(shè)備支持的電源狀態(tài)及相關(guān)特征.

IOCTL_POWER_SET

請(qǐng)求設(shè)備驅(qū)動(dòng)更新設(shè)備的電源狀態(tài)。

IOCTL_POWER_QUERY

電源管理器詢問設(shè)備是否做好狀態(tài)更新的準(zhǔn)備。

IOCTL_POWER_GET

請(qǐng)求驅(qū)動(dòng)返回設(shè)備當(dāng)前的電源狀態(tài)。

IOCTL_REGISTER_POWER_RELATIONSHIP

通知父設(shè)備注冊(cè)所有它所控制的設(shè)備。

4.2.2設(shè)備可以請(qǐng)求電源管理器來改變自身的電源狀態(tài)

電源管理器提供下面的函數(shù)用于支持電源管理的設(shè)備來向電源管理器請(qǐng)求電源服務(wù):

DevicePowerNotify函數(shù)

設(shè)備驅(qū)動(dòng)通過DevicePowerNotify函數(shù)請(qǐng)求系統(tǒng)改變它們的電源狀態(tài),這個(gè)時(shí)候電源管理模塊就用調(diào)用相應(yīng)的IOCTL(比如IOCTL_POWER_SET)來實(shí)現(xiàn)電源狀態(tài)的管理,比如camera驅(qū)動(dòng)中的應(yīng)用如下,在初始化函數(shù)CIS_Init中調(diào)用:

DevicePowerNotify(_T("CIS1:"),(_CEDEVICE_POWER_STATE)D0, POWER_NAME);

?

RegisterPowerRelationship函數(shù)

用于建立動(dòng)態(tài)的父設(shè)備及其子設(shè)備的關(guān)系,或者是總線及客戶端驅(qū)動(dòng)的關(guān)系,這樣設(shè)備驅(qū)動(dòng)就可以管理一系列依賴的子和客戶端驅(qū)動(dòng)。

12

?

ReleasePowerRelationship函數(shù)

釋放RegisterPowerRelationship函數(shù)返回的句柄。

?

?

5.?????? 電源管理的實(shí)現(xiàn)

5.1??? 電源管理器對(duì)應(yīng)的組件

13

電源管理器對(duì)應(yīng)的代碼在/WINCE600/PUBLIC/COMMON/OAK/DRIVERS/PM下面

?

5.2??? 在需要的設(shè)備驅(qū)動(dòng)中添加電源管理功能

不是所有的設(shè)備驅(qū)動(dòng)都需要支持電源管理功能的,這需要根據(jù)設(shè)備的特性來決定,但是為了讓Power Manager知道哪些驅(qū)動(dòng)是支持電源管理功能的,需要在注冊(cè)表中包含相應(yīng)的鍵值(IClass)或者在驅(qū)動(dòng)初始化時(shí)調(diào)用AdvertiseInterface()。一般來說,流驅(qū)動(dòng)用注冊(cè)表鍵值比較方便一些,而顯示驅(qū)動(dòng)通常用AdvertiseInterface()來告知。流驅(qū)動(dòng)和顯示驅(qū)動(dòng)在實(shí)現(xiàn)電源管理的功能上也有所不同。流驅(qū)動(dòng)主要是在XXX_IOControl中,實(shí)現(xiàn)IOCTL_POWER_CAPABILITIESIOCTL_POWER_QUERYIOCTL_POWER_SETIOCTL_POWER_GET,而顯示驅(qū)動(dòng)主要是在DrvEscape中實(shí)現(xiàn)以上幾個(gè)IoControlCode,另外需要注意在QUERYESCSUPPORT添加相應(yīng)的IoControlCode,下面是支持電源管理的I2C驅(qū)動(dòng)在platform.reg中的注冊(cè)表內(nèi)容

14

我們可以到my device->control panel->power->device status下來查看系統(tǒng)中哪些驅(qū)動(dòng)支持電源管理功能,見下圖

15

5.3??? 在驅(qū)動(dòng)和應(yīng)用程序中添加相應(yīng)的支持

在驅(qū)動(dòng)的DeviceIoControl中實(shí)現(xiàn)4.2中提到的“設(shè)備驅(qū)動(dòng)電源管理接口“,而在應(yīng)用程序中通過調(diào)用電源管理的API,協(xié)助系統(tǒng)管理各個(gè)設(shè)備和整個(gè)系統(tǒng)的工作狀態(tài)。具體的細(xì)節(jié)可以參考BSP包中的支持電源管理的驅(qū)動(dòng)及微軟自帶的應(yīng)用程序了。

?

?

?

?

WINCE電源管理

http://www.cnblogs.com/we-hjb/archive/2010/01/27/1657973.html

?

WINCE 電源管理中的應(yīng)用程序API

http://www.xici.net/#d120135354.htm

?

WINCE 設(shè)備驅(qū)動(dòng)中實(shí)現(xiàn)電源管理

http://apps.hi.baidu.com/share/detail/5889365

?

?

CSDN帖子

http://topic.csdn.net/u/20100123/16/a070bb34-3415-459c-96f4-65250cf87319.html

?

總結(jié)

以上是生活随笔為你收集整理的WINCE电源管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。