コード例 #1
0
void
_dump_dev_strings(libusb_device_handle *phDev,
              struct libusb_device_descriptor *pdDev,
              const char *pIndent)
{
    unsigned char pStr[256];
    int rc;

    memset(pStr, 0, sizeof(pStr));

    rc = libusb_get_string_descriptor_ascii(phDev, pdDev->iManufacturer, 
            pStr, sizeof(pStr));
    TRACE(2, "%sMFG'r string (index %d, len = %d) = '%s'\n",
          pIndent,
          pdDev->iManufacturer, rc, pStr);

    rc = libusb_get_string_descriptor_ascii(phDev, pdDev->iProduct, 
            pStr, sizeof(pStr));
    TRACE(2, "%sProduct string (index %d, len = %d) = '%s'\n",
          pIndent,
          pdDev->iProduct, rc, pStr);

    rc = libusb_get_string_descriptor_ascii(phDev, pdDev->iSerialNumber, 
            pStr, sizeof(pStr));
    TRACE(2, "%sProduct serial number (index %d, len = %d) = '%s'\n",
          pIndent,
          pdDev->iSerialNumber, rc, pStr);
}
コード例 #2
0
ファイル: bft.c プロジェクト: encrypt94/big-friendly-button
libusb_device_handle* open_device(int vid, char *vendor_name, int pid, char *product_name)
{
  libusb_device **devices;
  libusb_device *device;
  libusb_device_handle *handle = NULL;
  struct libusb_device_descriptor desc;
  bool found = false;
  unsigned char device_vendor_name[256], device_product_name[256];
  int i = 0;

  libusb_init(NULL);
  libusb_get_device_list(NULL, &devices);
  
  while((device = devices[i++]) != NULL) {
    if(libusb_get_device_descriptor(device, &desc) < 0) {
      fprintf(stderr, "Warning: Failed to get device descriptor");
      continue;
    }
    if(desc.idVendor == vid && desc.idProduct == pid) {
      if(libusb_open(device, &handle) < 0) {
	fprintf(stderr, "Warning: cannot open usb device\n");
	continue;
      }
      // Get Vendor name from device
      if(libusb_get_string_descriptor_ascii(handle,
					    desc.iManufacturer,
					    device_vendor_name,
					    sizeof(device_vendor_name)) < 0 ) {
	fprintf(stderr, "Warning: cannot get vendor name\n");
	libusb_close(handle);
	continue;
      }
      // Get Device name
      if(libusb_get_string_descriptor_ascii(handle,
					    desc.iProduct,
					    device_product_name,
					    sizeof(device_product_name)) < 0) {
	fprintf(stderr, "Warning: cannot get vendor name\n");
	libusb_close(handle);
	continue;
      }
      if( strcmp(vendor_name, (char*) device_vendor_name) == 0 &&
          strcmp(product_name, (char*) device_product_name) == 0) {
	found = true;
	break;
      }
      else {
	libusb_close(handle);
      }
    }
  }
  libusb_free_device_list(devices, 1);
  if(found) {
    return handle;
  }
  else {
    return NULL;
  }
}
コード例 #3
0
int EnttecDMXDevice::open()
{
    libusb_device_descriptor dd;
    int r = libusb_get_device_descriptor(mDevice, &dd);
    if (r < 0) {
        return r;
    }

    r = libusb_open(mDevice, &mHandle);
    if (r < 0) {
        return r;
    }

    /*
     * Match the manufacturer and product strings! This is the least intrusive way to
     * determine that the attached device is in fact an Enttec DMX USB Pro, since it doesn't
     * have a unique vendor/product ID.
     */

    if (dd.iManufacturer && dd.iProduct && dd.iSerialNumber) {
        char manufacturer[256];
        char product[256];

        r = libusb_get_string_descriptor_ascii(mHandle, dd.iManufacturer, (uint8_t*)manufacturer, sizeof manufacturer);
        if (r < 0) {
            return r;
        }
        r = libusb_get_string_descriptor_ascii(mHandle, dd.iProduct, (uint8_t*)product, sizeof product);
        if (r < 0) {
            return r;
        }

        mFoundEnttecStrings = !strcmp(manufacturer, "ENTTEC") && !strcmp(product, "DMX USB PRO");
    }

    /*
     * Only go further if we have in fact found evidence that this is the right device.
     */

    if (mFoundEnttecStrings) {

        // Only relevant on linux; try to detach the FTDI driver.
        libusb_detach_kernel_driver(mHandle, 0);

        r = libusb_claim_interface(mHandle, 0);
        if (r < 0) {
            return r;
        }

        r = libusb_get_string_descriptor_ascii(mHandle, dd.iSerialNumber,
            (uint8_t*)mSerialBuffer, sizeof mSerialBuffer);
        if (r < 0) {
            return r;
        }
    }

    return 0;
}
コード例 #4
0
std::vector<DeviceInfo> UsbHandler::get_device_list ()
{
    libusb_device** devs;

    int cnt = libusb_get_device_list(this->session->get_session(), &devs);

    if (cnt < 0)
    {
        throw std::runtime_error("Unable to retrieve device list. " + std::to_string(cnt));
    }

    std::vector<DeviceInfo> ret;
    ret.reserve(5);

    for (ssize_t i = 0; i < cnt; i++)
    {
        libusb_device_descriptor desc;
        int r = libusb_get_device_descriptor(devs[i], &desc);
        if (r < 0)
        {
            throw std::runtime_error("Unable to retrieve device descriptor. " + std::to_string(cnt));
        }

        // ignore all devices that are not from TIS or otherwise needed
        if (desc.idVendor != 0x199e)
            continue;

        if (desc.idProduct != 0x8209 && desc.idProduct != 0x0804)
            continue;

        tcam_device_info d = { };

        d.type = TCAM_DEVICE_TYPE_LIBUSB;

        libusb_device_handle* dh;
        r = libusb_open(devs[i], &dh);

        if (r < 0)
        {
            tcam_log(TCAM_LOG_ERROR, "Unable to open device.");
            continue;
        }

        snprintf((char*)d.additional_identifier, sizeof(d.additional_identifier),
                 "%x", desc.idProduct);

        libusb_get_string_descriptor_ascii(dh, desc.iProduct, (unsigned char*)d.name, sizeof(d.name));
        libusb_get_string_descriptor_ascii(dh, desc.iSerialNumber, (unsigned char*)d.serial_number, sizeof(d.serial_number));

        libusb_close(dh);
        ret.push_back(DeviceInfo(d));
    }

    libusb_free_device_list(devs, 1);

    return ret;
}
コード例 #5
0
ファイル: uvc-controller.c プロジェクト: chubahowsmall/tub
int list_usb_devices(int dbg)
{
	int i, n, cams = 0;
	struct uviface *uvi;
	libusb_device **uds;
	struct libusb_device_descriptor udd;
	unsigned char buf[BUFSZ];

	/* context, ***list */
	if((n = libusb_get_device_list(ctx, &uds)) < 0)
	{
		perror("Could not retrive devcice list");
		return n;
	}
	if(dbg) printf("N\tVendor:Prod\tBus:Addr\tIface\tManufacturer\n"
					"\t\t\t\t\t\tProduct\n\t\t\t\t\t\tSN\n\n");
	for(i = 0; i < n; i++)
	{
		if((uvi = open_uvi_index(i)) == NULL) continue;
		else cams++;

		if(libusb_get_device_descriptor(uds[i], &udd) != 0)
		{
			perror("Could not get device descriptor");
			close_uvi(uvi);
			continue;
		}
		printf("%d\t%04x:%04x\t%02d:%02d\t\t%d\t", i,
				udd.idVendor, udd.idProduct,
				libusb_get_bus_number(uds[i]),
				libusb_get_device_address(uds[i]),
				uvi->iface);
		/* args: handle, desc_index, buf, sizeof(buf) */
		if(libusb_get_string_descriptor_ascii(uvi->udh,
			udd.iManufacturer, buf, BUFSZ) < 1)
			strcpy((char *)&buf, DESC_ERR);
		printf("%s\n", buf);

		if(libusb_get_string_descriptor_ascii(uvi->udh,
			udd.iProduct, buf, BUFSZ) < 1)
			strcpy((char *)&buf, DESC_ERR);
		printf("\t\t\t\t\t\t%s\n", buf);

		if(libusb_get_string_descriptor_ascii(uvi->udh,
			udd.iSerialNumber, buf, BUFSZ) < 1)
			strcpy((char *)&buf, DESC_ERR);
		printf("\t\t\t\t\t\t%s\n\n", buf);
		close_uvi(uvi);
	}
	/* **list, unref devices with int */
	libusb_free_device_list(uds, 1);

	if(dbg) printf("summary: %d devices found, %d are video devices.\n",
					n, cams);
	return 0;
}
コード例 #6
0
ファイル: list_smargo.c プロジェクト: IgorWallacy/oscam-nx111
static void smartreader_check_endpoint(libusb_device *usb_dev, libusb_device_handle *handle)
{
	struct libusb_device_descriptor usbdesc;
	struct libusb_config_descriptor *configDesc;
	int32_t ret;
	int32_t j,k,l;
	uint32_t m;
	uint8_t tmpEndpointAddress;
	int32_t nb_endpoint_ok;
	int32_t busid, devid;
  unsigned char iserialbuffer[128], iproductbuffer[128];
  char *productptr = (char *)iproductbuffer;
	
	nb_endpoint_ok=0;
	
	ret = libusb_get_device_descriptor(usb_dev, &usbdesc);
	if (ret < 0) {
		printf("Smartreader : couldn't read device descriptor, assuming this is not a smartreader");
		return;
	}
	if (usbdesc.bNumConfigurations) {
		ret=libusb_get_active_config_descriptor(usb_dev,&configDesc);
		if(ret) {
			printf("Smartreader : couldn't read config descriptor , assuming this is not a smartreader");
			return;
		}
		for(m = 0; m < sizeof(reader_types)/sizeof(struct s_reader_types); ++m){
			nb_endpoint_ok = 0;
			for(j=0; j<configDesc->bNumInterfaces; j++) {
				for(k=0; k<configDesc->interface[j].num_altsetting; k++) {
					for(l=0; l<configDesc->interface[j].altsetting[k].bNumEndpoints; l++) {
						tmpEndpointAddress=configDesc->interface[j].altsetting[k].endpoint[l].bEndpointAddress;
						if((tmpEndpointAddress == reader_types[m].in_ep || tmpEndpointAddress == reader_types[m].out_ep)){
							nb_endpoint_ok++;
						}
					}
				}
			}
			if(nb_endpoint_ok == 2){
				busid=libusb_get_bus_number(usb_dev);
        devid=libusb_get_device_address(usb_dev);
        memset(iserialbuffer, 0, sizeof(iserialbuffer));
        memset(iproductbuffer, 0, sizeof(iproductbuffer));
        libusb_get_string_descriptor_ascii(handle,usbdesc.iSerialNumber,iserialbuffer,sizeof(iserialbuffer));
        libusb_get_string_descriptor_ascii(handle,usbdesc.iProduct,iproductbuffer,sizeof(iproductbuffer));
        printf("bus %03d, device %03d : %04x:%04x %s (type=%s, in_ep=%02x, out_ep=%02x; insert in oscam.server 'device = %s%sSerial:%s')\n",
        	busid, devid,
        	usbdesc.idVendor, usbdesc.idProduct, strlen(productptr)>0?productptr:"Smartreader",
        	reader_types[m].name, reader_types[m].in_ep, reader_types[m].out_ep,
        	strcmp(reader_types[m].name, "SR")?reader_types[m].name:"",strcmp(reader_types[m].name, "SR")?";":"", iserialbuffer
        );
      }
		}
	}
}
コード例 #7
0
ファイル: ListEnum.c プロジェクト: noritan/ListEnum
int main(int ac, char **av) {
	libusb_context *context;
	libusb_device **devices;
	struct libusb_device_descriptor device_desc;
	int status;
	int i;
	unsigned char manufacturer[128];
	unsigned char product[128];
	int length;
	libusb_device_handle *handle;

	status = libusb_init(&context);
	if (status) {
		printf ("libusb_init: failed with code=%s\n", libusb_error_name(status));
		return 0;
	}
	int nDevices = libusb_get_device_list(context, &devices);
	if (status < 0) {
		printf ("libusb_get_device_list: failed with code=%d\n", status);
	} else {
		for (i = 0; i < nDevices; i++) {
			libusb_device *device = devices[i];
			status = libusb_get_device_descriptor(device, &device_desc);
			if (status) {
				printf ("libusb_get_device_descriptor: failed with code=%s\n", libusb_error_name(status));
			} else {
				printf ("VID=%04X/PID=%04X  ", device_desc.idVendor, device_desc.idProduct);
				status = libusb_open(device, &handle);
				if (status < 0) {
					printf ("libusb_open: failed with code=%s\n", libusb_error_name(status));
				} else {
					length = libusb_get_string_descriptor_ascii(handle, device_desc.iManufacturer, manufacturer, sizeof manufacturer - 2);
					if (length < 0) {
						printf ("libusb_get_string_descriptor_ascii: failed with code=%s\n", libusb_error_name(length));
					} else {
						manufacturer[length] = 0;
						printf ("%s  ", manufacturer);
					}
					length = libusb_get_string_descriptor_ascii(handle, device_desc.iProduct, product, sizeof product - 2);
					if (length < 0) {
						printf ("libusb_get_string_descriptor_ascii: failed with code=%s\n", libusb_error_name(length));
					} else {
						product[length] = 0;
						printf ("%s  ", product);
					}
					libusb_close(handle);
				}
				printf ("\n");
			}
		}
		libusb_free_device_list(devices, 1);
	}
	libusb_exit(context);
	return (0);
}
コード例 #8
0
ファイル: UsbHandler.cpp プロジェクト: mtmEngg00/tiscamera
std::vector<device_info> UsbHandler::get_device_list ()
{
    libusb_device** devs;

    int cnt = libusb_get_device_list(this->session->get_session(), &devs);
    
    if (cnt < 0)
    {
        throw std::runtime_error("Unable to retrieve device list. " + std::to_string(cnt));
    }

    std::vector<device_info> ret;
    ret.reserve(20);
    
    for (ssize_t i = 0; i < cnt; i++)
    {
        libusb_device_descriptor desc;
        int r = libusb_get_device_descriptor(devs[i], &desc);
        if (r < 0)
        {
            throw std::runtime_error("Unable to retrieve device descriptor. " + std::to_string(cnt));
        }

        // ignore all devices that are not from TIS or otherwise needed
        if (desc.idVendor != 0x199e && desc.idVendor != 0xeb1a && desc.idVendor != 0x04b4)
            continue;

        device_info d = { 0 };
        d.idVendor = desc.idVendor;
        d.idProduct = desc.idProduct;

        libusb_device_handle* dh;
        r = libusb_open(devs[i], &dh);

        if (r < 0)
        {
            throw std::runtime_error("Unable to open device.");
        }
        
        // TODO find alternative to root requirements
        libusb_get_string_descriptor_ascii(dh, desc.iProduct, (unsigned char*)d.product, sizeof(d.product));
        libusb_get_string_descriptor_ascii(dh, desc.iSerialNumber, (unsigned char*)d.serial, sizeof(d.serial));

        libusb_close(dh);
        ret.push_back(d);
    }

    libusb_free_device_list(devs, 1);
    
    return ret;
}
コード例 #9
0
ファイル: vrpn_libusb.cpp プロジェクト: CalVR/calvr
void vrpn_libusb::printDevices(libusb_device ** list)
{
    libusb_device * dev;

    int i = 0;

    while((dev = list[i++]) != NULL)
    {
	libusb_device_descriptor desc;
	if(libusb_get_device_descriptor(dev, &desc) < 0)
	{
	    std::cerr << "Error getting device descriptor for usb device " << i-1 << std::endl;
	    continue;
	}

	libusb_device_handle * handle;
	if(libusb_open(dev, &handle) < 0)
	{
	    std::cerr << "Error opening device " << i-1 << std::endl;
	    continue;
	}

	unsigned char buffer[255];

	std::cerr << "Device: " << i-1 << std::endl;

	if(desc.iManufacturer)
	{
	    libusb_get_string_descriptor_ascii(handle, desc.iManufacturer, buffer, 255);
	    std::cerr << "Manufacturer: " << buffer  << std::endl;
	}

	if(desc.iProduct)
	{
	    libusb_get_string_descriptor_ascii(handle, desc.iProduct, buffer, 255);
	    std::cerr << "Product: " << buffer  << std::endl;
	}

	if(desc.iSerialNumber)
	{
	    libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, buffer, 255);
	    std::cerr << "Serial Number: " << buffer  << std::endl;
	}

	std::cerr << "VendorID: " << desc.idVendor << std::endl;
	std::cerr << "ProductID: " << desc.idProduct << std::endl;
	std::cerr << std::endl;

	libusb_close(handle);
    } 
}
コード例 #10
0
int usb_get_device_name(libusb_device_handle *device_handle, char *name, int length) {
	int rc;
	libusb_device *device = libusb_get_device(device_handle);
	uint8_t bus_number = libusb_get_bus_number(device);
	uint8_t device_address = libusb_get_device_address(device);
	struct libusb_device_descriptor descriptor;
	char product[64];
	char serial_number[64];

	// get device descriptor
	rc = libusb_get_device_descriptor(device, &descriptor);

	if (rc < 0) {
		log_error("Could not get device descriptor for USB device (bus: %u, device: %u): %s (%d)",
		          bus_number, device_address, usb_get_error_name(rc), rc);

		return -1;
	}

	// get product string descriptor
	rc = libusb_get_string_descriptor_ascii(device_handle,
	                                        descriptor.iProduct,
	                                        (unsigned char *)product,
	                                        sizeof(product));

	if (rc < 0) {
		log_error("Could not get product string descriptor for USB device (bus: %u, device: %u): %s (%d)",
		          bus_number, device_address, usb_get_error_name(rc), rc);

		return -1;
	}

	// get serial number string descriptor
	rc = libusb_get_string_descriptor_ascii(device_handle,
	                                        descriptor.iSerialNumber,
	                                        (unsigned char *)serial_number,
	                                        sizeof(serial_number));

	if (rc < 0) {
		log_error("Could not get serial number string descriptor for USB device (bus: %u, device: %u): %s (%d)",
		          bus_number, device_address, usb_get_error_name(rc), rc);

		return -1;
	}

	// format name
	snprintf(name, length, "%s [%s]", product, serial_number);

	return 0;
}
コード例 #11
0
ファイル: link_usb1.c プロジェクト: TC01/tilibs
static void tigl_get_product(char * string, size_t maxlen, struct libusb_device *dev)
{
	libusb_device_handle *han;
	int ret;
	struct libusb_device_descriptor desc;
	int r = libusb_get_device_descriptor(dev, &desc);

	string[0] = 0;

	if (r < 0)
	{
		ticables_critical("failed to get device descriptor");
	}

	if (desc.iProduct)
	{
		if (!libusb_open(dev, &han))
		{
			ret = libusb_get_string_descriptor_ascii(han, desc.iProduct, (unsigned char *) string, maxlen);
			libusb_close(han);
			if (ret <= 0)
			{
				ticables_warning("libusb_get_string_descriptor_ascii (%s).\n", tigl_strerror(ret));
			}
		}
		// else do nothing.
	}
}
コード例 #12
0
void IntersonManagerTest::printDevices(libusb_device ** deviceList)
{
  libusb_device *dev;
  int i = 0, j = 0;
  uint8_t path[8];
  uint8_t string_index[3];	// indexes of the string descriptors
  char string[128];

  while ((dev = deviceList[i]) != NULL)
  {
    printf("\n");
    struct libusb_device_descriptor desc;
    int r = libusb_get_device_descriptor(dev, &desc);
    if (r < 0)
    {
      fprintf(stderr, "failed to get device descriptor");
      return;
    }

    string_index[0] = desc.iManufacturer;
    string_index[1] = desc.iProduct;
    string_index[2] = desc.iSerialNumber;
    printf("%04x:%04x (bus %d, device %d)",
           desc.idVendor, desc.idProduct,
           libusb_get_bus_number(dev), libusb_get_device_address(dev));

    r = libusb_get_port_numbers(dev, path, sizeof(path));
    if (r > 0) {
      printf(" path: %d", path[0]);
      for (j = 1; j < r; j++)
        printf(".%d", path[j]);
    }
    printf("\n");

    libusb_device_handle *handle;
    r = libusb_open(dev, &handle);

    if(r == LIBUSB_ERROR_ACCESS)
    {
      std::cout<<" Insufficient permission"<<std::endl;
    }

    if (r == 0 && handle != NULL)
    {
      for (int k = 0; k < 3; k++)
      {
        if (string_index[k] == 0)
        {
          continue;
        }
        if (libusb_get_string_descriptor_ascii(handle, string_index[k], (unsigned char *) string, 128) >= 0)
        {
          printf("String Desc(0x%02X): \"%s\"\n", string_index[k], string);
        }
      }
      libusb_close(handle);
    }
    i++;
  }
}
コード例 #13
0
int CNIF_USB_CmpSerialNum(const char *serial)
{
	int ret = 0;
	int length = 0;
	char tmp_serial[CN_DEVICE_ID_LEN];
	struct libusb_device_descriptor devdesc;
	
	ret = libusb_get_device_descriptor(g_device, &devdesc);
	if(ret < 0) {
#ifdef _DEBUG_MODE_
		fprintf(stderr, "ERROR: get device descriptor was failed\n");
#endif
		return CN_USB_WRITE_ERROR;
	}
	length = libusb_get_string_descriptor_ascii(g_dh, devdesc.iSerialNumber,
											 (unsigned char *)tmp_serial,
											 sizeof(tmp_serial) - 1);
	if(length > 0) {
		tmp_serial[length] = '\0';
	}
	
#ifdef _DEBUG_MODE_
	fprintf(stderr, "DEBUG: get_serialNum = %s, know serialnum = %s\n", tmp_serial, serial);
#endif

	if(strncmp(tmp_serial, serial, length)){
		return CN_USB_WRITE_ERROR;
	}
#ifdef _DEBUG_MODE_
	fprintf(stderr, "DEBUG: the same serial number\n");
#endif

	return 0;
}
コード例 #14
0
ファイル: dfu_util.c プロジェクト: imeas/dfu-util
/* Retrieves alternate interface name string.
 * Returns string length, or negative on error */
