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

📄 pmicpdk.cpp

📁 i.mx27 soc for wince 6.0
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    // Deinitialize platform-specific configuration
    BSPPmicDeinit();

    // kill the IST thread
    if (hPmicISTThread)
    {
        bISTTerminate = TRUE;
        CloseHandle(hPmicISTThread);
        hPmicISTThread = NULL;
    }

    // Close interrupt event handle
    if (hIntrEventPmic)
    {
        CloseHandle(hIntrEventPmic);
        hIntrEventPmic = NULL;
    }

    // Delete critical sections
    DeleteCriticalSection(&pmicCs);
    DeleteCriticalSection(&adcCs);
    DeleteCriticalSection(&intRegCs);

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

//------------------------------------------------------------------------------
//
// Function: PmicIoctlConvityOpHandler
//
// This function does the general operations (Reset and Set Mode) for
// connectivity interface.
//
// Parameters:
//      inParam
//          [in] PMIC_PARAM_CONVITY_OP contains op code and specific information
//               inParam->PARAMS.ifMode contains the desired mode in case of
//               OP_SET_MODE.
//      result
//          [out] PMIC_STATUS
//
// Returns:
//      TRUE if the successful, FALSE otherwise.
//
//------------------------------------------------------------------------------
static BOOL PmicIoctlConvityOpHandler(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->op == OP_RESET)
    {
        mask0 = 0xFFFFFFFF;
        mask1 = 0xFFFFFFFF;
        data0 = MC13783_USB0_ADDR_RESET;
        data1 = MC13783_CHG_USB1_ADDR_RESET;

        SetRegister(addr0, data0, mask0);
        SetRegister(addr1, data1, mask1);
        *result = PMIC_SUCCESS;
        rc = TRUE;
    }
    else if (inParam->op == OP_SET_MODE)
    {
        // in case of USB mode, first enable SPI control of USB.
        if (inParam->PARAMS.ifMode == USB)
        {
            mask0 = CSP_BITFMASK(MC13783_USB0_USBCNTRL);
            data0 = CSP_BITFVAL(MC13783_USB0_USBCNTRL,
                                MC13783_USB0_USBCNTRL_SPI);
            SetRegister(addr0, data0, mask0);
        }

        mask0 = CSP_BITFMASK(MC13783_USB0_CONMODE);
        data0 = CSP_BITFVAL(MC13783_USB0_CONMODE, inParam->PARAMS.ifMode);

        if (inParam->PARAMS.ifMode == USB)
        {
            // start USB in powered off, pull-up/downs disabled mode.
            mask1 = CSP_BITFMASK(MC13783_CHG_USB1_VUSBEN) |
                                    CSP_BITFMASK(MC13783_CHG_USB1_VBUSEN);
            data1 = 0;
            SetRegister(addr1, data1, mask1);

            mask0 |= CSP_BITFMASK(MC13783_USB0_USBXCVREN)            |
                                    CSP_BITFMASK(MC13783_USB0_USBPU) |
                                    CSP_BITFMASK(MC13783_USB0_UDPPD) |
                                    CSP_BITFMASK(MC13783_USB0_UDMPD);
            // no change to data0: all these are disabled by setting to 0.
        }
        else if (inParam->PARAMS.ifMode == RS232)
        {
            // This mode will set the connections as
            // RS232_TX_RX_EXTERNAL_DEFAULT and
            // RS232_TX_RX_INTERNAL_DEFAULT, and
            // output not tristated.
            mask0 |= CSP_BITFMASK(MC13783_CHG_USB1_RSPOL);
            data0 |= CSP_BITFVAL(MC13783_CHG_USB1_RSPOL,
                                 MC13783_CHG_USB1_RSTRI_NONE);
        }

        // no specific settings done for CEA-936 modes besides CONMODE itself.
        SetRegister(addr0, data0, mask0);
        *result = PMIC_SUCCESS;

        rc = TRUE;
    }

    return rc;
}

