/******************************************************************************
 *
 *  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.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  This is the public interface file for NFA, Broadcom's NFC application
 *  layer for mobile phones.
 *
 ******************************************************************************/
#ifndef NFA_API_H
#define NFA_API_H

#include "gki.h"
#include "nci_defs.h"
#include "nfc_api.h"
#include "nfc_hal_api.h"
#include "nfc_target.h"
#include "rw_api.h"
#include "tags_defs.h"

/*****************************************************************************
**  Constants and data types
*****************************************************************************/

/* Max length of Appliction ID in 7816-4 */
#define NFA_MAX_AID_LEN NFC_MAX_AID_LEN
#define NFA_MIN_AID_LEN 5 /* per NCI specification */

/* Command succeeded    */
#define NFA_STATUS_OK NCI_STATUS_OK
/* Command is rejected. */
#define NFA_STATUS_REJECTED NCI_STATUS_REJECTED
/* buffer full          */
#define NFA_STATUS_BUFFER_FULL NCI_STATUS_BUFFER_FULL
/* failed               */
#define NFA_STATUS_FAILED NCI_STATUS_FAILED
/* Optional feature of NCI Spec not supported */
#define NFA_STATUS_NOT_SUPPORTED NCI_STATUS_NOT_SUPPORTED
/* Semantic error       */
#define NFA_STATUS_SEMANTIC_ERROR NCI_STATUS_SEMANTIC_ERROR
/* Unknown NCI Group ID */
#define NFA_STATUS_UNKNOWN_GID NCI_STATUS_UNKNOWN_GID
/* Invalid Parameter    */
#define NFA_STATUS_INVALID_PARAM NCI_STATUS_INVALID_PARAM
/* Already started      */
#define NFA_STATUS_ALREADY_STARTED NCI_STATUS_ALREADY_STARTED
#define NFA_STATUS_RF_UNEXPECTED_DATA NCI_STATUS_RF_UNEXPECTED_DATA
/* RF frame error       */
#define NFA_STATUS_RF_FRAME_CORRUPTED NCI_STATUS_RF_FRAME_CORRUPTED
/* RF protocol error    */
#define NFA_STATUS_RF_PROTOCOL_ERR NCI_STATUS_RF_PROTOCOL_ERR
/* RF Timeout           */
#define NFA_STATUS_TIMEOUT NCI_STATUS_TIMEOUT

#define NFA_STATUS_CONTINUE NFC_STATUS_CONTINUE
/* Out of GKI buffers */
#define NFA_STATUS_NO_BUFFERS NFC_STATUS_NO_BUFFERS
/* Protocol mismatch between API and activated one */
#define NFA_STATUS_WRONG_PROTOCOL NFC_STATUS_WRONG_PROTOCOL
/* Another Tag command is already in progress */
#define NFA_STATUS_BUSY NFC_STATUS_BUSY

/* data len exceeds MIU                             */
#define NFA_STATUS_BAD_LENGTH NFC_STATUS_BAD_LENGTH
/* invalid handle                                   */
#define NFA_STATUS_BAD_HANDLE NFC_STATUS_BAD_HANDLE
/* congested                                        */
#define NFA_STATUS_CONGESTED NFC_STATUS_CONGESTED
typedef uint8_t tNFA_STATUS;

/* Handle for NFA registrations and connections */
typedef uint16_t tNFA_HANDLE;
#define NFA_HANDLE_INVALID (0xFFFF)
/* NFA Handle definitions */

/* The upper byte of NFA_HANDLE signifies the handle group */
/* NDEF Type Handler handles    */
#define NFA_HANDLE_GROUP_NDEF_HANDLER 0x0200
/* DH Card Emulation handles    */
#define NFA_HANDLE_GROUP_CE 0x0300
/* Handles to identify NFCEE    */
#define NFA_HANDLE_GROUP_EE 0x0400
/* HCI handles                  */
#define NFA_HANDLE_GROUP_HCI 0x0800
/* Local NDEF message handle    */
#define NFA_HANDLE_GROUP_MASK 0xFF00
#define NFA_HANDLE_MASK 0x00FF

/* NCI Parameter IDs */
typedef uint8_t tNFA_PMID;

/* Definitions for tNFA_TECHNOLOGY_MASK */
#define NFA_TECHNOLOGY_MASK_A 0x01        /* NFC Technology A             */
#define NFA_TECHNOLOGY_MASK_B 0x02        /* NFC Technology B             */
#define NFA_TECHNOLOGY_MASK_F 0x04        /* NFC Technology F             */
/* TECHNOLOGY_MASK_V in NCI2.0 and TECHNOLOGY_MASK_15693 proprietary in NCI1.0*/
#define NFA_TECHNOLOGY_MASK_V 0x08
#define NFA_TECHNOLOGY_MASK_B_PRIME 0x10  /* Proprietary Technology       */
#define NFA_TECHNOLOGY_MASK_KOVIO 0x20    /* Proprietary Technology       */
/* NFC technology NFC-DEP protocol active mode */
#define NFA_TECHNOLOGY_MASK_ACTIVE 0x40
/* NFC Technology A active mode */
#define NFA_TECHNOLOGY_MASK_A_ACTIVE 0x40
/* NFC Technology F active mode */
#define NFA_TECHNOLOGY_MASK_F_ACTIVE 0x80
/* All supported technologies   */
typedef uint8_t tNFA_TECHNOLOGY_MASK;

/* Definitions for NFC protocol for RW, CE and P2P APIs */
/* Type1Tag - NFC-A */
#define NFA_PROTOCOL_T1T NFC_PROTOCOL_T1T
/* MIFARE/Type2Tag - NFC-A */
#define NFA_PROTOCOL_T2T NFC_PROTOCOL_T2T
/* Felica/Type3Tag - NFC-F */
#define NFA_PROTOCOL_T3T NFC_PROTOCOL_T3T
/* Type 4A,4B - NFC-A or NFC-B */
#define NFA_PROTOCOL_ISO_DEP NFC_PROTOCOL_ISO_DEP
/* NFCDEP/LLCP - NFC-A or NFC-F */
#define NFA_PROTOCOL_NFC_DEP NFC_PROTOCOL_NFC_DEP
/* NFC_PROTOCOL_T5T in NCI2.0 and NFC_PROTOCOL_ISO15693 proprietary in NCI1.0*/
#define NFA_PROTOCOL_T5T NFC_PROTOCOL_T5T
#define NFA_PROTOCOL_CI NFC_PROTOCOL_CI
#define NFA_PROTOCOL_INVALID 0xFF
typedef uint8_t tNFA_NFC_PROTOCOL;

/* Definitions for tNFA_PROTOCOL_MASK */
#define NFA_PROTOCOL_MASK_T1T 0x01     /* Type 1 tag          */
#define NFA_PROTOCOL_MASK_T2T 0x02     /* MIFARE / Type 2 tag */
#define NFA_PROTOCOL_MASK_T3T 0x04     /* FeliCa / Type 3 tag */
#define NFA_PROTOCOL_MASK_ISO_DEP 0x08 /* ISODEP/4A,4B        */
typedef uint8_t tNFA_PROTOCOL_MASK;

