WinCE电池驱动——使用LM339实现

1.概述

WinCE电池驱动属于分层驱动,由MDD层和PDD层组成。驱动示例代码位于%_WINCEROOT%/Public/Common/Oak/Drivers/Battdrvr。其中battdrvr.cMDD层代码,sbattif.cPDD层代码。MDD层代码微软已经搭好架构,一般不需要修改,我们要实现的是PDD层的代码。

2.MDD

电池驱动对外接口函数没有“BAT_”前缀,因为HKEY_LOCAL_MACHINE/Drivers/BuiltIn/Battery/Flags注册表项设置了DEVFLAGS_NAKEDENTRIES属性,表示“Init”代替“BAT_Init”,这样修改注册表“Prefix”项的值时不需要修改驱动代码。

MDD层函数包括:InitDeinitOpenCloseReadWriteSeekPowerDownPowerUpIOControl。我们主要分析一下InitIOControl函数。

先来看一下初始化函数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_GETSYSTEMPOWERSTATUSEX2IOCTL_BATTERY_GETSYSTEMPOWERSTATUSEX控制码得到系统电源状态。IOCTL_BATTERY_GETLIFETIMEINFO控制码得到电池剩余使用时间。IOCTL_BATTERY_GETLEVELS控制码得到电池报告级别,具体在BatteryPDDGetLevels中说明。IOCTL_BATTERY_SUPPORTSCHANGENOTIFICATION控制码报告当电池状态变化时是否通知系统。IOCTL_BATTERY_NOTIFYOFTIMECHANGE控制码表示如果系统时间改变,则更新电池相关信息。另外还预留了一个gpfnBatteryPddIOControl函数指针用来处理用户定义的IOCTL码。

3.PDD

PDD层函数包括:BatteryPDDInitializeBatteryPDDDeinitializeBatteryPDDResumeBatteryPDDPowerHandlerBatteryPDDGetStatusBatteryPDDGetLevelsBatteryPDDSupportsChangeNotification

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;

}

其中ACLineStatusBatteryFlagBatteryLifePercent最重要。ACLineStatus表示外接AC电源的状态,可以取下面的值:AC_LINE_OFFLINEAC_LINE_ONLINEAC_LINE_BACKUP_POWERAC_LINE_UNKNOWNBatteryFlag表示电池状态,可以取下面的值:BATTERY_FLAG_HIGHBATTERY_FLAG_LOWBATTERY_FLAG_CRITICALBATTERY_FLAG_CHARGINGBATTERY_FLAG_NO_BATTERYBATTERY_FLAG_UNKNOWNBatteryLifePercent表示当前电池剩余电量百分比,。

BatteryPDDGetStatus的主要工作是填充上面的电池信息结构。在这里需要实现电池硬件驱动,读取电池状态信息。

BatteryPDDGetLevels返回电池信息结构SYSTEM_POWER_STATUS_EX2BatteryFlagBackupBatteryFlag成员的电池状态级别。返回值为双字,低字表示主电池报告级别MainLevel,取值0~3;高字表示主电池报告级别BackLevel,取值0~3。如果BatteryFlag只取值BATTERY_FLAG_HIGH,则MainLevel1;如果BatteryFlag取值BATTERY_FLAG_HIGHBATTERY_FLAG_LOW,则MainLevel2;如果BatteryFlag取值BATTERY_FLAG_HIGHBATTERY_FLAG_LOWBATTERY_FLAG_CRITICAL,则MainLevel3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值