API_EXPORTED usb_dev_handle *usb_open(struct usb_device *dev) { int r; usbi_dbg(""); usb_dev_handle *udev = malloc(sizeof(*udev)); if (!udev) return NULL; r = libusb_open((libusb_device *) dev->dev, &udev->handle); if (r < 0) { if (r == LIBUSB_ERROR_ACCESS) { usbi_info("Device open failed due to a permission denied error."); usbi_info("libusb requires write access to USB device nodes."); } usbi_err("could not open device, error %d", r); free(udev); errno = libusb_to_errno(r); return NULL; } udev->last_claimed_interface = -1; udev->device = dev; return udev; }
static int usbdevice_transmit(usb_dev_handle *device, unsigned char receive, unsigned char functionid, unsigned char send[4], unsigned char * buffer, int buffersize) #endif { int nbytes; #ifdef USE_LIBUSB_1_0 nbytes = libusb_control_transfer(device, (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | (receive << 7)) & 0xff, functionid & 0xff, ((send[1] << 8) | send[0]) & 0xffff, ((send[3] << 8) | send[2]) & 0xffff, (unsigned char *)buffer, buffersize & 0xffff, 5000); if(nbytes < 0){ fprintf(stderr, "%s: error: usbasp_transmit: %s\n", progname, strerror(libusb_to_errno(nbytes))); return -1; } #else nbytes = usb_control_msg(device, USB_TYPE_VENDOR | USB_RECIP_DEVICE | (receive << 7), functionid, (send[1] << 8) | send[0], (send[3] << 8) | send[2], (char *)buffer, buffersize, 5000); if(nbytes < 0){ fprintf(stderr, "%s: error: usbasp_transmit: %s\n", progname, usb_strerror()); return -1; } #endif return nbytes; }
/* * wrapper for usb_control_msg call */ static int usbasp_transmit(PROGRAMMER * pgm, unsigned char receive, unsigned char functionid, const unsigned char *send, unsigned char *buffer, int buffersize) { int nbytes; if (verbose > 3) { fprintf(stderr, "%s: usbasp_transmit(\"%s\", 0x%02x, 0x%02x, 0x%02x, 0x%02x)\n", progname, usbasp_get_funcname(functionid), send[0], send[1], send[2], send[3]); if (!receive && buffersize > 0) { int i; fprintf(stderr, "%s => ", progbuf); for (i = 0; i < buffersize; i++) fprintf(stderr, "[%02x] ", buffer[i]); fprintf(stderr, "\n"); } } #ifdef USE_LIBUSB_1_0 nbytes = libusb_control_transfer(PDATA(pgm)->usbhandle, (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | (receive << 7)) & 0xff, functionid & 0xff, ((send[1] << 8) | send[0]) & 0xffff, ((send[3] << 8) | send[2]) & 0xffff, (char *)buffer, buffersize & 0xffff, 5000); if(nbytes < 0){ fprintf(stderr, "%s: error: usbasp_transmit: %s\n", progname, strerror(libusb_to_errno(nbytes))); return -1; } #else nbytes = usb_control_msg(PDATA(pgm)->usbhandle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | (receive << 7), functionid, (send[1] << 8) | send[0], (send[3] << 8) | send[2], (char *)buffer, buffersize, 5000); if(nbytes < 0){ fprintf(stderr, "%s: error: usbasp_transmit: %s\n", progname, usb_strerror()); return -1; } #endif if (verbose > 3 && receive && nbytes > 0) { int i; fprintf(stderr, "%s<= ", progbuf); for (i = 0; i < nbytes; i++) fprintf(stderr, "[%02x] ", buffer[i]); fprintf(stderr, "\n"); } return nbytes; }
static int usbOpenDevice(libusb_device_handle **device, int vendor, char *vendorName, int product, char *productName) { libusb_device_handle *handle = NULL; int errorCode = USB_ERROR_NOTFOUND; static int didUsbInit = 0; int j; int r; if(!didUsbInit){ didUsbInit = 1; libusb_init(NULL); } libusb_device **dev_list; int dev_list_len = libusb_get_device_list(NULL, &dev_list); for (j=0; j<dev_list_len; ++j) { libusb_device *dev = dev_list[j]; struct libusb_device_descriptor descriptor; libusb_get_device_descriptor(dev, &descriptor); if (descriptor.idVendor == vendor && descriptor.idProduct == product) { char string[256]; /* we need to open the device in order to query strings */ r = libusb_open(dev, &handle); if (!handle) { errorCode = USB_ERROR_ACCESS; fprintf(stderr, "%s: Warning: cannot open USB device: %d %s\n", progname, r, strerror(libusb_to_errno(r))); continue; } if (vendorName == NULL && productName == NULL) { /* name does not matter */ break; } /* now check whether the names match: */ r = libusb_get_string_descriptor_ascii(handle, descriptor.iManufacturer & 0xff, (unsigned char *)string, sizeof(string)); if (r < 0) { errorCode = USB_ERROR_IO; fprintf(stderr, "%s: Warning: cannot query manufacturer for device: %s\n", progname, strerror(libusb_to_errno(r))); } else { errorCode = USB_ERROR_NOTFOUND; if (verbose > 1) fprintf(stderr, "%s: seen device from vendor ->%s<-\n", progname, string); if (strcmp(string, vendorName) == 0){ r = libusb_get_string_descriptor_ascii(handle, descriptor.iProduct & 0xff, (unsigned char *)string, sizeof(string)); if (r < 0) { errorCode = USB_ERROR_IO; fprintf(stderr, "%s: Warning: cannot query product for device: %s\n", progname, strerror(libusb_to_errno(r))); } else { errorCode = USB_ERROR_NOTFOUND; if (verbose > 1) fprintf(stderr, "%s: seen product ->%s<-\n", progname, string); if(strcmp(string, productName) == 0) break; } } } libusb_close(handle); handle = NULL; } } if (handle != NULL){ errorCode = 0; *device = handle; } return errorCode; }