aboutsummaryrefslogtreecommitdiffstats
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
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.
-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;
}