TouchScreen驱动分析

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;

}

你可能感兴趣的:(dll,byte,化工,interface,returning,winapi)