在WinCE4.0之前电源办理作业是由GWES来完成的。( GWES:Graphics,Windows and Events Subsystem.图形,窗口和事情子体系.首要担任图形输出和用户交互)。但GWES供给的电源办理模块功用过于粗糙呆板:一切子设备只能有On和Suspend状况,应用程序无法得到任何状况转化告诉,等等……直到WinCE4.0才引入了电源办理模块用以代替GWES中的电源办理功用。
电源办理模块实体是一个动态链接库pm.dll来完成的。电源办理模块的代码结构是分层的,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。
上面说的是体系也便是CPU所处于的几种状况,下面来说说外部设备的状况。在微软里,设备的电源状况被界说了如下几种:D0,D1,D2,D3,D4,别离代表Full on,Low on, Standby, Sleep, Off这5个状况。
上面首要是介绍了两个状况,一个是CPU的,一个是设备的。下面咱们再来说说电源办理模块。电源办理模块也便是pm.dll的功用能够从两
个方面来了解:一个是对设备驱动,一个是对应用程序。也便是说设备驱动能够经过电源办理模块来办理改设备的电源状况,应用程序也能够通关电源办理模块来完成必定的功用,它们都有各自的API函数。
下面咱们就来看看对与设备驱动的电源办理的完成。
经过上面咱们现已知道设备能够有D0-D4五种状况,那么完成了电源办理的设备驱动就能够智能的办理该设备的电源状况也能够了解为作业状况。电源办理模块对设备驱动提出了一个标准和架构,满意标准的驱动归入电源办理.关于流驱动操控的设备,要支撑电源办理要满意的条件,简略来说有:
1.声明自己是支撑电源办理的(便是在注册表里有相应的Iclass值)。
IClass = {A32942B7-920C-486b-B0E6-92A702A99B35} ; GUID for generic power-managed devices
2.驱动中完成电源办理模块所要求的IOCTL
3.驱动加载时分要报告所支撑的电源状况和相关特征.
4.***_PowerDown和***_PowerUp接口接纳体系休眠和唤醒告诉.
电源办理器经过IOCTL代码来和驱动通讯。通常状况下,当一个驱动程序声明为支撑电源办理时,驱动只需要在DeviceIoControl中完成电源的办理即可。下面是电源办理器用来与驱动通讯的IOCTL代码:
IOCTL_POWER_CAPABILITIES:代表电源办理器恳求设备驱动回来设备支撑的电源状况及相关特征;
IOCTL_POWER_SET:恳求驱动更新设备的电源状况;
IOCTL_POWER_QUERY:电源办理器问询设备是否准备好进行状况切换;
IOCTL_POWER_GET:恳求驱动回来当时设备的电源状况;
IOCTL_REGISTER_POWER_RELATIONSHIP:告诉父设备注册一切它所操控的设备。
其间IOCTL_POWER_CAPABILITIES和IOCTL_POWER_SET是支撑电源办理的设备驱动有必要完成的。
一个完成电源办理的驱动:
\WINCE600\PLATFORM\COMMON\SRC\SOC\COMMON_FSL_V\BACKLIGHT\DRIVER\backlight.cpp
在设备自我办理电源的状况下,设备应该经过DevicePowerNotify函数恳求体系改动它们的电源状况,这个时分电源办理模块就用调用相应的IOCTL来完成电源状况的办理。便是驱动调用了该驱动中的部分函数。
此外,规划驱动还应该了解:设备不必定具有一切5种状况,但至少能够作业在D0;电源办理模块可能会要求设备进入任何设备电源状况,并不仅仅是设备所报告自己支撑的那几个;假如被要求进入不支撑的状况,应该进入另一个它所支撑的更高功耗的状况;当时状况不需要重复设置;设备电源状况不必定和体系的电源状况同步。