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

📄 usbohci.c

📁 风河的vxworks-6.3 FOR amcc440epx BSP!
💻 C
📖 第 1 页 / 共 4 页
字号:
     * d) Initialize the OHCI Host Controller
     */

    for (uIndex = 0; uIndex < maxOhciCount; uIndex++)
        {
        /* To hold the pointer to the default pipe */
        PUSB_OHCI_ENDPOINT_DESCRIPTOR pDefaultEndpointDescriptor = NULL;

        /* Call the function to initialize the OHCI Controller */
        bStatus = usbOhciInitializeHostController(uIndex);

        /* Check whether the host controller was initialized successfully */
        if (!bStatus)
            {
            /*
             * Call the function to clean up the resources allocated for
             * the host controller.
             */
            usbOhciExit();

			/* WindView Instrumentation */
			USB_HCD_LOG_EVENT(
				USB_OHCI_WV_INIT_EXIT,
				"usbOhciInit() exits - Controller initialisation failed",
				USB_OHCD_WV_FILTER);

            /* Return without proceeding */
            return FALSE;
            }

        /* Obtain the pointer to the default pipe */
        pDefaultEndpointDescriptor =
            usbOhciControllerInfo[uIndex].pDefaultEndpointDescriptor;

        /* Call the function to register the bus with USBD */
        uUsbStatus = usbHstBusRegister(hHostControllerDriver,
                                        USBHST_FULL_SPEED,
                                        (UINT32)pDefaultEndpointDescriptor);


        /* Check whether the bus was registered successfully */
        if (uUsbStatus != USBHST_SUCCESS)
            {
            /*
             * Call the function to clean up the resources allocated for
             * the host controller.
             */
            usbOhciExit();

            /* Debug message */
            OS_LOG_MESSAGE_HIGH(
                OHCD,
                "Failed to register the bus for OHCI host controller.\n",
                0,
                0,
                0,
                0);

			/* WindView Instrumentation */
			USB_HCD_LOG_EVENT(
				USB_OHCI_WV_INIT_EXIT, 
				"usbOhciInit() exits - Bus registration failed",
				USB_OHCD_WV_FILTER);

            /* Return without proceeding */
            return FALSE;
            }

        }

    /* Set the flag to specify that the OHCI Controllers are initialized */
    bInitialized = TRUE;

	/* WindView Instrumentation */
	USB_HCD_LOG_EVENT(
		USB_OHCI_WV_INIT_EXIT, 
		"usbOhciInit() exits successfully",
		USB_OHCD_WV_FILTER);

	/* Debug print */
	
    OS_LOG_MESSAGE_LOW(
        OHCD,
        "Exiting the  function: usbOhciInit().\n", 
        0, 
        0, 
        0, 
        0);


    return TRUE;

    } /* End of function usbOhciInit() */
/***************************************************************************
*
* usbOhciExit - uninitialise the USB OHCI Host Controller Driver.
*
* This function uninitialises the OHCI Host Controller Driver.
*
* RETURNS: FALSE, TRUE if all the OHCI Host Controllers are reset and the
* cleanup is successful.
*
* ERRNO:
*   None.
*/

