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

📄 pmicpdk.cpp

📁 freescale i.mx31 BSP CE5.0全部源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	{
		data0 |= CSP_BITFMASK(MC13783_USB0_VBUSPULSETMR);
		mask0 |= CSP_BITFVAL(MC13783_USB0_VBUSPULSETMR, MC13783_USB0_VBUSPULSETMR_910UA);
	}
	else if (inParam->PARAMS.usbOtgCfg & USB_VBUS_CURRENT_LIMIT_LOW_10MS)
	{
		data0 |= CSP_BITFMASK(MC13783_USB0_VBUSPULSETMR);
		mask0 |= CSP_BITFVAL(MC13783_USB0_VBUSPULSETMR, MC13783_USB0_VBUSPULSETMR_910UA_10MS);
	}
	else if (inParam->PARAMS.usbOtgCfg & USB_VBUS_CURRENT_LIMIT_LOW_20MS)
	{
		data0 |= CSP_BITFMASK(MC13783_USB0_VBUSPULSETMR);
		mask0 |= CSP_BITFVAL(MC13783_USB0_VBUSPULSETMR, MC13783_USB0_VBUSPULSETMR_910UA_20MS);
	}
	else if (inParam->PARAMS.usbOtgCfg & USB_VBUS_CURRENT_LIMIT_LOW_30MS)
	{
		data0 |= CSP_BITFMASK(MC13783_USB0_VBUSPULSETMR);
		mask0 |= CSP_BITFVAL(MC13783_USB0_VBUSPULSETMR, MC13783_USB0_VBUSPULSETMR_910UA_30MS);
	}
	else if (inParam->PARAMS.usbOtgCfg & USB_VBUS_CURRENT_LIMIT_LOW_40MS)
	{
		data0 |= CSP_BITFMASK(MC13783_USB0_VBUSPULSETMR);
		mask0 |= CSP_BITFVAL(MC13783_USB0_VBUSPULSETMR, MC13783_USB0_VBUSPULSETMR_910UA_40MS);
	}
	else if (inParam->PARAMS.usbOtgCfg & USB_VBUS_CURRENT_LIMIT_LOW_50MS)
	{
		data0 |= CSP_BITFMASK(MC13783_USB0_VBUSPULSETMR);
		mask0 |= CSP_BITFVAL(MC13783_USB0_VBUSPULSETMR, MC13783_USB0_VBUSPULSETMR_910UA_50MS);
	}
	else if (inParam->PARAMS.usbOtgCfg & USB_VBUS_CURRENT_LIMIT_LOW_60MS)
	{
		data0 |= CSP_BITFMASK(MC13783_USB0_VBUSPULSETMR);
		mask0 |= CSP_BITFVAL(MC13783_USB0_VBUSPULSETMR, MC13783_USB0_VBUSPULSETMR_910UA_60MS);
	}
	
	if (inParam->PARAMS.usbOtgCfg & USB_VBUS_PULLDOWN)
	{
		data0 |= CSP_BITFMASK(MC13783_USB0_VBUS70KPDENB);
		mask0 |= CSP_BITFVAL(MC13783_USB0_VBUS70KPDENB, MC13783_USB0_VBUS70KPDENB_ENABLE);
	}

	SetRegister(addr0, data0, mask0);
	
	*result = PMIC_SUCCESS;
	rc = TRUE;

	return rc;
}

static BOOL PmicIoctlConvityUsbOtgClearConfigHandler(PMIC_PARAM_CONVITY_OP *inParam, PMIC_STATUS *result)
{
	UINT32 addr0 = MC13783_USB0_ADDR,     data0 = 0, mask0 = 0;
	UINT32 addr1 = MC13783_CHG_USB1_ADDR, data1 = 0, mask1 = 0;
	BOOL rc = FALSE;

	*result = PMIC_ERROR;

	if (inParam->PARAMS.usbOtgCfg & USB_OTG_SE0CONN)
	{
		data0 |= CSP_BITFMASK(MC13783_USB0_SE0CONN);
		mask0 |= CSP_BITFVAL(MC13783_USB0_SE0CONN, MC13783_USB0_SE0CONN_AUTOCON_DISABLE);
	}
	
	if (inParam->PARAMS.usbOtgCfg & USB_PULL_OVERRIDE)
	{
		data0 |= CSP_BITFMASK(MC13783_USB0_PULLOVR);
		mask0 |= CSP_BITFVAL(MC13783_USB0_PULLOVR, MC13783_USB0_PULLOVR_DISABLE);
	}
	
	if (inParam->PARAMS.usbOtgCfg & USB_VBUS_PULLDOWN)
	{
		data0 |= CSP_BITFMASK(MC13783_USB0_VBUS70KPDENB);
		mask0 |= CSP_BITFVAL(MC13783_USB0_VBUS70KPDENB, MC13783_USB0_VBUS70KPDENB_DISABLE);
	}

	SetRegister(addr0, data0, mask0);
	
	*result = PMIC_SUCCESS;
	rc = TRUE;

	return rc;
}


