usbutils allow device selection to specify expected Manufacturer/Product strings
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
diff --git a/usbutils.c b/usbutils.c
index a472310..184e02b 100644
--- a/usbutils.c
+++ b/usbutils.c
@@ -109,6 +109,8 @@ static struct usb_find_devices find_dev[] = {
.name = "BAS",
.idVendor = 0x0403,
.idProduct = 0x6014,
+ .iManufacturer = "Butterfly Labs",
+ .iProduct = "BitFORCE SHA256 SC",
.kernel = 0,
.config = 1,
.interface = 0,
@@ -122,6 +124,8 @@ static struct usb_find_devices find_dev[] = {
.name = "BFL",
.idVendor = 0x0403,
.idProduct = 0x6014,
+ .iManufacturer = "Butterfly Labs",
+ .iProduct = "BitFORCE SHA256",
.kernel = 0,
.config = 1,
.interface = 0,
@@ -170,7 +174,7 @@ static struct usb_find_devices find_dev[] = {
.epcount = 0,
.eps = NULL },
#endif
- { DRV_LAST, NULL, 0, 0, 0, 0, 0, 0, 0, NULL }
+ { DRV_LAST, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, NULL }
};
#ifdef USE_BFLSC
@@ -1176,6 +1180,42 @@ bool usb_init(struct cgpu_info *cgpu, struct libusb_device *dev, struct usb_find
}
#endif
+ if (found->iManufacturer) {
+ unsigned char man[STRBUFLEN+1];
+applog(LOG_ERR, "USB init, looking for man='%s'", found->iManufacturer);
+
+ err = libusb_get_string_descriptor_ascii(cgusb->handle,
+ cgusb->descriptor->iManufacturer,
+ man, STRBUFLEN);
+ if (err < 0) {
+ applog(LOG_DEBUG,
+ "USB init, failed to get iManufacturer, err %d %s",
+ err, devstr);
+ goto cldame;
+ }
+applog(LOG_ERR, "USB init, man='%s' to '%s'", found->iManufacturer, man);
+ if (strcmp((char *)man, found->iManufacturer))
+ goto cldame;
+ }
+
+ if (found->iProduct) {
+ unsigned char prod[STRBUFLEN+1];
+applog(LOG_ERR, "USB init, looking for prod='%s'", found->iProduct);
+
+ err = libusb_get_string_descriptor_ascii(cgusb->handle,
+ cgusb->descriptor->iProduct,
+ prod, STRBUFLEN);
+ if (err < 0) {
+ applog(LOG_DEBUG,
+ "USB init, failed to get iProduct, err %d %s",
+ err, devstr);
+ goto cldame;
+ }
+applog(LOG_ERR, "USB init, prod='%s' to '%s'", found->iProduct, prod);
+ if (strcmp((char *)prod, found->iProduct))
+ goto cldame;
+ }
+
err = libusb_set_configuration(cgusb->handle, found->config);
if (err) {
switch(err) {
diff --git a/usbutils.h b/usbutils.h
index 928a8a5..a4f054b 100644
--- a/usbutils.h
+++ b/usbutils.h
@@ -55,6 +55,8 @@ struct usb_find_devices {
const char *name;
uint16_t idVendor;
uint16_t idProduct;
+ char *iManufacturer;
+ char *iProduct;
int kernel;
int config;
int interface;