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:
Bert Vermeulen 2012-04-27 01:28:47 +02:00
parent 6752905e6b
commit 6b73d9a598
1 changed files with 16 additions and 26 deletions

View File

@ -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;
} }