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> 171c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen#include <string.h> 181c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 191c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen#include <cutils/log.h> 201c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen#include <hardware/hardware.h> 211c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen#include <hardware/nfc.h> 221c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 231c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 241c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen/* 251c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * NCI HAL method implementations. These must be overriden 261c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen */ 271c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_open(const struct nfc_nci_device *dev, 28442752aecdc54c32e77227e792fca64dcf1c1fb8Martijn Coenen nfc_stack_callback_t *p_cback, nfc_stack_data_callback_t *p_data_cback) { 291c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen ALOGE("NFC-NCI HAL: %s", __FUNCTION__); 301c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return 0; 311c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen} 321c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 331c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_write(const struct nfc_nci_device *dev, 341c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen uint16_t data_len, const uint8_t *p_data) { 351c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen ALOGE("NFC-NCI HAL: %s", __FUNCTION__); 361c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return 0; 371c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen} 381c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 391c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_core_initialized(const struct nfc_nci_device *dev, 401c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen uint8_t* p_core_init_rsp_params) { 411c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen ALOGE("NFC-NCI HAL: %s", __FUNCTION__); 421c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return 0; 431c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen} 441c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 451c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_pre_discover(const struct nfc_nci_device *dev) { 461c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen ALOGE("NFC-NCI HAL: %s", __FUNCTION__); 471c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return 0; 481c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen} 491c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 501c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_close(const struct nfc_nci_device *dev) { 511c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen ALOGE("NFC-NCI HAL: %s", __FUNCTION__); 521c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return 0; 531c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen} 541c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 551c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_control_granted (const struct nfc_nci_device *p_dev) 561c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen{ 571c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen ALOGE("NFC-NCI HAL: %s", __FUNCTION__); 581c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return 0; 591c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen} 601c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 611c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 621c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_power_cycle (const struct nfc_nci_device *p_dev) 631c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen{ 641c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen ALOGE("NFC-NCI HAL: %s", __FUNCTION__); 651c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return 0; 661c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen} 671c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 681c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen/* 691c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * Generic device handling below - can generally be left unchanged. 701c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen */ 711c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen/* Close an opened nfc device instance */ 721c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int nfc_close(hw_device_t *dev) { 731c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen free(dev); 741c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return 0; 751c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen} 761c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 771c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int nfc_open(const hw_module_t* module, const char* name, 781c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen hw_device_t** device) { 791c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen if (strcmp(name, NFC_NCI_CONTROLLER) == 0) { 801c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen nfc_nci_device_t *dev = calloc(1, sizeof(nfc_nci_device_t)); 811c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 821c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->common.tag = HARDWARE_DEVICE_TAG; 831c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->common.version = 0x00010000; // [31:16] major, [15:0] minor 841c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->common.module = (struct hw_module_t*) module; 851c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->common.close = nfc_close; 861c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 871c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen // NCI HAL method pointers 881c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->open = hal_open; 891c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->write = hal_write; 901c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->core_initialized = hal_core_initialized; 911c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->pre_discover = hal_pre_discover; 921c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->close = hal_close; 931c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->control_granted = hal_control_granted; 941c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen dev->power_cycle = hal_power_cycle; 951c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 961c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen *device = (hw_device_t*) dev; 971c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 981c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return 0; 991c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen } else { 1001c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen return -EINVAL; 1011c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen } 1021c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen} 1031c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 1041c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 1051c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic struct hw_module_methods_t nfc_module_methods = { 1061c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen .open = nfc_open, 1071c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}; 1081c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen 1091c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstruct nfc_nci_module_t HAL_MODULE_INFO_SYM = { 1101c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen .common = { 1111c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen .tag = HARDWARE_MODULE_TAG, 1121c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen .module_api_version = 0x0100, // [15:8] major, [7:0] minor (1.0) 1131c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen .hal_api_version = 0x00, // 0 is only valid value 1141c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen .id = NFC_NCI_HARDWARE_MODULE_ID, 1151c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen .name = "Default NFC NCI HW HAL", 1161c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen .author = "The Android Open Source Project", 1171c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen .methods = &nfc_module_methods, 1181c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen }, 1191c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}; 120