/******************************************************************************
 *
 *  Copyright (C) 2010-2014 Broadcom Corporation
 *
 *  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.
 *
 ******************************************************************************/
/******************************************************************************
 *
 *  The original Work has been changed by NXP.
 *
 *  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.
 *
 *  Copyright 2018 NXP
 *
 ******************************************************************************/
/******************************************************************************
 *
 *  NFA interface to NFCEE
 *
 ******************************************************************************/
#ifndef NFA_EE_API_H
#define NFA_EE_API_H

#include "nfa_api.h"
#include "nfc_api.h"
#include "nfc_target.h"

/*****************************************************************************
**  Constants and data types
*****************************************************************************/
/* 16 per ISO 7816 specification    */
#define NFA_MAX_AID_LEN NFC_MAX_AID_LEN
#if (NXP_EXTNS == TRUE)
#define NFA_MAX_APDU_DATA_LEN NFC_MAX_APDU_DATA_LEN
#define NFA_MAX_APDU_MASK_LEN NFC_MAX_APDU_MASK_LEN
#define NFA_EE_HANDLE_DH (NFA_HANDLE_GROUP_EE | NFC_DH_ID)
extern uint8_t NFA_REMOVE_ALL_AID[];
#define NFA_REMOVE_ALL_AID_LEN (0x08)
#endif
/* NFA EE callback events */
enum {
  NFA_EE_DISCOVER_EVT,   /* The status for NFA_EeDiscover () */
  NFA_EE_REGISTER_EVT,   /* The status for NFA_EeRegister () */
  NFA_EE_DEREGISTER_EVT, /* The status for NFA_EeDeregister () */
  NFA_EE_MODE_SET_EVT, /* The status for activating or deactivating an NFCEE */
  NFA_EE_ADD_AID_EVT,  /* The status for adding an AID to a routing table entry
                        */
  NFA_EE_REMOVE_AID_EVT,  /* The status for removing an AID from a routing table
                           */
  NFA_EE_ADD_SYSCODE_EVT, /* The status for adding an System Code to a routing
                             table entry */
  NFA_EE_REMOVE_SYSCODE_EVT, /* The status for removing an System Code from
                              routing table */
  NFA_EE_REMAINING_SIZE_EVT, /* The remaining size of the Listen Mode Routing
                                Table   */
  NFA_EE_SET_TECH_CFG_EVT,   /* The status for setting the routing based on RF
                                tech.  */
  NFA_EE_SET_PROTO_CFG_EVT,  /* The status for setting the routing based on
                                protocols */
  NFA_EE_UPDATED_EVT,        /* The status for NFA_EeUpdateNow */
  NFA_EE_CONNECT_EVT,        /* Result of NFA_EeConnect */
  NFA_EE_DATA_EVT, /* Received data from NFCEE.                             */
  NFA_EE_DISCONNECT_EVT, /* NFCEE connection closed. */
  NFA_EE_NEW_EE_EVT, /* A new NFCEE is discovered                             */
  NFA_EE_ACTION_EVT, /* An action happened in NFCEE                           */
  NFA_EE_DISCOVER_REQ_EVT, /* NFCEE Discover Request Notification */
  NFA_EE_NO_MEM_ERR_EVT,   /* Error - out of GKI buffers */
  NFA_EE_NO_CB_ERR_EVT, /* Error - Can not find control block or wrong state */
#if (NXP_EXTNS == TRUE)
  NFA_EE_SET_MODE_INFO_EVT,
  NFA_EE_PWR_LINK_CTRL_EVT, /* NFCEE Pwr and link cotnrol command Evt */
  NFA_EE_ADD_APDU_EVT,  /* The status for adding an APDU pattern to a routing table entry*/
  NFA_EE_REMOVE_APDU_EVT /* The status for removing an APDU pattern from a routing table */
#endif
};
typedef uint8_t tNFA_EE_EVT;

/* tNFA_NFCEE_INTERFACE values */
/* HCI Access Interface*/
#define NFA_EE_INTERFACE_HCI_ACCESS NFC_NFCEE_INTERFACE_HCI_ACCESS
typedef uint8_t tNFA_EE_INTERFACE;

typedef uint8_t tNFA_EE_TAG;

