Merge "Revert "Add derived UsbTransport class with USB reset method""

This commit is contained in:
Tobias Thierer 2018-07-25 15:24:54 +00:00 committed by Gerrit Code Review
commit f6ee8fe515
4 changed files with 18 additions and 59 deletions

View file

@ -52,13 +52,6 @@ struct usb_ifc_info {
char device_path[256];
};
class UsbTransport : public Transport {
// Resets the underlying transport. Returns 0 on success.
// This effectively simulates unplugging and replugging
virtual int Reset() = 0;
};
typedef int (*ifc_match_func)(usb_ifc_info *ifc);
// 0 is non blocking
UsbTransport* usb_open(ifc_match_func callback, uint32_t timeout_ms = 0);
Transport* usb_open(ifc_match_func callback);

View file

@ -52,7 +52,7 @@
using namespace std::chrono_literals;
#define MAX_RETRIES 2
#define MAX_RETRIES 5
/* Timeout in seconds for usb_wait_for_disconnect.
* It doesn't usually take long for a device to disconnect (almost always
@ -91,21 +91,18 @@ struct usb_handle
unsigned char ep_out;
};
class LinuxUsbTransport : public UsbTransport {
class LinuxUsbTransport : public Transport {
public:
explicit LinuxUsbTransport(std::unique_ptr<usb_handle> handle, uint32_t ms_timeout = 0)
: handle_(std::move(handle)), ms_timeout_(ms_timeout) {}
explicit LinuxUsbTransport(std::unique_ptr<usb_handle> handle) : handle_(std::move(handle)) {}
~LinuxUsbTransport() override = default;
ssize_t Read(void* data, size_t len) override;
ssize_t Write(const void* data, size_t len) override;
int Close() override;
int Reset() override;
int WaitForDisconnect() override;
private:
std::unique_ptr<usb_handle> handle_;
const uint32_t ms_timeout_;
DISALLOW_COPY_AND_ASSIGN(LinuxUsbTransport);
};
@ -405,7 +402,7 @@ ssize_t LinuxUsbTransport::Write(const void* _data, size_t len)
bulk.ep = handle_->ep_out;
bulk.len = xfer;
bulk.data = data;
bulk.timeout = ms_timeout_;
bulk.timeout = 0;
n = ioctl(handle_->desc, USBDEVFS_BULK, &bulk);
if(n != xfer) {
@ -439,7 +436,7 @@ ssize_t LinuxUsbTransport::Read(void* _data, size_t len)
bulk.ep = handle_->ep_in;
bulk.len = xfer;
bulk.data = data;
bulk.timeout = ms_timeout_;
bulk.timeout = 0;
retry = 0;
do {
@ -450,7 +447,7 @@ ssize_t LinuxUsbTransport::Read(void* _data, size_t len)
if (n < 0) {
DBG1("ERROR: n = %d, errno = %d (%s)\n",n, errno, strerror(errno));
if (++retry > MAX_RETRIES) return -1;
std::this_thread::sleep_for(100ms);
std::this_thread::sleep_for(1s);
}
} while (n < 0);
@ -480,19 +477,10 @@ int LinuxUsbTransport::Close()
return 0;
}
int LinuxUsbTransport::Reset() {
int ret = 0;
// We reset the USB connection
if ((ret = ioctl(handle_->desc, USBDEVFS_RESET, 0))) {
return ret;
}
return 0;
}
UsbTransport* usb_open(ifc_match_func callback, uint32_t timeout_ms) {
Transport* usb_open(ifc_match_func callback)
{
std::unique_ptr<usb_handle> handle = find_usb_device("/sys/bus/usb/devices", callback);
return handle ? new LinuxUsbTransport(std::move(handle), timeout_ms) : nullptr;
return handle ? new LinuxUsbTransport(std::move(handle)) : nullptr;
}
/* Wait for the system to notice the device is gone, so that a subsequent

View file

@ -65,20 +65,17 @@ struct usb_handle
unsigned int zero_mask;
};
class OsxUsbTransport : public UsbTransport {
class OsxUsbTransport : public Transport {
public:
OsxUsbTransport(std::unique_ptr<usb_handle> handle, uint32_t ms_timeout)
: handle_(std::move(handle)), ms_timeout_(ms_timeout) {}
OsxUsbTransport(std::unique_ptr<usb_handle> handle) : handle_(std::move(handle)) {}
~OsxUsbTransport() override = default;
ssize_t Read(void* data, size_t len) override;
ssize_t Write(const void* data, size_t len) override;
int Close() override;
int Reset() override;
private:
std::unique_ptr<usb_handle> handle_;
const uint32_t ms_timeout_;
DISALLOW_COPY_AND_ASSIGN(OsxUsbTransport);
};
@ -459,7 +456,7 @@ static int init_usb(ifc_match_func callback, std::unique_ptr<usb_handle>* handle
* Definitions of this file's public functions.
*/
UsbTransport* usb_open(ifc_match_func callback, uint32_t timeout_ms) {
Transport* usb_open(ifc_match_func callback) {
std::unique_ptr<usb_handle> handle;
if (init_usb(callback, &handle) < 0) {
@ -467,7 +464,7 @@ UsbTransport* usb_open(ifc_match_func callback, uint32_t timeout_ms) {
return nullptr;
}
return new OsxUsbTransport(std::move(handle), timeout_ms);
return new OsxUsbTransport(std::move(handle));
}
int OsxUsbTransport::Close() {
@ -475,17 +472,6 @@ int OsxUsbTransport::Close() {
return 0;
}
int OsxUsbTransport::Reset() {
IOReturn result = (*handle_->interface)->ResetDevice(handle_->interface);
if (result == 0) {
return 0;
} else {
ERR("usb_reset failed with status %x\n", result);
return -1;
}
}
ssize_t OsxUsbTransport::Read(void* data, size_t len) {
IOReturn result;
UInt32 numBytes = len;
@ -508,9 +494,7 @@ ssize_t OsxUsbTransport::Read(void* data, size_t len) {
return -1;
}
result = (*handle_->interface)
->ReadPipeTO(handle_->interface, handle_->bulkIn, data, &numBytes,
USB_TRANSACTION_TIMEOUT, USB_TRANSACTION_TIMEOUT);
result = (*handle_->interface)->ReadPipe(handle_->interface, handle_->bulkIn, data, &numBytes);
if (result == 0) {
return (int) numBytes;

View file

@ -66,7 +66,7 @@ struct usb_handle {
std::string interface_name;
};
class WindowsUsbTransport : public UsbTransport {
class WindowsUsbTransport : public Transport {
public:
WindowsUsbTransport(std::unique_ptr<usb_handle> handle) : handle_(std::move(handle)) {}
~WindowsUsbTransport() override = default;
@ -74,7 +74,6 @@ class WindowsUsbTransport : public UsbTransport {
ssize_t Read(void* data, size_t len) override;
ssize_t Write(const void* data, size_t len) override;
int Close() override;
int Reset() override;
private:
std::unique_ptr<usb_handle> handle_;
@ -262,12 +261,6 @@ int WindowsUsbTransport::Close() {
return 0;
}
int WindowsUsbTransport::Reset() {
DBG("usb_reset currently unsupported\n\n");
// TODO, this is a bit complicated since it is using ADB
return -1;
}
int recognized_device(usb_handle* handle, ifc_match_func callback) {
struct usb_ifc_info info;
USB_DEVICE_DESCRIPTOR device_desc;
@ -373,7 +366,8 @@ static std::unique_ptr<usb_handle> find_usb_device(ifc_match_func callback) {
return handle;
}
UsbTransport* usb_open(ifc_match_func callback, uint32_t) {
Transport* usb_open(ifc_match_func callback)
{
std::unique_ptr<usb_handle> handle = find_usb_device(callback);
return handle ? new WindowsUsbTransport(std::move(handle)) : nullptr;
}