static int gp_port_usb_find_device_lib(GPPort *port, int idvendor, int idproduct) { struct usb_bus *bus; struct usb_device *dev; char *s; char busname[64], devname[64]; if (!port) return (GP_ERROR_BAD_PARAMETERS); s = strchr (port->settings.usb.port,':'); busname[0] = devname[0] = '\0'; if (s && (s[1] != '\0')) { /* usb:%d,%d */ strncpy(busname,s+1,sizeof(busname)); busname[sizeof(busname)-1] = '\0'; s = strchr(busname,','); if (s) { strncpy(devname, s+1,sizeof(devname)); devname[sizeof(devname)-1] = '\0'; *s = '\0'; } else { busname[0] = '\0'; } } /* * NULL idvendor is not valid. * NULL idproduct is ok. * Should the USB layer report that ? I don't know. * Better to check here. */ if (!idvendor) { gp_port_set_error (port, _("The supplied vendor or product " "id (0x%x,0x%x) is not valid."), idvendor, idproduct); return GP_ERROR_BAD_PARAMETERS; } for (bus = usb_busses; bus; bus = bus->next) { if ((busname[0] != '\0') && strcmp(busname, bus->dirname)) continue; for (dev = bus->devices; dev; dev = dev->next) { if ( (devname[0] != '\0') && (dev->filename != strstr(dev->filename, devname)) ) continue; if ((dev->descriptor.idVendor == idvendor) && (dev->descriptor.idProduct == idproduct)) { int config = -1, interface = -1, altsetting = -1; port->pl->d = dev; gp_log (GP_LOG_VERBOSE, "gphoto2-port-usb", "Looking for USB device " "(vendor 0x%x, product 0x%x)... found.", idvendor, idproduct); /* Use the first config, interface and altsetting we find */ gp_port_usb_find_first_altsetting(dev, &config, &interface, &altsetting); /* Set the defaults */ if (dev->config) { int i; if (dev->config[config].interface[interface].altsetting[altsetting].bInterfaceClass == USB_CLASS_MASS_STORAGE) { gp_log (GP_LOG_VERBOSE, "gphoto2-port-usb", _("USB device (vendor 0x%x, product 0x%x) is a mass" " storage device, and might not function with gphoto2." " Reference: %s"), idvendor, idproduct, URL_USB_MASSSTORAGE); } 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_ep(dev, config, interface, altsetting, USB_ENDPOINT_IN, USB_ENDPOINT_TYPE_BULK); port->settings.usb.outep = gp_port_usb_find_ep(dev, config, interface, altsetting, USB_ENDPOINT_OUT, USB_ENDPOINT_TYPE_BULK); port->settings.usb.intep = gp_port_usb_find_ep(dev, config, interface, altsetting, USB_ENDPOINT_IN, USB_ENDPOINT_TYPE_INTERRUPT); port->settings.usb.maxpacketsize = 0; gp_log (GP_LOG_DEBUG, "gphoto2-port-usb", "inep to look for is %02x", port->settings.usb.inep); for (i=0;i<dev->config[config].interface[interface].altsetting[altsetting].bNumEndpoints;i++) { if (port->settings.usb.inep == dev->config[config].interface[interface].altsetting[altsetting].endpoint[i].bEndpointAddress) { port->settings.usb.maxpacketsize = dev->config[config].interface[interface].altsetting[altsetting].endpoint[i].wMaxPacketSize; break; } } gp_log (GP_LOG_VERBOSE, "gphoto2-port-usb", "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, dev->config[config].interface[interface].altsetting[altsetting].bInterfaceClass, dev->config[config].interface[interface].altsetting[altsetting].bInterfaceSubClass ); } 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; int d, busnr = 0, devnr = 0; 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) { devnr = 0; sscanf (s+1, "%d", &busnr); } } /* * 0x0000 idvendor is not valid. * 0x0000 idproduct is ok. * Should the USB layer report that ? I don't know. * Better to check here. */ if (!idvendor) { gp_port_set_error (port, _("The supplied vendor or product " "id (0x%x,0x%x) is not valid."), idvendor, idproduct); return GP_ERROR_BAD_PARAMETERS; } gp_nrofdevs = load_devicelist (port->pl->ctx); for (d = 0; d < gp_nrofdevs; d++) { struct libusb_config_descriptor *confdesc; int ret; int config = -1, interface = -1, altsetting = -1; if ((gp_descs[d].idVendor != idvendor) || (gp_descs[d].idProduct != idproduct)) continue; if (busnr && (busnr != libusb_get_bus_number (gp_devs[d]))) continue; if (devnr && (devnr != libusb_get_device_address (gp_devs[d]))) continue; port->pl->d = gp_devs[d]; gp_log (GP_LOG_VERBOSE, "libusb1", "Looking for USB device " "(vendor 0x%x, product 0x%x)... found.", idvendor, idproduct); /* Use the first config, interface and altsetting we find */ gp_port_usb_find_first_altsetting(gp_devs[d], &config, &interface, &altsetting); ret = libusb_get_config_descriptor (gp_devs[d], config, &confdesc); if (ret) continue; /* Set the defaults */ if (confdesc->interface[interface].altsetting[altsetting].bInterfaceClass == LIBUSB_CLASS_MASS_STORAGE) { gp_log (GP_LOG_VERBOSE, "libusb1", _("USB device (vendor 0x%x, product 0x%x) is a mass" " storage device, and might not function with gphoto2." " Reference: %s"), idvendor, idproduct, URL_USB_MASSSTORAGE); } 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(gp_devs[d], config, interface, altsetting, LIBUSB_ENDPOINT_IN, LIBUSB_TRANSFER_TYPE_BULK); port->settings.usb.outep = gp_port_usb_find_ep(gp_devs[d], config, interface, altsetting, LIBUSB_ENDPOINT_OUT, LIBUSB_TRANSFER_TYPE_BULK); port->settings.usb.intep = gp_port_usb_find_ep(gp_devs[d], config, interface, altsetting, LIBUSB_ENDPOINT_IN, LIBUSB_TRANSFER_TYPE_INTERRUPT); port->settings.usb.maxpacketsize = libusb_get_max_packet_size (gp_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_path_lib(GPPort *port) { char *s; int d, busnr = 0, devnr = 0; GPPortPrivateLibrary *pl; if (!port) return (GP_ERROR_BAD_PARAMETERS); pl = port->pl; 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; }