BOOLEAN usbOhciExit (void)
    {
    /*
     * To hold the index into the OHCI_INFORMATION array corresponding to the
     * number of OHCI Controllers found on the system.
     */
    UINT32          	    uOhciControllerIndex = 0;

    /* To hold the status of deregistering the OHCI host controller driver */
    USBHST_STATUS           uUsbStatus = USBHST_SUCCESS;

    /* Flag to indicate whether there are any active host controllers */
    BOOLEAN                 bActiveHostControllers = FALSE;

    /* To hold the pointer to the host controller information */
    PUSB_OHCI_INFORMATION   pOhciControllerInfo = NULL;

    /* To hold the status of the host controller */
    UINT32                  uOhciControllerState = 0;

    OS_LOG_MESSAGE_LOW(
        OHCD,
        "Entering the  function: usbOhciExit().\n", 
        0, 
        0, 
        0, 
        0);

    /* 
     * Check whether the OHCI hardware in intialized. If not the host controller
     * is not attached
     * return FALSE
     */

    if (usbOhciControllerInfo == NULL)
    	{
	/* WindView Instrumentation */

	USB_HCD_LOG_EVENT(
	USB_OHCI_WV_INIT_EXIT,
	"usbOhciInit() exits : ERROR - invalid global variables",
        USB_OHCD_WV_FILTER);

        return FALSE;
    	}

    /*
     * Stop all the host controllers and release the resources allocated
     * for them.
     */
    for (uOhciControllerIndex = 0;
         uOhciControllerIndex < maxOhciCount;
         uOhciControllerIndex++)
    	{
        /* Obtain the pointer to the host controller information */
        pOhciControllerInfo = &usbOhciControllerInfo[uOhciControllerIndex];

        /* Check whether the host controller is initialized */
        if (TRUE == pOhciControllerInfo->bHostControllerInitialized)
            {
            /* Call the function to deregister the bus */
            uUsbStatus = 
                usbHstBusDeregister (
                    hHostControllerDriver, 
                    uOhciControllerIndex,
                    (UINT32)pOhciControllerInfo->pDefaultEndpointDescriptor);
    
            /* Check whether the bus was deregistered successfully */
            if (uUsbStatus != USBHST_SUCCESS)
                {
                /* Debug message */
                OS_LOG_MESSAGE_HIGH (
                    OHCD,
                    "Failed to deregister the bus for OHCI host controller.\n",
                    0,
                    0,
                    0,
                    0);
    
                /* 
                 * NOTE: If the deregisteration of the bus fails, it is likely 
                 *       that there are active devices on the bus. Hence, stop
                 *       the cleanup operations for the bus.
                 */
    
                /* Set the flag to indicate there are active host controllers */
                bActiveHostControllers = TRUE;
    
                /* 
                 * Do not cleanup the current host controller and move to the 
                 * next host controllers.
                 */
                continue;
                }
            }
        else
            {
            /* 
             * Since this OHCI host controller is not registered, move to the
             * host controller in the list.
             */
            continue;
            }
    
        /*
         * Check whether the default pipe is valid.
         *
         * NOTE: The default pipe should be deleted before the ISR is
         *       unregistered (OR) the polling mode ISR task is destroyed.
         *
         *       This is bacause the OHCI_DeletePipe() function synchronizes
         *       with the host controller before deleting the pipe. In order
         *       to synchronize the OHCI_DeletePipe() function depends on SOF
         *       interrupt. 
         *
         *       Hence, the default pipe should be deleted when the host 
         *       controller is in operational state.
         */
        if (pOhciControllerInfo->pDefaultEndpointDescriptor != NULL)
        	{
            /* Call the function to delete the default pipe */
            usbOhciDeletePipe (
                uOhciControllerIndex, 
                (UINT32) pOhciControllerInfo->pDefaultEndpointDescriptor);

            /* Reset the pointer to the default pipe */
            pOhciControllerInfo->pDefaultEndpointDescriptor = NULL;
        	}
        
#ifndef USB_OHCI_POLLING_MODE
        /* Disable the interrupts */
        USB_OHCI_REG_WRITE (uOhciControllerIndex, 
            (pOhciControllerInfo->uBaseAddress + 
                USB_OHCI_INTERRUPT_DISABLE_REGISTER_OFFSET),
		    USB_OHCI_INTERRUPT_MASK);
#endif /* USB_OHCI_POLLING_MODE */

        /* Reset the OHCI Controller */
        USB_OHCI_REG_WRITE (uOhciControllerIndex, 
            (pOhciControllerInfo->uBaseAddress + 
                USB_OHCI_COMMAND_STATUS_REGISTER_OFFSET),
			USB_OHCI_COMMAND_STATUS_HCR);

        /*
         * Wait for the reset operation to complete. The reset operation should
         * be completed in 1 micro second. However, a delay of 1 milli second
         * is provided.
         *
         * NOTE: This extra delay will not create any performance issues.
         *       Since the host controller is being disabled, this delay is
         *       acceptable.
         */
        OS_DELAY_MS (USB_OHCI_WAIT_FOR_HOST_CONTROLLER_RESET_COMPLETION);

        /* Check the status of the OHCI Controller */
        uOhciControllerState =
            USB_OHCI_REG_READ (uOhciControllerIndex, 
                               (pOhciControllerInfo->uBaseAddress + 
                               USB_OHCI_CONTROL_REGISTER_OFFSET));

        /* Check whether the OHCI Controller is in SUSPEND state */
        if ((uOhciControllerState & USB_OHCI_CONTROL_HCFS_USB_SUSPEND) != 
			USB_OHCI_CONTROL_HCFS_USB_SUSPEND)
        	{
			/* WindView Instrumentation */
			USB_HCD_LOG_EVENT(
				USB_OHCI_WV_INIT_EXIT, 
				"usbOhciExit() exits - Controller reset failed",
				USB_OHCD_WV_FILTER);

            /* 
             * NOTE: There is no error recovery mechanism. Hence the error 
             *       is ignored. 
             */
        	}

#ifndef USB_OHCI_POLLING_MODE

        /* 
         * Unregister the interrupt handler for the OHCI Controller.
         *
         * NOTE: Check whether ISR is valid. If valid,deregister the ISR.
         */
        if (pOhciBusInfo[uOhciControllerIndex]->pFuncIntDisconnect != NULL)
            pOhciBusInfo[uOhciControllerIndex]->pFuncIntDisconnect
                                     (usbOhciIsr,
                                      uOhciControllerIndex,
                                      pOhciControllerInfo->uIrqNumber);

#endif /* End of #ifndef USB_OHCI_POLLING_MODE */

        /* Check whether the OHCI interrupt handler thread is valid */
        if (pOhciControllerInfo->isrThreadId != OS_THREAD_FAILURE)
            {
            /* Delete the OHCI interrupt handler thread */
            OS_DESTROY_THREAD (pOhciControllerInfo->isrThreadId);

            /* Reset the OHCI interrupt handler thread ID */
            pOhciControllerInfo->isrThreadId = OS_THREAD_FAILURE;
            }

#ifndef USB_OHCI_POLLING_MODE
        /* Check whether the ISR event was created successfully */
        if (OS_INVALID_EVENT_ID != pOhciControllerInfo->isrEvent)
            {
            /* Call the function to delete the ISR event */
            OS_DESTROY_EVENT (pOhciControllerInfo->isrEvent);

            /* Reset the ISR event pointer */
            pOhciControllerInfo->isrEvent = OS_INVALID_EVENT_ID;
            }
#endif /* End of #ifndef USB_OHCI_POLLING_MODE */
        
        /* Check whether the endpoint list access event is valid */
        if (pOhciControllerInfo->endpointListAccessEvent != OS_INVALID_EVENT_ID)
        	{
            /* Call the function to delete the endpoint list access event */
            OS_DESTROY_EVENT (pOhciControllerInfo->endpointListAccessEvent);

            /* Reset the endpoint list access event pointer */
            pOhciControllerInfo->endpointListAccessEvent = OS_INVALID_EVENT_ID;
        	}

        /* 
         * Check whether the pointer to the host controller communication 
         * area is valid.
         */
        if (pOhciControllerInfo->pHcca != NULL)
        	{
            /* 
             * Release the memory allocated for the host controller  
             * communication area 
             */
            OHCI_FREE (pOhciControllerInfo->pHcca);  

            /* Reset the HCCA pointer */
            pOhciControllerInfo->pHcca = NULL;
        	}
        
        /* Reset the flag to indicate the host controller is not initialized */
        pOhciControllerInfo->bHostControllerInitialized = FALSE;

    	} /* End of for (uOhciControllerIndex = 0; ... ) */

    /* 
     * Check whether there are any active host controllers. If true, do not
     * deregister the HCD and return from the function.
     */
    if (bActiveHostControllers)
        {
        /* Return from the function without deregistering the HCD */
        return FALSE;
        }

    /* free the usbOhciControllerInfo */
    OS_FREE (usbOhciControllerInfo) ;
    usbOhciControllerInfo = NULL;

    /* Call the function to deregister the OHCI host controller driver */
    uUsbStatus = usbHstHCDDeregister (hHostControllerDriver);

    /* 
     * Check whether the OHCI host controller driver was deregistered 
     * successfully 
     */
    if (uUsbStatus != USBHST_SUCCESS)
    	{
        /* Debug message */
        OS_LOG_MESSAGE_HIGH (
            OHCD,
            "Failed to deregister OHCI host controller driver.\n",
            0,
            0,
            0,
            0);

        /* 
         * NOTE: There is no error recovery mechanism. Hence the error is 
         *       ignored. 
         */
    	}

    /* Set the flag to specify that the OHCI Controllers are not initialized */
    bInitialized = FALSE;


	/* WindView Instrumentation */
	USB_HCD_LOG_EVENT(
		USB_OHCI_WV_INIT_EXIT, 
		"usbOhciExit() exits successfully",
		USB_OHCD_WV_FILTER);

	OS_LOG_MESSAGE_LOW(
        OHCD,
        "Exiting the  function: usbOhciExit().\n", 
        0, 
        0, 
        0, 
        0);

    return TRUE;

	} /* End of function usbOhciExit () */


/******************* MODULE SPECIFIC FUNCTIONS DEFINITION *********************/

/***************************************************************************
*
* usbOhciInitializeHostController - initialise the USB OHCI Host Controller
*
* This function initialises the OHCI Host Controller. It
*	a) Identifies the PCI IRQ Number
*	b) Identifies the Base Address of USB Registers
*	c) Reset the OHCI Host Controller
*	d) Initialize the OHCI Host Controller
*
* RETURNS: FALSE,TRUE if the USB OHCI Host Controller is initialized successfully,

⌨️ 快捷键说明

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