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

Commit c526c79b authored by Tobias Thierer's avatar Tobias Thierer Committed by android-build-merger
Browse files

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

am: f6ee8fe5

Change-Id: Ia50999004b5505566051e3927daa646a2024687b
parents e2153313 f6ee8fe5
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;
}