/* The Device callback */ static usb_status_t USB_DeviceCallback(usb_device_handle handle, uint32_t event, void *param) { usb_status_t error = kStatus_USB_Error; uint16_t *temp16 = (uint16_t *)param; uint8_t *temp8 = (uint8_t *)param; switch (event) { case kUSB_DeviceEventBusReset: { /* USB bus reset signal detected */ g_UsbDeviceComposite.attach = 0U; error = kStatus_USB_Success; #if defined(USB_DEVICE_CONFIG_EHCI) && (USB_DEVICE_CONFIG_EHCI > 0U) /* Get USB speed to configure the device, including max packet size and interval of the endpoints. */ if (kStatus_USB_Success == USB_DeviceClassGetSpeed(CONTROLLER_ID, &g_UsbDeviceComposite.speed)) { USB_DeviceSetSpeed(handle, g_UsbDeviceComposite.speed); } #endif } break; case kUSB_DeviceEventSetConfiguration: if (param) { /* Set device configuration request */ g_UsbDeviceComposite.attach = 1U; g_UsbDeviceComposite.currentConfiguration = *temp8; USB_DeviceHidMouseSetConfigure(g_UsbDeviceComposite.hidMouseHandle, *temp8); USB_DeviceHidKeyboardSetConfigure(g_UsbDeviceComposite.hidKeyboardHandle, *temp8); error = kStatus_USB_Success; } break; case kUSB_DeviceEventSetInterface: if (g_UsbDeviceComposite.attach) { /* Set device interface request */ uint8_t interface = (uint8_t)((*temp16 & 0xFF00U) >> 0x08U); uint8_t alternateSetting = (uint8_t)(*temp16 & 0x00FFU); if (interface < USB_COMPOSITE_INTERFACE_COUNT) { g_UsbDeviceComposite.currentInterfaceAlternateSetting[interface] = alternateSetting; USB_DeviceHidMouseSetInterface(g_UsbDeviceComposite.hidMouseHandle, interface, alternateSetting); USB_DeviceHidKeyboardSetInterface(g_UsbDeviceComposite.hidKeyboardHandle, interface, alternateSetting); error = kStatus_USB_Success; } } break; case kUSB_DeviceEventGetConfiguration: if (param) { /* Get current configuration request */ *temp8 = g_UsbDeviceComposite.currentConfiguration; error = kStatus_USB_Success; } break; case kUSB_DeviceEventGetInterface: if (param) { /* Get current alternate setting of the interface request */ uint8_t interface = (uint8_t)((*temp16 & 0xFF00U) >> 0x08U); if (interface < USB_COMPOSITE_INTERFACE_COUNT) { *temp16 = (*temp16 & 0xFF00U) | g_UsbDeviceComposite.currentInterfaceAlternateSetting[interface]; error = kStatus_USB_Success; } else { error = kStatus_USB_InvalidRequest; } } break; case kUSB_DeviceEventGetDeviceDescriptor: if (param) { /* Get device descriptor request */ error = USB_DeviceGetDeviceDescriptor(handle, (usb_device_get_device_descriptor_struct_t *)param); } break; case kUSB_DeviceEventGetConfigurationDescriptor: if (param) { /* Get device configuration descriptor request */ error = USB_DeviceGetConfigurationDescriptor(handle, (usb_device_get_configuration_descriptor_struct_t *)param); } break; case kUSB_DeviceEventGetStringDescriptor: if (param) { /* Get device string descriptor request */ error = USB_DeviceGetStringDescriptor(handle, (usb_device_get_string_descriptor_struct_t *)param); } break; case kUSB_DeviceEventGetHidDescriptor: if (param) { /* Get hid descriptor request */ error = USB_DeviceGetHidDescriptor(handle, (usb_device_get_hid_descriptor_struct_t *)param); } break; case kUSB_DeviceEventGetHidReportDescriptor: if (param) { /* Get hid report descriptor request */ error = USB_DeviceGetHidReportDescriptor(handle, (usb_device_get_hid_report_descriptor_struct_t *)param); } break; case kUSB_DeviceEventGetHidPhysicalDescriptor: if (param) { /* Get hid physical descriptor request */ error = USB_DeviceGetHidPhysicalDescriptor(handle, (usb_device_get_hid_physical_descriptor_struct_t *)param); } break; default: break; }
/*! * @brief device callback function. * * This function handle the usb standard event. more information, please refer to usb spec chapter 9. * @param handle The USB device handle. * @param event The USB device event type. * @param param The parameter of the device specific request. * @return kStatus_USB_Success or error. */ usb_status_t USB_DeviceCallback(usb_device_handle handle, uint32_t event, void *param) { usb_status_t error = kStatus_USB_Error; uint16_t *temp16 = (uint16_t *)param; uint8_t *temp8 = (uint8_t *)param; switch (event) { case kUSB_DeviceEventBusReset: { g_msc.attach = 0; error = kStatus_USB_Success; #if defined(USB_DEVICE_CONFIG_EHCI) && (USB_DEVICE_CONFIG_EHCI > 0) if (kStatus_USB_Success == USB_DeviceClassGetSpeed(CONTROLLER_ID, &g_msc.speed)) { USB_DeviceSetSpeed(handle, g_msc.speed); } #endif } break; case kUSB_DeviceEventSetConfiguration: if (param) { g_msc.attach = 1; g_msc.currentConfiguration = *temp8; } break; case kUSB_DeviceEventSetInterface: if (g_msc.attach) { uint8_t interface = (uint8_t)((*temp16 & 0xFF00U) >> 0x08U); uint8_t alternateSetting = (uint8_t)(*temp16 & 0x00FFU); if (interface < USB_MSC_INTERFACE_COUNT) { g_msc.currentInterfaceAlternateSetting[interface] = alternateSetting; } } break; case kUSB_DeviceEventGetConfiguration: if (param) { *temp8 = g_msc.currentConfiguration; error = kStatus_USB_Success; } break; case kUSB_DeviceEventGetInterface: if (param) { uint8_t interface = (uint8_t)((*temp16 & 0xFF00U) >> 0x08U); if (interface < USB_INTERFACE_COUNT) { *temp16 = (*temp16 & 0xFF00U) | g_msc.currentInterfaceAlternateSetting[interface]; error = kStatus_USB_Success; } else { error = kStatus_USB_InvalidRequest; } } break; case kUSB_DeviceEventGetDeviceDescriptor: if (param) { error = USB_DeviceGetDeviceDescriptor(handle, (usb_device_get_device_descriptor_struct_t *)param); } break; case kUSB_DeviceEventGetConfigurationDescriptor: if (param) { error = USB_DeviceGetConfigurationDescriptor(handle, (usb_device_get_configuration_descriptor_struct_t *)param); } break; case kUSB_DeviceEventGetStringDescriptor: if (param) { error = USB_DeviceGetStringDescriptor(handle, (usb_device_get_string_descriptor_struct_t *)param); } break; default: break; }
/* The device callback */ static usb_status_t USB_DeviceCallback(usb_device_handle handle, uint32_t event, void *param) { usb_status_t error = kStatus_USB_Success; uint8_t *temp8 = (uint8_t *)param; uint16_t *temp16 = (uint16_t *)param; switch (event) { case kUSB_DeviceEventBusReset: { /* The device BUS reset signal detected */ USB_DeviceVideoApplicationSetDefault(); #if defined(USB_DEVICE_CONFIG_EHCI) && (USB_DEVICE_CONFIG_EHCI > 0U) if (kStatus_USB_Success == USB_DeviceGetStatus(g_UsbDeviceVideoVirtualCamera.deviceHandle, kUSB_DeviceStatusSpeed, &g_UsbDeviceVideoVirtualCamera.speed)) { USB_DeviceSetSpeed(g_UsbDeviceVideoVirtualCamera.deviceHandle, g_UsbDeviceVideoVirtualCamera.speed); } if (USB_SPEED_HIGH == g_UsbDeviceVideoVirtualCamera.speed) { g_UsbDeviceVideoVirtualCamera.currentMaxPacketSize = HS_STREAM_IN_PACKET_SIZE; } #endif } break; case kUSB_DeviceEventSetConfiguration: if (USB_VIDEO_VIRTUAL_CAMERA_CONFIGURE_INDEX == (*temp8)) { /* Set the configuration request */ g_UsbDeviceVideoVirtualCamera.attach = 1U; g_UsbDeviceVideoVirtualCamera.currentConfiguration = *temp8; } break; case kUSB_DeviceEventSetInterface: if ((g_UsbDeviceVideoVirtualCamera.attach) && param) { /* Set alternateSetting of the interface request */ uint8_t interface = (uint8_t)((*temp16 & 0xFF00U) >> 0x08U); uint8_t alternateSetting = (uint8_t)(*temp16 & 0x00FFU); if (g_UsbDeviceVideoVirtualCamera.currentInterfaceAlternateSetting[interface] != alternateSetting) { if (!g_UsbDeviceVideoVirtualCamera.currentInterfaceAlternateSetting[interface]) { if (USB_VIDEO_VIRTUAL_CAMERA_STREAM_INTERFACE_INDEX == interface) { USB_DeviceVideoPrepareVideoData(); error = USB_DeviceSendRequest(g_UsbDeviceVideoVirtualCamera.deviceHandle, USB_VIDEO_VIRTUAL_CAMERA_STREAM_ENDPOINT_IN, g_UsbDeviceVideoVirtualCamera.imageBuffer, g_UsbDeviceVideoVirtualCamera.imageBufferLength); } } g_UsbDeviceVideoVirtualCamera.currentInterfaceAlternateSetting[interface] = alternateSetting; } } break; case kUSB_DeviceEventGetConfiguration: if (param) { /* Get the current configuration request */ *temp8 = g_UsbDeviceVideoVirtualCamera.currentConfiguration; error = kStatus_USB_Success; } break; case kUSB_DeviceEventGetInterface: if (param) { /* Set the alternateSetting of the interface request */ uint8_t interface = (uint8_t)((*temp16 & 0xFF00U) >> 0x08U); if (interface < USB_VIDEO_VIRTUAL_CAMERA_INTERFACE_COUNT) { *temp16 = (*temp16 & 0xFF00U) | g_UsbDeviceVideoVirtualCamera.currentInterfaceAlternateSetting[interface]; error = kStatus_USB_Success; } else { error = kStatus_USB_InvalidRequest; } } break; case kUSB_DeviceEventGetDeviceDescriptor: if (param) { /* Get the device descriptor request */ error = USB_DeviceGetDeviceDescriptor(handle, (usb_device_get_device_descriptor_struct_t *)param); } break; case kUSB_DeviceEventGetConfigurationDescriptor: if (param) { /* Get the configuration descriptor request */ error = USB_DeviceGetConfigurationDescriptor(handle, (usb_device_get_configuration_descriptor_struct_t *)param); } break; case kUSB_DeviceEventGetStringDescriptor: if (param) { /* Get the string descriptor request */ error = USB_DeviceGetStringDescriptor(handle, (usb_device_get_string_descriptor_struct_t *)param); } break; default: break; }
/*! * @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; uint16_t *temp16 = (uint16_t *)param; switch (event) { case kUSB_DeviceEventBusReset: { /* The device BUS reset signal detected */ s_audioGenerator.attach = 0U; error = kStatus_USB_Success; #if defined(USB_DEVICE_CONFIG_EHCI) && (USB_DEVICE_CONFIG_EHCI > 0U) if (kStatus_USB_Success == USB_DeviceClassGetSpeed(CONTROLLER_ID, &s_audioGenerator.speed)) { USB_DeviceSetSpeed(handle, s_audioGenerator.speed); } #endif } break; case kUSB_DeviceEventSetConfiguration: if (USB_AUDIO_GENERATOR_CONFIGURE_INDEX == (*temp8)) { /* Set the configuration request */ s_audioGenerator.attach = 1U; s_audioGenerator.currentConfiguration = *temp8; } break; case kUSB_DeviceEventSetInterface: if (s_audioGenerator.attach) { /* Set alternateSetting of the interface request */ uint8_t interface = (uint8_t)((*temp16 & 0xFF00U) >> 0x08U); uint8_t alternateSetting = (uint8_t)(*temp16 & 0x00FFU); if (s_audioGenerator.currentInterfaceAlternateSetting[interface] != alternateSetting) { s_audioGenerator.currentInterfaceAlternateSetting[interface] = alternateSetting; if (alternateSetting == 1U) { USB_PrepareData(); USB_DeviceAudioSend(s_audioGenerator.audioHandle, USB_AUDIO_STREAM_ENDPOINT, s_wavBuff, (USB_SPEED_HIGH == s_audioGenerator.speed) ? HS_ISO_IN_ENDP_PACKET_SIZE : FS_ISO_IN_ENDP_PACKET_SIZE); } } } break; case kUSB_DeviceEventGetConfiguration: if (param) { /* Get the current configuration request */ *temp8 = s_audioGenerator.currentConfiguration; error = kStatus_USB_Success; } break; case kUSB_DeviceEventGetInterface: if (param) { uint8_t interface = (uint8_t)((*temp16 & 0xFF00U) >> 0x08U); if (interface < USB_AUDIO_GENERATOR_INTERFACE_COUNT) { *temp16 = (*temp16 & 0xFF00U) | s_audioGenerator.currentInterfaceAlternateSetting[interface]; error = kStatus_USB_Success; } else { error = kStatus_USB_InvalidRequest; } } break; case kUSB_DeviceEventGetDeviceDescriptor: if (param) { /* Get the device descriptor request */ error = USB_DeviceGetDeviceDescriptor(handle, (usb_device_get_device_descriptor_struct_t *)param); } break; case kUSB_DeviceEventGetConfigurationDescriptor: if (param) { /* Get the configuration descriptor request */ error = USB_DeviceGetConfigurationDescriptor(handle, (usb_device_get_configuration_descriptor_struct_t *)param); } break; case kUSB_DeviceEventGetStringDescriptor: if (param) { /* Get the string descriptor request */ error = USB_DeviceGetStringDescriptor(handle, (usb_device_get_string_descriptor_struct_t *)param); } break; default: break; }
/*! * @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; uint16_t *temp16 = (uint16_t *)param; uint8_t *temp8 = (uint8_t *)param; switch (event) { case kUSB_DeviceEventBusReset: { s_cdcVcom.attach = 0; #if defined(USB_DEVICE_CONFIG_EHCI) && (USB_DEVICE_CONFIG_EHCI > 0) if (kStatus_USB_Success == USB_DeviceClassGetSpeed(CONTROLLER_ID, &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)) { /* Schedule buffer for receive */ USB_DeviceCdcAcmRecv(s_cdcVcom.cdcAcmHandle, USB_CDC_VCOM_BULK_OUT_ENDPOINT, s_currRecvBuf, g_UsbDeviceCdcVcomDicEndpoints[0].maxPacketSize); } } break; case kUSB_DeviceEventSetInterface: if (s_cdcVcom.attach) { uint8_t interface = (uint8_t)((*temp16 & 0xFF00U) >> 0x08U); uint8_t alternateSetting = (uint8_t)(*temp16 & 0x00FFU); if (interface < USB_CDC_VCOM_INTERFACE_COUNT) { s_cdcVcom.currentInterfaceAlternateSetting[interface] = alternateSetting; } } break; case kUSB_DeviceEventGetConfiguration: break; case kUSB_DeviceEventGetInterface: break; case kUSB_DeviceEventGetDeviceDescriptor: if (param) { error = USB_DeviceGetDeviceDescriptor(handle, (usb_device_get_device_descriptor_struct_t *)param); } break; case kUSB_DeviceEventGetConfigurationDescriptor: if (param) { error = USB_DeviceGetConfigurationDescriptor(handle, (usb_device_get_configuration_descriptor_struct_t *)param); } break; default: break; }