BYTE
备用电池电量状态。可以为以下值:
BATTERY_FLAG_HIGH
BATTERY_FLAG_CRITICAL
BATTERY_FLAG_CHARGING
BATTERY_FLAG_NO_BATTERY
BATTERY_FLAG_UNKNOWN
BATTERY_FLAG_LOW
BackupBatteryLifePercent
BYTE
备用电池剩余供电电量百分比,可以为0~100,或者为BATTERY_PERCENTAGE_UNKNOWN
Reserved3
BYTE
保留,应当设置为0
BackupBatteryLifeTime
DWORD
备用电池剩余供电时间
BatteryVoltage
DWORD
电池电压(单位:mV),值可以从0~65535
BatteryCurrent
DWORD
瞬间的负载(单位mA),充电时可以取值0~32767;放电时可以取值0~32768
BatteryAverageCurrent
DWORD
平均的设备负载(单位:mA),充电时可以取值0~32767;放电时可以取值0~32768
BatteryAverageInterval
DWORD
用于计算BatteryAverageCurrent的计时常数(单位:ms)
BatteryTemperature
DWORD
电池温度
BackupBatteryVoltage
DWORD
后备电池电压
BatteryChemistry
BYTE
电池化学材料,可以有以下选择:
BATTERY_CHEMISTRY_ALKALINE
BATTERY_CHEMISTRY_NICD
BATTERY_CHEMISTRY_HIMH
BATTERY_CHEMISTRY_LION
BATTERY_CHEMISTRY_LIPOLY
BATTERY_CHEMISTRY_UNKNOWN
10.5.3 注册表设置
下列代码是pxa255的电池驱动所需要更改的注册表设置:
IF BSP_NOBATTERY !
; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE/System/Events]
"SYSTEM/BatteryAPIsReady"="Battery Interface APIs"
; 这段注册表负责加载电池驱动,Iclass值必须跟Battery.h内定义的
; BATTERY_DRIVER_CLASS一样,这样系统才知道那个设备是电池驱动。这里我们使用
; DEVFLAGS_NAKEDENTRIES,这样就告诉设备管理器,加载驱动的时候忽略prefix键也就
; 是说,当驱动进行加载的时候设备管理器找到的是Init函数而不是BAT_Init这样就允许
; 在注册表内更改Prefix值而不需要再重新更改驱动了。
; for DLL entry points without the prefix. For example, it will look for Init
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 !
10.5.4 Battery Driver例程
以下例程可以在应用程序中调用。并非所有例程都需要被支持。
1.BatteryDrvrGetLevels
通过本例程可以查询驱动程序对系统电力状态的监控功能,具体指GetSystemPowerStatusEx2结构中BatteryFlag域里支持的电源状态数量。如果BatteryFlag里只能支持BATTERY_FLAG_HIGH和BATTERY_FLAG_LOW,那么就支持2个level。返回值为双字,高字代表备用电池,低字代表主电池。
其代码如下:
LONG BatteryDrvrGetLevels( void)
{
return MAKELONG (1 /*main battery levels*/,1/*backup battery levels*/);
}
2.BatteryDrvrSupportsChangeNotification
通过本例程可以查询驱动程序是否能检测出电池是否该被更换。
返回值为TRUE,则代表驱动支持通知机制,否则代表不支持。返回值为FALSE情况下,当调用BatteryPDDGetStatus时,参数pfBatteriesChanged应当设置为FALSE。
BOOL BatteryDrvrSupportsChangeNotification(void )
{
return FALSE;
}
3.BatteryGetLifeTimeInfo
通过本例程可以查询用户更换电池以后的时间:
void BatteryGetLifeTimeInfo(
LPSYSTEMTIME pstLastChange,
DWORD* pcmsCpuUsage,
DWORD* pcmsPreviousCpuUsage
);
其参数为:
pstLastChange
填写指向用户更换电池以来的时间数据。
pcmsCpuUsage
填写指向当前电池被激活后的时间数据。
pcmsPreviousCpuUsage
填写前一个电池被使用的时间数据。
10.5.5 PDD调用
1.BatteryPDDInitialize
本调用完成硬件初始化工作。函数原型如下:
BOOL WINAPI BatteryPDDInitialize(
LPCTSTR pszRegistryContext
);
参数pszRegistryContext指向驱动的注册表键。如果操作成功则返回TRUE。如果返回错误,则驱动将被设备管理器卸载。
在PXA255的驱动中,只是设置了模块名称,初始化上下文,然后打印调试信息,并且返回TRUE。
BOOL WINAPI BatteryPDDInitialize(LPCTSTR pszRegistryContext)
{
BOOL fOk = TRUE;
SETFNAME(_T("BatteryPDDInitialize"));
UNREFERENCED_PARAMETER(pszRegistryContext);
DEBUGMSG(ZONE_PDD, (_T("%s: returning %d/r/n"), pszFname, fOk));
return fOk;
}
2.BatteryPDDDeinitialize
完成硬件特定的删除卸载任务。在PXA255的驱动中,仅仅打印调试信息。
void WINAPI BatteryPDDDeinitialize(void)
{
SETFNAME(_T("BatteryPDDDeinitialize"));
DEBUGMSG(ZONE_PDD, (_T("%s: invoked/r/n"), pszFname));
}
3.BatteryPDDResume
在系统从睡眠中恢复后,执行硬件电池处理操作。在PXA255的驱动中,仅仅打印调试信息。
void WINAPI BatteryPDDResume(void)
{
SETFNAME(_T("BatteryPDDResume"));
DEBUGMSG(ZONE_PDD, (_T("%s: invoked/r/n"), pszFname));
}
4.BatteryPDDGetStatus
获取当前的电源状态。下面pxa255驱动中的代码,重新填写了PSYSTEM_POWER_STA-
TUS_EX2结构的各个域。
BOOL WINAPI BatteryPDDGetStatus(
PSYSTEM_POWER_STATUS_EX2 pstatus,
PBOOL pfBatteriesChangedSinceLastCall
)
{
pstatus->ACLineStatus = AC_LINE_ONLINE;
pstatus->BatteryFlag = BATTERY_FLAG_NO_BATTERY;
pstatus->BatteryLifePercent = 0;
pstatus->BatteryLifeTime = BATTERY_LIFE_UNKNOWN;
pstatus->BatteryFullLifeTime = BATTERY_LIFE_UNKNOWN;
pstatus->BackupBatteryFlag = BATTERY_FLAG_HIGH;
pstatus->BackupBatteryLifePercent = 0;
pstatus->BackupBatteryLifeTime = BATTERY_LIFE_UNKNOWN;
pstatus->BackupBatteryFullLifeTime = BATTERY_LIFE_UNKNOWN;
pstatus->BatteryChemistry = BATTERY_CHEMISTRY_UNKNOWN;
pstatus->BatteryVoltage = 0;
pstatus->BatteryCurrent = 0;
pstatus->BatteryAverageCurrent = 0;
pstatus->BatteryAverageInterval = 0;
pstatus->BatterymAHourConsumed = 0;
pstatus->BatteryTemperature = 0;
pstatus->BackupBatteryVoltage = 0;
*pfBatteriesChangedSinceLastCall = FALSE;
return (TRUE);
}
在一般的产品中,应当探测AC电源和电池电源的剩余电力然后再进行域填充。对电力的探测可以使用IsACOnline、Battery_sampleADC等操作,具体可以参考PLATFORM BUILDER所自带的驱动demo。
5.BatteryPDDGetLevels
查询驱动程序对系统电力状态的监控功能,具体指GetSystemPowerStatusEx2结构中BatteryFlag域里支持的电源状态数量。如果BatteryFlag里只能支持BATTERY_FLAG_HIGH和BATTERY_FLAG_LOW,那么就支持2个level。返回值为双字,高字代表备用电池,低字代表主电池。
功能,返回值基本和BatteryDrvrGetLevels相同。
LONG BatteryPDDGetLevels( void)
{
LONG lLevels = MAKELONG (3 /* main battery levels */,
3 /* backup battery levels */);
SETFNAME(_T("BatteryPDDPowerHandler"));
DEBUGMSG(ZONE_PDD, (_T("%s: returning %u (%d main levels, %d backup levels)/r/n"),pszFname, LOWORD(lLevels), HIWORD(lLevels)));
return lLevels;
}
6.BatteryPDDSupportsChangeNotification
功能和返回值与BatteryDrvrSupportsChangeNotification相同。在pxa255中将返回值设置为FALSE。
BOOL BatteryPDDSupportsChangeNotification(void)
{
BOOL fSupportsChange = FALSE;
SETFNAME(_T("BatteryPDDPowerHandler"));
DEBUGMSG(ZONE_PDD, (_T("%s: returning %d/r/n"), pszFname, fSupportsChange));
return fSupportsChange;
}