/* for NFA_EeModeSet () */
#define NFA_EE_MD_ACTIVATE NFC_MODE_ACTIVATE
#define NFA_EE_MD_DEACTIVATE NFC_MODE_DEACTIVATE
typedef uint8_t tNFA_EE_MD;

/* The device is on                 */
#define NFA_EE_PWR_STATE_ON 0x01
/* The device is switched off       */
#define NFA_EE_PWR_STATE_SWITCH_OFF 0x02
/* The device's battery is removed  */
#define NFA_EE_PWR_STATE_BATT_OFF 0x04
typedef uint8_t tNFA_EE_PWR_STATE;

/* NFCEE connected and inactive */
#define NFA_EE_STATUS_INACTIVE NFC_NFCEE_STATUS_INACTIVE
/* NFCEE connected and active   */
#define NFA_EE_STATUS_ACTIVE NFC_NFCEE_STATUS_ACTIVE
/* NFCEE removed                */
#define NFA_EE_STATUS_REMOVED NFC_NFCEE_STATUS_REMOVED
/* waiting for response from NFCC */
#define NFA_EE_STATUS_PENDING 0x10
typedef uint8_t tNFA_EE_STATUS;

/* additional NFCEE Info */
typedef struct {
  tNFA_EE_TAG tag;
  uint8_t len;
  uint8_t info[NFC_MAX_EE_INFO];
} tNFA_EE_TLV;

typedef struct {
  tNFA_HANDLE ee_handle;    /* handle for NFCEE oe DH   */
  tNFA_EE_STATUS ee_status; /* The NFCEE status         */
  uint8_t num_interface;    /* number of NFCEE interface*/
  tNFA_EE_INTERFACE
      ee_interface[NFC_MAX_EE_INTERFACE]; /* NFCEE supported interface */
  uint8_t num_tlvs;                       /* number of TLVs           */
  tNFA_EE_TLV ee_tlv[NFC_MAX_EE_TLVS];    /* the TLV                  */
  uint8_t ee_power_supply_status;         /* The NFCEE Power supply */
#if (NXP_EXTNS == TRUE)
  uint8_t hci_enable_state;
  tNFA_NFC_PROTOCOL la_protocol;  /* Listen A protocol    */
  tNFA_NFC_PROTOCOL lb_protocol;  /* Listen B protocol    */
  tNFA_NFC_PROTOCOL lf_protocol;  /* Listen F protocol    */
  tNFA_NFC_PROTOCOL lbp_protocol; /* Listen B' protocol   */
#endif
} tNFA_EE_INFO;

typedef struct {
  tNFA_STATUS status; /* NFA_STATUS_OK is successful      */
  uint8_t num_ee;     /* number of NFCEEs found           */
  tNFA_EE_INFO ee_info[NFA_EE_MAX_EE_SUPPORTED]; /*NFCEE information */
} tNFA_EE_DISCOVER;

typedef struct {
  tNFA_HANDLE ee_handle; /* Handle of NFCEE                                  */
  tNFA_STATUS status;    /* NFA_STATUS_OK is successful                      */
  tNFA_EE_INTERFACE
      ee_interface; /* NFCEE interface associated with this connection  */
} tNFA_EE_CONNECT;

typedef tNFC_EE_TRIGGER tNFA_EE_TRIGGER;

/* Union of NFCEE action parameter depending on the associated trigger */
typedef union {
  tNFA_NFC_PROTOCOL protocol; /* NFA_EE_TRGR_RF_PROTOCOL: the protocol that
                                 triggers this event */
  tNFC_RF_TECH technology;    /* NFA_EE_TRGR_RF_TECHNOLOGY:the technology that
                                 triggers this event */
  tNFC_AID aid; /* NFA_EE_TRGR_SELECT      : the AID in the received SELECT AID
                   command */
  tNFC_APP_INIT app_init; /* NFA_EE_TRGR_APP_INIT:     The information for the
                             application initiated trigger */
} tNFA_EE_ACTION_PARAM;

typedef struct {
  tNFA_HANDLE ee_handle;   /* Handle of NFCEE                  */
  tNFA_EE_TRIGGER trigger; /* the trigger of this event        */
  tNFA_EE_ACTION_PARAM param;
} tNFA_EE_ACTION;

typedef struct {
  tNFA_HANDLE ee_handle;    /* Handle of NFCEE              */
  tNFA_STATUS status;       /* NFA_STATUS_OK is successful  */
  tNFA_EE_STATUS ee_status; /* The NFCEE status             */
} tNFA_EE_MODE_SET;

