summaryrefslogtreecommitdiffstats
path: root/host/lib/transport
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/transport')
-rw-r--r--host/lib/transport/libusb1_base.cpp52
-rw-r--r--host/lib/transport/libusb1_base.hpp10
-rw-r--r--host/lib/transport/libusb1_device_handle.cpp18
3 files changed, 20 insertions, 60 deletions
diff --git a/host/lib/transport/libusb1_base.cpp b/host/lib/transport/libusb1_base.cpp
index 92dcd969f..e21c39aa3 100644
--- a/host/lib/transport/libusb1_base.cpp
+++ b/host/lib/transport/libusb1_base.cpp
@@ -24,22 +24,6 @@ using namespace uhd::transport;
/**********************************************************
* Helper Methods
**********************************************************/
-/*
- * Check for FSF device
- * Compare the device's descriptor Vendor ID
- * \param dev pointer to libusb_device
- * \return true if Vendor ID matches 0xfffe
- */
-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;
-}
/**********************************************************
* libusb namespace
@@ -52,37 +36,16 @@ 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_handle *dev_handle = NULL;
- std::vector<libusb_device *> fsf_dev_list = get_fsf_device_list(ctx);
+ libusb_device **libusb_dev_list;
+ size_t dev_cnt = libusb_get_device_list(ctx, &libusb_dev_list);
//find and open the USB device
- for (size_t i = 0; i < fsf_dev_list.size(); i++) {
- libusb_device *dev = fsf_dev_list[i];
+ for (size_t i = 0; i < dev_cnt; i++) {
+ libusb_device *dev = libusb_dev_list[i];
if (compare_device(dev, handle)) {
libusb_open(dev, &dev_handle);
@@ -96,7 +59,8 @@ libusb_device_handle *libusb::open_device(libusb_context *ctx,
return dev_handle;
}
-
+//note: changed order of checks so it only tries to get_serial and get_device_address if vid and pid match
+//doing this so it doesn't try to open the device if it's not ours
bool libusb::compare_device(libusb_device *dev,
usb_device_handle::sptr handle)
{
@@ -108,12 +72,12 @@ bool libusb::compare_device(libusb_device *dev,
libusb_device_descriptor libusb_desc;
if (libusb_get_device_descriptor(dev, &libusb_desc) < 0)
return false;
- if (serial != get_serial(dev))
- return false;
if (vendor_id != libusb_desc.idVendor)
return false;
if (product_id != libusb_desc.idProduct)
return false;
+ if (serial != get_serial(dev))
+ return false;
if (device_addr != libusb_get_device_address(dev))
return false;
diff --git a/host/lib/transport/libusb1_base.hpp b/host/lib/transport/libusb1_base.hpp
index 442f89ded..abe5e22a2 100644
--- a/host/lib/transport/libusb1_base.hpp
+++ b/host/lib/transport/libusb1_base.hpp
@@ -42,16 +42,6 @@ namespace libusb {
void init(libusb_context **ctx, int debug_level);
/*
- * Get a list of Free Software Foundation devices (Vendor ID 0xfffe)
- * As opposed to the public USB device handle interface, which returns
- * generic identifiers, this call returns device pointers speficic
- * to libusb.
- * \param ctx the libusb context used for init
- * \return a vector of libusb devices
- */
- std::vector<libusb_device *> get_fsf_device_list(libusb_context *ctx);
-
- /*
* Open the device specified by a generic handle
* Find the libusb_device cooresponding to the generic handle
* and open it for I/O, which returns a libusb_device_handle
diff --git a/host/lib/transport/libusb1_device_handle.cpp b/host/lib/transport/libusb1_device_handle.cpp
index 5d9d8faf0..43d0f0e26 100644
--- a/host/lib/transport/libusb1_device_handle.cpp
+++ b/host/lib/transport/libusb1_device_handle.cpp
@@ -17,6 +17,7 @@
#include "libusb1_base.hpp"
#include <uhd/utils/assert.hpp>
+#include <iostream>
using namespace uhd::transport;
@@ -91,19 +92,24 @@ usb_device_handle::sptr make_usb_device_handle(libusb_device *dev)
device_addr));
}
-std::vector<usb_device_handle::sptr> usb_device_handle::get_device_list()
+std::vector<usb_device_handle::sptr> usb_device_handle::get_device_list(boost::uint16_t vid, boost::uint16_t pid)
{
libusb_context *ctx = NULL;
- std::vector<libusb_device *> libusb_device_list;
+ libusb_device** libusb_device_list;
std::vector<usb_device_handle::sptr> device_handle_list;
+ libusb_device_descriptor desc;
libusb::init(&ctx, libusb_debug_level);
- libusb_device_list = libusb::get_fsf_device_list(ctx);
-
- for (size_t i = 0; i < libusb_device_list.size(); i++) {
+ size_t dev_size = libusb_get_device_list(ctx, &libusb_device_list);
+ for (size_t i = 0; i < dev_size; i++) {
libusb_device *dev = libusb_device_list[i];
- device_handle_list.push_back(make_usb_device_handle(dev));
+ if(libusb_get_device_descriptor(dev, &desc) < 0) {
+ UHD_ASSERT_THROW("USB: failed to get device descriptor");
+ }
+ if(desc.idVendor == vid && desc.idProduct == pid) {
+ device_handle_list.push_back(make_usb_device_handle(dev));
+ }
}
libusb_exit(ctx);