Add usb_get_port_path() helper function
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.
This commit is contained in:
parent
f12d997948
commit
db156e5409
|
@ -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 ------------------------------------------------*/
|
||||
|
|
26
src/usb.c
26
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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue