现在的位置: 首页 > 综合 > 正文

WINCE的电源管理

2014年09月05日 ⁄ 综合 ⁄ 共 3464字 ⁄ 字号 评论关闭

(1)WINCE电源管理的架构      

                              

      使用电源管理器,设备可以接收电源状态改变的通知,这个通知是以I/O控制的方式(IOCTL控制码)的方式来和设备驱动通信的。因为I/O控制运行在线程上下文环境中,驱动开发者可以很灵活去实现电源状态的改变。使用I/O控制的方式来管理电源也可以让设备电源状态独立于整体的OS电源状态。所以,当OS在运行的时候一些设备可以关闭,而在OS挂起的时候一些设备可以继续保持正常的工作状态。

      电源管理器除了管理设备电源之外,电源管理器作为设备驱动和应用程序的中间层(传递者),它可以通知应用程序相关的电源事件,比如,当OS从挂起的状态恢复的时候,电源管理器会通知感兴趣的应用程序。

      WinCE电源管理器通过一个名为Pm.dll的动态链接库与设备管理器Device.exe链接。Pm.dll动态链接库支持三类接口:一是驱动程序接口:为需要进行电源管理的设备的驱动程序使用;二是应用程序接口:为需要利用电源管理的应用程序使用;三是提醒接口(Notification):为需要接受电源事件提醒的应用程序使用。比如:设备驱动可以调用DevicePowerNotify函数来调整设备自身的功耗水平,并且应用程序可以调用SetPowerRequirement来核实设备需要运行在可以受的性能水平上。

(2)系统电源状态

      系统电源状态明确指定了系统中所有设备的最大设备电源状态,并且由OEM来定义系统的电源状态,而系统电源状态大概有以下几种

A,on,用户与系统交互时的状态,在common.reg中的相关信息如下:

 

 B,UserIdle

在一段时间内,如果一直没有用户操作,LCD屏工作在低功耗模式或者关闭显示,在common.reg中的相关信息如下:

C,SystemIdle

用户没有直接使用系统,这种状态下认为设备处于空闲的状态,当处理器仍然在工作,比如在进行文件传输,在common.reg中信息如下:

D,Suspended

睡眠状态,没有线程在运行。CPU处于idle的状态,这时候只能通过硬件的唤醒中断才能唤醒系统。

E,OFF状态

(3)设备电源状态

      设备电源状态是预先定义的,电源管理器递给一个设备状态给设备驱动,然后这个驱动负责根据设备的能力来映射为相应的电源状态,并且让设备工作在恰当的电源状态下。

A,Full on。D0,此状态表示设备已开启或正在运行,系统要求设备工作在最大功耗和最高性能的状态。

B,Low on。D1,此状态表示设备已开启或正在运行,但以低于D0状态的功耗及性能运行。D1状态适用于设备已经被使用,但以较低的性能运行即可,没有必要以最大性能运行,会产生额外的功率消耗。

C,Standby。D2,此状态表示设备被部分供电,且设备在需要时可以自动唤醒。

D,Sleep。D3,睡眠状态。保证唤醒的最小供电,在需要时能自动唤醒并初始化。

E,Off。D4,关闭状态,不供电。

      如下图:

(4)电源管理器接口

A,应用程序电源管理接口

     应用程序可以利用这些接口来调整系统及设备的电源状态,这些接口中,只有GetSystemPowerState()、SetPowerRequirement()和ReleasePowerRequirement()函数是为一般的应用程序设计的。比如,应用程序可以调用SetSystemPowerState函数来挂起系统,但电源管理器可以限制应用程序请求系统进入挂起状态的情况,所以其他一些应用程序电源管理接口函数SetSystemPowerState()、GetDevicePower ()和SetDevicePower()是为OEM应用来设计的。

⑴GetSystemPowerState函数,这个函数用户返回系统电源状态(比如是on)。

⑵SetSystemPowerState函数,SetSystemPowerState函数可被OEM程序或者其他应用程序调用,把系统电源状态设置为需要值。

