WinCE6.0 DEVICEEMULATOR BSP的BatteryDriver驱动简析

WinCE6.0 DEVICEEMULATOR BSP的Battery驱动,位于/SRC/DRIVERS/BATTDRVR下,只有一个battif.c,内容比较简单.实际上是电池驱动的PDD层,实现PDD层中的一个接口函数,这里简要来分析一下.其中MDD层代码位于/WINCE600/PUBLIC/COMMON/OAK/DRIVERS/BATTDRVR下.
电池Battery驱动由Device Manager加载,导出了一个流接口. 该流接口使OS不在让GWES来访问电池驱动函数.此流接口在系统启动早期能够提供电池信息,能够比标准函数报告更多不同的电池信息.
1. 注册表设置
位于/WINCE600/PUBLIC/COMMON/OAK/DRIVERS/BATTDRVR/battdrvr.reg,在platform.reg中通过#include "$(DRIVERS_DIR)/battdrvr/battdrvr.reg"添加到最终的注册表中.
IF BSP_NOBATTERY !

; HIVE BOOT SECTION

[HKEY_LOCAL_MACHINE/System/Events]
    "SYSTEM/BatteryAPIsReady"="Battery Interface APIs"

; END HIVE BOOT SECTION

; These registry entries load the battery driver.  The IClass value must match
; the BATTERY_DRIVER_CLASS definition in battery.h -- this is how the system
; knows which device is the battery driver.  Note that we are using
; DEVFLAGS_NAKEDENTRIES with this driver.  This tells the device manager
; to instantiate the device with the prefix named in the registry but to look
; for DLL entry points without the prefix.  For example, it will look for Init
; instead of BAT_Init.  This allows the prefix to be changed in the registry (if
; desired) without editing the driver code.
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/Battery]
   "Prefix"="BAT"
   "Dll"="battdrvr.dll"
   "Flags"=dword:8                      ; DEVFLAGS_NAKEDENTRIES
   "Order"=dword:0
   "IClass"="{DD176277-CD34-4980-91EE-67DBEF3D8913}"

ENDIF BSP_NOBATTERY !

2. BatteryPDDInitialize
BatteryPDDInitialize用来进行硬件相关的初始化,这里没有做任何实质性工作.

3. BatteryPDDDeinitialize
BatteryPDDDeinitialize用来进行硬件相关的资源释放.
if (g_pBatteryRegs)
    {
        MmUnmapIoSpace((PVOID)g_pBatteryRegs, sizeof(DEVICEEMULATOR_BATTERY_REGS));
    }
这里释放了Battery寄存器的映射的虚拟地址空间.

4. BatteryPDDResume
BatteryPDDResume在系统继续时在线程中进行硬件相关的电池操作.
这里没有做任何实质性工作.

5. BatteryPDDPowerHandler
BatteryPDDPowerHandler是电池驱动电源的回调函数,用来进行进行硬件相关的电池操作.在该回调中,只有有限的系统服务可以使用,如果要处理更多更复杂的动作,可以使用BatteryPDDResume

6. BatteryPDDGetStatus
BatteryPDDGetStatus获取当前电池/电源的大部分状态信息,并填充给参数传递的结构体SYSTEM_POWER_STATUS_EX2中.
SYSTEM_POWER_STATUS_EX2原型如下:

如果是第一次运行,则调用InitBatteryDriver来分配电池物理地址相应的虚拟地址空间.

接下来获取状态:

判断AC电源状态:

设置电池电量百分比状态,

最后将这些状态填充到SYSTEM_POWER_STATUS_EX2结构中去.



7. BatteryPDDGetLevels
BatteryPDDGetLevels用来获得电池电源级数(电池和备用电池),这里各设了3级:
 LONG lLevels = MAKELONG (3 /* main battery levels   */, 
                             3 /* backup battery levels */);

8. BatteryPDDSupportsChangeNotification
该函数报告驱动是否支持电池更换的通知.这里不支持,返回False.

通过KTIL下载到开发板,可以看到我们添加的打印信息,BatteryPDDGetStatus会被周期性的调用来获得电池的状态.由于我们的开发板直接连AC电源,因此显示的是AC_ONLINE,充电状态也是100%.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值