/* * Copyright (C) 2012-2014 NXP Semiconductors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define LOG_TAG "NxpNfcNciHal" #include <errno.h> #include <hardware/hardware.h> #include <hardware/nfc.h> #include <log/log.h> #include <phNxpNciHal_Adaptation.h> #include <stdlib.h> #include <string.h> /***************************************************************************** * NXP NCI HAL Function implementations. *****************************************************************************/ /******************************************************************************* ** ** Function hal_open ** ** Description It opens and initialzes the physical connection with NFCC. ** ** Returns 0 if successful ** *******************************************************************************/ static 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) { int retval = 0; pn547_dev_t* dev = (pn547_dev_t*)p_dev; retval = phNxpNciHal_open(p_hal_cback, p_hal_data_callback); return retval; } /******************************************************************************* ** ** Function hal_write ** ** Description Write the data to NFCC. ** ** Returns Number of bytes successfully written to NFCC. ** *******************************************************************************/ static int hal_write(const struct nfc_nci_device* p_dev, uint16_t data_len, const uint8_t* p_data) { int retval = 0; pn547_dev_t* dev = (pn547_dev_t*)p_dev; retval = phNxpNciHal_write(data_len, p_data); return retval; } /******************************************************************************* ** ** Function hal_core_initialized ** ** Description Notify NFCC after successful initialization of NFCC. ** All proprietary settings can be done here. ** ** Returns 0 if successful ** *******************************************************************************/ static int hal_core_initialized(const struct nfc_nci_device* p_dev, uint8_t* p_core_init_rsp_params) { int retval = 0; pn547_dev_t* dev = (pn547_dev_t*)p_dev; retval = phNxpNciHal_core_initialized(p_core_init_rsp_params); return retval; } /******************************************************************************* ** ** Function hal_pre_discover ** ** Description Notify NFCC before start discovery. ** ** Returns 0 if successful ** *******************************************************************************/ static int hal_pre_discover(const struct nfc_nci_device* p_dev) { int retval = 0; pn547_dev_t* dev = (pn547_dev_t*)p_dev; retval = phNxpNciHal_pre_discover(); return retval; } /******************************************************************************* ** ** Function hal_close ** ** Description Close the NFCC interface and free all resources. ** ** Returns 0 if successful ** *******************************************************************************/ static int hal_close(const struct nfc_nci_device* p_dev) { int retval = 0; pn547_dev_t* dev = (pn547_dev_t*)p_dev; retval = phNxpNciHal_close(); return retval; } /******************************************************************************* ** ** Function hal_control_granted ** ** Description Notify NFCC that control is granted to HAL. ** ** Returns 0 if successful ** *******************************************************************************/ static int hal_control_granted(const struct nfc_nci_device* p_dev) { int retval = 0; pn547_dev_t* dev = (pn547_dev_t*)p_dev; retval = phNxpNciHal_control_granted(); return retval; } /******************************************************************************* ** ** Function hal_power_cycle ** ** Description Notify power cycling has performed. ** ** Returns 0 if successful ** *******************************************************************************/ static int hal_power_cycle(const struct nfc_nci_device* p_dev) { int retval = 0; pn547_dev_t* dev = (pn547_dev_t*)p_dev; retval = phNxpNciHal_power_cycle(); return retval; } /************************************* * Generic device handling. *************************************/ /******************************************************************************* ** ** Function nfc_close ** ** Description Close the nfc device instance. ** ** Returns 0 if successful ** *******************************************************************************/ static int nfc_close(hw_device_t* dev) { int retval = 0; free(dev); return retval; } /******************************************************************************* ** ** Function nfc_open ** ** Description Open the nfc device instance. ** ** Returns 0 if successful ** *******************************************************************************/ static int nfc_open(const hw_module_t* module, const char* name, hw_device_t** device) { ALOGD("%s: enter; name=%s", __func__, name); int retval = 0; /* 0 is ok; -1 is error */ if (strcmp(name, NFC_NCI_CONTROLLER) == 0) { pn547_dev_t* dev = calloc(1, sizeof(pn547_dev_t)); /* Common hw_device_t fields */ dev->nci_device.common.tag = HARDWARE_DEVICE_TAG; dev->nci_device.common.version = 0x00010000; /* [31:16] major, [15:0] minor */ dev->nci_device.common.module = (struct hw_module_t*)module; dev->nci_device.common.close = nfc_close; /* NCI HAL method pointers */ dev->nci_device.open = hal_open; dev->nci_device.write = hal_write; dev->nci_device.core_initialized = hal_core_initialized; dev->nci_device.pre_discover = hal_pre_discover; dev->nci_device.close = hal_close; dev->nci_device.control_granted = hal_control_granted; dev->nci_device.power_cycle = hal_power_cycle; *device = (hw_device_t*)dev; } else { retval = -EINVAL; } ALOGD("%s: exit %d", __func__, retval); return retval; } /* Android hardware module definition */ static struct hw_module_methods_t nfc_module_methods = { .open = nfc_open, }; /* NFC module definition */ struct nfc_nci_module_t HAL_MODULE_INFO_SYM = { .common = { .tag = HARDWARE_MODULE_TAG, .module_api_version = 0x0100, /* [15:8] major, [7:0] minor (1.0) */ .hal_api_version = 0x00, /* 0 is only valid value */ .id = NFC_NCI_HARDWARE_MODULE_ID, .name = "NXP PN54X NFC NCI HW HAL", .author = "NXP Semiconductors", .methods = &nfc_module_methods, }, };