int slogic_open(struct slogic_ctx *handle, int logic_index){ int err,i; size_t cnt; libusb_device **list; libusb_device *found = NULL; struct libusb_device_descriptor descriptor; cnt = libusb_get_device_list(handle->usb_context, &list); i = 0; if (cnt < 0) { log_printf( DEBUG, "Failed to get a list of devices\n"); return 0; } for (i = 0; i < cnt; i++) { libusb_device *device = list[i]; err = libusb_get_device_descriptor(device, &descriptor); if (err) { log_printf( DEBUG, "libusb_get_device_descriptor: %s\n", usbutil_error_to_string(err)); libusb_free_device_list(list, 1); return 0; } if ((descriptor.idVendor == USB_VENDOR_ID) && (descriptor.idProduct == USB_PRODUCT_ID)) { found = device; usbutil_dump_device_descriptor(&descriptor); break; } } if (!found) { log_printf( DEBUG, "Device not found\n"); libusb_free_device_list(list, 1); return 0; } if ((err = libusb_open(found, &handle->device_handle))) { log_printf( DEBUG, "Failed OPEN the device: %s\n", usbutil_error_to_string(err)); libusb_free_device_list(list, 1); return 0; } log_printf( DEBUG, "libusb_open: %s\n", usbutil_error_to_string(err)); if ((err = claim_device(handle->device_handle, 0)) != 0) { log_printf( DEBUG, "Failed to claim the usb interface: %s\n", usbutil_error_to_string(err)); libusb_free_device_list(list, 1); return 0; } if (!handle->device_handle) { log_printf( ERR, "Failed to open the device\n"); libusb_free_device_list(list, 1); return -1; } libusb_free_device_list(list, 1); handle->dev = libusb_get_device(handle->device_handle); handle->transfers = calloc(1,sizeof(struct logic_transfers) * handle->n_transfer_buffers); return 0; }
/* * Iterates over the usb devices on the usb busses and returns a handle to the * first device found that matches the predefined vendor and product id */ libusb_device_handle *open_device(libusb_context * ctx, int vendor_id, int product_id) { // discover devices libusb_device **list; libusb_device *found = NULL; libusb_device_handle *device_handle = NULL; struct libusb_device_descriptor descriptor; size_t cnt = libusb_get_device_list(ctx, &list); size_t i = 0; int err = 0; if (cnt < 0) { fprintf(stderr, "Failed to get a list of devices\n"); return NULL; } for (i = 0; i < cnt; i++) { libusb_device *device = list[i]; err = libusb_get_device_descriptor(device, &descriptor); if (err) { fprintf(stderr, "libusb_get_device_descriptor: %s\n", usbutil_error_to_string(err)); libusb_free_device_list(list, 1); return NULL; } if ((descriptor.idVendor == vendor_id) && (descriptor.idProduct == product_id)) { found = device; usbutil_dump_device_descriptor(stderr, &descriptor); break; } } if (!found) { fprintf(stderr, "Device not found\n"); libusb_free_device_list(list, 1); return NULL; } if ((err = libusb_open(found, &device_handle))) { fprintf(stderr, "Failed OPEN the device: %s\n", usbutil_error_to_string(err)); libusb_free_device_list(list, 1); return NULL; } fprintf(stderr, "libusb_open: %s\n", usbutil_error_to_string(err)); libusb_free_device_list(list, 1); if ((err = claim_device(device_handle, 0)) != 0) { fprintf(stderr, "Failed to claim the usb interface: %s\n", usbutil_error_to_string(err)); return NULL; } struct libusb_config_descriptor *config_descriptor; err = libusb_get_active_config_descriptor(found, &config_descriptor); if (err) { fprintf(stderr, "libusb_get_active_config_descriptor: %s\n", usbutil_error_to_string(err)); return NULL; } fprintf(stderr, "Active configuration:%d\n", config_descriptor->bConfigurationValue); libusb_free_config_descriptor(config_descriptor); fprintf(stderr, "Available configurations (%d):\n", descriptor.bNumConfigurations); for (i = 0; i < descriptor.bNumConfigurations; i++) { err = libusb_get_config_descriptor(found, i, &config_descriptor); if (err) { fprintf(stderr, "libusb_get_config_descriptor: %s\n", usbutil_error_to_string(err)); return NULL; } usbutil_dump_config_descriptor(stderr, config_descriptor); libusb_free_config_descriptor(config_descriptor); } return device_handle; }