Skip to content

Commit e04b4c7

Browse files
Antonio Ospitezarvox
authored andcommitted
libusbemu: implement libusb_open_device_with_vid_pid()
Signed-off-by: Antonio Ospite <[email protected]>
1 parent 4e68bcc commit e04b4c7

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

platform/windows/libusb10emu/libusb-1.0/libusb.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ int libusb_set_configuration(libusb_device_handle *dev, int configuration);
7575
int libusb_claim_interface(libusb_device_handle* dev, int interface_number);
7676
int libusb_release_interface(libusb_device_handle* dev, int interface_number);
7777

78+
libusb_device_handle *libusb_open_device_with_vid_pid(libusb_context *ctx,
79+
uint16_t vendor_id, uint16_t product_id);
80+
7881
int libusb_control_transfer(libusb_device_handle* dev_handle, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned char* data, uint16_t wLength, unsigned int timeout);
7982

8083
struct libusb_transfer* libusb_alloc_transfer(int iso_packets);

platform/windows/libusb10emu/libusb-1.0/libusbemu.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,38 @@ int libusb_release_interface(libusb_device_handle* dev, int interface_number)
313313
return(0);
314314
}
315315

316+
libusb_device_handle *libusb_open_device_with_vid_pid(libusb_context *ctx, uint16_t vendor_id, uint16_t product_id)
317+
{
318+
int num_devices;
319+
libusb_device** list;
320+
libusb_device_handle *dev_handle = NULL;
321+
322+
if (ctx == NULL)
323+
ctx = default_context;
324+
325+
num_devices = libusb_get_device_list(ctx, &list);
326+
if (num_devices < 0)
327+
return NULL;
328+
329+
unsigned int i = 0;
330+
while (list[i] != NULL) {
331+
struct libusb_device_descriptor desc;
332+
int ret = libusb_get_device_descriptor(list[i], &desc);
333+
if (ret < 0)
334+
break;
335+
336+
if (desc.idVendor == vendor_id && desc.idProduct == product_id) {
337+
ret = libusb_open(list[i], &dev_handle);
338+
if (ret)
339+
break;
340+
}
341+
i++;
342+
}
343+
344+
libusb_free_device_list(list, 1);
345+
return dev_handle;
346+
}
347+
316348
int libusb_control_transfer(libusb_device_handle* dev_handle, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned char* data, uint16_t wLength, unsigned int timeout)
317349
{
318350
// in libusb-1.0 a timeout of zero it means 'wait indefinitely'; in libusb-0.1, a timeout of zero means 'return immediatelly'!

0 commit comments

Comments
 (0)