usb_standard_request: Multiple config support
GET_DESCRIPTOR would only return one configurations. This fixes that.
This commit is contained in:
@ -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:
|
||||
|
Reference in New Issue
Block a user