⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pmic_regulator.cpp

📁 i.mx27 soc for wince 6.0
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//                                          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, &param,
            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 + -