#if (NXP_EXTNS == TRUE)
typedef struct {
  tNFA_STATUS status;
  uint8_t nfcee_id;
} tNFA_EE_SET_MODE_INFO;
typedef struct {
  tNFA_STATUS status;       /* NFA_STATUS_OK is successful  */
  tNFA_EE_STATUS ee_status; /* The NFCEE status             */
} tNFA_EE_PWR_LNK_CTRL;
#endif
typedef struct {
  tNFA_HANDLE ee_handle;          /* Handle of MFCEE      */
  tNFA_NFC_PROTOCOL la_protocol;  /* Listen A protocol    */
  tNFA_NFC_PROTOCOL lb_protocol;  /* Listen B protocol    */
  tNFA_NFC_PROTOCOL lf_protocol;  /* Listen F protocol    */
  tNFA_NFC_PROTOCOL lbp_protocol; /* Listen B' protocol   */
#if (NXP_EXTNS == TRUE)
  tNFA_NFC_PROTOCOL pa_protocol; /* Passive poll A SWP Reader   */
  tNFA_NFC_PROTOCOL pb_protocol; /* Passive poll B SWP Reader   */
  uint8_t ee_req_op;             /* add or remove req ntf*/
#endif
} tNFA_EE_DISCOVER_INFO;

/* Data for NFA_EE_DISCOVER_REQ_EVT */
typedef struct {
  uint8_t status; /* NFA_STATUS_OK if successful   */
  uint8_t num_ee; /* number of MFCEE information   */
  tNFA_EE_DISCOVER_INFO ee_disc_info[NFA_EE_MAX_EE_SUPPORTED -
                                     1]; /* NFCEE DISCOVER Request info   */
} tNFA_EE_DISCOVER_REQ;

/* Data for NFA_EE_DATA_EVT */
typedef struct {
  tNFA_HANDLE handle; /* Connection handle */
  uint16_t len;       /* Length of data    */
  uint8_t* p_buf;     /* Data buffer       */
} tNFA_EE_DATA;

/* Union of all EE callback structures */
typedef union {
  tNFA_STATUS
      status; /* NFA_STATUS_OK is successful; otherwise NFA_STATUS_FAILED */
  tNFA_EE_DATA data;
  tNFA_HANDLE handle;
  tNFA_EE_DISCOVER ee_discover;
  tNFA_STATUS ee_register;
  tNFA_STATUS deregister;
  tNFA_STATUS add_aid;
  tNFA_STATUS remove_aid;
  tNFA_STATUS add_sc;
  tNFA_STATUS remove_sc;
  tNFA_STATUS set_tech;
  tNFA_STATUS set_proto;
  uint16_t size;
  tNFA_EE_CONNECT connect;
  tNFA_EE_ACTION action;
  tNFA_EE_MODE_SET mode_set;
#if (NXP_EXTNS == TRUE)
  tNFA_EE_SET_MODE_INFO ee_set_mode_info;
  tNFA_EE_PWR_LNK_CTRL pwr_lnk_ctrl;
#endif
  tNFA_EE_INFO new_ee;
  tNFA_EE_DISCOVER_REQ discover_req;
} tNFA_EE_CBACK_DATA;

/* EE callback */
typedef void(tNFA_EE_CBACK)(tNFA_EE_EVT event, tNFA_EE_CBACK_DATA* p_data);

/*****************************************************************************
**  External Function Declarations
*****************************************************************************/

/*******************************************************************************
**
** Function         NFA_EeDiscover
**
** Description      This function retrieves the NFCEE information from NFCC.
**                  The NFCEE information is reported in NFA_EE_DISCOVER_EVT.
**
**                  This function may be called when a system supports removable
**                  NFCEEs,
**
** Returns          NFA_STATUS_OK if information is retrieved successfully
**                  NFA_STATUS_FAILED If wrong state (retry later)
**                  NFA_STATUS_INVALID_PARAM If bad parameter
**
*******************************************************************************/
extern tNFA_STATUS NFA_EeDiscover(tNFA_EE_CBACK* p_cback);

