Home | History | Annotate | Download | only in pn54x
      1 /*
      2  * Copyright (C) 2012-2014 NXP Semiconductors
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #define LOG_TAG "NxpNfcNciHal"
     18 
     19 #include <errno.h>
     20 #include <hardware/hardware.h>
     21 #include <hardware/nfc.h>
     22 #include <log/log.h>
     23 #include <phNxpNciHal_Adaptation.h>
     24 #include <stdlib.h>
     25 #include <string.h>
     26 
     27 /*****************************************************************************
     28  * NXP NCI HAL Function implementations.
     29  *****************************************************************************/
     30 
     31 /*******************************************************************************
     32 **
     33 ** Function         hal_open
     34 **
     35 ** Description      It opens and initialzes the physical connection with NFCC.
     36 **
     37 ** Returns          0 if successful
     38 **
     39 *******************************************************************************/
     40 static int hal_open(const struct nfc_nci_device* p_dev,
     41                     nfc_stack_callback_t p_hal_cback,
     42                     nfc_stack_data_callback_t* p_hal_data_callback) {
     43   int retval = 0;
     44 
     45   pn547_dev_t* dev = (pn547_dev_t*)p_dev;
     46   retval = phNxpNciHal_open(p_hal_cback, p_hal_data_callback);
     47 
     48   return retval;
     49 }
     50 
     51 /*******************************************************************************
     52 **
     53 ** Function         hal_write
     54 **
     55 ** Description      Write the data to NFCC.
     56 **
     57 ** Returns          Number of bytes successfully written to NFCC.
     58 **
     59 *******************************************************************************/
     60 static int hal_write(const struct nfc_nci_device* p_dev, uint16_t data_len,
     61                      const uint8_t* p_data) {
     62   int retval = 0;
     63   pn547_dev_t* dev = (pn547_dev_t*)p_dev;
     64 
     65   retval = phNxpNciHal_write(data_len, p_data);
     66   return retval;
     67 }
     68 
     69 /*******************************************************************************
     70 **
     71 ** Function         hal_core_initialized
     72 **
     73 ** Description      Notify NFCC after successful initialization of NFCC.
     74 **                  All proprietary settings can be done here.
     75 **
     76 ** Returns          0 if successful
     77 **
     78 *******************************************************************************/
     79 static int hal_core_initialized(const struct nfc_nci_device* p_dev,
     80                                 uint8_t* p_core_init_rsp_params) {
     81   int retval = 0;
     82   pn547_dev_t* dev = (pn547_dev_t*)p_dev;
     83 
     84   retval = phNxpNciHal_core_initialized(p_core_init_rsp_params);
     85   return retval;
     86 }
     87 
     88 /*******************************************************************************
     89 **
     90 ** Function         hal_pre_discover
     91 **
     92 ** Description      Notify NFCC before start discovery.
     93 **
     94 ** Returns          0 if successful
     95 **
     96 *******************************************************************************/
     97 static int hal_pre_discover(const struct nfc_nci_device* p_dev) {
     98   int retval = 0;
     99   pn547_dev_t* dev = (pn547_dev_t*)p_dev;
    100 
    101   retval = phNxpNciHal_pre_discover();
    102   return retval;
    103 }
    104 
    105 /*******************************************************************************
    106 **
    107 ** Function         hal_close
    108 **
    109 ** Description      Close the NFCC interface and free all resources.
    110 **
    111 ** Returns          0 if successful
    112 **
    113 *******************************************************************************/
    114 static int hal_close(const struct nfc_nci_device* p_dev) {
    115   int retval = 0;
    116   pn547_dev_t* dev = (pn547_dev_t*)p_dev;
    117 
    118   retval = phNxpNciHal_close();
    119   return retval;
    120 }
    121 
    122 /*******************************************************************************
    123 **
    124 ** Function         hal_control_granted
    125 **
    126 ** Description      Notify NFCC that control is granted to HAL.
    127 **
    128 ** Returns          0 if successful
    129 **
    130 *******************************************************************************/
    131 static int hal_control_granted(const struct nfc_nci_device* p_dev) {
    132   int retval = 0;
    133   pn547_dev_t* dev = (pn547_dev_t*)p_dev;
    134 
    135   retval = phNxpNciHal_control_granted();
    136   return retval;
    137 }
    138 
    139 /*******************************************************************************
    140 **
    141 ** Function         hal_power_cycle
    142 **
    143 ** Description      Notify power cycling has performed.
    144 **
    145 ** Returns          0 if successful
    146 **
    147 *******************************************************************************/
    148 static int hal_power_cycle(const struct nfc_nci_device* p_dev) {
    149   int retval = 0;
    150   pn547_dev_t* dev = (pn547_dev_t*)p_dev;
    151 
    152   retval = phNxpNciHal_power_cycle();
    153   return retval;
    154 }
    155 
    156 /*************************************
    157  * Generic device handling.
    158  *************************************/
    159 
    160 /*******************************************************************************
    161 **
    162 ** Function         nfc_close
    163 **
    164 ** Description      Close the nfc device instance.
    165 **
    166 ** Returns          0 if successful
    167 **
    168 *******************************************************************************/
    169 static int nfc_close(hw_device_t* dev) {
    170   int retval = 0;
    171   free(dev);
    172   return retval;
    173 }
    174 
    175 /*******************************************************************************
    176 **
    177 ** Function         nfc_open
    178 **
    179 ** Description      Open the nfc device instance.
    180 **
    181 ** Returns          0 if successful
    182 **
    183 *******************************************************************************/
    184 static int nfc_open(const hw_module_t* module, const char* name,
    185                     hw_device_t** device) {
    186   ALOGD("%s: enter; name=%s", __func__, name);
    187   int retval = 0; /* 0 is ok; -1 is error */
    188 
    189   if (strcmp(name, NFC_NCI_CONTROLLER) == 0) {
    190     pn547_dev_t* dev = calloc(1, sizeof(pn547_dev_t));
    191 
    192     /* Common hw_device_t fields */
    193     dev->nci_device.common.tag = HARDWARE_DEVICE_TAG;
    194     dev->nci_device.common.version =
    195         0x00010000; /* [31:16] major, [15:0] minor */
    196     dev->nci_device.common.module = (struct hw_module_t*)module;
    197     dev->nci_device.common.close = nfc_close;
    198 
    199     /* NCI HAL method pointers */
    200     dev->nci_device.open = hal_open;
    201     dev->nci_device.write = hal_write;
    202     dev->nci_device.core_initialized = hal_core_initialized;
    203     dev->nci_device.pre_discover = hal_pre_discover;
    204     dev->nci_device.close = hal_close;
    205     dev->nci_device.control_granted = hal_control_granted;
    206     dev->nci_device.power_cycle = hal_power_cycle;
    207 
    208     *device = (hw_device_t*)dev;
    209   } else {
    210     retval = -EINVAL;
    211   }
    212 
    213   ALOGD("%s: exit %d", __func__, retval);
    214   return retval;
    215 }
    216 
    217 /* Android hardware module definition */
    218 static struct hw_module_methods_t nfc_module_methods = {
    219     .open = nfc_open,
    220 };
    221 
    222 /* NFC module definition */
    223 struct nfc_nci_module_t HAL_MODULE_INFO_SYM = {
    224     .common =
    225         {
    226             .tag = HARDWARE_MODULE_TAG,
    227             .module_api_version = 0x0100, /* [15:8] major, [7:0] minor (1.0) */
    228             .hal_api_version = 0x00,      /* 0 is only valid value */
    229             .id = NFC_NCI_HARDWARE_MODULE_ID,
    230             .name = "NXP PN54X NFC NCI HW HAL",
    231             .author = "NXP Semiconductors",
    232             .methods = &nfc_module_methods,
    233         },
    234 };
    235