diff options
Diffstat (limited to 'usb.c')
-rw-r--r-- | usb.c | 64 |
1 files changed, 64 insertions, 0 deletions
@@ -0,0 +1,64 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <unistd.h> +#include <string.h> +#include <fcntl.h> +#include <errno.h> + +#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); +} |