1b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu/****************************************************************************** 2eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu * 3b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * Copyright (C) 1999-2012 Broadcom Corporation 4eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu * 5b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * Licensed under the Apache License, Version 2.0 (the "License"); 6b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * you may not use this file except in compliance with the License. 7b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * You may obtain a copy of the License at: 8eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu * 9b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * http://www.apache.org/licenses/LICENSE-2.0 10b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 11b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * Unless required by applicable law or agreed to in writing, software 12b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * distributed under the License is distributed on an "AS IS" BASIS, 13b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * See the License for the specific language governing permissions and 15b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * limitations under the License. 16b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 17b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu ******************************************************************************/ 18eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 19eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 20eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define LOG_TAG "NfcNciHal" 21eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#include "OverrideLog.h" 22eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#include <errno.h> 23eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#include <hardware/hardware.h> 24eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#include <hardware/nfc.h> 25eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#include "HalAdaptation.h" 26eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 27eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 28eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/********************************* 29eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu * NCI HAL method implementations. 30eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu *********************************/ 31eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 32eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 33ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chustatic int hal_open (const struct nfc_nci_device *p_dev, nfc_stack_callback_t *p_hal_cback, nfc_stack_data_callback_t *p_hal_data_callback) 34eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 35eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu int retval = 0; 36eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu bcm2079x_dev_t *dev = (bcm2079x_dev_t*) p_dev; 37eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 38ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu retval = HaiOpen (dev, p_hal_cback, p_hal_data_callback); 39eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return retval; 40eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 41eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 42eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 43eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic int hal_write (const struct nfc_nci_device *p_dev, 44eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu uint16_t data_len, const uint8_t *p_data) 45eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 46eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu int retval = 0; 47eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev; 48eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 49eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu retval = HaiWrite (dev, data_len, p_data); 50eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return retval; 51eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 52eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 53eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 54eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic int hal_core_initialized (const struct nfc_nci_device *p_dev, 55eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu uint8_t* p_core_init_rsp_params) 56eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 57eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu int retval = 0; 58eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev; 59eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 60eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu retval = HaiCoreInitialized (dev, p_core_init_rsp_params); 61eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return retval; 62eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 63eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 64eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 65eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic int hal_pre_discover (const struct nfc_nci_device *p_dev) 66eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 67eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu int retval = 0; 68eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev; 69eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 70eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu retval = HaiPreDiscover (dev); 71eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return retval; 72eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 73eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 74eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 75eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic int hal_close (const struct nfc_nci_device *p_dev) 76eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 77eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu int retval = 0; 78eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev; 79eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 80eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu retval = HaiClose (dev); 81eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return retval; 82eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 83eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 84eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 85eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic int hal_control_granted (const struct nfc_nci_device *p_dev) 86eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 87eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu int retval = 0; 88eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev; 89eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 90eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu retval = HaiControlGranted (dev); 91eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return retval; 92eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 93eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 94eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 95eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic int hal_power_cycle (const struct nfc_nci_device *p_dev) 96eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 97eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu int retval = 0; 98eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev; 99eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 100eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu retval = HaiPowerCycle (dev); 101eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return retval; 102eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 103eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 104eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 105eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/************************************* 106eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu * Generic device handling. 107eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu *************************************/ 108eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 109eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 110eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/* Close an opened nfc device instance */ 111eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic int nfc_close (hw_device_t *dev) 112eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 113eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu int retval = 0; 114eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu free (dev); 115eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu retval = HaiTerminateLibrary (); 116eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return retval; 117eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 118eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 119eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 120eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic int nfc_open (const hw_module_t* module, const char* name, hw_device_t** device) 121eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 122eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu ALOGD ("%s: enter; name=%s", __FUNCTION__, name); 123eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu int retval = 0; //0 is ok; -1 is error 124eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 125eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (strcmp (name, NFC_NCI_CONTROLLER) == 0) 126eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 127eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu bcm2079x_dev_t *dev = calloc (1, sizeof(bcm2079x_dev_t)); 128eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 129eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu // Common hw_device_t fields 130eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu dev->nci_device.common.tag = HARDWARE_DEVICE_TAG; 131eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu dev->nci_device.common.version = 0x00010000; // [31:16] major, [15:0] minor 132eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu dev->nci_device.common.module = (struct hw_module_t*) module; 133eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu dev->nci_device.common.close = nfc_close; 134eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 135eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu // NCI HAL method pointers 136eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu dev->nci_device.open = hal_open; 137eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu dev->nci_device.write = hal_write; 138eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu dev->nci_device.core_initialized = hal_core_initialized; 139eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu dev->nci_device.pre_discover = hal_pre_discover; 140eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu dev->nci_device.close = hal_close; 141eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu dev->nci_device.control_granted = hal_control_granted; 142eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu dev->nci_device.power_cycle = hal_power_cycle; 143eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 144eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu // Copy in 145eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu *device = (hw_device_t*) dev; 146eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 147eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu retval = HaiInitializeLibrary (dev); 148eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 149eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 150eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 151eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu retval = -EINVAL; 152eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 153eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu ALOGD ("%s: exit %d", __FUNCTION__, retval); 154eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return retval; 155eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 156eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 157eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 158eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic struct hw_module_methods_t nfc_module_methods = 159eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 160eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu .open = nfc_open, 161eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}; 162eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 163eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 164eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustruct nfc_nci_module_t HAL_MODULE_INFO_SYM = 165eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 166eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu .common = 167eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 168eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu .tag = HARDWARE_MODULE_TAG, .module_api_version = 0x0100, // [15:8] major, [7:0] minor (1.0) 169eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu .hal_api_version = 0x00, // 0 is only valid value 170eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu .id = NFC_NCI_HARDWARE_MODULE_ID, 171eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu .name = "Default NFC NCI HW HAL", 172eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu .author = "The Android Open Source Project", 173eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu .methods = &nfc_module_methods, 174eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu }, 175eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}; 176