WinCE电源管理

简介: 对于移动设备来说,电源管理是比较重要的。为了让设备有更长的待机和工作时间,实现一个完善的电源管理功能也是必须的。针对移动平台的操作系统WinCE本身包括了一个基本的电源管理子模块"Powe Manager",可以在Catalog中添加至系统。

      对于移动设备来说,电源管理是比较重要的。为了让设备有更长的待机和工作时间,实现一个完善的电源管理功能也是必须的。针对移动平台的操作系统WinCE本身包括了一个基本的电源管理子模块"Powe Manager",可以在Catalog中添加至系统。驱动和应用程序将通过它有效的管理各个设备或者整个系统的电源工作状态。最近,在我们TCC8900的平台上实现了简单的电源管理,积累了一些经验,在这里跟大家分享一下。

      在WinCE系统中实现电源管理主要有三步,添加"Power Manager"组件,在驱动中实现电源管理的接口,在应用程序中通过调用电源管理的API控制各设备和系统的工作状态。

      第一步比较简单,通常只要在Catalog中添加就可以。如果有特殊需求,可以移植C:\WINCE600\PUBLIC\COMMON\OAK\DRIVERS\PM下的代码到BSP,并做相应的修改。

      第二步主要是在现有的驱动上添加电源管理的功能。对于驱动来说,并不要求必须包括电源管理的功能,完全可以不实现,具体情况具体分析。为了让Power Manager知道哪些驱动是支持电源管理功能的,需要在注册表中包含相应的键值(IClass)或者在驱动初始化时调用AdvertiseInterface()。一般来说,流驱动用注册表键值比较方便一些,而显示驱动通常用AdvertiseInterface()来告知。流驱动和显示驱动在实现电源管理的功能上也有所不同。流驱动主要是在XXX_IOControl中,实现IOCTL_POWER_CAPABILITIES、IOCTL_POWER_QUERY、IOCTL_POWER_SET和IOCTL_POWER_GET。具体代码可以参考C:\WINCE600\PLATFORM\DEVICEEMULATOR\SRC\DRIVERS\BACKLIGHT,非常好的一个例子。而显示驱动主要是在DrvEscape中实现以上几个IoControlCode,另外需要注意在QUERYESCSUPPORT添加相应的IoControlCode。这个代码可以参考C:\WINCE600\PLATFORM\COMMON\SRC\SOC\PXA27X_MS_V1\DISPLAY\PXA27X_LCD,也是非常好的一个例子。以上这两个参考代码的框架都基本完善,在做移植时根据具体的情况实现相应的功能即可。如果成功实现了这两步,就可以在控制面板的电源属性中看到相应的设备了。如下图所示。

                    clip_image002

     第三步主要就是在应用程序中通过调用电源管理的API,协助系统管理各个设备和整个系统的工作状态。

     一般来说,外设的工作状态主要有以下几个Full On 、Low On、Standby、Sleep 和Off,分别对应D0、D1、D2、D3和D4。他们的映射关系和其他一些关于电源管理的配置在注册表[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Power]中定义。这里需要注意的是应用程序如何修改系统的超时时间设置,键值在[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Power\Timeouts]下,仅仅修改注册表中的键值并不能实时生效,应用程序通过注册表读写API修改该键下的DWORD值(十六进制以秒为单位),完成修改后,必须通知PM使用新设置的超时时间,实现的参考代码如下:

    HANDLE hReloadActivityTimeouts ;
    hReloadActivityTimeouts = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T("PowerManager/ReloadActivityTimeouts"));
    
if (hReloadActivityTimeouts)
    {
        SetEvent(hReloadActivityTimeouts);
        CloseHandle(hReloadActivityTimeouts);
    }

       如果实现了HIVE注册表,由于系统启动时PM的启动先于文件系统,所以在PM启动时它还不能读取到文件系统中保存的值,在系统启动完成后也需要通知一下系统重新加载我们设定的值。这个操作可以放在驱动或者应用程序中。

      应用程序中常用的几个电源管理API如下:

  • DevicePowerNotify 用于改变设备的电源状态
  • SetPowerRequirement 用于请求保持设备的电源状态
  • ReleasePowerRequirement 释放已请求设备的电源管理
  • SetSystemPowerState 用于设置整个系统的电源状态
  • RequestPowerNotifications 注册一个消息队列接收电源状态变化的通知
  • StopPowerNotifications 停止接收电源变化的通知

      需要注意的是,驱动不能擅自改变自己的电源状态,而必须请求PM来处理。

      PM中通过Timer进行状态切换的过程如下图所示。

                    clip_image004

      最后附上M8手机的电源属性图,可以看到好的产品对电源管理做得有多细。

                    clip_image006

      电源管理是一个非常复杂也非常重要的内容。以上是我在学习过程中的一些经验,抛砖引玉,希望大家能有更多的讨论。

