/******************************************************************************
 *
 *  Copyright (C) 2009-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 file contains the Near Field Communication (NFC) API function
 *  external definitions.
 *
 ******************************************************************************/

#ifndef NFC_API_H
#define NFC_API_H

#include "gki.h"
#include "nci_defs.h"
#include "nfc_hal_api.h"
#include "nfc_target.h"

#include "vendor_cfg.h"

/* NFC application return status codes */
/* Command succeeded    */
#define NFC_STATUS_OK NCI_STATUS_OK
/* Command is rejected. */
#define NFC_STATUS_REJECTED NCI_STATUS_REJECTED
/* Message is corrupted */
#define NFC_STATUS_MSG_CORRUPTED NCI_STATUS_MESSAGE_CORRUPTED
/* buffer full          */
#define NFC_STATUS_BUFFER_FULL NCI_STATUS_BUFFER_FULL
/* failed               */
#define NFC_STATUS_FAILED NCI_STATUS_FAILED
/* not initialized      */
#define NFC_STATUS_NOT_INITIALIZED NCI_STATUS_NOT_INITIALIZED
/* Syntax error         */
#define NFC_STATUS_SYNTAX_ERROR NCI_STATUS_SYNTAX_ERROR
/* Semantic error       */
#define NFC_STATUS_SEMANTIC_ERROR NCI_STATUS_SEMANTIC_ERROR
/* Unknown NCI Group ID */
#define NFC_STATUS_UNKNOWN_GID NCI_STATUS_UNKNOWN_GID
/* Unknown NCI Opcode   */
#define NFC_STATUS_UNKNOWN_OID NCI_STATUS_UNKNOWN_OID
/* Invalid Parameter    */
#define NFC_STATUS_INVALID_PARAM NCI_STATUS_INVALID_PARAM
/* Message size too big */
#define NFC_STATUS_MSG_SIZE_TOO_BIG NCI_STATUS_MSG_SIZE_TOO_BIG
/* Already started      */
#define NFC_STATUS_ALREADY_STARTED NCI_STATUS_ALREADY_STARTED
/* Activation Failed    */
#define NFC_STATUS_ACTIVATION_FAILED NCI_STATUS_ACTIVATION_FAILED
/* Tear Down Error      */
#define NFC_STATUS_TEAR_DOWN NCI_STATUS_TEAR_DOWN
#define NFC_STATUS_RF_FRAME_CORRUPTED NCI_STATUS_RF_FRAME_CORRUPTED
/* RF transmission error*/
#define NFC_STATUS_RF_TRANSMISSION_ERR NCI_STATUS_RF_TRANSMISSION_ERR
/* RF protocol error    */
#define NFC_STATUS_RF_PROTOCOL_ERR NCI_STATUS_RF_PROTOCOL_ERR
/* RF Timeout           */
#define NFC_STATUS_TIMEOUT NCI_STATUS_TIMEOUT
/* EE Intf activate err */
#define NFC_STATUS_EE_INTF_ACTIVE_FAIL NCI_STATUS_EE_INTF_ACTIVE_FAIL
/* EE transmission error*/
#define NFC_STATUS_EE_TRANSMISSION_ERR NCI_STATUS_EE_TRANSMISSION_ERR
/* EE protocol error    */
#define NFC_STATUS_EE_PROTOCOL_ERR NCI_STATUS_EE_PROTOCOL_ERR
/* EE Timeout           */
#define NFC_STATUS_EE_TIMEOUT NCI_STATUS_EE_TIMEOUT

/* 0xE0 ~0xFF are proprietary status codes */
/* Command started successfully                     */
#define NFC_STATUS_CMD_STARTED 0xE3
/* NFCC Timeout in responding to an NCI command     */
#define NFC_STATUS_HW_TIMEOUT 0xE4
/* More (same) event to follow                      */
#define NFC_STATUS_CONTINUE 0xE5
/* API is called to perform illegal function        */
#define NFC_STATUS_REFUSED 0xE6
/* Wrong format of R-APDU, CC file or NDEF file     */
#define NFC_STATUS_BAD_RESP 0xE7
/* 7816 Status Word is not command complete(0x9000) */
#define NFC_STATUS_CMD_NOT_CMPLTD 0xE8
/* Out of GKI buffers                               */
#define NFC_STATUS_NO_BUFFERS 0xE9
/* Protocol mismatch between API and activated one  */
#define NFC_STATUS_WRONG_PROTOCOL 0xEA
/* Another Tag command is already in progress       */
#define NFC_STATUS_BUSY 0xEB

/* Link Loss                  */
#define NFC_STATUS_LINK_LOSS 0xFC
/* data len exceeds MIU       */
#define NFC_STATUS_BAD_LENGTH 0xFD
/* invalid handle             */
#define NFC_STATUS_BAD_HANDLE 0xFE
/* congested                  */
#define NFC_STATUS_CONGESTED 0xFF
typedef uint8_t tNFC_STATUS;

/**********************************************
 * NFC Config Parameter IDs defined by NCI
 **********************************************/
#define NFC_PMID_TOTAL_DURATION NCI_PARAM_ID_TOTAL_DURATION
#define NFC_PMID_PA_BAILOUT NCI_PARAM_ID_PA_BAILOUT
#define NFC_PMID_PF_RC NCI_PARAM_ID_PF_RC
#define NFC_PMID_PB_BAILOUT NCI_PARAM_ID_PB_BAILOUT
#define NFC_PMID_PF_BIT_RATE NCI_PARAM_ID_PF_BIT_RATE
#define NFC_PMID_PF_BAILOUT NCI_PARAM_ID_PF_BAILOUT
#define NFC_PMID_PF_DEVICES_LIMIT NCI_PARAM_ID_PF_DEVICES_LIMIT
#define NFC_PMID_LA_HIST_BY NCI_PARAM_ID_LA_HIST_BY
#define NFC_PMID_LA_NFCID1 NCI_PARAM_ID_LA_NFCID1
#define NFC_PMID_LA_BIT_FRAME_SDD NCI_PARAM_ID_LA_BIT_FRAME_SDD
#define NFC_PMID_LA_PLATFORM_CONFIG NCI_PARAM_ID_LA_PLATFORM_CONFIG
#define NFC_PMID_LA_SEL_INFO NCI_PARAM_ID_LA_SEL_INFO
#define NFC_PMID_LB_SENSB_INFO NCI_PARAM_ID_LB_SENSB_INFO
#define NFC_PMID_LB_H_INFO NCI_PARAM_ID_LB_H_INFO_RSP
#define NFC_PMID_LB_NFCID0 NCI_PARAM_ID_LB_NFCID0
#define NFC_PMID_LB_APPDATA NCI_PARAM_ID_LB_APPDATA
#define NFC_PMID_LB_SFGI NCI_PARAM_ID_LB_SFGI
#define NFC_PMID_LB_ADC_FO NCI_PARAM_ID_LB_ADC_FO
#define NFC_PMID_LF_T3T_ID1 NCI_PARAM_ID_LF_T3T_ID1
#define NFC_PMID_LF_PROTOCOL NCI_PARAM_ID_LF_PROTOCOL
#define NFC_PMID_LF_T3T_PMM NCI_PARAM_ID_LF_T3T_PMM
#define NFC_PMID_LF_T3T_FLAGS2 NCI_PARAM_ID_LF_T3T_FLAGS2
#define NFC_PMID_FWI NCI_PARAM_ID_FWI
#define NFC_PMID_LF_CON_BITR_F NCI_PARAM_ID_LF_CON_BITR_F
#define NFC_PMID_RF_FIELD_INFO NCI_PARAM_ID_RF_FIELD_INFO

