BOOL PMU_IOControl(DWORD pContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut){
BOOL RetVal=TRUE;
DWORD dwIndex;
if (NULL==pBufIn) {//检查参数是否合法
SetLastError (ERROR_INVALID_PARAMETER);
RetVal=FALSE;
DEBUGMSG (ZONE_ERROR, (TEXT(“Invalid parameter\\r\\n”)));
return(RetVal);
}
switch(dwCode){
case IOCTL_PMU_REGULATOR_ON://打开DC DC/LDO
if((PMIC_Regulator_On((PMU_IO_DESC *)pBufIn))==FALSE){
SetLastError(ERROR_TIMEOUT);
RetVal=FALSE;
}
break;
case IOCTL_PMU_REGULATOR_OFF://关闭
DC DC/LDO
if((PMIC_Regulator_Off((PMU_IO_DESC *)pBufIn))==FALSE){
SetLastError(ERROR_TIMEOUT);
RetVal=FALSE;
}
break;
case IOCTL_PMU_SET_REGULATOR_VOLTAGE://设置DC DC/LDO输出电压
if((PMIC_Set_Regulator_Voltage((PMU_IO_DESC *)pBufIn))==FALSE){
SetLastError(ERROR_TIMEOUT);
RetVal=FALSE;
}
break;
case IOCTL_PMU_SET_BACKLIGHT_LEVEL://设置背光亮度等级
if((PMIC_Set_Backlight_Level((PMU_IO_DESC *)pBufIn))==FALSE){
SetLastError(ERROR_TIMEOUT);
RetVal=FALSE;
}
break;
case IOCTL_PMU_TURN_OFF://关闭设备电源
PMIC_Turn_Off();
break;
case IOCTL_PMU_IS_BACKLIGHT_ON://查询背光是否打开
*pBufOut=PMIC_Is_Backlight_On();
break;
}
return(RetVal);
}
2.2 PMIC(WM8310)初始化
PMIC(WM8310)初始化主要完成开机键的时间设置,打开背光设置默认亮度,设置HWC功能实现CPU休眠唤醒电源控制。PMIC(WM8310)初始化函数为PMIC_Init(),源代码如下:
DWORD PMIC_Init(HANDLE hIIC){
DWORD r, dwErr=0;
PMU_IO_DESC pmic_data;
hI2C=hIIC;//I2C驱动句柄
wm831x_reg_unlock();
wm831x_set_bits(WM831X_ON_PIN_CONTROL, 0x03ff, 0x0212); //设置关机时间为4s
wm831x_reg_lock();
wm831x_isink_enable(WM831X_CS1_BASE);//打开背光电流控制
dwErr=wm831x_isink_set_current(WM831X_CS1_BASE, 6889);//设置默认背光亮度
pmic_data.RegulatorIndex=VCC_BL;
pmic_data.pData=0;
pmic_data.Count=0;
if(!PMIC_Regulator_On(&pmic_data))dwErr=1;//打开背光设置HWC功能实现CPU休眠唤醒电源控制
wm831x_buckv_enable_hwc(WM831X_DC1_BASE,WM831X_DCDC_HWC_MODE_DISABLED,WM831X_DCDC_HWC_SRC_HC1);
wm831x_gpio_direction_in(0);//设置WM8310GPIO1 为输入
wm831x_gpio_configuration(0, WM831X_GPN_POL_MASK, 0);//设置WM8310GPIO1 为低电平有效
wm831x_gpio_set_function(0, 0x0c);//设置WM8310GPIO1为HW Control1 input功能
return dwErr;
}
2.3 PMIC(WM8310)驱动调用示例
PMIC(WM8310)的驱动采用流式驱动,对其操作的方法就像操作文件的方法一样非常方便。所有功能都通过调用DeviceIoControl()来实现。在此之前要先打开设备,代码如下:
static HANDLE hPMIC;//PMIC设备句柄
hPMIC=CreateFile(PMIC_DRIVER_PORT,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING, 0, 0);
if ( INVALID_HANDLE_VALUE==hPMIC ) {
dwErr=GetLastError();
return FALSE;
}
然后将CreateFile()返回的设备句柄传递给DeviceIoControl()来实现功能,例如实现调整背光亮度等级的代码如下:
DWORD dwErr, bytes, dat;
PMU_IO_DESC pmic_data;
dat=BACKLIGHT_VALUE10;//背光等级10
pmic_data.RegulatorIndex=VCC_BL;
pmic_data.pData=&dat;
pmic_data.Count=1;
if ( !DeviceIoControl(hPMIC,IOCTL_PMU_SET_BACKLIGHT_LEVEL, &pmic_data, sizeof(PMU_IO_DESC), NULL, 0, &bytes, NULL) ) {
dwErr=GetLastError();
return FALSE;
}
else{
return TRUE;//调整成功
}
结语
本方案利用WM8310的可编程及高性能的特点,将其用于手持设备的CPU供电,结合Windows CE 6.0操作系统实现了动态电压频率调节、背光光控制以及休眠唤醒等功能,极大地降低了系统的功耗,延长了手持设备的工作时间,在相同的工作时间要求下减小了电池尺寸的要求。并且WM8310的高度集成、芯片面积小等特点大大地减小了手持设备PCB板尺寸,使手持设备能做到更小化、更轻便。本方案已经成功应用于中海达测绘仪器有限公司的手持设备中,经过长时间的使用工作稳定、可靠。该方案所带来的优点使产品的竞争力有很大提高。
评论
查看更多