[计算机软件及应用]翻译msdn WinCE 电源管理.doc

上传人:音乐台 文档编号:1992079 上传时间:2019-01-29 格式:DOC 页数:45 大小:307.50KB
返回 下载 相关 举报
[计算机软件及应用]翻译msdn WinCE 电源管理.doc_第1页
第1页 / 共45页
[计算机软件及应用]翻译msdn WinCE 电源管理.doc_第2页
第2页 / 共45页
[计算机软件及应用]翻译msdn WinCE 电源管理.doc_第3页
第3页 / 共45页
亲,该文档总共45页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《[计算机软件及应用]翻译msdn WinCE 电源管理.doc》由会员分享,可在线阅读,更多相关《[计算机软件及应用]翻译msdn WinCE 电源管理.doc(45页珍藏版)》请在三一文库上搜索。

1、翻译msdn WinCE 电源管理 翻译msdn Windows CE 5.0 Documentation中Developing a Device Driver-Power Management内容。 电源管理模块管理设备的电源,并整体改进操作系统的电源使用效率;它提供每一个设备的电源管理,同时能与不支持电源管理的应用程序及驱动程序共存。 使用电源管理模块可以有效的减少目标设备的电源消耗,同时,能在reset(复位)、on(运行)、idle(空闲)、和supend(挂起)的电源状态,并保护RAM中的文件系统。 电源管理具有以下特性: 1、使设备具有自行电源管理功能;2、建立一种在系统中使用设备

2、电源在挂起和恢复状态间切换的机制;3、一个对系统环境、电源状态和设备电源状态有统一认识的模块。你可以自定义电源管理,使全系统的电源分配适合您的设备;4、当系统挂起或者恢复时,使系统跳过所有代码调用PowerOffSystem函数。This API should only be called by the Power Manager, or by the OEM if the Power Manager is not present and after FileSystemPowerFunction is called.一、 电源管理架构在不依赖电源管理器的模型的情况下,只能对设备进行简单的管理

3、。电源管理器为OEM厂商和设备驱动程序的开发提供了较大的灵活性。在电源管理器的模 型下,设备驱动开发人员不用为了兼容电源管理模型而牺牲驱动程序本身的性能。在电源管理器的模型下,操作系统在挂起或者恢复时,设备会收到中断处理时产生 的标识信息,所以在设备挂起状态时可以做的工作和有多长时间做这一工作都被阉割限制,下面的介绍描述了Windows CE的电源管理结构。使用电源管理器时,设备会从I/O控制代码(IOCTLs)收到电源状态改变的通知。因为IOCTLs在线程中执行,这样子驱动开发者就可以更为灵 活的处理电源的状态的改变。使用IOCTLs可以区分系统电源和设备电源在状态。这样子,在系统运行时可以

4、关闭一些设备,而某些设备也可以在系统挂起时任 然开启。 电源管理器除了管理设备电源,还向应用程序通知其他与电源相关发生的事件。例如:当系统从挂起状态恢复时,电源管理器会向应用程序发出相应的通知。电源管理器是一个名为pm.dll的动态链接库(DLL),系统运行时被Device.exe进程直接调用。当电源管理 API被应用程序调用时,Device.exe调用pm.dll的入口函数。在Platform Builder 4.0及其后续版本中提供了Pm.dll的源代码,OEM厂商可以根据其设备修改Pm.dll。电源管理器做为设备,应用程序和定义操作系统电源状态之间的调解者。电源管理器定义了下列规则,使上

5、述三部分进行通信:1)系统电源状态限定了所有设备的最大功耗;2)应用程序以最小功耗来获取指定设备的最低性能等级。3)当设备功耗在其最大功耗与最小功耗范围内时,电源管理器允许设备自行管理电源;4)如果最小功耗高于最大功耗,那么,在应用程序请求设备运行期间,设备电源将持续提升。5)、设备可以在一个或多个电源状态下运行。电源状态以有限的数字表示。详见设备电源状态章节。6)系统转为挂起状态后,对应用程序有用的最小功耗将被取消。系统电源状态是描述所有设备中最大的设备电源状态。系统电源状态由OEM厂商定义,并在注册表中描述,同时,在电源管理器中可以加入部分支持代码。OEM厂商可以定义任意数量的系统电源状态

