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

📄 xvc.c

📁 freescale i.mx31 BSP CE5.0全部源码
💻 C
📖 第 1 页 / 共 3 页
字号:
    if (GetDeviceRegistryParams(pszActiveKey, pXVC, dimof(g_deviceRegParams), g_deviceRegParams) != ERROR_SUCCESS) {
        DEBUGMSG(ZONE_ERROR, (L"ERROR: XVC_Init: "L"Failed read registry parameters\r\n"));
        goto clean;
    }

    if (pXVC->IsOTGSupport == 0)
    {
        RETAILMSG(1, (TEXT("OTG Not support and unload the driver\r\n")));
        goto clean;
    }

    // Initialize CriticalSection object for USB PHY Low-power mode
    InitializeCriticalSection(&pXVC->csPhyLowMode);

    // Initialize XVC variables
    pXVC->bUSBCoreClk = TRUE;
    pXVC->bPanicMode = TRUE;

    pXVC->bResume = FALSE;

    RegisterCallback(&pXVC->fnUsbXvr);
    // Map the USB registers
    pa.QuadPart = ((pXVC->memBase == 0)? CSP_BASE_REG_PA_USBOTG: pXVC->memBase);
    len = ((pXVC->memLen == 0)? 0x1000: pXVC->memLen);

    pXVC->pUSBRegs = MmMapIoSpace(pa, len, FALSE);
    if (pXVC->pUSBRegs == NULL) {
        DEBUGMSG(ZONE_ERROR, (L"ERROR: XVC_Init: Controller registers mapping failed\r\n"));
        goto clean;
    }
    
    irq = ((pXVC->dwIrq == 0)? 0x25: pXVC->dwIrq);
#if 1
    pXVC->dwSysIntr = GetSysIntr();
#else
    if (!KernelIoControl(
            IOCTL_HAL_REQUEST_SYSINTR, &(pXVC->dwIrq), sizeof(DWORD),
            &pXVC->dwSysIntr, sizeof(pXVC->dwSysIntr), NULL
        )) goto clean;
#endif


    USBClockCreateFileMapping();
    //RETAILMSG(1, (TEXT("XVC: irq=0x%x, sysIntr=0x%x\r\n"), irq, pXVC->dwSysIntr));
    pXVC->hIntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    if (pXVC->hIntrEvent == NULL) {
        DEBUGMSG(ZONE_FUNCTION, (TEXT("XVC_Init: CreateEvent failed\r\n")));
        goto clean;
    }

#ifdef USBXVR_INTERRUPT
    // to initialize the interrupt 
    if (!(InterruptInitialize(pXVC->dwSysIntr, pXVC->hIntrEvent, NULL, 0))) {
        DEBUGMSG(1, (TEXT("XVC_Init: Interrupt initialization failed!, ErrCode: 0x%x\r\n"), GetLastError()));
        goto clean;
    }
    
    //RETAILMSG(1, (_T("Transceiver driver working in interrupt mode.\n")));
#else
    RETAILMSG(1, (TEXT("XVC_Init: Transceiver driver working in polling mode\r\n")));
#endif

    KernelIoControl(IOCTL_HAL_ENABLE_WAKE, &pXVC->dwSysIntr, sizeof(pXVC->dwSysIntr), NULL, 0, NULL);

    //RETAILMSG(1, (TEXT("Wakeup enable for transceiver\r\n")));

    DEBUGMSG(ZONE_FUNCTION, (TEXT("XVC_Init: Interrupt initialized\r\n")));
    hInterruptServiceThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)XVC_ISTMain, NULL, 0, NULL);

    if (hInterruptServiceThread == NULL) {
        DEBUGMSG(ZONE_FUNCTION, (TEXT("XVC_Init: Failed to create Interrupt Service Thread\r\n")));
        goto clean;
    }
    
    CeSetThreadPriority(hInterruptServiceThread, 102);
    //RETAILMSG(1,(TEXT("-XVC_Init: \r\n")));
    return (DWORD)pXVC;

clean:
    if (pXVC && pXVC->pUSBRegs)
        MmUnmapIoSpace((VOID*)pXVC->pUSBRegs, 0x1000);

    if (pXVC)
        LocalFree(pXVC);

    return (DWORD)NULL;
}

