/*! * @brief De-initializes the USB CDC RNDIS device. * * This function de-initializes the USB CDC RNDIS device. * * @param handle The pointer the RNDIS device. * @return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceCdcRndisDeinit(usb_device_cdc_rndis_struct_t *handle) { usb_device_cdc_rndis_struct_t *cdcRndisHandle; usb_status_t error = kStatus_USB_Error; cdcRndisHandle = handle; if (!cdcRndisHandle) { return kStatus_USB_InvalidHandle; } if (kStatus_USB_OSA_Success != USB_OsaMutexDestroy(cdcRndisHandle->statusMutex)) { usb_echo("mutex destroy error!"); } error = USB_DeviceCdcRndisFreeHandle(cdcRndisHandle); return error; }
usb_status_t USB_HostDeinit(usb_host_handle hostHandle) { usb_status_t status = kStatus_USB_Success; usb_host_instance_t *hostInstance = (usb_host_instance_t *)hostHandle; usb_host_device_instance_t *deviceInstance = NULL; if (hostHandle == NULL) { return kStatus_USB_InvalidHandle; } /* device list detach */ deviceInstance = (usb_host_device_instance_t *)hostInstance->deviceList; while (deviceInstance != NULL) { deviceInstance = (usb_host_device_instance_t *)hostInstance->deviceList; USB_HostDetachDeviceInternal(hostHandle, deviceInstance); } /* controller instance destory */ status = hostInstance->controllerTable->controllerDestory(hostInstance->controllerHandle); hostInstance->controllerHandle = NULL; if (status != kStatus_USB_Success) { #ifdef HOST_ECHO usb_echo("host controller destory fail\r\n"); #endif } /* resource release */ if (hostInstance->hostMutex) { USB_OsaMutexDestroy(hostInstance->hostMutex); hostInstance->hostMutex = NULL; } USB_HostReleaseInstance(hostInstance); return status; }
usb_status_t USB_HostInit(uint8_t controllerId, usb_host_handle *hostHandle, host_callback_t callbackFn) { usb_status_t status = kStatus_USB_Success; usb_host_instance_t *hostInstance = NULL; usb_host_transfer_t *transferPrev = NULL; uint8_t i = 0; hostInstance = USB_HostGetInstance(); /* get one host instance */ if (hostInstance == NULL) { return kStatus_USB_InvalidHandle; } /* get khci/ehci API table */ USB_HostGetControllerInterface(controllerId, &hostInstance->controllerTable); if (hostInstance->controllerTable == NULL) { USB_HostReleaseInstance(hostInstance); return kStatus_USB_ControllerNotFound; } /* judge the controller interface one time at here */ if ((hostInstance->controllerTable->controllerCreate == NULL) || (hostInstance->controllerTable->controllerDestory == NULL) || (hostInstance->controllerTable->controllerOpenPipe == NULL) || (hostInstance->controllerTable->controllerClosePipe == NULL) || (hostInstance->controllerTable->controllerWritePipe == NULL) || (hostInstance->controllerTable->controllerReadPipe == NULL) || (hostInstance->controllerTable->controllerIoctl == NULL)) { return kStatus_USB_Error; } /* HOST instance init*/ hostInstance->controllerId = controllerId; hostInstance->deviceCallback = callbackFn; hostInstance->deviceList = NULL; if (kStatus_USB_OSA_Success != USB_OsaMutexCreate(&hostInstance->hostMutex)) { USB_HostReleaseInstance(hostInstance); #ifdef HOST_ECHO usb_echo("host init: create host mutex fail\r\n"); #endif return kStatus_USB_Error; } /* initialize transfer list */ hostInstance->transferHead = &hostInstance->transferList[0]; transferPrev = hostInstance->transferHead; for (i = 1; i < USB_HOST_CONFIG_MAX_TRANSFERS; ++i) { transferPrev->next = &hostInstance->transferList[i]; transferPrev = transferPrev->next; } /* controller create */ status = hostInstance->controllerTable->controllerCreate(controllerId, hostInstance, &(hostInstance->controllerHandle)); if ((status != kStatus_USB_Success) || (hostInstance->controllerHandle == NULL)) { USB_OsaMutexDestroy(hostInstance->hostMutex); USB_HostReleaseInstance(hostInstance); #ifdef HOST_ECHO usb_echo("host init: controller init fail\r\n"); #endif return kStatus_USB_Error; } *hostHandle = hostInstance; return kStatus_USB_Success; }