blob: 9f6746ac1225ebc546d8c8be8bd5ae3b0429db1f [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.
#ifndef SRC_UI_INPUT_DRIVERS_VIRTIO_INPUT_H_
#define SRC_UI_INPUT_DRIVERS_VIRTIO_INPUT_H_
#include <lib/virtio/device.h>
#include <lib/virtio/ring.h>
#include <stdlib.h>
#include <memory>
#include <ddk/io-buffer.h>
#include <ddk/protocol/hidbus.h>
#include <ddktl/device.h>
#include <ddktl/protocol/hidbus.h>
#include <hid/boot.h>
#include <virtio/input.h>
#include "src/ui/input/drivers/virtio/input_kbd.h"
#include "src/ui/input/drivers/virtio/input_mouse.h"
#include "src/ui/input/drivers/virtio/input_touch.h"
namespace virtio {
class InputDevice : public Device,
public ddk::Device<InputDevice>,
public ddk::HidbusProtocol<InputDevice, ddk::base_protocol> {
public:
InputDevice(zx_device_t* device, zx::bti bti, std::unique_ptr<Backend> backend);
virtual ~InputDevice();
zx_status_t Init() override;
void IrqRingUpdate() override;
void IrqConfigChange() override;
const char* tag() const override { return "virtio-input"; }
// DDK driver hooks
void DdkRelease();
zx_status_t HidbusStart(const hidbus_ifc_protocol_t* ifc);
void HidbusStop();
zx_status_t HidbusQuery(uint32_t options, hid_info_t* info);
zx_status_t HidbusGetDescriptor(hid_description_type_t desc_type, void* out_data_buffer,
size_t data_size, size_t* out_data_actual);
// Unsupported calls:
zx_status_t HidbusGetReport(hid_report_type_t rpt_type, uint8_t rpt_id, void* out_data_buffer,
size_t data_size, size_t* out_data_actual);
zx_status_t HidbusSetReport(hid_report_type_t rpt_type, uint8_t rpt_id, const void* data_buffer,
size_t data_size);
zx_status_t HidbusGetIdle(uint8_t rpt_id, uint8_t* out_duration);
zx_status_t HidbusSetIdle(uint8_t rpt_id, uint8_t duration);
zx_status_t HidbusGetProtocol(hid_protocol_t* out_protocol);
zx_status_t HidbusSetProtocol(hid_protocol_t protocol);
private:
void ReceiveEvent(virtio_input_event_t* event);
void SelectConfig(uint8_t select, uint8_t subsel);
virtio_input_config_t config_;
static const size_t kEventCount = 64;
io_buffer_t buffers_[kEventCount];
fbl::Mutex lock_;
uint8_t dev_class_;
hidbus_ifc_protocol_t hidbus_ifc_;
std::unique_ptr<HidDevice> hid_device_;
Ring vring_ = {this};
};
} // namespace virtio
#endif // SRC_UI_INPUT_DRIVERS_VIRTIO_INPUT_H_