📄 pmic_regulator.cpp
字号:
// SW_VOLTAGE_NORMAL
// SW_VOLTAGE_DVS
// SW_VOLTAGE_STBY
//
// voltage [out] the pointer to store the return value
//
// Returns:
// status
// PMIC_SUCCESS for success and PMIC_ERROR for failure
//
//------------------------------------------------------------------------------
PMIC_STATUS PmicSwitchModeRegulatorGetVoltageLevel (
PMIC_REGULATOR_SREG regulator,
PMIC_REGULATOR_SREG_VOLTAGE_TYPE voltageType,
PMIC_REGULATOR_SREG_VOLTAGE* voltage)
{
UINT32 addr, temp;
DEBUGMSG(ZONE_FUNC, (TEXT("+%s()\r\n"), __WFUNCTION__));
if (voltage == NULL)
{
DEBUGMSG(ZONE_ERROR, (_T("PmicSwitchModeRegulatorGetVoltageLevel:Invalid Parameter\r\n")));
return PMIC_PARAMETER_ERROR;
}
switch (regulator)
{
case SW1A:
addr = MC13783_SW0_ADDR;
if(!DeviceIoControl(hPMI, PMIC_IOCTL_LLA_READ_REG, &addr, sizeof(addr),
&temp, sizeof(temp), NULL, NULL))
return PMIC_ERROR;
if (voltageType == SW_VOLTAGE_NORMAL)
*voltage = CSP_BITFEXT(temp, MC13783_SW0_SW1A);
else if (voltageType == SW_VOLTAGE_DVS)
*voltage = CSP_BITFEXT(temp, MC13783_SW0_SW1ADVS);
else // voltageType == SW_VOLTAGE_STBY
*voltage = CSP_BITFEXT(temp, MC13783_SW0_SW1ASTBY);
break;
case SW1B:
addr = MC13783_SW1_ADDR;
if(!DeviceIoControl(hPMI, PMIC_IOCTL_LLA_READ_REG, &addr, sizeof(addr),
&temp, sizeof(temp), NULL, NULL))
return PMIC_ERROR;
if (voltageType == SW_VOLTAGE_NORMAL)
*voltage = CSP_BITFEXT(temp, MC13783_SW1_SW1B);
else if (voltageType == SW_VOLTAGE_DVS)
*voltage = CSP_BITFEXT(temp, MC13783_SW1_SW1BDVS);
else //voltageType == SW_VOLTAGE_STBY
*voltage = CSP_BITFEXT(temp, MC13783_SW1_SW1BSTBY);
break;
case SW2A:
addr = MC13783_SW2_ADDR;
if(!DeviceIoControl(hPMI, PMIC_IOCTL_LLA_READ_REG, &addr, sizeof(addr),
&temp, sizeof(temp), NULL, NULL))
return PMIC_ERROR;
if (voltageType == SW_VOLTAGE_NORMAL)
*voltage = CSP_BITFEXT(temp, MC13783_SW2_SW2A);
else if (voltageType == SW_VOLTAGE_DVS)
*voltage = CSP_BITFEXT(temp, MC13783_SW2_SW2ADVS);
else //voltageType == SW_VOLTAGE_STBY
*voltage = CSP_BITFEXT(temp, MC13783_SW2_SW2ASTBY);
break;
case SW2B:
addr = MC13783_SW3_ADDR;
if(!DeviceIoControl(hPMI, PMIC_IOCTL_LLA_READ_REG, &addr, sizeof(addr),
&temp, sizeof(temp), NULL, NULL))
return PMIC_ERROR;
if (voltageType == SW_VOLTAGE_NORMAL)
*voltage = CSP_BITFEXT(temp, MC13783_SW3_SW2B);
else if (voltageType == SW_VOLTAGE_DVS)
*voltage = CSP_BITFEXT(temp, MC13783_SW3_SW2BDVS);
else //voltageType == SW_VOLTAGE_STBY
*voltage = CSP_BITFEXT(temp, MC13783_SW3_SW2BSTBY);
break;
case SW3:
addr = MC13783_SW5_ADDR;
if(!DeviceIoControl(hPMI, PMIC_IOCTL_LLA_READ_REG, &addr, sizeof(addr),
&temp, sizeof(temp), NULL, NULL))
return PMIC_ERROR;
*voltage = CSP_BITFEXT(temp, MC13783_SW5_SW3);
break;
default:
return PMIC_PARAMETER_ERROR;
}
DEBUGMSG(ZONE_FUNC, (TEXT("-%s()\r\n"), __WFUNCTION__));
return PMIC_SUCCESS;
}
//------------------------------------------------------------------------------
//
// Function: PmicSwitchModeRegulatorSetMode
//
// This function is to set the switch mode regulator into different mode for both standby
// and normal case.
//
// Parameters:
// regulator [in] the regulator to be set
//
// standby [i] standby = LOW, the mode will be set in SWxMODE
// standby = HIGH, the mode will be set in SWxSTBYMODE
//
// mode [in] the mode to be use
// 1. OFF
// 2. PWM mode and no Pulse Skipping
// 3. PWM mode and pulse Skipping Allowed
// 4. Low Power PFM mode
//
// Returns:
// status
// PMIC_SUCCESS for success and PMIC_ERROR for failure
//
//------------------------------------------------------------------------------
PMIC_STATUS PmicSwitchModeRegulatorSetMode (
PMIC_REGULATOR_SREG regulator,
PMIC_REGULATOR_SREG_STBY standby,
PMIC_REGULATOR_SREG_MODE mode )
{
PMIC_PARAM_LLA_WRITE_REG param;
DEBUGMSG(ZONE_FUNC, (TEXT("+%s()\r\n"), __WFUNCTION__));
if (regulator == SW3)
{
DEBUGMSG(ZONE_ERROR, (_T("PmicSwitchModeRegulatorSetMode:SW3 does not support these modes\r\n")));
return PMIC_PARAMETER_ERROR;
}
if (standby == LOW )
{
switch (regulator)
{
case SW1A:
param.addr = MC13783_SW4_ADDR;
param.data = CSP_BITFVAL(MC13783_SW4_SW1AMODE, mode);
param.mask = CSP_BITFMASK(MC13783_SW4_SW1AMODE);
break;
case SW1B:
param.addr = MC13783_SW4_ADDR;
param.data = CSP_BITFVAL(MC13783_SW4_SW1BMODE, mode);
param.mask = CSP_BITFMASK(MC13783_SW4_SW1BMODE);
break;
case SW2A:
param.addr = MC13783_SW5_ADDR;
param.data = CSP_BITFVAL(MC13783_SW5_SW2AMODE, mode);
param.mask = CSP_BITFMASK(MC13783_SW5_SW2AMODE);
break;
case SW2B:
param.addr = MC13783_SW5_ADDR;
param.data = CSP_BITFVAL(MC13783_SW5_SW2BMODE, mode);
param.mask = CSP_BITFMASK(MC13783_SW5_SW2BMODE);
break;
default:
return PMIC_PARAMETER_ERROR;
}
}
else
{
switch (regulator)
{
case SW1A:
param.addr = MC13783_SW4_ADDR;
param.data = CSP_BITFVAL(MC13783_SW4_SW1ASTBYMODE, mode);
param.mask = CSP_BITFMASK(MC13783_SW4_SW1ASTBYMODE);
break;
case SW1B:
param.addr = MC13783_SW4_ADDR;
param.data = CSP_BITFVAL(MC13783_SW4_SW1BSTBYMODE, mode);
param.mask = CSP_BITFMASK(MC13783_SW4_SW1BSTBYMODE);
break;
case SW2A:
param.addr = MC13783_SW5_ADDR;
param.data = CSP_BITFVAL(MC13783_SW5_SW2ASTBYMODE, mode);
param.mask = CSP_BITFMASK(MC13783_SW5_SW2ASTBYMODE);
break;
case SW2B:
param.addr = MC13783_SW5_ADDR;
param.data = CSP_BITFVAL(MC13783_SW5_SW2BSTBYMODE, mode);
param.mask = CSP_BITFMASK(MC13783_SW5_SW2BSTBYMODE);
break;
default:
return PMIC_PARAMETER_ERROR;
}
}
if(!DeviceIoControl(hPMI, PMIC_IOCTL_LLA_WRITE_REG, ¶m,
sizeof(param), NULL, 0, NULL, NULL))
return PMIC_ERROR;
DEBUGMSG(ZONE_FUNC, (TEXT("-%s()\r\n"), __WFUNCTION__));
return PMIC_SUCCESS;
}
//------------------------------------------------------------------------------
//
// Function: PmicSwitchModeRegulatorGetMode
//
// This function is to get the switch regulator mode settings.
//
// Parameters:
// regulator [in] the regulator to get the settings from.
//
// standby [i] standby = LOW, the mode will be set in SWxMODE
// standby = HIGH, the mode will be set in SWxSTBYMODE
//
// mode [out] the pointer to get the mode settings
//
// Returns:
// status
// PMIC_SUCCESS for success and PMIC_ERROR for failure
//
//------------------------------------------------------------------------------
PMIC_STATUS PmicSwitchModeRegulatorGetMode (
PMIC_REGULATOR_SREG regulator,
PMIC_REGULATOR_SREG_STBY standby,
PMIC_REGULATOR_SREG_MODE* mode )
{
UINT32 addr, temp;
DEBUGMSG(ZONE_FUNC, (TEXT("+%s()\r\n"), __WFUNCTION__));
if (mode == NULL)
{
DEBUGMSG(ZONE_ERROR, (_T("PmicSwitchModeRegulatorGetMode:Invalid Parameter\r\n")));
return PMIC_PARAMETER_ERROR;
}
if (regulator == SW3)
{
DEBUGMSG(ZONE_ERROR, (_T("PmicSwitchModeRegulatorGetMode:SW3 does not support these modes\r\n")));
return PMIC_PARAMETER_ERROR;
}
else if (regulator <SW2A)
addr = MC13783_SW4_ADDR;
else
addr = MC13783_SW5_ADDR;
if(!DeviceIoControl(hPMI, PMIC_IOCTL_LLA_READ_REG, &addr, sizeof(addr),
&temp, sizeof(temp), NULL, NULL))
return PMIC_ERROR;
if (standby == LOW )
{
switch (regulator)
{
case SW1A:
*mode = (PMIC_REGULATOR_SREG_MODE)CSP_BITFEXT(temp, MC13783_SW4_SW1AMODE);
break;
case SW1B:
*mode = (PMIC_REGULATOR_SREG_MODE)CSP_BITFEXT(temp, MC13783_SW4_SW1BMODE);
break;
case SW2A:
*mode = (PMIC_REGULATOR_SREG_MODE)CSP_BITFEXT(temp, MC13783_SW5_SW2AMODE);
break;
case SW2B:
*mode = (PMIC_REGULATOR_SREG_MODE)CSP_BITFEXT(temp, MC13783_SW5_SW2BMODE);
break;
default:
return PMIC_PARAMETER_ERROR;
}
}
else
{
switch (regulator)
{
case SW1A:
*mode = (PMIC_REGULATOR_SREG_MODE)CSP_BITFEXT(temp, MC13783_SW4_SW1ASTBYMODE);
break;
case SW1B:
*mode = (PMIC_REGULATOR_SREG_MODE)CSP_BITFEXT(temp, MC13783_SW4_SW1BSTBYMODE);
break;
case SW2A:
*mode = (PMIC_REGULATOR_SREG_MODE)CSP_BITFEXT(temp, MC13783_SW5_SW2ASTBYMODE);
break;
case SW2B:
*mode = (PMIC_REGULATOR_SREG_MODE)CSP_BITFEXT(temp, MC13783_SW5_SW2BSTBYMODE);
break;
default:
return PMIC_PARAMETER_ERROR;
}
}
DEBUGMSG(ZONE_FUNC, (TEXT("-%s()\r\n"), __WFUNCTION__));
return PMIC_SUCCESS;
}
//------------------------------------------------------------------------------
//
// Function: PmicSwitchModeRegulatorSetDVSSpeed
//
// This function is to set the DVS speed the regulator.
//
// Parameters:
// regulator [in] the regulator to be set
// dvsspeed [in]
// 0 - Transition speed is dictated by the current
// limit and input -output conditions
// 1 - 25mV step each 4us
// 2 - 25mV step each 8us
// 3 - 25mV step each 16us
//
// Returns:
// status
// PMIC_SUCCESS for success and PMIC_ERROR for failure
//
//------------------------------------------------------------------------------
PMIC_STATUS PmicSwitchModeRegulatorSetDVSSpeed (
PMIC_REGULATOR_SREG regulator,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -