/*! * @brief USB device callback function. * * This function handles the usb device specific requests. * * @param handle The USB device handle. * @param event The USB device event type. * @param param The parameter of the device specific request. * * @return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceCallback(usb_device_handle handle, uint32_t event, void *param) { usb_status_t error = kStatus_USB_Error; uint8_t *temp8 = (uint8_t *)param; switch (event) { case kUSB_DeviceEventBusReset: { USB_DeviceControlPipeInit(s_cdcVcom.deviceHandle); s_cdcVcom.attach = 0; #if (defined(USB_DEVICE_CONFIG_EHCI) && (USB_DEVICE_CONFIG_EHCI > 0)) || \ (defined(USB_DEVICE_CONFIG_LPCIP3511HS) && (USB_DEVICE_CONFIG_LPCIP3511HS > 0U)) if (kStatus_USB_Success == USB_DeviceGetStatus(s_cdcVcom.deviceHandle, kUSB_DeviceStatusSpeed, &s_cdcVcom.speed)) { USB_DeviceSetSpeed(handle, s_cdcVcom.speed); } #endif } break; case kUSB_DeviceEventSetConfiguration: if (param) { s_cdcVcom.attach = 1; s_cdcVcom.currentConfiguration = *temp8; if (USB_CDC_VCOM_CONFIGURE_INDEX == (*temp8)) { usb_device_endpoint_init_struct_t epInitStruct; usb_device_endpoint_callback_struct_t endpointCallback; /* Initiailize endpoint for interrupt pipe */ endpointCallback.callbackFn = USB_DeviceCdcAcmInterruptIn; endpointCallback.callbackParam = handle; epInitStruct.zlt = 0; epInitStruct.transferType = USB_ENDPOINT_INTERRUPT; epInitStruct.endpointAddress = USB_CDC_VCOM_INTERRUPT_IN_ENDPOINT | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT); if (USB_SPEED_HIGH == s_cdcVcom.speed) { epInitStruct.maxPacketSize = HS_CDC_VCOM_INTERRUPT_IN_PACKET_SIZE; } else { epInitStruct.maxPacketSize = FS_CDC_VCOM_INTERRUPT_IN_PACKET_SIZE; } USB_DeviceInitEndpoint(s_cdcVcom.deviceHandle, &epInitStruct, &endpointCallback); /* Initiailize endpoints for bulk pipe */ endpointCallback.callbackFn = USB_DeviceCdcAcmBulkIn; endpointCallback.callbackParam = handle; epInitStruct.zlt = 0; epInitStruct.transferType = USB_ENDPOINT_BULK; epInitStruct.endpointAddress = USB_CDC_VCOM_BULK_IN_ENDPOINT | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT); if (USB_SPEED_HIGH == s_cdcVcom.speed) { epInitStruct.maxPacketSize = HS_CDC_VCOM_BULK_IN_PACKET_SIZE; } else { epInitStruct.maxPacketSize = FS_CDC_VCOM_BULK_IN_PACKET_SIZE; } USB_DeviceInitEndpoint(s_cdcVcom.deviceHandle, &epInitStruct, &endpointCallback); endpointCallback.callbackFn = USB_DeviceCdcAcmBulkOut; endpointCallback.callbackParam = handle; epInitStruct.zlt = 0; epInitStruct.transferType = USB_ENDPOINT_BULK; epInitStruct.endpointAddress = USB_CDC_VCOM_BULK_OUT_ENDPOINT | (USB_OUT << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT); if (USB_SPEED_HIGH == s_cdcVcom.speed) { epInitStruct.maxPacketSize = HS_CDC_VCOM_BULK_OUT_PACKET_SIZE; } else { epInitStruct.maxPacketSize = FS_CDC_VCOM_BULK_OUT_PACKET_SIZE; } USB_DeviceInitEndpoint(s_cdcVcom.deviceHandle, &epInitStruct, &endpointCallback); if (USB_SPEED_HIGH == s_cdcVcom.speed) { s_usbBulkMaxPacketSize = HS_CDC_VCOM_BULK_OUT_PACKET_SIZE; } else { s_usbBulkMaxPacketSize = FS_CDC_VCOM_BULK_OUT_PACKET_SIZE; } } } break; default: break; } return error; }
/*! * @brief Initialize the endpoints of the msc class. * * This callback function is used to initialize the endpoints of the msc class. * * @return A USB error code or kStatus_USB_Success. */ usb_status_t USB_DeviceMscEndpointsInit(void) { usb_status_t error = kStatus_USB_Error; usb_device_endpoint_init_struct_t epInitStruct; usb_device_endpoint_callback_struct_t endpointCallback; usb_device_msc_struct_t *mscHandle; mscHandle = &(g_deviceComposite->mscDisk.handle); endpointCallback.callbackFn = USB_DeviceMscBulkIn; endpointCallback.callbackParam = (void *)mscHandle; epInitStruct.zlt = 0; epInitStruct.transferType = USB_ENDPOINT_BULK; epInitStruct.endpointAddress = USB_MSC_DISK_BULK_IN_ENDPOINT | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT); mscHandle->bulkInEndpoint = epInitStruct.endpointAddress; if (USB_SPEED_HIGH == g_deviceComposite->speed) { epInitStruct.maxPacketSize = HS_MSC_DISK_BULK_IN_PACKET_SIZE; } else { epInitStruct.maxPacketSize = FS_MSC_DISK_BULK_IN_PACKET_SIZE; } USB_DeviceInitEndpoint(g_deviceComposite->deviceHandle, &epInitStruct, &endpointCallback); endpointCallback.callbackFn = USB_DeviceMscBulkOut; endpointCallback.callbackParam = (void *)mscHandle; epInitStruct.zlt = 0; epInitStruct.transferType = USB_ENDPOINT_BULK; epInitStruct.endpointAddress = USB_MSC_DISK_BULK_OUT_ENDPOINT | (USB_OUT << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT); mscHandle->bulkOutEndpoint = epInitStruct.endpointAddress; if (USB_SPEED_HIGH == g_deviceComposite->speed) { epInitStruct.maxPacketSize = HS_MSC_DISK_BULK_OUT_PACKET_SIZE; } else { epInitStruct.maxPacketSize = FS_MSC_DISK_BULK_OUT_PACKET_SIZE; } USB_DeviceInitEndpoint(g_deviceComposite->deviceHandle, &epInitStruct, &endpointCallback); mscHandle->dataOutFlag = 0; mscHandle->dataInFlag = 0; mscHandle->outEndpointStallFlag = 0; mscHandle->inEndpointStallFlag = 0; mscHandle->needOutStallFlag = 0; mscHandle->needInStallFlag = 0; mscHandle->cbwValidFlag = 1; mscHandle->transferRemaining = 0; mscHandle->performResetRecover = 0; mscHandle->performResetDoneFlag = 0; mscHandle->stallStatus = 0; if (mscHandle->cbwPrimeFlag == 1) { USB_DeviceCancel(g_deviceComposite->deviceHandle, mscHandle->bulkOutEndpoint); } USB_DeviceRecvRequest(g_deviceComposite->deviceHandle, mscHandle->bulkOutEndpoint, (uint8_t *)&mscHandle->g_mscCbw, USB_DEVICE_MSC_CBW_LENGTH); mscHandle->cbwPrimeFlag = 1; return error; }