]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/fx2lafw/api.c
fx2lafw: warn on fail to open plausible devices
[libsigrok.git] / src / hardware / fx2lafw / api.c
index 46b9ee34e15dc318fb88e506cb3a0ef5a026ef0d..0f9cadb64cc5337789482facc4e35a406b5a4f6b 100644 (file)
@@ -47,6 +47,13 @@ static const struct fx2lafw_profile supported_fx2[] = {
                "fx2lafw-cwav-usbeesx.fw",
                0, NULL, NULL},
 
+       /*
+        * CWAV USBee ZX
+        */
+       { 0x08a9, 0x0005, "CWAV", "USBee ZX", NULL,
+               "fx2lafw-cwav-usbeezx.fw",
+               0, NULL, NULL},
+
        /* DreamSourceLab DSLogic (before FW upload) */
        { 0x2a0e, 0x0001, "DreamSourceLab", "DSLogic", NULL,
                "dreamsourcelab-dslogic-fx2.fw",
@@ -207,6 +214,20 @@ static const uint64_t dslogic_samplerates[] = {
        SR_MHZ(400),
 };
 
+static gboolean is_plausible(const struct libusb_device_descriptor *des)
+{
+       int i;
+
+       for (i = 0; supported_fx2[i].vid; i++) {
+               if (des->idVendor != supported_fx2[i].vid)
+                       continue;
+               if (des->idProduct == supported_fx2[i].pid)
+                       return TRUE;
+       }
+
+       return FALSE;
+}
+
 static GSList *scan(struct sr_dev_driver *di, GSList *options)
 {
        struct drv_context *drvc;
@@ -264,9 +285,16 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options)
 
                libusb_get_device_descriptor( devlist[i], &des);
 
-               if ((ret = libusb_open(devlist[i], &hdl)) < 0)
+               if (!is_plausible(&des))
                        continue;
 
+               if ((ret = libusb_open(devlist[i], &hdl)) < 0) {
+                       sr_warn("Failed to open potential device with "
+                               "VID:PID %04x:%04x: %s.", des.idVendor,
+                               des.idProduct, libusb_error_name(ret));
+                       continue;
+               }
+
                if (des.iManufacturer == 0) {
                        manufacturer[0] = '\0';
                } else if ((ret = libusb_get_string_descriptor_ascii(hdl,
@@ -857,7 +885,7 @@ static int start_transfers(const struct sr_dev_inst *sdi)
        else
                devc->send_data_proc = la_send_data_proc;
 
-       std_session_send_df_header(sdi, LOG_PREFIX);
+       std_session_send_df_header(sdi);
 
        return SR_OK;
 }
@@ -873,7 +901,7 @@ static void LIBUSB_CALL dslogic_trigger_receive(struct libusb_transfer *transfer
        if (transfer->status == LIBUSB_TRANSFER_CANCELLED) {
                sr_dbg("Trigger transfer canceled.");
                /* Terminate session. */
-               std_session_send_df_end(sdi, LOG_PREFIX);
+               std_session_send_df_end(sdi);
                usb_source_remove(sdi->session, devc->ctx);
                devc->num_transfers = 0;
                g_free(devc->transfers);