/* Technology based routing  */
#define NFC_ROUTE_TAG_TECH NCI_ROUTE_TAG_TECH
/* Protocol based routing  */
#define NFC_ROUTE_TAG_PROTO NCI_ROUTE_TAG_PROTO
#define NFC_ROUTE_TAG_AID NCI_ROUTE_TAG_AID /* AID routing */
#define NFC_ROUTE_TAG_SYSCODE NCI_ROUTE_TAG_SYSCODE /* System Code routing*/
/* tag, len, 2 byte value for technology/protocol based routing */

/* For routing */
#define NFC_DH_ID NCI_DH_ID /* for DH */
/* To identify the loopback test */
/* use a proprietary range */
#define NFC_TEST_ID NCI_TEST_ID

#define NFC_TL_SIZE 2
#define NFC_SAVED_CMD_SIZE 2

typedef tNCI_DISCOVER_MAPS tNFC_DISCOVER_MAPS;
typedef tNCI_DISCOVER_PARAMS tNFC_DISCOVER_PARAMS;

/* all NFC Manager Callback functions have prototype like void (cback) (uint8_t
 * event, void *p_data)
 * tNFC_DATA_CBACK uses connection id as the first parameter; range 0x00-0x0F.
 * tNFC_DISCOVER_CBACK uses tNFC_DISCOVER_EVT; range  0x4000 ~
 * tNFC_RESPONSE_CBACK uses tNFC_RESPONSE_EVT; range  0x5000 ~
 */

#define NFC_FIRST_DEVT 0x4000
#define NFC_FIRST_REVT 0x5000
#define NFC_FIRST_CEVT 0x6000
#define NFC_FIRST_TEVT 0x8000

/* the events reported on tNFC_RESPONSE_CBACK */
enum {
  NFC_ENABLE_REVT = NFC_FIRST_REVT, /* 0  Enable event                  */
  NFC_DISABLE_REVT,                 /* 1  Disable event                 */
  NFC_SET_CONFIG_REVT,              /* 2  Set Config Response           */
  NFC_GET_CONFIG_REVT,              /* 3  Get Config Response           */
  NFC_NFCEE_DISCOVER_REVT,          /* 4  Discover NFCEE response       */
  NFC_NFCEE_INFO_REVT,              /* 5  Discover NFCEE Notification   */
  NFC_NFCEE_MODE_SET_REVT,          /* 6  NFCEE Mode Set response       */
  NFC_RF_FIELD_REVT,                /* 7  RF Field information          */
  NFC_EE_ACTION_REVT,               /* 8  EE Action notification        */
  NFC_EE_DISCOVER_REQ_REVT,         /* 9  EE Discover Req notification  */
  NFC_SET_ROUTING_REVT,             /* 10 Configure Routing response    */
  NFC_GET_ROUTING_REVT,             /* 11 Retrieve Routing response     */
  NFC_RF_COMM_PARAMS_UPDATE_REVT,   /* 12 RF Communication Param Update */
  NFC_GEN_ERROR_REVT,               /* 13 generic error notification    */
  NFC_NFCC_RESTART_REVT,            /* 14 NFCC has been re-initialized  */
  NFC_NFCC_TIMEOUT_REVT,            /* 15 NFCC is not responding        */
  NFC_NFCC_TRANSPORT_ERR_REVT,      /* 16 NCI Tranport error            */
  NFC_NFCC_POWER_OFF_REVT,          /* 17 NFCC turned off               */
  NFC_SET_POWER_SUB_STATE_REVT,     /* 18 Set power sub state response  */
  NFC_NFCEE_PL_CONTROL_REVT,        /* NFCEE Power/Link Ctrl response*/
  NFC_NFCEE_STATUS_REVT             /* NFCEE Status Notification     */
                                    /* First vendor-specific rsp event  */
};
typedef uint16_t tNFC_RESPONSE_EVT;

enum {
  NFC_CONN_CREATE_CEVT = NFC_FIRST_CEVT, /* 0  Conn Create Response          */
  NFC_CONN_CLOSE_CEVT,                   /* 1  Conn Close Response           */
  NFC_DEACTIVATE_CEVT,                   /* 2  Deactivate response/notificatn*/
  NFC_DATA_CEVT,                         /* 3  Data                          */
  NFC_ERROR_CEVT,                        /* 4  generic or interface error    */
  NFC_DATA_START_CEVT /* 5  received the first fragment on RF link */
};
typedef uint16_t tNFC_CONN_EVT;

#define NFC_NFCC_INFO_LEN 4
#ifndef NFC_NFCC_MAX_NUM_VS_INTERFACE
#define NFC_NFCC_MAX_NUM_VS_INTERFACE 5
#endif
typedef struct {
  tNFC_STATUS status;                   /* The event status.                */
  uint8_t nci_version;                  /* the NCI version of NFCC          */
  uint8_t max_conn;                     /* max number of connections by NFCC*/
  uint32_t nci_features;                /* the NCI features of NFCC         */
  uint16_t nci_interfaces;              /* the NCI interfaces of NFCC       */
  uint16_t max_ce_table;                /* the max routing table size       */
  uint16_t max_param_size;              /* Max Size for Large Parameters    */
  uint8_t manufacture_id;               /* the Manufacture ID for NFCC      */
  uint8_t nfcc_info[NFC_NFCC_INFO_LEN]; /* the Manufacture Info for NFCC      */
  uint8_t vs_interface
      [NFC_NFCC_MAX_NUM_VS_INTERFACE]; /* the NCI VS interfaces of NFCC    */
  uint8_t hci_packet_size;             /*HCI payload size*/
  uint8_t hci_conn_credits;            /*max number of HCI credits*/
  uint16_t max_nfc_v_size;             /* maximum frame size for NFC-V*/
} tNFC_ENABLE_REVT;

#define NFC_MAX_NUM_IDS 125
/* the data type associated with NFC_SET_CONFIG_REVT */
typedef struct {
  tNFC_STATUS status;                 /* The event status.                */
  uint8_t num_param_id;               /* Number of rejected NCI Param ID  */
  uint8_t param_ids[NFC_MAX_NUM_IDS]; /* NCI Param ID          */
} tNFC_SET_CONFIG_REVT;

/* the data type associated with NFC_GET_CONFIG_REVT */
typedef struct {
  tNFC_STATUS status;    /* The event status.    */
  uint16_t tlv_size;     /* The length of TLV    */
  uint8_t* p_param_tlvs; /* TLV                  */
} tNFC_GET_CONFIG_REVT;

/* the data type associated with NFC_NFCEE_DISCOVER_REVT */
typedef struct {
  tNFC_STATUS status; /* The event status.    */
  uint8_t num_nfcee;  /* The number of NFCEE  */
} tNFC_NFCEE_DISCOVER_REVT;

#define NFC_NFCEE_INTERFACE_APDU NCI_NFCEE_INTERFACE_APDU
#define NFC_NFCEE_INTERFACE_HCI_ACCESS NCI_NFCEE_INTERFACE_HCI_ACCESS
#define NFC_NFCEE_INTERFACE_T3T NCI_NFCEE_INTERFACE_T3T
#define NFC_NFCEE_INTERFACE_TRANSPARENT NCI_NFCEE_INTERFACE_TRANSPARENT
#define NFC_NFCEE_INTERFACE_PROPRIETARY NCI_NFCEE_INTERFACE_PROPRIETARY

#define NFC_NFCEE_TAG_HW_ID NCI_NFCEE_TAG_HW_ID
#define NFC_NFCEE_TAG_ATR_BYTES NCI_NFCEE_TAG_ATR_BYTES
#define NFC_NFCEE_TAG_T3T_INFO NCI_NFCEE_TAG_T3T_INFO
#define NFC_NFCEE_TAG_HCI_HOST_ID NCI_NFCEE_TAG_HCI_HOST_ID
typedef uint8_t tNFC_NFCEE_TAG;
/* additional NFCEE Info */
typedef struct {
  tNFC_NFCEE_TAG tag;
  uint8_t len;
  uint8_t info[NFC_MAX_EE_INFO];
} tNFC_NFCEE_TLV;

