11c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen/* 21c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * Copyright (C) 2012 The Android Open Source Project 31c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * 41c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * Licensed under the Apache License, Version 2.0 (the "License"); 51c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * you may not use this file except in compliance with the License. 61c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * You may obtain a copy of the License at 71c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * 81c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * http://www.apache.org/licenses/LICENSE-2.0 91c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * 101c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * Unless required by applicable law or agreed to in writing, software 111c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * distributed under the License is distributed on an "AS IS" BASIS, 121c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * See the License for the specific language governing permissions and 141c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * limitations under the License. 151c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen */ 161c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen#include <errno.h> 1707c085565a3b24bb658d05b8aa08fb7420725602Elliott Hughes#include <malloc.h> 181c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen#include <string.h> 191c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 201c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen#include <cutils/log.h> 211c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen#include <hardware/hardware.h> 221c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen#include <hardware/nfc.h> 231c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 241c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 251c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen/* 261c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * NCI HAL method implementations. These must be overriden 271c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen */ 281c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_open(const struct nfc_nci_device *dev, 29442752aecdc54c32e77227e792fca64dcf1c1fb8Martijn Coenen nfc_stack_callback_t *p_cback, nfc_stack_data_callback_t *p_data_cback) { 301c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen ALOGE("NFC-NCI HAL: %s", __FUNCTION__); 311c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return 0; 321c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen} 331c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 341c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_write(const struct nfc_nci_device *dev, 351c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen uint16_t data_len, const uint8_t *p_data) { 361c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen ALOGE("NFC-NCI HAL: %s", __FUNCTION__); 371c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return 0; 381c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen} 391c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 401c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_core_initialized(const struct nfc_nci_device *dev, 411c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen uint8_t* p_core_init_rsp_params) { 421c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen ALOGE("NFC-NCI HAL: %s", __FUNCTION__); 431c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return 0; 441c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen} 451c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 461c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_pre_discover(const struct nfc_nci_device *dev) { 471c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen ALOGE("NFC-NCI HAL: %s", __FUNCTION__); 481c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return 0; 491c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen} 501c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 511c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_close(const struct nfc_nci_device *dev) { 521c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen ALOGE("NFC-NCI HAL: %s", __FUNCTION__); 531c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return 0; 541c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen} 551c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 561c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_control_granted (const struct nfc_nci_device *p_dev) 571c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen{ 581c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen ALOGE("NFC-NCI HAL: %s", __FUNCTION__); 591c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return 0; 601c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen} 611c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 621c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 631c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_power_cycle (const struct nfc_nci_device *p_dev) 641c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen{ 651c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen ALOGE("NFC-NCI HAL: %s", __FUNCTION__); 661c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return 0; 671c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen} 681c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 691c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen/* 701c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * Generic device handling below - can generally be left unchanged. 711c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen */ 721c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen/* Close an opened nfc device instance */ 731c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int nfc_close(hw_device_t *dev) { 741c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen free(dev); 751c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return 0; 761c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen} 771c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 781c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int nfc_open(const hw_module_t* module, const char* name, 791c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen hw_device_t** device) { 801c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen if (strcmp(name, NFC_NCI_CONTROLLER) == 0) { 811c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen nfc_nci_device_t *dev = calloc(1, sizeof(nfc_nci_device_t)); 821c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 831c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->common.tag = HARDWARE_DEVICE_TAG; 841c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->common.version = 0x00010000; // [31:16] major, [15:0] minor 851c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->common.module = (struct hw_module_t*) module; 861c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->common.close = nfc_close; 871c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 881c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen // NCI HAL method pointers 891c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->open = hal_open; 901c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->write = hal_write; 911c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->core_initialized = hal_core_initialized; 921c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->pre_discover = hal_pre_discover; 931c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->close = hal_close; 941c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->control_granted = hal_control_granted; 951c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->power_cycle = hal_power_cycle; 961c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 971c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen *device = (hw_device_t*) dev; 981c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 991c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return 0; 1001c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen } else { 1011c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return -EINVAL; 1021c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen } 1031c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen} 1041c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 1051c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 1061c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic struct hw_module_methods_t nfc_module_methods = { 1071c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen .open = nfc_open, 1081c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}; 1091c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 1101c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstruct nfc_nci_module_t HAL_MODULE_INFO_SYM = { 1111c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen .common = { 1121c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen .tag = HARDWARE_MODULE_TAG, 1131c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen .module_api_version = 0x0100, // [15:8] major, [7:0] minor (1.0) 1141c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen .hal_api_version = 0x00, // 0 is only valid value 1151c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen .id = NFC_NCI_HARDWARE_MODULE_ID, 1161c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen .name = "Default NFC NCI HW HAL", 1171c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen .author = "The Android Open Source Project", 1181c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen .methods = &nfc_module_methods, 1191c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen }, 1201c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}; 121