/* NFA_DM callback events */
/* Result of NFA_Enable             */
#define NFA_DM_ENABLE_EVT 0
/* Result of NFA_Disable            */
#define NFA_DM_DISABLE_EVT 1
/* Result of NFA_SetConfig          */
#define NFA_DM_SET_CONFIG_EVT 2
/* Result of NFA_GetConfig          */
#define NFA_DM_GET_CONFIG_EVT 3
/* Result of NFA_PowerOffSleepMode  */
#define NFA_DM_PWR_MODE_CHANGE_EVT 4
#define NFA_DM_RF_FIELD_EVT 5 /* Status of RF Field               */
/* NFCC is not responding           */
#define NFA_DM_NFCC_TIMEOUT_EVT 6
/* NCI Tranport error               */
#define NFA_DM_NFCC_TRANSPORT_ERR_EVT 7
/* Result of NFA_SetPowerSubStateForScreenState */
#define NFA_DM_SET_POWER_SUB_STATE_EVT 11
/* T1T HR length            */
#define NFA_T1T_HR_LEN T1T_HR_LEN
/* Max UID length of T1/T2  */
#define NFA_MAX_UID_LEN TAG_MAX_UID_LEN
/* UID len for T1T cmds     */
#define NFA_T1T_CMD_UID_LEN T1T_CMD_UID_LEN
/* T2T UID length           */

/* Tag formated for NDEF */
#define NFA_RW_NDEF_FL_FORMATED RW_NDEF_FL_FORMATED
/* NDEF supported by the tag */
#define NFA_RW_NDEF_FL_SUPPORTED RW_NDEF_FL_SUPPORTED
/* Unable to find if tag is ndef capable/formated/read only */
#define NFA_RW_NDEF_FL_UNKNOWN RW_NDEF_FL_UNKNOWN
/* Tag supports format operation */
#define NFA_RW_NDEF_FL_FORMATABLE RW_NDEF_FL_FORMATABLE

typedef uint8_t tNFA_RW_NDEF_FLAG;

/* Data for NFA_DM_SET_CONFIG_EVT */
typedef struct {
  tNFA_STATUS status;                   /* NFA_STATUS_OK if successful  */
  uint8_t num_param_id;                 /* Number of rejected Param ID  */
  tNFA_PMID param_ids[NFC_MAX_NUM_IDS]; /* Rejected Param ID            */
} tNFA_SET_CONFIG;

/* Data for NFA_DM_GET_CONFIG_EVT */
typedef struct {
  tNFA_STATUS status;    /* NFA_STATUS_OK if successful              */
  uint16_t tlv_size;     /* The length of TLV                        */
  uint8_t* param_tlvs;   /* TLV (Parameter ID-Len-Value byte stream) */
} tNFA_GET_CONFIG;

/* Structure to store screen state */
typedef enum screen_state {
  NFA_SCREEN_STATE_UNKNOWN = 0x00,
  NFA_SCREEN_STATE_OFF_UNLOCKED = 0x01,
  NFA_SCREEN_STATE_OFF_LOCKED = 0x02,
  NFA_SCREEN_STATE_ON_LOCKED = 0x04,
  NFA_SCREEN_STATE_ON_UNLOCKED = 0x08
} eScreenState_t;

typedef enum power_substate {
  SCREEN_STATE_ON_UNLOCKED = 0x00,
  SCREEN_STATE_OFF_UNLOCKED,
  SCREEN_STATE_ON_LOCKED,
  SCREEN_STATE_OFF_LOCKED,
  SCREEN_STATE_INVALID = 0xFF
} epower_substate_t;

#define NFA_SCREEN_STATE_MASK 0x0F

/* CONN_DISCOVER_PARAM */
#define NFA_DM_PWR_MODE_FULL 0x04
#define NFA_DM_PWR_MODE_OFF_SLEEP 0x00

typedef uint8_t tNFA_DM_PWR_MODE;

/* Data for NFA_DM_PWR_MODE_CHANGE_EVT */
typedef struct {
  tNFA_STATUS status; /* NFA_STATUS_OK if successful */
  /* NFA_DM_PWR_MODE_FULL or NFA_DM_PWR_MODE_OFF_SLEEP */
  tNFA_DM_PWR_MODE power_mode;
} tNFA_DM_PWR_MODE_CHANGE;

/* Data for NFA_DM_RF_FIELD_EVT */
#define NFA_DM_RF_FIELD_OFF 0x00
#define NFA_DM_RF_FIELD_ON 0x01

typedef struct {
  tNFA_STATUS status; /* NFA_STATUS_OK if successful  */
  /* NFA_DM_RF_FIELD_ON if operating field generated by remote */
  uint8_t rf_field_status;
} tNFA_DM_RF_FIELD;

typedef struct {
  tNFA_STATUS status;  /* NFA_STATUS_OK if successful  */
  uint8_t power_state; /* current screen/power state */
} tNFA_DM_POWER_STATE;

/* Union of all DM callback structures */
typedef union {
  tNFA_STATUS status;                 /* NFA_DM_ENABLE_EVT        */
  tNFA_SET_CONFIG set_config;         /* NFA_DM_SET_CONFIG_EVT    */
  tNFA_GET_CONFIG get_config;         /* NFA_DM_GET_CONFIG_EVT    */
  tNFA_DM_PWR_MODE_CHANGE power_mode; /* NFA_DM_PWR_MODE_CHANGE_EVT   */
  tNFA_DM_RF_FIELD rf_field;          /* NFA_DM_RF_FIELD_EVT      */
  void* p_vs_evt_data;                /* Vendor-specific evt data */
  tNFA_DM_POWER_STATE power_sub_state; /* power sub state */
} tNFA_DM_CBACK_DATA;

/* NFA_DM callback */
typedef void(tNFA_DM_CBACK)(uint8_t event, tNFA_DM_CBACK_DATA* p_data);

/* NFA Enable DTA Type Mode */
typedef enum {
  NFA_DTA_APPL_MODE = 0x00000000,
  NFA_DTA_DEFAULT_MODE = 0x00000001,
  NFA_DTA_LLCP_MODE = 0x00000002,
  NFA_DTA_HCEF_MODE = 0x00000004,
  NFA_DTA_CR8 = 0x00000080,
} tNFA_eDtaModes;

