background image

3.  电池驱动模型和驱动初始化过程 

Windows CE 中包含的样本设备驱动程序分为两种类型:单片驱动程序(Monolithic 

device driver)和分层驱动程序(Layered Device driver)

。采用分层开发模式可以降低开发

难度,缩短开发周期,在电池驱动开发中使用分层驱动开发模式。 

分层驱动程序由两个独立的层组成:上层是模型设备驱动程序(MDD),下层是依赖

平台的驱动程序(PDD)。设备驱动程序服务器提供的接口(DDSI)是在PDD中实
现的函数集,并由MDD调用。由于微软提供了所有与MDD模块相关的源代码,所以对这
部分不用做任何改动,只需将自己的PDD模块与MDD模块链结成一个公用库即可[3]。

MDD 通过 IoCTLS 调用 PDD 中的特定函数来访问硬件的具体特性。 

Windows CE 电池驱动要求的 MDD 函数包括: 

Init、Deinit、Open、Close、Read、Write、Seek、PowerDown、PowerUp、IOControl。 

Windows CE 电池驱动要求的 PDD 函数包括:   

BatteryPDDInitialize

BatteryPDDDeinitialize

BatteryPDDGetStatus

BatteryPDDGetLevels、 

BatteryPDDSupportsChangeNotification、BatteryPDDPowerHandler、 BatteryPDDResume。

 

电池驱动初始化过程 
在系统上电自检成功后,上层调用电池驱动入口函数,进行电池驱动初始化工作: 

(1)判断是否已经进行中断事件初始化,如果没有初始化,则进行下面的操作,如果已

经进行了一次初始化,则关闭事件句柄。 

(2)初始化电池全局变量。 

(3)如果中断事件成功,则调用 ResumeThreadProc 创建电池线程。在线程的主调函数中,

设置电池线程的优先级,然后在循环中等待中断事件。 

(4)调用 PDD 层的初始化函数 BatteryPDDInitialize;在 PDD 层中,为 GPIO 寄存器和电

源管理寄存器开辟两段虚拟内存。 

(5)初始化 AC97 的寄存器。 

(6)初始化存放电池电量值的环形缓冲区。 

(7) 调 用 BatteryAPIGetSystemPowerStatusEx2 函 数 更 新 电 池 电 量 结 构 体 PSYSTEM 

POWERSTATUS_ EX2 中的数据。 

4. BatteryAPIGetSystemPowerStatusEx 函数 

BatteryAPIGetSystemPowerStatusEx 函数主要获取系统电源状态值。在执行过程中是通

BatteryAPIGetSystemPowerStatusEx2

BatteryAPIGetSystemPowerStatusEx2 函数调用 BatteryPDDGetStatus 函数以获取电池状态信
息,BatteryPDDGetStatus 函数通过调用 GetMainBatteryVoltage 获取主电池电压值,通过调
用 GetPowerDevStatus 获 取 电 池 设 备 状 态 , 并 获 取 剩 余 电 量 的 比 例 值 。 下 图 3 为

BatteryAPIGetSystemPowerStatusEx 函数调用关系图: