blob: 38868fb6616d9e4408378eb83a54e88abaca5a88 [file] [log] [blame]
Harald Welte236caf62016-03-19 21:28:09 +01001#include <stdint.h>
2
3#include <libusb.h>
4
5/*! \brief obtain the endpoint addresses for a given USB interface */
6int get_usb_ep_addrs(libusb_device_handle *devh, unsigned int if_num,
7 uint8_t *out, uint8_t *in, uint8_t *irq)
8{
9 libusb_device *dev = libusb_get_device(devh);
10 struct libusb_config_descriptor *cdesc;
11 const struct libusb_interface_descriptor *idesc;
12 const struct libusb_interface *iface;
13 int rc, l;
14
15 rc = libusb_get_active_config_descriptor(dev, &cdesc);
16 if (rc < 0)
17 return rc;
18
19 iface = &cdesc->interface[if_num];
20 /* FIXME: we assume there's no altsetting */
21 idesc = &iface->altsetting[0];
22
23 for (l = 0; l < idesc->bNumEndpoints; l++) {
24 const struct libusb_endpoint_descriptor *edesc = &idesc->endpoint[l];
25 switch (edesc->bmAttributes & 3) {
26 case LIBUSB_TRANSFER_TYPE_BULK:
27 if (edesc->bEndpointAddress & 0x80) {
28 if (in)
29 *in = edesc->bEndpointAddress;
30 } else {
31 if (out)
32 *out = edesc->bEndpointAddress;
33 }
34 break;
35 case LIBUSB_TRANSFER_TYPE_INTERRUPT:
36 if (irq)
37 *irq = edesc->bEndpointAddress;
38 break;
39 default:
40 break;
41 }
42 }
43 return 0;
44}
45
46#if 0
47 struct libusb_device_descriptor ddesc;
48 int rc, i, j, k;
49
50 rc = libusb_get_device_descriptor(devh, &ddesc);
51 if (rc < 0)
52 return;
53
54 for (i = 0; i < ddesc.bNumConfigurations; i++) {
55 struct libusb_config_descriptor *cdesc;
56 rc = libusb_get_config_descriptor(devh, i, &cdesc);
57 if (rc < 0)
58 return;
59
60 for (j = 0; j < cdesc->bNumInterfaces; j++) {
61 const struct libusb_interface *iface = cdesc->interface[j];
62 for (k = 0; k < iface->num_altsetting; k++) {
63 const struct libusb_interface_descriptor *idesc = iface->altsetting[k];
64 /* make sure this is the interface we're looking for */
65 if (idesc->bInterfaceClass != 0xFF ||
66 idesc->bInterfaceSubClass != if_class ||
67 idsec->bInterfaceProtocol != if_proto)
68 continue;
69 /* FIXME */
70 }
71 }
72
73 libusb_free_config_descriptor(cdesc);
74 }
75#endif