/*
 *      Function: XVC_Deinit
 *
 *      The Device Manager calls this function as a result of a call to the
 *      DeactivateDevice() function.  This function will return any resources
 *      allocated while using this driver.
 *
 *      Parameters:
 *           dwContext [in]
 *
 *      Returns:
 *           TRUE
 */

BOOL XVC_Deinit(DWORD dwContext)
{
    DEBUGMSG(ZONE_FUNCTION, (TEXT("+XVC_Deinit: dwContext = 0x%x\r\n"), dwContext));
    if (pXVC && pXVC->pUSBRegs)
        MmUnmapIoSpace((VOID*)pXVC->pUSBRegs, 0x1000);

    USBClockDeleteFileMapping();
    if (pXVC)
        LocalFree(pXVC);

    DEBUGMSG(ZONE_FUNCTION, (TEXT("-XVC_Deinit\r\n"), dwContext));
    return TRUE;
}

/*
 *      Function: XVC_Open
 *
 *      Called when an application attempts to establish a connection to this driver.
 *      This function will verify that a trusted application has made the request and
 *      deny access to all non-trusted applications.
 *
 *      Parameters:
 *            dwData [in]
 *            dwAccess [in]
 *            dwShareMode [in]
 *
 *      Returns:
 *            dwData
 */

DWORD XVC_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode)
{
    DEBUGMSG(ZONE_FUNCTION, (TEXT("+XVC_Open: dwData = 0x%x, dwAccess = 0x%x, dwShareMode = 0x%x\r\n"), dwData, dwAccess, dwShareMode));
    DEBUGMSG(ZONE_FUNCTION, (TEXT("-XVC_Open\r\n")));
    return dwData;
}

/*
 *       Function: XVC_Close
 *
 *       Called when an application attempts to close a connection to this driver.
 *
 *       Parameters:
 *             Handle [in]
 *
 *       Returns:
 *             TRUE
 */

BOOL XVC_Close(DWORD Handle)
{
    DEBUGMSG(ZONE_FUNCTION, (TEXT("+XVC_Close: Handle = 0x%x\r\n"), Handle));
    DEBUGMSG(ZONE_FUNCTION, (TEXT("-XVC_Close: Handle = 0x%x\r\n"), Handle));
    return TRUE;
}

/*
 *     Function: XVC_PowerDown
 *
 *     This function suspends power to the device. It is useful only with devices
 *     that can power down under software control.
 *
 *     Parameters:
 *          void
 *     Returns:
 *          void
 */

void XVC_PowerDown(void)
{
    CSP_USB_REGS *pUSBRegs = pXVC->pUSBRegs;

    DEBUGMSG(ZONE_FUNCTION, (TEXT("+XVC_PowerDown \r\n")));    
    if (pXVC->bInXVC) {
        // Lock Start
        EnterCriticalSection(&pXVC->csPhyLowMode);
        if (pXVC->fnUsbXvr.pfnUSBPowerDown)
            pXVC->fnUsbXvr.pfnUSBPowerDown(pUSBRegs, &pXVC->bUSBCoreClk, &pXVC->bPanicMode);
        LeaveCriticalSection(&pXVC->csPhyLowMode);
    }
    DEBUGMSG(ZONE_FUNCTION, (TEXT("-XVC_PowerDown \r\n")));
    return;

}

/*
 *
 *   Function: XVC_PowerUp
 *
 *   This function restores power to a device.
 *
 *   Parameters:
 *        void
 *   Returns:
 *       void
 */

void XVC_PowerUp(void)
{
    CSP_USB_REGS *pUSBRegs = pXVC->pUSBRegs;
    DEBUGMSG(ZONE_FUNCTION, (TEXT("+XVC_PowerUP \r\n")));
    DEBUGMSG(ZONE_FUNCTION, (TEXT("-XVC_PowerUp \r\n")));   
    if (pXVC->bInXVC) {
        EnterCriticalSection(&pXVC->csPhyLowMode);
        if (pXVC->fnUsbXvr.pfnUSBPowerUp)
            pXVC->fnUsbXvr.pfnUSBPowerUp(pUSBRegs, &pXVC->bUSBCoreClk, &pXVC->bPanicMode);
        LeaveCriticalSection(&pXVC->csPhyLowMode);

        pXVC->bResume = TRUE;
        SetInterruptEvent(pXVC->dwSysIntr);    
    }
    //RETAILMSG(1, (TEXT("-XVC_PowerUp \r\n")));

}