6、。欲了解更多信息,请参阅系统电源状态章节。在电源管理器框架内部,OEM厂商可以定义系统电源状态来设定最大设备电源状态。设备调用DevicePowerNotify来控制其电源等级,应用程序调用SetPowerRequirement来确认它们所需要的设备运行在一个可以接受的性能水平。分享到: 1、电源管理器和ACPI/APM 电源管理器与高级配置和电源接口(ACPI)或者高级管理(APM)电源管理机制没有关系。ACPI规范定义了操作系统电源从高功耗-高性能到低功耗-低性能的线性集。使OEM厂商能够定义任意数量的系统电源状态,但是并不要求他们线性排列。 这将鼓励广大开发者根据设备或者环境的具体情况定

7、义自己的操作系统电源状态。例如,开发者可以定义操作系统的电源状态等,某些设备如果不在保护状态下就处 于关闭状态,或者当操作系统使用交流外接电源时使设备运行在一个较高的功耗水平。同样的,开发者也可以根据不同的操作系统环境定义不同的空闲或挂起状态。 这对开发者在定制电源管理模块的时候做好各种电源状态之间的切换至关重要。 ACPI模式与系统电源状态的模式有着显著的区别。但是,设备电源状态表面上与ACPI设备的电源状态类似。但是也有一些细微的差别,例如在D3电源状态,被作为操作系统挂起时可以指定设备的唤醒源。分享到: 2、挂起和恢复回调函数 挂起和恢复回调函数与电源管理模块是互相独立的,当CPU停止运

8、行,即操作系统即将进入电源挂起状态时,回调函数被系统调用。并且在 OEMpowerOff被调用前立即执行。在电源管理模块关闭电源并且进入挂起状态之前,电源管理模块会对设备驱动进行调用(IOCTL),(上面的不是 很理解),这种情况并非总是如此,但是电源管理模块允许设备在系统运行时被关闭,允许设备在系统挂起的时候处于开启状态。当设备电源状态为D0,D1或D2,如果掉电事件发生时,开发者可以决定进行何种处理,通常关闭设备电源,然后在加电时 恢复供电。然而,如果设备可以不依赖CPU运行,在挂起状态时或许可以使此设备运行。如果设备在挂起期间处于供电状态,那可能表明,电源管理器配置是不正 确的,或者是应

9、用程序使用POWER_FORCE标记对此设备进行了SetPowerRequirement调用。3、其他电源管理的API 电源管理器是基于标准的Windows CE电源架构的基础上的,不管电源管理器时如何运行,流接口设备驱动程序在系统挂起或者恢复时总是通过XXX_PowerUp(设备管理器)和 XXX_PowerDown(设备管理器)来通知。下表列出了电源管理相关的API.电源管理器创建于标准的Windows CE电源体系结构的上层。所以,不管电源管理器如何运行,流接口设备驱动程序在系统挂起或恢复时总是通过XXX_PowerUp和XXX_PowerDown获取通知。下表列出了与电源管理相关的AP

10、I。函数名描述GetSystemPowerStatusEx2检索电池状态信息PowerPolicyNotify以事件的方式通知电源管理器,以便执行必要的处理,由OEM创建电源政策。OEMldle在没有线程需要运行时将处理器置为空闲状态OEMPowerOff当关机键被按下,或者图形、窗体、事件子系统(GWES)超时时被调用。使处理器进入挂起状态。XXX_PowerDown(Device Manager)挂起电源设备,但是仅用于被软件控制关闭的设备。XXX_PowerUp恢复设备电源二、电源状态1、设备电源状态 设备的电源状态定义是静态预定。电源管理器递给一个设备状态给设备驱动,然后这个驱动负责根

11、据设备的能力来映射为相应的电源状态,并且让设备工作在恰当的电源状态下。下表是对各个电源状态的描述。设备电源状态注册表键值描述Full onD0此状态表示设备已开启或正在运行,系统要求设备工作在最大功耗和最高性能的状态Low onD1此状态表示设备已开启或正在运行,但以低于D0状态的功耗及性能运行。D1状态适用于设备已经被使用,但以较低的性能运行StandbyD2此状态表示设备部分供电,且设备在需要时可以自动唤醒。SleepD3睡眠状态。保证唤醒的最小供电,在需要时能自动唤醒并初始化。OffD4关闭状态,不供电一种设备并不能支持以上所有的设备电源状态。但是所有的设备都支持D0设备电源状态。如果驱

