blob: 2cd568bd33f294effbdcb057faf3fe62d3e58b46 [file] [log] [blame]
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/******************************************************************************
*
* The original Work has been changed by NXP Semiconductors.
*
* Copyright (C) 2015 NXP Semiconductors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
/*
* Communicate with secure elements that are attached to the NFC
* controller.
*/
#pragma once
#include "SyncEvent.h"
#include "DataQueue.h"
#include "NfcJniUtil.h"
#include "RouteDataSet.h"
#include "IntervalTimer.h"
extern "C"
{
#include "nfa_ee_api.h"
#include "nfa_hci_api.h"
#include "nfa_hci_defs.h"
#include "nfa_ce_api.h"
#include "phNxpExtns.h"
#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
#include "phNfcTypes.h"
#endif
}
#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
#define SIG_NFC 44
#endif
typedef enum dual_mode{
SPI_DWPCL_NOT_ACTIVE = 0x00,
CL_ACTIVE = 0x01,
SPI_ON = 0x02,
SPI_DWPCL_BOTH_ACTIVE = 0x03,
}dual_mode_state;
typedef enum reset_management{
TRANS_IDLE = 0x00,
TRANS_WIRED_ONGOING = 0x01,
TRANS_CL_ONGOING = 0x02,
RESET_BLOCKED = 0x04,
}ese_reset_control;
typedef struct {
tNFA_HANDLE src;
tNFA_TECHNOLOGY_MASK tech_mask;
bool reCfg;
}rd_swp_req_t;
typedef enum
{
STATE_SE_RDR_MODE_INVALID =0x00,
STATE_SE_RDR_MODE_START_CONFIG,
STATE_SE_RDR_MODE_START_IN_PROGRESS,
STATE_SE_RDR_MODE_STARTED,
STATE_SE_RDR_MODE_ACTIVATED,
STATE_SE_RDR_MODE_STOP_CONFIG,
STATE_SE_RDR_MODE_STOP_IN_PROGRESS,
STATE_SE_RDR_MODE_STOPPED,
}se_rd_req_state_t;
#if((NXP_EXTNS == TRUE) && (NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE))
typedef enum
{
UICC_01_SELECTED_ENABLED = 0x01,
UICC_01_SELECTED_DISABLED,
UICC_01_REMOVED,
UICC_02_SELECTED_ENABLED,
UICC_02_SELECTED_DISABLED,
UICC_02_REMOVED,
UICC_STATUS_UNKNOWN
}uicc_stat_t;
#endif
typedef enum
{ STATE_SE_RDR_FAILURE_NOT_SUPPORTED ,
STATE_SE_RDR_FAILURE_NOT_ALLOWED
}se_rd_req_failures_t;
#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
typedef struct{
rd_swp_req_t swp_rd_req_info ;
rd_swp_req_t swp_rd_req_current_info ;
se_rd_req_state_t swp_rd_state;
se_rd_req_failures_t swp_rd_req_fail_cause;
Mutex mMutex;
}Rdr_req_ntf_info_t;
#endif
#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
typedef enum operation{
STANDBY_TIMER_START,
STANDBY_TIMER_STOP,
STANDBY_TIMER_TIMEOUT,
STANDBY_GPIO_HIGH,
STANDBY_GPIO_LOW
}nfcc_standby_operation_t;
void spi_prio_signal_handler (int signum, siginfo_t *info, void *unused);
#endif
namespace android {
extern SyncEvent sNfaEnableDisablePollingEvent;
extern void startStopPolling (bool isStartPolling);
} // namespace android
class SecureElement
{
public:
tNFA_HANDLE mActiveEeHandle;
#if(NXP_EXTNS == TRUE)
#define MAX_NFCEE 5
struct mNfceeData{
tNFA_HANDLE mNfceeHandle[MAX_NFCEE];
tNFA_EE_STATUS mNfceeStatus[MAX_NFCEE];
UINT8 mNfceePresent;
};
mNfceeData mNfceeData_t;
#endif
#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
IntervalTimer sSwpReaderTimer; // timer swp reader timeout.
#endif
static const int MAX_NUM_EE = 5; //max number of EE's
/*******************************************************************************
**
** Function: getInstance
**
** Description: Get the SecureElement singleton object.
**
** Returns: SecureElement object.
**
*******************************************************************************/
static SecureElement& getInstance ();
/*******************************************************************************
**
** Function: initialize
**
** Description: Initialize all member variables.
** native: Native data.
**
** Returns: True if ok.
**
*******************************************************************************/
bool initialize (nfc_jni_native_data* native);
/*******************************************************************************
**
** Function: finalize
**
** Description: Release all resources.
**
** Returns: None
**
*******************************************************************************/
void finalize ();
/*******************************************************************************
**
** Function: getListOfEeHandles
**
** Description: Get the list of handles of all execution environments.
** e: Java Virtual Machine.
**
** Returns: List of handles of all execution environments.
**
*******************************************************************************/
jintArray getListOfEeHandles (JNIEnv* e);
/*******************************************************************************
**
** Function: getActiveSecureElementList
**
** Description: Get the list of handles of all execution environments.
** e: Java Virtual Machine.
**
** Returns: List of handles of all execution environments.
**
*******************************************************************************/
jintArray getActiveSecureElementList (JNIEnv* e);
/*******************************************************************************
**
** Function: activate
**
** Description: Turn on the secure element.
** seID: ID of secure element.
**
** Returns: True if ok.
**
*******************************************************************************/
bool activate (jint seID);
/*******************************************************************************
**
** Function: deactivate
**
** Description: Turn off the secure element.
** seID: ID of secure element.
**
** Returns: True if ok.
**
*******************************************************************************/
bool deactivate (jint seID);
/*******************************************************************************
**
** Function: connectEE
**
** Description: Connect to the execution environment.
**
** Returns: True if ok.
**
*******************************************************************************/
bool connectEE ();
/*******************************************************************************
**
** Function: disconnectEE
**
** Description: Disconnect from the execution environment.
** seID: ID of secure element.
**
** Returns: True if ok.
**
*******************************************************************************/
bool disconnectEE (jint seID);
/*******************************************************************************
**
** Function: transceive
**
** Description: Send data to the secure element; read it's response.
** xmitBuffer: Data to transmit.
** xmitBufferSize: Length of data.
** recvBuffer: Buffer to receive response.
** recvBufferMaxSize: Maximum size of buffer.
** recvBufferActualSize: Actual length of response.
** timeoutMillisec: timeout in millisecond
**
** Returns: True if ok.
**
*******************************************************************************/
bool transceive (UINT8* xmitBuffer, INT32 xmitBufferSize, UINT8* recvBuffer,
INT32 recvBufferMaxSize, INT32& recvBufferActualSize, INT32 timeoutMillisec);
void notifyModeSet (tNFA_HANDLE eeHandle, bool success, tNFA_EE_STATUS eeStatus);
/*******************************************************************************
**
** Function: notifyListenModeState
**
** Description: Notify the NFC service about whether the SE was activated
** in listen mode.
** isActive: Whether the secure element is activated.
**
** Returns: None
**
*******************************************************************************/
void notifyListenModeState (bool isActivated);
/*******************************************************************************
**
** Function: notifyRfFieldEvent
**
** Description: Notify the NFC service about RF field events from the stack.
** isActive: Whether any secure element is activated.
**
** Returns: None
**
*******************************************************************************/
void notifyRfFieldEvent (bool isActive);
#if(NXP_EXTNS == TRUE)
/*******************************************************************************
**
** Function: notifyEEReaderEvent
**
** Description: Notify the NFC service about Reader over SWP events from the stack.
**
** Returns: None
**
*******************************************************************************/
void notifyEEReaderEvent (int evt, int data);
#endif
/*******************************************************************************
**
** Function: resetRfFieldStatus ();
**
** Description: Resets the field status.
**
** Returns: None
**
*******************************************************************************/
void resetRfFieldStatus ();
/*******************************************************************************
**
** Function: storeUiccInfo
**
** Description: Store a copy of the execution environment information from the stack.
** info: execution environment information.
**
** Returns: None
**
*******************************************************************************/
void storeUiccInfo (tNFA_EE_DISCOVER_REQ& info);
/*******************************************************************************
**
** Function: getUiccId
**
** Description: Get the ID of the secure element.
** eeHandle: Handle to the secure element.
** uid: Array to receive the ID.
**
** Returns: True if ok.
**
*******************************************************************************/
bool getUiccId (tNFA_HANDLE eeHandle, jbyteArray& uid);
/*******************************************************************************
**
** Function: notifyTransactionListenersOfAid
**
** Description: Notify the NFC service about a transaction event from secure element.
** aid: Buffer contains application ID.
** aidLen: Length of application ID.
**
** Returns: None
**
*******************************************************************************/
void notifyTransactionListenersOfAid (const UINT8* aid, UINT8 aidLen, const UINT8* data, UINT32 dataLen,UINT32 evtSrc);
/*******************************************************************************
**
** Function: notifyConnectivityListeners
**
** Description: Notify the NFC service about a connectivity event from secure element.
** evtSrc: source of event UICC/eSE.
**
** Returns: None
**
*******************************************************************************/
void notifyConnectivityListeners (UINT8 evtSrc);
/*******************************************************************************
**
** Function: notifyEmvcoMultiCardDetectedListeners
**
** Description: Notify the NFC service about a multiple card presented to
** Emvco reader.
**
** Returns: None
**
*******************************************************************************/
void notifyEmvcoMultiCardDetectedListeners ();
/*******************************************************************************
**
** Function: notifyTransactionListenersOfTlv
**
** Description: Notify the NFC service about a transaction event from secure element.
** The type-length-value contains AID and parameter.
** tlv: type-length-value encoded in Basic Encoding Rule.
** tlvLen: Length tlv.
**
** Returns: None
**
*******************************************************************************/
void notifyTransactionListenersOfTlv (const UINT8* tlv, UINT8 tlvLen);
/*******************************************************************************
**
** Function: connectionEventHandler
**
** Description: Receive card-emulation related events from stack.
** event: Event code.
** eventData: Event data.
**
** Returns: None
**
*******************************************************************************/
void connectionEventHandler (UINT8 event, tNFA_CONN_EVT_DATA* eventData);
/*******************************************************************************
**
** Function: applyRoutes
**
** Description: Read route data from XML and apply them again
** to every secure element.
**
** Returns: None
**
*******************************************************************************/
void applyRoutes ();
/*******************************************************************************
**
** Function: setActiveSeOverride
**
** Description: Specify which secure element to turn on.
** activeSeOverride: ID of secure element
**
** Returns: None
**
*******************************************************************************/
void setActiveSeOverride (UINT8 activeSeOverride);
bool SecEle_Modeset(UINT8 type);
/*******************************************************************************
**
** Function: routeToSecureElement
**
** Description: Adjust controller's listen-mode routing table so transactions
** are routed to the secure elements as specified in route.xml.
**
** Returns: True if ok.
**
*******************************************************************************/
bool routeToSecureElement ();
/*******************************************************************************
**
** Function: isBusy
**
** Description: Whether NFC controller is routing listen-mode events or a pipe is connected.
**
** Returns: True if either case is true.
**
*******************************************************************************/
bool isBusy ();
/*******************************************************************************
**
** Function getActualNumEe
**
** Description Returns number of secure elements we know about.
**
** Returns Number of secure elements we know about.
**
*******************************************************************************/
UINT8 getActualNumEe();
/*******************************************************************************
**
** Function getSeVerInfo
**
** Description Gets version information and id for a secure element. The
** seIndex parmeter is the zero based index of the secure
** element to get verion info for. The version infommation
** is returned as a string int the verInfo parameter.
**
** Returns ture on success, false on failure
**
*******************************************************************************/
bool getSeVerInfo(int seIndex, char * verInfo, int verInfoSz, UINT8 * seid);
/*******************************************************************************
**
** Function: isActivatedInListenMode
**
** Description: Can be used to determine if the SE is activated in listen mode
**
** Returns: True if the SE is activated in listen mode
**
*******************************************************************************/
bool isActivatedInListenMode();
/*******************************************************************************
**
** Function: isRfFieldOn
**
** Description: Can be used to determine if the SE is in an RF field
**
** Returns: True if the SE is activated in an RF field
**
*******************************************************************************/
bool isRfFieldOn();
/*******************************************************************************
**
** Function: setEseListenTechMask
**
** Description: Can be used to force ESE to only listen the specific
** Technologies.
** NFA_TECHNOLOGY_MASK_A 0x01
** NFA_TECHNOLOGY_MASK_B 0x02
**
** Returns: True if listening is configured.
**
*******************************************************************************/
bool setEseListenTechMask(UINT8 tech_mask);
bool sendEvent(UINT8 event);
/*******************************************************************************
**
** Function: getAtr
**
** Description: Can be used to get the ATR response from connected eSE
**
** Returns: True if ATR response is returned successfully
**
*******************************************************************************/
bool getAtr(jint seID, UINT8* recvBuffer, INT32 *recvBufferSize);
#if(NXP_EXTNS == TRUE)
/**********************************************************************************
**
** Function: getEeStatus
**
** Description: get the status of EE
**
** Returns: EE status .
**
**********************************************************************************/
UINT16 getEeStatus(UINT16 eehandle);
#if(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE)
/**********************************************************************************
**
** Function: getUiccStatus
**
** Description: get the status of EE
**
** Returns: EE status .
**
**********************************************************************************/
uicc_stat_t getUiccStatus(UINT8 selected_uicc);
/*******************************************************************************
**
** Function: updateEEStatus
**
** Description: updateEEStatus
** Reads EE related information from libnfc
** and updates in JNI
**
** Returns: True if ok.
**
*******************************************************************************/
bool updateEEStatus ();
#endif
#endif
#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
void etsiInitConfig();
tNFC_STATUS etsiReaderConfig(int eeHandle);
tNFC_STATUS etsiResetReaderConfig();
#endif
jint getSETechnology(tNFA_HANDLE eeHandle);
static const UINT8 UICC_ID = 0x02;
static const UINT8 ESE_ID = 0x01;
static const UINT8 DH_ID = 0x00;
void getEeHandleList(tNFA_HANDLE *list, UINT8* count);
tNFA_HANDLE getEseHandleFromGenericId(jint eseId);
jint getGenericEseId(tNFA_HANDLE handle);
tNFA_STATUS reconfigureEseHciInit();
#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
void setCPTimeout();
void NfccStandByOperation(nfcc_standby_operation_t value);
#endif
bool isWiredModeAllowedInRfState();
bool mRecvdTransEvt;
bool mAllowWiredMode;
SyncEvent mRoutingEvent;
SyncEvent mAidAddRemoveEvent;
SyncEvent mUiccListenEvent;
SyncEvent mEseListenEvent;
SyncEvent mAllowWiredModeEvent;
SyncEvent mEeSetModeEvent;
#if(NXP_EXTNS == TRUE)
tNFA_STATUS SecElem_EeModeSet(uint16_t handle, uint8_t mode);
SyncEvent mEEdatapacketEvent;
SyncEvent mTransceiveEvent;
static const UINT8 EVT_END_OF_APDU_TRANSFER = 0x21; //NXP Propritory
void setCLState(bool mState);
#endif
private:
static const unsigned int MAX_RESPONSE_SIZE = 0x8800;//1024; //34K
enum RouteSelection {NoRoute, DefaultRoute, SecElemRoute};
#ifdef GEMATO_SE_SUPPORT
static const UINT8 STATIC_PIPE_0x70 = 0x19; //PN54X Gemalto's proprietary static pipe
#else
static const UINT8 STATIC_PIPE_0x70 = 0x70; //Broadcom's proprietary static pipe
#endif
static const UINT8 STATIC_PIPE_0x71 = 0x71; //Broadcom's proprietary static pipe
static const UINT8 EVT_SEND_DATA = 0x10; //see specification ETSI TS 102 622 v9.0.0 (Host Controller Interface); section 9.3.3.3
#if(NXP_EXTNS == TRUE)
static const tNFA_HANDLE EE_HANDLE_0xF3 = 0x4C0;//0x401; //handle to secure element in slot 0
#ifdef NXP_UICC_ENABLE
static const tNFA_HANDLE EE_HANDLE_0xF4 = 0x402; //handle to secure element in slot 1
#else
static const tNFA_HANDLE EE_HANDLE_0xF4 = 0x0F4;//0x4C0; //handle to secure element in slot 1
#endif
#else
static const tNFA_HANDLE EE_HANDLE_0xF3 = 0x4F3; //handle to secure element in slot 0
static const tNFA_HANDLE EE_HANDLE_0xF4 = 0x4F4; //handle to secure element in slot 1
#endif
static SecureElement sSecElem;
static const char* APP_NAME;
UINT8 mDestinationGate; //destination gate of the UICC
tNFA_HANDLE mNfaHciHandle; //NFA handle to NFA's HCI component
nfc_jni_native_data* mNativeData;
bool mIsInit; // whether EE is initialized
UINT8 mActualNumEe; // actual number of EE's reported by the stack
UINT8 mNumEePresent; // actual number of usable EE's
bool mbNewEE;
UINT8 mNewPipeId;
UINT8 mNewSourceGate;
UINT16 mActiveSeOverride; // active "enable" seid, 0 means activate all SEs
tNFA_STATUS mCommandStatus; //completion status of the last command
bool mIsPiping; //is a pipe connected to the controller?
RouteSelection mCurrentRouteSelection;
int mActualResponseSize; //number of bytes in the response received from secure element
int mAtrInfolen;
UINT8 mAtrStatus;
bool mUseOberthurWarmReset; //whether to use warm-reset command
bool mActivatedInListenMode; // whether we're activated in listen mode
UINT8 mOberthurWarmResetCommand; //warm-reset command byte
tNFA_EE_INFO mEeInfo [MAX_NUM_EE]; //actual size stored in mActualNumEe
tNFA_EE_DISCOVER_REQ mUiccInfo;
tNFA_HCI_GET_GATE_PIPE_LIST mHciCfg;
SyncEvent mEeRegisterEvent;
SyncEvent mHciRegisterEvent;
SyncEvent mResetEvent;
SyncEvent mResetOngoingEvent;
SyncEvent mPipeListEvent;
SyncEvent mCreatePipeEvent;
SyncEvent mPipeOpenedEvent;
SyncEvent mAllocateGateEvent;
SyncEvent mDeallocateGateEvent;
// SyncEvent mRoutingEvent;
SyncEvent mUiccInfoEvent;
// SyncEvent mAidAddRemoveEvent;
SyncEvent mGetRegisterEvent;
SyncEvent mVerInfoEvent;
SyncEvent mRegistryEvent;
SyncEvent mDiscMapEvent;
UINT8 mVerInfo [3];
UINT8 mAtrInfo[40];
bool mGetAtrRspwait;
UINT8 mResponseData [MAX_RESPONSE_SIZE];
RouteDataSet mRouteDataSet; //routing data
std::vector<std::string> mUsedAids; //AID's that are used in current routes
UINT8 mAidForEmptySelect[NCI_MAX_AID_LEN+1];
Mutex mMutex; // protects fields below
bool mRfFieldIsOn; // last known RF field state
struct timespec mLastRfFieldToggle; // last time RF field went off
IntervalTimer mTransceiveTimer;
bool mTransceiveWaitOk;
int mWiredModeRfFiledEnable;
/*******************************************************************************
**
** Function: SecureElement
**
** Description: Initialize member variables.
**
** Returns: None
**
*******************************************************************************/
SecureElement ();
/*******************************************************************************
**
** Function: ~SecureElement
**
** Description: Release all resources.
**
** Returns: None
**
*******************************************************************************/
~SecureElement ();
/*******************************************************************************
**
** Function: nfaEeCallback
**
** Description: Receive execution environment-related events from stack.
** event: Event code.
** eventData: Event data.
**
** Returns: None
**
*******************************************************************************/
static void nfaEeCallback (tNFA_EE_EVT event, tNFA_EE_CBACK_DATA* eventData);
/*******************************************************************************
**
** Function: nfaHciCallback
**
** Description: Receive Host Controller Interface-related events from stack.
** event: Event code.
** eventData: Event data.
**
** Returns: None
**
*******************************************************************************/
static void nfaHciCallback (tNFA_HCI_EVT event, tNFA_HCI_EVT_DATA* eventData);
/*******************************************************************************
**
** Function: findEeByHandle
**
** Description: Find information about an execution environment.
** eeHandle: Handle to execution environment.
**
** Returns: Information about an execution environment.
**
*******************************************************************************/
tNFA_EE_INFO *findEeByHandle (tNFA_HANDLE eeHandle);
/*******************************************************************************
**
** Function: findUiccByHandle
**
** Description: Find information about an execution environment.
** eeHandle: Handle of the execution environment.
**
** Returns: Information about the execution environment.
**
*******************************************************************************/
tNFA_EE_DISCOVER_INFO *findUiccByHandle (tNFA_HANDLE eeHandle);
/*******************************************************************************
**
** Function: getDefaultEeHandle
**
** Description: Get the handle to the execution environment.
**
** Returns: Handle to the execution environment.
**
*******************************************************************************/
tNFA_HANDLE getDefaultEeHandle ();
/*******************************************************************************
**
** Function: adjustRoutes
**
** Description: Adjust routes in the controller's listen-mode routing table.
** selection: which set of routes to configure the controller.
**
** Returns: None
**
*******************************************************************************/
void adjustRoutes (RouteSelection selection);
/*******************************************************************************
**
** Function: adjustProtocolRoutes
**
** Description: Adjust default routing based on protocol in NFC listen mode.
** isRouteToEe: Whether routing to EE (true) or host (false).
**
** Returns: None
**
*******************************************************************************/
void adjustProtocolRoutes (RouteDataSet::Database* db, RouteSelection routeSelection);
/*******************************************************************************
**
** Function: adjustTechnologyRoutes
**
** Description: Adjust default routing based on technology in NFC listen mode.
** isRouteToEe: Whether routing to EE (true) or host (false).
**
** Returns: None
**
*******************************************************************************/
void adjustTechnologyRoutes (RouteDataSet::Database* db, RouteSelection routeSelection);
/*******************************************************************************
**
** Function: getEeInfo
**
** Description: Get latest information about execution environments from stack.
**
** Returns: True if at least 1 EE is available.
**
*******************************************************************************/
bool getEeInfo ();
/*******************************************************************************
**
** Function: eeStatusToString
**
** Description: Convert status code to status text.
** status: Status code
**
** Returns: None
**
*******************************************************************************/
static const char* eeStatusToString (UINT8 status);
/*******************************************************************************
**
** Function: encodeAid
**
** Description: Encode AID in type-length-value using Basic Encoding Rule.
** tlv: Buffer to store TLV.
** tlvMaxLen: TLV buffer's maximum length.
** tlvActualLen: TLV buffer's actual length.
** aid: Buffer of Application ID.
** aidLen: Aid buffer's actual length.
**
** Returns: True if ok.
**
*******************************************************************************/
bool encodeAid (UINT8* tlv, UINT16 tlvMaxLen, UINT16& tlvActualLen, const UINT8* aid, UINT8 aidLen);
static int decodeBerTlvLength(UINT8* data,int index, int data_length );
static void discovery_map_cb (tNFC_DISCOVER_EVT event, tNFC_DISCOVER *p_data);
};