16f783602c05c519238200fed55b0afa097737ca1Michael Wright/*
26f783602c05c519238200fed55b0afa097737ca1Michael Wright * Copyright (C) 2015 The Android Open Source Project
36f783602c05c519238200fed55b0afa097737ca1Michael Wright *
46f783602c05c519238200fed55b0afa097737ca1Michael Wright * Licensed under the Apache License, Version 2.0 (the "License");
56f783602c05c519238200fed55b0afa097737ca1Michael Wright * you may not use this file except in compliance with the License.
66f783602c05c519238200fed55b0afa097737ca1Michael Wright * You may obtain a copy of the License at
76f783602c05c519238200fed55b0afa097737ca1Michael Wright *
86f783602c05c519238200fed55b0afa097737ca1Michael Wright *      http://www.apache.org/licenses/LICENSE-2.0
96f783602c05c519238200fed55b0afa097737ca1Michael Wright *
106f783602c05c519238200fed55b0afa097737ca1Michael Wright * Unless required by applicable law or agreed to in writing, software
116f783602c05c519238200fed55b0afa097737ca1Michael Wright * distributed under the License is distributed on an "AS IS" BASIS,
126f783602c05c519238200fed55b0afa097737ca1Michael Wright * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136f783602c05c519238200fed55b0afa097737ca1Michael Wright * See the License for the specific language governing permissions and
146f783602c05c519238200fed55b0afa097737ca1Michael Wright * limitations under the License.
156f783602c05c519238200fed55b0afa097737ca1Michael Wright */
166f783602c05c519238200fed55b0afa097737ca1Michael Wright
176f783602c05c519238200fed55b0afa097737ca1Michael Wright#ifndef ANDROID_INPUT_DRIVER_H
186f783602c05c519238200fed55b0afa097737ca1Michael Wright#define ANDROID_INPUT_DRIVER_H
196f783602c05c519238200fed55b0afa097737ca1Michael Wright
206f783602c05c519238200fed55b0afa097737ca1Michael Wright#include <stdint.h>
216f783602c05c519238200fed55b0afa097737ca1Michael Wright#include <sys/types.h>
226f783602c05c519238200fed55b0afa097737ca1Michael Wright
236f783602c05c519238200fed55b0afa097737ca1Michael Wright#include "InputHost.h"
246f783602c05c519238200fed55b0afa097737ca1Michael Wright
256f783602c05c519238200fed55b0afa097737ca1Michael Wright#include <hardware/input.h>
266f783602c05c519238200fed55b0afa097737ca1Michael Wright#include <utils/RefBase.h>
276f783602c05c519238200fed55b0afa097737ca1Michael Wright#include <utils/String8.h>
286f783602c05c519238200fed55b0afa097737ca1Michael Wright
292e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn// Declare a concrete type for the HAL
302e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournstruct input_host {
312e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn};
326f783602c05c519238200fed55b0afa097737ca1Michael Wright
332e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournnamespace android {
346f783602c05c519238200fed55b0afa097737ca1Michael Wright
352e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournclass InputDriverInterface : public input_host_t, public virtual RefBase {
366f783602c05c519238200fed55b0afa097737ca1Michael Wrightprotected:
376f783602c05c519238200fed55b0afa097737ca1Michael Wright    InputDriverInterface() = default;
386f783602c05c519238200fed55b0afa097737ca1Michael Wright    virtual ~InputDriverInterface() = default;
396f783602c05c519238200fed55b0afa097737ca1Michael Wright
406f783602c05c519238200fed55b0afa097737ca1Michael Wrightpublic:
412e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void init() = 0;
422e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn
432e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual input_device_identifier_t* createDeviceIdentifier(
442e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            const char* name, int32_t productId, int32_t vendorId,
452e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            input_bus_t bus, const char* uniqueId) = 0;
462e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual input_device_definition_t* createDeviceDefinition() = 0;
472e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual input_report_definition_t* createInputReportDefinition() = 0;
482e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual input_report_definition_t* createOutputReportDefinition() = 0;
492e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void freeReportDefinition(input_report_definition_t* reportDef) = 0;
502e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn
512e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void inputDeviceDefinitionAddReport(input_device_definition_t* d,
522e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            input_report_definition_t* r) = 0;
532e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void inputReportDefinitionAddCollection(input_report_definition_t* report,
542e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            input_collection_id_t id, int32_t arity) = 0;
552e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void inputReportDefinitionDeclareUsageInt(input_report_definition_t* report,
562e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            input_collection_id_t id, input_usage_t usage, int32_t min, int32_t max,
572e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            float resolution) = 0;
582e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void inputReportDefinitionDeclareUsagesBool(input_report_definition_t* report,
592e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            input_collection_id_t id, input_usage_t* usage, size_t usageCount) = 0;
602e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn
612e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual input_device_handle_t* registerDevice(input_device_identifier_t* id,
622e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            input_device_definition_t* d) = 0;
632e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void unregisterDevice(input_device_handle_t* handle) = 0;
642e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn
652e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual input_report_t* inputAllocateReport(input_report_definition_t* r) = 0;
662e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void inputReportSetUsageInt(input_report_t* r, input_collection_id_t id,
672e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            input_usage_t usage, int32_t value, int32_t arity_index) = 0;
682e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void inputReportSetUsageBool(input_report_t* r, input_collection_id_t id,
692e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            input_usage_t usage, bool value, int32_t arity_index) = 0;
702e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void reportEvent(input_device_handle_t* d, input_report_t* report) = 0;
712e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn
722e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual input_property_map_t* inputGetDevicePropertyMap(input_device_identifier_t* id) = 0;
732e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual input_property_t* inputGetDeviceProperty(input_property_map_t* map,
742e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            const char* key) = 0;
752e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual const char* inputGetPropertyKey(input_property_t* property) = 0;
762e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual const char* inputGetPropertyValue(input_property_t* property) = 0;
772e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void inputFreeDeviceProperty(input_property_t* property) = 0;
782e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void inputFreeDevicePropertyMap(input_property_map_t* map) = 0;
796f783602c05c519238200fed55b0afa097737ca1Michael Wright
806f783602c05c519238200fed55b0afa097737ca1Michael Wright    virtual void dump(String8& result) = 0;
816f783602c05c519238200fed55b0afa097737ca1Michael Wright};
826f783602c05c519238200fed55b0afa097737ca1Michael Wright
836f783602c05c519238200fed55b0afa097737ca1Michael Wrightclass InputDriver : public InputDriverInterface {
846f783602c05c519238200fed55b0afa097737ca1Michael Wrightpublic:
856d2ede118add6647d230f090d64a8c7cf49ebf05Chih-Hung Hsieh    explicit InputDriver(const char* name);
866f783602c05c519238200fed55b0afa097737ca1Michael Wright    virtual ~InputDriver() = default;
876f783602c05c519238200fed55b0afa097737ca1Michael Wright
882e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void init() override;
892e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn
902e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual input_device_identifier_t* createDeviceIdentifier(
912e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            const char* name, int32_t productId, int32_t vendorId,
922e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            input_bus_t bus, const char* uniqueId) override;
932e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual input_device_definition_t* createDeviceDefinition() override;
942e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual input_report_definition_t* createInputReportDefinition() override;
952e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual input_report_definition_t* createOutputReportDefinition() override;
962e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void freeReportDefinition(input_report_definition_t* reportDef) override;
972e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn
982e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void inputDeviceDefinitionAddReport(input_device_definition_t* d,
992e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            input_report_definition_t* r) override;
1002e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void inputReportDefinitionAddCollection(input_report_definition_t* report,
1012e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            input_collection_id_t id, int32_t arity) override;
1022e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void inputReportDefinitionDeclareUsageInt(input_report_definition_t* report,
1032e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            input_collection_id_t id, input_usage_t usage, int32_t min, int32_t max,
1042e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            float resolution) override;
1052e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void inputReportDefinitionDeclareUsagesBool(input_report_definition_t* report,
1062e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            input_collection_id_t id, input_usage_t* usage, size_t usageCount) override;
1072e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn
1082e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual input_device_handle_t* registerDevice(input_device_identifier_t* id,
1092e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            input_device_definition_t* d) override;
1102e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void unregisterDevice(input_device_handle_t* handle) override;
1112e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn
1122e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual input_report_t* inputAllocateReport(input_report_definition_t* r) override;
1132e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void inputReportSetUsageInt(input_report_t* r, input_collection_id_t id,
1142e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            input_usage_t usage, int32_t value, int32_t arity_index) override;
1152e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void inputReportSetUsageBool(input_report_t* r, input_collection_id_t id,
1162e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            input_usage_t usage, bool value, int32_t arity_index) override;
1172e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void reportEvent(input_device_handle_t* d, input_report_t* report) override;
1182e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn
1192e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual input_property_map_t* inputGetDevicePropertyMap(input_device_identifier_t* id) override;
1202e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual input_property_t* inputGetDeviceProperty(input_property_map_t* map,
1212e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn            const char* key) override;
1222e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual const char* inputGetPropertyKey(input_property_t* property) override;
1232e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual const char* inputGetPropertyValue(input_property_t* property) override;
1242e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void inputFreeDeviceProperty(input_property_t* property) override;
1252e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn    virtual void inputFreeDevicePropertyMap(input_property_map_t* map) override;
1266f783602c05c519238200fed55b0afa097737ca1Michael Wright
1276f783602c05c519238200fed55b0afa097737ca1Michael Wright    virtual void dump(String8& result) override;
1286f783602c05c519238200fed55b0afa097737ca1Michael Wright
1296f783602c05c519238200fed55b0afa097737ca1Michael Wrightprivate:
1306f783602c05c519238200fed55b0afa097737ca1Michael Wright    String8 mName;
1316f783602c05c519238200fed55b0afa097737ca1Michael Wright    const input_module_t* mHal;
1326f783602c05c519238200fed55b0afa097737ca1Michael Wright};
1336f783602c05c519238200fed55b0afa097737ca1Michael Wright
1346f783602c05c519238200fed55b0afa097737ca1Michael Wright
1356f783602c05c519238200fed55b0afa097737ca1Michael Wrightextern "C" {
1366f783602c05c519238200fed55b0afa097737ca1Michael Wright
1376f783602c05c519238200fed55b0afa097737ca1Michael Wrightinput_device_identifier_t* create_device_identifier(input_host_t* host,
1386f783602c05c519238200fed55b0afa097737ca1Michael Wright        const char* name, int32_t product_id, int32_t vendor_id,
1396f783602c05c519238200fed55b0afa097737ca1Michael Wright        input_bus_t bus, const char* unique_id);
1406f783602c05c519238200fed55b0afa097737ca1Michael Wright
1416f783602c05c519238200fed55b0afa097737ca1Michael Wrightinput_device_definition_t* create_device_definition(input_host_t* host);
1426f783602c05c519238200fed55b0afa097737ca1Michael Wright
1436f783602c05c519238200fed55b0afa097737ca1Michael Wrightinput_report_definition_t* create_input_report_definition(input_host_t* host);
1446f783602c05c519238200fed55b0afa097737ca1Michael Wright
1456f783602c05c519238200fed55b0afa097737ca1Michael Wrightinput_report_definition_t* create_output_report_definition(input_host_t* host);
1466f783602c05c519238200fed55b0afa097737ca1Michael Wright
147c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbournvoid free_report_definition(input_host_t* host, input_report_definition_t* report_def);
148c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn
1496f783602c05c519238200fed55b0afa097737ca1Michael Wrightvoid input_device_definition_add_report(input_host_t* host,
1506f783602c05c519238200fed55b0afa097737ca1Michael Wright        input_device_definition_t* d, input_report_definition_t* r);
1516f783602c05c519238200fed55b0afa097737ca1Michael Wright
1526f783602c05c519238200fed55b0afa097737ca1Michael Wrightvoid input_report_definition_add_collection(input_host_t* host,
1536f783602c05c519238200fed55b0afa097737ca1Michael Wright        input_report_definition_t* report, input_collection_id_t id, int32_t arity);
1546f783602c05c519238200fed55b0afa097737ca1Michael Wright
1556f783602c05c519238200fed55b0afa097737ca1Michael Wrightvoid input_report_definition_declare_usage_int(input_host_t* host,
1566f783602c05c519238200fed55b0afa097737ca1Michael Wright        input_report_definition_t* report, input_collection_id_t id,
1576f783602c05c519238200fed55b0afa097737ca1Michael Wright        input_usage_t usage, int32_t min, int32_t max, float resolution);
1586f783602c05c519238200fed55b0afa097737ca1Michael Wright
1596f783602c05c519238200fed55b0afa097737ca1Michael Wrightvoid input_report_definition_declare_usages_bool(input_host_t* host,
1606f783602c05c519238200fed55b0afa097737ca1Michael Wright        input_report_definition_t* report, input_collection_id_t id,
1616f783602c05c519238200fed55b0afa097737ca1Michael Wright        input_usage_t* usage, size_t usage_count);
1626f783602c05c519238200fed55b0afa097737ca1Michael Wright
1636f783602c05c519238200fed55b0afa097737ca1Michael Wright
1646f783602c05c519238200fed55b0afa097737ca1Michael Wrightinput_device_handle_t* register_device(input_host_t* host,
1656f783602c05c519238200fed55b0afa097737ca1Michael Wright        input_device_identifier_t* id, input_device_definition_t* d);
1666f783602c05c519238200fed55b0afa097737ca1Michael Wright
1676f783602c05c519238200fed55b0afa097737ca1Michael Wrightvoid unregister_device(input_host_t* host, input_device_handle_t* handle);
1686f783602c05c519238200fed55b0afa097737ca1Michael Wright
1696f783602c05c519238200fed55b0afa097737ca1Michael Wrightinput_report_t* input_allocate_report(input_host_t* host, input_report_definition_t* r);
1706f783602c05c519238200fed55b0afa097737ca1Michael Wright
1718943ce38a65cc852d49a141d654a4f149ce57c34Tim Kilbournvoid input_report_set_usage_int(input_host_t* host, input_report_t* r,
1728943ce38a65cc852d49a141d654a4f149ce57c34Tim Kilbourn        input_collection_id_t id, input_usage_t usage, int32_t value, int32_t arity_index);
1738943ce38a65cc852d49a141d654a4f149ce57c34Tim Kilbourn
1748943ce38a65cc852d49a141d654a4f149ce57c34Tim Kilbournvoid input_report_set_usage_bool(input_host_t* host, input_report_t* r,
1758943ce38a65cc852d49a141d654a4f149ce57c34Tim Kilbourn        input_collection_id_t id, input_usage_t usage, bool value, int32_t arity_index);
1768943ce38a65cc852d49a141d654a4f149ce57c34Tim Kilbourn
1776f783602c05c519238200fed55b0afa097737ca1Michael Wrightvoid report_event(input_host_t* host, input_device_handle_t* d, input_report_t* report);
1786f783602c05c519238200fed55b0afa097737ca1Michael Wright
179e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourninput_property_map_t* input_get_device_property_map(input_host_t* host,
180e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn        input_device_identifier_t* id);
181e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn
182e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourninput_property_t* input_get_device_property(input_host_t* host, input_property_map_t* map,
183e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn        const char* key);
184e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn
185e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbournconst char* input_get_property_key(input_host_t* host, input_property_t* property);
186e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn
187e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbournconst char* input_get_property_value(input_host_t* host, input_property_t* property);
188e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn
189e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbournvoid input_free_device_property(input_host_t* host, input_property_t* property);
190e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn
191e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbournvoid input_free_device_property_map(input_host_t* host, input_property_map_t* map);
1926f783602c05c519238200fed55b0afa097737ca1Michael Wright}
1936f783602c05c519238200fed55b0afa097737ca1Michael Wright
1946f783602c05c519238200fed55b0afa097737ca1Michael Wright} // namespace android
1956f783602c05c519238200fed55b0afa097737ca1Michael Wright#endif // ANDROID_INPUT_DRIVER_H
196