8 static int did_usb_init
= 0;
11 static int usb_get_string_ascii(usb_dev_handle
*dev
, int index
, int langid
, char *buf
, int buflen
)
16 if((rval
= usb_control_msg(dev
,
18 USB_REQ_GET_DESCRIPTOR
,
19 (USB_DT_STRING
<< 8) + index
,
20 langid
, buffer
, sizeof(buffer
),
23 if(buffer
[1] != USB_DT_STRING
)
25 if((unsigned char)buffer
[0] < rval
)
26 rval
= (unsigned char)buffer
[0];
28 /* lossy conversion to ISO Latin1 */
29 for(i
=1; i
<rval
; i
++) {
30 if(i
> buflen
) /* destination buffer overflow */
32 buf
[i
-1] = buffer
[2 * i
];
33 if(buffer
[2 * i
+ 1] != 0) /* outside of ISO Latin1 range */
41 int usb_match_string(usb_dev_handle
*handle
, int index
, char* string
)
45 return 1; /* NULL matches anything */
46 usb_get_string_ascii(handle
, index
, 0x409, tmp
, 256);
47 return (strcmp(string
,tmp
)==0);
50 usb_dev_handle
*usb_check_device(struct usb_device
*dev
,
55 usb_dev_handle
*handle
= usb_open(dev
);
57 fprintf(stderr
, "Warning: cannot open USB device: %s\n", usb_strerror());
61 usb_match_string(handle
, dev
->descriptor
.iManufacturer
, vendor_name
) &&
62 usb_match_string(handle
, dev
->descriptor
.iProduct
, product_name
) &&
63 usb_match_string(handle
, dev
->descriptor
.iSerialNumber
, serial
)
72 usb_dev_handle
*nc_usb_open(int vendor
, int product
, char *vendor_name
, char *product_name
, char *serial
)
75 struct usb_device
*dev
;
76 usb_dev_handle
*handle
= NULL
;
84 for(bus
=usb_get_busses(); bus
; bus
=bus
->next
) {
85 for(dev
=bus
->devices
; dev
; dev
=dev
->next
) {
86 if(dev
->descriptor
.idVendor
== vendor
&&
87 dev
->descriptor
.idProduct
== product
) {
88 handle
= usb_check_device(dev
, vendor_name
, product_name
, serial
);