diff options
author | Balint Seeber <balint.seeber@ettus.com> | 2015-07-27 15:16:49 -0700 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2015-08-03 10:11:44 -0700 |
commit | 4ed2b26d512ed8c8e78fbbfcf25a3560fd8c7102 (patch) | |
tree | 940764e665d503f50a293ac8d50ca1fb0b605544 /host/lib/transport | |
parent | e1672fa7eedb00a977c39b7e80bb18521493b524 (diff) | |
download | uhd-4ed2b26d512ed8c8e78fbbfcf25a3560fd8c7102.tar.gz uhd-4ed2b26d512ed8c8e78fbbfcf25a3560fd8c7102.tar.bz2 uhd-4ed2b26d512ed8c8e78fbbfcf25a3560fd8c7102.zip |
b200: Change init sequence to catch bad USB states
- Fixes USB hang issues on OS X
- Uses usb_errors
Diffstat (limited to 'host/lib/transport')
-rw-r--r-- | host/lib/transport/libusb1_base.cpp | 15 | ||||
-rw-r--r-- | host/lib/transport/libusb1_base.hpp | 4 | ||||
-rw-r--r-- | host/lib/transport/libusb1_zero_copy.cpp | 4 |
3 files changed, 21 insertions, 2 deletions
diff --git a/host/lib/transport/libusb1_base.cpp b/host/lib/transport/libusb1_base.cpp index 0baf8dc76..9635d34b0 100644 --- a/host/lib/transport/libusb1_base.cpp +++ b/host/lib/transport/libusb1_base.cpp @@ -251,6 +251,21 @@ public: _claimed.push_back(interface); } + void clear_endpoints(unsigned char recv_endpoint, unsigned char send_endpoint) + { + int ret; + ret = libusb_clear_halt(this->get(), recv_endpoint | 0x80); + UHD_LOG << "usb device handle: recv endpoint clear: " << libusb_error_name(ret) << std::endl; + ret = libusb_clear_halt(this->get(), send_endpoint | 0x00); + UHD_LOG << "usb device handle: send endpoint clear: " << libusb_error_name(ret) << std::endl; + } + + void reset_device(void) + { + int ret = libusb_reset_device(this->get()); + UHD_LOG << "usb device handle: dev Reset: " << libusb_error_name(ret) << std::endl; + } + private: libusb::device::sptr _dev; //always keep a reference to device libusb_device_handle *_handle; diff --git a/host/lib/transport/libusb1_base.hpp b/host/lib/transport/libusb1_base.hpp index b00946614..2e16dc176 100644 --- a/host/lib/transport/libusb1_base.hpp +++ b/host/lib/transport/libusb1_base.hpp @@ -135,6 +135,10 @@ namespace libusb { * Control interface: 0 */ virtual void claim_interface(int) = 0; + + virtual void clear_endpoints(unsigned char recv_endpoint, unsigned char send_endpoint) = 0; + + virtual void reset_device(void) = 0; }; /*! diff --git a/host/lib/transport/libusb1_zero_copy.cpp b/host/lib/transport/libusb1_zero_copy.cpp index 1ac02d16f..465adc95e 100644 --- a/host/lib/transport/libusb1_zero_copy.cpp +++ b/host/lib/transport/libusb1_zero_copy.cpp @@ -148,14 +148,14 @@ public: UHD_INLINE void submit(void) { - _lut->length = (_is_recv)? _frame_size : size(); //always set length + _lut->length = (_is_recv)? _frame_size : size(); //always set length #ifdef UHD_TXRX_DEBUG_PRINTS result.start_time = boost::get_system_time().time_of_day().total_microseconds(); result.buff_num = num(); result.is_recv = _is_recv; #endif const int ret = libusb_submit_transfer(_lut); - if (ret != 0) throw uhd::runtime_error(str(boost::format( + if (ret != 0) throw uhd::usb_error(ret, str(boost::format( "usb %s submit failed: %s") % _name % libusb_error_name(ret))); } |