12、动程序收到要求将设备进入它不支持的电源状态的请求,驱 动程序将使设备进入下一个支持的电源状态。例如,电源管理器请求设备进入D2电源状态,但是该设备并不支持D2状态,这时如果设备支持D3或者D4状态, 那么驱动程序将使设备进入D3或者D4状态。如果某一设备需要进入D3状态,但是该设备却不能唤醒系统,那么该设备将进入D4状态。以简单化驱动程序的执 行。 电源管理器可以适当的将系统电源状态映射为设备电源状态。例如,一个设备支持D0及D4状态,那么电源管理器不会直接请求设备进入D4电源状态。如果D3 或者D4将设为此设备的最小电源状态,电源管理器会一直等待直到系统进入D3或者D4状态时,再将设备置为D

13、4状态。如果此设备的最小电源状态被设为 D0、D1、或D2,电源管理器将使设备一直运行于D0状态。 当一个设备驱动被加载,将设备置为D0状态。在卸载驱动程序时,如果可能的话,应将设备置为D4状态。如果设备在启动时进入另一个设备的电源状态(除了 D0外的其它状态),它可以在处理IOCTL_POWER_CAPABILITIES时发出DevicePowerNotify请求。2、系统电源状态 系统电源状态由OEM定义,他们的名称被OEM定义。例如,SystemIdle,OnBattery,InCradle,OutOfCradle等,这 些名称不是系统预定义的,也不是线性排列的,可以再系统配置的注册表键

14、值中定义系统的电源状态名称,有多少个系统电源状态并没有固定的限制。 也可以创建系统电源状态与预定义的设备电源状态的显示映射关系,显示映射需要在注册表中定义,系统电源状态明确的执行了系统的所有设备所需的最大设备电源状态。 电源管理器定义了四个系统电源状态,分别是On,Userldle,Systemldle,Suspend。如果用户停止使用,电源状态将被设为 Userldle。当用户在一定的周期内不适用系统(如30s),则系统进入Systemldle状态。只要设备处于活动的状态,系统将一直保持在 Systemldle状态,如果设备停止活动,系统将进入Suspend状态。 Userldle状态的目的

15、是当用户正在使用该设备,但是没有操作该设备。例如,用户一直在观看屏幕显示,但是却没有操作,Systemldle状态被用 于用户没有直接使用的设备,但是处理器任然继续运行。例如,在传输文件时,设备可能处于空闲状态,但实际上处理器依旧在运行,知道文件传输完成。 电源管理器根据UserActivity和SystemActivity定时器对用户以及系统的活动进行判定。在定时器超时时,根据系统当前的供电状况进行不同的系统电源状态的转换。Platform Builder提供的Windows CE运行时image所使用的都是外接电源模式。你可以选择实现一套在使用电池供电时的独立电源状态。复制电源管理器示例代

16、码的PDD目录,并对其做适当的修改即可。2.1 系统电源状态到设备电源状态的映射 开发者可以在系统配置中将电源状态名定义为注册键。系统电源状态到设备电源状态的映射被列举为注册表里每一个电源状态名下的值,注册表示例定义如下:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlPowerStateExample Default=dword:0; D0 Flags=dword:10000; POWER_STATE_ON COM1:=dword1; D1上面的注册表定义了名为Example的系统电源状态,并设置了除COM1:被限制为最高运行于D1设备电源状态

17、外,其 他的所有设备最高均可运行于D0设备电源状态。其中Flags列是一个标识码,用于表示Pm.h头文件中定义的POWER_STATE_ON标记。如果需 要OEM也可以定义自己的电源状态标记。下表列出了键值名称及其描述:注册表值描述Name定义系统的电源状态名Flags表示POWER_STATE_XXX值的掩码,在Pm.h中定义;或者是OEM定义的电源状态标识(Default)所有设备的默认电源设置。当没有定义默认设置时,电源管理器假定设备的默认电源状态为D0Dx设备电源状态,设置为D0、D1、D2、D3或者D4.这是在系统电源状态Name时设备运行的状态DeviceName可选,定义除(De

18、fault)之外有特定设备电源状态需求的设备,如COM1:dowrd1电源管理器支持多种设备类型的映射。例如:NDIS迷你接口及块设备驱动器设备类型在Pm.h中会被指定为其自身的GUID类型。其他类型被管理设备的默认值也可以在注册表中指定。例如:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlPowerStateExample98C5250D-C29A-4985-AE5F-AFE5367E5006 Default=dword:1; D1 CISCO1=dword:0; D0上面注册表设置电源管理器限制所有NDIS迷你接口设备在Example系统电

