Example #1
0
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;
}
Example #3
0
/*
 * 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;
}