| // 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 |