19、源状态下时均运行于D1设备电源状态,只有名为CISCO1的设备最高可运行于D0状态。2.2系统电源状态转换 在下列情况下电源管理器将对系统电源状态进行转换:一个OEM特定的事件发生时需要做电源状态的切换。应用程序调用SetSystemPowerState。OEM特定的事件可能包括设备供电从外接电源切换为使用电源电池供电,长时间的系统闲置,将设备插入底座,或者电池电量 低等,OEM根据具体情况修改电源管理器,来判断两种电源状态的切换是否合理,并做相应的切换。Platform Builder提供的电源管理器源代码仅支持在设备从外接电源切换为电池供电时进行系统电源状态的转换。应用程序可以调用SetS

20、ystemPowerState来使用电源状态的名称表示系统电源状态的参数,如果OEM应用 程序了解OEM定义的系统电源状态,可以选择使用明确的电源状态名称来调用,即显示调用。独立于平台的应用程序,通常会设置位,并允许电源管理决定如何进 行电源状态映射。电源管理器可以限制应用程序调用SetSystemPowerState的状态。2.3 系统电源状态举例 系统电源状态到设备电源状态的映射示例如下:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlPowerStateOn Default=dword:0 ; D0 Flags=dword:10000 ;

21、POWER_STATE_ONHKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlPowerStateUserIdle Default=dword:1 ; D1 Flags=dword:0HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlPowerStateSystemIdle Default=dword:2 ; D2 Flags=dword:0HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlPowerStateSuspend Default=dword:3

22、; D3 Flags=dword:200000 ; POWER_STATE_SUSPEND; CESYSGEN IF CE_MODULES_NDISHKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlPowerStateSuspend98C5250D-C29A-4985-AE5F-AFE5367E5006 Default=dword:4 ; D4; CESYSGEN ENDIF CE_MODULES_NDIS下表描述了上面注册表的映射方式。系统电源状态设备电源状态OnD0UserIdleD1SystemIdleD2SuspendD3。NDIS迷你接口

23、单独映射为D4当系统使用上面的注册表配置,并进入Suspend状态,除了NDIS迷你接口会被关闭外,其他可唤醒源都将处于可激活状态。如果有设备不支持D3状态,它将自动进入D4状态。应用程序可以使用SetPowerRequirement创建设备电源要求,当然也可以使用电源管理器控制面板程序创建附加的设备电源要求。3设备和系统状态的名称 电源管理要求的设备和系统电源状态的名称使用小写字母。一些操作,如wsprintf(buf, %u, n)或 不区分大小写的比较,涉及Locale table查表操作。Locale table在Wince.nls内存映射文件中实现。在挂起期间,电源管理器禁止使用Fi

24、leSystemPowerFunction访问文件系统。从挂 起的线程中试图访问这个文件系统可能造成系统死锁。如果Wince.nls中必须的页面在内存中没有发现就会发生死锁。处理API调用时,电源管理转换为小写的名称。然而,在挂起和恢复状态,电源管理器在文件系统操作被禁止后访问注册表。 这可以防止注册表设置转换为小写。你必须修改你的系统电源状态的注册表设置为小写。例如,WAV1:应作为wav1:。其他则不用修改的注册表设置,如在 控制装载设备驱动程序HKLMDriversBuiltin.。三、电源管理接口电源管理有三种不同的使用类型,包括:电源管理器识别的设备驱动程序。可能需要更改系统电源状态

25、或者设备电源状态的应用程序。需要电源事件通知的应用程序电源管理器使用不同的编程接口来与这些使用类型进行通讯。1、设备驱动接口 电源管理器使用两种机制来沟通电源管理驱动程序。电源管理器向下调用设备驱动程序以确定该设备的性能和更新该设备的电源状态。设备向上调用电源管理器请求进行设备电源状态更改。向下调用执行IOCTL,向上设备调用DevicePowerNotify的 API沟通电源管理器。(即电源管理器与支持电源管理的设备驱动程序之间的编程接口分为两类,一种是电源管理器自上向下地获取设备驱动程序的电源管理能力 和控制改变外设的设备电源状态;另一种是设备驱动程序自下向上地请求电源管理器改变其目的的外

26、设的电源状态。第一种编程接口的实现方式是通过流式接口驱动 程序的IOControl函数和特定的为电源管理服务的IOCTLs操作码,专为电源管理而设计的IOCTLs操作码)。 由于电源管理使用DeviceIoControl来沟通电源管理设备,这些设备必须实现一个公开的接口。在某些情况下,可以使用电源管理代理来实现这一接 口。网络驱动程序接口规范(NDIS)实现了一个公开的接口,使NDIS微型端口驱动程序使用RegisterPowerRelationship API代理管理。电源管理器使用DeviceIoControl与电源管理的设备通信,所以设备驱动必须导出一个流接口。然而,电源管理器也提供了一

