fx2lafw: use iManufacturer/iProduct fields to identify our firmware
It's more deterministic than the endpoint profile check we did before. Which was also broken.
This commit is contained in:
parent
6752905e6b
commit
6b73d9a598
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <libusb.h>
|
#include <libusb.h>
|
||||||
|
@ -122,48 +123,37 @@ static int hw_dev_acquisition_stop(int dev_index, void *cb_data);
|
||||||
static gboolean check_conf_profile(libusb_device *dev)
|
static gboolean check_conf_profile(libusb_device *dev)
|
||||||
{
|
{
|
||||||
struct libusb_device_descriptor des;
|
struct libusb_device_descriptor des;
|
||||||
struct libusb_config_descriptor *conf_dsc = NULL;
|
struct libusb_device_handle *hdl;
|
||||||
const struct libusb_interface_descriptor *intf_dsc;
|
gboolean ret;
|
||||||
gboolean ret = FALSE;
|
unsigned char strdesc[64];
|
||||||
|
|
||||||
|
hdl = NULL;
|
||||||
|
ret = FALSE;
|
||||||
while (!ret) {
|
while (!ret) {
|
||||||
/* Assume the FW has not been loaded, unless proven wrong. */
|
/* Assume the FW has not been loaded, unless proven wrong. */
|
||||||
ret = FALSE;
|
|
||||||
|
|
||||||
if (libusb_get_device_descriptor(dev, &des) != 0)
|
if (libusb_get_device_descriptor(dev, &des) != 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Need exactly 1 configuration. */
|
if (libusb_open(dev, &hdl) != 0)
|
||||||
if (des.bNumConfigurations != 1)
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (libusb_get_config_descriptor(dev, 0, &conf_dsc) != 0)
|
if (libusb_get_string_descriptor_ascii(hdl,
|
||||||
|
des.iManufacturer, strdesc, sizeof(strdesc)) < 0)
|
||||||
|
break;
|
||||||
|
if (strncmp((const char *)strdesc, "sigrok", 6))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Need exactly 1 interface. */
|
if (libusb_get_string_descriptor_ascii(hdl,
|
||||||
if (conf_dsc->bNumInterfaces != 1)
|
des.iProduct, strdesc, sizeof(strdesc)) < 0)
|
||||||
break;
|
break;
|
||||||
|
if (strncmp((const char *)strdesc, "fx2lafw", 7))
|
||||||
/* Need just one alternate setting. */
|
|
||||||
if (conf_dsc->interface[0].num_altsetting != 1)
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Need exactly 2 endpoints. */
|
|
||||||
intf_dsc = &(conf_dsc->interface[0].altsetting[0]);
|
|
||||||
if (intf_dsc->bNumEndpoints != 2)
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* The first endpoint should be 2 (inbound). */
|
|
||||||
if ((intf_dsc->endpoint[0].bEndpointAddress & 0x8f) !=
|
|
||||||
(2 | LIBUSB_ENDPOINT_IN))
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* If we made it here, it must be an fx2lafw. */
|
/* If we made it here, it must be an fx2lafw. */
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
}
|
}
|
||||||
|
if (hdl)
|
||||||
if (conf_dsc)
|
libusb_close(hdl);
|
||||||
libusb_free_config_descriptor(conf_dsc);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue