blob: 249654ca65b6fb2ad1913cafba50d88b77b18d73 [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_UI_INPUT_DRIVERS_BMA253_BMA253_H_
#define SRC_UI_INPUT_DRIVERS_BMA253_BMA253_H_
#include <lib/device-protocol/i2c-channel.h>
#include <lib/simplehid/simplehid.h>
#include <lib/zircon-internal/thread_annotations.h>
#include <threads.h>
#include <ddktl/device.h>
#include <fbl/mutex.h>
#include <hid/bma253.h>
namespace accel {
class Bma253;
using DeviceType = ddk::Device<Bma253>;
class Bma253 : public DeviceType, public ddk::HidbusProtocol<Bma253, ddk::base_protocol> {
public:
virtual ~Bma253() {}
static zx_status_t Create(void* ctx, zx_device_t* parent);
void DdkRelease() { delete this; }
zx_status_t HidbusQuery(uint32_t options, hid_info_t* out_info);
zx_status_t HidbusStart(const hidbus_ifc_protocol_t* ifc) { return simple_hid_.HidbusStart(ifc); }
void HidbusStop() { simple_hid_.HidbusStop(); }
zx_status_t HidbusGetDescriptor(hid_description_type_t desc_type, void* out_data_buffer,
size_t data_size, size_t* out_data_actual);
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);
// Visible for testing.
Bma253(zx_device_t* parent, ddk::I2cChannel i2c, zx::port port) : DeviceType(parent), i2c_(i2c) {
simple_hid_ = simplehid::SimpleHid<bma253_input_rpt_t>(
std::move(port), [this](bma253_input_rpt_t* report) { return GetInputReport(report); });
}
// Visible for testing.
zx_status_t Init();
private:
zx_status_t GetInputReport(bma253_input_rpt_t* report);
fbl::Mutex i2c_lock_;
ddk::I2cChannel i2c_ TA_GUARDED(i2c_lock_);
simplehid::SimpleHid<bma253_input_rpt_t> simple_hid_;
};
} // namespace accel
#endif // SRC_UI_INPUT_DRIVERS_BMA253_BMA253_H_