27、种鱼 非流驱动直接进行通信的机制,这种方法是由对打开一个设备句柄、发送一个请求等的抽象组成,绝大多是设备支持流接口。例如,位于 PublicCommonOakDriversPmMddPmdisplay.cpp的驱动程序实现了一个基于ExtEscape功能,实现 了通信接口。 开放的标准格式的COM1:,等,允许访问公开流接口的驱动程序。然而,电源管理并不要求支持电源管理器的设备必须使用这个格式命名;设备名称可以是任何唯一的字符串。例如: NDIS微型端口可能被命名为VMINI1。 Platform Builder提供的电源管理虽然只是支持流驱动,但是OEM厂商可以自由的运行其他的设备接口。可以

28、通过定义一个新类的全局唯一标识符(GUID)的设备来实现新的接口。但是必须坚持标准的电源管理驱动程序标准。 默认情况下,电源管理器提供以下GUID: A32942B7-920C-486b-B0E6-92A702A99B35 GUID for generic power-managed devices. 8DD679CE-8AB4-43c8-A14A-EA4963FAA715 GUID for power-managed block devices. 98C5250D-C29A-4985-AE5F-AFE5367E5006 GUID for power-managed NDIS miniport

29、s. 应用程序可以从HKEY_LOCAL_MACHINESystemCurrentControlSetControlPowerInterfaces注册表键中获取可被管理的设备类型的列表。 当应用程序调用一个指定设备的电源管理API时,应用程序应该指定设备类型名。如果设备没有指定设备的类型名,电源管理器会假定该设备属于通用的电源管理设备类。 有效的设备类型是在GUID后加一个反斜杠符号。例如GUID 8DD679CE-8AB4-43c8-A14A-EA4963FAA715DSK1:是指一个名为DSK1电源管理块设备。 电源管理器从注册表读取设备类的列表,并使用RequestPowerNotifi

30、cations决定此类型的设备在什么时候被载入。下面的代码示例显示了一个设备类列表:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlPowerInterfaces A3292B7-920C-486b-B0E6-92A702A99B35=Generic power-manageable devices 8DD679CE-8AB4-43c8-A14A-EA4963FAA715=Power-manageable block devices 98C5250D-C29A-4985-AE5F-AFE5367E5006=Power-manageable NDI

31、S miniportsPlatform Builder附带的电源管理器以上述的设置执行,如果不定义心得设备注册表键。除非你想增加额外的键,在注册表中可以不包含上述设置。下面步骤显示可以管理直接使用ExtEscape代码直接管理显示驱动类型的过程。1、使用Guidgen.exe创建一个新的GUID类型,并将其添加到注册表中。2、为了识别GUID,需要修改电源管理器,并使用ExtEscape来与设备进行通信。3、调用AdvertiseInterface,来使用新的GUID来修改显示驱动。1.1 设备控制符IOCTL电源管理器使用如下的IOCTL代码来与设备通信。电源管理的IOCTLs操作码(作了扩

32、展理解)电源管理的IOCTLs操作码描述IOCTL_POWER_CAPABILITIES电源管理器向设备驱动程序询问其对电源管理的支持能力IOCTL_POWER_SET电源管理器请求外设进入指定的设备电源状态,如果外设不支持IOControl函数的参数所要求的设备电源状态,则驱动程序应使外设进入相邻的外设可支持的电源状态,并且将此电源状态通过IOControl函数的输出参数反馈给电源管理器IOCTL_POWER_QUERY电源管理器询问外设及其驱动程序是否准备好进入某个新的设备电源状态,默认的电源管理器实现不支持这个操作码,有需要的用户应该定制动态链接库pm.dll实现代码。IOCTL_POW