//------------------------------------------------------------------------------
//
// Function: PmicIoctlConvityRs232OpHandler
//
// This function does the config setting in RS232 mode for
// connectivity interface.
//
// Parameters:
//      inParam
//          [in] PMIC_PARAM_CONVITY_OP contains op code and specific information
//
//      result
//          [out] PMIC_STATUS
//
// Returns:
//      TRUE if the successful, FALSE otherwise.
//
//------------------------------------------------------------------------------
static BOOL PmicIoctlConvityRs232OpHandler(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->op == OP_RS232_SET_CFG)
    {
        mask0 = CSP_BITFMASK(MC13783_USB0_CONMODE);
        mask1 = CSP_BITFMASK(MC13783_CHG_USB1_RSTRI) |
                CSP_BITFMASK(MC13783_CHG_USB1_RSPOL);

        data1 = CSP_BITFVAL(MC13783_CHG_USB1_RSTRI,
                            (inParam->PARAMS.RS232_CFG.txTristated == TRUE) ?
                            1: 0);

        if (inParam->PARAMS.RS232_CFG.cfgInternal == RS232_TX_UDATVP_RX_URXVM)
        {
            data0 = CSP_BITFVAL(MC13783_USB0_CONMODE,
                                MC13783_USB0_CONMODE_RS232_2);
        }
        else // DEFAULT or RS232_TX_USE0VM_RX_UDATVP 
        {
            data0 = CSP_BITFVAL(MC13783_USB0_CONMODE,
                                MC13783_USB0_CONMODE_RS232_1);
        }

        if (inParam->PARAMS.RS232_CFG.cfgExternal == RS232_TX_UDP_RX_UDM)
        {
            data1 |= CSP_BITFVAL(MC13783_CHG_USB1_RSPOL,
                                 MC13783_CHG_USB1_RSPOL_TXUDP_RXUDM);
        }
        // else DEFAULT or RS232_TX_UDM_RX_UDP, set to
        // MC13783_CHG_USB1_RSPOL_TXUDM_RXUDP (not set explicitly,
        // as MC13783_CHG_USB1_RSPOL_TXUDM_RXUDP is 0)

        SetRegister(addr0, data0, mask0);
        SetRegister(addr1, data1, mask1);
        *result = PMIC_SUCCESS;

        rc = TRUE;
    }

    return rc;
}

//------------------------------------------------------------------------------
//
// Function: PmicIoctlConvityCea936OpHandler
//
// This function does the config setting in CEA-936 mode for
// connectivity interface.
//
// Parameters:
//      inParam
//          [in] PMIC_PARAM_CONVITY_OP contains op code and specific information
//
//      result
//          [out] PMIC_STATUS
//
// Returns:
//      TRUE if the successful, FALSE otherwise.
//
//------------------------------------------------------------------------------
static BOOL PmicIoctlConvityCea936OpHandler(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->op == OP_CEA936_SET_DETECT)
    {
        mask0 = CSP_BITFMASK(MC13783_USB0_DP150KPU) |
                             CSP_BITFMASK(MC13783_USB0_IDPUCNTRL);
        mask1 = CSP_BITFMASK(MC13783_CHG_USB1_ID100KPU);

        if (inParam->PARAMS.cea936DetectCfg & ACCESSORY_ID_ID100KPU)
        {
            data1 |= CSP_BITFVAL(MC13783_CHG_USB1_ID100KPU, 1);
        }

        if (inParam->PARAMS.cea936DetectCfg & ACCESSORY_ID_IDPUCNTRL)
        {
            data0 |= CSP_BITFVAL(MC13783_USB0_IDPUCNTRL, 1);
        }

        if (inParam->PARAMS.cea936DetectCfg & ACCESSORY_ID_DP150KPU)
        {
            data0 |= CSP_BITFVAL(MC13783_USB0_DP150KPU, 1);
        }

        SetRegister(addr0, data0, mask0);
        SetRegister(addr1, data1, mask1);
        *result = PMIC_SUCCESS;
        rc = TRUE;
    }
    else if (inParam->op == OP_CEA936_EXIT)
    {
        *result = PMIC_SUCCESS;
        rc = TRUE;

        switch (inParam->PARAMS.cea936ExitSignal)
        {
        case CEA936_UID_NO_PULLDOWN:
            mask0 = CSP_BITFMASK(MC13783_USB0_IDPD) |
                    CSP_BITFMASK(MC13783_USB0_IDPULSE);
            break;
        case CEA936_UID_PULLDOWN_6MS:
            mask0 = CSP_BITFMASK(MC13783_USB0_IDPD) |
                    CSP_BITFMASK(MC13783_USB0_IDPULSE);
            data0 = CSP_BITFVAL(MC13783_USB0_IDPULSE, 1);
            break;
        case CEA936_UID_PULLDOWN:
            mask0 = CSP_BITFMASK(MC13783_USB0_IDPD);
            data0 = CSP_BITFVAL(MC13783_USB0_IDPD, 1);
            break;
        case CEA936_UDMPULSE:
            mask0 = CSP_BITFMASK(MC13783_USB0_DMPULSE);
            data0 = CSP_BITFVAL(MC13783_USB0_DMPULSE, 1);
            break;
        default:
            *result = PMIC_ERROR;
            rc = FALSE;
            break;
        }

        SetRegister(addr0, data0, mask0);
    }

    return rc;
}

