/**************************************************************************//** \brief Mass storage device request handler. \param[in] data - pointer to host's request. ******************************************************************************/ void msdRequestHandler(uint8_t *data) { UsbMscRequest_t *pRequest = NULL; pRequest = (UsbMscRequest_t *)data; if (NULL == pRequest) return; // Check request code switch (pRequest->request.bRequest) { case BULK_ONLY_MASS_STORAGE_RESET: break; case GET_MAX_LUN: HAL_Stall(0); break; default: HAL_Stall(0); break; } }
/****************************************************************************** runtime get descriptor command handler Parameters: type - type of the requested descriptor index - index of the requested descriptor length - maximum number of bytes to return ******************************************************************************/ void runtimeGetDescriptorHandler(uint8_t type, uint8_t index, uint16_t length) { (void)index; // Check the descriptor type switch (type) { case DESCRIPTOR_TYPE_DEVICE: // Adjust length and send descriptor if (length > deviceDescr.bLength) length = deviceDescr.bLength; HAL_UsbWrite(0, (void *)&deviceDescr, length, 0, 0); break; case DESCRIPTOR_TYPE_CONFIGURATION: // Adjust length and send descriptor if (length > usbConfigDescr.config.wTotalLength) length = usbConfigDescr.config.wTotalLength; HAL_UsbWrite(0, (void *)&usbConfigDescr, length, 0, 0); break; case DESCRIPTOR_TYPE_INTERFACE: HAL_Stall(0); break; case DESCRIPTOR_TYPE_DEVICE_QUALIFIER: HAL_Stall(0); break; case DESCRIPTOR_TYPE_OTHER_SPEED_CFG: HAL_Stall(0); break; case DESCRIPTOR_TYPE_ENDPOINT: HAL_Stall(0); break; case DESCRIPTOR_TYPE_STRING: if (SERIAL_NUMBER_STRING_INDEX == index) { if (length > serialNumberStringDescr.bLength) length = serialNumberStringDescr.bLength; HAL_UsbWrite(0, (void *)&serialNumberStringDescr, length, 0, 0); } //When string descriptor(s) presents, host also asks for string descriptor that describes used language. else if (LANG_ID_STRING_INDEX == index) { if (length > serialNumberStringDescr.bLength) length = langStringDescr.bLength; HAL_UsbWrite(0, (void *)&langStringDescr, length, 0, 0); } else HAL_Stall(0); break; default: HAL_Stall(0); break; } }
/****************************************************************************** Usb setup process request handler Parameters: data - pointer to host's request ******************************************************************************/ void setupProcessRequestHandler(uint8_t *data) { UsbRequest_t *pRequest = NULL; pRequest = (UsbRequest_t *)data; if (NULL == pRequest) return; switch (pRequest->wIndex) { #if (APP_INTERFACE == APP_INTERFACE_VCP) case NUMBER_OF_FIRST_INTERFACE: vcpRequestHandler(data); break; #endif // (APP_INTERFACE == APP_INTERFACE_VCP) /* MSC commands */ #if (MSD_SUPPORT == 1) #if (APP_INTERFACE == APP_INTERFACE_VCP) case NUMBER_OF_THIRD_INTERFACE: #else case NUMBER_OF_FIRST_INTERFACE: #endif msdRequestHandler(data); break; #endif // (MSD_SUPPORT == 1) #if (DFU_SUPPORT == 1) #if (APP_INTERFACE == APP_INTERFACE_VCP) #if (MSD_SUPPORT == 1) case NUMBER_OF_FOURTH_INTERFACE: #else case NUMBER_OF_THIRD_INTERFACE: #endif #else case NUMBER_OF_SECOND_INTERFACE: #endif // (APP_INTERFACE == APP_INTERFACE_VCP) dfuRequestHandler(data); break; #endif // (DFU_SUPPORT == 1) default: HAL_Stall(0); break; } }