//------------------------------------------------------------------------------
//
// Function: PmicADCGetSettings
//
// This function gets the adc configuration information.
//
// Parameters:
//      channel
//           [in] channels to be configured.
//      group
//           [out] group setting.
//      chann
//           [out] channel setting in ADC1.
//      ena
//           [out] bits to be enabled in ADC0.
//
// Returns:
//      Status.
//
//-----------------------------------------------------------------------------
static PMIC_STATUS PmicADCGetSettings(UINT16 channel, UINT32 *group,
                               UINT32 *chann, UINT32 *ena)
{
    *group = 0;
    *chann = 0;
    *ena = 0;

    switch (channel)
    {
        case CSP_BITFMASK(MC13783_ADC_BATT):
            // Select group 0
            *group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP0);
            // Select channel battery voltage
            *chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL0_BATT);

            *ena = CSP_BITFVAL(MC13783_ADC0_BATICON, MC13783_ADC0_ENABLE);

            DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_BATT\r\n")));
            break;

        case CSP_BITFMASK(MC13783_ADC_BATTISNS):
            // Select group 0
            *group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP0);
            // Select channel battery current
            *chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL0_BATTISNS);

            *ena = CSP_BITFVAL(MC13783_ADC0_BATICON, MC13783_ADC0_ENABLE);

            DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_BATTISNS\r\n")));
            break;

        case CSP_BITFMASK(MC13783_ADC_BPSNS):
            // Select group 0
            *group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP0);
            // Select channel application supply
            *chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL0_BPSNS);
            DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_BPSNS\r\n")));
            break;

        case CSP_BITFMASK(MC13783_ADC_CHRGRAW):
            // Select group 0
            *group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP0);
            // Select channel charger voltage
            *chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL0_CHRGRAW);
            DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_CHRGRAW\r\n")));
            break;

        case CSP_BITFMASK(MC13783_ADC_CHRGISNS):
            // Select group 0
            *group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP0);
            // Select channel battery current
            *chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL0_CHRGISNS);
            // Enable CHRGICON bit to retrieve charger current sample from ADC
            *ena = CSP_BITFVAL(MC13783_ADC0_CHRGICON, MC13783_ADC0_ENABLE);
            DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_CHRGISNS\r\n")));
            break;

        case CSP_BITFMASK(MC13783_ADC_RTHEN):
            // Select group 0
            *group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP0);
            // Select channel battery pack thermistor
            *chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL0_RTHEN);
            // Enable RTHEN bit to retrieve battery pack thermistor sample from
            // ADC
            *ena = CSP_BITFVAL(MC13783_ADC0_RTHEN, MC13783_ADC0_ENABLE);
            DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_RTHEN\r\n")));
            break;

        case CSP_BITFMASK(MC13783_ADC_LICELL):
            // Select group 0
            *group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP0);
            // Select channel backup voltage (LICELL)
            *chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL0_LICELL);
            // Enable BATICON bit to retrieve backup voltage sample from ADC
            *ena = CSP_BITFVAL(MC13783_ADC0_LICELLCON, MC13783_ADC0_ENABLE);
            DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_LICELL\r\n")));
            break;

        case CSP_BITFMASK(MC13783_ADC_DTHEN):
            // Select group 0
            *group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP0);
            // Select channel die temperature
            *chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL0_DTHEN);
            // Enable DTHEN bit to retrieve die temperature sample from ADC
            *ena = CSP_BITFVAL(MC13783_ADC0_DTHEN, MC13783_ADC0_ENABLE);
            DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_DTHEN\r\n")));
            break;

        case CSP_BITFMASK(MC13783_ADC_ADIN8):
            // Select group 1
            *group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP1);
            // Select channel ADIN8
            *chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL1_ADIN8);
            DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_ADIN8\r\n")));
            break;

        case CSP_BITFMASK(MC13783_ADC_ADIN9):
            // Select group 1
            *group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP1);
            // Select channel ADIN9
            *chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL1_ADIN9);
            DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_ADIN9\r\n")));
            break;

        case CSP_BITFMASK(MC13783_ADC_ADIN10):
            // Select group 1
            *group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP1);
            // Select channel ADIN10
            *chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL1_ADIN10);
            DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_ADIN10\r\n")));
            break;

        case CSP_BITFMASK(MC13783_ADC_ADIN11):
            // Select group 1
            *group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP1);
            // Sselect channel ADIN11
            *chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL1_ADIN11);
            DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_ADIN11\r\n")));
            break;

        case CSP_BITFMASK(MC13783_ADC_TSX1):
            // Select group 1
            *group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP1);
            // Select channel TSX1
            *chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL1_TSX1);
            DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_TSX1\r\n")));
            break;

        case CSP_BITFMASK(MC13783_ADC_TSX2):
            // Select group 1
            *group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP1);
            // Select channel TSX2
            *chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL1_TSX2);
            DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_TSX2\r\n")));
            break;

        case CSP_BITFMASK(MC13783_ADC_TSY1):
            // Select group 1
            *group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP1);
            // Select channel TSY1
            *chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL1_TSY1);
            DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_TSY1\r\n")));
            break;

        case CSP_BITFMASK(MC13783_ADC_TSY2):
            // Select group 1
            *group = CSP_BITFVAL(MC13783_ADC1_AD_SEL, MC13783_ADC1_AD_SEL_GROUP1);
            // Select channel TSY2
            *chann = CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL1_TSY2);
            DEBUGMSG(ZONE_FUNC, (_T("MC13783_ADC_TSY2\r\n")));
            break;

        default:
            return PMIC_PARAMETER_ERROR;
    }
    return PMIC_SUCCESS;
}