/* NFCEE unrecoverable error */
#define NFC_NFCEE_STATUS_UNRECOVERABLE_ERROR NCI_NFCEE_STS_UNRECOVERABLE_ERROR
/* NFCEE connected and inactive */
#define NFC_NFCEE_STATUS_INACTIVE NCI_NFCEE_STS_CONN_INACTIVE
/* NFCEE connected and active   */
#define NFC_NFCEE_STATUS_ACTIVE NCI_NFCEE_STS_CONN_ACTIVE
/* NFCEE removed                */
#define NFC_NFCEE_STATUS_REMOVED NCI_NFCEE_STS_REMOVED

/* the data type associated with NFC_NFCEE_INFO_REVT */
typedef struct {
  tNFC_STATUS status;    /* The event status - place holder  */
  uint8_t nfcee_id;      /* NFCEE ID                         */
  uint8_t ee_status;     /* The NFCEE status.                */
  uint8_t num_interface; /* number of NFCEE interfaces       */
  uint8_t ee_interface[NFC_MAX_EE_INTERFACE]; /* NFCEE interface       */
  uint8_t num_tlvs;                       /* number of TLVs                   */
  tNFC_NFCEE_TLV ee_tlv[NFC_MAX_EE_TLVS]; /* The TLVs associated with NFCEE   */
  bool nfcee_power_ctrl; /* 1, if NFCC has control of NFCEE Power Supply */
} tNFC_NFCEE_INFO_REVT;

#define NFC_MODE_ACTIVATE NCI_NFCEE_MD_ACTIVATE
#define NFC_MODE_DEACTIVATE NCI_NFCEE_MD_DEACTIVATE
typedef uint8_t tNFC_NFCEE_MODE;
/* the data type associated with NFC_NFCEE_MODE_SET_REVT */
typedef struct {
  tNFC_STATUS status;   /* The event status.*/
  uint8_t nfcee_id;     /* NFCEE ID         */
  tNFC_NFCEE_MODE mode; /* NFCEE mode       */
} tNFC_NFCEE_MODE_SET_REVT;

#if (APPL_DTA_MODE == TRUE)
/* This data type is for FW Version */
typedef struct {
  uint8_t rom_code_version; /* ROM code Version  */
  uint8_t major_version;    /* Major Version */
  uint8_t minor_version;    /* Minor Version  */
} tNFC_FW_VERSION;
#endif
#define NFC_MAX_AID_LEN NCI_MAX_AID_LEN /* 16 */

/* the data type associated with NFC_CE_GET_ROUTING_REVT */
typedef struct {
  tNFC_STATUS status; /* The event status                 */
  uint8_t nfcee_id;   /* NFCEE ID                         */
  uint8_t num_tlvs;   /* number of TLVs                   */
  uint8_t tlv_size;   /* the total len of all TLVs        */
  uint8_t qualifier_type;                  /* qualifier type */
  uint8_t param_tlvs[NFC_MAX_EE_TLV_SIZE]; /* the TLVs         */
} tNFC_GET_ROUTING_REVT;

/* the data type associated with NFC_CONN_CREATE_CEVT */
typedef struct {
  tNFC_STATUS status; /* The event status                 */
  uint8_t dest_type;  /* the destination type             */
  uint8_t id;         /* NFCEE ID  or RF Discovery ID     */
  uint8_t buff_size;  /* The max buffer size              */
  uint8_t num_buffs;  /* The number of buffers            */
} tNFC_CONN_CREATE_CEVT;

/* the data type associated with NFC_CONN_CLOSE_CEVT */
typedef struct {
  tNFC_STATUS status; /* The event status                 */
} tNFC_CONN_CLOSE_CEVT;

/* the data type associated with NFC_DATA_CEVT */
typedef struct {
  tNFC_STATUS status; /* The event status                 */
  NFC_HDR* p_data;    /* The received Data                */
} tNFC_DATA_CEVT;

/* the data type associated with NFC_NFCEE_PL_CONTROL_REVT */
typedef struct {
  tNFC_STATUS status;              /* The event status */
  uint8_t nfcee_id;                /* NFCEE ID */
  tNCI_NFCEE_PL_CONFIG pl_control; /* Power/Link Control command */
} tNFC_NFCEE_PL_CONTROL_REVT;

/* the data type associated with NFC_NFCEE_STATUS_REVT */
typedef struct {
  tNFC_STATUS status;              /* The event status */
  uint8_t nfcee_id;                /* NFCEE ID */
  tNCI_EE_NTF_STATUS nfcee_status; /* NFCEE status */
} tNFC_NFCEE_STATUS_REVT;
/* RF Field Status */
typedef uint8_t tNFC_RF_STS;

/* RF Field Technologies */
#define NFC_RF_TECHNOLOGY_A NCI_RF_TECHNOLOGY_A
#define NFC_RF_TECHNOLOGY_B NCI_RF_TECHNOLOGY_B
#define NFC_RF_TECHNOLOGY_F NCI_RF_TECHNOLOGY_F
typedef uint8_t tNFC_RF_TECH;

extern uint8_t NFC_GetNCIVersion();
extern bool NFC_IsRfRemovalDetectionSupported();

/* Supported Protocols */
#define NFC_PROTOCOL_UNKNOWN NCI_PROTOCOL_UNKNOWN /* Unknown */
/* Type1Tag    - NFC-A            */
#define NFC_PROTOCOL_T1T NCI_PROTOCOL_T1T
/* Type2Tag    - NFC-A            */
#define NFC_PROTOCOL_T2T NCI_PROTOCOL_T2T
/* Type3Tag    - NFC-F            */
#define NFC_PROTOCOL_T3T NCI_PROTOCOL_T3T
/* Type5Tag    - NFC-V/ISO15693*/
#define NFC_PROTOCOL_T5T NFC_PROTOCOL_T5T_(NFC_GetNCIVersion())
#define NFC_PROTOCOL_T5T_(x) \
  (((x) >= NCI_VERSION_2_0) ? NCI_PROTOCOL_T5T : NCI_PROTOCOL_15693)
#define NFC_PROTOCOL_CI NCI_PROTOCOL_CI
/* Type 4A,4B  - NFC-A or NFC-B   */
#define NFC_PROTOCOL_ISO_DEP NCI_PROTOCOL_ISO_DEP
/* NFCDEP/LLCP - NFC-A or NFC-F       */
#define NFC_PROTOCOL_NFC_DEP NCI_PROTOCOL_NFC_DEP
#define NFC_PROTOCOL_MIFARE NCI_PROTOCOL_MIFARE
#define NFC_PROTOCOL_ISO15693 NCI_PROTOCOL_15693
#define NFC_PROTOCOL_B_PRIME NCI_PROTOCOL_B_PRIME
#define NFC_PROTOCOL_KOVIO NCI_PROTOCOL_KOVIO
typedef uint8_t tNFC_PROTOCOL;

