+ byte desc_type = setup->wValue >> 8;
+ byte desc_index = setup->wValue & 0xff;
+
+ switch (desc_type)
+ {
+ case USB_DESC_TYPE_DEVICE:
+ return dev_desc_send(usb, setup, usb->desc_device, usb->desc_device_len);
+ case USB_DESC_TYPE_CONFIGURATION:
+ return dev_desc_send(usb, setup, usb->desc_config, usb->desc_config_len);
+ case USB_DESC_TYPE_STRING:
+ if (!desc_index)
+ return dev_desc_send(usb, setup, usb->desc_languages, usb->desc_languages_len);
+ if (desc_index < usb->desc_string_items)
+ return dev_desc_send_string(usb, setup, usb->desc_string[desc_index]);
+ break;
+ case USB_DESC_TYPE_DEVICE_QUALIFIER:
+ case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION:
+ // We do not support high-speed USB
+ break;
+ }
+
+ usb_ctl_error(usb);