blob: a6b3025ec0ad4c0c7c936d31247af855b81c8fec [file] [log] [blame]
// Copyright 2019 The Fuchsia 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_DEVICES_USB_DRIVERS_USB_VIRTUAL_BUS_USB_VIRTUAL_DEVICE_H_
#define SRC_DEVICES_USB_DRIVERS_USB_VIRTUAL_BUS_USB_VIRTUAL_DEVICE_H_
#include <fidl/fuchsia.hardware.usb.dci/cpp/fidl.h>
#include <fuchsia/hardware/usb/dci/cpp/banjo.h>
#include <lib/ddk/device.h>
#include <ddktl/device.h>
#include <fbl/macros.h>
namespace usb_virtual_bus {
class UsbVirtualBus;
class UsbVirtualDevice;
using UsbVirtualDeviceType = ddk::Device<UsbVirtualDevice>;
// This class implements the virtual USB device controller protocol.
class UsbVirtualDevice : public UsbVirtualDeviceType,
public ddk::UsbDciProtocol<UsbVirtualDevice, ddk::base_protocol>,
public fidl::Server<fuchsia_hardware_usb_dci::UsbDci> {
public:
explicit UsbVirtualDevice(zx_device_t* parent, UsbVirtualBus* bus)
: UsbVirtualDeviceType(parent), bus_(bus) {}
// Device protocol implementation.
void DdkRelease();
// USB device controller protocol implementation.
void UsbDciRequestQueue(usb_request_t* usb_request,
const usb_request_complete_callback_t* complete_cb);
zx_status_t UsbDciSetInterface(const usb_dci_interface_protocol_t* interface);
zx_status_t UsbDciConfigEp(const usb_endpoint_descriptor_t* ep_desc,
const usb_ss_ep_comp_descriptor_t* ss_comp_desc);
zx_status_t UsbDciDisableEp(uint8_t ep_address);
zx_status_t UsbDciEpSetStall(uint8_t ep_address);
zx_status_t UsbDciEpClearStall(uint8_t ep_address);
zx_status_t UsbDciCancelAll(uint8_t endpoint);
size_t UsbDciGetRequestSize();
// fuchsia_hardware_usb.UsbDci protocol implementation.
void ConnectToEndpoint(ConnectToEndpointRequest& request,
ConnectToEndpointCompleter::Sync& completer) override;
private:
DISALLOW_COPY_ASSIGN_AND_MOVE(UsbVirtualDevice);
UsbVirtualBus* bus_;
};
} // namespace usb_virtual_bus
#endif // SRC_DEVICES_USB_DRIVERS_USB_VIRTUAL_BUS_USB_VIRTUAL_DEVICE_H_