usb.c: Moved in usb_match_manuf_product

This commit is contained in:
Joel Holdsworth 2017-06-12 11:30:52 -06:00 committed by Uwe Hermann
parent e40ee26b45
commit 69f7d9b4a9
5 changed files with 49 additions and 48 deletions

View File

@ -412,13 +412,13 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options)
devc->dslogic = TRUE; devc->dslogic = TRUE;
devc->samplerates = dslogic_samplerates; devc->samplerates = dslogic_samplerates;
devc->num_samplerates = ARRAY_SIZE(dslogic_samplerates); devc->num_samplerates = ARRAY_SIZE(dslogic_samplerates);
has_firmware = match_manuf_prod(devlist[i], "DreamSourceLab", "DSLogic") has_firmware = usb_match_manuf_prod(devlist[i], "DreamSourceLab", "DSLogic")
|| match_manuf_prod(devlist[i], "DreamSourceLab", "DSCope"); || usb_match_manuf_prod(devlist[i], "DreamSourceLab", "DSCope");
} else { } else {
devc->dslogic = FALSE; devc->dslogic = FALSE;
devc->samplerates = samplerates; devc->samplerates = samplerates;
devc->num_samplerates = ARRAY_SIZE(samplerates); devc->num_samplerates = ARRAY_SIZE(samplerates);
has_firmware = match_manuf_prod(devlist[i], has_firmware = usb_match_manuf_prod(devlist[i],
"sigrok", "fx2lafw"); "sigrok", "fx2lafw");
} }

View File

@ -141,49 +141,6 @@ SR_PRIV int fx2lafw_command_start_acquisition(const struct sr_dev_inst *sdi)
return SR_OK; return SR_OK;
} }
/**
* Check the USB configuration to determine if this is an fx2lafw device.
*
* @return TRUE if the device's configuration profile matches fx2lafw
* configuration, FALSE otherwise.
*/
SR_PRIV gboolean match_manuf_prod(libusb_device *dev, const char *manufacturer,
const char *product)
{
struct libusb_device_descriptor des;
struct libusb_device_handle *hdl;
gboolean ret;
unsigned char strdesc[64];
hdl = NULL;
ret = FALSE;
while (!ret) {
/* Assume the FW has not been loaded, unless proven wrong. */
libusb_get_device_descriptor(dev, &des);
if (libusb_open(dev, &hdl) != 0)
break;
if (libusb_get_string_descriptor_ascii(hdl,
des.iManufacturer, strdesc, sizeof(strdesc)) < 0)
break;
if (strcmp((const char *)strdesc, manufacturer))
break;
if (libusb_get_string_descriptor_ascii(hdl,
des.iProduct, strdesc, sizeof(strdesc)) < 0)
break;
if (strcmp((const char *)strdesc, product))
break;
ret = TRUE;
}
if (hdl)
libusb_close(hdl);
return ret;
}
SR_PRIV int fx2lafw_dev_open(struct sr_dev_inst *sdi, struct sr_dev_driver *di) SR_PRIV int fx2lafw_dev_open(struct sr_dev_inst *sdi, struct sr_dev_driver *di)
{ {
libusb_device **devlist; libusb_device **devlist;

View File

@ -145,8 +145,6 @@ struct dev_context {
}; };
SR_PRIV int fx2lafw_command_start_acquisition(const struct sr_dev_inst *sdi); SR_PRIV int fx2lafw_command_start_acquisition(const struct sr_dev_inst *sdi);
SR_PRIV gboolean match_manuf_prod(libusb_device *dev, const char *manufacturer,
const char *product);
SR_PRIV int fx2lafw_dev_open(struct sr_dev_inst *sdi, struct sr_dev_driver *di); SR_PRIV int fx2lafw_dev_open(struct sr_dev_inst *sdi, struct sr_dev_driver *di);
SR_PRIV struct dev_context *fx2lafw_dev_new(void); SR_PRIV struct dev_context *fx2lafw_dev_new(void);
SR_PRIV void fx2lafw_abort_acquisition(struct dev_context *devc); SR_PRIV void fx2lafw_abort_acquisition(struct dev_context *devc);

View File

@ -1050,6 +1050,8 @@ SR_PRIV int usb_source_add(struct sr_session *session, struct sr_context *ctx,
int timeout, sr_receive_data_callback cb, void *cb_data); int timeout, sr_receive_data_callback cb, void *cb_data);
SR_PRIV int usb_source_remove(struct sr_session *session, struct sr_context *ctx); SR_PRIV int usb_source_remove(struct sr_session *session, struct sr_context *ctx);
SR_PRIV int usb_get_port_path(libusb_device *dev, char *path, int path_len); SR_PRIV int usb_get_port_path(libusb_device *dev, char *path, int path_len);
SR_PRIV gboolean usb_match_manuf_prod(libusb_device *dev,
const char *manufacturer, const char *product);
#endif #endif

View File

@ -510,3 +510,47 @@ SR_PRIV int usb_get_port_path(libusb_device *dev, char *path, int path_len)
return SR_OK; return SR_OK;
} }
/**
* Check the USB configuration to determine if this device has a given
* manufacturer and product string.
*
* @return TRUE if the device's configuration profile strings
* configuration, FALSE otherwise.
*/
SR_PRIV gboolean usb_match_manuf_prod(libusb_device *dev,
const char *manufacturer, const char *product)
{
struct libusb_device_descriptor des;
struct libusb_device_handle *hdl;
gboolean ret;
unsigned char strdesc[64];
hdl = NULL;
ret = FALSE;
while (!ret) {
/* Assume the FW has not been loaded, unless proven wrong. */
libusb_get_device_descriptor(dev, &des);
if (libusb_open(dev, &hdl) != 0)
break;
if (libusb_get_string_descriptor_ascii(hdl,
des.iManufacturer, strdesc, sizeof(strdesc)) < 0)
break;
if (strcmp((const char *)strdesc, manufacturer))
break;
if (libusb_get_string_descriptor_ascii(hdl,
des.iProduct, strdesc, sizeof(strdesc)) < 0)
break;
if (strcmp((const char *)strdesc, product))
break;
ret = TRUE;
}
if (hdl)
libusb_close(hdl);
return ret;
}