/* NFA Connection Callback Events */
#define NFA_POLL_ENABLED_EVT 0  /* Polling enabled event */
#define NFA_POLL_DISABLED_EVT 1 /* Polling disabled event */
/* NFC link/protocol discovery notificaiton */
#define NFA_DISC_RESULT_EVT 2
/* NFC link/protocol discovery select response */
#define NFA_SELECT_RESULT_EVT 3
#define NFA_DEACTIVATE_FAIL_EVT 4 /* NFA_Deactivate failure */
/* NFC link/protocol activated */
#define NFA_ACTIVATED_EVT 5
/* NFC link/protocol deactivated */
#define NFA_DEACTIVATED_EVT 6
#define NFA_TLV_DETECT_EVT 7 /* TLV Detection complete */
/* NDEF Detection complete */
#define NFA_NDEF_DETECT_EVT 8
#define NFA_DATA_EVT 9            /* Data message received */
#define NFA_SELECT_CPLT_EVT 10    /* Select completed */
#define NFA_READ_CPLT_EVT 11      /* Read completed */
#define NFA_WRITE_CPLT_EVT 12     /* Write completed */
/* Response to NFA_RwPresenceCheck */
#define NFA_PRESENCE_CHECK_EVT 15
/* Tag Formating completed */
#define NFA_FORMAT_CPLT_EVT 16
/* ISO 15693 command completed */
#define NFA_I93_CMD_CPLT_EVT 17
#define NFA_SET_TAG_RO_EVT 18 /* Tag set as Read only */
/* Result for NFA_RequestExclusiveRfControl */
#define NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT 19
/* Result for NFA_ReleaseExclusiveRfControl */
#define NFA_EXCLUSIVE_RF_CONTROL_STOPPED_EVT 20
/* DH Card emulation: AID or System code reg'd  */
#define NFA_CE_REGISTERED_EVT 21
/* DH Card emulation: AID or System code dereg'd */
#define NFA_CE_DEREGISTERED_EVT 22
/* DH Card emulation: data received event */
#define NFA_CE_DATA_EVT 23
/* DH Card emulation: activation event */
#define NFA_CE_ACTIVATED_EVT 24
/* DH Card emulation: deactivation event */
#define NFA_CE_DEACTIVATED_EVT 25
/* DH Card emulation: local NDEF configured */
#define NFA_CE_LOCAL_TAG_CONFIGURED_EVT 26
/* DH Card emulation: NDEF write started */
#define NFA_CE_NDEF_WRITE_START_EVT 27
/* DH Card emulation: NDEF write completed */
#define NFA_CE_NDEF_WRITE_CPLT_EVT 28
#define NFA_CE_UICC_LISTEN_CONFIGURED_EVT 29 /* UICC Listen configured */
/* RF Discovery started event */
#define NFA_RF_DISCOVERY_STARTED_EVT 30
/* RF Discovery stopped event */
#define NFA_RF_DISCOVERY_STOPPED_EVT 31
/* status of updating RF communication paramters */
#define NFA_UPDATE_RF_PARAM_RESULT_EVT 32
/* RF Interface error event */
#define NFA_RW_INTF_ERROR_EVT 34
/* Listening enabled event */
#define NFA_LISTEN_ENABLED_EVT 36
/* Listening disabled event */
#define NFA_LISTEN_DISABLED_EVT 37
/* T2T command completed */
#define NFA_T2T_CMD_CPLT_EVT 40

/* NFC deactivation type */
#define NFA_DEACTIVATE_TYPE_IDLE NFC_DEACTIVATE_TYPE_IDLE
#define NFA_DEACTIVATE_TYPE_SLEEP NFC_DEACTIVATE_TYPE_SLEEP
#define NFA_DEACTIVATE_TYPE_DISCOVERY NFC_DEACTIVATE_TYPE_DISCOVERY

typedef uint8_t tNFA_DEACTIVATE_TYPE;

/* Data for NFA_DISC_RESULT_EVT */
typedef struct {
  tNFA_STATUS status;             /* NFA_STATUS_OK if successful       */
  tNFC_RESULT_DEVT discovery_ntf; /* RF discovery notification details */
} tNFA_DISC_RESULT;

/* Data for NFA_ACTIVATED_EVT */
typedef struct {
  uint8_t hr[NFA_T1T_HR_LEN];       /* HR of Type 1 tag         */
  uint8_t uid[NFA_T1T_CMD_UID_LEN]; /* UID used in T1T Commands */
} tNFA_T1T_PARAMS;

typedef struct {
  uint8_t uid[NFA_MAX_UID_LEN]; /* UID of T2T tag           */
} tNFA_T2T_PARAMS;

typedef struct {
  uint8_t num_system_codes; /* Number of system codes supporte by tag   */
  uint16_t* p_system_codes; /* Pointer to list of system codes          */
} tNFA_T3T_PARAMS;

typedef struct {
  uint8_t uid[I93_UID_BYTE_LEN]; /* UID[0]:MSB, ... UID[7]:LSB */
  uint8_t info_flags;   /* information flags                            */
  uint8_t dsfid;        /* DSFID if I93_INFO_FLAG_DSFID                 */
  uint8_t afi;          /* AFI if I93_INFO_FLAG_AFI                     */
  uint16_t num_block;   /* number of blocks if I93_INFO_FLAG_MEM_SIZE   */
  uint8_t block_size;   /* block size in byte if I93_INFO_FLAG_MEM_SIZE */
  uint8_t IC_reference; /* IC Reference if I93_INFO_FLAG_IC_REF         */
} tNFA_I93_PARAMS;

typedef struct {
  uint8_t mbi;
  uint8_t uid[8]; /* UID of Chinese Id Card           */
} tNFA_CI_PARAMS;
typedef union {
  tNFA_T1T_PARAMS t1t; /* HR and UID of T1T                */
  tNFA_T2T_PARAMS t2t; /* UID of T2T                       */
  tNFA_T3T_PARAMS t3t; /* System codes                     */
  tNFA_I93_PARAMS i93; /* System Information of ISO 15693  */
  tNFA_CI_PARAMS ci;
} tNFA_TAG_PARAMS;

typedef struct {
  tNFC_ACTIVATE_DEVT activate_ntf; /* RF discovery activation details */
  tNFA_TAG_PARAMS params;          /* additional informaiton of tag   */
} tNFA_ACTIVATED;

/* Data for NFA_DEACTIVATED_EVT */
typedef struct {
  /* NFA_DEACTIVATE_TYPE_IDLE or NFA_DEACTIVATE_TYPE_SLEEP */
  tNFA_DEACTIVATE_TYPE type;
} tNFA_DEACTIVATED;

/* Structure for NFA_NDEF_DETECT_EVT event data */
typedef struct {
  tNFA_STATUS status;         /* Status of the ndef detecton */
  tNFA_NFC_PROTOCOL protocol; /* protocol used to detect NDEF */
  uint32_t max_size;          /* max number of bytes available for NDEF data */
  uint32_t cur_size;          /* current size of stored NDEF data (in bytes) */
  /* Flags to indicate NDEF capability, is formated, soft/hard lockable,
   * formatable, otp and read only */
  tNFA_RW_NDEF_FLAG flags;
} tNFA_NDEF_DETECT;

/* Structure for NFA_TLV_DETECT_EVT event data */
typedef struct {
  tNFA_STATUS status;         /* Status of the tlv detecton        */
  tNFA_NFC_PROTOCOL protocol; /* protocol used to detect TLV       */
  uint8_t num_tlvs;           /* number of tlvs present in the tag */
  uint8_t num_bytes;          /* number of lock/reserved bytes     */
} tNFA_TLV_DETECT;

