wince 电源管理(一)

2019-07-14 00:39发布

Windows CE设备驱动开发之电源管理   4.7电源管理 电源管理模块管理设备电源,从而全面改进操作系统的电源使用效率;它所有设备的电源使用,同时能与不支持电源管理的应用程序及驱动程序共存。 使用电源管理可以有效的减少目标设备的电源消耗,同时,能在运行、空闲、复位及挂起电源状态时维持并保护RAM中的文件系统。 电源管理具有以下特性: 使设备具有自行电源管理功能的框架; 建立一种在系统中使设备电源在挂起和恢复状态间切换的机制; 一个对系统环境、电源状态、设备电源状态有统一认识的模块。你可以定制电源管理模块,使全系统的电源分配适合您的设备; 当系统挂起或恢复时,使系统跳过所有代码调用PowerOffSystem函数。 对于支持电源管理的驱动程序,在设备枚举时应尽量准确的向电源管理模块报告其性能,然后将收到来自电源管理模块的获取或更改其电源状态的请求。对于自行管理电源的设备,必须通过DevicePowerNotify向电源管理模块发送请求来更改电源状态。 电源管理模块与设备在一个正常的线程执行环境中通过调用DeviceIoControl进行通讯。   4.7.1、            电源管理架构 在不依赖Windows CE电源管理模型的情况下,只能对设备进行简单的管理。电源管理器为OEM厂商提供了较大的灵活性,同时驱动开发人员也不用为了兼容电源管理模型而牺牲驱动程序性能。在基本的Windows CE电源模型中,在操作系统挂起或恢复时,设备会收到标识信息(notification)。这一标识信息在中断处理时产生,所以设备在挂起状态时可以做什么工作,有多长时间做这一工作被严格限制。下图描述了Windows CE电源管理的结构。
使用电源管理器时,设备会从I/O控制代码(IOCTLs)收到电源状态改变通知。因为IOCTLs在线程中执行,在线程中驱动开发者可以更为灵活的处理电源状态改变。使用IOCTLs还能够区分设备电源状态与系统电源状态。这样,在系统运行时可以将部分设备关闭,而某些设备也可以在系统挂起时一直开启。 除了管理设备电源,电源管理器还向应用程序通知其它与电源相关事件的发生。例如:当系统从挂起状态恢复运行时,电源管理器会向相关应用程序发出通知。 电源管理器是一个名为pm.dll的动态链接库,系统运行时被Device.exe进程直接调用。当电源管理API被调用时,Device.exe调用pm.dll的入口函数。在Platform Builder 4.0及其后续版本中提供了Pm.dll的源代码,OEM厂商可以根据其设备修改Pm.dll。 电源管理器担任设备、应用程序及预定义的操作系统电源状态的仲裁者。电源管理器定义了下列规则,使上述三部分以这些规则进行通讯: l         系统电源状态限定了所有设备的最大功耗; l         应用程序以最小功耗来获取指定设备的最低性能等级。 l         当设备功耗在其最大功耗与最小功耗范围内时,电源管理器允许设备自行管理其电源。 l         如果最小功耗高于最大功耗,那么,在应用程序请求设备运行期间,设备电源将持续提升。 l         设备可以在一个或多个电源状态下运行。电源状态以有限的数字表示。详见设备电源状态章节。 l         系统转为挂起状态后,对应用程序有用的最小功耗将被取消。 l         系统电源状态是描述所有设备中最大的设备电源状态。系统电源状态由OEM厂商定义,并在注册表中描述,同时,在电源管理器中可以加入部分支持代码。OEM厂商可以定义任意数量的系统电源状态。详见系统电源状态章节。 在电源管理器框架内部,OEM厂商可以定义系统电源状态来设定最大设备电源状态。设备调用DevicePowerNotify来控制其电源等级,应用程序调用SetPowerRequirement来确认它们需要使用的设备是否正在合适的性能等级运行。   4.7.1.1              电源管理器和ACPI/APM 电源管理器并不涉及高级配置与电源接口(ACPI)或高级电源管理(APM)。ACPI规范将系统电源状态定义为一个从高功率/高性能到低功率/低性能的线性集。Windows CE电源管理器允许OEM厂商定义任意数目的系统电源状态,但并不要求定义的系统电源状态是线性的。 我们鼓励开发者根据情况定义操作系统电源状态,并根据设备定位或环境控制设备电源。例如:开发者可以定义系统电源状态,据此可以做到在装置不在支架(cradle)中时可以关闭某些设备,或者当系统使用外接交流电源时允许设备运行在高功耗电源等级。同样的,开发者可以根据系统环境定义不同的空闲、挂起状态。开发者需要定制电源管理器并保证在适当或必须的时候在各种电源状态间切换。 系统电源状态与ACPI模式有显著的区别。然而,设备电源状态表面上看起来与ACPI规范中的设备电源状态类似,但实际上,他们仍有细微的区别。例如:在Windows CE中D3电源状态被设定为在操作系统挂起时可使指定设备担任唤醒源的功能。 4.7.1.2              电源挂起、恢复回调函数 挂起和恢复电源事件的回调函数与电源管理器无关。当CPU被停止,操作系统将进入挂起状态,这时回调函数会被系统调用。并在OEMPowerOff被调用前立即执行。在电源管理器请求关闭系统电源并进入挂起状态之前,电源管理器会时常对设备驱动进行IOCTL调用。当然,情况并不总是这样。电源管理器框架允许设备在系统运行时被关闭,也允许设备在系统挂起时处于开启状态。 当设备电源状态为D0,D1或D2,如果掉电事件发生时,开发者可以自行决定进行何种处理。此时,通常关闭设备电源,并在加电事件发生时恢复供电。如果设备可以不依赖CPU即可运行,在挂起状态时或许可以使此设备运行。如果设备在挂起期间一直处于供电状态,那可能是电源管理器配置错误,或者是应用程序使用POWER_FORCE标记对此设备进行了SetPowerRequirement调用。   4.7.1.3              其他电源管理API 电源管理器创建于标准的Windows CE电源体系结构的上层。所以,不管电源管理器如何运行,流接口设备驱动程序在系统挂起或恢复时总是通过XXX_PowerUp和XXX_PowerDown获取通知。下表列出了与电源管理相关的API。 函数名
 功能描述
 
GetSystemPowerStatusEx2
 获取电池状态信息。
 
PowerPolicyNotify
 以事件的形式通知电源管理器,以便执行必要的处理,从而实现OEM创建的电源策略。
 
OEMIdle
 被系统内核调用。在没有线程需要运行时将处理器置为空闲状态。
 
OEMPowerOff
 当关机按钮被按下,或图形、窗体、事件子系统(GWES)超时时被调用。使处理器进入挂起状态。
 
XXX_PowerDown (Device Manager)
 挂起设备电源。仅用于能被软件控制关闭的设备。
 
XXX_PowerUp (Device Manager)
 恢复设备电源。
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Fenstein/archive/2009/01/10/3746254.aspx