aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib
diff options
context:
space:
mode:
authorThomas Tsou <ttsou@vt.edu>2010-08-27 13:27:32 -0700
committerThomas Tsou <ttsou@vt.edu>2010-08-27 14:59:12 -0700
commitb6099569e31705174920f44083f7f1bc22c445c7 (patch)
tree522db9a9a5a45a6644a194c774145401439ed5f6 /host/lib
parentc30cbf651ba5efc734faa96c1b12a99b15b6e41e (diff)
downloaduhd-b6099569e31705174920f44083f7f1bc22c445c7.tar.gz
uhd-b6099569e31705174920f44083f7f1bc22c445c7.tar.bz2
uhd-b6099569e31705174920f44083f7f1bc22c445c7.zip
usrp1: Cleanup libusb device handling
This patch limits all libusb device enumeration operations to FSF (Vendor ID = 0xfffe) devices, which removes a lot of unncessary libusb output when debug mode is enabled. The reference counts held by the libusb device list are also reduced, which prevents holding references to unused devices.
Diffstat (limited to 'host/lib')
-rw-r--r--host/lib/transport/libusb1_base.cpp50
-rw-r--r--host/lib/transport/libusb1_base.hpp2
-rw-r--r--host/lib/transport/libusb1_device_handle.cpp31
3 files changed, 50 insertions, 33 deletions
diff --git a/host/lib/transport/libusb1_base.cpp b/host/lib/transport/libusb1_base.cpp
index 6965de214..493d4eff3 100644
--- a/host/lib/transport/libusb1_base.cpp
+++ b/host/lib/transport/libusb1_base.cpp
@@ -16,10 +16,22 @@
//
#include "libusb1_base.hpp"
+#include <uhd/utils/assert.hpp>
#include <iostream>
using namespace uhd::transport;
+bool check_fsf_device(libusb_device *dev)
+{
+ libusb_device_descriptor desc;
+
+ if (libusb_get_device_descriptor(dev, &desc) < 0) {
+ UHD_ASSERT_THROW("USB: failed to get device descriptor");
+ }
+
+ return desc.idVendor == 0xfffe;
+}
+
void libusb::init(libusb_context **ctx, int debug_level)
{
if (libusb_init(ctx) < 0)
@@ -28,27 +40,47 @@ void libusb::init(libusb_context **ctx, int debug_level)
libusb_set_debug(*ctx, debug_level);
}
+std::vector<libusb_device *> libusb::get_fsf_device_list(libusb_context *ctx)
+{
+ libusb_device **libusb_dev_list;
+ std::vector<libusb_device *> fsf_dev_list;
+
+ ssize_t dev_cnt = libusb_get_device_list(ctx, &libusb_dev_list);
+
+ //find the FSF devices
+ for (ssize_t i = 0; i < dev_cnt; i++) {
+ libusb_device *dev = libusb_dev_list[i];
+
+ if (check_fsf_device(dev))
+ fsf_dev_list.push_back(dev);
+ else
+ libusb_unref_device(dev);
+ }
+
+ libusb_free_device_list(libusb_dev_list, 0);
+
+ return fsf_dev_list;
+}
libusb_device_handle *libusb::open_device(libusb_context *ctx,
usb_device_handle::sptr handle)
{
- libusb_device **dev_list;
- libusb_device_handle *dev_handle;
+ libusb_device_handle *dev_handle = NULL;
+ std::vector<libusb_device *> fsf_dev_list = get_fsf_device_list(ctx);
- ssize_t dev_cnt = libusb_get_device_list(ctx, &dev_list);
-
- //find and open the receive device
- for (ssize_t i = 0; i < dev_cnt; i++) {
- libusb_device *dev = dev_list[i];
+ //find and open the USB device
+ for (size_t i = 0; i < fsf_dev_list.size(); i++) {
+ libusb_device *dev = fsf_dev_list[i];
if (compare_device(dev, handle)) {
libusb_open(dev, &dev_handle);
+ libusb_unref_device(dev);
break;
}
+
+ libusb_unref_device(dev);
}
- libusb_free_device_list(dev_list, 0);
-
return dev_handle;
}
diff --git a/host/lib/transport/libusb1_base.hpp b/host/lib/transport/libusb1_base.hpp
index ae560cd52..708a42c73 100644
--- a/host/lib/transport/libusb1_base.hpp
+++ b/host/lib/transport/libusb1_base.hpp
@@ -27,6 +27,8 @@ namespace uhd { namespace transport {
namespace libusb {
void init(libusb_context **ctx, int debug_level);
+ std::vector<libusb_device *> get_fsf_device_list(libusb_context *ctx);
+
libusb_device_handle *open_device(libusb_context *ctx,
usb_device_handle::sptr handle);
diff --git a/host/lib/transport/libusb1_device_handle.cpp b/host/lib/transport/libusb1_device_handle.cpp
index 5289f668f..4885099eb 100644
--- a/host/lib/transport/libusb1_device_handle.cpp
+++ b/host/lib/transport/libusb1_device_handle.cpp
@@ -88,38 +88,21 @@ usb_device_handle::sptr make_usb_device_handle(libusb_device *dev)
device_addr));
}
-bool check_fsf_device(libusb_device *dev)
-{
- libusb_device_descriptor desc;
-
- if (libusb_get_device_descriptor(dev, &desc) < 0) {
- UHD_ASSERT_THROW("USB: failed to get device descriptor");
- }
-
- return desc.idVendor == 0xfffe;
-}
-
std::vector<usb_device_handle::sptr> usb_device_handle::get_device_list()
{
libusb_context *ctx = NULL;
- libusb_device **list;
- std::vector<usb_device_handle::sptr> device_list;
+ std::vector<libusb_device *> libusb_device_list;
+ std::vector<usb_device_handle::sptr> device_handle_list;
libusb::init(&ctx, libusb_debug_level);
- ssize_t cnt = libusb_get_device_list(ctx, &list);
-
- if (cnt < 0)
- throw std::runtime_error("USB: enumeration failed");
+ libusb_device_list = libusb::get_fsf_device_list(ctx);
- ssize_t i = 0;
- for (i = 0; i < cnt; i++) {
- libusb_device *dev = list[i];
- if (check_fsf_device(dev))
- device_list.push_back(make_usb_device_handle(dev));
+ for (size_t i = 0; i < libusb_device_list.size(); i++) {
+ libusb_device *dev = libusb_device_list[i];
+ device_handle_list.push_back(make_usb_device_handle(dev));
}
- libusb_free_device_list(list, 0);
libusb_exit(ctx);
- return device_list;
+ return device_handle_list;
}