📄 usbtargdevicecontrol.c
字号:
* \is* \i S_usbTargLib_TCD_FAULT* Fault occured in TCD * * \i S_usbTargLib_APP_FAULT* Application specific fault occured.* \ie** \NOMANUAL*/LOCAL STATUS usbTargHandleResetEvent ( pTARG_TCD pTargTcd, /* pointer to TARG_TCD structure */ UINT32 speed /* speed of the device */ ) { STATUS status = OK; USB_ENDPOINT_DESCR cntlEndptDescr; /* control endpoint descriptor */ /* WindView Instrumentation */ USB_TARG_LOG_EVENT(USB_TARG_DEVICE_CONTROL, "usbTargHandleResetEvent entered...", USB_TARG_WV_FILTER); /* acquire the TARG_TCD mutex for TCD operations */ OSS_MUTEX_TAKE ( pTargTcd->tcdMutex, OSS_BLOCK); /* * Check if control endpoints are acquried, * if so release them. */ if ((status = controlEndptRelease (pTargTcd)) != OK) return ERROR; /* Call the management Callback to state that a reset event has occured */ if ((status = mngmtFunc ( pTargTcd , TARG_MNGMT_BUS_RESET,(pVOID)speed)) != OK ) { /* WindView Instrumentation */ USB_TARG_LOG_EVENT(USB_TARG_DEVICE_CONTROL, "usbTargHandleResetEvent exiting:Mangement function returned error...", USB_TARG_WV_FILTER); OSS_MUTEX_RELEASE (pTargTcd->tcdMutex); return ossStatus (S_usbTargLib_APP_FAULT); } /* Set the device address to 0 */ if ((status = usbHalTcdAddressSet (&pTargTcd->tcdNexus , 0)) != OK) { OSS_MUTEX_RELEASE (pTargTcd->tcdMutex); return ossStatus (S_usbTargLib_TCD_FAULT); } /* Reset the Endpoint Descriptor data structure */ memset (&cntlEndptDescr, 0 , sizeof ( USB_ENDPOINT_DESCR )); /* Set the descriptor for Control In Endpoint */ /*Size of Descriptor*/ cntlEndptDescr.length = sizeof (USB_ENDPOINT_DESCR); /* Descriptor Type */ cntlEndptDescr.descriptorType = USB_DESCR_ENDPOINT; /* Endpoint Address */ cntlEndptDescr.endpointAddress = USB_ENDPOINT_DEFAULT_CONTROL | USB_ENDPOINT_IN ; /* Control Endpoint */ cntlEndptDescr.attributes = USB_ATTR_CONTROL ; /* Populate the max packet size based on the speed of the device */ if (speed == USB_TCD_HIGH_SPEED) cntlEndptDescr.maxPacketSize=TO_LITTLEW(USB_MAX_CTRL_PACKET_SIZE); else cntlEndptDescr.maxPacketSize=TO_LITTLEW(USB_MIN_CTRL_PACKET_SIZE); /* Interval for control In */ cntlEndptDescr.interval = 0 ; /* Create Control In Endpoint */ if ((status = usbHalTcdEndpointAssign (&pTargTcd->tcdNexus ,&cntlEndptDescr, 0,0,0,&pTargTcd->defaultControlPipeIN)) !=OK) { /* WindView Instrumentation */ USB_TARG_LOG_EVENT(USB_TARG_DEVICE_CONTROL, "usbTargHandleResetEvent: Could not create the Control IN Endpoint...", USB_TARG_WV_FILTER); OSS_MUTEX_RELEASE (pTargTcd->tcdMutex); return ossStatus (S_usbTargLib_TCD_FAULT); } /* Reset the Control Endpoint Descriptor for Out Transfer */ memset (&cntlEndptDescr, 0 , sizeof ( USB_ENDPOINT_DESCR )); /* Set the descriptor for Control Out Endpoint */ /*Size of Descriptor*/ cntlEndptDescr.length = sizeof (USB_ENDPOINT_DESCR); /* Descriptor Type */ cntlEndptDescr.descriptorType = USB_DESCR_ENDPOINT; /* Endpoint Address */ cntlEndptDescr.endpointAddress = USB_ENDPOINT_DEFAULT_CONTROL | USB_ENDPOINT_OUT; /* Control Endpoint */ cntlEndptDescr.attributes = USB_ATTR_CONTROL ; /* Populate the max packet size based on the speed of the device */ if (speed == USB_TCD_HIGH_SPEED) cntlEndptDescr.maxPacketSize=TO_LITTLEW(USB_MAX_CTRL_PACKET_SIZE); else cntlEndptDescr.maxPacketSize=TO_LITTLEW(USB_MIN_CTRL_PACKET_SIZE); /* Interval for Control Out if the speed of the device is high speed */ if (speed == USB_TCD_HIGH_SPEED) cntlEndptDescr.interval = 255 ; /* Create Control Out Endpoint */ if ((status = usbHalTcdEndpointAssign (&pTargTcd->tcdNexus ,&cntlEndptDescr, 0,0,0,&pTargTcd->defaultControlPipeOUT)) !=OK) { /* Release the default control IN endpoint */ if (usbHalTcdEndpointRelease(&pTargTcd->tcdNexus, pTargTcd->defaultControlPipeIN) != OK) { /* WindView Instrumentation */ USB_TARG_LOG_EVENT(USB_TARG_DEVICE_CONTROL, "usbTargHandleResetEvent: Could not create the Control OUT Endpoint.", USB_TARG_WV_FILTER); OSS_MUTEX_RELEASE (pTargTcd->tcdMutex); return ossStatus (S_usbTargLib_TCD_FAULT); } pTargTcd->defaultControlPipeIN = NULL; OSS_MUTEX_RELEASE (pTargTcd->tcdMutex); return ossStatus (S_usbTargLib_TCD_FAULT); } pTargTcd->controlErpPending = FALSE; /* Initialize setup erp and populate it with default values */ initSetupErp(pTargTcd); /* Submit the ERP */ if ((status = usbHalTcdErpSubmit(&pTargTcd->tcdNexus,&pTargTcd->setupErp)) != OK) { status = ossStatus (S_usbTargLib_TCD_FAULT); /* WindView Instrumentation */ USB_TARG_LOG_EVENT(USB_TARG_DEVICE_CONTROL, "usbTargHandleResetEvent: Error submitting the ERP on Control endpoint...", USB_TARG_WV_FILTER); } /* Release the mutex */ OSS_MUTEX_RELEASE (pTargTcd->tcdMutex); /* WindView Instrumentation */ USB_TARG_LOG_EVENT(USB_TARG_DEVICE_CONTROL, "usbTargHandleResetEvent exiting ...", USB_TARG_WV_FILTER); return status; }/********************************************************************************* usbTargHandleDisconnectEvent - handles the disconnect event** This function will be called whenever a disconnect event has occured. It* destroys the default endpoints and calls management callback to notify * the event to the application.** RETURNS: OK or ERROR if any.** ERRNO:* \is* \i S_usbTargLib_TCD_FAULT* TCD specific fault occured.** \i S_usbTargLib_OUT_OF_MEMORY* Memory not present to alloocate variables* \ie** \NOMANUAL*/LOCAL STATUS usbTargHandleDisconnectEvent ( pTARG_TCD pTargTcd /* TARG_TCD */ ) { STATUS status = OK; /* WindView Instrumentation */ USB_TARG_LOG_EVENT(USB_TARG_DEVICE_CONTROL, "usbTargHandleDisconnectEvent entered ...", USB_TARG_WV_FILTER); /* Acquire the TARG_TCD mutex for TCD operations */ OSS_MUTEX_TAKE ( pTargTcd->tcdMutex, OSS_BLOCK); /* * Check if control endpoints are acquried, * if so release them. */ if ((status = controlEndptRelease (pTargTcd)) != OK) return ERROR; /* Call the management callback */ if ((status = mngmtFunc (pTargTcd ,TARG_MNGMT_DISCONNECT,NULL)) != OK) status = ossStatus (S_usbTargLib_TCD_FAULT); OSS_MUTEX_RELEASE (pTargTcd->tcdMutex); /* WindView Instrumentation */ USB_TARG_LOG_EVENT(USB_TARG_DEVICE_CONTROL, "usbTargHandleDisconnectEvent exiting ...", USB_TARG_WV_FILTER); return status; }/********************************************************************************* controlEndptRelease - releases the control endpoints** This function release the default control IN/OUT endpoints.** RETURNS : OK or ERROR if not able to release endpoints.** ERRNO:* \is* \i S_usbTargLib_TCD_FAULT* Fault occured in TCD.* \ie** \NOMANUAL*/LOCAL STATUS controlEndptRelease ( pTARG_TCD pTargTcd /* TARG_TCD */ ) { /* WindView Instrumentation */ USB_TARG_LOG_EVENT(USB_TARG_DEVICE_CONTROL, "controlEndptRelease entered ...", USB_TARG_WV_FILTER); /* * Check if control endpoints are acquried, * if so release them. */ /* Control In Endpoint */ if ( pTargTcd->defaultControlPipeIN != NULL ) { if (usbHalTcdEndpointRelease (&pTargTcd->tcdNexus , pTargTcd->defaultControlPipeIN) !=OK) { OSS_MUTEX_RELEASE (pTargTcd->tcdMutex); return ossStatus (S_usbTargLib_TCD_FAULT); } pTargTcd->defaultControlPipeIN = NULL; } /* Control Out Endpoint */ if ( pTargTcd->defaultControlPipeOUT != NULL ) { if (usbHalTcdEndpointRelease (&pTargTcd->tcdNexus , pTargTcd->defaultControlPipeOUT) !=OK) { OSS_MUTEX_RELEASE (pTargTcd->tcdMutex); return ossStatus (S_usbTargLib_TCD_FAULT); } pTargTcd->defaultControlPipeOUT = NULL; } return OK; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -