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

📄 usbehcdrhemulation.c

📁 usb2 driver for vxwokrs
💻 C
📖 第 1 页 / 共 5 页
字号:
/* usbEhcdRhEmulation.c - USB EHCI HCD Roothub Emulation *//* Copyright 2004-2005 Wind River Systems, Inc.   This software includes software licensed to Wind River Systems, Inc.   by Wipro, Ltd. Wind River licensees may use this software according   to the terms of their Wind River license agreement(s) applicable to   this software.*//*Modification history--------------------01k,21sep05,dtr  Remove extra reset after fix for SPR111361.01j,13sep05,dtr  Fix for SPR 111361.01i,28mar05,pdg  non-PCI changes01h,04feb05,pdg  Fix for SPR #104950(USB STACK 2.1 FROM PID 2.1 ISN'T                 CORRECTLY SUPPORTING INTEL 82801DB/DBM EHCI HOST CONTROLLER)01g,03dec04,ami  Merged IP Changes01f,26oct04,ami  Severity Changes for Debug Messages01e,15oct04,ami  Apigen Changes01d,23Jul03,Incorporated the changes after testing on MIPS.01c,12Jul03,gpd updated status to USBHST_SUCCESS in setconfig request.01b,26jun03,psp changing the code to WRS standards.01a,25apr03,ram written.*//*DESCRIPTIONThis contains functions which handle the requests to the Root hubINCLUDE FILES:  usb2/usbOsal.h usb2/usbHst.h usb2/usbEhcdDataStructures.h                usb2/usbEhcdRhEmulation.h usb2/usbEhcdHal.h usb2/usbEhcdUtil.h                usb2/usbHcdInstr.h*//*INTERNAL ******************************************************************************* * Filename         : usbEhcdRhEmulate.c * * Copyright        : * * THE COPYRIGHT IN THE CONTENTS OF THIS SOFTWARE VEST WITH WIPRO * LIMITED A COMPANY INCORPORATED UNDER THE LAWS OF INDIA AND HAVING * ITS REGISTERED OFFICE AT DODDAKANNELLI SARJAPUR ROAD  BANGALORE * 560 035. DISTRIBUTION OR COPYING OF THIS SOFTWARE BY * ANY INDIVIDUAL OR ENTITY OTHER THAN THE ADDRESSEE IS STRICTLY * PROHIBITED AND MAY INCUR LEGAL LIABILITY. IF YOU ARE NOT THE * ADDRESSEE PLEASE NOTIFY US IMMEDIATELY BY PHONE OR BY RETURN EMAIL. * THE ADDRESSEE IS ADVISED TO MAINTAIN THE PROPRIETARY INTERESTS OF * THIS COPYRIGHT AS PER APPLICABLE LAWS. * * * Description      :  This contains functions which handle the requests to *                     the Root hub. * * ******************************************************************************/#include "usb2/usbOsal.h"#include "usb2/usbHst.h"#include "usb2/usbEhcdDataStructures.h"#include "usb2/usbEhcdRhEmulation.h"#include "usb2/usbEhcdHal.h"#include "usb2/usbEhcdUtil.h"#include "usb2/usbHcdInstr.h"/* globals *//* Device Descriptor value for the Root hub */UCHAR gRHDeviceDescriptor[] = {                                 0x12,        /* bLength */                                 0x01,        /* Device Descriptor type */                                 0x00, 0x02,  /* bcdUSB - USB 2.0 */                                 0x09,        /* Hub DeviceClass */                                 0x00,        /* bDeviceSubClass */                                 0x01,        /* bDeviceProtocol High Speed single TT support*/                                 0x40,        /* Max packet size is 64 */                                 0x00, 0x00,  /* idVendor */                                 0x00, 0x00,  /* idProduct */                                 0x00, 0x00,  /* bcdDevice */                                 0x00,        /* iManufacturer */                                 0x00,        /* iProduct */                                 0x00,        /* iSerialNumber */                                 0x01         /* 1 configuration */                                };/* * Descriptor structure returned on a request for * Configuration descriptor for the Root hub. * This includes the Configuration descriptor, interface descriptor and * the endpoint descriptor */UCHAR gRHConfigDescriptor[] = {                                /* Configuration descriptor */                                0x09,        /* bLength */                                0x02,        /*                                              * Configuration descriptor                                              * type                                              */                                0x19, 0x00,  /* wTotalLength */                                0x01,        /* 1 interface */                                0x01,		 /* bConfigurationValue */                                0x00,        /* iConfiguration */                                0xE0,        /* bmAttributes */                                0x00,        /* bMaxPower */                                /* Interface Descriptor */                                0x09,        /* bLength */                                0x04,        /*                                              * Interface Descriptor                                              * type                                              */                                0x00,        /* bInterfaceNumber */                                0x00,        /* bAlternateSetting */                                0x01,        /* bNumEndpoints */                                0x09,        /* bInterfaceClass */                                0x00,        /* bInterfaceSubClass */                                0x00,        /* bInterfaceProtocol */                                0x00,        /* iInterface */                                /* Endpoint Descriptor */                                0x07,        /* bLength */                                0x05,        /*                                              * Endpoint Descriptor                                              * Type                                              */                                0x81,         /* bEndpointAddress */                                0x03,         /* bmAttributes */                                0x08,   0x00, /* wMaxPacketSize */                                0x0C          /* bInterval - 255 ms*/                              };/* Function to process a control transfer request */USBHST_STATUSusbEhcdRhProcessControlRequest(pUSB_EHCD_DATA pHCDData,        	           	     pUSBHST_URB	pURB);/* Function to process an interrupt transfer request */USBHST_STATUSusbEhcdRhProcessInterruptRequest(pUSB_EHCD_DATA pHCDData,        	           	       pUSBHST_URB	pURB);/* Function to process a standard request */USBHST_STATUSusbEhcdRhProcessStandardRequest(pUSB_EHCD_DATA pHCDData,        	           	      pUSBHST_URB	pURB);/* Function to process a class specific request */USBHST_STATUSusbEhcdRhProcessClassSpecificRequest(pUSB_EHCD_DATA pHCDData,        	           	           pUSBHST_URB	pURB);USBHST_STATUS usbEhcdRhClearPortFeature(pUSB_EHCD_DATA   pHCDData,                                             pUSBHST_URB	 pURB);USBHST_STATUS usbEhcdRhGetHubDescriptor(pUSB_EHCD_DATA   pHCDData,                                            pUSBHST_URB	 pURB);USBHST_STATUS usbEhcdRhGetPortStatus(pUSB_EHCD_DATA   pHCDData,                                         pUSBHST_URB  pURB);USBHST_STATUS usbEhcdRhSetPortFeature(pUSB_EHCD_DATA   pHCDData,                                          pUSBHST_URB  pURB);/***************************************************************************** usbEhcdRhCreatePipe - creates a pipe specific to an endpoint.** This routine creates a pipe specific to an endpoint.** RETURNS: USBHST_SUCCESS - if the pipe was created successfully.*  USBHST_INVALID_PARAMETER if the parameters are not valid.*  USBHST_INSUFFICIENT_MEMORY if the memory allocation for the pipe failed.** ERRNO:*   None.*/USBHST_STATUS usbEhcdRhCreatePipe    (    pUSB_EHCD_DATA pHCDData,           /* Ptr to HCD block           */    UINT8   uDeviceAddress,            /* Device Address             */    UINT8   uDeviceSpeed,              /* Device Speed               */    UCHAR  *pEndpointDescriptor,       /* Ptr to EndPoint Descriptor */    UINT32 *puPipeHandle               /* Ptr to pipe handle         */    )    {    /* To hold the status of the function call */    USBHST_STATUS Status = USBHST_FAILURE;    /* Pointer to the Endpoint Descriptor */    pUSBHST_ENDPOINT_DESCRIPTOR pEndpointDesc = NULL;    OS_LOG_MESSAGE_LOW(EHCD,"usbEhcdRhCreatePipe - Entry\n",0,0,0,0);    /* Check the validity of the parameters */    if ((NULL == pHCDData) ||        (USB_EHCD_MAX_DEVICE_ADDRESS < uDeviceAddress) ||        (NULL == pEndpointDescriptor) ||        (NULL == puPipeHandle) ||        (USBHST_HIGH_SPEED != uDeviceSpeed))        {        OS_LOG_MESSAGE_HIGH(EHCD,"usbEhcdRhCreatePipe - parameters are not valid\n",0,0,0,0);        return USBHST_INVALID_PARAMETER;        }    /* Extract the endpoint descriptor */    pEndpointDesc = (pUSBHST_ENDPOINT_DESCRIPTOR)pEndpointDescriptor;    /* Switch based on the endpoint type */    switch(pEndpointDesc->bmAttributes & USB_EHCD_ENDPOINT_TYPE_MASK)        {    	case USBHST_CONTROL_TRANSFER:/* Control endpoint */    	    {    	    /* If the endpoint number is not 0, it is an error */    	    if (0 != (pEndpointDesc->bEndpointAddress &                USB_EHCD_ENDPOINT_NUMBER_MASK))                {                return USBHST_INVALID_REQUEST;                }            else                {                /* Allocate memory for the control endpoint */                pHCDData->RHData.pControlPipe =                                (pUSB_EHCD_PIPE)OS_MALLOC(sizeof(USB_EHCD_PIPE));                /* Check if memory allocation is successful */                if (NULL == pHCDData->RHData.pControlPipe)                    {                    OS_LOG_MESSAGE_HIGH(EHCD,"usbEhcdRhCreatePipe - Memory not\                                         allocated for control pipe\n",0,0,0,0);                    return USBHST_INSUFFICIENT_MEMORY;                    }                /* Initialize the memory allocated */                USB_EHCD_PIPE_INITIALIZE(pHCDData->RHData.pControlPipe);                /* Populate the fields of the control pipe - Start */                /* Copy the endpoint address */                pHCDData->RHData.pControlPipe->uEndpointAddress =                                            pEndpointDesc->bEndpointAddress;                /* Copy the address */                pHCDData->RHData.pControlPipe->uAddress = uDeviceAddress;                /* Update the speed */                pHCDData->RHData.pControlPipe->uSpeed = USBHST_HIGH_SPEED;                /* Update the endpoint type */                pHCDData->RHData.pControlPipe->uEndpointType =                                                USBHST_CONTROL_TRANSFER;                /* Populate the fields of the control pipe - End */                /* Update the pipe handle information */                *(puPipeHandle) = (UINT32)pHCDData->RHData.pControlPipe;                Status = USBHST_SUCCESS;                }    		break;    	    }    	case USBHST_INTERRUPT_TRANSFER:/* Interrupt endpoint */    	    {            /* Allocate memory for the interrupt endpoint */            pHCDData->RHData.pInterruptPipe =                            (pUSB_EHCD_PIPE)OS_MALLOC(sizeof(USB_EHCD_PIPE));            /* Check if memory allocation is successful */            if (NULL == pHCDData->RHData.pInterruptPipe)                {                OS_LOG_MESSAGE_HIGH(EHCD,"usbEhcdRhCreatePipe - Memory not\                                     allocated for interrupt pipe\n",0,0,0,0);                return USBHST_INSUFFICIENT_MEMORY;                }            /* Initialize the memory allocated */            USB_EHCD_PIPE_INITIALIZE(pHCDData->RHData.pInterruptPipe);            /* Populate the fields of the interrupt pipe - Start */            /* Copy the endpoint address */            pHCDData->RHData.pInterruptPipe->uEndpointAddress =                                        pEndpointDesc->bEndpointAddress;            /* Copy the address */            pHCDData->RHData.pInterruptPipe->uAddress = uDeviceAddress;            /* Update the speed */            pHCDData->RHData.pInterruptPipe->uSpeed = USBHST_HIGH_SPEED;            /* Update the endpoint type */            pHCDData->RHData.pInterruptPipe->uEndpointType =                                            USBHST_INTERRUPT_TRANSFER;            /* Populate the fields of the interrupt pipe - End */            /* Update the pipe handle information */            *(puPipeHandle) = (UINT32)pHCDData->RHData.pInterruptPipe;    		Status = USBHST_SUCCESS;    		break;    	    }    	default:    	    {    	    Status = USBHST_INVALID_REQUEST;    	    }    }    /* End of switch */    OS_LOG_MESSAGE_LOW(EHCD,"usbEhcdRhCreatePipe - Exit\n",0,0,0,0);    return Status;    }    /* End of function usbEhcdRhCreatePipe() *//***************************************************************************** usbEhcdRHDeletePipe - deltes a pipe specific to an endpoint.** This routine deletes a pipe specific to an endpoint.** RETURNS: USBHST_SUCCESS if the pipe was deleted successfully.*  USBHST_INVALID_PARAMETER if the parameters are not valid.** ERRNO:*   None.*/USBHST_STATUS usbEhcdRHDeletePipe    (    pUSB_EHCD_DATA pHCDData,           /* Ptr to HCD block             */    UINT32         uPipeHandle         /* Pipe Handle Identifier       */    )    {    /* To hold the pointer to the pipe */    pUSB_EHCD_PIPE  pHCDPipe = NULL;    OS_LOG_MESSAGE_LOW(EHCD,"usbEhcdRHDeletePipe - Entry\n",0,0,0,0);    /* Check the validity of the parameters */    if ((NULL == pHCDData) ||        (0 == uPipeHandle))        {        OS_LOG_MESSAGE_HIGH(EHCD,"usbEhcdRHDeletePipe - Parameters not valid\n",0,0,0,0);        return USBHST_INVALID_PARAMETER;        }    /* Extract the USB_EHCD_PIPE pointer */    pHCDPipe = (pUSB_EHCD_PIPE)uPipeHandle;    /* Check if it is a control pipe delete request */    if (pHCDPipe == pHCDData->RHData.pControlPipe)        {        OS_FREE(pHCDData->RHData.pControlPipe);        pHCDData->RHData.pControlPipe = NULL;        }    /* Check if it is an interrupt pipe delete request */    else if (pHCDPipe == pHCDData->RHData.pInterruptPipe)        {        /* Pointer to the request information */        pUSB_EHCD_REQUEST_INFO pRequestInfo = NULL;        /* Pointer to the temporary request information */        pUSB_EHCD_REQUEST_INFO pTempRequestInfo = NULL;        /* Exclusively access the list */        OS_WAIT_FOR_EVENT(pHCDData->RequestSynchEventID, OS_WAIT_INFINITE);        /* Set the flag indicating that the pipe is deleted */        pHCDPipe->PipeDeletedFlag = TRUE;

⌨️ 快捷键说明

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