/* Discovery Types/Detected Technology and Mode */
#define NFC_DISCOVERY_TYPE_POLL_A NCI_DISCOVERY_TYPE_POLL_A
#define NFC_DISCOVERY_TYPE_POLL_B NCI_DISCOVERY_TYPE_POLL_B
#define NFC_DISCOVERY_TYPE_POLL_F NCI_DISCOVERY_TYPE_POLL_F
#define NFC_DISCOVERY_TYPE_POLL_V NCI_DISCOVERY_TYPE_POLL_V
#define NFC_DISCOVERY_TYPE_POLL_B_PRIME NCI_DISCOVERY_TYPE_POLL_B_PRIME
#define NFC_DISCOVERY_TYPE_POLL_KOVIO NCI_DISCOVERY_TYPE_POLL_KOVIO
#define NFC_DISCOVERY_TYPE_LISTEN_A NCI_DISCOVERY_TYPE_LISTEN_A
#define NFC_DISCOVERY_TYPE_LISTEN_B NCI_DISCOVERY_TYPE_LISTEN_B
#define NFC_DISCOVERY_TYPE_LISTEN_F NCI_DISCOVERY_TYPE_LISTEN_F
#define NFC_DISCOVERY_TYPE_LISTEN_ISO15693 NCI_DISCOVERY_TYPE_LISTEN_ISO15693
#define NFC_DISCOVERY_TYPE_LISTEN_B_PRIME NCI_DISCOVERY_TYPE_LISTEN_B_PRIME
typedef uint8_t tNFC_DISCOVERY_TYPE;
typedef uint8_t tNFC_RF_TECH_N_MODE;

/* Select Response codes */
#define NFC_SEL_RES_NFC_FORUM_T2T 0x00
#define NFC_SEL_RES_MF_CLASSIC 0x08

/* Bit Rates */
#define NFC_BIT_RATE_212 NCI_BIT_RATE_212   /* 212 kbit/s */
#define NFC_BIT_RATE_424 NCI_BIT_RATE_424   /* 424 kbit/s */
typedef uint8_t tNFC_BIT_RATE;

/**********************************************
 * Interface Types
 **********************************************/
#define NFC_INTERFACE_EE_DIRECT_RF NCI_INTERFACE_EE_DIRECT_RF
#define NFC_INTERFACE_FRAME NCI_INTERFACE_FRAME
#define NFC_INTERFACE_ISO_DEP NCI_INTERFACE_ISO_DEP
#define NFC_INTERFACE_MIFARE NCI_INTERFACE_VS_MIFARE
typedef tNCI_INTF_TYPE tNFC_INTF_TYPE;

typedef tNCI_INTF_EXT_TYPE tNFC_INTF_EXT_TYPE;

#define NFC_RF_INTF_EXT_START 0
#define NFC_RF_INTF_EXT_STOP 1
/**********************************************
 *  Deactivation Type
 **********************************************/
#define NFC_DEACTIVATE_TYPE_IDLE NCI_DEACTIVATE_TYPE_IDLE
#define NFC_DEACTIVATE_TYPE_SLEEP NCI_DEACTIVATE_TYPE_SLEEP
#define NFC_DEACTIVATE_TYPE_SLEEP_AF NCI_DEACTIVATE_TYPE_SLEEP_AF
#define NFC_DEACTIVATE_TYPE_DISCOVERY NCI_DEACTIVATE_TYPE_DISCOVERY
typedef uint8_t tNFC_DEACT_TYPE;

/**********************************************
 *  Deactivation Reasons
 **********************************************/
#define NFC_DEACTIVATE_REASON_DH_REQ_FAILED NCI_DEACTIVATE_REASON_DH_REQ_FAILED
#define NFC_DEACTIVATE_REASON_DH_REQ NCI_DEACTIVATE_REASON_DH_REQ
typedef uint8_t tNFC_DEACT_REASON;

/* the data type associated with NFC_RF_FIELD_REVT */
typedef struct {
  tNFC_STATUS status;   /* The event status - place holder. */
  tNFC_RF_STS rf_field; /* RF Field Status                  */
} tNFC_RF_FIELD_REVT;

#define NFC_MAX_APP_DATA_LEN 40
typedef struct {
  uint8_t len_aid;              /* length of application id */
  uint8_t aid[NFC_MAX_AID_LEN]; /* application id           */
} tNFC_AID;
typedef struct {
  uint8_t len_aid;                    /* length of application id */
  uint8_t aid[NFC_MAX_AID_LEN];       /* application id           */
  uint8_t len_data;                   /* len of application data  */
  uint8_t data[NFC_MAX_APP_DATA_LEN]; /* application data    */
} tNFC_APP_INIT;

/* ISO 7816-4 SELECT command */
#define NFC_EE_TRIG_SELECT NCI_EE_TRIG_7816_SELECT
/* RF Protocol changed       */
#define NFC_EE_TRIG_RF_PROTOCOL NCI_EE_TRIG_RF_PROTOCOL
/* RF Technology changed     */
#define NFC_EE_TRIG_RF_TECHNOLOGY NCI_EE_TRIG_RF_TECHNOLOGY
/* Application initiation    */
#define NFC_EE_TRIG_APP_INIT NCI_EE_TRIG_APP_INIT
typedef uint8_t tNFC_EE_TRIGGER;
typedef struct {
  tNFC_EE_TRIGGER trigger; /* the trigger of this event        */
  union {
    tNFC_PROTOCOL protocol;
    tNFC_RF_TECH technology;
    tNFC_AID aid;
    tNFC_APP_INIT app_init;
  } param; /* Discovery Type specific parameters */
} tNFC_ACTION_DATA;

/* the data type associated with NFC_EE_ACTION_REVT */
typedef struct {
  tNFC_STATUS status;        /* The event status - place holder  */
  uint8_t nfcee_id;          /* NFCEE ID                         */
  tNFC_ACTION_DATA act_data; /* data associated /w the action    */
} tNFC_EE_ACTION_REVT;

#define NFC_EE_DISC_OP_ADD 0
typedef uint8_t tNFC_EE_DISC_OP;
typedef struct {
  tNFC_EE_DISC_OP op;              /* add or remove this entry         */
  uint8_t nfcee_id;                /* NFCEE ID                         */
  tNFC_RF_TECH_N_MODE tech_n_mode; /* Discovery Technology and Mode    */
  tNFC_PROTOCOL protocol;          /* NFC protocol                     */
} tNFC_EE_DISCOVER_INFO;

#ifndef NFC_MAX_EE_DISC_ENTRIES
#define NFC_MAX_EE_DISC_ENTRIES 6
#endif
/* T, L, V(NFCEE ID, TechnMode, Protocol) */
#define NFC_EE_DISCOVER_ENTRY_LEN 5
#define NFC_EE_DISCOVER_INFO_LEN 3 /* NFCEE ID, TechnMode, Protocol */
/* the data type associated with NFC_EE_DISCOVER_REQ_REVT */
typedef struct {
  tNFC_STATUS status; /* The event status - place holder  */
  uint8_t num_info;   /* number of entries in info[]      */
  tNFC_EE_DISCOVER_INFO
      info[NFC_MAX_EE_DISC_ENTRIES]; /* discovery request from NFCEE */
} tNFC_EE_DISCOVER_REQ_REVT;

typedef union {
  tNFC_STATUS status; /* The event status. */
  tNFC_ENABLE_REVT enable;
  tNFC_SET_CONFIG_REVT set_config;
  tNFC_GET_CONFIG_REVT get_config;
  tNFC_NFCEE_DISCOVER_REVT nfcee_discover;
  tNFC_NFCEE_INFO_REVT nfcee_info;
  tNFC_NFCEE_MODE_SET_REVT mode_set;
  tNFC_NFCEE_PL_CONTROL_REVT pl_control;
  tNFC_NFCEE_STATUS_REVT nfcee_status;
  tNFC_RF_FIELD_REVT rf_field;
  tNFC_STATUS cfg_routing;
  tNFC_GET_ROUTING_REVT get_routing;
  tNFC_EE_ACTION_REVT ee_action;
  tNFC_EE_DISCOVER_REQ_REVT ee_discover_req;
  void* p_vs_evt_data;
} tNFC_RESPONSE;

