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 17c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn#include <functional> 186f783602c05c519238200fed55b0afa097737ca1Michael Wright#include <stdint.h> 196f783602c05c519238200fed55b0afa097737ca1Michael Wright#include <sys/types.h> 20c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn#include <unordered_map> 21c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn#include <vector> 226f783602c05c519238200fed55b0afa097737ca1Michael Wright 236f783602c05c519238200fed55b0afa097737ca1Michael Wright#define LOG_TAG "InputDriver" 246f783602c05c519238200fed55b0afa097737ca1Michael Wright 256f783602c05c519238200fed55b0afa097737ca1Michael Wright#define LOG_NDEBUG 0 266f783602c05c519238200fed55b0afa097737ca1Michael Wright 276f783602c05c519238200fed55b0afa097737ca1Michael Wright#include "InputDriver.h" 286f783602c05c519238200fed55b0afa097737ca1Michael Wright#include "InputHost.h" 296f783602c05c519238200fed55b0afa097737ca1Michael Wright 306f783602c05c519238200fed55b0afa097737ca1Michael Wright#include <hardware/input.h> 313e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn#include <input/InputDevice.h> 326f783602c05c519238200fed55b0afa097737ca1Michael Wright#include <utils/Log.h> 333e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn#include <utils/PropertyMap.h> 346f783602c05c519238200fed55b0afa097737ca1Michael Wright#include <utils/String8.h> 356f783602c05c519238200fed55b0afa097737ca1Michael Wright 366f783602c05c519238200fed55b0afa097737ca1Michael Wright#define INDENT2 " " 376f783602c05c519238200fed55b0afa097737ca1Michael Wright 383e38aad0227134a804ba79e9690194ec4c13502eTim Kilbournstruct input_property_map { 393e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn android::PropertyMap* propertyMap; 403e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn}; 413e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn 423e38aad0227134a804ba79e9690194ec4c13502eTim Kilbournstruct input_property { 433e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn android::String8 key; 443e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn android::String8 value; 453e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn}; 463e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn 473e38aad0227134a804ba79e9690194ec4c13502eTim Kilbournstruct input_device_identifier { 483e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn const char* name; 493e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn const char* uniqueId; 503e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn input_bus_t bus; 513e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn int32_t vendorId; 523e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn int32_t productId; 533e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn int32_t version; 543e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn}; 556f783602c05c519238200fed55b0afa097737ca1Michael Wright 56c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbournstruct input_device_definition { 57c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn std::vector<input_report_definition*> reportDefs; 58c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn}; 59c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn 60c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbournstruct input_device_handle { 61c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn input_device_identifier_t* id; 62c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn input_device_definition_t* def; 63c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn}; 64c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn 65c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbournstruct input_int_usage { 66c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn input_usage_t usage; 67c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn int32_t min; 68c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn int32_t max; 69c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn float resolution; 70c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn}; 71c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn 72c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbournstruct input_collection { 73c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn int32_t arity; 74c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn std::vector<input_int_usage> intUsages; 75c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn std::vector<input_usage_t> boolUsages; 76c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn}; 77c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn 78c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbournstruct InputCollectionIdHasher { 79c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn std::size_t operator()(const input_collection_id& id) const { 80c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn return std::hash<int>()(static_cast<int>(id)); 81c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn } 82c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn}; 83c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn 84c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbournstruct input_report_definition { 85c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn std::unordered_map<input_collection_id_t, input_collection, InputCollectionIdHasher> collections; 86c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn}; 87c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn 886f783602c05c519238200fed55b0afa097737ca1Michael Wright 893e38aad0227134a804ba79e9690194ec4c13502eTim Kilbournnamespace android { 903e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn 912e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournstatic input_host_callbacks_t kCallbacks = { 922e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .create_device_identifier = create_device_identifier, 932e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .create_device_definition = create_device_definition, 942e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .create_input_report_definition = create_input_report_definition, 952e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .create_output_report_definition = create_output_report_definition, 962e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .free_report_definition = free_report_definition, 972e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .input_device_definition_add_report = input_device_definition_add_report, 982e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .input_report_definition_add_collection = input_report_definition_add_collection, 992e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .input_report_definition_declare_usage_int = input_report_definition_declare_usage_int, 1002e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .input_report_definition_declare_usages_bool = input_report_definition_declare_usages_bool, 1012e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .register_device = register_device, 1022e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .input_allocate_report = input_allocate_report, 1032e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .input_report_set_usage_int = input_report_set_usage_int, 1042e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .input_report_set_usage_bool = input_report_set_usage_bool, 1052e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .report_event = report_event, 1062e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .input_get_device_property_map = input_get_device_property_map, 1072e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .input_get_device_property = input_get_device_property, 1082e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .input_get_property_key = input_get_property_key, 1092e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .input_get_property_value = input_get_property_value, 1102e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .input_free_device_property = input_free_device_property, 1112e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .input_free_device_property_map = input_free_device_property_map, 1122e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn}; 1132e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 1142e7f0146a04fe2dbe5ca0389752709e235c64accTim KilbournInputDriver::InputDriver(const char* name) : mName(String8(name)) { 1152e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn const hw_module_t* module; 1162e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn int err = input_open(&module, name); 1172e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn LOG_ALWAYS_FATAL_IF(err != 0, "Input module %s not found", name); 1182e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn mHal = reinterpret_cast<const input_module_t*>(module); 1192e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 1202e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 1212e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid InputDriver::init() { 1222e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn mHal->init(mHal, static_cast<input_host_t*>(this), kCallbacks); 1232e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 1242e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 1252e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourninput_device_identifier_t* InputDriver::createDeviceIdentifier( 1262e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn const char* name, int32_t productId, int32_t vendorId, 1272e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_bus_t bus, const char* uniqueId) { 1283e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn auto identifier = new ::input_device_identifier { 1293e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn .name = name, 1302e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .productId = productId, 1312e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .vendorId = vendorId, 1322e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .bus = bus, 1332e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn .uniqueId = uniqueId, 1343e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn }; 1352e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn // TODO: store this identifier somewhere 1363e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn return identifier; 1376f783602c05c519238200fed55b0afa097737ca1Michael Wright} 1386f783602c05c519238200fed55b0afa097737ca1Michael Wright 1392e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourninput_device_definition_t* InputDriver::createDeviceDefinition() { 140c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn return new ::input_device_definition; 1416f783602c05c519238200fed55b0afa097737ca1Michael Wright} 1426f783602c05c519238200fed55b0afa097737ca1Michael Wright 1432e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourninput_report_definition_t* InputDriver::createInputReportDefinition() { 144c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn return new ::input_report_definition; 1456f783602c05c519238200fed55b0afa097737ca1Michael Wright} 1466f783602c05c519238200fed55b0afa097737ca1Michael Wright 1472e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourninput_report_definition_t* InputDriver::createOutputReportDefinition() { 148c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn return new ::input_report_definition; 149c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn} 150c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn 1512e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid InputDriver::freeReportDefinition(input_report_definition_t* reportDef) { 1522e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn delete reportDef; 1536f783602c05c519238200fed55b0afa097737ca1Michael Wright} 1546f783602c05c519238200fed55b0afa097737ca1Michael Wright 1552e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid InputDriver::inputDeviceDefinitionAddReport(input_device_definition_t* d, 1562e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_report_definition_t* r) { 157c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn d->reportDefs.push_back(r); 158c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn} 1596f783602c05c519238200fed55b0afa097737ca1Michael Wright 1602e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid InputDriver::inputReportDefinitionAddCollection(input_report_definition_t* report, 1612e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_collection_id_t id, int32_t arity) { 162c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn report->collections[id] = {.arity = arity}; 163c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn} 1646f783602c05c519238200fed55b0afa097737ca1Michael Wright 1652e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid InputDriver::inputReportDefinitionDeclareUsageInt(input_report_definition_t* report, 1662e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_collection_id_t id, input_usage_t usage, int32_t min, int32_t max, 1672e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn float resolution) { 168c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn if (report->collections.find(id) != report->collections.end()) { 169c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn report->collections[id].intUsages.push_back({ 170c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn .usage = usage, .min = min, .max = max, .resolution = resolution}); 171c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn } 172c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn} 1736f783602c05c519238200fed55b0afa097737ca1Michael Wright 1742e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid InputDriver::inputReportDefinitionDeclareUsagesBool(input_report_definition_t* report, 1752e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_collection_id_t id, input_usage_t* usage, size_t usageCount) { 176c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn if (report->collections.find(id) != report->collections.end()) { 1772e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn for (size_t i = 0; i < usageCount; ++i) { 178c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn report->collections[id].boolUsages.push_back(usage[i]); 179c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn } 180c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn } 181c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn} 1826f783602c05c519238200fed55b0afa097737ca1Michael Wright 1832e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourninput_device_handle_t* InputDriver::registerDevice(input_device_identifier_t* id, 1842e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_device_definition_t* d) { 1852e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn ALOGD("Registering device %s with %zu input reports", id->name, d->reportDefs.size()); 1862e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn // TODO: save this device handle 187c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn return new input_device_handle{ .id = id, .def = d }; 1886f783602c05c519238200fed55b0afa097737ca1Michael Wright} 1896f783602c05c519238200fed55b0afa097737ca1Michael Wright 1902e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid InputDriver::unregisterDevice(input_device_handle_t* handle) { 1912e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn delete handle; 1922e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 1932e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 1942e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourninput_report_t* InputDriver::inputAllocateReport(input_report_definition_t* r) { 195c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn ALOGD("Allocating input report for definition %p", r); 1966f783602c05c519238200fed55b0afa097737ca1Michael Wright return nullptr; 1976f783602c05c519238200fed55b0afa097737ca1Michael Wright} 198c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn 1992e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid InputDriver::inputReportSetUsageInt(input_report_t* r, input_collection_id_t id, 2002e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_usage_t usage, int32_t value, int32_t arity_index) { 2012e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 2028943ce38a65cc852d49a141d654a4f149ce57c34Tim Kilbourn 2032e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid InputDriver::inputReportSetUsageBool(input_report_t* r, input_collection_id_t id, 2042e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_usage_t usage, bool value, int32_t arity_index) { 2052e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 2066f783602c05c519238200fed55b0afa097737ca1Michael Wright 2072e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid InputDriver::reportEvent(input_device_handle_t* d, input_report_t* report) { 208c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn ALOGD("report_event %p for handle %p", report, d); 209c472986d4cb55b91547f28b06e89fe555c786a92Tim Kilbourn} 2106f783602c05c519238200fed55b0afa097737ca1Michael Wright 2112e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourninput_property_map_t* InputDriver::inputGetDevicePropertyMap(input_device_identifier_t* id) { 2123e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn InputDeviceIdentifier idi; 2133e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn idi.name = id->name; 2143e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn idi.uniqueId = id->uniqueId; 2153e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn idi.bus = id->bus; 2163e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn idi.vendor = id->vendorId; 2173e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn idi.product = id->productId; 2183e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn idi.version = id->version; 2193e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn 2203e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn String8 configFile = getInputDeviceConfigurationFilePathByDeviceIdentifier( 2213e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn idi, INPUT_DEVICE_CONFIGURATION_FILE_TYPE_CONFIGURATION); 2223e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn if (configFile.isEmpty()) { 2233e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn ALOGD("No input device configuration file found for device '%s'.", 2243e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn idi.name.string()); 2253e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn } else { 2263e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn auto propMap = new input_property_map_t(); 2273e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn status_t status = PropertyMap::load(configFile, &propMap->propertyMap); 2283e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn if (status) { 2293e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn ALOGE("Error loading input device configuration file for device '%s'. " 2303e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn "Using default configuration.", 2313e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn idi.name.string()); 2323e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn delete propMap; 2333e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn return nullptr; 2343e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn } 2353e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn return propMap; 2363e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn } 237e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn return nullptr; 238e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn} 239e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn 2402e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourninput_property_t* InputDriver::inputGetDeviceProperty(input_property_map_t* map, 241e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn const char* key) { 2423e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn String8 keyString(key); 2433e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn if (map != nullptr) { 2443e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn if (map->propertyMap->hasProperty(keyString)) { 2453e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn auto prop = new input_property_t(); 2463e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn if (!map->propertyMap->tryGetProperty(keyString, prop->value)) { 2473e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn delete prop; 2483e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn return nullptr; 2493e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn } 2503e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn prop->key = keyString; 2513e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn return prop; 2523e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn } 2533e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn } 254e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn return nullptr; 255e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn} 256e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn 2572e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournconst char* InputDriver::inputGetPropertyKey(input_property_t* property) { 2583e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn if (property != nullptr) { 2593e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn return property->key.string(); 2603e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn } 261e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn return nullptr; 262e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn} 263e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn 2642e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournconst char* InputDriver::inputGetPropertyValue(input_property_t* property) { 2653e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn if (property != nullptr) { 2663e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn return property->value.string(); 2673e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn } 268e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn return nullptr; 269e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn} 270e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn 2712e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid InputDriver::inputFreeDeviceProperty(input_property_t* property) { 2723e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn if (property != nullptr) { 2733e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn delete property; 2743e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn } 2753e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn} 276e5364c8c02f1a943e78dee600ac45573d5cdcbbfTim Kilbourn 2772e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid InputDriver::inputFreeDevicePropertyMap(input_property_map_t* map) { 2783e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn if (map != nullptr) { 2793e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn delete map->propertyMap; 2803e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn delete map; 2813e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn } 2823e38aad0227134a804ba79e9690194ec4c13502eTim Kilbourn} 2836f783602c05c519238200fed55b0afa097737ca1Michael Wright 2842e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid InputDriver::dump(String8& result) { 2852e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn result.appendFormat(INDENT2 "HAL Input Driver (%s)\n", mName.string()); 2862e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 2872e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 2882e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} // namespace android 2892e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 2902e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn// HAL wrapper functions 2912e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 2922e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournnamespace android { 2932e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 2942e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn::input_device_identifier_t* create_device_identifier(input_host_t* host, 2952e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn const char* name, int32_t product_id, int32_t vendor_id, 2962e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_bus_t bus, const char* unique_id) { 2972e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 2982e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn return driver->createDeviceIdentifier(name, product_id, vendor_id, bus, unique_id); 2992e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 3002e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 3012e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourninput_device_definition_t* create_device_definition(input_host_t* host) { 3022e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 3032e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn return driver->createDeviceDefinition(); 3042e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 3052e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 3062e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourninput_report_definition_t* create_input_report_definition(input_host_t* host) { 3072e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 3082e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn return driver->createInputReportDefinition(); 3092e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 3102e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 3112e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourninput_report_definition_t* create_output_report_definition(input_host_t* host) { 3122e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 3132e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn return driver->createOutputReportDefinition(); 3142e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 3152e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 3162e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid free_report_definition(input_host_t* host, input_report_definition_t* report_def) { 3172e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 3182e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn driver->freeReportDefinition(report_def); 3192e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 3202e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 3212e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid input_device_definition_add_report(input_host_t* host, 3222e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_device_definition_t* d, input_report_definition_t* r) { 3232e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 3242e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn driver->inputDeviceDefinitionAddReport(d, r); 3252e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 3262e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 3272e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid input_report_definition_add_collection(input_host_t* host, 3282e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_report_definition_t* report, input_collection_id_t id, int32_t arity) { 3292e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 3302e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn driver->inputReportDefinitionAddCollection(report, id, arity); 3312e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 3322e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 3332e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid input_report_definition_declare_usage_int(input_host_t* host, 3342e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_report_definition_t* report, input_collection_id_t id, 3352e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_usage_t usage, int32_t min, int32_t max, float resolution) { 3362e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 3372e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn driver->inputReportDefinitionDeclareUsageInt(report, id, usage, min, max, resolution); 3382e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 3392e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 3402e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid input_report_definition_declare_usages_bool(input_host_t* host, 3412e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_report_definition_t* report, input_collection_id_t id, 3422e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_usage_t* usage, size_t usage_count) { 3432e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 3442e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn driver->inputReportDefinitionDeclareUsagesBool(report, id, usage, usage_count); 3452e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 3462e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 3472e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourninput_device_handle_t* register_device(input_host_t* host, 3482e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_device_identifier_t* id, input_device_definition_t* d) { 3492e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 3502e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn return driver->registerDevice(id, d); 3512e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 3522e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 3532e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid unregister_device(input_host_t* host, input_device_handle_t* handle) { 3542e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 3552e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn driver->unregisterDevice(handle); 3562e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 3572e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 3582e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourninput_report_t* input_allocate_report(input_host_t* host, input_report_definition_t* r) { 3592e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 3602e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn return driver->inputAllocateReport(r); 3612e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 3622e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 3632e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid input_report_set_usage_int(input_host_t* host, input_report_t* r, 3642e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_collection_id_t id, input_usage_t usage, int32_t value, int32_t arity_index) { 3652e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 3662e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn driver->inputReportSetUsageInt(r, id, usage, value, arity_index); 3672e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 3682e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 3692e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid input_report_set_usage_bool(input_host_t* host, input_report_t* r, 3702e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_collection_id_t id, input_usage_t usage, bool value, int32_t arity_index) { 3712e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 3722e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn driver->inputReportSetUsageBool(r, id, usage, value, arity_index); 3732e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 3742e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 3752e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid report_event(input_host_t* host, input_device_handle_t* d, input_report_t* report) { 3762e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 3772e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn driver->reportEvent(d, report); 3782e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 3792e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 3802e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourninput_property_map_t* input_get_device_property_map(input_host_t* host, 3812e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn input_device_identifier_t* id) { 3822e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 3832e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn return driver->inputGetDevicePropertyMap(id); 3842e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 3852e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 3862e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourninput_property_t* input_get_device_property(input_host_t* host, input_property_map_t* map, 3872e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn const char* key) { 3882e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 3892e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn return driver->inputGetDeviceProperty(map, key); 3902e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 3912e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 3922e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournconst char* input_get_property_key(input_host_t* host, input_property_t* property) { 3932e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 3942e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn return driver->inputGetPropertyKey(property); 3952e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 3962e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 3972e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournconst char* input_get_property_value(input_host_t* host, input_property_t* property) { 3982e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 3992e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn return driver->inputGetPropertyValue(property); 4002e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 4012e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 4022e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid input_free_device_property(input_host_t* host, input_property_t* property) { 4032e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 4042e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn driver->inputFreeDeviceProperty(property); 4052e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 4062e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 4072e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbournvoid input_free_device_property_map(input_host_t* host, input_property_map_t* map) { 4082e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn auto driver = static_cast<InputDriverInterface*>(host); 4092e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn driver->inputFreeDevicePropertyMap(map); 4102e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn} 4112e7f0146a04fe2dbe5ca0389752709e235c64accTim Kilbourn 4126f783602c05c519238200fed55b0afa097737ca1Michael Wright} // namespace android 413