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://打開(kāi)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è)置背光亮度等級(jí)
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://查詢背光是否打開(kāi)
*pBufOut=PMIC_Is_Backlight_On();
break;
}
return(RetVal);
}
2.2 PMIC(WM8310)初始化
PMIC(WM8310)初始化主要完成開(kāi)機(jī)鍵的時(shí)間設(shè)置,打開(kāi)背光設(shè)置默認(rèn)亮度,設(shè)置HWC功能實(shí)現(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ū)動(dòng)句柄
wm831x_reg_unlock();
wm831x_set_bits(WM831X_ON_PIN_CONTROL, 0x03ff, 0x0212); //設(shè)置關(guān)機(jī)時(shí)間為4s
wm831x_reg_lock();
wm831x_isink_enable(WM831X_CS1_BASE);//打開(kāi)背光電流控制
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;//打開(kāi)背光設(shè)置HWC功能實(shí)現(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ū)動(dòng)調(diào)用示例
PMIC(WM8310)的驅(qū)動(dòng)采用流式驅(qū)動(dòng),對(duì)其操作的方法就像操作文件的方法一樣非常方便。所有功能都通過(guò)調(diào)用DeviceIoControl()來(lái)實(shí)現(xiàn)。在此之前要先打開(kāi)設(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()來(lái)實(shí)現(xiàn)功能,例如實(shí)現(xiàn)調(diào)整背光亮度等級(jí)的代碼如下:
DWORD dwErr, bytes, dat;
PMU_IO_DESC pmic_data;
dat=BACKLIGHT_VALUE10;//背光等級(jí)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é)語(yǔ)
本方案利用WM8310的可編程及高性能的特點(diǎn),將其用于手持設(shè)備的CPU供電,結(jié)合Windows CE 6.0操作系統(tǒng)實(shí)現(xiàn)了動(dòng)態(tài)電壓頻率調(diào)節(jié)、背光光控制以及休眠喚醒等功能,極大地降低了系統(tǒng)的功耗,延長(zhǎng)了手持設(shè)備的工作時(shí)間,在相同的工作時(shí)間要求下減小了電池尺寸的要求。并且WM8310的高度集成、芯片面積小等特點(diǎn)大大地減小了手持設(shè)備PCB板尺寸,使手持設(shè)備能做到更小化、更輕便。本方案已經(jīng)成功應(yīng)用于中海達(dá)測(cè)繪儀器有限公司的手持設(shè)備中,經(jīng)過(guò)長(zhǎng)時(shí)間的使用工作穩(wěn)定、可靠。該方案所帶來(lái)的優(yōu)點(diǎn)使產(chǎn)品的競(jìng)爭(zhēng)力有很大提高。
評(píng)論