电源管理集成电路WM8310控制接口驱动程序设计

接口/总线/驱动

1143人已加入

描述

引言

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的上电时序要求。

SPI接口

图1 S5PC100上电时序

图1中的时间大小如表1所列。

它描述了WM8310的各路输出与S5PC100电源的连接以及每一路电源的上电时序。

SPI接口

表1 S5PC100的时间大小

1.2 外部EEPROM设计

WM8310上电的时候需要读取外部EEPROM的数据来设定每一路DCDC和LDO的初始输出电压以及上电时序,外部EEPROM芯片通过I2C接口与WM8310连接,上电后WM8310自动读出EEPROM第一页的32字节数据,WM8310的寄存器长度是16位的,所以外部EEPROM芯片要选2字节宽度的。WM8310与外部EEPROM的连接电路如图2所示。

SPI接口

图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

1.3 WM8310与S5PC100的控制接口

WM8310具有两种控制接口,一种是I2C接口,另一种是SPI接口。可以选择一个接口与CPU进行通信控制。WM8310的IREFR引脚是控制接口模式选择端,若IREFR引脚接低电平则选择I2C接口,反之则选择SPI接口。本方案中选择把WM8310的I2C接口与S5PC100的I2C0接口通信,WM8310控制接口如图3所示。

SPI接口

图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板尺寸,使手持设备能做到更小化、更轻便。本方案已经成功应用于中海达测绘仪器有限公司的手持设备中,经过长时间的使用工作稳定、可靠。该方案所带来的优点使产品的竞争力有很大提高。
来源;电子工程网

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分