/*************************************
**  RESPONSE Callback Functions
**************************************/
typedef void(tNFC_RESPONSE_CBACK)(tNFC_RESPONSE_EVT event,
                                  tNFC_RESPONSE* p_data);

/* The events reported on tNFC_VS_CBACK */
/* The event is (NCI_RSP_BIT|oid) for response and (NCI_NTF_BIT|oid) for
 * notification*/

typedef uint8_t tNFC_VS_EVT;

/*************************************
**  Proprietary (Vendor Specific) Callback Functions
**************************************/
typedef void(tNFC_VS_CBACK)(tNFC_VS_EVT event, uint16_t data_len,
                            uint8_t* p_data);

/* the events reported on tNFC_DISCOVER_CBACK */
enum {
  NFC_START_DEVT = NFC_FIRST_DEVT, /* Status of NFC_DiscoveryStart     */
  NFC_MAP_DEVT,                    /* Status of NFC_DiscoveryMap       */
  NFC_RESULT_DEVT,                 /* The responses from remote device */
  NFC_SELECT_DEVT,                 /* Status of NFC_DiscoverySelect    */
  NFC_ACTIVATE_DEVT,               /* RF interface is activated        */
  NFC_DEACTIVATE_DEVT,             /* Status of RF deactivation        */
  NFC_INTF_EXT_START_DEVT,         /* Status of NFC_StartRfIntfExtension */
  NFC_INTF_EXT_STOP_DEVT,          /* Status of NFC_StopRfIntfExtension  */
  NFC_DETECTION_START_DEVT,        /* Status of NFC_StartEPRemovalDetection */
  NFC_DETECTION_RESULT_DEVT,       /* Removal Detection ended            */
  NFC_WPT_START_DEVT,              /* Status of NFC_StartPowerTransfert*/
  NFC_WPT_RESULT_DEVT,             /* Wireless Power Transfert ended   */
};
typedef uint16_t tNFC_DISCOVER_EVT;

/* the data type associated with NFC_START_DEVT */
typedef tNFC_STATUS tNFC_START_DEVT;

typedef tNCI_RF_PA_PARAMS tNFC_RF_PA_PARAMS;
#define NFC_MAX_SENSB_RES_LEN NCI_MAX_SENSB_RES_LEN
#define NFC_NFCID0_MAX_LEN 4
typedef struct {
  uint8_t sensb_res_len; /* Length of SENSB_RES Response (Byte 2 - Byte 12 or
                            13) Available after Technology Detection */
  uint8_t sensb_res[NFC_MAX_SENSB_RES_LEN]; /* SENSB_RES Response (ATQ) */
  uint8_t nfcid0[NFC_NFCID0_MAX_LEN];
  uint8_t fwi;
} tNFC_RF_PB_PARAMS;

#define NFC_MAX_SENSF_RES_LEN NCI_MAX_SENSF_RES_LEN
#define NFC_NFCID2_LEN NCI_NFCID2_LEN
typedef struct {
  uint8_t bit_rate;      /* NFC_BIT_RATE_212 or NFC_BIT_RATE_424 */
  uint8_t sensf_res_len; /* Length of SENSF_RES Response (Byte 2 - Byte 17 or
                            19) Available after Technology Detection */
  uint8_t sensf_res[NFC_MAX_SENSF_RES_LEN]; /* SENSB_RES Response */
  uint8_t nfcid2[NFC_NFCID2_LEN]; /* NFCID2 generated by the Local NFCC for
                                     NFC-DEP Protocol.Available for Frame
                                     Interface  */
  uint8_t mrti_check;
  uint8_t mrti_update;
} tNFC_RF_PF_PARAMS;

typedef tNCI_RF_LF_PARAMS tNFC_RF_LF_PARAMS;

#define NFC_ISO15693_UID_LEN 8
typedef struct {
  uint8_t flag;
  uint8_t dsfid;
  uint8_t uid[NFC_ISO15693_UID_LEN];
} tNFC_RF_PISO15693_PARAMS;

#ifndef NFC_KOVIO_MAX_LEN
#define NFC_KOVIO_MAX_LEN 32
#endif
typedef struct {
  uint8_t uid_len;
  uint8_t uid[NFC_KOVIO_MAX_LEN];
} tNFC_RF_PKOVIO_PARAMS;

typedef tNCI_RF_ACM_P_PARAMS tNFC_RF_ACM_P_PARAMS;

typedef union {
  tNFC_RF_PA_PARAMS pa;
  tNFC_RF_PB_PARAMS pb;
  tNFC_RF_PF_PARAMS pf;
  tNFC_RF_LF_PARAMS lf;
  tNFC_RF_PISO15693_PARAMS pi93;
  tNFC_RF_PKOVIO_PARAMS pk;
  tNFC_RF_ACM_P_PARAMS acm_p;
} tNFC_RF_TECH_PARAMU;

typedef struct {
  tNFC_DISCOVERY_TYPE mode;
  tNFC_RF_TECH_PARAMU param;
} tNFC_RF_TECH_PARAMS;

/* the data type associated with NFC_RESULT_DEVT */
typedef struct {
  tNFC_STATUS status;                /* The event status - place holder.  */
  uint8_t rf_disc_id;                /* RF Discovery ID                   */
  uint8_t protocol;                  /* supported protocol                */
  tNFC_RF_TECH_PARAMS rf_tech_param; /* RF technology parameters          */
  uint8_t more;                      /* 0: last, 1: last (limit), 2: more */
} tNFC_RESULT_DEVT;

/* the data type associated with NFC_SELECT_DEVT */
typedef tNFC_STATUS tNFC_SELECT_DEVT;

typedef tNFC_STATUS tNFC_INTF_EXT_START_DEVT;
typedef tNFC_STATUS tNFC_INTF_EXT_STOP_DEVT;
/* the data type associated with NFC_STOP_DEVT */
typedef tNFC_STATUS tNFC_STOP_DEVT;

#define NFC_MAX_ATS_LEN NCI_MAX_ATS_LEN
#define NFC_MAX_HIS_BYTES_LEN NCI_MAX_HIS_BYTES_LEN
#define NFC_MAX_GEN_BYTES_LEN NCI_MAX_GEN_BYTES_LEN

typedef struct {
  uint8_t ats_res_len;              /* Length of ATS RES                */
  uint8_t ats_res[NFC_MAX_ATS_LEN]; /* ATS RES                          */
  bool nad_used;                    /* NAD is used or not               */
  uint8_t fwi;                      /* Frame Waiting time Integer       */
  uint8_t sfgi;                     /* Start-up Frame Guard time Integer*/
  uint8_t his_byte_len;             /* len of historical bytes          */
  uint8_t his_byte[NFC_MAX_HIS_BYTES_LEN]; /* historical bytes             */
} tNFC_INTF_PA_ISO_DEP;

typedef struct { uint8_t rats; /* RATS */ } tNFC_INTF_LA_ISO_DEP;

#define NFC_MAX_ATTRIB_LEN NCI_MAX_ATTRIB_LEN

typedef struct {
  uint8_t attrib_res_len;                 /* Length of ATTRIB RES      */
  uint8_t attrib_res[NFC_MAX_ATTRIB_LEN]; /* ATTRIB RES                */
  uint8_t hi_info_len;                    /* len of Higher layer Info  */
  uint8_t hi_info[NFC_MAX_GEN_BYTES_LEN]; /* Higher layer Info         */
  uint8_t mbli;                           /* Maximum buffer length.    */
} tNFC_INTF_PB_ISO_DEP;

