Wince Battery driver

来源:互联网 发布:sqlserver删除存储过程 编辑:程序博客网 时间:2024/05/19 23:04

最近调了wince battery driver, 对电池驱动有了一点点了解,如下:

1.Windows CE电池驱动属于分层驱动,由MDD层和PDD层组成。微软给我们的代码在D:/WINCE600/PUBLIC/COMMON/OAK/DRIVERS/BATTDRVR 目录下,该目录MDD文件夹是MDD 代码,一般的我们都不用动,直接引用即可。而PDD文件夹下的sbattif.c 是PDD的框架代码,我们可以直接靠过来,针对具体硬件添加代码。

2.MDD层函数包括:Init、Deinit、Open、Close、Read、Write、Seek、PowerDown、PowerUp、IOControl。我主要分析一下Init。

 
1.判断ghevResume事件是否为NULL,条件成立表示驱动还未加载继续执行,否则表示驱动已经加载跳出执行。
2.打开一个名为“SYSTEM/BatteryAPIsReady”的事件。“SYSTEM/BatteryAPIsReady”事件在注册表HKEY_LOCAL_MACHINE/System/Events下面,在内核初始化的时候由filesys.exe创建。
[HKEY_LOCAL_MACHINE/System/Events]
       "SYSTEM/BatteryAPIsReady"="Battery Interface APIs"
3.创建ghevResume事件。
4.调用BatteryPDDInitialize初始化电池信息,调用PDD层代码。
5.  打开注册表,获取轮询查询电池状态时间间隔,其默认的时间间隔为:
#define DEF_BATTERYPOLLTIMEOUT          (5*1000)         // in milliseconds
注册表设置的时间间隔:
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/Battery]
       "PollInterval"=dword:3e8  ;in milliseconds
       "BattCalibrationPoint"=dword:7
       "BattCalibrationData"=hex:59,03,4b,03,32,03,1c,03,09,03,f5,02,e0,02
6.调用BatteryAPIGetSystemPowerStatusEx2函数更新电池最新信息。BatteryAPIGetSystemPowerStatusEx2函数主要调用BatteryPDDGetStatus函数获取电池信息,这个函数在PDD层实现。
7.创建一个电池监控线程,处理系统resume消息,定时查询电池状态并通知系统。
8.设置“SYSTEM/BatteryAPIsReady”事件,通知系统电池驱动已经正常运行。

3.    PDD层函数主要包括:BatteryPDDInitialize、BatteryPDDDeinitialize、BatteryPDDResume、BatteryPDDPowerHandler、BatteryPDDGetStatus、BatteryPDDGetLevels、BatteryPDDSupportsChangeNotification 等函数,个人觉得最重要的事BatteryPDDInitialize和BatteryPDDGetStatus。

下面是我的BatteryPDDInitialize 代码:

主要是硬件初始化和填充电池信息结构体SYSTEM_POWER_STATUS_EX2 ;电池获得电量是通过读ADC寄存器的值再转化为电量百分比,具体硬件不同可能实现的方法有所不同;

BatteryPDDGetStatus 主要是检查电池当前的状态,重新更新SYSTEM_POWER_STATUS_EX2 结构体,可以添加电池低电报警功能在这里,控制开机电池最低电量!

原创粉丝点击