Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f6ee8fe5 authored by Tobias Thierer's avatar Tobias Thierer Committed by Gerrit Code Review
Browse files

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

parents 1c92fa44 ec1542f2
Loading
Loading
Loading
Loading
+1 −8
Original line number Diff line number Diff line
@@ -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);
+9 −21
Original line number Diff line number Diff line
@@ -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
+5 −21
Original line number Diff line number Diff line
@@ -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;
+3 −9
Original line number Diff line number Diff line
@@ -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;
}