summaryrefslogtreecommitdiff
path: root/libgphoto2_port
diff options
context:
space:
mode:
authorMarcus Meissner <marcus@jet.franken.de>2013-05-05 19:27:53 +0000
committerMarcus Meissner <marcus@jet.franken.de>2013-05-05 19:27:53 +0000
commitfb52149478f228c53dce6d71a9d40641c78998a6 (patch)
treec1b0ef578b2c07a4b2b36da4a105c4c4b1283f54 /libgphoto2_port
parentad503062b162f25ff03cb82448b2880d3a2e2097 (diff)
downloadlibgphoto2-fb52149478f228c53dce6d71a9d40641c78998a6.tar.gz
also allow port open with just device path
git-svn-id: https://svn.code.sf.net/p/gphoto/code/trunk/libgphoto2@14406 67ed7778-7388-44ab-90cf-0a291f65f57c
Diffstat (limited to 'libgphoto2_port')
-rw-r--r--libgphoto2_port/libusb1/libusb1.c90
1 files changed, 87 insertions, 3 deletions
diff --git a/libgphoto2_port/libusb1/libusb1.c b/libgphoto2_port/libusb1/libusb1.c
index d317d84fb..956f99d28 100644
--- a/libgphoto2_port/libusb1/libusb1.c
+++ b/libgphoto2_port/libusb1/libusb1.c
@@ -296,15 +296,22 @@ gp_port_usb_exit (GPPort *port)
return (GP_OK);
}
+static int gp_port_usb_find_path_lib(GPPort *port);
static int
gp_port_usb_open (GPPort *port)
{
int ret;
gp_log (GP_LOG_DEBUG,"libusb1","gp_port_usb_open()");
- if (!port || !port->pl->d)
+ if (!port)
return GP_ERROR_BAD_PARAMETERS;
+ if (!port->pl->d) {
+ gp_port_usb_find_path_lib(port);
+ if (!port->pl->d)
+ return GP_ERROR_BAD_PARAMETERS;
+ }
+
ret = libusb_open (port->pl->d, &port->pl->dh);
if (ret) {
gp_log (GP_LOG_ERROR, "libusb1", "libusb_open returned %d", ret);
@@ -599,13 +606,15 @@ gp_port_usb_update (GPPort *port)
if (!port)
return GP_ERROR_BAD_PARAMETERS;
- gp_log (GP_LOG_DEBUG, "libusb1", "gp_port_usb_update(old int=%d, conf=%d, alt=%d), (new int=%d, conf=%d, alt=%d)",
+ gp_log (GP_LOG_DEBUG, "libusb1", "gp_port_usb_update(old int=%d, conf=%d, alt=%d) port %s, (new int=%d, conf=%d, alt=%d) port %s",
port->settings.usb.interface,
port->settings.usb.config,
port->settings.usb.altsetting,
+ port->settings.usb.port,
port->settings_pending.usb.interface,
port->settings_pending.usb.config,
- port->settings_pending.usb.altsetting
+ port->settings_pending.usb.altsetting,
+ port->settings_pending.usb.port
);
/* do not overwrite it ... we need to set it.
@@ -781,6 +790,81 @@ gp_port_usb_find_first_altsetting(struct libusb_device *dev, int *config, int *i
}
static int
+gp_port_usb_find_path_lib(GPPort *port)
+{
+ char *s;
+ int d, busnr = 0, devnr = 0;
+ GPPortPrivateLibrary *pl = port->pl;
+
+ if (!port)
+ return (GP_ERROR_BAD_PARAMETERS);
+
+ s = strchr (port->settings.usb.port,':');
+ if (s && (s[1] != '\0')) { /* usb:%d,%d */
+ if (sscanf (s+1, "%d,%d", &busnr, &devnr) != 2)
+ return GP_ERROR_BAD_PARAMETERS;
+ } else {
+ return GP_ERROR_BAD_PARAMETERS;
+ }
+
+ pl->nrofdevs = load_devicelist (port->pl);
+
+ for (d = 0; d < pl->nrofdevs; d++) {
+ struct libusb_config_descriptor *confdesc;
+ int ret;
+ int config = -1, interface = -1, altsetting = -1;
+
+ if (busnr != libusb_get_bus_number (pl->devs[d]))
+ continue;
+ if (devnr != libusb_get_device_address (pl->devs[d]))
+ continue;
+
+ port->pl->d = pl->devs[d];
+
+ gp_log (GP_LOG_VERBOSE, "libusb1", "Found path %s", port->settings.usb.port);
+
+ /* Use the first config, interface and altsetting we find */
+ gp_port_usb_find_first_altsetting(pl->devs[d], &config, &interface, &altsetting);
+
+ ret = libusb_get_config_descriptor (pl->devs[d], config, &confdesc);
+ if (ret)
+ continue;
+
+ /* Set the defaults */
+ port->settings.usb.config = confdesc->bConfigurationValue;
+ port->settings.usb.interface = confdesc->interface[interface].altsetting[altsetting].bInterfaceNumber;
+ port->settings.usb.altsetting = confdesc->interface[interface].altsetting[altsetting].bAlternateSetting;
+
+ port->settings.usb.inep = gp_port_usb_find_ep(pl->devs[d], config, interface, altsetting, LIBUSB_ENDPOINT_IN, LIBUSB_TRANSFER_TYPE_BULK);
+ port->settings.usb.outep = gp_port_usb_find_ep(pl->devs[d], config, interface, altsetting, LIBUSB_ENDPOINT_OUT, LIBUSB_TRANSFER_TYPE_BULK);
+ port->settings.usb.intep = gp_port_usb_find_ep(pl->devs[d], config, interface, altsetting, LIBUSB_ENDPOINT_IN, LIBUSB_TRANSFER_TYPE_INTERRUPT);
+
+ port->settings.usb.maxpacketsize = libusb_get_max_packet_size (pl->devs[d], port->settings.usb.inep);
+ gp_log (GP_LOG_VERBOSE, "libusb1",
+ "Detected defaults: config %d, "
+ "interface %d, altsetting %d, "
+ "inep %02x, outep %02x, intep %02x, "
+ "class %02x, subclass %02x",
+ port->settings.usb.config,
+ port->settings.usb.interface,
+ port->settings.usb.altsetting,
+ port->settings.usb.inep,
+ port->settings.usb.outep,
+ port->settings.usb.intep,
+ confdesc->interface[interface].altsetting[altsetting].bInterfaceClass,
+ confdesc->interface[interface].altsetting[altsetting].bInterfaceSubClass
+ );
+ libusb_free_config_descriptor (confdesc);
+ return GP_OK;
+ }
+#if 0
+ gp_port_set_error (port, _("Could not find USB device "
+ "(vendor 0x%x, product 0x%x). Make sure this device "
+ "is connected to the computer."), idvendor, idproduct);
+#endif
+ return GP_ERROR_IO_USB_FIND;
+}
+static int
gp_port_usb_find_device_lib(GPPort *port, int idvendor, int idproduct)
{
char *s;