+void lsusb(struct usb_device *dev)
+{
+ printf("=== Device Descriptor === \n");
+ printf("bLength 0x%02X\n", dev->bLength);
+ printf("bDescriptorType 0x%02X\n", dev->bDeviceClass);
+ printf("bcdUSB 0x%04X\n", dev->bcdUSB);
+ printf("bDeviceClass 0x%02X\n", dev->bDeviceClass);
+ printf("bDeviceSubClass 0x%02X\n", dev->bDeviceSubClass);
+ printf("bDeviceProtocoll 0x%02X\n", dev->bDeviceProtocoll);
+ printf("bMaxPacketSize 0x%02X\n", dev->bMaxPacketSize0);
+ printf("idVendor 0x%04X\n", dev->idVendor);
+ printf("idProduct 0x%04X\n", dev->idProduct);
+ printf("bcdDevice 0x%04X\n", dev->bcdDevice);
+ printf("iManufacturer(0x%02X): \"%s\"\n", dev->iManufacturer, dev->iManufacturer ? usb_get_string_simple(dev, dev->iManufacturer) : "no String");
+ printf("iProduct(0x%02X): \"%s\"\n", dev->iProduct, dev->iProduct ? usb_get_string_simple(dev, dev->iProduct) : "no String");
+ printf("iSerialNumber(0x%02X): \"%s\"\n", dev->iSerialNumber, dev->iSerialNumber ? usb_get_string_simple(dev, dev->iSerialNumber) : "no String");
+ printf("bNumConfigurations 0x%02X\n", dev->bNumConfigurations);
+
+ u8 c, i, e;
+ struct usb_conf *conf = dev->conf;
+ for(c=0; c <= dev->bNumConfigurations; c++) {
+ printf(" === Configuration Descriptor %d ===\n", c+1);
+ printf(" bLength 0x%02X\n", conf->bLength);
+ printf(" bDescriptorType 0x%02X\n", conf->bDescriptorType);
+ printf(" wTotalLength 0x%04X\n", conf->wTotalLength);
+ printf(" bNumInterfaces 0x%02X\n", conf->bNumInterfaces);
+ printf(" bConfigurationValue 0x%02X\n", conf->bConfigurationValue);
+ printf(" iConfiguration (0x%02X): \"%s\"\n", conf->iConfiguration, conf->iConfiguration ? usb_get_string_simple(dev, conf->iConfiguration) : "no String");
+ printf(" bmAttributes 0x%02X\n", conf->bmAttributes);
+ printf(" bMaxPower 0x%02X\n", conf->bMaxPower);
+
+ struct usb_intf *ifs = conf->intf;
+ for(i=1; i <= conf->bNumInterfaces; i++) {
+ printf(" === Interface Descriptor %d ===\n", i);
+ printf(" bLength 0x%02X\n", ifs->bLength);
+ printf(" bDescriptorType 0x%02X\n", ifs->bDescriptorType);
+ printf(" bInterfaceNumber 0x%02X\n", ifs->bInterfaceNumber);
+ printf(" bAlternateSetting 0x%02X\n", ifs->bAlternateSetting);
+ printf(" bNumEndpoints 0x%02X\n", ifs->bNumEndpoints);
+ printf(" bInterfaceClass 0x%02X\n", ifs->bInterfaceClass);
+ printf(" bInterfaceSubClass 0x%02X\n", ifs->bInterfaceSubClass);
+ printf(" bInterfaceProtocol 0x%02X\n", ifs->bInterfaceProtocol);
+ printf(" iInterface (0x%02X): \"%s\"\n", ifs->iInterface, ifs->iInterface ? usb_get_string_simple(dev, ifs->iInterface) : "no String");
+
+ struct usb_endp *ed = ifs->endp;
+ for(e=1; e <= ifs->bNumEndpoints; e++) {
+ printf(" === Endpoint Descriptor %d ===\n", e);
+ printf(" bLength 0x%02X\n", ed->bLength);
+ printf(" bDescriptorType 0x%02X\n", ed->bDescriptorType);
+ printf(" bEndpointAddress 0x%02X\n", ed->bEndpointAddress);
+ printf(" bmAttributes 0x%02X\n", ed->bmAttributes);
+ printf(" wMaxPacketSize 0x%02X\n", ed->wMaxPacketSize);
+ printf(" bInterval 0x%02X\n", ed->bInterval);
+
+ ed = ed->next;
+ } //endpoint
+
+ ifs = ifs->next;
+ } //interface
+
+ conf = conf->next;
+ } //configuration
+}
+