/*******************************************************************************
**
** Function         NFA_EeGetInfo
**
** Description      This function retrieves the NFCEE information from NFA.
**                  The actual number of NFCEE is returned in p_num_nfcee
**                  and NFCEE information is returned in p_info
**
** Returns          NFA_STATUS_OK if information is retrieved successfully
**                  NFA_STATUS_FAILED If wrong state (retry later)
**                  NFA_STATUS_INVALID_PARAM If bad parameter
**
*******************************************************************************/
extern tNFA_STATUS NFA_EeGetInfo(uint8_t* p_num_nfcee, tNFA_EE_INFO* p_info);

/*******************************************************************************
**
** Function         NFA_EeRegister
**
** Description      This function registers a callback function to receive the
**                  events from NFA-EE module.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**                  NFA_STATUS_INVALID_PARAM If bad parameter
**
*******************************************************************************/
extern tNFA_STATUS NFA_EeRegister(tNFA_EE_CBACK* p_cback);

/*******************************************************************************
**
** Function         NFA_EeDeregister
**
** Description      This function de-registers the callback function
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**                  NFA_STATUS_INVALID_PARAM If bad parameter
**
*******************************************************************************/
extern tNFA_STATUS NFA_EeDeregister(tNFA_EE_CBACK* p_cback);

/*******************************************************************************
**
** Function         NFA_EeModeSet
**
** Description      This function is called to activate
**                  (mode = NFA_EE_MD_ACTIVATE) or deactivate
**                  (mode = NFA_EE_MD_DEACTIVATE) the NFCEE identified by the
**                  given ee_handle. The result of this operation is reported
**                  with the NFA_EE_MODE_SET_EVT.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**                  NFA_STATUS_INVALID_PARAM If bad parameter
**
*******************************************************************************/
extern tNFA_STATUS NFA_EeModeSet(tNFA_HANDLE ee_handle, tNFA_EE_MD mode);

/*******************************************************************************
**
** Function         NFA_EeSetDefaultTechRouting
**
** Description      This function is called to add, change or remove the
**                  default routing based on RF technology in the listen mode
**                  routing table for the given ee_handle. The status of this
**                  operation is reported as the NFA_EE_SET_TECH_CFG_EVT.
**
** Note:            If RF discovery is started,
**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
**                  happen before calling this function
**
** Note:            NFA_EeUpdateNow() should be called after last NFA-EE
**                  function to change the listen mode routing is called.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**                  NFA_STATUS_INVALID_PARAM If bad parameter
**
*******************************************************************************/
extern tNFA_STATUS NFA_EeSetDefaultTechRouting(
    tNFA_HANDLE ee_handle, tNFA_TECHNOLOGY_MASK technologies_switch_on,
    tNFA_TECHNOLOGY_MASK technologies_switch_off,
    tNFA_TECHNOLOGY_MASK technologies_battery_off,
    tNFA_TECHNOLOGY_MASK technologies_screen_lock,
    tNFA_TECHNOLOGY_MASK technologies_screen_off,
    tNFA_TECHNOLOGY_MASK technologies_screen_off_lock);

/*******************************************************************************
**
** Function         NFA_EeSetDefaultProtoRouting
**
** Description      This function is called to add, change or remove the
**                  default routing based on Protocol in the listen mode routing
**                  table for the given ee_handle. The status of this
**                  operation is reported as the NFA_EE_SET_PROTO_CFG_EVT.
**
** Note:            If RF discovery is started,
**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
**                  happen before calling this function
**
** Note:            NFA_EeUpdateNow() should be called after last NFA-EE
**                  function to change the listen mode routing is called.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**                  NFA_STATUS_INVALID_PARAM If bad parameter
**
*******************************************************************************/
extern tNFA_STATUS NFA_EeSetDefaultProtoRouting(
    tNFA_HANDLE ee_handle, tNFA_PROTOCOL_MASK protocols_switch_on,
    tNFA_PROTOCOL_MASK protocols_switch_off,
    tNFA_PROTOCOL_MASK protocols_battery_off,
    tNFA_PROTOCOL_MASK protocols_screen_lock,
    tNFA_PROTOCOL_MASK protocols_screen_off,
    tNFA_PROTOCOL_MASK protocols_screen_off_lock);

