blob: 6f6f165adacdafae59a2a2bb00e373a460acfcab [file] [log] [blame]
// Copyright 2020 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_TESTS_USB_HCI_TEST_USB_HCI_TEST_DRIVER_H_
#define SRC_DEVICES_USB_TESTS_USB_HCI_TEST_USB_HCI_TEST_DRIVER_H_
#include <fuchsia/hardware/usb/hcitest/llcpp/fidl.h>
#include <lib/zx/vmo.h>
#include <optional>
#include <thread>
#include <ddktl/device.h>
#include <ddktl/fidl.h>
#include <ddktl/protocol/empty-protocol.h>
#include <ddktl/protocol/usb.h>
#include <usb/usb.h>
namespace usb {
class HciTest;
using HciTestBase = ddk::Device<HciTest, ddk::Unbindable, ddk::Messageable, ddk::Initializable>;
class HciTest : public HciTestBase,
public ddk::EmptyProtocol<ZX_PROTOCOL_USB_HCI_TEST>,
public llcpp::fuchsia::hardware::usb::hcitest::Device::Interface {
public:
HciTest(zx_device_t* parent, const ddk::UsbProtocolClient& usb)
: HciTestBase(parent), usb_(usb) {}
// Spawns device node based on parent node.
static zx_status_t Create(void* ctx, zx_device_t* parent);
void DdkUnbind(ddk::UnbindTxn txn) {
if (test_thread_.has_value()) {
if (test_thread_->joinable()) {
test_thread_->join();
}
}
txn.Reply();
}
void DdkRelease() { delete this; }
void Run(RunCompleter::Sync& _completer);
zx_status_t DdkMessage(fidl_incoming_msg_t* msg, fidl_txn_t* txn) {
DdkTransaction transaction(txn);
llcpp::fuchsia::hardware::usb::hcitest::Device::Dispatch(this, msg, &transaction);
return transaction.Status();
}
void DdkInit(ddk::InitTxn txn);
void TestThread(RunCompleter::Async completer);
void EnumerationThread(ddk::InitTxn txn);
private:
bool test_running_ = false;
std::optional<std::thread> test_thread_;
std::optional<std::thread> enumeration_thread_;
static void request_complete(void* ctx, usb_request_t* request);
zx_status_t Bind();
usb_ss_ep_comp_descriptor_t bulk_out_3_ = {};
usb_endpoint_descriptor_t bulk_out_ = {};
usb_endpoint_descriptor_t irq_in_ = {};
usb_ss_ep_comp_descriptor_t irq_in_3_ = {};
usb_endpoint_descriptor_t isoch_in_ = {};
usb_ss_ep_comp_descriptor_t isoch_in_3_ = {};
usb_ss_ep_comp_descriptor_t bulk_in_3_ = {};
usb_endpoint_descriptor_t bulk_in_ = {};
const ddk::UsbProtocolClient usb_;
};
} // namespace usb
#endif // SRC_DEVICES_USB_TESTS_USB_HCI_TEST_USB_HCI_TEST_DRIVER_H_