typedef struct {
  uint8_t attrib_req_len;                 /* Length of ATTRIB REQ      */
  uint8_t attrib_req[NFC_MAX_ATTRIB_LEN]; /* ATTRIB REQ (Byte 2 - 10+k)*/
  uint8_t hi_info_len;                    /* len of Higher layer Info  */
  uint8_t hi_info[NFC_MAX_GEN_BYTES_LEN]; /* Higher layer Info         */
  uint8_t nfcid0[NFC_NFCID0_MAX_LEN];     /* NFCID0                    */
} tNFC_INTF_LB_ISO_DEP;

#ifndef NFC_MAX_RAW_PARAMS
#define NFC_MAX_RAW_PARAMS 16
#endif
#define NFC_MAX_RAW_PARAMS 16
typedef struct {
  uint8_t param_len;
  uint8_t param[NFC_MAX_RAW_PARAMS];
} tNFC_INTF_FRAME;

typedef struct {
  tNFC_INTF_TYPE type; /* Interface Type  1 Byte  See Table 67 */
  union {
    tNFC_INTF_LA_ISO_DEP la_iso;
    tNFC_INTF_PA_ISO_DEP pa_iso;
    tNFC_INTF_LB_ISO_DEP lb_iso;
    tNFC_INTF_PB_ISO_DEP pb_iso;
    tNFC_INTF_FRAME frame;
  } intf_param; /* Activation Parameters   0 - n Bytes */
} tNFC_INTF_PARAMS;

/* the data type associated with NFC_ACTIVATE_DEVT */
typedef struct {
  uint8_t rf_disc_id;                /* RF Discovery ID          */
  tNFC_PROTOCOL protocol;            /* supported protocol       */
  tNFC_RF_TECH_PARAMS rf_tech_param; /* RF technology parameters */
  tNFC_DISCOVERY_TYPE data_mode;     /* for future Data Exchange */
  tNFC_BIT_RATE tx_bitrate;          /* Data Exchange Tx Bitrate */
  tNFC_BIT_RATE rx_bitrate;          /* Data Exchange Rx Bitrate */
  tNFC_INTF_PARAMS intf_param;       /* interface type and params*/
} tNFC_ACTIVATE_DEVT;

/* the data type associated with NFC_DEACTIVATE_DEVT and NFC_DEACTIVATE_CEVT */
typedef struct {
  tNFC_STATUS status;   /* The event status.        */
  tNFC_DEACT_TYPE type; /* De-activate type         */
  bool is_ntf;          /* TRUE, if deactivate notif*/
  tNFC_DEACT_REASON reason; /* De-activate reason    */
} tNFC_DEACTIVATE_DEVT;

typedef union {
  tNFC_STATUS status; /* The event status.        */
  tNFC_START_DEVT start;
  tNFC_RESULT_DEVT result;
  tNFC_SELECT_DEVT select;
  tNFC_STOP_DEVT stop;
  tNFC_ACTIVATE_DEVT activate;
  tNFC_DEACTIVATE_DEVT deactivate;
  uint8_t wpt_result;
} tNFC_DISCOVER;

typedef struct {
  bool include_rf_tech_mode; /* TRUE if including RF Tech and Mode update    */
  tNFC_RF_TECH_N_MODE rf_tech_n_mode; /* RF tech and mode */
  bool include_tx_bit_rate;  /* TRUE if including Tx bit rate update         */
  tNFC_BIT_RATE tx_bit_rate; /* Transmit Bit Rate                            */
  bool include_rx_bit_rate;  /* TRUE if including Rx bit rate update         */
  tNFC_BIT_RATE rx_bit_rate; /* Receive Bit Rate                             */
  bool include_nfc_b_config; /* TRUE if including NFC-B data exchange config */
  uint8_t min_tr0;           /* Minimun TR0                                  */
  uint8_t min_tr1;           /* Minimun TR1                                  */
  uint8_t suppression_eos;   /* Suppression of EoS                           */
  uint8_t suppression_sos;   /* Suppression of SoS                           */
  uint8_t min_tr2;           /* Minimun TR1                                  */
} tNFC_RF_COMM_PARAMS;

/*************************************
**  DISCOVER Callback Functions
**************************************/
typedef void(tNFC_DISCOVER_CBACK)(tNFC_DISCOVER_EVT event,
                                  tNFC_DISCOVER* p_data);

typedef uint16_t tNFC_TEST_EVT;

/* the data type associated with NFC_LOOPBACK_TEVT */
typedef struct {
  tNFC_STATUS status; /* The event status.            */
  NFC_HDR* p_data;    /* The loop back data from NFCC */
} tNFC_LOOPBACK_TEVT;

/* the data type associated with NFC_RF_CONTROL_TEVT */
typedef tNFC_STATUS tNFC_RF_CONTROL_TEVT;

typedef union {
  tNFC_STATUS status; /* The event status.            */
  tNFC_LOOPBACK_TEVT loop_back;
  tNFC_RF_CONTROL_TEVT rf_control;
} tNFC_TEST;

/*************************************
**  TEST Callback Functions
**************************************/
typedef void(tNFC_TEST_CBACK)(tNFC_TEST_EVT event, tNFC_TEST* p_data);

typedef tNFC_DEACTIVATE_DEVT tNFC_DEACTIVATE_CEVT;
typedef union {
  tNFC_STATUS status; /* The event status. */
  tNFC_CONN_CREATE_CEVT conn_create;
  tNFC_CONN_CLOSE_CEVT conn_close;
  tNFC_DEACTIVATE_CEVT deactivate;
  tNFC_DATA_CEVT data;
} tNFC_CONN;

/*************************************
**  Data Callback Functions
**************************************/
typedef void(tNFC_CONN_CBACK)(uint8_t conn_id, tNFC_CONN_EVT event,
                              tNFC_CONN* p_data);
#define NFC_MAX_CONN_ID 15
#define NFC_ILLEGAL_CONN_ID 0xFF
/* the static connection ID for RF traffic */
#define NFC_RF_CONN_ID 0
/* the static connection ID for HCI transport */
#define NFC_HCI_CONN_ID 1
#define NFC_T4TNFCEE_CONN_ID 0x05

/*****************************************************************************
**  EXTERNAL FUNCTION DECLARATIONS
*****************************************************************************/

/*******************************************************************************
**
** Function         NFC_Enable
**
** Description      This function enables NFC. Prior to calling NFC_Enable:
**                  - the NFCC must be powered up, and ready to receive
**                    commands.
**                  - GKI must be enabled
**                  - NFC_TASK must be started
**                  - NCIT_TASK must be started (if using dedicated NCI
**                    transport)
**
**                  This function opens the NCI transport (if applicable),
**                  resets the NFC controller, and initializes the NFC
**                  subsystems.
**
**                  When the NFC startup procedure is completed, an
**                  NFC_ENABLE_REVT is returned to the application using the
**                  tNFC_RESPONSE_CBACK.
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_Enable(tNFC_RESPONSE_CBACK* p_cback);

/*******************************************************************************
**
** Function         NFC_Disable
**
** Description      This function performs clean up routines for shutting down
**                  NFC and closes the NCI transport (if using dedicated NCI
**                  transport).
**
**                  When the NFC shutdown procedure is completed, an
**                  NFC_DISABLED_REVT is returned to the application using the
**                  tNFC_RESPONSE_CBACK.
**
** Returns          nothing
**
*******************************************************************************/
extern void NFC_Disable(void);

/*******************************************************************************
**
** Function         NFC_Init
**
** Description      This function initializes control blocks for NFC
**
** Returns          nothing
**
*******************************************************************************/
extern void NFC_Init(tHAL_NFC_ENTRY* p_hal_entry_tbl);

