diff options
| author | Thomas Tsou <ttsou@vt.edu> | 2010-08-27 13:27:32 -0700 | 
|---|---|---|
| committer | Thomas Tsou <ttsou@vt.edu> | 2010-08-27 14:59:12 -0700 | 
| commit | b6099569e31705174920f44083f7f1bc22c445c7 (patch) | |
| tree | 522db9a9a5a45a6644a194c774145401439ed5f6 | |
| parent | c30cbf651ba5efc734faa96c1b12a99b15b6e41e (diff) | |
| download | uhd-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.cpp | 50 | ||||
| -rw-r--r-- | host/lib/transport/libusb1_base.hpp | 2 | ||||
| -rw-r--r-- | host/lib/transport/libusb1_device_handle.cpp | 31 | 
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;   } | 
