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

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

引言

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用于内部电路

S5PC100的上电时序较为严格,如图1所示。为了保证处理器每次上电能正确运行,电源设计要满足其上电时序要求。WM8310可以为每一路DCDC以及LDO分配时序,非常容易满足S5PC100的上电时序要求。

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

图1 S5PC100上电时序

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

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

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

表1 S5PC100的时间大小

1.2 外部EEPROM设计

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

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

图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所示。

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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2498690.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-05
下一篇 2022-08-05

发表评论

登录后才能评论

评论列表(0条)

保存