/*! * @brief Initializes the USB CDC RNDIS device. * * This function initializes the USB CDC RNDIS device. * * @param classHandle The class handle of the CDC ACM class. * @param config The pointer to the configure parameter. * @param handle The pointer to pointer of the RNDIS device. * @return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceCdcRndisInit(class_handle_t classHandle, usb_device_cdc_rndis_config_struct_t *config, usb_device_cdc_rndis_struct_t **handle) { usb_device_cdc_rndis_struct_t *cdcRndisHandle; usb_status_t error = kStatus_USB_Error; error = USB_DeviceCdcRndisAllocateHandle(&cdcRndisHandle); if (kStatus_USB_Success != error) { return error; } /* Initially RNDIS is in Uninitialized state */ cdcRndisHandle->cdcAcmHandle = classHandle; cdcRndisHandle->rndisDeviceState = RNDIS_UNINITIALIZED; cdcRndisHandle->rndisHwState = NDIS_HARDWARE_STATUS_NOT_READY; cdcRndisHandle->rndisMediaConnectStatus = NDIS_MEDIA_STATE_UNKNOWN; cdcRndisHandle->rndisDevMaxTxSize = config->devMaxTxSize; cdcRndisHandle->rndisCallback = config->rndisCallback; cdcRndisHandle->rndisCommand = &rndisCommand[0]; cdcRndisHandle->responseData = &responseData[0]; if (kStatus_USB_OSA_Success != USB_OsaMutexCreate(&(cdcRndisHandle->statusMutex))) { usb_echo("mutex create error!"); } *handle = cdcRndisHandle; return error; }
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; }