/* Structure for NFA_DATA_EVT data */
typedef struct {
  tNFA_STATUS status; /* Status of Data received          */
  uint8_t* p_data;    /* Data buffer                      */
  uint16_t len;       /* Length of data                   */
} tNFA_RX_DATA;

/* Structure for NFA_CE_NDEF_WRITE_CPLT_EVT data */
typedef struct {
  tNFA_STATUS status; /* Status of the ndef write op      */
  uint32_t len;       /* Update length of NDEF data       */
  uint8_t* p_data;    /* data buffer                      */
} tNFA_CE_NDEF_WRITE_CPLT;

/* Data for NFA_I93_CMD_CPLT_EVT */
typedef struct {
  uint8_t dsfid;                 /* DSFID                       */
  uint8_t uid[I93_UID_BYTE_LEN]; /* UID[0]:MSB, ... UID[7]:LSB  */
} tNFA_I93_INVENTORY;

typedef struct /* RW_I93_SYS_INFO_EVT                          */
{
  uint8_t info_flags; /* information flags                            */
  uint8_t uid[I93_UID_BYTE_LEN]; /* UID */
  uint8_t dsfid;        /* DSFID if I93_INFO_FLAG_DSFID                 */
  uint8_t afi;          /* AFI if I93_INFO_FLAG_AFI                     */
  uint16_t num_block;   /* number of blocks if I93_INFO_FLAG_MEM_SIZE   */
  uint8_t block_size;   /* block size in byte if I93_INFO_FLAG_MEM_SIZE */
  uint8_t IC_reference; /* IC Reference if I93_INFO_FLAG_IC_REF         */
} tNFA_I93_SYS_INFO;

typedef struct {
  tNFA_STATUS status;   /* Status of sending command       */
  uint8_t sent_command; /* sent command to tag             */
  union {
    uint8_t error_code;           /* error code defined in ISO 15693 */
    tNFA_I93_INVENTORY inventory; /* inventory response              */
    tNFA_I93_SYS_INFO sys_info;   /* system information              */
  } params;
} tNFA_I93_CMD_CPLT;

/* Data for NFA_CE_REGISTERED_EVT */
typedef struct {
  tNFA_STATUS status; /* NFA_STATUS_OK if successful                      */
  tNFA_HANDLE handle; /* handle for NFA_CeRegisterFelicaSystemCodeOnDH () */
                      /*            NFA_CeRegisterT4tAidOnDH ()           */
} tNFA_CE_REGISTERED;

/* Data for NFA_CE_DEREGISTERED_EVT */
typedef struct {
  tNFA_HANDLE handle; /* handle from NFA_CE_REGISTERED_EVT   */
} tNFA_CE_DEREGISTERED;

/* Data for NFA_CE_ACTIVATED_EVT */
typedef struct {
  tNFA_STATUS status; /* NFA_STATUS_OK if successful              */
  tNFA_HANDLE handle; /* handle from NFA_CE_REGISTERED_EVT        */
  tNFC_ACTIVATE_DEVT activate_ntf; /* RF discovery activation details */
} tNFA_CE_ACTIVATED;

/* Data for NFA_CE_DEACTIVATED_EVT */
typedef struct {
  tNFA_HANDLE handle; /* handle from NFA_CE_REGISTERED_EVT   */
  /* NFA_DEACTIVATE_TYPE_IDLE or NFA_DEACTIVATE_TYPE_SLEEP */
  tNFA_DEACTIVATE_TYPE type;
} tNFA_CE_DEACTIVATED;

/* Structure for NFA_CE_DATA_EVT data */
typedef struct {
  tNFA_STATUS status; /* NFA_STATUS_OK if complete packet     */
  tNFA_HANDLE handle; /* handle from NFA_CE_REGISTERED_EVT    */
  uint8_t* p_data;    /* Data buffer                          */
  uint16_t len;       /* Length of data                       */
} tNFA_CE_DATA;

/* Union of all connection callback structures */
typedef union {
  tNFA_STATUS status;           /* NFA_POLL_ENABLED_EVT                 */
  tNFA_DISC_RESULT disc_result; /* NFA_DISC_RESULT_EVT                  */
  tNFA_ACTIVATED activated;     /* NFA_ACTIVATED_EVT                    */
  tNFA_DEACTIVATED deactivated; /* NFA_DEACTIVATED_EVT                  */
  tNFA_NDEF_DETECT ndef_detect; /* NFA_NDEF_DETECT_EVT                  */
  tNFA_TLV_DETECT tlv_detect;   /* NFA_TLV_DETECT_EVT                   */
  tNFA_RX_DATA data;            /* NFA_DATA_EVT                         */
  tNFA_CE_NDEF_WRITE_CPLT ndef_write_cplt; /* NFA_CE_NDEF_WRITE_CPLT_EVT */
  tNFA_I93_CMD_CPLT i93_cmd_cplt;   /* NFA_I93_CMD_CPLT_EVT                 */
  tNFA_CE_REGISTERED ce_registered; /* NFA_CE_REGISTERED_EVT                */
  tNFA_CE_DEREGISTERED ce_deregistered; /* NFA_CE_DEREGISTERED_EVT */
  tNFA_CE_ACTIVATED ce_activated;     /* NFA_CE_ACTIVATED_EVT                 */
  tNFA_CE_DEACTIVATED ce_deactivated; /* NFA_CE_DEACTIVATED_EVT               */
  tNFA_CE_DATA ce_data;               /* NFA_CE_DATA_EVT                      */

} tNFA_CONN_EVT_DATA;

/* NFA Connection Callback */
typedef void(tNFA_CONN_CBACK)(uint8_t event, tNFA_CONN_EVT_DATA* p_data);

#ifndef NFA_DM_NUM_INTERFACE_MAP
#define NFA_DM_NUM_INTERFACE_MAP 3
#endif

/* compile-time configuration structure for the RF Discovery Frequency for each
 * technology */
typedef struct {
  uint8_t pa;   /* Frequency for NFC Technology A               */
  uint8_t pb;   /* Frequency for NFC Technology B               */
  uint8_t pf;   /* Frequency for NFC Technology F               */
  uint8_t pi93; /* Frequency for Proprietary Technology/15693   */
  uint8_t pbp;  /* Frequency for Proprietary Technology/B-Prime */
  uint8_t pk;   /* Frequency for Proprietary Technology/Kovio   */
  uint8_t paa;  /* Frequency for NFC Technology A active mode   */
  uint8_t pfa;  /* Frequency for NFC Technology F active mode   */
  uint8_t pacm; /* Frequency for NFC Technology active mode     */
} tNFA_DM_DISC_FREQ_CFG;

/* definitions for tNFA_DM_CFG.presence_check_option */
/* if NDEF is not supported by the tag, use sleep/wake(last interface) */
#define NFA_DM_PCO_ISO_SLEEP_WAKE 0x01
/* NFA_SendRawFrame() has been used, use empty I block for presence check
 * if this bit is not set, use read-binary on channel 3 for presence check */
#define NFA_DM_PCO_EMPTY_I_BLOCK 0x02

