wince 电池驱动的实现

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);函数查询电量,而且返回的是一整个结构体,使用非常方便。

你可能感兴趣的:(wince 电池驱动的实现)