/*******************************************************************************
**
** Function         NFC_GetLmrtSize
**
** Description      Called by application wto query the Listen Mode Routing
**                  Table size supported by NFCC
**
** Returns          Listen Mode Routing Table size
**
*******************************************************************************/
extern uint16_t NFC_GetLmrtSize(void);

/*******************************************************************************
**
** Function         NFC_SetConfig
**
** Description      This function is called to send the configuration parameter
**                  TLV to NFCC. The response from NFCC is reported by
**                  tNFC_RESPONSE_CBACK as NFC_SET_CONFIG_REVT.
**
** Parameters       tlv_size - the length of p_param_tlvs.
**                  p_param_tlvs - the parameter ID/Len/Value list
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_SetConfig(uint8_t tlv_size, uint8_t* p_param_tlvs);

/*******************************************************************************
**
** Function         NFC_GetConfig
**
** Description      This function is called to retrieve the parameter TLV from
**                  NFCC. The response from NFCC is reported by
**                  tNFC_RESPONSE_CBACK as NFC_GET_CONFIG_REVT.
**
** Parameters       num_ids - the number of parameter IDs
**                  p_param_ids - the parameter ID list.
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_GetConfig(uint8_t num_ids, uint8_t* p_param_ids);

/*******************************************************************************
**
** Function         NFC_NfceeDiscover
**
** Description      This function is called to enable or disable NFCEE
**                  Discovery. The response from NFCC is reported by
**                  tNFC_RESPONSE_CBACK as NFC_NFCEE_DISCOVER_REVT.
**                  The notification from NFCC is reported by
**                  tNFC_RESPONSE_CBACK as NFC_NFCEE_INFO_REVT.
**
** Parameters       discover - 1 to enable discover, 0 to disable.
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_NfceeDiscover(bool discover);

/*******************************************************************************
**
** Function         NFC_NfceeModeSet
**
** Description      This function is called to activate or de-activate an NFCEE
**                  connected to the NFCC.
**                  The response from NFCC is reported by tNFC_RESPONSE_CBACK
**                  as NFC_NFCEE_MODE_SET_REVT.
**
** Parameters       nfcee_id - the NFCEE to activate or de-activate.
**                  mode - 0 to activate NFCEE, 1 to de-activate.
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_NfceeModeSet(uint8_t nfcee_id, tNFC_NFCEE_MODE mode);
/*******************************************************************************
**
** Function         NFC_DiscoveryMap
**
** Description      This function is called to set the discovery interface
**                  mapping. The response from NFCC is reported by
**                  tNFC_DISCOVER_CBACK as. NFC_MAP_DEVT.
**
** Parameters       num - the number of items in p_params.
**                  p_maps - the discovery interface mappings
**                  p_cback - the discovery callback function
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_DiscoveryMap(uint8_t num, tNFC_DISCOVER_MAPS* p_maps,
                                    tNFC_DISCOVER_CBACK* p_cback);

/*******************************************************************************
**
** Function         NFC_DiscoveryStart
**
** Description      This function is called to start Polling and/or Listening.
**                  The response from NFCC is reported by tNFC_DISCOVER_CBACK
**                  as NFC_START_DEVT. The notification from NFCC is reported by
**                  tNFC_DISCOVER_CBACK as NFC_RESULT_DEVT.
**
** Parameters       num_params - the number of items in p_params.
**                  p_params - the discovery parameters
**                  p_cback - the discovery callback function
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_DiscoveryStart(uint8_t num_params,
                                      tNFC_DISCOVER_PARAMS* p_params,
                                      tNFC_DISCOVER_CBACK* p_cback);

/*******************************************************************************
**
** Function         NFC_DiscoverySelect
**
** Description      If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT,
**                  the application needs to use this function to select the
**                  the logical endpoint to continue. The response from NFCC is
**                  reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT.
**
** Parameters       rf_disc_id - The ID identifies the remote device.
**                  protocol - the logical endpoint on the remote device
**                  rf_interface - the RF interface to communicate with NFCC
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_DiscoverySelect(uint8_t rf_disc_id, uint8_t protocol,
                                       uint8_t rf_interface);

/*******************************************************************************
**
** Function         NFC_StartRfIntfExtension
**
** Description      If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT,
**                  the application needs to use this function to select the
**                  the logical endpoint to continue. The response from NFCC is
**                  reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT.
**
** Parameters       rf_disc_id - The ID identifies the remote device.
**                  protocol - the logical endpoint on the remote device
**                  rf_interface - the RF interface to communicate with NFCC
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_StartRfIntfExtension(uint8_t rf_ext_id, uint8_t* p_data,
                                            uint8_t len);

/*******************************************************************************
**
** Function         NFC_StartEPRemovalDetection
**
** Description      If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT,
**                  the application needs to use this function to select the
**                  the logical endpoint to continue. The response from NFCC is
**                  reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT.
**
** Parameters       rf_disc_id - The ID identifies the remote device.
**                  protocol - the logical endpoint on the remote device
**                  rf_interface - the RF interface to communicate with NFCC
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_StartEPRemovalDetection(uint8_t waiting_time);

/*******************************************************************************
**
** Function         NFC_StopRfIntfExtension
**
** Description      If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT,
**                  the application needs to use this function to select the
**                  the logical endpoint to continue. The response from NFCC is
**                  reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT.
**
** Parameters       rf_disc_id - The ID identifies the remote device.
**                  protocol - the logical endpoint on the remote device
**                  rf_interface - the RF interface to communicate with NFCC
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_StopRfIntfExtension(uint8_t rf_ext_id, uint8_t* p_data,
                                           uint8_t len);

/*******************************************************************************
**
** Function         NFC_StartPowerTransfert
**
** Description      If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT,
**                  the application needs to use this function to select the
**                  the logical endpoint to continue. The response from NFCC is
**                  reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT.
**
** Parameters       rf_disc_id - The ID identifies the remote device.
**                  protocol - the logical endpoint on the remote device
**                  rf_interface - the RF interface to communicate with NFCC
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_StartPowerTransfert(uint8_t* p_param, uint8_t param_len);

/*******************************************************************************
**
** Function         NFC_ConnCreate
**
** Description      This function is called to create a logical connection with
**                  NFCC for data exchange.
**                  The response from NFCC is reported in tNFC_CONN_CBACK
**                  as NFC_CONN_CREATE_CEVT.
**
** Parameters       dest_type - the destination type
**                  id   - the NFCEE ID or RF Discovery ID .
**                  protocol - the protocol
**                  p_cback - the data callback function to receive data from
**                  NFCC
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_ConnCreate(uint8_t dest_type, uint8_t id,
                                  uint8_t protocol, tNFC_CONN_CBACK* p_cback);

/*******************************************************************************
**
** Function         NFC_ConnClose
**
** Description      This function is called to close a logical connection with
**                  NFCC.
**                  The response from NFCC is reported in tNFC_CONN_CBACK
**                  as NFC_CONN_CLOSE_CEVT.
**
** Parameters       conn_id - the connection id.
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_ConnClose(uint8_t conn_id);

/*******************************************************************************
**
** Function         NFC_SetStaticRfCback
**
** Description      This function is called to update the data callback function
**                  to receive the data for the given connection id.
**
** Parameters       p_cback - the connection callback function
**
** Returns          Nothing
**
*******************************************************************************/
extern void NFC_SetStaticRfCback(tNFC_CONN_CBACK* p_cback);

/*******************************************************************************
**
** Function         NFC_SetStaticT4tNfceeCback
**
** Description      This function is called to update the data callback function
**                  to receive the data for the given connection id.
**
** Parameters       p_cback - the connection callback function
**                  connId - connection ID for T4T NFCEE
**
** Returns          Nothing
**
*******************************************************************************/
void NFC_SetStaticT4tNfceeCback(tNFC_CONN_CBACK* p_cback, uint8_t connId);

