// Configure a usb msc device. int usb_msc_setup(struct usbdevice_s *usbdev) { if (!CONFIG_USB_MSC) return -1; // Verify right kind of device struct usb_interface_descriptor *iface = usbdev->iface; if ((iface->bInterfaceSubClass != US_SC_SCSI && iface->bInterfaceSubClass != US_SC_ATAPI_8070 && iface->bInterfaceSubClass != US_SC_ATAPI_8020) || iface->bInterfaceProtocol != US_PR_BULK) { dprintf(1, "Unsupported MSC USB device (subclass=%02x proto=%02x)\n" , iface->bInterfaceSubClass, iface->bInterfaceProtocol); return -1; } // Find bulk in and bulk out endpoints. struct usb_pipe *inpipe = NULL, *outpipe = NULL; struct usb_endpoint_descriptor *indesc = usb_find_desc( usbdev, USB_ENDPOINT_XFER_BULK, USB_DIR_IN); struct usb_endpoint_descriptor *outdesc = usb_find_desc( usbdev, USB_ENDPOINT_XFER_BULK, USB_DIR_OUT); if (!indesc || !outdesc) goto fail; inpipe = usb_alloc_pipe(usbdev, indesc); outpipe = usb_alloc_pipe(usbdev, outdesc); if (!inpipe || !outpipe) goto fail; int maxlun = usb_msc_maxlun(usbdev->defpipe); int lun, pipesused = 0; for (lun = 0; lun < maxlun + 1; lun++) { int ret = usb_msc_lun_setup(inpipe, outpipe, usbdev, lun); if (!ret) pipesused = 1; } if (!pipesused) goto fail; return 0; fail: dprintf(1, "Unable to configure USB MSC device.\n"); usb_free_pipe(usbdev, inpipe); usb_free_pipe(usbdev, outpipe); return -1; }
/* same as usb_find_desc(), but searches only in the specified interface. */ const usb_cdc_descriptor_t * usb_find_desc_if(usbd_device_handle dev, int type, int subtype, usb_interface_descriptor_t *id) { usbd_desc_iter_t iter; const usb_cdc_descriptor_t *desc; if (id == NULL) return usb_find_desc(dev, type, subtype); usb_desc_iter_init(dev, &iter); iter.cur = (void *)id; /* start from the interface desc */ usb_desc_iter_next(&iter); /* and skip it */ while ((desc = (const usb_cdc_descriptor_t *)usb_desc_iter_next(&iter)) != NULL) { if (desc->bDescriptorType == UDESC_INTERFACE) { /* we ran into the next interface --- not found */ return NULL; } if (desc->bDescriptorType == type && (subtype == USBD_CDCSUBTYPE_ANY || subtype == desc->bDescriptorSubtype)) break; } return desc; }
// Initialize a found USB HID device (if applicable). int usb_hid_setup(struct usbdevice_s *usbdev) { if (! CONFIG_USB_KEYBOARD && ! CONFIG_USB_MOUSE) return -1; dprintf(2, "usb_hid_setup %p\n", usbdev->defpipe); struct usb_interface_descriptor *iface = usbdev->iface; if (iface->bInterfaceSubClass != USB_INTERFACE_SUBCLASS_BOOT) // Doesn't support boot protocol. return -1; // Find intr in endpoint. struct usb_endpoint_descriptor *epdesc = usb_find_desc( usbdev, USB_ENDPOINT_XFER_INT, USB_DIR_IN); if (!epdesc) { dprintf(1, "No usb hid intr in?\n"); return -1; } if (iface->bInterfaceProtocol == USB_INTERFACE_PROTOCOL_KEYBOARD) return usb_kbd_setup(usbdev, epdesc); if (iface->bInterfaceProtocol == USB_INTERFACE_PROTOCOL_MOUSE) return usb_mouse_setup(usbdev, epdesc); return -1; }