blob: 9d7e30d4cc7394bda5113945480837806adf78e5 [file] [log] [blame]
// Copyright 2017 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.
#pragma once
#include <ddk/device.h>
#include <ddktl/device.h>
#include <ddktl/protocol/hidbus.h>
#include <fbl/array.h>
#include <fbl/mutex.h>
#include <fbl/unique_ptr.h>
#include <threads.h>
#include <zircon/compiler.h>
#include <zircon/types.h>
#include <lib/zx/socket.h>
#include <fuchsia/hardware/hidctl/c/fidl.h>
namespace hidctl {
class HidCtl : public ddk::Device<HidCtl, ddk::Messageable> {
public:
HidCtl(zx_device_t* device);
zx_status_t DdkMessage(fidl_msg_t* msg, fidl_txn_t* txn);
void DdkRelease();
private:
static zx_status_t FidlMakeHidDevice(void* ctx,
const fuchsia_hardware_hidctl_HidCtlConfig* config,
const uint8_t* rpt_desc_data, size_t rpt_desc_count,
fidl_txn_t* txn);
};
class HidDevice : public ddk::Device<HidDevice, ddk::Unbindable>,
public ddk::HidbusProtocol<HidDevice, ddk::base_protocol> {
public:
HidDevice(zx_device_t* device, const fuchsia_hardware_hidctl_HidCtlConfig* config,
fbl::Array<const uint8_t> report_desc, zx::socket data);
void DdkRelease();
void DdkUnbind();
zx_status_t HidbusQuery(uint32_t options, hid_info_t* info);
zx_status_t HidbusStart(const hidbus_ifc_protocol_t* ifc);
void HidbusStop();
zx_status_t HidbusGetDescriptor(uint8_t desc_type, void** data, size_t* len);
zx_status_t HidbusGetReport(uint8_t rpt_type, uint8_t rpt_id, void* data, size_t len,
size_t* out_len);
zx_status_t HidbusSetReport(uint8_t rpt_type, uint8_t rpt_id, const void* data, size_t len);
zx_status_t HidbusGetIdle(uint8_t rpt_id, uint8_t* duration);
zx_status_t HidbusSetIdle(uint8_t rpt_id, uint8_t duration);
zx_status_t HidbusGetProtocol(uint8_t* protocol);
zx_status_t HidbusSetProtocol(uint8_t protocol);
int Thread();
void Shutdown();
private:
zx_status_t Recv(uint8_t* buffer, uint32_t capacity);
bool boot_device_;
uint8_t dev_class_;
fbl::Array<const uint8_t> report_desc_;
uint32_t mtu_ = 256; // TODO: set this based on report_desc_
fbl::Mutex lock_;
ddk::HidbusIfcProtocolClient client_ __TA_GUARDED(lock_);
zx::socket data_;
thrd_t thread_;
};
} // namespace hidctl