/* compile-time configuration structure */
typedef struct {
  /* Automatic NDEF detection (when not in exclusive RF mode) */
  bool auto_detect_ndef;
  /* Automatic NDEF read (when not in exclusive RF mode)      */
  bool auto_read_ndef;
  /* Automatic presence check                                 */
  bool auto_presence_check;
  /* Use sleep/wake(last interface) for ISODEP presence check */
  uint8_t presence_check_option;
  /* Maximum time to wait for presence check response         */
  uint16_t presence_check_timeout;
  /* timeout for rf deactivate in rf listen active state      */
  uint16_t deact_ntf_listen_active_timeout;
} tNFA_DM_CFG;

/* compile-time configuration structure for HCI */
typedef struct {
  /* Maximum idle(no HCP Pkt) time to wait for EE DISC REQ Ntf(s) */
  uint16_t hci_netwk_enable_timeout;
  /* Maximum time to wait for EE DISC REQ NTF(s) after HOT PLUG EVT(s) */
  uint16_t hcp_response_timeout;
  /* Number of host in the allowlist of Terminal host */
  uint8_t num_allowlist_host;
  /* Allowlist of Terminal Host */
  uint8_t* p_allowlist;
} tNFA_HCI_CFG;

/*
** Exclusive RF mode listen configuration
*/

#define NFA_LB_MAX_NFCID0_LEN 4
#define NFA_LF_MAX_SC_NFCID2 1
#define NFA_LA_MAX_HIST_BYTES 15
#define NFA_LB_MAX_H_INFO_LEN 15

typedef struct {
  /*
  ** Discovery Configuration Parameters for Listen A
  */
  bool la_enable;             /* TRUE if listening A                      */
  uint8_t la_bit_frame_sdd;   /* Bit Frame SDD in Byte 1 of SENS_RES      */
  uint8_t la_platform_config; /* Platform Config in Byte 2 of SENS_RES    */
  uint8_t la_sel_info;        /* Byte of SEL_RES                          */
  uint8_t la_nfcid1_len;      /* NFCID1 (0, 4, 7 or 10 bytes)             */
  uint8_t la_nfcid1[NCI_NFCID1_MAX_LEN]; /*        if empty, NFCC will decide */

  /*
  ** Discovery Configuration Parameters for Listen B
  */
  bool lb_enable;        /* TRUE if listening B                      */
  uint8_t lb_sensb_info; /* Byte 2 of Protocol Info within SENSB_RES */
  uint8_t lb_nfcid0_len; /* NFCID0 (0, 1 or 4 bytes)                 */
  uint8_t
      lb_nfcid0[NFA_LB_MAX_NFCID0_LEN]; /*         if empty, NFCC will decide */
  uint8_t lb_app_data[NCI_PARAM_LEN_LB_APPDATA]; /* Bytes 6 - 9 in SENSB_RES */
  uint8_t lb_sfgi;   /* Start-Up Frame Guard Time                */
  uint8_t lb_adc_fo; /* Byte 12 in SENSB_RES                     */

  /*
  ** Discovery Configuration Parameters for Listen F
  */
  bool lf_enable;           /* TRUE if listening F          */
  uint8_t lf_con_bitr_f;    /* bit rate to listen           */
  uint8_t lf_protocol_type; /* Supported Protocols          */
  /* bit field indicating which lf_t3t_identifier are enabled */
  uint16_t lf_t3t_flags;
  uint8_t lf_t3t_identifier[NFA_LF_MAX_SC_NFCID2]
                           [NCI_SYSTEMCODE_LEN + NCI_NFCID2_LEN];
  /* System Code and NFCID2       */
  uint8_t lf_t3t_pmm[NCI_T3T_PMM_LEN]; /* Bytes 10 - 17 in SENSF_RES   */

  /*
  ** Discovery Configuration Parameters for Listen ISO-DEP
  */
  bool li_enable;            /* TRUE if listening ISO-DEP            */
  uint8_t li_fwi;            /* Frame Waiting Time Integer           */
  uint8_t la_hist_bytes_len; /* historical bytes for Listen-A        */
  uint8_t la_hist_bytes[NFA_LA_MAX_HIST_BYTES];
  uint8_t lb_h_info_resp_len; /* higher layer response for Listen-B   */
  uint8_t lb_h_info_resp[NFA_LB_MAX_H_INFO_LEN];

  /*
  ** Discovery Configuration Parameters for Listen NFC-DEP
  */
  bool ln_enable;                   /* TRUE if listening NFC-DEP            */
  uint8_t ln_wt;                    /* Waiting Time Integer                 */
  uint8_t ln_atr_res_gen_bytes_len; /* General bytes in ATR_RES             */
  uint8_t ln_atr_res_gen_bytes[NCI_MAX_GEN_BYTES_LEN];
  uint8_t ln_atr_res_config; /* Optional parameters (PPt) in ATR_RES */
} tNFA_LISTEN_CFG;

/* Data for NFA_UpdateRFCommParams () */
typedef tNFC_RF_COMM_PARAMS tNFA_RF_COMM_PARAMS;

/* RF Interface type */
#define NFA_INTERFACE_FRAME NFC_INTERFACE_FRAME
#define NFA_INTERFACE_ISO_DEP NFC_INTERFACE_ISO_DEP
#define NFA_INTERFACE_MIFARE NFC_INTERFACE_MIFARE
typedef tNFC_INTF_TYPE tNFA_INTF_TYPE;

/*******************************************************************************
** NDEF Definitions
*******************************************************************************/

/* Definitions for tNFA_TNF (NDEF type name format ID) */
/* Empty or no type specified                       */
#define NFA_TNF_EMPTY NDEF_TNF_EMPTY
/* NFC Forum well-known type [NFC RTD]              */
#define NFA_TNF_WKT NDEF_TNF_WKT
/* Media-type as defined in RFC 2046 [RFC 2046]     */
#define NFA_TNF_RFC2046_MEDIA NDEF_TNF_MEDIA
/* Absolute URI as defined in RFC 3986 [RFC 3986]   */
#define NFA_TNF_RFC3986_URI NDEF_TNF_URI
/* NFC Forum external type [NFC RTD]                */
#define NFA_TNF_EXTERNAL NDEF_TNF_EXT
/* Unknown                                          */
#define NFA_TNF_UNKNOWN NDEF_TNF_UNKNOWN
/* Unchanged                                        */
#define NFA_TNF_UNCHANGED NDEF_TNF_UNCHANGED
/* Reserved                                         */
#define NFA_TNF_RESERVED NDEF_TNF_RESERVED
/* Used to register default NDEF type handler       */
#define NFA_TNF_DEFAULT 0xFF
typedef uint8_t tNFA_TNF;

/* Definitions for tNFA_NDEF_URI_ID (Frequently used prefixes. For additional
 * values, see [NFC RTD URI] */
#define NFA_NDEF_URI_ID_ABSOLUTE 0x00 /* Unabridged URI.  */
#define NFA_NDEF_URI_ID_HTTP 0x03     /* http://          */
#define NFA_NDEF_URI_ID_HTTPS 0x04    /* https://         */
#define NFA_NDEF_URI_ID_TEL 0x05      /* tel:             */
#define NFA_NDEF_URI_ID_MAILTO 0x06   /* mailto:          */
#define NFA_NDEF_URI_ID_FTP 0x0D      /* ftp://           */
#define NFA_NDEF_URI_ID_FILE 0x1D     /* file://          */