33、ER_GET电源管理器询问外设当前所处的设备电源状态IOCTL_REGISTER_POWER_RELATIONSHIP电源管理器通知母设备(通常是总线设备)注册所有的受它控制的客户端外设。这个操作码即无输入也无输出。返回值也被电源管理器丢弃,仅用作通知消息。1.2 驱动到电源管理器的API函数电源管理器为设备提供如下函数,设备可以通过掉用以下函数向电源管理器请求服务。函数名功能DevicePowerNotify设备驱动调用该函数请求电源管理器更新其设备的电源状态RegisterPowerRelationship总线驱动及其他代理电源管理器在需要拦截所有设备的电源IOCTL时调用该函数Relea

34、sePowerRelationship结束由该函数调用创建的代理关系2、应用程序接口 电源管理器提供了一些函数,是应用程序可以使用这些函数进行设备电源管理。下表中的API函数中,只有GetSystemPowerState, SetPowerRequirement 和 ReleasePowerRequirement是普通应用程序可以直接执行的。例如,应用程序可以调用SetSystemPowerState来挂起系 统,但是电源管理器可以限制应用程序请求进入的系统电源状态。其他的API函数是为如控制面板这样的OEM应用程序准备的。下表是这些函数的说明。电源管理的应用程序编程接口函数描述GetSyst

35、emPowerState返回当前系统电源状态的名称SetSystemPowerState请求电源管理器改变当前系统电源状态SetPowerRequirement请求电源管理器将给定设备的电源状态维持在最低水平上ReleasePowerRequirement通知电源管理器不再需要将给定的设备的电源状态维持在最低水平上GetDevicePower返回给定设备的当前电源状态SetDevicePower请求电源管理器改变给定设备的电源状态2.1 系统电源状态的设置在某些情况下的应用程序可能要更改系统电源状态。在特定的Windows CE设备上,应用程序不知道哪些电源状态是可以使用的,也预计他们知道可用

36、的系统电源状态的特点。应用程序使用描述电源状态的掩码来调用 SetSystemPowerState进行电源状态切换,而不用调用明确的状态名,电源管理器会将该掩码转换为对应的电源状态。例如,应用程序可以使用 POWER_STATE_SUSPEND位元请求进行系统电源状态的切换。请求时系统是否在cradle,电源管理器随后会切换到Suspend或 SuspendCradle状态。如果设备被从cradle中取下,电源管理器会将设备切换到Suspend状态。 电源管理器可能会限制进入某些系统电源状态的应用即限制应用程序可以设置进入哪些系统的电源状态。例如,如果电源管理器使用外部输入控制系统电源状态,当

37、 转换为电池供电时,它将不会允许进入AcRun状态。Platform Builder附带的电源管理器仅允许应用程序设置系统进入Suspend的状态。 下表描述了预定义的电源状态位元及其含义。位元描述POWER_STATE_ON高性能高功耗POWER_STATE_OFF所有设备都被关闭POWER_STATE_CRITICAL电池电量低POWER_STATE_BOOT系统正在启动POWER_STATE_IDLE空闲状态POWER_STATE_RESET清除文件,关闭设备并调KernelIoControlPOWER_STATE_SUSPEND挂起操作系统并最终调用OEMPowerOffPlatfor

38、m Builder附带的电源管理器并没有使用上表中全部状态。OEM可以根据其设备自行定义状态标记。 如果应用程序使用SetSystemPowerState请求进入一个新的电源状态,电源管理器将进行以下处理。播出PBT_TRANSITION通知。如有需要更新设备的电源状态。如果设备已经处于可以接受新的系统电源状态的状态下,电源管理就不需要发出IOCTL_POWER_SET。如果设备从挂起状态到恢复。电源管理器将播出PBT_RESUME通知。2.2 设备电源需求 在某些情况下应用程序需要改变电源管理器对系统电源状态的管理。例如某应用程序页面需要使COM3:保持在运行在D3或者更高的状态,甚至是在挂

39、起时也以 此电源状态运行,从而在COM3:收到一个传入页面时能唤醒系统。或者一个流式音频程序即使在系统使用电池供电的情况下需要网卡及音频系统。甚至在已经空 闲了一段时间的情况下也能保持在全功耗(Full Power)运行。电源管理提供了SetPowerRequirement API来支持应用具有特殊的电源管理需求。SetPowerRequiremen API函数允许应用程序请求电源管理器在设备状态上设置一个较低的下限。如果电源要求有效,电源管理器则不允许设备将自己的电源状态设为低于要求的下限 值。当电源管理系统电源状态时,它通常会保持在此状态,即使设备需要维持在一个高于系统电源状态的设备的电源

