]> sigrok.org Git - libsigrok.git/commitdiff
usb: sr_usb_find() uses standardized connection string to find a USB device
authorBert Vermeulen <redacted>
Tue, 4 Dec 2012 22:25:11 +0000 (23:25 +0100)
committerBert Vermeulen <redacted>
Tue, 4 Dec 2012 22:25:11 +0000 (23:25 +0100)
hardware/common/usb.c
hardware/uni-t-dmm/api.c
libsigrok-internal.h

index 2dabfbee081c2d695df241521d7699725fca3be5..4c0c5b031069a0e10af1de091ffba7dc9488a4ad 100644 (file)
 #define sr_warn(s, args...) sr_warn(DRIVER_LOG_DOMAIN s, ## args)
 #define sr_err(s, args...) sr_err(DRIVER_LOG_DOMAIN s, ## args)
 
-SR_PRIV GSList *sr_usb_connect(libusb_context *usb_ctx, const char *conn)
+/**
+ * Find USB devices according to a connection string.
+ *
+ * @param usb_ctx libusb context to use while scanning.
+ * @param conn Connection string specifying the device(s) to match. This
+ * can be of the form "<bus>.<address>", or "<vendorid>.<productid>".
+ *
+ * @return A GSList of struct sr_usb_dev_inst, with bus and address fields
+ * matching the device that matched the connection string. The GSList and
+ * its contents must be freed by the caller.
+ */
+SR_PRIV GSList *sr_usb_find(libusb_context *usb_ctx, const char *conn)
 {
+       struct sr_usb_dev_inst *usb;
        struct libusb_device **devlist;
        struct libusb_device_descriptor des;
        GSList *devices;
@@ -115,25 +127,20 @@ SR_PRIV GSList *sr_usb_connect(libusb_context *usb_ctx, const char *conn)
                        continue;
                }
 
-               b = libusb_get_bus_number(devlist[i]);
-               a = libusb_get_device_address(devlist[i]);
-
-               if (vid + pid &&
-                   (des.idVendor != vid || des.idProduct != pid)) {
-                       sr_spew("VID:PID = %04x:%04x (%d.%d) doesn't match.",
-                               des.idVendor, des.idProduct, b, a);
+               if (vid + pid && (des.idVendor != vid || des.idProduct != pid))
                        continue;
-               }
 
-               if (bus + addr && (b != bus || a != addr)) {
-                       sr_spew("bus.address = %d.%d does not match.", b, a);
+               b = libusb_get_bus_number(devlist[i]);
+               a = libusb_get_device_address(devlist[i]);
+               if (bus + addr && (b != bus || a != addr))
                        continue;
-               }
 
                sr_dbg("Found USB device (VID:PID = %04x:%04x, bus.address = "
                       "%d.%d).", des.idVendor, des.idProduct, b, a);
 
-               devices = g_slist_append(devices, devlist[i]);
+               usb = sr_usb_dev_inst_new(libusb_get_bus_number(devlist[i]),
+                               libusb_get_device_address(devlist[i]), NULL);
+               devices = g_slist_append(devices, usb);
        }
        libusb_free_device_list(devlist, 1);
 
index 11755bcdcc9730c8c46c09405887207b9858f231..b4beb5041e15a19509440e5bdaea079060af38f1 100644 (file)
@@ -100,7 +100,7 @@ static GSList *hw_scan(GSList *options)
 
        devices = NULL;
 
-       if (!(l = sr_usb_connect(drvc->sr_ctx->libusb_ctx, "1a86.e008")))
+       if (!(l = sr_usb_find(drvc->sr_ctx->libusb_ctx, "1a86.e008")))
                return NULL;
 
        for (i = 0; i < (int)g_slist_length(l); i++) {
index ddb4f995e8c4787b4d7a71ca4c860082af444cc9..d9f2bcd8a33c4aae06b9bb4660ff1c40a950e3ed 100644 (file)
@@ -165,7 +165,7 @@ SR_PRIV int ezusb_upload_firmware(libusb_device *dev, int configuration,
 /*--- hardware/common/usb.c -------------------------------------------------*/
 
 #ifdef HAVE_LIBUSB_1_0
-SR_PRIV GSList *sr_usb_connect(libusb_context *usb_ctx, const char *conn);
+SR_PRIV GSList *sr_usb_find(libusb_context *usb_ctx, const char *conn);
 SR_PRIV int sr_usb_open(libusb_context *usb_ctx, struct sr_usb_dev_inst *usb);
 #endif