blob: ecd328cfad5d17f3bca5f32aa7db38dc2433fcd2 [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/mutex.h>
#include <fbl/unique_ptr.h>
#include <threads.h>
#include <zircon/compiler.h>
#include <zircon/device/hidctl.h>
#include <zircon/types.h>
#include <lib/zx/socket.h>
namespace hidctl {
class HidCtl : public ddk::Device<HidCtl, ddk::Ioctlable> {
public:
HidCtl(zx_device_t* device);
void DdkRelease();
zx_status_t DdkIoctl(uint32_t op, const void* in_buf, size_t in_len, void* out_buf,
size_t out_len, size_t* out_actual);
};
class HidDevice : public ddk::Device<HidDevice, ddk::Unbindable>,
public ddk::HidbusProtocol<HidDevice, ddk::base_protocol> {
public:
HidDevice(zx_device_t* device, const hid_ioctl_config* config, 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_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::unique_ptr<uint8_t[]> report_desc_;
size_t report_desc_len_ = 0;
uint32_t mtu_ = 256; // TODO: set this based on report_desc_
fbl::Mutex lock_;
ddk::HidbusIfcClient client_ __TA_GUARDED(lock_);
zx::socket data_;
thrd_t thread_;
};
} // namespace hidctl