aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/transport/libusb1_zero_copy.cpp
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2010-09-25 21:07:15 -0700
committerJosh Blum <josh@joshknows.com>2010-09-25 21:07:15 -0700
commitdc8bcfde805228ed5d00334ce44c6c0684dcfe2c (patch)
tree3a5a90152bf984db46ec7471e9a2e668520a9ebf /host/lib/transport/libusb1_zero_copy.cpp
parent1dffd5bb5fe16cd35ba54e44e927888e0192e905 (diff)
downloaduhd-dc8bcfde805228ed5d00334ce44c6c0684dcfe2c.tar.gz
uhd-dc8bcfde805228ed5d00334ce44c6c0684dcfe2c.tar.bz2
uhd-dc8bcfde805228ed5d00334ce44c6c0684dcfe2c.zip
usb: work on libusb code to use a single context across all calls
libusb allocation stuff had been moved inside of smart pointer classes to handle automatic cleanup the public device handle implementation now holds an actual libusb device inside of it needs testing - all platforms
Diffstat (limited to 'host/lib/transport/libusb1_zero_copy.cpp')
-rw-r--r--host/lib/transport/libusb1_zero_copy.cpp83
1 files changed, 29 insertions, 54 deletions
diff --git a/host/lib/transport/libusb1_zero_copy.cpp b/host/lib/transport/libusb1_zero_copy.cpp
index b3a160462..41cd4b3fc 100644
--- a/host/lib/transport/libusb1_zero_copy.cpp
+++ b/host/lib/transport/libusb1_zero_copy.cpp
@@ -24,7 +24,6 @@
using namespace uhd::transport;
-const int libusb_debug_level = 0;
const int libusb_timeout = 0;
/***********************************************************************
@@ -57,8 +56,8 @@ void pp_transfer(libusb_transfer *lut)
**********************************************************************/
class usb_endpoint {
private:
- libusb_device_handle *_dev_handle;
- libusb_context *_ctx;
+ libusb::device_handle::sptr _handle;
+ libusb::session::sptr _session;
int _endpoint;
bool _input;
@@ -90,9 +89,8 @@ private:
void print_transfer_status(libusb_transfer *lut);
public:
- usb_endpoint(libusb_device_handle *dev_handle,
- libusb_context *ctx, int endpoint, bool input,
- size_t transfer_size, size_t num_transfers);
+ usb_endpoint(libusb::device_handle::sptr handle, libusb::session::sptr sess,
+ int endpoint, bool input, size_t transfer_size, size_t num_transfers);
~usb_endpoint();
@@ -143,11 +141,11 @@ void usb_endpoint::callback_handle_transfer(libusb_transfer *lut)
* submit the transfers so that they're ready to return when
* data is available.
*/
-usb_endpoint::usb_endpoint(libusb_device_handle *dev_handle,
- libusb_context *ctx, int endpoint, bool input,
- size_t transfer_size, size_t num_transfers)
- : _dev_handle(dev_handle),
- _ctx(ctx), _endpoint(endpoint), _input(input),
+usb_endpoint::usb_endpoint(
+ libusb::device_handle::sptr handle, libusb::session::sptr sess,
+ int endpoint, bool input, size_t transfer_size, size_t num_transfers)
+ : _handle(handle), _session(sess),
+ _endpoint(endpoint), _input(input),
_transfer_size(transfer_size), _num_transfers(num_transfers)
{
unsigned int i;
@@ -203,7 +201,7 @@ libusb_transfer *usb_endpoint::allocate_transfer(int buff_len)
unsigned int endpoint = ((_endpoint & 0x7f) | (_input ? 0x80 : 0));
libusb_fill_bulk_transfer(lut, // transfer
- _dev_handle, // dev_handle
+ _handle->get(), // dev_handle
endpoint, // endpoint
buff, // buffer
buff_len, // length
@@ -356,7 +354,7 @@ bool usb_endpoint::reap_pending_list()
{
int retval;
- if ((retval = libusb_handle_events(_ctx)) < 0) {
+ if ((retval = libusb_handle_events(_session->get_context())) < 0) {
std::cerr << "error: libusb_handle_events: " << retval << std::endl;
return false;
}
@@ -383,7 +381,7 @@ bool usb_endpoint::reap_pending_list_timeout()
size_t pending_list_size = _pending_list.size();
- if ((retval = libusb_handle_events_timeout(_ctx, &tv)) < 0) {
+ if ((retval = libusb_handle_events_timeout(_session->get_context(), &tv)) < 0) {
std::cerr << "error: libusb_handle_events: " << retval << std::endl;
return false;
}
@@ -613,11 +611,8 @@ private:
usb_endpoint *_rx_ep;
usb_endpoint *_tx_ep;
- // Maintain libusb values
- libusb_context *_rx_ctx;
- libusb_context *_tx_ctx;
- libusb_device_handle *_rx_dev_handle;
- libusb_device_handle *_tx_dev_handle;
+ libusb::device_handle::sptr _handle;
+ libusb::session::sptr _session;
size_t _recv_buff_size;
size_t _send_buff_size;
@@ -626,7 +621,7 @@ private:
public:
typedef boost::shared_ptr<libusb_zero_copy_impl> sptr;
- libusb_zero_copy_impl(usb_device_handle::sptr handle,
+ libusb_zero_copy_impl(libusb::device_handle::sptr handle,
unsigned int rx_endpoint,
unsigned int tx_endpoint,
size_t recv_buff_size,
@@ -646,44 +641,27 @@ public:
* Initializes libusb, opens devices, and sets up interfaces for I/O.
* Finally, creates endpoints for asynchronous I/O.
*/
-libusb_zero_copy_impl::libusb_zero_copy_impl(usb_device_handle::sptr handle,
+libusb_zero_copy_impl::libusb_zero_copy_impl(libusb::device_handle::sptr handle,
unsigned int rx_endpoint,
unsigned int tx_endpoint,
size_t buff_size,
size_t block_size)
- : _rx_ctx(NULL), _tx_ctx(NULL), _rx_dev_handle(NULL), _tx_dev_handle(NULL),
+ : _handle(handle), _session(libusb::session::get_global_session()),
_recv_buff_size(block_size), _send_buff_size(block_size),
_num_frames(buff_size / block_size)
{
- // Initialize libusb with separate contexts to allow
- // thread safe operation of transmit and receive
- libusb::init(&_rx_ctx, libusb_debug_level);
- libusb::init(&_tx_ctx, libusb_debug_level);
-
- UHD_ASSERT_THROW((_rx_ctx != NULL) && (_tx_ctx != NULL));
-
- // Find and open the libusb_device corresponding to the
- // given handle and return the libusb_device_handle
- // that can be used for I/O purposes.
- _rx_dev_handle = libusb::open_device(_rx_ctx, handle);
- _tx_dev_handle = libusb::open_device(_tx_ctx, handle);
-
- // Open USB interfaces for tx/rx using magic values.
- // IN interface: 2
- // OUT interface: 1
- // Control interface: 0
- libusb::open_interface(_rx_dev_handle, 2);
- libusb::open_interface(_tx_dev_handle, 1);
-
- _rx_ep = new usb_endpoint(_rx_dev_handle, // libusb device_handle
- _rx_ctx, // libusb context
+ _handle->claim_interface(2 /*in interface*/);
+ _handle->claim_interface(1 /*out interface*/);
+
+ _rx_ep = new usb_endpoint(_handle, // libusb device_handle
+ _session, // libusb session w/ context
rx_endpoint, // USB endpoint number
true, // IN endpoint
_recv_buff_size, // buffer size per transfer
_num_frames); // number of libusb transfers
- _tx_ep = new usb_endpoint(_tx_dev_handle, // libusb device_handle
- _tx_ctx, // libusb context
+ _tx_ep = new usb_endpoint(_handle, // libusb device_handle
+ _session, // libusb session w/ context
tx_endpoint, // USB endpoint number
false, // OUT endpoint
_send_buff_size, // buffer size per transfer
@@ -694,13 +672,7 @@ libusb_zero_copy_impl::libusb_zero_copy_impl(usb_device_handle::sptr handle,
libusb_zero_copy_impl::~libusb_zero_copy_impl()
{
delete _rx_ep;
- delete _tx_ep;
-
- libusb_close(_rx_dev_handle);
- libusb_close(_tx_dev_handle);
-
- libusb_exit(_rx_ctx);
- libusb_exit(_tx_ctx);
+ delete _tx_ep;
}
@@ -755,7 +727,10 @@ usb_zero_copy::sptr usb_zero_copy::make(usb_device_handle::sptr handle,
size_t block_size)
{
- return sptr(new libusb_zero_copy_impl(handle,
+ libusb::device_handle::sptr dev_handle(libusb::device_handle::get_cached_handle(
+ boost::static_pointer_cast<libusb::special_handle>(handle)->get_device()
+ ));
+ return sptr(new libusb_zero_copy_impl(dev_handle,
rx_endpoint,
tx_endpoint,
buff_size,