摘要: 介紹一種智能電源管理芯片WM8310的應用方案,其應用在以三星S5PC100移動處理器為核心的手持設備上。文中給出了WM8310與S5PC100電源分配設計方法、上電時序,以及WM8310控制接口原理設計和基于Windows CE 6.0操作系統的驅動程序設計。
引言
WM8310是Wolfson公司推出的電源管理集成電路(PMIC)產品,具有完全可編程化可定制化和優良的性能。WM8310在7 mm×7 mm的小尺寸上集成了ADC、實時時鐘、低壓差穩壓器、降壓穩壓器以及用于背光的升壓穩壓器,提供了一個高集成度的PMIC解決方案。WM8310具有尺寸小、功能強等優點,被多家手機廠商以及手持設備商采用,廣泛用于移動電話、導航設備以及媒體播放器等消費電子產品。
S5PC100是三星公司發布的一款ARM CortexA8內核的移動處理器,主頻高達833 MHz.S5PC100處理器采用64位內部總線構架,內含 32/32 KB數據/指令一級緩存、256 KB二級緩存。它的構造基于三星的45 nm LP低功耗工藝技術S5PC100還包含強大的2D和3D硬件加速器。
1 硬件設計
1.1 S5PC100電源分配與上電時序
WM8310具有4路DCDC穩壓器以及13路LDO穩壓器。其中,2路DCDC同步降壓穩壓器輸出電流達1.2 A,并具有硬件DVS(動態電壓調節)功能;1路升壓DCDC穩壓器輸出電壓達30 V,可驅動多個串行白光LED.還包括6路標準LDO穩壓器和4路低噪聲LDO穩壓器,另有3路低功耗LDO用于內部電路。
WM8310的DCDC1與DCDC2具有DVS(動態電壓調試)功能,可以通過外部GPIO來切換輸出電壓,當然每一路DCDC和LDO都可以通過I2C控制接口來調節輸出電壓。將DCDC1與DCDC2分別接到S5PC100的內核電源(即VCC_ARM和VCC_INT),這兩個內核電壓可以根據當前處理器的運行頻率自動調節輸出電壓的大小并減小系統的功耗。DCDC3給DDR內存和S5PC100的內存總線接口電路供電。DCDC4用于LCD屏的背光驅動。其他各路LDO給S5PC100的I/O電路供電。
S5PC100的上電時序較為嚴格,如圖1所示。為了保證處理器每次上電能正確運行,電源設計要滿足其上電時序要求。WM8310可以為每一路DCDC以及LDO分配時序,非常容易滿足S5PC100的上電時序要求。
圖1 S5PC100上電時序
圖1中的時間大小如表1所列。
它描述了WM8310的各路輸出與S5PC100電源的連接以及每一路電源的上電時序。
表1 S5PC100的時間大小
1.2 外部EEPROM設計
WM8310上電的時候需要讀取外部EEPROM的數據來設定每一路DCDC和LDO的初始輸出電壓以及上電時序,外部EEPROM芯片通過I2C接口與WM8310連接,上電后WM8310自動讀出EEPROM第一頁的32字節數據,WM8310的寄存器長度是16位的,所以外部EEPROM芯片要選2字節寬度的。WM8310與外部EEPROM的連接電路如圖2所示。
圖2 WM8310與外部EEPROM的連接電路
這32字節初始化數據除了保存在外部EEPROM中,也可以保存在WM8310內部的OTP存儲器中,在WM8310芯片出廠的時候就把數據寫進內部的OTP存儲器,以后就不能改變了。WM8310上電的時候檢測SCLK2引腳,如果發現是高電平,則讀取EEPROM的數據作為初始化數據。如果已將數據燒寫到WM8310的OTP存儲器中,則將SCLK2與SDA2引腳懸空。
本方案中WM8310的32字節初始化數據為:
0x7FFE,0x43BE,0x433E,0x602A,0x267F,0x6666,0x7F7F,0x7A7D,0x7D78,0x0000,0xA40C,0xA400
1.3 WM8310與S5PC100的控制接口
WM8310具有兩種控制接口,一種是I2C接口,另一種是SPI接口。可以選擇一個接口與CPU進行通信控制。WM8310的IREFR引腳是控制接口模式選擇端,若IREFR引腳接低電平則選擇I2C接口,反之則選擇SPI接口。本方案中選擇把WM8310的I2C接口與S5PC100的I2C0接口通信,WM8310控制接口如圖3所示。
圖3 WM8310控制接口2驅動程序設計
2.驅動程序設計
2.1 流驅動接口
本方案中采用Windows CE 6.0操作系統,Windows CE 6.0操作系統的進程數由Windows CE 5.0的32個擴展到32 000個,每個進程的地址空間從32 MB擴展到2 GB,并且將代碼的運行權限分成用戶模式和內核模式。驅動程序置于內核模式,而應用程序置于用戶模式有助于整個環境更可靠、更安全地運行。
Windows CE 6.0的驅動模式分為本地驅動和流式驅動,流式驅動為操作系統提供了標準流接口函數,如XXX_Init()、XXX_Open()、XXX_Read()、XXX_Write()、XXX_Close()、XXX_IOControl()等。比如串口驅動、SPI接口驅動、I2C接口驅動等就是采用流式驅動。而本地驅動提供給操作系統的不是標準的接口,不同的設備接口也不一樣。常見的本地驅動有顯示驅動、觸摸屏驅動等。不管是本地驅動,還是流式驅動,所有驅動都是以DLL(動態鏈接庫)文件形式存在。
本方案中PMIC(WM8310)的驅動采用流式驅動。驅動實現的功能有系統開關機功能設置、DCDC與LDO動態電壓設置、背光亮度設置以及各路DCDC與LDO的打開與關閉等。具體的實現過程則是通過調用I2C驅動讀寫WM8310的寄存器。所有的功能通過PMU_IOControl()函數提供給操作系統,PMU_IOControl()函數是一個標準的流式驅動函數。PMU_IOControl()函數的源代碼如下:
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板尺寸,使手持設備能做到更小化、更輕便。本方案已經成功應用于中海達測繪儀器有限公司的手持設備中,經過長時間的使用工作穩定、可靠。該方案所帶來的優點使產品的競爭力有很大提高。
評論
查看更多