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;
|
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(
|
static usb_request_status_t usb_standard_request_get_descriptor_setup(
|
||||||
usb_endpoint_t* const endpoint
|
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:
|
case USB_DESCRIPTOR_TYPE_CONFIGURATION:
|
||||||
// TODO: Duplicated code. Refactor.
|
// TODO: Duplicated code. Refactor.
|
||||||
if( usb_speed(endpoint->device) == USB_SPEED_HIGH ) {
|
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 {
|
} 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:
|
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:
|
case USB_DESCRIPTOR_TYPE_OTHER_SPEED_CONFIGURATION:
|
||||||
// TODO: Duplicated code. Refactor.
|
// TODO: Duplicated code. Refactor.
|
||||||
if( usb_speed(endpoint->device) == USB_SPEED_HIGH ) {
|
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 {
|
} 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:
|
case USB_DESCRIPTOR_TYPE_STRING:
|
||||||
|
Reference in New Issue
Block a user