40、状态。设备的电源要求通常预留的操作系统挂起时。在操作系统挂起状态,CPU停止和中断服务。如果应用程序使用的设备可能是能够在暂停状态下运行,可以在调用SetPowerRequirement时设置POWER_FORCE标记。电源管理器可预留设备的电源要求,以及其他情况下。例如,OEM可以选择解释为表明操作系统的电池电量严重不足,应关闭所有设备的操作系统电源状态POWER_STATE_CRITICAL标志。 3 消息接口 电源管理器提供一组API来允许应用程序来获取电源相关事件的通知,并参与共享系统电源状态的切换,下表列出了相关的API函数。函数描述RequestPowerNotifications

41、请求电源管理器发送电源事件通知StopPowerNotifications取消由RequestPowerNotifications.发出的通知请求通知信息通过消息队列传递。为了使用通知,应用程序必须创建一个消息队列并通过RequestPowerNotifications API函数将消息队列句柄传递给电源管理器,应用程序一般会创建一个线程来等待消息的产生。电源管理器定义了一下几种通知类型。通知描述PBT_RESUME当系统从挂起状态回复时创建PBT_POWERSTATUSCHANGE当系统在AC供电向其他方式切换时创建PBT_TRANSITION当电源管理器进行系统电源状态变更时创建PBT_P

42、OWERINFOCHANGE当电池或者AC供电状态发生变更时创建分享到: 四、设备电源管理指南电源管理器对设备功耗、性能及响应时间没有严格的限制。然后,从用户的角度看D0和D1的状态下是可操作的。而更高的电源状态药比这两个状态消耗更少的电源。这个简单的指南只是为了是OEM厂商能共容易的定义有意义的电源状态,而不知道每个设备的详细功耗要求。1、设备电源自管理一些设备自行管理其电源的过程是比较复杂的,驱动程序设计人员通常希望在设备处于休止状态时减少耗电量。降低功耗,一般也将降低设备的性能,因此,这些器件还通常要提高其性能水平。提高性能水平时也会提高功耗。这些设备往往会动态地根据使用的周期而提高或降

43、低其设备的电源状态。电源自管实际算法根据设备特性的不同而不同。电源管理器的DevicePowerNotify API函数允许驱动程序开发人员根据电源管理调整设备的电源状态。当所要求的设备的电源状态在允许的范围内即最大值和最小值之间,电源管理器将允许进行调整功率。最大值值是系统电源状态要求的值,最小值是由应用程序调用SetPowerRequirement确定。当电源管理器决定接受设备的电源状态调整请求,电源管理器将使用该设备的API,通常使用IOCTL_POWER_SET函数更新设备的电源状态。在实际调用DevicePowerNotify时,应遵循下列准则:Thedevice should no

44、t update its power state if the DevicePowerNotify callsucceeds, only when it receives an IOCTL_POWER_SET. Thedriver developer should not assume that a successful return code from DevicePowerNotifyimplies that the Power Manager will issue an IOCTL_POWER_SET. Thedriver developer should not assume that

45、 an IOCTL_POWER_SET immediatelyfollowing a DevicePowerNotify was issued as a result of the call. Devicesthat are capable of waking the system when they are put into D3 should notrequest D3 using DevicePowerNotify. 有些设备能够支持D0到D4设备电源状态以外的其它电源等级。如果需要,这些设备的驱动程序开发人员可以将多个电源设备映射到电源管理器所能识别的 某一个设备电源状态电源管理状态。

46、设备可以不依赖电源管理器,从而在每个设备电源状态的允许范围内进行电源自管理。然而,它仍然应该使用 DevicePowerNotify进行设备电源状态切换。资管理举例:一个实现了所有五个电源状态的设备,如果它已经一段时间内务任何活动,或其电源管理从D0降到D1或D1降到D2设备阶段,因为D2的功耗较低,而且他很少需要相应。如果设备检测到的活动,但是还不在D0状态,它会尝试去到D0。这样的一个设备中断服务线程可能与下面的示例代码类似。while(!fDone) dwStatus = WaitForSingleObject(hInterruptEvent, dwTimeout); switch(dwStatus) case

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1