int get_alt_name(struct dfu_if *dfu_if, unsigned char *name)
{
	libusb_device *dev = dfu_if->dev;
	struct libusb_config_descriptor *cfg;
	int alt_name_str_idx;
	int ret;

	ret = libusb_get_config_descriptor_by_value(dev, dfu_if->configuration,
						    &cfg);
	if (ret)
		return ret;

	alt_name_str_idx = cfg->interface[dfu_if->interface].
			       altsetting[dfu_if->altsetting].iInterface;
	ret = -1;
	if (alt_name_str_idx) {
		if (!dfu_if->dev_handle)
			if (libusb_open(dfu_if->dev, &dfu_if->dev_handle))
				dfu_if->dev_handle = NULL;
		if (dfu_if->dev_handle)
			ret = libusb_get_string_descriptor_ascii(
					dfu_if->dev_handle, alt_name_str_idx,
					name, MAX_DESC_STR_LEN);
	}
	libusb_free_config_descriptor(cfg);
	return ret;
}
コード例 #15
0
ファイル: libirecovery.c プロジェクト: EricSB/idevicerestore
int irecv_get_string_descriptor_ascii(irecv_client_t client, uint8_t desc_index, unsigned char * buffer, int size) {
#ifndef WIN32
	return libusb_get_string_descriptor_ascii(client->handle, desc_index, buffer, size);
#else
	irecv_error_t ret;
	unsigned short langid = 0;
	unsigned char data[255];
	int di, si;
	memset(data, 0, sizeof(data));
	memset(buffer, 0, size);

	ret = irecv_control_transfer(client, 0x80, 0x06, (0x03 << 8) | desc_index, langid, data, sizeof(data), 1000);
	
	if (ret < 0) return ret;
	if (data[1] != 0x03) return IRECV_E_UNKNOWN_ERROR;
	if (data[0] > ret) return IRECV_E_UNKNOWN_ERROR; 

	for (di = 0, si = 2; si < data[0]; si += 2) {
		if (di >= (size - 1)) break;
		if (data[si + 1]) {
			/* high byte */
			buffer[di++] = '?';
        } else {
            buffer[di++] = data[si];
		}
	}
	buffer[di] = 0;
	
	return di;
#endif
}
コード例 #16
0
ファイル: usb.c プロジェクト: GalliumOS/cups-filters
static int is_our_device(libusb_device *dev,
                         struct libusb_device_descriptor desc)
{
	static const int SERIAL_MAX = 1024;
	unsigned char serial[1024];
	if ((g_options.vendor_id  && desc.idVendor  != g_options.vendor_id)  &&
	    (g_options.product_id && desc.idProduct != g_options.product_id))
		return 0;