/*******************************************************************************
**
** Function         NFC_SetReassemblyFlag
**
** Description      This function is called to set if nfc will reassemble
**                  nci packet as much as its buffer can hold or it should not
**                  reassemble but forward the fragmented nci packet to layer
**                  above. If nci data pkt is fragmented, nfc may send multiple
**                  NFC_DATA_CEVT with status NFC_STATUS_CONTINUE before sending
**                  NFC_DATA_CEVT with status NFC_STATUS_OK based on reassembly
**                  configuration and reassembly buffer size
**
** Parameters       reassembly - flag to indicate if nfc may reassemble or not
**
** Returns          Nothing
**
*******************************************************************************/
extern void NFC_SetReassemblyFlag(bool reassembly);

/*******************************************************************************
**
** Function         NFC_SendData
**
** Description      This function is called to send the given data packet
**                  to the connection identified by the given connection id.
**
** Parameters       conn_id - the connection id.
**                  p_data - the data packet
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_SendData(uint8_t conn_id, NFC_HDR* p_data);

/*******************************************************************************
**
** Function         NFC_FlushData
**
** Description      This function is called to discard the tx data queue of
**                  the given connection id.
**
** Parameters       conn_id - the connection id.
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_FlushData(uint8_t conn_id);

/*******************************************************************************
**
** Function         NFC_Deactivate
**
** Description      This function is called to stop the discovery process or
**                  put the listen device in sleep mode or terminate the NFC
**                  link.
**
**                  The response from NFCC is reported by tNFC_DISCOVER_CBACK
**                  as NFC_DEACTIVATE_DEVT.
**
** Parameters       deactivate_type - NFC_DEACTIVATE_TYPE_IDLE, to IDLE mode.
**                                    NFC_DEACTIVATE_TYPE_SLEEP to SLEEP mode.
**                                    NFC_DEACTIVATE_TYPE_SLEEP_AF to SLEEP_AF
**                                    mode.
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_Deactivate(tNFC_DEACT_TYPE deactivate_type);

/*******************************************************************************
**
** Function         NFC_UpdateRFCommParams
**
** Description      This function is called to update RF Communication
**                  parameters once the Frame RF Interface has been activated.
**
**                  The response from NFCC is reported by tNFC_RESPONSE_CBACK
**                  as NFC_RF_COMM_PARAMS_UPDATE_REVT.
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_UpdateRFCommParams(tNFC_RF_COMM_PARAMS* p_params);

/*******************************************************************************
**
** Function         NFC_SetPowerOffSleep
**
** Description      This function closes/opens transport and turns off/on NFCC.
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_SetPowerOffSleep(bool enable);

/*******************************************************************************
**
** Function         NFC_SetPowerSubState
**
** Description      This function is called to send the power sub state(screen
**                  state) to NFCC. The response from NFCC is reported by
**                  tNFC_RESPONSE_CBACK as NFC_SET_POWER_STATE_REVT.
**
** Parameters       scree_state
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_SetPowerSubState(uint8_t screen_state);

/*******************************************************************************
**
** Function         NFC_PowerCycleNFCC
**
** Description      This function turns off and then on NFCC.
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_PowerCycleNFCC(void);

/*******************************************************************************
**
** Function         NFC_SetRouting
**
** Description      This function is called to configure the CE routing table.
**                  The response from NFCC is reported by tNFC_RESPONSE_CBACK
**                  as NFC_SET_ROUTING_REVT.
**
** Parameters
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_SetRouting(bool more, uint8_t num_tlv, uint8_t tlv_size,
                                  uint8_t* p_param_tlvs);

/*******************************************************************************
**
** Function         NFC_GetRouting
**
** Description      This function is called to retrieve the CE routing table
**                  from NFCC. The response from NFCC is reported by
**                  tNFC_RESPONSE_CBACK as NFC_GET_ROUTING_REVT.
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_GetRouting(void);

/*******************************************************************************
**
** Function         NFC_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 NFC_RegVSCback(bool is_register, tNFC_VS_CBACK* p_cback);

/*******************************************************************************
**
** Function         NFC_SendVsCommand
**
** Description      This function is called to send the given vendor specific
**                  command to NFCC. The response from NFCC is reported to the
**                  given tNFC_VS_CBACK as (oid).
**
** Parameters       oid - The opcode of the VS command.
**                  p_data - The parameters for the VS command
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_SendVsCommand(uint8_t oid, NFC_HDR* p_data,
                                     tNFC_VS_CBACK* p_cback);

/*******************************************************************************
**
** Function         NFC_SendRawVsCommand
**
** Description      This function is called to send the given raw command to
**                  NFCC. The response from NFCC is reported to the given
**                  tNFC_VS_CBACK.
**
** Parameters       p_data - The command buffer
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_SendRawVsCommand(NFC_HDR* p_data,
                                        tNFC_VS_CBACK* p_cback);

/*******************************************************************************
**
** Function         NFC_TestLoopback
**
** Description      This function is called to send the given data packet
**                  to NFCC for loopback test.
**                  When loopback data is received from NFCC, tNFC_TEST_CBACK .
**                  reports a NFC_LOOPBACK_TEVT.
**
** Parameters       p_data - the data packet
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_TestLoopback(NFC_HDR* p_data);

/*******************************************************************************
**
** Function         NFC_ISODEPNakPresCheck
**
** Description      This function is called to send the ISO DEP nak presence
**                  check cmd to check that the remote end point in RF field.
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_ISODEPNakPresCheck();

#if (APPL_DTA_MODE == TRUE)
/*******************************************************************************
**
** Function         nfc_ncif_getFWVersion
**
** Description      This function sets the trace level for NFC.  If called with
**                  a value of 0xFF, it simply returns the current trace level.
**
** Returns          The new or current trace level
**
*******************************************************************************/
extern tNFC_FW_VERSION nfc_ncif_getFWVersion();
#endif

/*******************************************************************************
**
** Function         NFC_NfceePLConfig
**
** Description      This function is called to set the Power and Link Control
**                  to an NFCEE connected to the NFCC.
**                  The response from NFCC is reported by tNFC_RESPONSE_CBACK
**                  as NFC_NFCEE_PL_CONTROL_REVT.
**
** Parameters       nfcee_id - the NFCEE to activate or de-activate.
**                 pl_config -
**                 NFCEE_PL_CONFIG_NFCC_DECIDES -NFCC decides (default)
**                 NFCEE_PL_CONFIG_PWR_ALWAYS_ON -NFCEE power supply always on
**                 NFCEE_PL_CONFIG_LNK_ON_WHEN_PWR_ON -
**                                     communication link is always active
**                                     when NFCEE is powered on
**                 NFCEE_PL_CONFIG_PWR_LNK_ALWAYS_ON -
**                                     power supply and communication
**                                     link are always on
** Returns          tNFC_STATUS
**
*******************************************************************************/
extern tNFC_STATUS NFC_NfceePLConfig(uint8_t nfcee_id,
                                     tNCI_NFCEE_PL_CONFIG pl_config);

/*******************************************************************************
**
** Function         NFC_SetStaticHciCback
**
** Description      This function to update the data callback function
**                  to receive the data for the static Hci connection id.
**
** Parameters       p_cback - the connection callback function
**
** Returns          Nothing
**
*******************************************************************************/
extern void NFC_SetStaticHciCback(tNFC_CONN_CBACK* p_cback);

/*******************************************************************************
**
** Function         NFC_GetStatusName
**
** Description      This function returns the status name.
**
** NOTE             conditionally compiled to save memory.
**
** Returns          pointer to the name
**
*******************************************************************************/
extern std::string NFC_GetStatusName(tNFC_STATUS status);

#endif /* NFC_API_H */