/*
 *   Function: XVC_Read
 *
 *   This function reads data from the device identified by the open context.
 *
 *   Parameters:
 *        Handle [in]
 *        pBuffer [out]
 *        dwNumBytes [in]
 *   Returns:
 *        Zero
 *
 */

DWORD XVC_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
{
    DEBUGMSG(ZONE_FUNCTION, (TEXT("XVC_Read: Handle = 0x%x, pBuffer = 0x%x, dwNumBytes = 0x%x\r\n"), Handle, pBuffer, dwNumBytes));
    return 0;
}

/*
 *    Function: XVC_Write
 *
 *    This function writes data to the device.
 *
 *    Parameters:
 *         Handle [in]
 *         pBuffer [out]
 *         dwNumBytes [in]
 *
 *    Returns:
 *         zero
 */

DWORD XVC_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)
{
    DEBUGMSG(ZONE_FUNCTION, (TEXT("XVC_Write: Handle = 0x%x, pBuffer = 0x%x, dwNumBytes = 0x%x\r\n"), Handle, pBuffer, dwNumBytes));
    return 0;
}

/*
 *    Function: XVC_Seek
 *
 *    This function moves the data pointer in the device.
 *
 *    Parameters:
 *         Handle [in]
 *         lDistance
 *         dwMoveMethod
 *
 *    Returns:
 *        -1
 */

DWORD XVC_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)
{
    DEBUGMSG(ZONE_FUNCTION, (TEXT("XVC_Seek: Handle = 0x%x, lDistance = 0x%x, dwMoveMethod = 0x%x\r\n"), Handle, lDistance, dwMoveMethod));
    return (DWORD) -1;
}

/*
 *      Function: XVC_IOControl
 *
 *      Called when an application calls the DeviceIoControl() function.  This
 *      function operates differently based upon the IOCTL that is passed to it.
 *
 *      Parameters:
 *           Handle [in]
 *
 *           dwIoControlCode [in] The IOCTL requested.
 *
 *          pInBuf [in] Input buffer.
 *
 *          nInBufSize [in] Length of the input buffer.
 *
 *           pOutBuf [out] Output buffer.
 *
 *           nOutBufSize [in] The length of the output buffer.
 *
 *           pBytesReturned [out] Size of output buffer returned to application.
 *
 *      Returns:
 *           TRUE if the IOCTL is handled. FALSE if the IOCTL was not recognized or
 *           an error occurred while processing the IOCTL
 */

BOOL XVC_IOControl(
                   VOID *pXVCContext, IOCTL_SOURCE source, DWORD code, UCHAR *pInBuffer,
                   DWORD inSize, UCHAR *pOutBuffer, DWORD outSize, DWORD *pOutSize
                   )

{
    CE_BUS_POWER_STATE *pBusPowerState;    
    DEBUGMSG(ZONE_FUNCTION, (TEXT("+XVC_IOControl: dwIoControlCode = 0x%x\r\n"), code));
    //RETAILMSG(1, (TEXT("+XVC_IOControl: dwIoControlCode = 0x%x\r\n"), code));
    switch (code)
    {
        case IOCTL_BUS_GET_POWER_STATE:         
            if (source != MDD_IOCTL)
            {
                RETAILMSG(1, (TEXT("IOCTL_BUS_GET_POWER_STATE not MDD_IOCTL\r\n")));
                break;
            }

            RETAILMSG(1, (TEXT("IOCTL_BUS_GET_POWER_STATE\r\n")));
            pBusPowerState = (CE_BUS_POWER_STATE*)pInBuffer;
            *pBusPowerState->lpceDevicePowerState = pXVC->CurPMPowerState;
            break;

        case IOCTL_BUS_SET_POWER_STATE:
            if (source == MDD_IOCTL)
            {
                RETAILMSG(1, (TEXT("IOCTL_BUS_SET_POWER_STATE MDD_IOCTL\r\n")));
                break;
            }
            RETAILMSG(1, (TEXT("IOCTL_BUS_SET_POWER_STATE\r\n")));
            pBusPowerState = (CE_BUS_POWER_STATE*)pInBuffer;
            pXVC->CurPMPowerState = *pBusPowerState->lpceDevicePowerState;

        default:
            break;
    }
    return TRUE;
}

/* EOF*/

⌨️ 快捷键说明

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