#include #include #include #include #include #include #include #include "usb.h" static libusb_context *ctx; libusb_device *dev; libusb_device_handle *hdev; void find_device(char *name, unsigned int vendor, unsigned int device) { struct libusb_device_descriptor ddesc; libusb_device **devs = NULL; int rc, i, n; if (!ctx) { rc = libusb_init(&ctx); if (rc != 0) { fprintf(stderr, "libusb_init failed (%d)\n", rc); exit(1); } libusb_set_debug(ctx, LIBUSB_LOG_LEVEL_INFO); } n = libusb_get_device_list(ctx, &devs); for (i = 0; i < n; i++) { rc = libusb_get_device_descriptor(devs[i], &ddesc); if (rc != 0) { fprintf(stderr, "libusb_get_device_descriptor failed (%d)\n", rc); exit(1); } if (vendor != ddesc.idVendor) continue; if (device != ddesc.idProduct) continue; dev = devs[i]; fprintf(stderr, "%s found at %d:%d\n", name, libusb_get_bus_number(dev), libusb_get_device_address(dev)); libusb_free_device_list(devs, 1); rc = libusb_open(dev, &hdev); if (rc != 0) { fprintf(stderr, "libusb_open failed (%d)\n", rc); exit(1); } libusb_set_auto_detach_kernel_driver(hdev, 1); rc = libusb_claim_interface(hdev, 0); if (rc != 0) { fprintf(stderr, "libusb_claim_interface failed (%d)\n", rc); exit(1); } return; } fprintf(stderr, "%s not found\n", name); exit(1); }