typedef uint8_t tNFA_NDEF_URI_ID;

/* Events for tNFA_NDEF_CBACK */
/* NDEF record type registered. (In response to NFA_RegisterNDefTypeHandler) */
#define NFA_NDEF_REGISTER_EVT 0
/* Received an NDEF message with the registered type. See [tNFA_NDEF_DATA] */
#define NFA_NDEF_DATA_EVT 1
typedef uint8_t tNFA_NDEF_EVT;

/* Structure for NFA_NDEF_REGISTER_EVT event data */
typedef struct {
  tNFA_STATUS status;           /* Status of the registration               */
  tNFA_HANDLE ndef_type_handle; /* Handle for this NDEF type registration.  */
} tNFA_NDEF_REGISTER;

/* Structure for NFA_NDEF_DATA_EVT event data */
typedef struct {
  tNFA_HANDLE ndef_type_handle; /* Handle for NDEF type registration.   */
  uint8_t* p_data;              /* Data buffer                          */
  uint32_t len;                 /* Length of data                       */
} tNFA_NDEF_DATA;

/* Union of all NDEF callback structures */
typedef union {
  /* Structure for NFA_NDEF_REGISTER_EVT event data */
  tNFA_NDEF_REGISTER ndef_reg;
  /* Structure for NFA_NDEF_DATA_EVT event data */
  tNFA_NDEF_DATA ndef_data;
} tNFA_NDEF_EVT_DATA;

/* NFA_NDEF callback */
typedef void(tNFA_NDEF_CBACK)(tNFA_NDEF_EVT event, tNFA_NDEF_EVT_DATA* p_data);

/* NFA VSC Callback */
typedef void(tNFA_VSC_CBACK)(uint8_t event, uint16_t param_len,
                             uint8_t* p_param);
/* Modes used by setNfcControllerAlwaysOn */
#define ENABLE_MODE_DEFAULT 1
#define ENABLE_MODE_TRANSPARENT 2
#define ENABLE_MODE_EE 3

/*****************************************************************************
**  External Function Declarations
*****************************************************************************/
/*******************************************************************************
**
** Function         NFA_SetNfccMode
**
** Description      This function sets the control blocks nfcc mode
**
**                  mode ENABLE_MODE_DEFAULT or ENABLE_MODE_TRANSPARENT
**                  or ENABLE_MODE_EE
**
** Returns          none
**
*******************************************************************************/
extern void NFA_SetNfccMode(uint8_t mode);

/*******************************************************************************
**
** Function         NFA_Init
**
** Description      This function initializes control blocks for NFA
**
**                  p_hal_entry_tbl points to a table of HAL entry points
**
**                  NOTE: the buffer that p_hal_entry_tbl points must be
**                  persistent until NFA is disabled.
**
**
** Returns          none
**
*******************************************************************************/
extern void NFA_Init(tHAL_NFC_ENTRY* p_hal_entry_tbl);

/*******************************************************************************
**
** Function         NFA_Partial_Init
**
** Description      This function initializes control blocks for NFA based on
**                  mode
**
**                  p_hal_entry_tbl points to a table of HAL entry points
**                  mode ENABLE_MODE_DEFAULT or ENABLE_MODE_TRANSPARENT
**                  or ENABLE_MODE_EE
**
**                  NOTE: the buffer that p_hal_entry_tbl points must be
**                  persistent until NFA is disabled.
**
**
** Returns          none
**
*******************************************************************************/
extern void NFA_Partial_Init(tHAL_NFC_ENTRY* p_hal_entry_tbl, uint8_t mode);