目录
相关文章
|
存储 缓存 API
Windows 10 on ARM, version 22H2 ARM64 中文版、英文版下载 (2025 年 5 月更新)
Windows 10 on ARM, version 22H2 ARM64 中文版、英文版下载 (2025 年 5 月更新)
14770 1
Windows 10 on ARM, version 22H2 ARM64 中文版、英文版下载 (2025 年 5 月更新)
|
人工智能 算法 开发者
华为开源全场景AI计算框架MindSpore,性能可达 Pytorch+2080Ti 的1.93倍
华为开源全场景AI计算框架MindSpore,性能可达 Pytorch+2080Ti 的1.93倍
1067 0
|
虚拟化
【技术贴】虚拟机 VMware win7 win8网卡驱动下载 解决虚拟机不识别网卡没有本地连接
解决虚拟机VMware7.0下虚拟win7 win8找不到网卡,不能识别网卡。没有本地连接。(本篇文章只适合虚拟机win7/win8 32位环境) 废话不多说,直接入题。vmware 虚拟机 win7/win8网卡驱动 下载。
2898 0
|
Android开发 Windows 开发者
Windows CE会死吗?
Windows CE不会死!这两天有人站出来这么声明。估计是想制造出一点关于WinCE的新闻,好让别人知道除了Android以外,还有这么一个嵌入式操作系统。Android虽然来势汹汹,但WinCE是不会坐以待毙的。
1098 0
|
存储 内存技术 编解码
WinCE动态修改启动LOGO
前两天介绍了WinCE启动界面的定制,在实际应用中经常还需要让用户方便修改启动LOGO。通常情况下,启动LOGO是编译到BOOT代码中的。为了实现动态修改启动LOGO,需要将LOGO保存至Flash中,BOOT启动时从特定的位置将其读取出来,并填入FrameBuffer。
849 0
WinCE下GPRS拨号连接助手
这两天在做一个WinCE下的3G拨号助手程序,想起来很早以前调试GPRS模块时做过一个类似的GPRS拨号连接助手,特地找出来存这里,以免以后想用时找不到。有需要的同志也可以下载来看看。                           当时使用的GPRS模块是WaveCom的Q2406A,在S3C2410和PXA270上测试过。
908 0
|
编解码
WinCE下的LCD调试助手
在实际项目中,经常会根据不同应用配备不同大小的LCD。所以需要针对不同的LCD,调节相应的参数。最近的一个项目,先后用了5、6、7和8寸屏,分辨率都是800*480。由于显示驱动是本地驱动,不能够动态卸载和加载。
836 0
|
调度 Windows
Windows Embedded CE 6.0实时性分析
Windows Embedded CE 6.0是微软公司目前最新的嵌入式操作系统之一,支持四种体系结构的MCU(ARM、MIPS、SH4和x86)。在众多的嵌入式操作系统中,它以自己独特的优势脱颖而出,在整个嵌入式操作系统的市场份额中占有很大比重。
1354 0
|
Shell
浅谈WinCE快速启动的几种方法
前两天做了个WinCE的微内核,8MB,不到2s就启动起来了。但在实际项目中,最终的映像一般都高达好几十M,将如此大坨的映像从非易失性的存储器中搬运到内存,就需要2s多,那么一个功能完善的WinCE系统,最快多久能启动起来呢。
996 0
|
内存技术
WinCE启动界面的定制
本文将以模拟器为例,简单介绍如何定制WinCE的启动界面,实现动画效果。在实际硬件平台上一般在BOOTLOADER中定制开机界面。如果BOOT从Flash加载NK到内存的时间较长,通常也会加一个进度条显示。
897 0