	if (g_options.serial_num == NULL)
		return 1;

	libusb_device_handle *handle = NULL;
	int status = libusb_open(dev, &handle);
	if (status != 0)
		return 0;

	status = libusb_get_string_descriptor_ascii(handle,
			desc.iSerialNumber, serial, SERIAL_MAX);
	libusb_close(handle);

	if (status <= 0) {
		WARN("Failed to get serial from device");
		return 0;
	}

	return strcmp((char *)serial, (char *)g_options.serial_num) == 0;
}
コード例 #17
0
void listUsbDeviceMatches(const unsigned short vid, const unsigned short pid)
{
    libusb_device **devices;
    ssize_t numDevices = libusb_get_device_list(NULL, &devices);
    ssize_t i = 0;

    for (i = 0; i < numDevices; i++) {
        struct libusb_device_descriptor descriptor;
        if (0 == libusb_get_device_descriptor(devices[i], &descriptor)) {
            if (vid == descriptor.idVendor && pid == descriptor.idProduct) {
                libusb_device_handle *handle;
                if (0 == libusb_open(devices[i], &handle)) {
                    char usbSerial[64];
                    if (0 == descriptor.iSerialNumber || 
                        0 == libusb_get_string_descriptor_ascii(handle, descriptor.iSerialNumber, (unsigned char *)usbSerial, sizeof(usbSerial)))
                        usbSerial[0] = '\0';
  
                    fprintf(stderr, "USB device pid/vid match: vid=0x%04x pid=0x%04x serial='%s'\n", descriptor.idVendor, descriptor.idProduct, usbSerial);
                    libusb_close(handle);
                }
            }
        }
    }
    libusb_free_device_list(devices, 1);
}
コード例 #18
0
ファイル: libusb1_common.c プロジェクト: trichner/openocd
/* Returns true if the string descriptor indexed by str_index in device matches string */
static bool string_descriptor_equal(libusb_device_handle *device, uint8_t str_index,
									const char *string)
{
	int retval;
	bool matched;
	const int DESC_SIZE = 256;
	char desc_string[DESC_SIZE+1]; /* Max size of string descriptor */

	if (str_index == 0)
		return false;

	retval = libusb_get_string_descriptor_ascii(device, str_index,
			(unsigned char *)desc_string, sizeof(desc_string)-1);
	if (retval < 0) {
		LOG_ERROR("libusb_get_string_descriptor_ascii() failed with %d", retval);
		return false;
	}

	/* Null terminate descriptor string in case it needs to be logged. */
	desc_string[sizeof(desc_string)-1] = '\0';

	matched = strncmp(string, desc_string, sizeof(desc_string)) == 0;
	if (!matched){
		char desc_hex[DESC_SIZE*2+1];
		string_to_hexstring(desc_hex,desc_string);

		char req_hex[DESC_SIZE*2+1];
		string_to_hexstring(req_hex,string);

		LOG_DEBUG("Device serial number '%s' (0x%s) doesn't match requested serial '%s' (0x%s)",
			desc_string, desc_hex, string, req_hex);
	}
	return matched;
}
コード例 #19
0
//  getserial - get the serialnumber of the device
//
//    Inputs:
//    num = device to get serial from
//    Output
//    QString conatining device serial or empty QString
//
QString pjrc_rawhid::getserial(int num)
{
    if ((std::size_t)num >= m_DeviceHandles.size()) {
        fprintf(stderr, "pjrc_rawhid_unix: Invalid device number used (%d)\n", num);
        return "";
    }
    if (m_DeviceHandles[num] == NULL) {
        fprintf(stderr, "pjrc_rawhid_unix: Tried to use a device which is not open (%d)\n", num);
        return "";
    }

    struct libusb_device_descriptor desc;
    struct libusb_device * dev = libusb_get_device(m_DeviceHandles[num]);
    int retval;

    retval = libusb_get_device_descriptor(dev, &desc);
    if (retval < 0) {
        fprintf(stderr, "pjrc_rawhid_unix: Failed to get device descriptor (%d)\n", retval);
        return "";
    }

    unsigned char buf[128];
    retval = libusb_get_string_descriptor_ascii(m_DeviceHandles[num], desc.iSerialNumber, buf, sizeof(buf));
    if (retval < 0) {
        fprintf(stderr, "pjrc_rawhid_unix: Coudn't get serial string (%d)\n", retval);
        return "";
    }

    return QString().fromUtf8((char*)buf,-1);
}
コード例 #20
0
static libusb_device_handle *find_device(const unsigned short vid, const unsigned short pid, const char *serial)
{
    libusb_device_handle *handle = NULL;
    libusb_device **devices;
    ssize_t numDevices = libusb_get_device_list(NULL, &devices);
    ssize_t i = 0;

    for (i = 0; i < numDevices; i++) {
        struct libusb_device_descriptor descriptor;
        if (0 == libusb_get_device_descriptor(devices[i], &descriptor)) {
            if (vid == descriptor.idVendor && pid == descriptor.idProduct) {
                if (0 == libusb_open(devices[i], &handle)) {
                    char usbSerial[64];
                    if (0 == descriptor.iSerialNumber || 
                        0 == libusb_get_string_descriptor_ascii(handle, descriptor.iSerialNumber, (unsigned char *)usbSerial, sizeof(usbSerial)))
                        usbSerial[0] = '\0';
   
                    if (matchesSerial(serial, usbSerial)) {
                        fprintf(stderr, "Connected to USB device with serial='%s'\n", usbSerial);
                        break;
                    }
                    else {
                        libusb_close(handle);
                        handle = NULL;
                    }
                }
            }
        }
    }
    if (NULL == handle)
        fprintf(stderr, "Warning: Could not find USB device with vid=0x%x pid=0x%x serial='%s'\n", vid, pid, serial);

    libusb_free_device_list(devices, 1);
    return handle;
}
コード例 #21
0
ファイル: usb.c プロジェクト: goncalopp/hdjd
int
usb_setup(char *name, size_t namelen)
{
	if (libusb_init(NULL) < 0) {
		return -1; 
	}
	
	if (libusb_pollfds_handle_timeouts(NULL) == 0) {
		printf("I'm too dumb to handle events on such an old system.\n");
		return -1;
	}
	
	for (d = devices; d->product_id; d += 1) {
		usb_dev = libusb_open_device_with_vid_pid(NULL, 0x6f8, d->product_id);
		if (usb_dev) {
			break;
		}
	}
	if (! usb_dev) {
		printf("Couldn't find a controller.\n");
		return -1;
	}
	
	// Figure out what it's called
	{
		int ret;
		struct libusb_device_descriptor ddesc;
		
		libusb_get_device_descriptor(libusb_get_device(usb_dev), &ddesc);
		ret = libusb_get_string_descriptor_ascii(usb_dev, ddesc.iManufacturer, (unsigned char *)name, namelen);
		if (ret > 0) {
			char *p = name + ret;
			
			*p = ' ';
			p += 1;
			ret = libusb_get_string_descriptor_ascii(usb_dev, ddesc.iProduct, (unsigned char *)p, namelen - ret - 1);
		}
		if (ret < 0) {
			printf("Warning: I can't figure out what to call this thing.\n");
		}
		printf("Opened [%s]\n", name);
	}
	
	usb_initiate_transfer();

	return 0;
}
コード例 #22
0
int fnusb_list_device_attributes(fnusb_ctx *ctx, struct freenect_device_attributes** attribute_list)
{
	*attribute_list = NULL; // initialize some return value in case the user is careless.
	libusb_device **devs;
	//pointer to pointer of device, used to retrieve a list of devices
	ssize_t count = libusb_get_device_list (ctx->ctx, &devs);
	if (count < 0)
		return -1;

	struct freenect_device_attributes** camera_prev_next = attribute_list;

	// Pass over the list.  For each camera seen, if we already have a camera
	// for the newest_camera device, allocate a new one and append it to the list,
	// incrementing num_devs.  Likewise for each audio device.
	struct libusb_device_descriptor desc;
	int num_cams = 0;
	int i;
	for (i = 0; i < count; i++) {
		int r = libusb_get_device_descriptor (devs[i], &desc);
		if (r < 0)
			continue;
		if (desc.idVendor == VID_MICROSOFT && desc.idProduct == PID_NUI_CAMERA) {
			// Verify that a serial number exists to query.  If not, don't touch the device.
			if (desc.iSerialNumber == 0) {
				continue;
			}

			// Open device.
			int res;
			libusb_device_handle *this_device;
			res = libusb_open(devs[i], &this_device);
			unsigned char string_desc[256]; // String descriptors are at most 256 bytes.
			if (res != 0) {
				continue;
			}

			// Read string descriptor referring to serial number.
			res = libusb_get_string_descriptor_ascii(this_device, desc.iSerialNumber, string_desc, 256);
			libusb_close(this_device);
			if (res < 0) {
				continue;
			}

			// Add item to linked list.
			struct freenect_device_attributes* new_dev_attrs = (struct freenect_device_attributes*)malloc(sizeof(struct freenect_device_attributes));
			memset(new_dev_attrs, 0, sizeof(*new_dev_attrs));

			*camera_prev_next = new_dev_attrs;
			// Copy string with serial number
			new_dev_attrs->camera_serial = strdup((char*)string_desc);
			camera_prev_next = &(new_dev_attrs->next);
			// Increment number of cameras found
			num_cams++;
		}
	}

	libusb_free_device_list(devs, 1);
	return num_cams;
}
コード例 #23
0
static libusb_device_handle* canusb_opendevice(struct libusb_context *ctx, char* devserial)
{
    libusb_device** devs;
    unsigned char serial[65];
    int cnt,i,n;

    cnt = libusb_get_device_list(ctx,&devs);

    for(i=0;i<cnt;i++)
    {
        /* Check if this device is interesting. */
        struct libusb_device_descriptor desc;
        libusb_device_handle *dh;

        libusb_get_device_descriptor(devs[i],&desc);

        if ((desc.idVendor != CANUSB_VID) || (desc.idProduct != CANUSB_PID))
          continue;

        /* Found one! */
        dh = NULL;

        if (libusb_open(devs[i],&dh) != 0) continue;

        n = libusb_get_string_descriptor_ascii(dh,desc.iSerialNumber,serial,64);
        serial[n] = 0;

        if ((devserial) && (strcmp((char *)serial,devserial) != 0))
        {
            libusb_close(dh);
            continue;
        }

        if ((libusb_kernel_driver_active(dh,0)) && (libusb_detach_kernel_driver(dh,0) != 0))
        {
            libusb_close(dh);
            continue;
        }

        if (libusb_set_configuration(dh,1) != 0)
        {
            libusb_close(dh);
            continue;
        }

        if (libusb_claim_interface(dh,0) != 0)
        {
            libusb_close(dh);
            continue;
        }

        /* Fount it! */
        libusb_free_device_list(devs,1);
        return dh;
    }

    libusb_free_device_list(devs,1);
    return NULL;
}
コード例 #24
0
ファイル: usb.c プロジェクト: c-base/matelight
static int matelight_cmp_str_desc(libusb_device_handle *dev, uint8_t index, char *value){
	char data[256];
	if(libusb_get_string_descriptor_ascii(dev, index, (unsigned char*)data, sizeof(data)) < 0){
		fprintf(stderr, "LIBML: Cannot read device string descriptor\n");
		return 0;
	}
	return strcmp(data, value) == 0;
}
コード例 #25
0
ファイル: yusb.c プロジェクト: emmt/yusb
static int
get_string_descriptor(libusb_device_handle* handle, int index,
                      char* string, int length)
{
  return libusb_get_string_descriptor_ascii(handle, (index)&0xff,
                                            (unsigned char*)string,
                                            length);
}
コード例 #26
0
ファイル: usbasp_uart.c プロジェクト: akrasuski1/usbasp-uart
int usbasp_uart_open(USBasp_UART* usbasp){
	int errorCode = USB_ERROR_NOTFOUND;

	libusb_context* ctx;
	libusb_init(&ctx);

	libusb_device** dev_list;
	int dev_list_len = libusb_get_device_list(ctx, &dev_list);

	for (int 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 == USBASP_SHARED_VID 
				&& descriptor.idProduct == USBASP_SHARED_PID) {
			uint8_t str[256];
			libusb_open(dev, &usbasp->usbhandle);
			if (!usbasp->usbhandle) {
				errorCode = USB_ERROR_ACCESS;
				continue;
			}
			libusb_get_string_descriptor_ascii(usbasp->usbhandle, 
					descriptor.iManufacturer & 0xff, str, sizeof(str));
			if(strcmp("www.fischl.de", (const char*)str)){
				libusb_close(usbasp->usbhandle);
				usbasp->usbhandle=NULL;
				continue;
			}
			dprintf("Vendor: %s\n", str);
			libusb_get_string_descriptor_ascii(usbasp->usbhandle, 
					descriptor.iProduct & 0xff, str, sizeof(str));
			if(strcmp("USBasp", (const char*)str)){
				libusb_close(usbasp->usbhandle);
				usbasp->usbhandle=NULL;
				continue;
			}
			dprintf("Product: %s\n", str);
			break;
		}
	}
	libusb_free_device_list(dev_list,1);
	if (usbasp->usbhandle != NULL){
		errorCode = 0;
	}
	return errorCode;
}
コード例 #27
0
ファイル: usb.c プロジェクト: c-base/matelight
matelight_handle *matelight_open(char *match_serial){
	matelight_handle *out = NULL;
    libusb_device_handle *handle = NULL;
	libusb_device** device_list;
	struct libusb_device_descriptor desc;

	ssize_t res = libusb_get_device_list(NULL, &device_list);
	if(res == 0){
		fprintf(stderr, "LIBML: Cannot find any connected matelight\n");
		goto error;
	}else if(res < 0){
		fprintf(stderr, "LIBML: Error enumerating connected USB devices\n");
		goto error;
	}else{
		out = calloc(1, sizeof(matelight_handle));
		if(!out){
			fprintf(stderr, "LIBML: Cannot allocate memory\n");
			goto error;
		}
		for(ssize_t i=0; i<res; i++){
			libusb_get_device_descriptor(device_list[i], &desc);
			if(desc.idVendor == MATELIGHT_VID && desc.idProduct == MATELIGHT_PID){
				if(libusb_open(device_list[i], &handle)){
					fprintf(stderr, "LIBML: Cannot open Mate Light USB device\n");
					goto error;
				}
				out->handle = handle;
				if(matelight_cmp_str_desc(handle, desc.iManufacturer, "Gold & Apple"))
				if(matelight_cmp_str_desc(handle, desc.iProduct, "Mate Light"))
				if(!match_serial || matelight_cmp_str_desc(handle, desc.iSerialNumber, match_serial)){
#define BUF_SIZE 256
					out->serial = malloc(BUF_SIZE);
					if(!out->serial){ fprintf(stderr, "LIBML: Cannot allocate memory\n");
						goto error;
					}
					if(libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, (unsigned char*)&out->serial, BUF_SIZE) < 0){
						fprintf(stderr, "LIBML: Cannot read device string descriptor\n");
						goto error;
					}
#undef BUF_SIZE
                    return out;
				}
			}
		}
	}
	libusb_free_device_list(device_list, 1);
	return NULL;
