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

📄 pmicpdk.cpp

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

    // Set reading channel to ADA
    t_addr = MC13783_ADC1_ADDR;
    t_data = CSP_BITFVAL(MC13783_ADC1_ASC, MC13783_ADC1_ASC_ADC_IDLE)   |
             // we will use auto ADINC1
             CSP_BITFVAL(MC13783_ADC1_ADA1, MC13783_ADC1_ADA_SEL0_BATT) |
              // we will use auto ADINC2
             CSP_BITFVAL(MC13783_ADC1_ADA2, MC13783_ADC1_ADA_SEL0_CHRGISNS);
    t_mask = CSP_BITFMASK(MC13783_ADC1_ASC)  |
             CSP_BITFMASK(MC13783_ADC1_ADA1) |
             CSP_BITFMASK(MC13783_ADC1_ADA2);

    SetRegister(t_addr, t_data, t_mask);

    // Read conversion values
    for ( int i = 0; i < 4; i++ )
    {
        // Read channel data
        t_addr = MC13783_ADC2_ADDR;
        GetRegister(t_addr, &t_data);

        pReturnVal[i] = CSP_BITFEXT(t_data, MC13783_ADC2_ADD1);
        DEBUGMSG(ZONE_FUNC, (_T("t_data[%x] = %x\r\n"), i, pReturnVal[i]));

        pReturnVal[i+4] = CSP_BITFEXT(t_data, MC13783_ADC2_ADD2);
        DEBUGMSG(ZONE_FUNC, (_T("t_data[%x] = %x\r\n"), (i+4), pReturnVal[i+4]));
    }

}

//-----------------------------------------------------------------------------
//
// Function: PMICAdcSetMode
//
// This function sets the mode for the PMIC ADC.
//
// Parameters:
//      mode
//          [in] Requested ADC.
//
// Returns:
//      TRUE if the successful, FALSE otherwise.
//
//-----------------------------------------------------------------------------
static BOOL PMICAdcSetMode(PMIC_TOUCH_MODE mode)
{
    BOOL rc = FALSE;
    UINT32 addr, data, mask;

    DEBUGMSG(ZONE_FUNC, (TEXT("+%s()\r\n"), __WFUNCTION__));

    addr = MC13783_ADC0_ADDR;
    if (mode != TM_INACTIVE)
    {
        data = CSP_BITFVAL(MC13783_ADC0_TSMOD, mode)                   |
               CSP_BITFVAL(MC13783_ADC0_ADREFMOD, MC13783_ADC0_ENABLE) |
               CSP_BITFVAL(MC13783_ADC0_ADREFEN, MC13783_ADC0_ENABLE);
    }
    else
    {

⌨️ 快捷键说明

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