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) {//檢查參數(shù)是否合法
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://關(guān)閉
DC DC/LDO
if((PMIC_Regulator_Off((PMU_IO_DESC *)pBufIn))==FALSE){
SetLastError(ERROR_TIMEOUT);
RetVal=FALSE;
}
break;
case IOCTL_PMU_SET_REGULATOR_VOLTAGE://設(shè)置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://設(shè)置背光亮度等級
if((PMIC_Set_Backlight_Level((PMU_IO_DESC *)pBufIn))==FALSE){
SetLastError(ERROR_TIMEOUT);
RetVal=FALSE;
}
break;
case IOCTL_PMU_TURN_OFF://關(guān)閉設(shè)備電源
PMIC_Turn_Off();
break;
case IOCTL_PMU_IS_BACKLIGHT_ON://查詢背光是否打開
*pBufOut=PMIC_Is_Backlight_On();
break;
}
return(RetVal);
}
2.2 PMIC(WM8310)初始化
PMIC(WM8310)初始化主要完成開機(jī)鍵的時間設(shè)置,打開背光設(shè)置默認(rèn)亮度,設(shè)置HWC功能實現(xiàn)CPU休眠喚醒電源控制。PMIC(WM8310)初始化函數(shù)為PMIC_Init(),源代碼如下:
DWORD PMIC_Init(HANDLE hIIC){
DWORD r, dwErr=0;
PMU_IO_DESC pmic_data;
hI2C=hIIC;//I2C驅(qū)動句柄
wm831x_reg_unlock();
wm831x_set_bits(WM831X_ON_PIN_CONTROL, 0x03ff, 0x0212); //設(shè)置關(guān)機(jī)時間為4s
wm831x_reg_lock();
wm831x_isink_enable(WM831X_CS1_BASE);//打開背光電流控制
dwErr=wm831x_isink_set_current(WM831X_CS1_BASE, 6889);//設(shè)置默認(rèn)背光亮度
pmic_data.RegulatorIndex=VCC_BL;
pmic_data.pData=0;
pmic_data.Count=0;
if(!PMIC_Regulator_On(&pmic_data))dwErr=1;//打開背光設(shè)置HWC功能實現(xiàn)CPU休眠喚醒電源控制
wm831x_buckv_enable_hwc(WM831X_DC1_BASE,WM831X_DCDC_HWC_MODE_DISABLED,WM831X_DCDC_HWC_SRC_HC1);
wm831x_gpio_direction_in(0);//設(shè)置WM8310GPIO1 為輸入
wm831x_gpio_configuration(0, WM831X_GPN_POL_MASK, 0);//設(shè)置WM8310GPIO1 為低電平有效
wm831x_gpio_set_function(0, 0x0c);//設(shè)置WM8310GPIO1為HW Control1 input功能
return dwErr;
}
2.3 PMIC(WM8310)驅(qū)動調(diào)用示例
PMIC(WM8310)的驅(qū)動采用流式驅(qū)動,對其操作的方法就像操作文件的方法一樣非常方便。所有功能都通過調(diào)用DeviceIoControl()來實現(xiàn)。在此之前要先打開設(shè)備,代碼如下:
static HANDLE hPMIC;//PMIC設(shè)備句柄
hPMIC=CreateFile(PMIC_DRIVER_PORT,GENERIC_READ|GENERIC_WRITE,F(xiàn)ILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING, 0, 0);
if ( INVALID_HANDLE_VALUE==hPMIC ) {
dwErr=GetLastError();
return FALSE;
}
然后將CreateFile()返回的設(shè)備句柄傳遞給DeviceIoControl()來實現(xiàn)功能,例如實現(xiàn)調(diào)整背光亮度等級的代碼如下:
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;//調(diào)整成功
}
結(jié)語
本方案利用WM8310的可編程及高性能的特點,將其用于手持設(shè)備的CPU供電,結(jié)合Windows CE 6.0操作系統(tǒng)實現(xiàn)了動態(tài)電壓頻率調(diào)節(jié)、背光光控制以及休眠喚醒等功能,極大地降低了系統(tǒng)的功耗,延長了手持設(shè)備的工作時間,在相同的工作時間要求下減小了電池尺寸的要求。并且WM8310的高度集成、芯片面積小等特點大大地減小了手持設(shè)備PCB板尺寸,使手持設(shè)備能做到更小化、更輕便。本方案已經(jīng)成功應(yīng)用于中海達(dá)測繪儀器有限公司的手持設(shè)備中,經(jīng)過長時間的使用工作穩(wěn)定、可靠。該方案所帶來的優(yōu)點使產(chǎn)品的競爭力有很大提高。
評論
查看更多