wince电池驱动的实现
wince6的PUBLIC目录下,已经建立了电池驱动的架构,分为MDD层与PDD层,MDD层我们基本不用改动,我们需要修改的部分是PDD层,加入与自己系统硬件相关的部分就可以
为了不发动PUBLIC下的代码,我们需要将PDD层的相关代码复制到自己的BSP目录下:如/PLATFORM/XXXX/SRC/DRIVERS。(注册表文件与def文件也要拷过去),所以,我们只有一个C文件battif.c,需要增加的内容如下:
1、BOOL WINAPI BatteryPDDInitialize(LPCTSTR pszRegistryContext)
ADC转换接口初始化
if(g_pADCReg_bat == NULL)
{
g_pADCReg_bat = (S3C6410_ADC_REG *)DrvLib_MapIoSpace(S3C6410_BASE_REG_PA_ADC, sizeof(S3C6410_ADC_REG), FALSE);
if (g_pADCReg_bat == NULL)
{
//TSPERR((_T("[TSP:ERR] TSP_VirtualAlloc() : g_pADCReg_bat Allocation Fail/r/n")));
DEBUGMSG(ZONE_ERROR, (TEXT("[Battery]: TSP_VirtualAlloc() : g_pADCReg_bat Allocation Fail /r/n")));//20100224
fOk = FALSE;
goto ExitFun;
}
}
因为触摸屏也有可能用到这个ADC接口,所以需要创建一个互斥体。
if(ghBattTouchMutex==NULL)
{
ghBattTouchMutex = CreateMutex( NULL, FALSE, TEXT("_ADC_MUTEX_") );
}
如果出现异常返回 ,需要释放该ADC接口:
ExitFun:
if(fOk == FALSE)
{
if (g_pADCReg_bat)
{
DrvLib_UnmapIoSpace((PVOID)g_pADCReg_bat);
g_pADCReg_bat = NULL;
}
}
return fOk;
2、void WINAPI BatteryPDDDeinitialize(void)
需要增加ADC接口的释放与互斥体的释放
void WINAPI
BatteryPDDDeinitialize(void)
{
SETFNAME(_T("BatteryPDDDeinitialize"));
DEBUGMSG(ZONE_PDD, (_T("%s: invoked/r/n"), pszFname));
if(gpStatus != NULL && gpfnUnmapViewOfFile != NULL) gpfnUnmapViewOfFile(gpStatus);
if(ghFileMap != NULL) CloseHandle(ghFileMap);
if(ghMutex != NULL) CloseHandle(ghMutex);
if(ghBattTouchMutex != NULL )CloseHandle( ghBattTouchMutex );
ghBattTouchMutex = NULL ;
gpStatus = NULL;
ghFileMap = NULL;
ghMutex = NULL;
if (g_pADCReg_bat)
{
DrvLib_UnmapIoSpace((PVOID)g_pADCReg_bat);
g_pADCReg_bat = NULL;
}
}
3、 最重要的是查询状态函数,完成三个功能
BOOL WINAPI
BatteryPDDGetStatus(
PSYSTEM_POWER_STATUS_EX2 pstatus,
PBOOL pfBatteriesChangedSinceLastCall
)
3.1 IO口,检测使用电池还是使用交流电
AC_LINE_ONLINE AC_LINE_OFFLINE
3.2 读ADC的电压值
iAdLevel = ReadAdc(0);
最最近的10次检测结果的平均值作为电量值
if(ucIndex==0xff)
{
for(i=0;i<10;i++)
{
ucTemp[i]=BatteryLifePercent;
}
(gpStatus->sps).BatteryLifePercent=BatteryLifePercent;
ucIndex = 0;
}
else
{
if(ucIndex>=10)
{
ucIndex=0;
}
ucTemp[ ucIndex++ ]=BatteryLifePercent;
for(i=0,iAdLevel=0;i<10;i++)
{
iAdLevel+=ucTemp[i] ;
}
iAdLevel/=10;
(gpStatus->sps).BatteryLifePercent=iAdLevel;
}
3.3 电池状态标志
如 (Status->sps).BatteryFlag = BATTERY_FLAG_LOW;
3.4 将结果放入 PSYSTEM_POWER_STATUS_EX2 参数返回
因为用到了ADC寄存器,记得要在source文件里加入驱动库
$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/DriverLib.lib
这样,电池驱动就完成了
4、查询电量
在应用程序中,可用GetSystemPowerStatusEx2(&sps, sizeof(sps), TRUE);函数查询电量,而且返回的是一整个结构体,使用非常方便。