⑶SetPowerRequirement函数,调用SetSystemPowerState是一个直接改变电源状态的方法。更巧妙的方法是通过调用SetPowerRequirement来请求系统维持应用程序所需最低限度的电源状态。SetSystemPowerState是假定应用程序知道所需状态,而调用SetPowerRequirement是允许系统对电源设定做优化以满足应用程序的需要。一个使用SetPowerRequirement会比较方便的例子是,一个使用串口的应用程序需要串口在进行通信时保持住电源状态。

⑷ ReleasePowerRequirement函数,这个函数请求电源管理器释放SetPowerRequirement函数的电源请求。
⑸ GetDevicePower函数,返回某个设备当前的电源状态。

⑹ SetDevicePower函数,这个函数用于某个设备为某种电源状态。
B,设备驱动电源管理接口

      电源管理器用两种机制来和支持电源管理的驱动通信:

⑴电源管理器通过DeviceIoControl及对应的ControlCode可以查询设备支持电源管理的能力及可以更新设备的电源状态,电源管理器使用下面的控制码来和设备通信:

IOCTL_POWER_CAPABILITIES:电源管理器请求设备驱动返回设备支持的电源状态及相关特征.

IOCTL_POWER_SET:请求设备驱动更新设备的电源状态

IOCTL_POWER_QUERY:电源管理器询问设备是否做好状态更新的准备。

IOCTL_POWER_GET:请求驱动返回设备当前的电源状态

IOCTL_REGISTER_POWER_RELATIONSHIP:通知父设备注册所有它所控制的设备
⑵电源管理器提供下面的函数用于支持电源管理的设备来向电源管理器请求电源服务:

DevicePowerNotify函数:设备驱动通过DevicePowerNotify函数请求系统改变它们的电源状态,这个时候电源管理模块就用调用相应的IOCTL(比如IOCTL_POWER_SET)来实现电源状态的管理。

RegisterPowerRelationship函数:用于建立动态的父设备及其子设备的关系,或者是总线及客户端驱动的关系,这样设备驱动就可以管理一系列依赖的子和客户端驱动。
(5)电源管理驱动/电源按键驱动/电池驱动的关系

      就涉及到电源管理的驱动部分,主要有以下三个:电源管理驱动/电源按键驱动/电池驱动。

      电源管理驱动指的是PM.dll,是系统用来管理所有系统状态及驱动电源状态的驱动,系统状态一般分为On、UserIdle、SystemIdle、Suspend、Reboot、Off等(以CE为例、Mobile的状态有些不一样)、驱动对应的状态有D0、D1...D4五种状态、PM管理着系统这些状态之间的切换、及各系统状态对应的驱动状态,以及负责调用各驱动的POWER IOCTL等。

      电源按键驱动:它只不过是一个很普通的流式驱动,实现的功能无非是检测到Power键被按下时去调用SetSystemPowerState(这函数会调用到电源管理驱动里面),让系统进Suspend。当然这里还可以做很多驱动开发人员需要做的事情,而且这个驱动完全可以把它集成到普通按键的驱动里面,进而调用SetSystemPowerState,或是别的PowerPolicyNotity函数等。

      电池驱动:顾名思义就是针对电池的一个驱动,其基本功能是电池电量的检测。只不过在使用电池的时候,尤其是电池电量低的时候一般系统要求能自动进入Suspend,所以通常在电池驱动里会添加一些这样相关的代码,所以它也跟电源管理扯上关系了。还有一点就是电池驱动要负责告诉系统是否使用AC,这点PM中也会用到,因为电池和AC供电对PM来说是有区别的。
      总结:这三个驱动看起来似乎有一些关系,更确切的说,PM跟每个驱动都有一些关系,当然这里的核心应该是电源管理驱动。

参考原文:http://blog.csdn.net/carlward/archive/2009/06/17/4275757.aspx

参考原文:http://blog.csdn.net/LoongEmbedded/archive/2011/03/07/6229616.aspx

抱歉!评论已关闭.