blob: 50a079378ec3ea7795cf9d83268fdc385df0e74f [file] [log] [blame]
// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_HUDDLY_HPK_USB_H_
#define SRC_HUDDLY_HPK_USB_H_
#include <libusb.h>
#include <cstdint>
#include <functional>
#include <memory>
#include <vector>
namespace huddly {
class Usb;
class UsbEndpoint {
public:
UsbEndpoint() {}
explicit UsbEndpoint(const libusb_endpoint_descriptor& descriptor);
int address() const { return address_; }
int max_size() const { return max_size_; }
private:
int address_ = -1;
int max_size_ = -1;
};
class UsbDevice {
public:
explicit UsbDevice(const Usb* usb, libusb_device* dev);
UsbDevice(const UsbDevice&) = delete;
UsbDevice& operator=(const UsbDevice&) = delete;
~UsbDevice();
bool Open();
void Close();
std::unique_ptr<libusb_config_descriptor,
std::function<void(libusb_config_descriptor*)>>
GetActiveConfigDescriptor();
uint16_t GetVendorId() const;
uint16_t GetProductId() const;
bool CheckKernelDriverActive(uint8_t interface_number, bool* driver_active);
bool DetachKernelDriver(uint8_t interface_number);
bool ReattachKernelDriver(uint8_t interface_number);
bool ClaimInterface(uint8_t interface_number);
bool ReleaseInterface(uint8_t interface_number);
bool BulkWrite(const UsbEndpoint& endpoint,
const std::vector<uint8_t> data,
const unsigned int timeout_ms);
bool BulkRead(const UsbEndpoint& endpoint,
const unsigned int timeout_ms,
std::vector<uint8_t>* data);
bool WaitForDetach(const unsigned int timeout_ms);
const Usb* GetUsb() { return usb_; }
private:
const Usb* usb_ = nullptr;
libusb_device* dev_ = nullptr;
libusb_device_descriptor device_descriptor_ = {};
libusb_device_handle* devh_ = nullptr;
};
class UsbDeviceList {
public:
static std::unique_ptr<UsbDeviceList> Create(libusb_context* ctx);
UsbDeviceList(const UsbDeviceList&) = delete;
UsbDeviceList& operator=(const UsbDeviceList&) = delete;
~UsbDeviceList();
bool Valid() const;
libusb_device** begin();
libusb_device** end();
private:
UsbDeviceList() {}
ssize_t count_;
libusb_device** devices_;
};
class Usb {
public:
static std::unique_ptr<Usb> Create();
Usb(const Usb&) = delete;
Usb& operator=(const Usb&) = delete;
~Usb();
std::unique_ptr<UsbDevice> FindDevice(uint16_t vid,
uint16_t pid,
const std::string& usb_path) const;
std::unique_ptr<UsbDevice> WaitForDevice(uint16_t vid,
uint16_t pid,
const std::string& usb_path,
int timeout_ms) const;
bool DeviceExists(libusb_device* device) const;
bool WaitForDeviceDetach(libusb_device* device, int timeout_ms) const;
private:
Usb() {}
libusb_context* ctx_ = nullptr;
};
} // namespace huddly
#endif // SRC_HUDDLY_HPK_USB_H_