9 static int did_usb_init
= 0;
12 static int usb_get_string_ascii(usb_dev_handle
*dev
, int index
, int langid
, char *buf
, int buflen
)
17 if((rval
= usb_control_msg(dev
,
19 USB_REQ_GET_DESCRIPTOR
,
20 (USB_DT_STRING
<< 8) + index
,
21 langid
, buffer
, sizeof(buffer
),
24 if(buffer
[1] != USB_DT_STRING
)
26 if((unsigned char)buffer
[0] < rval
)
27 rval
= (unsigned char)buffer
[0];
29 /* lossy conversion to ISO Latin1 */
30 for(i
=1; i
<rval
; i
++) {
31 if(i
> buflen
) /* destination buffer overflow */
33 buf
[i
-1] = buffer
[2 * i
];
34 if(buffer
[2 * i
+ 1] != 0) /* outside of ISO Latin1 range */
42 int usb_match_string(usb_dev_handle
*handle
, int index
, char* string
)
46 return 1; /* NULL matches anything */
47 usb_get_string_ascii(handle
, index
, 0x409, tmp
, 256);
48 return (strcmp(string
,tmp
)==0);
51 usb_dev_handle
*usb_check_device(struct usb_device
*dev
,
56 usb_dev_handle
*handle
= usb_open(dev
);
58 fprintf(stderr
, "Warning: cannot open USB device: %s\n", usb_strerror());
62 usb_match_string(handle
, dev
->descriptor
.iManufacturer
, vendor_name
) &&
63 usb_match_string(handle
, dev
->descriptor
.iProduct
, product_name
) &&
64 usb_match_string(handle
, dev
->descriptor
.iSerialNumber
, serial
)
73 usb_dev_handle
*nc_usb_open(int vendor
, int product
, char *vendor_name
, char *product_name
, char *serial
)
76 struct usb_device
*dev
;
77 usb_dev_handle
*handle
= NULL
;
85 for(bus
=usb_get_busses(); bus
; bus
=bus
->next
) {
86 for(dev
=bus
->devices
; dev
; dev
=dev
->next
) {
87 if(dev
->descriptor
.idVendor
== vendor
&&
88 dev
->descriptor
.idProduct
== product
) {
89 handle
= usb_check_device(dev
, vendor_name
, product_name
, serial
);