diff --git a/firmware/hackrf_usb/usb_standard_request.c b/firmware/hackrf_usb/usb_standard_request.c index e6fd8974..fafc5c55 100644 --- a/firmware/hackrf_usb/usb_standard_request.c +++ b/firmware/hackrf_usb/usb_standard_request.c @@ -141,6 +141,25 @@ static usb_request_status_t usb_send_descriptor_string( return USB_REQUEST_STATUS_STALL; } +static usb_request_status_t usb_send_descriptor_config( + usb_endpoint_t* const endpoint, + usb_speed_t speed, + const uint8_t config_num +) { + usb_configuration_t** config = *(endpoint->device->configurations); + unsigned int i = 0; + for( ; *config != NULL; config++ ) { + if( (*config)->speed == speed) { + if (i == config_num) { + return usb_send_descriptor(endpoint, (*config)->descriptor); + } else { + i++; + } + } + } + return USB_REQUEST_STATUS_STALL; +} + static usb_request_status_t usb_standard_request_get_descriptor_setup( usb_endpoint_t* const endpoint ) { @@ -151,9 +170,9 @@ static usb_request_status_t usb_standard_request_get_descriptor_setup( case USB_DESCRIPTOR_TYPE_CONFIGURATION: // TODO: Duplicated code. Refactor. if( usb_speed(endpoint->device) == USB_SPEED_HIGH ) { - return usb_send_descriptor(endpoint, usb_descriptor_configuration_high_speed); + return usb_send_descriptor_config(endpoint, USB_SPEED_HIGH, endpoint->setup.value_l); } else { - return usb_send_descriptor(endpoint, usb_descriptor_configuration_full_speed); + return usb_send_descriptor_config(endpoint, USB_SPEED_FULL, endpoint->setup.value_l); } case USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER: @@ -162,9 +181,9 @@ static usb_request_status_t usb_standard_request_get_descriptor_setup( case USB_DESCRIPTOR_TYPE_OTHER_SPEED_CONFIGURATION: // TODO: Duplicated code. Refactor. if( usb_speed(endpoint->device) == USB_SPEED_HIGH ) { - return usb_send_descriptor(endpoint, usb_descriptor_configuration_full_speed); + return usb_send_descriptor_config(endpoint, USB_SPEED_FULL, endpoint->setup.value_l); } else { - return usb_send_descriptor(endpoint, usb_descriptor_configuration_high_speed); + return usb_send_descriptor_config(endpoint, USB_SPEED_HIGH, endpoint->setup.value_l); } case USB_DESCRIPTOR_TYPE_STRING: