blob: c2e8d0168e3bce2122e565e6d77beb213703a1b3 [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;
void SetInterface(SetInterfaceRequest& request, SetInterfaceCompleter::Sync& completer) override {
completer.Reply(zx::error(ZX_ERR_NOT_SUPPORTED));
}
void ConfigureEndpoint(ConfigureEndpointRequest& request,
ConfigureEndpointCompleter::Sync& completer) override {
completer.Reply(zx::error(ZX_ERR_NOT_SUPPORTED));
}
void DisableEndpoint(DisableEndpointRequest& request,
DisableEndpointCompleter::Sync& completer) override {
completer.Reply(zx::error(ZX_ERR_NOT_SUPPORTED));
}
void EndpointSetStall(EndpointSetStallRequest& request,
EndpointSetStallCompleter::Sync& completer) override {
completer.Reply(zx::error(ZX_ERR_NOT_SUPPORTED));
}
void EndpointClearStall(EndpointClearStallRequest& request,
EndpointClearStallCompleter::Sync& completer) override {
completer.Reply(zx::error(ZX_ERR_NOT_SUPPORTED));
}
void CancelAll(CancelAllRequest& request, CancelAllCompleter::Sync& completer) override {
completer.Reply(zx::error(ZX_ERR_NOT_SUPPORTED));
}
void handle_unknown_method(fidl::UnknownMethodMetadata<fuchsia_hardware_usb_dci::UsbDci> metadata,
fidl::UnknownMethodCompleter::Sync& completer) override {
completer.Close(ZX_ERR_NOT_SUPPORTED);
}
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_