+ device_index = 0;
+
+ usb_devices = sr_usb_find(drvc->sr_ctx->libusb_ctx, USB_VID_PID);
+
+ if (usb_devices == NULL)
+ return NULL;
+
+ for (l = usb_devices; l; l = l->next) {
+ usb = l->data;
+
+ if ((ret = sl2_get_device_info(*usb, &dev_info)) < 0) {
+ sr_warn("Failed to get device information: %d.", ret);
+ sr_usb_dev_inst_free(usb);
+ continue;
+ }
+
+ if (!(devc = g_try_malloc(sizeof(struct dev_context)))) {
+ sr_err("Device instance malloc failed.");
+ sr_usb_dev_inst_free(usb);
+ continue;
+ }
+
+ if (!(devc->xfer_in = libusb_alloc_transfer(0))) {
+ sr_err("Transfer malloc failed.");
+ sr_usb_dev_inst_free(usb);
+ g_free(devc);
+ continue;
+ }
+
+ if (!(devc->xfer_out = libusb_alloc_transfer(0))) {
+ sr_err("Transfer malloc failed.");
+ sr_usb_dev_inst_free(usb);
+ libusb_free_transfer(devc->xfer_in);
+ g_free(devc);
+ continue;
+ }
+
+ fw_ver_str = g_strdup_printf("%u.%u", dev_info.fw_ver_major,
+ dev_info.fw_ver_minor);
+ if (!fw_ver_str) {
+ sr_err("Firmware string malloc failed.");
+ sr_usb_dev_inst_free(usb);
+ libusb_free_transfer(devc->xfer_in);
+ libusb_free_transfer(devc->xfer_out);
+ g_free(devc);
+ continue;
+ }
+
+ sdi = sr_dev_inst_new(device_index, SR_ST_INACTIVE, VENDOR_NAME,
+ MODEL_NAME, fw_ver_str);
+ g_free(fw_ver_str);
+ if (!sdi) {
+ sr_err("sr_dev_inst_new failed.");
+ sr_usb_dev_inst_free(usb);
+ libusb_free_transfer(devc->xfer_in);
+ libusb_free_transfer(devc->xfer_out);
+ g_free(devc);
+ continue;
+ }
+
+ sdi->priv = devc;
+ sdi->driver = di;
+ sdi->inst_type = SR_INST_USB;
+ sdi->conn = usb;
+
+ for (i = 0; channel_names[i]; i++) {
+ ch = sr_channel_new(i, SR_CHANNEL_LOGIC, TRUE,
+ channel_names[i]);
+ sdi->channels = g_slist_append(sdi->channels, ch);
+ devc->channels[i] = ch;
+ }
+
+ devc->state = STATE_IDLE;
+ devc->next_state = STATE_IDLE;
+
+ /* Set default samplerate. */
+ sl2_set_samplerate(sdi, DEFAULT_SAMPLERATE);
+
+ /* Set default capture ratio. */
+ devc->capture_ratio = 0;
+
+ /* Set default after trigger delay. */
+ devc->after_trigger_delay = 0;
+
+ memset(devc->xfer_buf_in, 0, LIBUSB_CONTROL_SETUP_SIZE +
+ PACKET_LENGTH);
+ memset(devc->xfer_buf_out, 0, LIBUSB_CONTROL_SETUP_SIZE +
+ PACKET_LENGTH);
+
+ libusb_fill_control_setup(devc->xfer_buf_in,
+ USB_REQUEST_TYPE_IN, USB_HID_GET_REPORT,
+ USB_HID_REPORT_TYPE_FEATURE, USB_INTERFACE,
+ PACKET_LENGTH);
+ libusb_fill_control_setup(devc->xfer_buf_out,
+ USB_REQUEST_TYPE_OUT, USB_HID_SET_REPORT,
+ USB_HID_REPORT_TYPE_FEATURE, USB_INTERFACE,
+ PACKET_LENGTH);
+
+ devc->xfer_data_in = devc->xfer_buf_in +
+ LIBUSB_CONTROL_SETUP_SIZE;
+ devc->xfer_data_out = devc->xfer_buf_out +
+ LIBUSB_CONTROL_SETUP_SIZE;
+
+ drvc->instances = g_slist_append(drvc->instances, sdi);
+ devices = g_slist_append(devices, sdi);
+
+ device_index++;
+ }