blob: b2e3dcf3dfddeefe3832b5287e83481b7248723a [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.
#pragma once
#include <threads.h>
#include <ddktl/device.h>
#include <ddktl/i2c-channel.h>
#include <fbl/mutex.h>
#include <hid/bma253.h>
#include <lib/simplehid/simplehid.h>
#include <zircon/thread_annotations.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_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);
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