wince电池驱动的实现
来源:互联网 发布:大漠驼铃软件工作室 编辑:程序博客网 时间:2024/04/29 04:36
为了不发动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电池驱动的实现
- WinCE的电池驱动实现
- wince 电池驱动的实现
- wince电池驱动的实现
- wince电池驱动的实现
- WinCE电池驱动——使用LM339实现
- Wince 电池警告的bug
- Wince 电池警告的bug
- WinCE的网络驱动实现原理
- [转帖]WinCE的网络驱动实现原理
- WinCE的网络驱动实现原理
- WINCE基于PWM实现的背光驱动
- WinCE的网络驱动实现原理
- WINCE陀螺仪驱动的实现总结
- WinCE的网络驱动实现原理
- WinCE的网络驱动实现原理
- WinCE的网络驱动实现原理
- wince驱动入门必看-WinCE流设备驱动简介及GPIO驱动的实现
- Selenium2测试滚动广告
- 你会休息吗?掌握最高效的休息方式
- Eclipse 保存文件时自动格式化代码
- java交换两个数的三种方式
- 【八一八系列】之免费应用托管工具,屌丝也能云计算
- wince电池驱动的实现
- c++ jsoncpp操作
- 使用windows 7自带分区工具实现磁盘无损分区
- ProcessManagement
- 图的相关操作总结
- 内存溢出问题
- 美女薄情馆6.7.0破解VIP
- include头文件的使用方法
- 令人忧虑,不阅读的中国人