/*******************************************************************************
**
** Function         NFA_EeAddAidRouting
**
** Description      This function is called to add an AID entry in the
**                  listen mode routing table in NFCC. The status of this
**                  operation is reported as the NFA_EE_ADD_AID_EVT.
**
** Note:            If RF discovery is started,
**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
**                  happen before calling this function
**
** Note:            NFA_EeUpdateNow() should be called after last NFA-EE
**                  function to change the listen mode routing is called.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**                  NFA_STATUS_INVALID_PARAM If bad parameter
**
*******************************************************************************/
extern tNFA_STATUS NFA_EeAddAidRouting(tNFA_HANDLE ee_handle, uint8_t aid_len,
                                       uint8_t* p_aid,
                                       tNFA_EE_PWR_STATE power_state,
                                       uint8_t aidInfo);

/*******************************************************************************
**
** Function         NFA_EeRemoveAidRouting
**
** Description      This function is called to remove the given AID entry from
**                  the listen mode routing table. If the entry configures VS,
**                  it is also removed. The status of this operation is reported
**                  as the NFA_EE_REMOVE_AID_EVT.
**
** Note:            If RF discovery is started,
**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
**                  happen before calling this function
**
** Note:            NFA_EeUpdateNow() should be called after last NFA-EE
**                  function to change the listen mode routing is called.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**                  NFA_STATUS_INVALID_PARAM If bad parameter
**
*******************************************************************************/
extern tNFA_STATUS NFA_EeRemoveAidRouting(uint8_t aid_len, uint8_t* p_aid);

/*******************************************************************************
 **
 ** Function         NFA_EeAddSystemCodeRouting
 **
 ** Description      This function is called to add an system code entry in the
 **                  listen mode routing table in NFCC. The status of this
 **                  operation is reported as the NFA_EE_ADD_SYSCODE_EVT.
 **
 ** Note:            If RF discovery is started,
 **                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
 **                  happen before calling this function
 **
 ** Note:            NFA_EeUpdateNow() should be called after last NFA-EE
 **                  function to change the listen mode routing is called.
 **
 ** Returns          NFA_STATUS_OK if successfully initiated
 **                  NFA_STATUS_FAILED otherwise
 **                  NFA_STATUS_INVALID_PARAM If bad parameter
 **
 *******************************************************************************/
extern tNFA_STATUS NFA_EeAddSystemCodeRouting(uint16_t systemcode,
                                              tNFA_HANDLE ee_handle,
                                              tNFA_EE_PWR_STATE power_state);

/*******************************************************************************
**
** Function         NFA_EeRemoveSystemCodeRouting
**
** Description      This function is called to remove the given System Code
*based entry from
**                  the listen mode routing table. The status of this operation
*is reported
**                  as the NFA_EE_REMOVE_SYSCODE_EVT.
**
** Note:            If RF discovery is started,
**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
**                  happen before calling this function
**
** Note:            NFA_EeUpdateNow() should be called after last NFA-EE
**                  function to change the listen mode routing is called.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**                  NFA_STATUS_INVALID_PARAM If bad parameter
**
*******************************************************************************/
extern tNFA_STATUS NFA_EeRemoveSystemCodeRouting(uint16_t systemcode);
#if (NXP_EXTNS == TRUE)
/*******************************************************************************
**
** Function         NFA_EeAddApduPatternRouting
**
** Description      This function is called to add an APDU pattern entry in the
**                  listen mode routing table in NFCC. The status of this
**                  operation is reported as the NFA_EE_ADD_APDU_EVT.
**
** Note:            If RF discovery is started,
**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
**                  happen before calling this function
**
** Note:            NFA_EeUpdateNow() should be called after last NFA-EE
**                  function to change the listen mode routing is called.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**                  NFA_STATUS_INVALID_PARAM If bad parameter
**
*******************************************************************************/
extern tNFA_STATUS NFA_EeAddApduPatternRouting(uint8_t apdu_data_len,uint8_t* apdu_data, uint8_t apdu_mask_len,
  uint8_t* apdu_mask, tNFA_HANDLE ee_handle, uint8_t power_state);

