]> sigrok.org Git - libsigrok.git/commitdiff
Add usb_get_port_path() helper function
authorSoeren Apel <redacted>
Mon, 22 Sep 2014 21:08:17 +0000 (23:08 +0200)
committerBert Vermeulen <redacted>
Tue, 23 Sep 2014 22:40:03 +0000 (00:40 +0200)
There is currently no way to uniquely identify USB devices in
libsigrok. It uses the "bus.address" scheme which is only
constant as long as the device remains attached to the bus.
In order to allow USB device persistence in PulseView, devices
need to provide a unique identifier even in absence of a
serial number. This function is the first step as it provides
the ability to query the physical location of a USB device.

src/libsigrok-internal.h
src/usb.c

index b0df768c82b57297f74d0226c78aedb560e69821..28e26c1a1b8ed26e5daa2a7aefc14c30e356f5de 100644 (file)
@@ -679,6 +679,7 @@ SR_PRIV int sr_usb_open(libusb_context *usb_ctx, struct sr_usb_dev_inst *usb);
 SR_PRIV int usb_source_add(struct sr_session *session, struct sr_context *ctx,
                int timeout, sr_receive_data_callback cb, void *cb_data);
 SR_PRIV int usb_source_remove(struct sr_session *session, struct sr_context *ctx);
+SR_PRIV int usb_get_port_path(libusb_device *dev, const char *path, int path_len);
 #endif
 
 /*--- hardware/common/scpi.c ------------------------------------------------*/
index c3279d0ae1ef58640013483f9b6711deca9be15a..1c9e4118ebc0ad96e35e01cbadaf654e547c50bc 100644 (file)
--- a/src/usb.c
+++ b/src/usb.c
@@ -20,6 +20,7 @@
  */
 
 #include <stdlib.h>
+#include <memory.h>
 #include <glib.h>
 #include <libusb.h>
 #include "libsigrok.h"
@@ -269,3 +270,28 @@ SR_PRIV int usb_source_remove(struct sr_session *session, struct sr_context *ctx
 
        return SR_OK;
 }
+
+SR_PRIV int usb_get_port_path(libusb_device *dev, const char *path, int path_len)
+{
+       gchar s[64];
+       gchar tmp_s[8];
+       uint8_t port_numbers[32];
+       int i;
+
+       memset(port_numbers, 0, sizeof(port_numbers));
+       libusb_get_port_numbers(dev, port_numbers, sizeof(port_numbers));
+
+       g_snprintf((gchar*)&s, sizeof(s), "usb/%d-%d",
+                       libusb_get_bus_number(dev), port_numbers[0]);
+
+       i = 1;
+       while (port_numbers[i]) {
+               g_snprintf(tmp_s, sizeof(tmp_s), ".%d", port_numbers[i]);
+               g_strlcat((gchar*)&s, tmp_s, sizeof(s));
+               i++;
+       }
+
+       g_strlcpy((gchar*)path, s, path_len);
+
+       return SR_OK;
+}