Windows CE 5.0电池驱动分析

转自: http://hi.baidu.com/15460/blog/item/97415e60b7ea854eeaf8f82d.html

wince5.0的电源管理请访问:http://www.cnblogs.com/jasonye/archive/2008/03/06/1040008.html
一.概述
Windows CE电池驱动属于分层驱动,由MDD层与PDD层组成。驱动示例代码位于%_WINCEROOT%/Public/Common/Oak/Drivers /Battdrvr。其中battdrvr.c是MDD层代码,sbattif.c是PDD层代码。MDD层代码微软已经搭好架构,一般不需要修改,我们要实现的是PDD层的代码。

二.MDD层
电池驱动对外接口函数没有“BAT_”前缀,因为 HKEY_LOCAL_MACHINE/Drivers/BuiltIn/Battery/Flags注册表项设置了 DEVFLAGS_NAKEDENTRIES属性,表示“Init”代替“BAT_Init”,这样修改注册表“Prefix”项的值时不需要修改驱动代码。
MDD层函数包括:Init、Deinit、Open、Close、Read、Write、Seek、PowerDown、PowerUp、IOControl。我们主要分析一下Init与IOControl函数。
先来看一下初始化函数Init,它所做的工作主要如下:
1.判断ghevResume事件是否为NULL,条件成立表示驱动还未加载继续执行,否则表示驱动已经加载跳出执行。
2.打开一个名为“SYSTEM/BatteryAPIsReady”的事件。“SYSTEM/BatteryAPIsReady”事件在注册表HKEY_LOCAL_MACHINE/System/Events下面,在内核初始化的时候由filesys.exe创建。
3.创建ghevResume事件。
4.调用BatteryPDDInitialize初始化电池信息,这个函数在下面的PDD层介绍。
5.调用BatteryAPIGetSystemPowerStatusEx2函数更新电池最新信息。BatteryAPIGetSystemPowerStatusEx2函数主要调用BatteryPDDGetStatus函数获取电池信息,这个函数在PDD层介绍。
6.创建一个电池监控线程,处理系统resume消息,定时查询电池状态并通知系统。
7.设置“SYSTEM/BatteryAPIsReady”事件,通知系统电池驱动已经正常运行。
IOControl 函数用来与其他驱动通讯或供应用程序调用。IOCTL_BATTERY_GETSYSTEMPOWERSTATUSEX2与 IOCTL_BATTERY_GETSYSTEMPOWERSTATUSEX控制码得到系统电源状态。 IOCTL_BATTERY_GETLIFETIMEINFO控制码得到电池剩余使用时间。IOCTL_BATTERY_GETLEVELS控制码得到电池报告级别,具体在BatteryPDDGetLevels中说明。IOCTL_BATTERY_SUPPORTSCHANGENOTIFICATION 控制码报告当电池状态变化时是否通知系统。IOCTL_BATTERY_NOTIFYOFTIMECHANGE控制码表示假如系统时间改变,则更新电池相关信息。另外还预留了一个gpfnBatteryPddIOControl函数指针用来处理用户定义的IOCTL码。

三.PDD层
       PDD层函数包括:BatteryPDDInitialize、BatteryPDDDeinitialize、BatteryPDDResume、 BatteryPDDPowerHandler、BatteryPDDGetStatus、BatteryPDDGetLevels、 BatteryPDDSupportsChangeNotification。
PDD层代码完成电池信息的采集传递到MDD层供系统调用。电池信息数据结构如下
struct SYSTEM_POWER_STATUS_EX2 {
    BYTE ACLineStatus;
    BYTE BatteryFlag;
    BYTE BatteryLifePercent;
    BYTE Reserved1;
    DWORD BatteryLifeTime;
    DWORD BatteryFullLifeTime;
    BYTE Reserved2;
    BYTE BackupBatteryFlag;
    BYTE BackupBatteryLifePercent;
    BYTE Reserved3;
    DWORD BackupBatteryLifeTime;
    DWORD BackupBatteryFullLifeTime;
    DWORD BatteryVoltage;
    DWORD BatteryCurrent;
    DWORD BatteryAverageCurrent;
    DWORD BatteryAverageInterval;
    DWORD BatterymAHourConsumed;
   DWORD BatteryTemperature;
    DWORD BackupBatteryVoltage;
    BYTE BatteryChemistry;
}
其中ACLineStatus、BatteryFlag、BatteryLifePercent最重要。ACLineStatus表示外接AC电源的状态,可以取下面的值:AC_LINE_OFFLINE、AC_LINE_ONLINE、AC_LINE_BACKUP_POWER、 AC_LINE_UNKNOWN。BatteryFlag表示电池状态,可以取下面的值:BATTERY_FLAG_HIGH、 BATTERY_FLAG_LOW、BATTERY_FLAG_CRITICAL、BATTERY_FLAG_CHARGING、 BATTERY_FLAG_NO_BATTERY、BATTERY_FLAG_UNKNOWN。BatteryLifePercent表示当前电池剩余电量百分比,。
BatteryPDDGetStatus的主要工作是填充上面的电池信息结构。在这里需要实现电池硬件驱动,读取电池状态信息。
BatteryPDDGetLevels 返回电池信息结构SYSTEM_POWER_STATUS_EX2中BatteryFlag与BackupBatteryFlag成员的电池状态级别。返回值为双字,低字表示主电池报告级别MainLevel,取值0~3;高字表示主电池报告级别BackLevel,取值0~3。假如 BatteryFlag只取值BATTERY_FLAG_HIGH,则MainLevel为1;假如BatteryFlag取值 BATTERY_FLAG_HIGH、BATTERY_FLAG_LOW,则MainLevel为2;假如BatteryFlag取值 BATTERY_FLAG_HIGH、BATTERY_FLAG_LOW、BATTERY_FLAG_CRITICAL,则MainLevel为3。
另外,充电管理一般也在电池驱动PDD层实现,这里不再介绍,有兴趣的同学可以与我交流。

四.硬件解决方案
       电池充电管理芯片MAX8677A与电池监控芯片DS2786构成一套完整的设备电池管理方案。MAX8677A与DS2786是Maxim(美信)公司生产的芯片,芯片详细资料请参考http://www.maxim-ic.com.cn

五.其他
当电池状态改变时,调用SetEvent一个命名为“SSUpdatePower”的事件强制shell立即更新电池状态。电池驱动还有与电源管理交互的部分,放到电源管理部分介绍。

 

阅读更多
个人分类: WINCE驱动
想对作者说点什么? 我来说一句

windows CE5.0

2009年02月06日 9.66MB 下载

Windows CE 5.0 ROM 应用程序集合

2014年04月07日 2.11MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