/*******************************************************************************
**
** Function         NFA_EeRemoveApduPatternRouting
**
** Description      This function is called to remove the given APDU pattern entry from
**                  the listen mode routing table. If the entry configures VS,
**                  it is also removed. The status of this operation is reported
**                  as the NFA_EE_REMOVE_APDU_EVT.
**
** Note:            If RF discovery is started,
**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
**                  happen before calling this function
**
** Note:            NFA_EeUpdateNow() should be called after last NFA-EE
**                  function to change the listen mode routing is called.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**                  NFA_STATUS_INVALID_PARAM If bad parameter
**
*******************************************************************************/
extern tNFA_STATUS NFA_EeRemoveApduPatternRouting(uint8_t apdu_len, uint8_t* p_apdu);
#endif
/*******************************************************************************
**
** Function         NFA_EeGetLmrtRemainingSize
**
** Description      This function is called to get remaining size of the
**                  Listen Mode Routing Table.
**                  The remaining size is reported in NFA_EE_REMAINING_SIZE_EVT
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_EeGetLmrtRemainingSize(void);

/*******************************************************************************
**
** Function         NFA_EeUpdateNow
**
** Description      This function is called to send the current listen mode
**                  routing table and VS configuration to the NFCC (without
**                  waiting for NFA_EE_ROUT_TIMEOUT_VAL).
**
**                  The status of this operation is
**                  reported with the NFA_EE_UPDATED_EVT.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_SEMANTIC_ERROR is update is currently in progress
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_EeUpdateNow(void);

/*******************************************************************************
**
** Function         NFA_EeConnect
**
** Description      Open connection to an NFCEE attached to the NFCC
**
**                  The status of this operation is
**                  reported with the NFA_EE_CONNECT_EVT.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**                  NFA_STATUS_INVALID_PARAM If bad parameter
**
*******************************************************************************/
extern tNFA_STATUS NFA_EeConnect(tNFA_HANDLE ee_handle, uint8_t ee_interface,
                                 tNFA_EE_CBACK* p_cback);

/*******************************************************************************
**
** Function         NFA_EeSendData
**
** Description      Send data to the given NFCEE.
**                  This function shall be called after NFA_EE_CONNECT_EVT is
**                  reported and before NFA_EeDisconnect is called on the given
**                  ee_handle.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**                  NFA_STATUS_INVALID_PARAM If bad parameter
**
*******************************************************************************/
extern tNFA_STATUS NFA_EeSendData(tNFA_HANDLE ee_handle, uint16_t data_len,
                                  uint8_t* p_data);

/*******************************************************************************
**
** Function         NFA_EeDisconnect
**
** Description      Disconnect (if a connection is currently open) from an
**                  NFCEE interface. The result of this operation is reported
**                  with the NFA_EE_DISCONNECT_EVT.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**                  NFA_STATUS_INVALID_PARAM If bad parameter
**
*******************************************************************************/
extern tNFA_STATUS NFA_EeDisconnect(tNFA_HANDLE ee_handle);

#if (NXP_EXTNS == TRUE)
/*******************************************************************************
**
** Function         NFA_AllEeGetInfo
**
** Description      This function retrieves the All NFCEE's independent of
**                  their status information from NFA.
**                  The actual number of NFCEE is returned in p_num_nfcee
**                  and NFCEE information is returned in p_info
**
** Returns          NFA_STATUS_OK if information is retrieved successfully
**                  NFA_STATUS_FAILED If wrong state (retry later)
**                  NFA_STATUS_INVALID_PARAM If bad parameter
**
*******************************************************************************/
extern tNFA_STATUS NFA_AllEeGetInfo(uint8_t* p_num_nfcee, tNFA_EE_INFO* p_info);
/*******************************************************************************
**
** Function         NFA_SendPowerLinkCommand
**
** Description      This function sends the power link control command
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**                  NFA_STATUS_INVALID_PARAM If bad parameter
**
*******************************************************************************/
extern tNFA_STATUS NFA_SendPowerLinkCommand(uint8_t nfcee_id, uint8_t cfg_value);
/*******************************************************************************
**
** Function         NFA_GetAidTableSize
**
** Description      This function is called to get the AID routing table size.
**
** Returns          Maximum AID routing table size.
**
*******************************************************************************/
extern uint16_t NFA_GetAidTableSize();

/*******************************************************************************
**
** Function         NFA_GetRemainingAidTableSize
**
** Description      This function is called to get the remaining AID routing
**                  table size.
**
** Returns          Remaining AID routing table size.
**
*******************************************************************************/
extern uint16_t NFA_GetRemainingAidTableSize();
#endif /* #if (NXP_EXTNS == TRUE) */
#endif /* NFA_EE_API_H */