/*******************************************************************************
**
** Function         NFA_Enable
**
** Description      This function enables NFC. Prior to calling NFA_Enable,
**                  the NFCC must be powered up, and ready to receive commands.
**                  This function enables the tasks needed by NFC, opens the NCI
**                  transport, resets the NFC controller, downloads patches to
**                  the NFCC (if necessary), and initializes the NFC subsystems.
**
**                  This function should only be called once - typically when
**                  NFC is enabled during boot-up, or when NFC is enabled from a
**                  settings UI. Subsequent calls to NFA_Enable while NFA is
**                  enabling or enabled will be ignored. When the NFC startup
**                  procedure is completed, an NFA_DM_ENABLE_EVT is returned to
**                  the application using the tNFA_DM_CBACK.
**
**                  The tNFA_CONN_CBACK parameter is used to register a callback
**                  for polling and card emulation events.
**
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_Enable(tNFA_DM_CBACK* p_dm_cback,
                              tNFA_CONN_CBACK* p_conn_cback);

/*******************************************************************************
**
** Function         NFA_Disable
**
** Description      This function is called to shutdown NFC. The tasks for NFC
**                  are terminated, and clean up routines are performed. This
**                  function is typically called during platform shut-down, or
**                  when NFC is disabled from a settings UI. When the NFC
**                  shutdown procedure is completed, an NFA_DM_DISABLE_EVT is
**                  returned to the application using the tNFA_DM_CBACK.
**
**                  The platform should wait until the NFC_DISABLE_REVT is
**                  received before powering down the NFC chip and NCI
**                  transport. This is required to so that NFA can gracefully
**                  shut down any open connections.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_Disable(bool graceful);

/*******************************************************************************
**
** Function         NFA_SetConfig
**
** Description      Set the configuration parameters to NFCC. The result is
**                  reported with an NFA_DM_SET_CONFIG_EVT in the tNFA_DM_CBACK
**                  callback.
**
** Note:            If RF discovery is started,
**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
**                  happen before calling this function. Most Configuration
**                  parameters are related to RF discovery.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_BUSY if previous setting is on-going
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_SetConfig(tNFA_PMID param_id, uint8_t length,
                                 uint8_t* p_data);

/*******************************************************************************
**
** Function         NFA_GetConfig
**
** Description      Get the configuration parameters from NFCC. The result is
**                  reported with an NFA_DM_GET_CONFIG_EVT in the tNFA_DM_CBACK
**                  callback.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_GetConfig(uint8_t num_ids, tNFA_PMID* p_param_ids);

/*******************************************************************************
**
** Function         NFA_RequestExclusiveRfControl
**
** Description      Request exclusive control of NFC.
**                  - Previous behavior (polling/tag reading, DH card emulation)
**                    will be suspended .
**                  - Polling and listening will be done based on the specified
**                    params
**
**                  The NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT event of
**                  tNFA_CONN_CBACK indicates the status of the operation.
**
**                  NFA_ACTIVATED_EVT and NFA_DEACTIVATED_EVT indicates link
**                  activation/deactivation.
**
**                  NFA_SendRawFrame is used to send data to the peer.
**                  NFA_DATA_EVT indicates data from the peer.
**
**                  If a tag is activated, then the NFA_RW APIs may be used to
**                  send commands to the tag. Incoming NDEF messages are sent to
**                  the NDEF callback.
**
**                  Once exclusive RF control has started, NFA will not activate
**                  LLCP internally. The application has exclusive control of
**                  the link.
**
** Note:            If RF discovery is started,
**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
**                  happen before calling this function
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_RequestExclusiveRfControl(tNFA_TECHNOLOGY_MASK poll_mask,
                                                 tNFA_LISTEN_CFG* p_listen_cfg,
                                                 tNFA_CONN_CBACK* p_conn_cback,
                                                 tNFA_NDEF_CBACK* p_ndef_cback);

/*******************************************************************************
**
** Function         NFA_ReleaseExclusiveRfControl
**
** Description      Release exclusive control of NFC. Once released, behavior
**                  prior to obtaining exclusive RF control will resume.
**
Note??
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_ReleaseExclusiveRfControl(void);

/*******************************************************************************
**
** Function         NFA_EnablePolling
**
** Description      Enable polling for technologies specified by poll_mask.
**
**                  The following events (notified using the connection
**                  callback registered with NFA_Enable) are generated during
**                  polling:
**
**                  - NFA_POLL_ENABLED_EVT indicates whether or not polling
**                    successfully enabled.
**                  - NFA_DISC_RESULT_EVT indicates there are more than one
**                    devices, so application must select one of tags by calling
**                    NFA_Select().
**                  - NFA_SELECT_RESULT_EVT indicates whether previous selection
**                    was successful or not. If it was failed then application
**                    must select again or deactivate by calling
**                    NFA_Deactivate().
**                  - NFA_ACTIVATED_EVT is generated when an NFC link is
**                    activated.
**                  - NFA_NDEF_DETECT_EVT is generated if tag is activated
**                  - NFA_DEACTIVATED_EVT will be returned after deactivating
**                    NFC link.
**
** Note:            If RF discovery is started,
**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
**                  happen before calling this function
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_EnablePolling(tNFA_TECHNOLOGY_MASK poll_mask);

/*******************************************************************************
**
** Function         NFA_DisablePolling
**
** Description      Disable polling
**                  NFA_POLL_DISABLED_EVT will be returned after stopping
**                  polling.
**
** Note:            If RF discovery is started,
**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
**                  happen before calling this function
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_DisablePolling(void);

/*******************************************************************************
**
** Function         NFA_EnableListening
**
** Description      Enable listening.
**                  NFA_LISTEN_ENABLED_EVT will be returned after listening is
**                  allowed.
**
**                  The actual listening technologies are specified by other NFA
**                  API functions. Such functions include (but not limited to)
**                  NFA_CeConfigureUiccListenTech.
**                  If NFA_DisableListening () is called to ignore the listening
**                  technologies, NFA_EnableListening () is called to restore
**                  the listening technologies set by these functions.
**
** Note:            If RF discovery is started,
**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
**                  happen before calling this function
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_EnableListening(void);

/*******************************************************************************
**
** Function         NFA_DisableListening
**
** Description      Disable listening
**                  NFA_LISTEN_DISABLED_EVT will be returned after stopping
**                  listening. This function is called to exclude listen at RF
**                  discovery.
**
** Note:            If RF discovery is started,
**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should
**                  happen before calling this function
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_DisableListening(void);

/*******************************************************************************
**
** Function         NFA_StartRfDiscovery
**
** Description      Start RF discovery
**                  RF discovery parameters shall be set by other APIs.
**
**                  An NFA_RF_DISCOVERY_STARTED_EVT indicates whether starting
**                  was successful or not.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_StartRfDiscovery(void);

/*******************************************************************************
**
** Function         NFA_StopRfDiscovery
**
** Description      Stop RF discovery
**
**                  An NFA_RF_DISCOVERY_STOPPED_EVT indicates whether stopping
**                  was successful or not.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_StopRfDiscovery(void);

/*******************************************************************************
**
** Function         NFA_SetRfDiscoveryDuration
**
** Description      Set the duration of the single discovery period in [ms].
**                  Allowable range: 0 ms to 0xFFFF ms.
**
** Note:            If discovery is already started, the application should
**                  call NFA_StopRfDiscovery prior to calling
**                  NFA_SetRfDiscoveryDuration, and then call
**                  NFA_StartRfDiscovery afterwards to restart discovery using
**                  the new duration.
**
** Returns:
**                  NFA_STATUS_OK, if command accepted
**                  NFA_STATUS_FAILED: otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_SetRfDiscoveryDuration(uint16_t discovery_period_ms);

/*******************************************************************************
**
** Function         NFA_Select
**
** Description      Select one from detected devices by NFA_DISC_RESULT_EVT
**                  after the last discovery result is received.
**                  An NFA_SELECT_RESULT_EVT indicates whether selection was
**                  successful or not. If failed then application must select
**                  again or deactivate by NFA_Deactivate ().
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_INVALID_PARAM if RF interface is not matched
**                  protocol
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_Select(uint8_t rf_disc_id, tNFA_NFC_PROTOCOL protocol,
                              tNFA_INTF_TYPE rf_interface);

/*******************************************************************************
**
** Function         NFA_UpdateRFCommParams
**
** Description      This function is called to update RF Communication
**                  parameters once the Frame RF Interface has been activated.
**
**                  An NFA_UPDATE_RF_PARAM_RESULT_EVT indicates whether updating
**                  was successful or not.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_UpdateRFCommParams(tNFA_RF_COMM_PARAMS* p_params);

/*******************************************************************************
**
** Function         NFA_Deactivate
**
** Description
**                  If sleep_mode=TRUE:
**                      Deselect the activated device by deactivating into sleep
**                      mode.
**
**                      An NFA_DEACTIVATE_FAIL_EVT indicates that selection was
**                      not successful. Application can select another
**                      discovered device or deactivate by NFA_Deactivate ()
**                      after receiving NFA_DEACTIVATED_EVT.
**
**                      Deactivating to sleep mode is not allowed when NFCC is
**                      in wait-for-host-select mode, or in listen-sleep states;
**                      NFA will deactivate to idle or discovery state for these
**                      cases respectively.
**
**
**                  If sleep_mode=FALSE:
**                      Deactivate the connection (e.g. as a result of presence
**                      check failure) NFA_DEACTIVATED_EVT will indicate that
**                      link is deactivated. Polling/listening will resume
**                      (unless the nfcc is in wait_for-all-discoveries state)
**
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_Deactivate(bool sleep_mode);

/*******************************************************************************
**
** Function         NFA_SendRawFrame
**
** Description      Send a raw frame over the activated interface with the NFCC.
**                  This function can only be called after NFC link is
**                  activated.
**
**                  If the activated interface is a tag and auto-presence check
**                  is enabled then presence_check_start_delay can be used to
**                  indicate the delay in msec after which the next auto
**                  presence check command can be sent.
**                  NFA_DM_DEFAULT_PRESENCE_CHECK_START_DELAY can be used as the
**                  default value for the delay.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_SendRawFrame(uint8_t* p_raw_data, uint16_t data_len,
                                    uint16_t presence_check_start_delay);

/*******************************************************************************
** NDEF APIs
*******************************************************************************/

