testlibusb.c revision e9a683104ef3f40d38459c0ca62a2d46f20b0714
1/*
2 * testlibusb.c
3 *
4 *  Test suite program
5 */
6
7#include <stdio.h>
8#include <string.h>
9#include <usb.h>
10
11int verbose = 0;
12
13void print_endpoint(struct usb_endpoint_descriptor *endpoint)
14{
15  printf("      bEndpointAddress: %02xh\n", endpoint->bEndpointAddress);
16  printf("      bmAttributes:     %02xh\n", endpoint->bmAttributes);
17  printf("      wMaxPacketSize:   %d\n", endpoint->wMaxPacketSize);
18  printf("      bInterval:        %d\n", endpoint->bInterval);
19  printf("      bRefresh:         %d\n", endpoint->bRefresh);
20  printf("      bSynchAddress:    %d\n", endpoint->bSynchAddress);
21}
22
23void print_altsetting(struct usb_interface_descriptor *interface)
24{
25  int i;
26
27  printf("    bInterfaceNumber:   %d\n", interface->bInterfaceNumber);
28  printf("    bAlternateSetting:  %d\n", interface->bAlternateSetting);
29  printf("    bNumEndpoints:      %d\n", interface->bNumEndpoints);
30  printf("    bInterfaceClass:    %d\n", interface->bInterfaceClass);
31  printf("    bInterfaceSubClass: %d\n", interface->bInterfaceSubClass);
32  printf("    bInterfaceProtocol: %d\n", interface->bInterfaceProtocol);
33  printf("    iInterface:         %d\n", interface->iInterface);
34
35  for (i = 0; i < interface->bNumEndpoints; i++)
36    print_endpoint(&interface->endpoint[i]);
37}
38
39void print_interface(struct usb_interface *interface)
40{
41  int i;
42
43  for (i = 0; i < interface->num_altsetting; i++)
44    print_altsetting(&interface->altsetting[i]);
45}
46
47void print_configuration(struct usb_config_descriptor *config)
48{
49  int i;
50
51  printf("  wTotalLength:         %d\n", config->wTotalLength);
52  printf("  bNumInterfaces:       %d\n", config->bNumInterfaces);
53  printf("  bConfigurationValue:  %d\n", config->bConfigurationValue);
54  printf("  iConfiguration:       %d\n", config->iConfiguration);
55  printf("  bmAttributes:         %02xh\n", config->bmAttributes);
56  printf("  MaxPower:             %d\n", config->MaxPower);
57
58  for (i = 0; i < config->bNumInterfaces; i++)
59    print_interface(&config->interface[i]);
60}
61
62int print_device(struct usb_device *dev, int level)
63{
64  usb_dev_handle *udev;
65  char description[256];
66  char string[256];
67  int ret, i;
68
69  udev = usb_open(dev);
70  if (udev) {
71    if (dev->descriptor.iManufacturer) {
72      ret = usb_get_string_simple(udev, dev->descriptor.iManufacturer, string, sizeof(string));
73      if (ret > 0)
74        snprintf(description, sizeof(description), "%s - ", string);
75      else
76        snprintf(description, sizeof(description), "%04X - ",
77                 dev->descriptor.idVendor);
78    } else
79      snprintf(description, sizeof(description), "%04X - ",
80               dev->descriptor.idVendor);
81
82    if (dev->descriptor.iProduct) {
83      ret = usb_get_string_simple(udev, dev->descriptor.iProduct, string, sizeof(string));
84      if (ret > 0)
85        snprintf(description + strlen(description), sizeof(description) -
86                 strlen(description), "%s", string);
87      else
88        snprintf(description + strlen(description), sizeof(description) -
89                 strlen(description), "%04X", dev->descriptor.idProduct);
90    } else
91      snprintf(description + strlen(description), sizeof(description) -
92               strlen(description), "%04X", dev->descriptor.idProduct);
93
94  } else
95    snprintf(description, sizeof(description), "%04X - %04X",
96             dev->descriptor.idVendor, dev->descriptor.idProduct);
97
98  printf("%.*sDev #%d: %s\n", level * 2, "                    ", dev->devnum,
99         description);
100
101  if (udev && verbose) {
102    if (dev->descriptor.iSerialNumber) {
103      ret = usb_get_string_simple(udev, dev->descriptor.iSerialNumber, string, sizeof(string));
104      if (ret > 0)
105        printf("%.*s  - Serial Number: %s\n", level * 2,
106               "                    ", string);
107    }
108  }
109
110  if (udev)
111    usb_close(udev);
112
113  if (verbose) {
114    if (!dev->config) {
115      printf("  Couldn't retrieve descriptors\n");
116      return 0;
117    }
118
119    for (i = 0; i < dev->descriptor.bNumConfigurations; i++)
120      print_configuration(&dev->config[i]);
121  } else {
122    for (i = 0; i < dev->num_children; i++)
123      print_device(dev->children[i], level + 1);
124  }
125
126  return 0;
127}
128
129int main(int argc, char *argv[])
130{
131  struct usb_bus *bus;
132
133  if (argc > 1 && !strcmp(argv[1], "-v"))
134    verbose = 1;
135
136  usb_init();
137
138  usb_find_busses();
139  usb_find_devices();
140
141  for (bus = usb_busses; bus; bus = bus->next) {
142    if (bus->root_dev && !verbose)
143      print_device(bus->root_dev, 0);
144    else {
145      struct usb_device *dev;
146
147      for (dev = bus->devices; dev; dev = dev->next)
148        print_device(dev, 0);
149    }
150  }
151
152  return 0;
153}
154
155