]> sigrok.org Git - libsigrok.git/commitdiff
sr: la8: Support for newer USB VID/PID of the device.
authorUwe Hermann <redacted>
Sat, 14 Jul 2012 22:34:27 +0000 (00:34 +0200)
committerUwe Hermann <redacted>
Sat, 14 Jul 2012 22:34:27 +0000 (00:34 +0200)
Thanks to Jerry Jacobs for the patch!

hardware/chronovu-la8/api.c
hardware/chronovu-la8/driver.h

index 7dd2d145b36703afe81c59beed0a31ef6db3309a..81466917f67c228e75d76883a5801437af9edf4b 100644 (file)
 
 static GSList *dev_insts = NULL;
 
+/*
+ * The ChronoVu LA8 can have multiple PIDs. Older versions shipped with
+ * a standard FTDI USB VID/PID of 0403:6001, newer ones have 0403:8867.
+ */ 
+static const uint16_t usb_pids[] = {
+       0x6001,
+       0x8867,
+};
+
 /* Function prototypes. */
 static int hw_dev_acquisition_stop(int dev_index, void *cb_data);
 
@@ -35,6 +44,7 @@ static int hw_init(const char *devinfo)
        int ret;
        struct sr_dev_inst *sdi;
        struct context *ctx;
+       unsigned int i;
 
        /* Avoid compiler errors. */
        (void)devinfo;
@@ -74,13 +84,20 @@ static int hw_init(const char *devinfo)
        }
 
        /* Check for the device and temporarily open it. */
-       if ((ret = ftdi_usb_open_desc(ctx->ftdic, USB_VENDOR_ID,
-                       USB_PRODUCT_ID, USB_DESCRIPTION, NULL)) < 0) {
-               (void) la8_close_usb_reset_sequencer(ctx); /* Ignore errors. */
-               goto err_free_ftdic;
+       for (i = 0; i < ARRAY_SIZE(usb_pids); i++) {
+               sr_dbg("la8: Probing for VID/PID %04x:%04x.", USB_VENDOR_ID,
+                      usb_pids[i]);
+               ret = ftdi_usb_open_desc(ctx->ftdic, USB_VENDOR_ID,
+                                        usb_pids[i], USB_DESCRIPTION, NULL);
+               if (ret == 0) {
+                       sr_dbg("la8: Found LA8 device (%04x:%04x).",
+                              USB_VENDOR_ID, usb_pids[i]);
+                       ctx->usb_pid = usb_pids[i];
+               }
        }
-       sr_dbg("la8: Found LA8 device (%04x:%04x).", USB_VENDOR_ID,
-              USB_PRODUCT_ID);
+
+       if (ctx->usb_pid == 0)
+               goto err_free_ftdic;
 
        /* Register the device with libsigrok. */
        sdi = sr_dev_inst_new(0, SR_ST_INITIALIZING,
@@ -131,11 +148,11 @@ static int hw_dev_open(int dev_index)
        }
 
        sr_dbg("la8: Opening LA8 device (%04x:%04x).", USB_VENDOR_ID,
-              USB_PRODUCT_ID);
+              ctx->usb_pid);
 
        /* Open the device. */
        if ((ret = ftdi_usb_open_desc(ctx->ftdic, USB_VENDOR_ID,
-                       USB_PRODUCT_ID, USB_DESCRIPTION, NULL)) < 0) {
+                       ctx->usb_pid, USB_DESCRIPTION, NULL)) < 0) {
                sr_err("la8: %s: ftdi_usb_open_desc: (%d) %s",
                       __func__, ret, ftdi_get_error_string(ctx->ftdic));
                (void) la8_close_usb_reset_sequencer(ctx); /* Ignore errors. */
index d972d182f6b70ca105167e7fc4fb89150cc01136..0da07e475d1d1548ad10e268f94a8d5e3b1c0af8 100644 (file)
@@ -28,7 +28,6 @@
 #include "libsigrok-internal.h"
 
 #define USB_VENDOR_ID                  0x0403
-#define USB_PRODUCT_ID                 0x6001
 #define USB_DESCRIPTION                        "ChronoVu LA8"
 #define USB_VENDOR_NAME                        "ChronoVu"
 #define USB_MODEL_NAME                 "LA8"
@@ -98,6 +97,9 @@ struct context {
 
        /** The divcount value (determines the sample period) for the LA8. */
        uint8_t divcount;
+
+       /** This ChronoVu LA8's USB PID (multiple versions exist). */
+       uint16_t usb_pid;
 };
 
 /* driver.c */