error:
	if(out){
        if(out->serial)
            free(out->serial);
        free(out);
    }
    if(handle)
        libusb_close(handle);
	libusb_free_device_list(device_list, 1);
	return NULL;
}
コード例 #28
0
int canusb_findalldevs(pcap_if_t **alldevsp, char *err_str)
{
    libusb_context *fdctx;
    libusb_device** devs;
    unsigned char sernum[65];
    int cnt, i;

    if (libusb_init(&fdctx) != 0) {
        /*
         * XXX - if this doesn't just mean "no USB file system mounted",
         * perhaps we should report a real error rather than just
         * saying "no CANUSB devices".
         */
        return 0;
    }

    cnt = libusb_get_device_list(fdctx,&devs);

    for(i=0;i<cnt;i++)
    {
        int ret;
        /* Check if this device is interesting. */
        struct libusb_device_descriptor desc;
        libusb_device_handle *dh;

        libusb_get_device_descriptor(devs[i],&desc);

        if ((desc.idVendor != CANUSB_VID) || (desc.idProduct != CANUSB_PID))
            continue; /* It is not, check next device */

        /* It is! */
        dh = NULL;

        if ((ret = libusb_open(devs[i],&dh)) == 0)
        {
            char dev_name[30];
            char dev_descr[50];
            int n = libusb_get_string_descriptor_ascii(dh,desc.iSerialNumber,sernum,64);
            sernum[n] = 0;

            pcap_snprintf(dev_name, 30, CANUSB_IFACE"%s", sernum);
            pcap_snprintf(dev_descr, 50, "CanUSB [%s]", sernum);

            libusb_close(dh);

            if (pcap_add_if(alldevsp, dev_name, 0, dev_descr, err_str) < 0)
            {
                libusb_free_device_list(devs,1);
                libusb_exit(fdctx);
                return -1;
            }
        }
    }

    libusb_free_device_list(devs,1);
    libusb_exit(fdctx);
    return 0;
}
コード例 #29
0
ファイル: bulkcontroller.cpp プロジェクト: MLudgate/mixxx
static QString get_string(libusb_device_handle *handle, u_int8_t id) {
    unsigned char buf[128] = { 0 };

    if (id) {
        libusb_get_string_descriptor_ascii(handle, id, buf, sizeof(buf));
    }

    return QString::fromAscii((char*)buf);
}
コード例 #30
0
ファイル: usb-helpers.c プロジェクト: RC-MODULE/matlab
int ncusb_match_string(libusb_device_handle *dev, int index, const char* string)
{
	unsigned char tmp[256];
	libusb_get_string_descriptor_ascii(dev, index, tmp, 256);
	slog(4, SLOG_DEBUG, "cmp idx %d str %s vs %s", index, tmp, string);
	if (string == NULL)
		return 1; /* NULL matches anything */
	return (strcmp(string, (char*) tmp)==0);
}