/*******************************************************************************
**
** Function         NFA_RegisterNDefTypeHandler
**
** Description      This function allows the applications to register for
**                  specific types of NDEF records. When NDEF records are
**                  received, NFA will parse the record-type field, and pass
**                  the record to the registered tNFA_NDEF_CBACK.
**
**                  For records types which were not registered, the record will
**                  be sent to the default handler. A default type-handler may
**                  be registered by calling this NFA_RegisterNDefTypeHandler
**                  with tnf=NFA_TNF_DEFAULT. In this case, all un-registered
**                  record types will be sent to the callback. Only one default
**                  handler may be registered at a time.
**
**                  An NFA_NDEF_REGISTER_EVT will be sent to the tNFA_NDEF_CBACK
**                  to indicate that registration was successful, and provide a
**                  handle for this record type.
**
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_RegisterNDefTypeHandler(bool handle_whole_message,
                                               tNFA_TNF tnf,
                                               uint8_t* p_type_name,
                                               uint8_t type_name_len,
                                               tNFA_NDEF_CBACK* p_ndef_cback);

/*******************************************************************************
**
** Function         NFA_RegisterNDefUriHandler
**
** Description      This API is a special-case of NFA_RegisterNDefTypeHandler
**                  with TNF=NFA_TNF_WKT, and type_name='U' (URI record); and
**                  allows registering for specific URI types (e.g. 'tel:' or
**                  'mailto:').
**
**                  An NFA_NDEF_REGISTER_EVT will be sent to the tNFA_NDEF_CBACK
**                  to indicate that registration was successful, and provide a
**                  handle for this registration.
**
**                  If uri_id=NFA_NDEF_URI_ID_ABSOLUTE, then p_abs_uri contains
**                  the unabridged URI. For all other uri_id values, the
**                  p_abs_uri parameter is ignored (i.e the URI prefix is
**                  implied by uri_id).
**
**                  See [NFC RTD URI] for more information.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_RegisterNDefUriHandler(bool handle_whole_message,
                                              tNFA_NDEF_URI_ID uri_id,
                                              uint8_t* p_abs_uri,
                                              uint8_t uri_id_len,
                                              tNFA_NDEF_CBACK* p_ndef_cback);

/*******************************************************************************
**
** Function         NFA_DeregisterNDefTypeHandler
**
** Description      Deregister NDEF record type handler.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_DeregisterNDefTypeHandler(tNFA_HANDLE ndef_type_handle);

/*******************************************************************************
**
** Function         NFA_PowerOffSleepMode
**
** Description      This function is called to enter or leave NFCC Power Off
**                  Sleep mode
**                  NFA_DM_PWR_MODE_CHANGE_EVT will be sent to indicate status.
**
**                  start_stop : TRUE if entering Power Off Sleep mode
**                               FALSE if leaving Power Off Sleep mode
**
Note??
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_PowerOffSleepMode(bool start_stop);

/*******************************************************************************
**
** Function         NFA_RegVSCback
**
** Description      This function is called to register or de-register a
**                  callback function to receive Proprietary NCI response and
**                  notification events.
**                  The maximum number of callback functions allowed is
**                  NFC_NUM_VS_CBACKS
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFA_RegVSCback(bool is_register, tNFA_VSC_CBACK* p_cback);

/*******************************************************************************
**
** Function         NFA_SendVsCommand
**
** Description      This function is called to send an NCI Vendor Specific
**                  command to NFCC.
**
**                  oid             - The opcode of the VS command.
**                  cmd_params_len  - The command parameter len
**                  p_cmd_params    - The command parameter
**                  p_cback         - The callback function to receive the
**                                    command status
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
extern tNFA_STATUS NFA_SendVsCommand(uint8_t oid, uint8_t cmd_params_len,
                                     uint8_t* p_cmd_params,
                                     tNFA_VSC_CBACK* p_cback);

/*******************************************************************************
**
** Function         NFA_SendRawVsCommand
**
** Description      This function is called to send raw vendor specific
**                  command to NFCC.
**
**                  cmd_params_len  - The command parameter len
**                  p_cmd_params    - The command parameter
**                  p_cback         - The callback function to receive the
**                                    command
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/

extern tNFA_STATUS NFA_SendRawVsCommand(uint8_t cmd_params_len,
                                        uint8_t* p_cmd_params,
                                        tNFA_VSC_CBACK* p_cback);

/*******************************************************************************
** Function:        NFA_EnableDTA_TypeMode
**
** Description:     Initialize and get global DTA type mode from .conf
**
** Returns:         none:
**
*******************************************************************************/
extern void NFA_EnableDtamode(tNFA_eDtaModes eDtaMode);

/*******************************************************************************
**
** Function:        NFA_SetNfcSecure
**
** Description:     Set NFC secure flag
**
** Returns:         none:
**
*******************************************************************************/
extern void NFA_SetNfcSecure(bool status);

/*******************************************************************************
**
** Function:        NFA_DisableDtamode
**
** Description:     Disable DTA Mode
**
** Returns:         none:
**
*******************************************************************************/
extern void NFA_DisableDtamode(void);

/*******************************************************************************
** Function         NFA_GetNCIVersion
**
** Description      Called by higher layer to get the current nci
**                  version of nfc.
**
** Returns          NCI version NCI2.0 / NCI1.0
**
*******************************************************************************/
extern uint8_t NFA_GetNCIVersion();

/*******************************************************************************
** Function:        NFA_SetPowerSubStateForScreenState
**
** Description:     This function send the current screen state
**
** Returns:        NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
*******************************************************************************/
extern tNFA_STATUS NFA_SetPowerSubStateForScreenState(uint8_t ScreenState);

/*******************************************************************************
**
** Function         NFA_ChangeDiscoveryTech
**
** Description      Change RF discoverying technologies specified by
**                  pollTech and listenTech.
**
**                  NFA_DM_API_CHANGE_DISCOVERY_TECH_EVT will be returned.
**
**                  If pollTech/listenTech are set to 0xFF, it revert to
**                  the polling/listening technologies
**                  before NFA_ChangeDiscoveryTech() was called.
**
**                  is_revert_poll : TRUE if reverting RF polling tech
**                               before calling NFA_StopRfDiscovery
**                               FALSE if changing RF polling tech according
**                               to pollTech
**                  is_revert_listen : TRUE if reverting RF listening tech
**                               before calling NFA_StopRfDiscovery
**                               FALSE if changing RF listening tech according
**                               to listenTech
**                  change_default_tech : TRUE if the default technolofy mask
**                               has to be changed according to listenTech
**                               and pollTech settings
**
** Note:            If RF discovery is started,
**                  NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
**                  should happen before calling this function
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_ChangeDiscoveryTech(tNFA_TECHNOLOGY_MASK pollTech,
                                    tNFA_TECHNOLOGY_MASK listenTech,
                                    bool is_revert_poll, bool is_revert_listen,
                                    bool change_default_tech = false);

#endif /* NFA_API_H */
