+ unsigned int i;
+ int err;
+
+ if ((err = libusb_get_device_descriptor(dev, des))) {
+ sr_warn("failed to get device descriptor: %d", err);
+ return -1;
+ }
+
+ if (des->idVendor != USB_VENDOR)
+ return 0;
+
+ if (libusb_get_bus_number(dev) == (*sdi)->usb->bus
+ && libusb_get_device_address(dev) == (*sdi)->usb->address) {
+
+ for (i = 0; i < ARRAY_SIZE(zeroplus_models); i++) {
+ if (!(des->idProduct == zeroplus_models[i].pid))
+ continue;
+
+ sr_info("Found PID=%04X (%s)", des->idProduct,
+ zeroplus_models[i].model_name);
+ num_channels = zeroplus_models[i].channels;
+ memory_size = zeroplus_models[i].sample_depth * 1024;
+ break;
+ }
+
+ if (num_channels == 0) {
+ sr_warn("Unknown ZeroPlus device %04X", des->idProduct);
+ return -2;
+ }
+
+ /* Found it. */
+ if (!(err = libusb_open(dev, &((*sdi)->usb->devhdl)))) {
+ (*sdi)->status = SR_ST_ACTIVE;
+ sr_info("opened device %d on %d.%d interface %d",
+ (*sdi)->index, (*sdi)->usb->bus,
+ (*sdi)->usb->address, USB_INTERFACE);
+ } else {
+ sr_warn("failed to open device: %d", err);
+ *sdi = NULL;
+ }
+ }
+
+ return 0;
+}
+
+static struct sr_device_instance *zp_open_device(int device_index)
+{
+ struct sr_device_instance *sdi;