//------------------------------------------------------------------------------
//
// Function: PmicIoctlConvityUsbSetSpeedHandler
//
// This function does the speed setting in USB mode for
// connectivity interface.
//
// Parameters:
//      inParam
//          [in] PMIC_PARAM_CONVITY_OP contains op code and specific information
//
//      result
//          [out] PMIC_STATUS
//
// Returns:
//      TRUE if the successful, FALSE otherwise.
//
//------------------------------------------------------------------------------
static BOOL PmicIoctlConvityUsbSetSpeedHandler(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.USB_SPEED.usbSpeed == USB_HIGH_SPEED)
    {
        *result = PMIC_NOT_SUPPORTED;
        return rc;
    }

    mask0 = CSP_BITFMASK(MC13783_USB0_FSENB) |
            CSP_BITFMASK(MC13783_USB0_USBPU) |
            CSP_BITFMASK(MC13783_USB0_UDPPD) |
            CSP_BITFMASK(MC13783_USB0_UDMPD) |
            CSP_BITFMASK(MC13783_USB0_USBXCVREN);

    // turn on the transceiver
    data0 = CSP_BITFVAL(MC13783_USB0_USBXCVREN, MC13783_USB0_USBXCVREN_ENABLE);

    if (inParam->PARAMS.USB_SPEED.usbSpeed == USB_LOW_SPEED)
    {
        data0 |= CSP_BITFVAL(MC13783_USB0_FSENB, MC13783_USB0_FSENB_LOW_SPEED);
    }

    if (inParam->PARAMS.USB_SPEED.usbMode == USB_HOST)
    {
        // turn on the VBUS, and 15K pull-down resistors. 
        mask0 |= CSP_BITFMASK(MC13783_CHG_USB1_VBUSEN);
        data0 |= CSP_BITFVAL(MC13783_USB0_UDPPD, MC13783_USB_PDPU_SWITCHED_IN) |
                 CSP_BITFVAL(MC13783_USB0_UDMPD, MC13783_USB_PDPU_SWITCHED_IN) |
                 CSP_BITFVAL(MC13783_CHG_USB1_VBUSEN,
                             MC13783_CHG_USB1_OP_ENABLE);
    }
    else
    {
        // Turn on the 1.5k pull-up. Turn on 15k pull-down on the other
        // data line.
        data0 |= CSP_BITFVAL(MC13783_USB0_USBPU, MC13783_USB_PDPU_SWITCHED_IN);
        if (inParam->PARAMS.USB_SPEED.usbSpeed == USB_FULL_SPEED)
        {
            data0 |= CSP_BITFVAL(MC13783_USB0_UDMPD,
                                 MC13783_USB_PDPU_SWITCHED_IN);
        }
        else
        {
            data0 |= CSP_BITFVAL(MC13783_USB0_UDPPD,
                                 MC13783_USB_PDPU_SWITCHED_IN);
        }
    }

    SetRegister(addr0, data0, mask0);
    SetRegister(addr1, data1, mask1);

    *result = PMIC_SUCCESS;
    rc = TRUE;

    return rc;
}

//------------------------------------------------------------------------------
//
// Function: PmicIoctlConvityUsbSetPowerSourceHandler
//
// This function does the power specific setting in USB mode for
// connectivity interface.
//
// Parameters:
//      inParam
//          [in] PMIC_PARAM_CONVITY_OP contains op code and specific information
//
//      result
//          [out] PMIC_STATUS
//
// Returns:
//      TRUE if the successful, FALSE otherwise.
//
//------------------------------------------------------------------------------
static BOOL PmicIoctlConvityUsbSetPowerSourceHandler(
    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;

    // Turn on the VUSB regulator. set the input source and output voltage
    // as requested.
    mask1 = CSP_BITFMASK(MC13783_CHG_USB1_VUSBIN) |
            CSP_BITFMASK(MC13783_CHG_USB1_VUSB)   |
            CSP_BITFMASK(MC13783_CHG_USB1_VUSBEN);

⌨️ 快捷键说明

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