//-----------------------------------------------------------------------------
//
// Function: PmicADCConvert
//
// This function triggers a new set of ADC conversions and waits for the
// conversions to complete.
//
// Parameters:
//      mode
//
// Returns:
//      Status.
//
//-----------------------------------------------------------------------------
static PMIC_STATUS PmicADCConvert(void)
{
    PMIC_STATUS rc = PMIC_ERROR;
    UINT32 addr, data, mask;

    addr = MC13783_ADC1_ADDR;
    data = CSP_BITFVAL(MC13783_ADC1_ASC, MC13783_ADC1_ASC_START_ADC);
    mask = CSP_BITFMASK(MC13783_ADC1_ASC);
    
    // If we are in polled communication mode
    if (g_bAdcPolled)
    {
        // Start the ADC conversion
        SetRegister(addr, data, mask);

        // Poll the ADC1 until the ASC bit is clear
        DWORD maxRetries = 1000;
        do 
        {
            GetRegister(addr, &data);
        } while ((data & mask) && --maxRetries);

        if (!maxRetries)
        {
            ERRORMSG(TRUE, (_T("ADC operation timeout. \r\n")));
            goto cleanUp;
        }
    }
    else
    {            
        // Make sure ADC done interrupt is unmasked and cleared
        PMICIoctlIntEnable( PMIC_MC13783_INT_ADCDONEI, TRUE );

        // Start the ADC conversion
        SetRegister(addr, data, mask);
        
        // Wait for ADC complete interrupt
        if(WaitForSingleObject(phIntrHdlr[PMIC_MC13783_INT_ADCDONEI], 
            ADC_OPERATION_TIMEOUT) != WAIT_OBJECT_0)
        {
            ERRORMSG(TRUE, (_T("ADC operation timeout. \r\n")));
            GetRegister(MC13783_INT_STAT0_ADDR, &data);
            RETAILMSG(TRUE, (_T("MC13783_INT_STAT0 = 0x%x"), data));
            GetRegister(MC13783_INT_MSK0_ADDR, &data);
            RETAILMSG(TRUE, (_T("MC13783_INT_MSK0 = 0x%x"), data));
            GetRegister(MC13783_INT_STAT1_ADDR, &data);
            RETAILMSG(TRUE, (_T("MC13783_INT_STAT1 = 0x%x"), data));
            GetRegister(MC13783_INT_MSK1_ADDR, &data);
            RETAILMSG(TRUE, (_T("MC13783_INT_MSK1 = 0x%x"), data));
	    BSPPmicReadIntrStatus();
            goto cleanUp;
        }
    }

    rc = PMIC_SUCCESS;

cleanUp:
    return rc;

}

//-----------------------------------------------------------------------------
//
// Function: PmicADCDisable
//
// This function is just a helper function that disables ADC conversions 
//
// Parameters:
//
// Returns:
//
//-----------------------------------------------------------------------------
static VOID PmicADCDisable(void)
{
    UINT32 addr, data, mask;
    
    // Disable the ADC
    addr = MC13783_ADC1_ADDR;
    data = CSP_BITFVAL(MC13783_ADC1_ADEN, MC13783_ADC1_ADEN_DISABLE);
    mask = CSP_BITFMASK(MC13783_ADC1_ADEN);

    SetRegister(addr, data, mask);
}

//-----------------------------------------------------------------------------
//
// Function: PmicReadEightValues
//
//      This function is a helper function that reads eight values at a time
// from the ADC. This method uses the auto increment feature with two offset 
// pointers. This is done to optimize the ADC read. Uses 4 CSPI transactions
// compared to 16. 
//
// Parameters:
//      pReturnVal
//          [out]   This points to the eight returned UINT16 values. 
//
// Returns:
//
//-----------------------------------------------------------------------------

static VOID PmicReadEightValues( UINT16* pReturnVal )
{
    UINT32 t_addr, t_data, t_mask;

    // configure for auto increment
    t_addr = MC13783_ADC0_ADDR;
    t_data = CSP_BITFVAL(MC13783_ADC0_ADINC1, MC13783_ADC0_ADINC_AUTO_INCR) |
             CSP_BITFVAL(MC13783_ADC0_ADINC2, MC13783_ADC0_ADINC_AUTO_INCR);
    t_mask = CSP_BITFMASK(MC13783_ADC0_ADINC1) |
             CSP_BITFMASK(MC13783_ADC0_ADINC2);

    SetRegister(t_addr, t_data, t_mask);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -