diff options
author | Johannes Erdfelt <johannes@erdfelt.com> | 2002-01-06 17:51:19 +0000 |
---|---|---|
committer | Johannes Erdfelt <johannes@erdfelt.com> | 2002-01-06 17:51:19 +0000 |
commit | 6e2a7c7417982fd118cde420f4d472990890f83f (patch) | |
tree | 63dbe0e8a8089bbbd0b08784f6666f6660b6fc7a /libgphoto2_port/usb | |
parent | d21418310e5426f2f8211995ccf2a330eb90f206 (diff) | |
download | libgphoto2-6e2a7c7417982fd118cde420f4d472990890f83f.tar.gz |
Make sure dev->config is not NULL before walking the descriptors
Search for the first config/interface/altsetting which actually has
endpoints
Specify the endpoints in stv0680
git-svn-id: https://svn.code.sf.net/p/gphoto/code/trunk/libgphoto2@3738 67ed7778-7388-44ab-90cf-0a291f65f57c
Diffstat (limited to 'libgphoto2_port/usb')
-rw-r--r-- | libgphoto2_port/usb/libusb.c | 61 |
1 files changed, 50 insertions, 11 deletions
diff --git a/libgphoto2_port/usb/libusb.c b/libgphoto2_port/usb/libusb.c index 4aee48223..c157b135c 100644 --- a/libgphoto2_port/usb/libusb.c +++ b/libgphoto2_port/usb/libusb.c @@ -316,9 +316,14 @@ gp_port_usb_update (GPPort *port) static int gp_port_usb_find_bulk(struct usb_device *dev, int config, int interface, int altsetting, int direction) { - struct usb_interface_descriptor *intf = &dev->config[config].interface[interface].altsetting[altsetting]; + struct usb_interface_descriptor *intf; int i; + if (!dev->config) + return -1; + + intf = &dev->config[config].interface[interface].altsetting[altsetting]; + for (i = 0; i < intf->bNumEndpoints; i++) { if ((intf->endpoint[i].bEndpointAddress & USB_ENDPOINT_DIR_MASK) == direction && (intf->endpoint[i].bmAttributes & USB_ENDPOINT_TYPE_MASK) == USB_ENDPOINT_TYPE_BULK) @@ -329,6 +334,28 @@ gp_port_usb_find_bulk(struct usb_device *dev, int config, int interface, int alt } static int +gp_port_usb_find_first_altsetting(struct usb_device *dev, int *config, int *interface, int *altsetting) +{ + int i, i1, i2; + + if (!dev->config) + return -1; + + for (i = 0; i < dev->descriptor.bNumConfigurations; i++) + for (i1 = 0; i1 < dev->config[i].bNumInterfaces; i1++) + for (i2 = 0; i2 < dev->config[i].interface[i1].num_altsetting; i2++) + if (dev->config[i].interface[i1].altsetting[i2].bNumEndpoints) { + *config = i; + *interface = i1; + *altsetting = i2; + + return 0; + } + + return -1; +} + +static int gp_port_usb_find_device_lib(GPPort *port, int idvendor, int idproduct) { struct usb_bus *bus; @@ -353,16 +380,23 @@ gp_port_usb_find_device_lib(GPPort *port, int idvendor, int idproduct) for (dev = bus->devices; dev; dev = dev->next) { if ((dev->descriptor.idVendor == idvendor) && (dev->descriptor.idProduct == idproduct)) { + int config, interface, altsetting; + port->pl->d = dev; /* Use the first config, interface and altsetting we find */ + gp_port_usb_find_first_altsetting(dev, &config, &interface, &altsetting); + /* Set the defaults */ - port->settings.usb.config = dev->config[0].bConfigurationValue; - port->settings.usb.interface = dev->config[0].interface[0].altsetting[0].bInterfaceNumber; - port->settings.usb.altsetting = dev->config[0].interface[0].altsetting[0].bAlternateSetting; + if (dev->config) { - port->settings.usb.inep = gp_port_usb_find_bulk(dev, 0, 0, 0, USB_ENDPOINT_IN); - port->settings.usb.outep = gp_port_usb_find_bulk(dev, 0, 0, 0, USB_ENDPOINT_OUT); + port->settings.usb.config = dev->config[config].bConfigurationValue; + port->settings.usb.interface = dev->config[config].interface[interface].altsetting[altsetting].bInterfaceNumber; + port->settings.usb.altsetting = dev->config[config].interface[interface].altsetting[altsetting].bAlternateSetting; + + port->settings.usb.inep = gp_port_usb_find_bulk(dev, config, interface, altsetting, USB_ENDPOINT_IN); + port->settings.usb.outep = gp_port_usb_find_bulk(dev, config, interface, altsetting, USB_ENDPOINT_OUT); + } port->pl->d = dev; @@ -393,6 +427,9 @@ gp_port_usb_match_device_by_class(struct usb_device *dev, int class, int subclas dev->descriptor.bDeviceProtocol == protocol)) return 1; + if (!dev->config) + return 0; + for (i = 0; i < dev->descriptor.bNumConfigurations; i++) { struct usb_config_descriptor *config = &dev->config[i]; @@ -450,12 +487,14 @@ gp_port_usb_find_device_by_class_lib(GPPort *port, int class, int subclass, int continue; /* Set the defaults */ - port->settings.usb.config = dev->config[config].bConfigurationValue; - port->settings.usb.interface = dev->config[config].interface[interface].altsetting[altsetting].bInterfaceNumber; - port->settings.usb.altsetting = dev->config[config].interface[interface].altsetting[altsetting].bAlternateSetting; + if (dev->config) { + port->settings.usb.config = dev->config[config].bConfigurationValue; + port->settings.usb.interface = dev->config[config].interface[interface].altsetting[altsetting].bInterfaceNumber; + port->settings.usb.altsetting = dev->config[config].interface[interface].altsetting[altsetting].bAlternateSetting; - port->settings.usb.inep = gp_port_usb_find_bulk(dev, config, interface, altsetting, USB_ENDPOINT_IN); - port->settings.usb.outep = gp_port_usb_find_bulk(dev, config, interface, altsetting, USB_ENDPOINT_OUT); + port->settings.usb.inep = gp_port_usb_find_bulk(dev, config, interface, altsetting, USB_ENDPOINT_IN); + port->settings.usb.outep = gp_port_usb_find_bulk(dev, config, interface, altsetting, USB_ENDPOINT_OUT); + } port->pl->d = dev; gp_log (GP_LOG_VERBOSE, "gphoto2-port-usb", |