diff options
author | nxpandroid <srikrishna.pramoda@nxp.com> | 2016-08-01 19:11:04 +0530 |
---|---|---|
committer | nxpandroid <srikrishna.pramoda@nxp.com> | 2016-08-01 19:11:04 +0530 |
commit | 7d44e579ba5df8e4007a45450825eb76316e791c (patch) | |
tree | ba3739d084e0f25d2fac2a5a012ee6e6f8fd8dbb | |
parent | 34627bd264fdb2e049585beda5cb5f628e29e1fa (diff) | |
download | android_vendor_nxp_opensource_packages_apps_Nfc-7d44e579ba5df8e4007a45450825eb76316e791c.tar.gz android_vendor_nxp_opensource_packages_apps_Nfc-7d44e579ba5df8e4007a45450825eb76316e791c.tar.bz2 android_vendor_nxp_opensource_packages_apps_Nfc-7d44e579ba5df8e4007a45450825eb76316e791c.zip |
NFC_NCIHALx_ARC0.4.7.0_M_OpnSrc
28 files changed, 2613 insertions, 1216 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index e437805f..66ccdf96 100755 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -54,6 +54,7 @@ <uses-permission android:name="android.permission.DISPATCH_NFC_MESSAGE" /> <uses-permission android:name="android.permission.OVERRIDE_WIFI_CONFIG" /> <uses-permission android:name="android.permission.DEVICE_POWER" /> + <uses-permission android:name="android.permission.USER_ACTIVITY" /> <permission-group android:name ="com.gsma.services.nfc.permission" android:label ="@string/permgrouplab_NFC" android:description="@string/permgroupdesc_NFC" @@ -19,5 +19,5 @@ | android-6.0.0_r1 | 4.2.0_M (PN547C2/PN548C2) | NFC_NCIHALx_AR0F.4.2.0_M_OpnSrc | | android-6.0.0_r1 | 4.3.0_M (PN547C2/PN548C2) | NFC_NCIHALx_AR0F.4.3.0_M_OpnSrc | | android-6.0.1_r17 | 4.5.0_M (PN551/PN548C2) | NFC_NCIHALx_AR3C.4.5.0_M_OpnSrc | - +| android-6.0.1_r17 | 4.7.0_M (PN553) | NFC_NCIHALx_ARC0.4.7.0_M_OpnSrc | diff --git a/nci/jni/Android.mk b/nci/jni/Android.mk index 2a7d34a9..bfbb1723 100644 --- a/nci/jni/Android.mk +++ b/nci/jni/Android.mk @@ -17,6 +17,7 @@ LOCAL_CFLAGS += -Wall -Wextra -Wno-unused-parameter -Werror PN547C2 := 1 PN548C2 := 2 PN551 := 3 +PN553 := 4 NQ110 := $PN547C2 NQ120 := $PN547C2 NQ210 := $PN548C2 @@ -32,6 +33,9 @@ endif ifeq ($(PN551),3) LOCAL_CFLAGS += -DPN551=3 endif +ifeq ($(PN553),4) +LOCAL_CFLAGS += -DPN553=4 +endif #NXP PN547 Enable LOCAL_CFLAGS += -DNXP_EXTNS=TRUE @@ -54,12 +58,14 @@ NFC_NXP_ESE:= TRUE ifeq ($(NFC_NXP_ESE),TRUE) LOCAL_CFLAGS += -DNFC_NXP_ESE=TRUE LOCAL_CFLAGS += -DNFC_NXP_ESE_VER=$(JCOP_VER_3_3) +LOCAL_CFLAGS += -DJCOP_WA_ENABLE=FALSE +LOCAL_CFLAGS += -DCONCURRENCY_PROTECTION=TRUE else LOCAL_CFLAGS += -DNFC_NXP_ESE=FALSE endif #### Select the CHIP #### -NXP_CHIP_TYPE := $(PN551) +NXP_CHIP_TYPE := $(PN553) ifeq ($(NXP_CHIP_TYPE),$(PN547C2)) LOCAL_CFLAGS += -DNFC_NXP_CHIP_TYPE=PN547C2 @@ -67,12 +73,13 @@ else ifeq ($(NXP_CHIP_TYPE),$(PN548C2)) LOCAL_CFLAGS += -DNFC_NXP_CHIP_TYPE=PN548C2 else ifeq ($(NXP_CHIP_TYPE),$(PN551)) LOCAL_CFLAGS += -DNFC_NXP_CHIP_TYPE=PN551 +else ifeq ($(NXP_CHIP_TYPE),$(PN553)) +LOCAL_CFLAGS += -DNFC_NXP_CHIP_TYPE=PN553 endif -NFC_POWER_MANAGEMENT:= FALSE +NFC_POWER_MANAGEMENT:= TRUE ifeq ($(NFC_POWER_MANAGEMENT),TRUE) LOCAL_CFLAGS += -DNFC_POWER_MANAGEMENT=TRUE -LOCAL_CFLAGS += -DNFC_NXP_TRIPLE_MODE_PROTECTION=TRUE else LOCAL_CFLAGS += -DNFC_POWER_MANAGEMENT=FALSE endif diff --git a/nci/jni/DwpChannel.cpp b/nci/jni/DwpChannel.cpp index 6c66a27b..5984674f 100644 --- a/nci/jni/DwpChannel.cpp +++ b/nci/jni/DwpChannel.cpp @@ -17,6 +17,8 @@ #include "SecureElement.h" #include "RoutingManager.h" #include <cutils/log.h> +#include "config.h" +#include "phNxpConfig.h" static const int EE_ERROR_OPEN_FAIL = -1; @@ -172,7 +174,9 @@ bool close(INT16 mHandle) if(eSE_connected != true) return true; - stat = se.sendEvent(SecureElement::EVT_END_OF_APDU_TRANSFER); +#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) + se.NfccStandByOperation(STANDBY_MODE_ON); +#endif stat = se.disconnectEE (SecureElement::ESE_ID); @@ -224,8 +228,9 @@ void doeSE_Reset(void) se.SecEle_Modeset(0x01); ALOGD("2nd mode set called"); - usleep(2000 * 1000); + usleep(3000 * 1000); rm.mResetHandlerMutex.unlock(); +#if (JCOP_WA_ENABLE == TRUE) if((RoutingManager::getInstance().is_ee_recovery_ongoing())) { ALOGE ("%s: is_ee_recovery_ongoing ", fn); @@ -236,6 +241,7 @@ void doeSE_Reset(void) { ALOGE ("%s: Not in Recovery State", fn); } +#endif } namespace android { @@ -247,3 +253,78 @@ namespace android ALOGD("%s: exit", fn); } } +/******************************************************************************* +** +** Function: doeSE_JcopDownLoadReset +** +** Description: Performs a reset to eSE during JCOP OS update depending on +** Power schemes configuered +** +** Returns: void. +** +*******************************************************************************/ +void doeSE_JcopDownLoadReset(void) +{ + static const char fn [] = "DwpChannel::JcopDownLoadReset"; + SecureElement &se = SecureElement::getInstance(); + RoutingManager &rm = RoutingManager::getInstance(); + unsigned long int num = 0; + ALOGD("%s: enter:", fn); + + rm.mResetHandlerMutex.lock(); +#if ((NXP_ESE_RESET_METHOD == TRUE) && (NXP_ESE_POWER_MODE == TRUE)) + if (GetNxpNumValue (NAME_NXP_ESE_POWER_DH_CONTROL, (void*)&num, sizeof(num)) == true) + { + if(num ==1) + { + ALOGD("1st mode set calling"); + se.SecEle_Modeset(0x00); + usleep(100 * 1000); + ALOGD("1st mode set called"); + ALOGD("2nd mode set calling"); + se.SecEle_Modeset(0x01); + ALOGD("2nd mode set called"); + usleep(3000 * 1000); + } + else if(num ==2) + { + ALOGD("%s: eSE ISO_RST on DWP Channel:", fn); + se.SecEle_Modeset(0x00); + usleep(100 * 1000); + se.eSE_ISO_Reset(); + se.SecEle_Modeset(0x01); + ALOGD("ISO Reset DONE"); + usleep(3000 * 1000); + } + else + { + ALOGD("%s: Invalid Power scheme:", fn); + } + } +#else + ALOGD("1st mode set calling"); + se.SecEle_Modeset(0x00); + usleep(100 * 1000); + ALOGD("1st mode set called"); + ALOGD("2nd mode set calling"); + + se.SecEle_Modeset(0x01); + ALOGD("2nd mode set called"); + + usleep(3000 * 1000); +#endif + rm.mResetHandlerMutex.unlock(); + +#if (JCOP_WA_ENABLE == TRUE) + if((RoutingManager::getInstance().is_ee_recovery_ongoing())) + { + ALOGE ("%s: is_ee_recovery_ongoing ", fn); + SyncEventGuard guard (se.mEEdatapacketEvent); + se.mEEdatapacketEvent.wait(); + } + else + { + ALOGE ("%s: Not in Recovery State", fn); + } +#endif +} diff --git a/nci/jni/DwpChannel.h b/nci/jni/DwpChannel.h index e3637196..fbeedf18 100644 --- a/nci/jni/DwpChannel.h +++ b/nci/jni/DwpChannel.h @@ -36,4 +36,5 @@ extern "C" INT32 recvBufferMaxSize, INT32& recvBufferActualSize, INT32 timeoutMillisec); void doeSE_Reset(); + void doeSE_JcopDownLoadReset(); void doDwpChannel_ForceExit(); diff --git a/nci/jni/HciRFParams.cpp b/nci/jni/HciRFParams.cpp index dd8cfa2f..a613498e 100644 --- a/nci/jni/HciRFParams.cpp +++ b/nci/jni/HciRFParams.cpp @@ -147,7 +147,7 @@ bool HciRFParams::initialize () bPipeStatus_CeB = *params++; bMode_CeB = *params++; -#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)) +#if(NFC_NXP_CHIP_TYPE != PN547C2) aPupiRegDataSize_CeB = *params++; #endif aPupiRegDataSize_CeB = 4; diff --git a/nci/jni/NativeNfcManager.cpp b/nci/jni/NativeNfcManager.cpp index dbbd7c5f..54df8a5d 100644 --- a/nci/jni/NativeNfcManager.cpp +++ b/nci/jni/NativeNfcManager.cpp @@ -59,6 +59,7 @@ #include "DwpChannel.h" extern "C" { + #include "nfc_api.h" #include "nfa_api.h" #include "nfa_p2p_api.h" #include "rw_api.h" @@ -78,6 +79,7 @@ extern "C" #if(NXP_EXTNS == TRUE) #define UICC_HANDLE 0x402 +#define UICC2_HANDLE 0x481 #define ESE_HANDLE 0x4C0 #define RETRY_COUNT 10 #define default_count 3 @@ -109,6 +111,9 @@ namespace android { extern bool gIsTagDeactivating; extern bool gIsSelectingRfInterface; +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) + extern bool is_wired_mode_open; +#endif extern void nativeNfcTag_doTransceiveStatus (tNFA_STATUS status, uint8_t * buf, uint32_t buflen); extern void nativeNfcTag_notifyRfTimeout (); extern void nativeNfcTag_doConnectStatus (jboolean is_connect_ok); @@ -130,7 +135,7 @@ namespace android extern tNFA_STATUS SetScreenState(int state); extern tNFA_STATUS SendAutonomousMode(int state , uint8_t num); #if(NXP_EXTNS == TRUE) -#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)) +#if(NFC_NXP_CHIP_TYPE != PN547C2) extern tNFA_STATUS SendAGCDebugCommand(); #endif #endif @@ -193,7 +198,7 @@ namespace android jmethodID gCachedNfcManagerNotifySWPReaderRequestedFail; jmethodID gCachedNfcManagerNotifySWPReaderActivated; jmethodID gCachedNfcManagerNotifyAidRoutingTableFull; -#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) jmethodID gCachedNfcManagerNotifyETSIReaderModeStartConfig; jmethodID gCachedNfcManagerNotifyETSIReaderModeStopConfig; jmethodID gCachedNfcManagerNotifyETSIReaderModeSwpTimeout; @@ -238,7 +243,7 @@ SyncEvent sNfaGetConfigEvent; // event for Get_Config.... #if(NXP_EXTNS == TRUE) SyncEvent sNfaGetRoutingEvent; // event for Get_Routing.... static bool sProvisionMode = false; -#if((NXP_EXTNS == TRUE) && (NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE)) +#if(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE) SyncEvent sNfceeHciCbEnableEvent; SyncEvent sNfceeHciCbDisableEvent; #endif @@ -300,7 +305,7 @@ static void nfcManager_doSetScreenState(JNIEnv* e, jobject o, jint state); static void nfcManager_doSetScreenOrPowerState (JNIEnv* e, jobject o, jint state); static void StoreScreenState(int state); int getScreenState(); -#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) bool isp2pActivated(); #endif static void nfaConnectionCallback (UINT8 event, tNFA_CONN_EVT_DATA *eventData); @@ -340,8 +345,13 @@ typedef struct UINT16 sUicc2CntxLen; UINT8 sUicc1TechCapblty[12]; UINT8 sUicc2TechCapblty[12]; + UINT8 sUicc1SessionId[8]; + UINT8 sUicc2SessionId[8]; + UINT8 sUicc1SessionIdLen; + UINT8 sUicc2SessionIdLen; UINT8 uiccActivStat = 0; UINT8 uiccConfigStat = 0; + unsigned long dualUiccEnable = 0; }dual_uicc_info_t; dual_uicc_info_t dualUiccInfo; typedef enum @@ -380,6 +390,7 @@ static UINT8 sNfceeConfigured; static UINT8 sCheckNfceeFlag; void checkforNfceeBuffer(); void checkforNfceeConfig(); +void performNfceeETSI12Config(); tNFA_STATUS getUICC_RF_Param_SetSWPBitRate(); //self test start static IntervalTimer nfaNxpSelfTestNtfTimer; // notification timer for swp self test @@ -404,6 +415,7 @@ static bool nfcManager_doPartialDeInitialize(); static int nfcManager_doSelectUicc(JNIEnv* e, jobject o, jint uiccSlot); static int nfcManager_doGetSelectedUicc(JNIEnv* e, jobject o); static void getUiccContext(); +static int getUiccSession(); static int nfcManager_staticDualUicc_Precondition(int uiccSlot); #endif #endif @@ -416,10 +428,12 @@ extern bool scoreGenericNtf; #endif #if(NXP_EXTNS == TRUE) tNFC_FW_VERSION get_fw_version(); +#if (JCOP_WA_ENABLE == TRUE) bool isNfcInitializationDone(); +#endif static UINT16 discDuration = 0x00; UINT16 getrfDiscoveryDuration(); -#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)) +#if(NFC_NXP_CHIP_TYPE != PN547C2) typedef struct enableAGC_debug { long enableAGC; // config param @@ -435,7 +449,9 @@ bool get_AGC_process_state(); #endif void checkforTranscation(UINT8 connEvent ,void * eventData); +#if (JCOP_WA_ENABLE == TRUE) void sig_handler(int signo); +#endif void cleanup_timer(); /* Transaction Events in order */ typedef enum transcation_events @@ -860,14 +876,6 @@ static void nfaConnectionCallback (UINT8 connEvent, tNFA_CONN_EVT_DATA* eventDat ALOGD("%s: NFA_ACTIVATED_EVT: gIsSelectingRfInterface=%d, sIsDisabling=%d", __FUNCTION__, gIsSelectingRfInterface, sIsDisabling); #if(NXP_EXTNS == TRUE) NfcTag::getInstance().selectCompleteStatus(true); - if(eventData->activated.activate_ntf.intf_param.type==NFC_INTERFACE_EE_DIRECT_RF) - { - ALOGD("%s: NFA_ACTIVATED_EVT: gUICCVirtualWiredProtectMask=%d, gEseVirtualWiredProtectMask=%d", __FUNCTION__,gUICCVirtualWiredProtectMask, gEseVirtualWiredProtectMask); - if(gUICCVirtualWiredProtectMask != 0x00 || gEseVirtualWiredProtectMask != 0x00) - { - recovery=TRUE; - } - } #endif #if(NXP_EXTNS == TRUE) /***P2P-Prio Logic for Multiprotocol***/ @@ -964,6 +972,12 @@ static void nfaConnectionCallback (UINT8 connEvent, tNFA_CONN_EVT_DATA* eventDat } #endif // For the SE, consider the field to be on while p2p is active. +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) + if (is_wired_mode_open && SecureElement::getInstance().mPassiveListenEnabled == true) + { + SecureElement::getInstance().mPassiveListenTimer.kill(); + } +#endif SecureElement::getInstance().notifyRfFieldEvent (true); } else if (pn544InteropIsBusy() == false) @@ -995,6 +1009,12 @@ static void nfaConnectionCallback (UINT8 connEvent, tNFA_CONN_EVT_DATA* eventDat { sSeRfActive = true; SecureElement::getInstance().notifyListenModeState (true); +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) + if (is_wired_mode_open && SecureElement::getInstance().mPassiveListenEnabled == true) + { + SecureElement::getInstance().mPassiveListenTimer.kill(); + } +#endif } } break; @@ -1046,6 +1066,12 @@ static void nfaConnectionCallback (UINT8 connEvent, tNFA_CONN_EVT_DATA* eventDat gActivated = false; //guard this variable from multi-threaded access gDeactivatedEvent.notifyOne (); } +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) + if (is_wired_mode_open == true && SecureElement::getInstance().mPassiveListenEnabled == true) + { + SecureElement::getInstance().startThread(0x00); + } +#endif NfcTag::getInstance ().mNumDiscNtf = 0; NfcTag::getInstance ().mTechListIndex =0; nativeNfcTag_resetPresenceCheck(); @@ -1070,6 +1096,7 @@ static void nfaConnectionCallback (UINT8 connEvent, tNFA_CONN_EVT_DATA* eventDat || (eventData->deactivated.type == NFA_DEACTIVATE_TYPE_DISCOVERY)) { #if(NXP_EXTNS == TRUE) + #if (JCOP_WA_ENABLE == TRUE) if(RoutingManager::getInstance().is_ee_recovery_ongoing()) { recovery=FALSE; @@ -1077,6 +1104,26 @@ static void nfaConnectionCallback (UINT8 connEvent, tNFA_CONN_EVT_DATA* eventDat SecureElement::getInstance().mEEdatapacketEvent.notifyOne(); } #endif + +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) + case NFA_PASSIVE_LISTEN_DISABLED_EVT: + { + ALOGD("%s: NFA_PASSIVE_LISTEN_DISABLED_EVT", __FUNCTION__); + SyncEventGuard g (SecureElement::getInstance().mPassiveListenEvt); + SecureElement::getInstance().mPassiveListenEvt.notifyOne(); + } + break; +#endif +#if(NFC_NXP_ESE == TRUE) + case NFA_LISTEN_ENABLED_EVT: + { + ALOGD("%s: NFA_LISTEN_ENABLED_EVT", __FUNCTION__); + SyncEventGuard g (SecureElement::getInstance().mPassiveListenEvt); + SecureElement::getInstance().mPassiveListenEvt.notifyOne(); + } + break; +#endif +#endif if (sSeRfActive) { sSeRfActive = false; if (!sIsDisabling && sIsNfaEnabled) @@ -1357,7 +1404,7 @@ static jboolean nfcManager_initNativeStruc (JNIEnv* e, jobject o) gCachedNfcManagerNotifySWPReaderActivated = e->GetMethodID (cls.get(), "notifySWPReaderActivated", "()V"); -#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) gCachedNfcManagerNotifyETSIReaderModeStartConfig = e->GetMethodID (cls.get(), "notifyonETSIReaderModeStartConfig", "(I)V"); @@ -1492,7 +1539,9 @@ void nfaDeviceManagementCallback (UINT8 dmEvent, tNFA_DM_CBACK_DATA* eventData) ALOGE ("%s: NFA_DM_NFCC_TIMEOUT_EVT; abort", __FUNCTION__); else if (dmEvent == NFA_DM_NFCC_TRANSPORT_ERR_EVT) ALOGE ("%s: NFA_DM_NFCC_TRANSPORT_ERR_EVT; abort", __FUNCTION__); +#if (JCOP_WA_ENABLE == TRUE) NFA_HciW4eSETransaction_Complete(Wait); +#endif nativeNfcTag_abortWaits(); NfcTag::getInstance().abort (); sAbortConnlessWait = true; @@ -1618,12 +1667,30 @@ void nfaDeviceManagementCallback (UINT8 dmEvent, tNFA_DM_CBACK_DATA* eventData) *******************************************************************************/ static jboolean nfcManager_sendRawFrame (JNIEnv* e, jobject, jbyteArray data) { - ScopedByteArrayRO bytes(e, data); - uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0])); - size_t bufLen = bytes.size(); - tNFA_STATUS status = NFA_SendRawFrame (buf, bufLen, 0); - - return (status == NFA_STATUS_OK); +#if(NXP_NFCC_EMPTY_DATA_PACKET == TRUE) + size_t bufLen; + uint8_t* buf = NULL; + if(data != NULL) + { + ScopedByteArrayRO bytes(e, data); + buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0])); + bufLen = bytes.size(); + tNFA_STATUS status = NFA_SendRawFrame (buf, bufLen, 0); + return (status == NFA_STATUS_OK); + } + else + { + /*Fix for Felica on Host for Empty NCI packet handling*/ + bufLen = 0x00; + } + ALOGD("nfcManager_sendRawFrame"); +#else + ScopedByteArrayRO bytes(e, data); + uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0])); + size_t bufLen = bytes.size(); +#endif + tNFA_STATUS status = NFA_SendRawFrame (buf, bufLen, 0); + return (status == NFA_STATUS_OK); } /******************************************************************************* @@ -1917,7 +1984,7 @@ static jboolean nfcManager_doInitialize (JNIEnv* e, jobject o) #endif ALOGD ("%s: enter; ver=%s nfa=%s NCI_VERSION=0x%02X", __FUNCTION__, nfca_version_string, nfa_version_string, NCI_VERSION); - mwVer= NFA_GetMwVersion(); + mwVer= NFA_GetMwVersion(); ALOGD ("%s: MW Version: NFC_NCIHALx_AR%X.%x.%x.%x", __FUNCTION__, mwVer.validation, mwVer.android_version, mwVer.major_version,mwVer.minor_version); @@ -1933,7 +2000,7 @@ static jboolean nfcManager_doInitialize (JNIEnv* e, jobject o) sig.sa_flags = SA_SIGINFO; if(sigaction(SIG_NFC, &sig, NULL) < 0) { - ALOGE("Failed to register spi prio session signal handeler"); + ALOGE("Failed to register spi prio session signal handler"); } #endif if (sIsNfaEnabled) @@ -1948,12 +2015,13 @@ static jboolean nfcManager_doInitialize (JNIEnv* e, jobject o) nfcManager_doPartialDeInitialize(); } #endif +#if (JCOP_WA_ENABLE == TRUE) if ((signal(SIGABRT, sig_handler) == SIG_ERR) && (signal(SIGSEGV, sig_handler) == SIG_ERR)) { - ALOGE("Failed to register signal handeler"); + ALOGE("Failed to register signal handler"); } - +#endif powerSwitch.initialize (PowerSwitch::FULL_POWER); { @@ -2001,12 +2069,12 @@ if ((signal(SIGABRT, sig_handler) == SIG_ERR) && PeerToPeer::getInstance().handleNfcOnOff (true); #if(NXP_EXTNS == TRUE) - ALOGD("gSeDiscoverycount = %d", gSeDiscoverycount); + ALOGD("%s: gSeDiscoverycount=%d gActualSeCount=%d",__FUNCTION__, gSeDiscoverycount, gActualSeCount); if (NFA_STATUS_OK == GetSwpStausValue()) { if (gSeDiscoverycount < gActualSeCount) { - ALOGD("Wait for ESE to discover, gdisc_timeout = %d", gdisc_timeout); + ALOGD("Wait for SE to discover, gdisc_timeout = %d", gdisc_timeout); SyncEventGuard g(gNfceeDiscCbEvent); if(gNfceeDiscCbEvent.wait(gdisc_timeout) == false) { @@ -2015,19 +2083,19 @@ if ((signal(SIGABRT, sig_handler) == SIG_ERR) && } else { - ALOGD("All ESE are discovered "); + ALOGD("All SE are discovered "); } } #if(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE) - GetNxpNumValue (NAME_NXP_DUAL_UICC_ENABLE, (void*)&uicc_active_state, sizeof(uicc_active_state)); - if(uicc_active_state == 0x01) + GetNxpNumValue (NAME_NXP_DUAL_UICC_ENABLE, (void*)&dualUiccInfo.dualUiccEnable, sizeof(dualUiccInfo.dualUiccEnable)); + if(dualUiccInfo.dualUiccEnable == 0x01) { + checkforNfceeConfig(); dualUiccInfo.uiccActivStat = 0x00; if(SecureElement::getInstance().getEeStatus(UICC_HANDLE)!=NFC_NFCEE_STATUS_REMOVED) { dualUiccInfo.uiccActivStat = (sSelectedUicc & 0x0F); - getUiccContext(); } switchToUiccSlot = ((sSelectedUicc & 0x0F) == 0x01) ? 0x02 : 0x01; nfcManager_doSelectUicc(e,o,switchToUiccSlot); @@ -2040,6 +2108,8 @@ if ((signal(SIGABRT, sig_handler) == SIG_ERR) && else #endif checkforNfceeConfig(); + //Check for ETSI12 Configuration for SE s detected in the HCI Network + performNfceeETSI12Config(); #endif #if((NFC_NXP_ESE_VER == JCOP_VER_3_3)&& (NXP_EXTNS == TRUE)) if(isNxpConfigModified()) @@ -2438,7 +2508,14 @@ static void nfcManager_enableDiscovery (JNIEnv* e, jobject o, jint technologies_ } ALOGD ("%s: FRM Disable", __FUNCTION__); #endif +#if((NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_EXCLUSIVE_WIRED_MODE) ||(NXP_ESE_UICC_EXCLUSIVE_WIRED_MODE == TRUE)) + if(!SecureElement::getInstance().mlistenDisabled){ + NFA_EnableListening(); + } +#else NFA_EnableListening(); +#endif + #if(NXP_EXTNS == TRUE) discDuration = nat->discovery_duration; #endif @@ -2715,6 +2792,7 @@ void nfcManager_disableDiscovery (JNIEnv* e, jobject o) #endif //PeerToPeer::getInstance().setP2pListenMask(p2p_listen_mask & 0x05); //PeerToPeer::getInstance().enableP2pListening (true); + PeerToPeer::getInstance().enableP2pListening (false); startRfDiscovery (true); } @@ -2959,10 +3037,14 @@ static jboolean nfcManager_doDeinitialize (JNIEnv*, jobject) ALOGD ("%s: enter", __FUNCTION__); sIsDisabling = true; #if(NXP_EXTNS == TRUE) +#if (JCOP_WA_ENABLE == TRUE) rfActivation = false; #endif +#endif doDwpChannel_ForceExit(); +#if (JCOP_WA_ENABLE == TRUE) NFA_HciW4eSETransaction_Complete(Wait); +#endif pn544InteropAbortNow (); RoutingManager::getInstance().onNfccShutdown(); @@ -2975,10 +3057,18 @@ static jboolean nfcManager_doDeinitialize (JNIEnv*, jobject) if (sIsNfaEnabled) { - stat = SetVenConfigValue(NFC_MODE_OFF); - if (stat != NFA_STATUS_OK) + /* + During device Power-Off while Nfc-On, Nfc mode will be NFC_MODE_ON + NFC_MODE_OFF indicates Nfc is turning off and only in this case reset the venConfigValue + */ + if(gGeneralPowershutDown == NFC_MODE_OFF) { - ALOGE ("%s: fail enable SetVenConfigValue; error=0x%X", __FUNCTION__, stat); + stat = SetVenConfigValue(NFC_MODE_OFF); + + if (stat != NFA_STATUS_OK) + { + ALOGE ("%s: fail enable SetVenConfigValue; error=0x%X", __FUNCTION__, stat); + } } SyncEventGuard guard (sNfaDisableEvent); EXTNS_Close (); @@ -4258,8 +4348,11 @@ static int nfcManager_doSelectUicc(JNIEnv* e, jobject o, jint uiccSlot) bitVal = ((0x10) | uiccSlot); + getUiccContext(); + if((dualUiccInfo.sUicc1CntxLen !=0)||(dualUiccInfo.sUicc2CntxLen !=0)) { + if((bitVal == 0x11)&&(dualUiccInfo.sUicc1CntxLen !=0)) { ALOGD ("%s : update uicc1 context information ", __FUNCTION__); @@ -4315,7 +4408,7 @@ static int nfcManager_doSelectUicc(JNIEnv* e, jobject o, jint uiccSlot) { SyncEventGuard guard (sNfceeHciCbDisableEvent); NFA_EE_HCI_Control(false); - sNfceeHciCbDisableEvent.wait(); + sNfceeHciCbDisableEvent.wait(500); } /*Reset Nfcc*/ @@ -4324,7 +4417,7 @@ static int nfcManager_doSelectUicc(JNIEnv* e, jobject o, jint uiccSlot) { SyncEventGuard guard (sNfceeHciCbEnableEvent); NFA_EE_HCI_Control(true); - sNfceeHciCbEnableEvent.wait (); + sNfceeHciCbEnableEvent.wait (500); } { @@ -4337,22 +4430,24 @@ static int nfcManager_doSelectUicc(JNIEnv* e, jobject o, jint uiccSlot) } ALOGD("%s : gSeDiscoverycount = %d", __FUNCTION__ , gSeDiscoverycount); - /*Get the SWP1 and SWP2 lines status*/ - if (NFA_STATUS_OK == GetSwpStausValue()) { - /*The SWP lines enabled and SE's discovered*/ - if (gSeDiscoverycount < gActualSeCount) + SyncEventGuard g(gNfceeDiscCbEvent); + /*Get the SWP1 and SWP2 lines status*/ + if (NFA_STATUS_OK == GetSwpStausValue()) { - ALOGD("%s : Wait for ESE to discover, gdisc_timeout = %d", __FUNCTION__, gdisc_timeout); - SyncEventGuard g(gNfceeDiscCbEvent); - if(gNfceeDiscCbEvent.wait(gdisc_timeout) == false) + /*The SWP lines enabled and SE's discovered*/ + if (gSeDiscoverycount < gActualSeCount) { - ALOGE ("%s: timeout waiting for nfcee dis event", __FUNCTION__); + ALOGD("%s : Wait for ESE to discover, gdisc_timeout = %d", __FUNCTION__, gdisc_timeout); + if(gNfceeDiscCbEvent.wait(gdisc_timeout) == false) + { + ALOGE ("%s: timeout waiting for nfcee dis event", __FUNCTION__); + } + } + else + { + ALOGD("%s : All ESE are discovered ", __FUNCTION__); } - } - else - { - ALOGD("%s : All ESE are discovered ", __FUNCTION__); } } /*Get the eSE and UICC parameters for RF*/ @@ -4967,6 +5062,7 @@ void DWPChannel_init(IChannel_t *DWP) DWP->close = close; DWP->transceive = transceive; DWP->doeSE_Reset = doeSE_Reset; + DWP->doeSE_JcopDownLoadReset = doeSE_JcopDownLoadReset; } #endif /******************************************************************************* @@ -5064,12 +5160,12 @@ static void nfcManager_doSetNfcMode(JNIEnv *e, jobject o, jint nfcMode) gGeneralPowershutDown = nfcMode; } #endif - +#if (JCOP_WA_ENABLE == TRUE) bool isNfcInitializationDone() { return sIsNfaEnabled; } - +#endif /******************************************************************************* ** ** Function: StoreScreenState @@ -5101,7 +5197,7 @@ int getScreenState() return screenstate; } -#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) /******************************************************************************* ** ** Function: isp2pActivated @@ -5253,16 +5349,17 @@ static void nfcManager_doSetScreenOrPowerState (JNIEnv* e, jobject o, jint state { if(sIsNfaEnabled) { - nfcManager_doSetNfcMode(e , o, NFC_MODE_ON); + nfcManager_doSetNfcMode(e , o, NFC_MODE_ON); //POWER_OFF NFC_ON } else { - nfcManager_doSetNfcMode(e , o, NFC_MODE_OFF); + nfcManager_doSetNfcMode(e , o, NFC_MODE_OFF); //POWER_OFF NFC_OFF } } else ALOGE ("%s: unknown screen or power state. state=%d", __FUNCTION__, state); } + #endif /******************************************************************************* ** @@ -5509,7 +5606,7 @@ void checkforTranscation(UINT8 connEvent, void* eventData) && eventDM_Conn_data->rf_field.rf_field_status == 0) { ALOGD("start_timer"); -#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)) +#if(NFC_NXP_CHIP_TYPE != PN547C2) set_AGC_process_state(false); #endif transaction_data.current_transcation_state = NFA_TRANS_DM_RF_FIELD_EVT_OFF; @@ -5519,7 +5616,7 @@ void checkforTranscation(UINT8 connEvent, void* eventData) transaction_data.current_transcation_state == NFA_TRANS_DM_RF_FIELD_EVT_OFF && eventDM_Conn_data->rf_field.rf_field_status == 1) { -#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)) +#if(NFC_NXP_CHIP_TYPE != PN547C2) nfcManagerEnableAGCDebug(connEvent); #endif transaction_data.current_transcation_state = NFA_TRANS_DM_RF_FIELD_EVT_ON; @@ -5533,7 +5630,7 @@ void checkforTranscation(UINT8 connEvent, void* eventData) eventDM_Conn_data->rf_field.rf_field_status == 0) { ALOGD("Transcation is done"); -#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)) +#if(NFC_NXP_CHIP_TYPE != PN547C2) set_AGC_process_state(false); #endif transaction_data.current_transcation_state = NFA_TRANS_DM_RF_TRANS_PROGRESS; @@ -5571,7 +5668,7 @@ void *enableThread(void *arg) ALOGD ("%s: enter", __FUNCTION__); char last_request = get_last_request(); eScreenState_t last_screen_state_request = get_lastScreenStateRequest(); -#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)) +#if(NFC_NXP_CHIP_TYPE != PN547C2) set_AGC_process_state(false); #endif set_transcation_stat(false); @@ -5625,7 +5722,7 @@ void *enableThread(void *arg) screen_lock_flag = false; disable_discovery = false; memset(&transaction_data, 0x00, sizeof(Transcation_Check_t)); -#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)) +#if(NFC_NXP_CHIP_TYPE != PN547C2) memset(&menableAGC_debug_t, 0x00, sizeof(enableAGC_debug_t)); #endif TheEnd: @@ -5633,7 +5730,7 @@ TheEnd: pthread_exit(NULL); return NULL; } - +#if (JCOP_WA_ENABLE == TRUE) /******************************************************************************* ** ** Function sig_handler @@ -5653,6 +5750,9 @@ void sig_handler(int signo) break; case SIGABRT: ALOGE("received SIGABRT\n"); +#if((NXP_EXTNS == TRUE) && (NXP_NFCC_MW_RCVRY_BLK_FW_DNLD == TRUE)) + NFA_MW_Fwdnlwd_Recovery(true); +#endif NFA_HciW4eSETransaction_Complete(Wait); break; case SIGSEGV: @@ -5663,6 +5763,7 @@ void sig_handler(int signo) break; } } +#endif /******************************************************************************* ** @@ -5829,7 +5930,15 @@ static void nfcManager_setProvisionMode(JNIEnv* e, jobject o, jboolean provision **********************************************************************************/ void checkforNfceeBuffer() { -int i, count = 0; + int i, count = 0; +#if(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE) +/* unsigned long uicc_active_state = 0; + if(!GetNxpNumValue (NAME_NXP_DUAL_UICC_ENABLE, (void*)&uicc_active_state, sizeof(uicc_active_state))) + { + ALOGE ("NXP_DUAL_UICC_ENABLE Not found taking default value 0x00"); + uicc_active_state = 0x00; + }*/ +#endif for(i=4;i<12;i++) { @@ -5838,9 +5947,40 @@ int i, count = 0; } if(count >= 8) + { +#if(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE) + /*If session ID received all 0xff for UICC and dual UICC feature is enabled then + * clear the corresponding buffer (invalid session ID) + * */ + if((sConfig[1] == 0xA0) && (sConfig[2] == 0xEA) && + (dualUiccInfo.dualUiccEnable == 0x01)) + { + if(sSelectedUicc == 0x01) + { + memset(dualUiccInfo.sUicc1SessionId,0x00,sizeof(dualUiccInfo.sUicc1SessionId)); + dualUiccInfo.sUicc1SessionIdLen = 0; + } + else + { + memset(dualUiccInfo.sUicc2SessionId,0x00,sizeof(dualUiccInfo.sUicc2SessionId)); + dualUiccInfo.sUicc2SessionIdLen = 0; + } + } +#endif sNfceeConfigured = 1; + } else - sNfceeConfigured = 0; + { +#if(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE) + if((sConfig[1] == 0xA0) && (sConfig[2] == 0xEA) && + (dualUiccInfo.dualUiccEnable == 0x01)) + { + sNfceeConfigured = getUiccSession(); + } + else +#endif + sNfceeConfigured = 0; + } memset (sConfig, 0, sizeof (sConfig)); @@ -5889,7 +6029,21 @@ void checkforNfceeConfig() uicc_flag = 0x01; ALOGD("uicc_flag SET"); } - +#if(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE) + else if (dualUiccInfo.dualUiccEnable == 0x01) + { + if(sSelectedUicc == 0x01) + { + memset(dualUiccInfo.sUicc1SessionId,0x00,sizeof(dualUiccInfo.sUicc1SessionId)); + dualUiccInfo.sUicc1SessionIdLen = 0; + } + else + { + memset(dualUiccInfo.sUicc2SessionId,0x00,sizeof(dualUiccInfo.sUicc2SessionId)); + dualUiccInfo.sUicc2SessionIdLen = 0; + } + } +#endif if((ese_flag == 0x01)||(uicc_flag == 0x01)) { @@ -5929,7 +6083,6 @@ void checkforNfceeConfig() retry_cnt=0; #if(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE) sCheckNfceeFlag = 0; - getUiccContext(); #endif } @@ -5965,7 +6118,9 @@ void checkforNfceeConfig() retry_cnt=0; } } +#if (JCOP_WA_ENABLE == TRUE) RoutingManager::getInstance().handleSERemovedNtf(); +#endif sCheckNfceeFlag = 0; } #endif @@ -5980,6 +6135,59 @@ static void nfaNxpSelfTestNtfTimerCb (union sigval) SetCbStatus(NFA_STATUS_FAILED); } +/********************************************************************************** + ** + ** Function: performNfceeETSI12Config + ** + ** Description: checking for Nfcee ETSI 12 Compliancy and configure if compliant + ** + ** Returns: None . + ** + **********************************************************************************/ +void performNfceeETSI12Config() +{ + UINT8 num_nfcee_present = 0; + UINT8 count =0; + bool status; + + ALOGD ("%s", __FUNCTION__); + + ALOGD("Sending Admin command "); + status = SecureElement::getInstance().getNfceeHostTypeList(); + if(status == TRUE) + { + SyncEventGuard guard (SecureElement::getInstance().mNfceeInitCbEvent); + if(SecureElement::getInstance().mNfceeInitCbEvent.wait(2000) == false) + { + ALOGE ("%s: timeout waiting for Get Host Type List event", __FUNCTION__); + } + } + + num_nfcee_present = SecureElement::getInstance().mHostsPresent; + ALOGD("num_nfcee_present = %d",num_nfcee_present); + + if(num_nfcee_present > 0) + { + SecureElement::getInstance().SecEle_Modeset(0x01); + for(count = 0; count< num_nfcee_present ; count++) + { + status = SecureElement::getInstance().configureNfceeETSI12(SecureElement::getInstance().mHostsId[count]); + if(status == TRUE) + { + SyncEventGuard guard (SecureElement::getInstance().mNfceeInitCbEvent); + if(SecureElement::getInstance().mNfceeInitCbEvent.wait(4000) == false) + { + ALOGE ("%s: timeout waiting for Nfcee Init event", __FUNCTION__); + } + } + } + } + else + { + ALOGD("No ETS12 Compliant Host in the network!!!"); + } + +} #if(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE) /********************************************************************************** ** @@ -6006,30 +6214,33 @@ static void getUiccContext() android::sNfaGetConfigEvent.wait(); } - ALOGD ("%s: save UICC context Info : Len = %d", __FUNCTION__,sCurrentConfigLen); + ALOGD ("%s: UICC context Info : Len = %x", __FUNCTION__,sCurrentConfigLen); /*If the session ID is changed or uicc changed*/ + if((dualUiccInfo.sUicc1CntxLen != 0)&&(sSelectedUicc == 0x01)) { - for(i= 5 ; i < 13; i++) + for(i= 0 ; i < dualUiccInfo.sUicc1CntxLen; i++) { - if(sConfig[i] != dualUiccInfo.sUicc1Cntx[1]) + if(sConfig[i] != dualUiccInfo.sUicc1Cntx[i]) break; } - if(i != 13) + if(i != dualUiccInfo.sUicc1CntxLen) { + ALOGD ("%s: copying UICC1 info", __FUNCTION__); memcpy(dualUiccInfo.sUicc1Cntx, sConfig, sCurrentConfigLen); } } /*If the session ID is changed or uicc changed*/ if((dualUiccInfo.sUicc2CntxLen != 0)&&(sSelectedUicc == 0x02)) { - for(i= 5 ; i < 13; i++) + for(i= 0 ; i < dualUiccInfo.sUicc2CntxLen; i++) { - if(sConfig[i] != dualUiccInfo.sUicc2Cntx[1]) + if(sConfig[i] != dualUiccInfo.sUicc2Cntx[i]) break; } - if(i != 13) + if(i != dualUiccInfo.sUicc1CntxLen) { + ALOGD ("%s: copying UICC2 info", __FUNCTION__); memcpy(dualUiccInfo.sUicc2Cntx, sConfig, sCurrentConfigLen); } } @@ -6093,6 +6304,84 @@ static void getUiccContext() /********************************************************************************** ** + ** Function: getUiccSession + ** + ** Description: Read and store UICC session values + ** + ** Returns: UICC Configured status + ** 1 : failed + ** 0 : success + ** + **********************************************************************************/ +static int getUiccSession() +{ + ALOGD ("%s: Enter", __FUNCTION__); + + int cmpStat = 0, sUiccConfigured = 1; + /*techInfo will be set if any DISCOVERY_REQ_NTF is received for current UICC + *It will be used to validate received session id belongs to current selected UICC or not + * */ + bool techInfo = SecureElement::getInstance().isTeckInfoReceived (UICC_HANDLE); + ALOGD ("%s: techInfo 0x%02x", __FUNCTION__,techInfo); + + /* sConfig will have session ID received + * If received different from previous UICC save it in corresponding UICC buffer + * If same, reset the UICC buffer + * */ + if(sSelectedUicc == 0x01) + { + if(dualUiccInfo.sUicc2SessionIdLen != 0) + { + cmpStat = memcmp (sConfig + 4, dualUiccInfo.sUicc2SessionId, dualUiccInfo.sUicc2SessionIdLen); + if((cmpStat == 0)||(!techInfo)) + { + memset(dualUiccInfo.sUicc1SessionId,0x00,sizeof(dualUiccInfo.sUicc1SessionId)); + dualUiccInfo.sUicc1SessionIdLen = 0; + sUiccConfigured = 1; + } + else + { + memcpy(dualUiccInfo.sUicc1SessionId, sConfig+4, 8); + dualUiccInfo.sUicc1SessionIdLen = 8; + sUiccConfigured = 0; + } + } + else if(techInfo) + { + memcpy(dualUiccInfo.sUicc1SessionId, sConfig+4, 8); + dualUiccInfo.sUicc1SessionIdLen = 8; + sUiccConfigured = 0; + } + } + else if(sSelectedUicc == 0x02) + { + if(dualUiccInfo.sUicc1SessionIdLen != 0) + { + cmpStat = memcmp (sConfig + 4, dualUiccInfo.sUicc1SessionId, dualUiccInfo.sUicc1SessionIdLen); + if((cmpStat == 0)||(!techInfo)) + { + memset(dualUiccInfo.sUicc2SessionId,0x00,sizeof(dualUiccInfo.sUicc2SessionId)); + dualUiccInfo.sUicc2SessionIdLen = 0; + sUiccConfigured = 1; + } + else + { + memcpy(dualUiccInfo.sUicc2SessionId, sConfig+4, 8); + dualUiccInfo.sUicc2SessionIdLen = 8; + sUiccConfigured = 0; + } + } + else if(techInfo) + { + memcpy(dualUiccInfo.sUicc2SessionId, sConfig+4, 8); + dualUiccInfo.sUicc2SessionIdLen = 8; + sUiccConfigured = 0; + } + } + return sUiccConfigured; +} +/********************************************************************************** + ** ** Function: notifyUiccEvent ** ** Description: Notifies UICC event sto Service @@ -6141,7 +6430,7 @@ static int nfcManager_staticDualUicc_Precondition(int uiccSlot) } else { - ALOGE ("NXP_DUAL_UICC_ENABLE Not found taking default value 0x01"); + ALOGE ("NXP_DUAL_UICC_ENABLE Not found taking default value 0x00"); uicc_active_state = 0x00; } @@ -6244,7 +6533,7 @@ static void nfcManager_doPrbsOn(JNIEnv* e, jobject o, jint prbs, jint hw_prbs, j //Technology to stream 0x00:TypeA 0x01:TypeB 0x02:TypeF //Bitrate 0x00:106kbps 0x01:212kbps 0x02:424kbps 0x03:848kbps //prbs and hw_prbs 0x00 or 0x01 two extra parameters included in case of pn548AD -#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)) +#if(NFC_NXP_CHIP_TYPE != PN547C2) UINT8 param[4]; memset(param, 0x00, sizeof(param)); param[0] = prbs; @@ -6644,7 +6933,7 @@ tNFA_STATUS getUICC_RF_Param_SetSWPBitRate() return status; } -#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)) +#if(NFC_NXP_CHIP_TYPE != PN547C2) /******************************************************************************* ** ** Function: nfcManagerEnableAGCDebug diff --git a/nci/jni/NativeNfcTag.cpp b/nci/jni/NativeNfcTag.cpp index 69958b9e..6dcde908 100644 --- a/nci/jni/NativeNfcTag.cpp +++ b/nci/jni/NativeNfcTag.cpp @@ -95,7 +95,7 @@ namespace android // Pre-defined tag type values. These must match the values in // framework Ndef.java for Google public NFC API. -#define NDEF_UNKNOWN_TYPE -1 +#define NDEF_UNKNOWN_TYPE (-1) #define NDEF_TYPE1_TAG 1 #define NDEF_TYPE2_TAG 2 #define NDEF_TYPE3_TAG 3 diff --git a/nci/jni/NativeNxpFeature.cpp b/nci/jni/NativeNxpFeature.cpp index 405d0e98..c3a00451 100644 --- a/nci/jni/NativeNxpFeature.cpp +++ b/nci/jni/NativeNxpFeature.cpp @@ -182,7 +182,7 @@ static void NxpResponse_SwitchUICC_Cb(UINT8 event, UINT16 param_len, UINT8 *p_pa gnxpfeature_conf.NxpFeatureConfigEvt.notifyOne (); } #endif -#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)) +#if(NFC_NXP_CHIP_TYPE != PN547C2) /******************************************************************************* ** ** Function: NxpResponse_EnableAGCDebug_Cb() @@ -421,7 +421,7 @@ tNFA_STATUS Nxp_SelfTest(uint8_t testcase, uint8_t* param) { tNFA_STATUS status = NFA_STATUS_FAILED; uint8_t swp_test[] ={0x2F, 0x3E, 0x01, 0x00}; //SWP SelfTest -#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)) +#if(NFC_NXP_CHIP_TYPE != PN547C2) uint8_t prbs_test[] ={0x2F, 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF}; //PRBS SelfTest uint8_t cmd_buf[9] = {0,}; #else @@ -565,6 +565,14 @@ static void NxpResponse_GetSwpStausValueCb(UINT8 event, UINT16 param_len, UINT8 ALOGD("SWP2 Interface is enabled"); gActualSeCount++; } +#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE) + if (p_param[16] != 0x00) + { + ALOGD("SWP1A Interface is enabled"); + gActualSeCount++; + } + +#endif } else { @@ -588,7 +596,11 @@ tNFA_STATUS GetSwpStausValue(void) { tNFA_STATUS status = NFA_STATUS_FAILED; gActualSeCount = 1; /* default ese present */ +#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE) + uint8_t cmd_buf[] = {0x20, 0x03, 0x07, 0x03, 0xA0, 0xEC, 0xA0, 0xED, 0xA0, 0xD4}; +#else uint8_t cmd_buf[] = {0x20, 0x03, 0x05, 0x02, 0xA0, 0xEC, 0xA0, 0xED}; +#endif ALOGD("%s: enter", __FUNCTION__); SetCbStatus(NFA_STATUS_FAILED); @@ -668,6 +680,7 @@ tNFA_STATUS SetHfoConfigValue(void) } #endif +#if (JCOP_WA_ENABLE == TRUE) /******************************************************************************* ** ** Function: ResetEseSession @@ -704,6 +717,7 @@ tNFA_STATUS ResetEseSession() ALOGD("%s: exit", __FUNCTION__); return status; } +#endif /******************************************************************************* ** ** Function: SetUICC_SWPBitRate() diff --git a/nci/jni/NativeSecureElement.cpp b/nci/jni/NativeSecureElement.cpp index f1659e53..943ef377 100644 --- a/nci/jni/NativeSecureElement.cpp +++ b/nci/jni/NativeSecureElement.cpp @@ -39,9 +39,13 @@ #include "NfcTag.h" #include "RoutingManager.h" #include <ScopedPrimitiveArray.h> +#include "phNxpConfig.h" extern bool hold_the_transceive; extern int dual_mode_current_state; +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) +extern bool ceTransactionPending; +#endif namespace android { @@ -72,7 +76,7 @@ static const int EE_ERROR_INIT = -3; static const int EE_ERROR_LISTEN_MODE = -4; static const int EE_ERROR_EXT_FIELD = -5; static const int EE_ERROR_NFC_DISABLED = -6; -static bool is_wired_mode_open = false; +bool is_wired_mode_open = false; /******************************************************************************* ** ** Function: nativeNfcSecureElement_doOpenSecureElementConnection @@ -84,7 +88,11 @@ static bool is_wired_mode_open = false; ** Returns: Handle of secure element. values < 0 represent failure. ** *******************************************************************************/ +#if (NXP_EXTNS == TRUE) +static jint nativeNfcSecureElement_doOpenSecureElementConnection (JNIEnv*, jobject,jint seId) +#else static jint nativeNfcSecureElement_doOpenSecureElementConnection (JNIEnv*, jobject) +#endif { ALOGD("%s: enter", __FUNCTION__); bool stat = false; @@ -95,17 +103,93 @@ static jint nativeNfcSecureElement_doOpenSecureElementConnection (JNIEnv*, jobje p61_access_state_t p61_current_state = P61_STATE_INVALID; #endif SecureElement &se = SecureElement::getInstance(); - if (se.isBusy()) - { +#if ((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) +#if(NXP_ESE_WIRED_MODE_PRIO != TRUE) + if(se.isBusy()) { goto TheEnd; } -#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) - if((RoutingManager::getInstance().is_ee_recovery_ongoing())) +#endif + se.mIsExclusiveWiredMode = false; // to ctlr exclusive wired mode + if(seId == 0xF4) + { + if(se.mIsWiredModeOpen) + { + goto TheEnd; + } +#if (NXP_ESE_UICC_EXCLUSIVE_WIRED_MODE == true) + se.mIsExclusiveWiredMode = true; +#endif + stat = se.checkForWiredModeAccess(); + if(stat == false) + { + ALOGD("Denying SE open due to SE listen mode active"); + secElemHandle = EE_ERROR_LISTEN_MODE; + goto TheEnd; + } + + ALOGD("%s: Activating UICC Wired Mode=0x%X", __FUNCTION__, seId); + stat = se.activate(seId); + ALOGD("%s: Check UICC activation status stat=%X", __FUNCTION__, stat); + if (stat) + { + //establish a pipe to UICC + ALOGD("%s: Creatting a pipe to UICC!", __FUNCTION__); + stat = se.connectEE(); + if (stat) + { + secElemHandle = se.mActiveEeHandle; + } + else + { + se.deactivate (0); + } + } + if ((!stat) && (! PowerSwitch::getInstance ().setModeOff (PowerSwitch::SE_CONNECTED))) + { + PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER); + } + se.mIsWiredModeOpen = true; +#if(NXP_ESE_UICC_EXCLUSIVE_WIRED_MODE == TRUE) + if (isDiscoveryStarted()) + { + // Stop RF Discovery if we were polling + startRfDiscovery (false); + status = NFA_DisableListening(); + if(status == NFCSTATUS_OK) + { + startRfDiscovery (true); + } + } + else + { + status = NFA_DisableListening(); + } + se.mlistenDisabled = true; +#endif + goto TheEnd; + } +#if(NXP_ESE_WIRED_MODE_PRIO == TRUE) + if((se.mIsWiredModeOpen)&&(se.mActiveEeHandle == 0x402)) + { + stat = SecureElement::getInstance().disconnectEE (se.mActiveEeHandle); + se.mActiveEeHandle = NFA_HANDLE_INVALID; + se.mIsWiredModeOpen = false; + } +#endif + +#if(NFC_NXP_CHIP_TYPE != PN547C2) +#if (JCOP_WA_ENABLE == TRUE) +if((RoutingManager::getInstance().is_ee_recovery_ongoing())) { ALOGD ("ee recovery ongoing!!!"); - goto TheEnd; + SyncEventGuard guard (SecureElement::getInstance().mEEdatapacketEvent); + SecureElement::getInstance().mEEdatapacketEvent.wait(); } - stat = se.isWiredModeAllowedInRfState(); +#endif +#if(NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_EXCLUSIVE_WIRED_MODE) + se.mIsExclusiveWiredMode = true; +#endif + stat = se.checkForWiredModeAccess(); if(stat == false) { ALOGD("Denying SE open due to SE listen mode active"); @@ -126,7 +210,6 @@ static jint nativeNfcSecureElement_doOpenSecureElementConnection (JNIEnv*, jobje } #endif -#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) ret_val = NFC_GetP61Status ((void *)&p61_current_state); if (ret_val < 0) { @@ -134,6 +217,7 @@ static jint nativeNfcSecureElement_doOpenSecureElementConnection (JNIEnv*, jobje goto TheEnd; } ALOGD("P61 Status is: %x", p61_current_state); + #if(NFC_NXP_ESE_VER == JCOP_VER_3_1) if (!(p61_current_state & P61_STATE_SPI) && !(p61_current_state & P61_STATE_SPI_PRIO)) { @@ -163,8 +247,25 @@ static jint nativeNfcSecureElement_doOpenSecureElementConnection (JNIEnv*, jobje } else { - is_wired_mode_open = true; + se.mIsWiredModeOpen = true; ALOGD("SE Access granted"); +#if(NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_EXCLUSIVE_WIRED_MODE) + if (isDiscoveryStarted()) + { + // Stop RF Discovery if we were polling + startRfDiscovery (false); + status = NFA_DisableListening(); + if(status == NFCSTATUS_OK) + { + startRfDiscovery (true); + } + } + else + { + status = NFA_DisableListening(); + } + se.mlistenDisabled = true; +#endif } } #if(NFC_NXP_ESE_VER == JCOP_VER_3_1) @@ -221,7 +322,13 @@ static jint nativeNfcSecureElement_doOpenSecureElementConnection (JNIEnv*, jobje se.deactivate (0); } } - +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) + if(is_wired_mode_open) + { + se.enablePassiveListen(0x00); + se.meseUiccConcurrentAccess = true; + } +#endif //if code fails to connect to the secure element, and nothing is active, then //tell the controller to power down if ((!stat) && (! PowerSwitch::getInstance ().setModeOff (PowerSwitch::SE_CONNECTED))) @@ -258,11 +365,41 @@ static jboolean nativeNfcSecureElement_doDisconnectSecureElementConnection (JNIE SecureElement &se = SecureElement::getInstance(); se.NfccStandByOperation(STANDBY_TIMER_STOP); #endif - //Send the EVT_END_OF_APDU_TRANSFER event at the end of wired mode session. - stat = SecureElement::getInstance().sendEvent(SecureElement::EVT_END_OF_APDU_TRANSFER); - if(stat == false) +#if(NXP_EXTNS == TRUE) + if(handle == 0x402) + { + stat = SecureElement::getInstance().disconnectEE (handle); +#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) + se.mIsWiredModeOpen = false; +#endif +#if( (NXP_ESE_UICC_EXCLUSIVE_WIRED_MODE == TRUE) && (NFC_NXP_ESE == TRUE) && (NXP_EXTNS == TRUE) ) + se.mIsExclusiveWiredMode = false; + if(se.mlistenDisabled) + { + if (isDiscoveryStarted()) + { + // Stop RF Discovery if we were polling + startRfDiscovery (false); + status = NFA_EnableListening(); + startRfDiscovery (true); + } + else + { + status = NFA_EnableListening(); + } + se.mlistenDisabled = false; + } +#endif goto TheEnd; + } +#endif + +#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) + //Send the EVT_END_OF_APDU_TRANSFER event at the end of wired mode session. + se.NfccStandByOperation(STANDBY_MODE_ON); +#endif + #if 0 { sRfEnabled = isDiscoveryStarted(); @@ -310,7 +447,29 @@ static jboolean nativeNfcSecureElement_doDisconnectSecureElementConnection (JNIE ALOGD("Denying SE close due to SE is not being released by Pn54x driver"); stat = false; } - is_wired_mode_open = false; +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) + se.enablePassiveListen(0x01); + SecureElement::getInstance().mPassiveListenTimer.kill(); + se.meseUiccConcurrentAccess = false; +#endif + se.mIsWiredModeOpen = false; +#if(NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_EXCLUSIVE_WIRED_MODE) + if(se.mlistenDisabled) + { + if (isDiscoveryStarted()) + { + // Stop RF Discovery if we were polling + startRfDiscovery (false); + status = NFA_EnableListening(); + startRfDiscovery (true); + } + else + { + status = NFA_EnableListening(); + } + se.mlistenDisabled = false; + } +#endif } #endif TheEnd: @@ -360,29 +519,50 @@ static jboolean nativeNfcSecureElement_doResetSecureElement (JNIEnv*, jobject, j { bool stat = false; #if (NFC_NXP_ESE == TRUE) + tNFA_STATUS mstatus; SecureElement &se = SecureElement::getInstance(); + unsigned long num = 0; ALOGD("%s: enter; handle=0x%04x", __FUNCTION__, handle); - if(!is_wired_mode_open) + if(!se.mIsWiredModeOpen) { ALOGD("wired mode is not open"); return stat; } - - stat = se.SecEle_Modeset(0x00); - if (handle == 0x4C0) + if (GetNxpNumValue("NXP_ESE_POWER_DH_CONTROL", &num, sizeof(num))) { - if(checkP61Status()) - se.NfccStandByOperation(STANDBY_GPIO_LOW); + ALOGD("Power schemes enabled in config file is %ld", num); } - usleep(100 * 1000); - if (handle == 0x4C0) + +#if(NXP_ESE_RESET_METHOD == TRUE) + if((num == 2) && (se.isEtsi12ApduGatePresent())) + { + ALOGD("Power Scheme : Ext PMU"); + mstatus = se.SecElem_sendEvt_Abort(); + if(mstatus == NFA_STATUS_OK){ + stat = true; + } + else { + stat = false; + } + }else +#endif { - if(checkP61Status() && (is_wired_mode_open == true)) - se.NfccStandByOperation(STANDBY_GPIO_HIGH); + ALOGD("Power Scheme : Int PMU/Legacy"); + stat = se.SecEle_Modeset(0x00); + if (handle == 0x4C0) + { + if(checkP61Status()) + se.NfccStandByOperation(STANDBY_GPIO_LOW); + } + usleep(100 * 1000); + if (handle == 0x4C0) + { + if(checkP61Status() && (se.mIsWiredModeOpen == true)) + se.NfccStandByOperation(STANDBY_GPIO_HIGH); + } + stat = se.SecEle_Modeset(0x01); + usleep(2000 * 1000); } - stat = se.SecEle_Modeset(0x01); - usleep(2000 * 1000); - #endif ALOGD("%s: exit", __FUNCTION__); return stat ? JNI_TRUE : JNI_FALSE; @@ -450,9 +630,16 @@ static jbyteArray nativeNfcSecureElement_doTransceive (JNIEnv* e, jobject, jint //copy results back to java jbyteArray result = e->NewByteArray(recvBufferActualSize); if (result != NULL) - { + { e->SetByteArrayRegion(result, 0, recvBufferActualSize, (jbyte *) recvBuffer); - } + } +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) + if (ceTransactionPending) + { + ALOGD ("APDU Transceive CE wait"); + SecureElement::getInstance().startThread(0x01); + } +#endif ALOGD("%s: exit: recv len=%ld", __FUNCTION__, recvBufferActualSize); return result; #else @@ -468,7 +655,11 @@ static jbyteArray nativeNfcSecureElement_doTransceive (JNIEnv* e, jobject, jint *****************************************************************************/ static JNINativeMethod gMethods[] = { - {"doNativeOpenSecureElementConnection", "()I", (void *) nativeNfcSecureElement_doOpenSecureElementConnection}, +#if(NXP_EXTNS == TRUE) + {"doNativeOpenSecureElementConnection", "(I)I", (void *) nativeNfcSecureElement_doOpenSecureElementConnection}, +#else + {"doNativeOpenSecureElementConnection", "()I", (void *) nativeNfcSecureElement_doOpenSecureElementConnection}, +#endif {"doNativeDisconnectSecureElementConnection", "(I)Z", (void *) nativeNfcSecureElement_doDisconnectSecureElementConnection}, {"doNativeResetSecureElement", "(I)Z", (void *) nativeNfcSecureElement_doResetSecureElement}, {"doTransceive", "(I[B)[B", (void *) nativeNfcSecureElement_doTransceive}, diff --git a/nci/jni/NfcJniUtil.h b/nci/jni/NfcJniUtil.h index ad370dbb..884898c6 100644..100755 --- a/nci/jni/NfcJniUtil.h +++ b/nci/jni/NfcJniUtil.h @@ -68,14 +68,14 @@ /* Error codes */ -#define ERROR_BUFFER_TOO_SMALL -12 -#define ERROR_INSUFFICIENT_RESOURCES -9 +#define ERROR_BUFFER_TOO_SMALL (-12) +#define ERROR_INSUFFICIENT_RESOURCES (-9) /* Pre-defined tag type values. These must match the values in * Ndef.java in the framework. */ -#define NDEF_UNKNOWN_TYPE -1 +#define NDEF_UNKNOWN_TYPE (-1) #define NDEF_TYPE1_TAG 1 #define NDEF_TYPE2_TAG 2 #define NDEF_TYPE3_TAG 3 @@ -97,7 +97,7 @@ #define TARGET_TYPE_ISO14443_3A_3B 11 #endif /* Name strings for target types. These *must* match the values in TagTechnology.java */ -#define TARGET_TYPE_UNKNOWN -1 +#define TARGET_TYPE_UNKNOWN (-1) #define TARGET_TYPE_ISO14443_3A 1 #define TARGET_TYPE_ISO14443_3B 2 #define TARGET_TYPE_ISO14443_4 3 diff --git a/nci/jni/NfcTag.cpp b/nci/jni/NfcTag.cpp index fb874d13..4e5b192f 100644 --- a/nci/jni/NfcTag.cpp +++ b/nci/jni/NfcTag.cpp @@ -85,8 +85,8 @@ NfcTag::NfcTag () mLastKovioUidLen (0), mNdefDetectionTimedOut (false), mIsDynamicTagId (false), - mPresenceCheckAlgorithm (NFA_RW_PRES_CHK_DEFAULT), - mIsFelicaLite(false) + mIsFelicaLite(false), + mPresenceCheckAlgorithm (NFA_RW_PRES_CHK_DEFAULT) { memset (mTechList, 0, sizeof(mTechList)); memset (mTechHandles, 0, sizeof(mTechHandles)); diff --git a/nci/jni/NfcTag.h b/nci/jni/NfcTag.h index baf7e66d..e1d74f87 100644 --- a/nci/jni/NfcTag.h +++ b/nci/jni/NfcTag.h @@ -516,8 +516,9 @@ private: struct timespec mLastKovioTime; // time of last Kovio tag activation UINT8 mLastKovioUid[NFC_KOVIO_MAX_LEN]; // uid of last Kovio tag activated bool mIsDynamicTagId; // whether the tag has dynamic tag ID - tNFA_RW_PRES_CHK_OPTION mPresenceCheckAlgorithm; bool mIsFelicaLite; + tNFA_RW_PRES_CHK_OPTION mPresenceCheckAlgorithm; + /******************************************************************************* ** diff --git a/nci/jni/PeerToPeer.cpp b/nci/jni/PeerToPeer.cpp index cb952231..5f6a25f9 100644 --- a/nci/jni/PeerToPeer.cpp +++ b/nci/jni/PeerToPeer.cpp @@ -132,11 +132,13 @@ PeerToPeer& PeerToPeer::getInstance () *******************************************************************************/ void PeerToPeer::initialize () { - ALOGD ("PeerToPeer::initialize"); + static const char fn [] = "PeerToPeer::initialize"; unsigned long num = 0; + ALOGD ("%s: enter", fn); if (GetNumValue ("P2P_LISTEN_TECH_MASK", &num, sizeof (num))) mP2pListenTechMask = num; + ALOGD ("%s: exit", fn); } diff --git a/nci/jni/RoutingManager.cpp b/nci/jni/RoutingManager.cpp index 88b600c4..4aeffe8e 100644 --- a/nci/jni/RoutingManager.cpp +++ b/nci/jni/RoutingManager.cpp @@ -74,7 +74,7 @@ static UINT16 rdr_req_handling_timeout = 50; #if((NXP_EXTNS == TRUE) && (NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE)) static int mSetDefaulRouteParams; #endif -#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) Rdr_req_ntf_info_t swp_rdr_req_ntf_info; static IntervalTimer swp_rd_req_timer; #endif @@ -86,9 +86,14 @@ namespace android { extern void checkforTranscation(UINT8 connEvent, void* eventData ); #if (NXP_EXTNS == TRUE) +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) + extern bool is_wired_mode_open; +#endif extern UINT16 sRoutingBuffLen; extern bool rfActivation; +#if (JCOP_WA_ENABLE == TRUE) extern bool isNfcInitializationDone(); +#endif extern void startRfDiscovery (bool isStart); extern bool isDiscoveryStarted(); extern int getScreenState(); @@ -104,37 +109,33 @@ RoutingManager::RoutingManager () : mNativeData(NULL), mDefaultEe (NFA_HANDLE_INVALID), mHostListnTechMask (0), + mUiccListnTechMask (0), mFwdFuntnEnable (true), - mAddAid(1) + mAddAid(0) { static const char fn [] = "RoutingManager::RoutingManager()"; unsigned long num = 0; - + ALOGD ("%s:enter", fn); // Get the active SE if (GetNumValue("ACTIVE_SE", &num, sizeof(num))) mActiveSe = num; else mActiveSe = 0x00; - // Get the active SE for Nfc-F if (GetNumValue("ACTIVE_SE_NFCF", &num, sizeof(num))) mActiveSeNfcF = num; else mActiveSeNfcF = 0x00; - // Get the "default" route if (GetNumValue("DEFAULT_ISODEP_ROUTE", &num, sizeof(num))) mDefaultEe = num; else mDefaultEe = 0x00; - ALOGD("%s: default route is 0x%02X", fn, mDefaultEe); - // Get the "default" route for Nfc-F if (GetNumValue("DEFAULT_NFCF_ROUTE", &num, sizeof(num))) mDefaultEeNfcF = num; else mDefaultEeNfcF = 0x00; - // Get the default "off-host" route. This is hard-coded at the Java layer // but we can override it here to avoid forcing Java changes. if (GetNumValue("DEFAULT_OFFHOST_ROUTE", &num, sizeof(num))) @@ -145,14 +146,14 @@ RoutingManager::RoutingManager () mAidMatchingMode = num; else mAidMatchingMode = AID_MATCHING_EXACT_ONLY; - if (GetNxpNumValue("AID_MATCHING_PLATFORM", &num, sizeof(num))) mAidMatchingPlatform = num; else mAidMatchingPlatform = AID_MATCHING_L; - ALOGD("%s: mOffHostEe=0x%02X mAidMatchingMode=0x%2X", fn, mOffHostEe, mAidMatchingMode); - mSeTechMask = 0x00; + + mSeTechMask = 0x00; //unused mNfcFOnDhHandle = NFA_HANDLE_INVALID; + ALOGD ("%s:exit", fn); } @@ -162,10 +163,12 @@ void NfcID2_rmv_timoutHandler (union sigval); int RoutingManager::mChipId = 0; #if (NXP_EXTNS == TRUE) +#if (JCOP_WA_ENABLE == TRUE) bool recovery; #endif +#endif -#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) void reader_req_event_ntf (union sigval); #endif RoutingManager::~RoutingManager () @@ -178,53 +181,69 @@ bool RoutingManager::initialize (nfc_jni_native_data* native) static const char fn [] = "RoutingManager::initialize()"; unsigned long num = 0, tech = 0; mNativeData = native; - UINT8 mActualNumEe = SecureElement::MAX_NUM_EE; - tNFA_EE_INFO mEeInfo [mActualNumEe]; + UINT8 ActualNumEe = SecureElement::MAX_NUM_EE; + tNFA_EE_INFO mEeInfo [ActualNumEe]; + ALOGD ("%s: enter", fn); #if (NXP_EXTNS == TRUE) if ((GetNumValue(NAME_HOST_LISTEN_TECH_MASK, &tech, sizeof(tech)))) - { mHostListnTechMask = tech; - ALOGD ("%s:HOST_LISTEN_TECH_MASK = 0x%X;", __FUNCTION__, mHostListnTechMask); - } + else + mHostListnTechMask = 0x07; + + if ((GetNumValue(NAME_UICC_LISTEN_TECH_MASK, &tech, sizeof(tech)))) + mUiccListnTechMask = tech; + else + mUiccListnTechMask = 0x07; if ((GetNumValue(NAME_NXP_FWD_FUNCTIONALITY_ENABLE, &tech, sizeof(tech)))) - { mFwdFuntnEnable = tech; - ALOGE ("%s:NXP_FWD_FUNCTIONALITY_ENABLE=%d;", __FUNCTION__, mFwdFuntnEnable); - } + else + mFwdFuntnEnable = 0x01; if (GetNxpNumValue (NAME_NXP_DEFAULT_SE, (void*)&num, sizeof(num))) - { - ALOGD ("%d: nfcManager_GetDefaultSE", num); mDefaultEe = num; - } + else + mDefaultEe = 0x02; + if (GetNxpNumValue (NAME_NXP_ENABLE_ADD_AID, (void*)&num, sizeof(num))) - { - ALOGD ("%d: mAddAid", num); mAddAid = num; - } -#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) + else + mAddAid = 0x01; + +#if (NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) if (GetNxpNumValue (NAME_NXP_ESE_WIRED_PRT_MASK, (void*)&num, sizeof(num))) - { - ALOGD (" NAME_NXP_ESE_WIRED_PRT_MASK :%d", num); gEseVirtualWiredProtectMask = num; - } + else + gEseVirtualWiredProtectMask = 0x00; + if (GetNxpNumValue (NAME_NXP_UICC_WIRED_PRT_MASK, (void*)&num, sizeof(num))) - { - ALOGD ("%d: NAME_NXP_UICC_WIRED_PRT_MASK", num); gUICCVirtualWiredProtectMask = num; - } + else + gUICCVirtualWiredProtectMask = 0x00; + if (GetNxpNumValue (NAME_NXP_WIRED_MODE_RF_FIELD_ENABLE, (void*)&num, sizeof(num))) - { - ALOGD ("%d: NAME_NXP_WIRED_MODE_RF_FIELD_ENABLE", num); gWiredModeRfFieldEnable = num; - } + else + gWiredModeRfFieldEnable = 0x00; +#endif +#if(NXP_ESE_FELICA_CLT == TRUE) + if (GetNxpNumValue (NAME_DEFAULT_FELICA_CLT_ROUTE, (void*)&num, sizeof(num))) + mDefaultTechFSeID = ((num == 0x01)? 0x4C0 : ((num == 0x02)? 0x402 : 0x481)); + else + mDefaultTechFSeID = 0x402; + + if (GetNxpNumValue (NAME_DEFAULT_FELICA_CLT_PWR_STATE, (void*)&num, sizeof(num))) + mDefaultTechFPowerstate = num; + else + mDefaultTechFPowerstate = 0x1F; +#else + mDefaultTechFSeID = 0x402; + mDefaultTechFPowerstate = 0x1F; #endif #endif if ((GetNxpNumValue(NAME_NXP_NFC_CHIP, &num, sizeof(num)))) { - ALOGD ("%s:NXP_NFC_CHIP=0x0%lu;", __FUNCTION__, num); mChipId = num; } @@ -249,7 +268,7 @@ bool RoutingManager::initialize (nfc_jni_native_data* native) if (nfaStat != NFA_STATUS_OK) ALOGE ("Failed to register wildcard AID for DH"); // Tell the host-routing to only listen on Nfc-A/Nfc-B - nfaStat = NFA_CeSetIsoDepListenTech(mHostListnTechMask); + nfaStat = NFA_CeSetIsoDepListenTech(mHostListnTechMask & 0xB); if (nfaStat != NFA_STATUS_OK) ALOGE ("Failed to configure CE IsoDep technologies"); //setRouting(true); @@ -259,18 +278,19 @@ bool RoutingManager::initialize (nfc_jni_native_data* native) // setDefaultRouting(); #endif - if ((nfaStat = NFA_AllEeGetInfo (&mActualNumEe, mEeInfo)) != NFA_STATUS_OK) + if ((nfaStat = NFA_AllEeGetInfo (&ActualNumEe, mEeInfo)) != NFA_STATUS_OK) { ALOGE ("%s: fail get info; error=0x%X", fn, nfaStat); - mActualNumEe = 0; + ActualNumEe = 0; } else { - gSeDiscoverycount = mActualNumEe; + gSeDiscoverycount = ActualNumEe; + ALOGD ("%s:gSeDiscoverycount=0x%X;", __FUNCTION__, gSeDiscoverycount); #if 0 if(mChipId == 0x02 || mChipId == 0x04) { - for(int xx = 0; xx < mActualNumEe; xx++) + for(int xx = 0; xx < ActualNumEe; xx++) { ALOGE("xx=%d, ee_handle=0x0%x, status=0x0%x", xx, mEeInfo[xx].ee_handle,mEeInfo[xx].ee_status); if ((mEeInfo[xx].ee_handle == 0x4C0) && @@ -284,8 +304,7 @@ bool RoutingManager::initialize (nfc_jni_native_data* native) #endif } - ALOGD("gSeDiscoverycount = %d", gSeDiscoverycount); -#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if (NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) swp_rdr_req_ntf_info.mMutex.lock(); memset(&(swp_rdr_req_ntf_info.swp_rd_req_info),0x00,sizeof(rd_swp_req_t)); memset(&(swp_rdr_req_ntf_info.swp_rd_req_current_info),0x00,sizeof(rd_swp_req_t)); @@ -297,6 +316,10 @@ bool RoutingManager::initialize (nfc_jni_native_data* native) memset(&NfcID2_add_req,0x00,sizeof(NfcID2_add_req)); memset(&NfcId2_rmv_req,0x00,sizeof(NfcId2_rmv_req)); + + printMemberData(); + + ALOGD ("%s: exit", fn); return true; } @@ -579,864 +602,631 @@ void RoutingManager::setRouting(bool isHCEEnabled) bool RoutingManager::setDefaultRoute(const UINT8 defaultRoute, const UINT8 protoRoute, const UINT8 techRoute) { + static const char fn [] = "RoutingManager::setDefaultRoute"; + tNFA_STATUS nfaStat = NFA_STATUS_FAILED; + tNFA_HANDLE preferredHandle = ROUTE_LOC_UICC1_ID; - tNFA_STATUS nfaStat; - static const char fn [] = "RoutingManager::setDefaultRoute"; /*commented to eliminate unused variable warning*/ - unsigned long uiccListenTech = 0,check_default_proto_se_id_req = 0; - tNFA_HANDLE defaultHandle = NFA_HANDLE_INVALID; - tNFA_HANDLE ActDevHandle = NFA_HANDLE_INVALID; - tNFA_HANDLE preferred_defaultHandle = 0x402; - UINT8 isDefaultProtoSeIDPresent = 0; + ALOGD ("%s: enter; defaultRoute:0x%2X protoRoute:0x%2X TechRoute:0x%2X HostListenMask:0x%X", fn, defaultRoute, protoRoute, techRoute, mHostListnTechMask); - ALOGD ("%s: enter", fn); +#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE) + mDefaultIso7816SeID = ((((defaultRoute & 0xE0) >> 5) == 0x00) ? ROUTE_LOC_HOST_ID : ((((defaultRoute & 0xE0)>>5 )== 0x01 ) ? ROUTE_LOC_ESE_ID : ((((defaultRoute & 0xE0)>>5 )== 0x02 ) ? ROUTE_LOC_UICC1_ID : ROUTE_LOC_UICC2_ID))); +#else + mDefaultIso7816SeID = (((defaultRoute & 0x60) >> 5) == 0x00) ? ROUTE_LOC_HOST_ID : ((((defaultRoute & 0x60)>>5 )== 0x01 ) ? ROUTE_LOC_ESE_ID : ROUTE_LOC_UICC1_ID); +#endif + mDefaultIso7816Powerstate = defaultRoute & 0x1F; + ALOGD ("%s:mDefaultIso7816SeID:0x%2X mDefaultIso7816Powerstate:0x%X", fn, mDefaultIso7816SeID, mDefaultIso7816Powerstate); -#if((NXP_EXTNS == TRUE) && (NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE)) - if(mSetDefaulRouteParams == 0) +#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE) + mDefaultIsoDepSeID = ((((protoRoute & 0xE0) >> 5) == 0x00) ? ROUTE_LOC_HOST_ID : ((((protoRoute & 0xE0)>>5 )== 0x01 ) ? ROUTE_LOC_ESE_ID : ((((protoRoute & 0xE0)>>5 )== 0x02 ) ? ROUTE_LOC_UICC1_ID : ROUTE_LOC_UICC2_ID))); +#else + mDefaultIsoDepSeID = (((protoRoute & 0x60) >> 5) == 0x00) ? ROUTE_LOC_HOST_ID : ((((protoRoute & 0x60)>>5 )== 0x01 ) ? ROUTE_LOC_ESE_ID : ROUTE_LOC_UICC1_ID); +#endif + mDefaultIsoDepPowerstate = protoRoute & 0x1F; + ALOGD ("%s:mDefaultIsoDepSeID:0x%2X mDefaultIsoDepPowerstate:0x%2X", fn, mDefaultIsoDepSeID,mDefaultIsoDepPowerstate); + +#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE) + mDefaultTechASeID = ((((techRoute & 0x60) >> 5) == 0x00) ? ROUTE_LOC_HOST_ID : ((((techRoute & 0x60)>>5 )== 0x01 ) ? ROUTE_LOC_ESE_ID : ((((techRoute & 0x60)>>5 ) == 0x02)? ROUTE_LOC_UICC1_ID : ROUTE_LOC_UICC2_ID))); +#else + mDefaultTechASeID = (((techRoute & 0x60) >> 5) == 0x00) ? ROUTE_LOC_HOST_ID : ((((techRoute & 0x60)>>5 )== 0x01 ) ? ROUTE_LOC_ESE_ID : ROUTE_LOC_UICC1_ID); +#endif + mDefaultTechAPowerstate = techRoute & 0x1F; + + ALOGD ("%s:mDefaultTechASeID:0x%2X mDefaultTechAPowerstate:0x%2X", fn, mDefaultTechASeID,mDefaultTechAPowerstate); + + if (mHostListnTechMask) { - mSetDefaulRouteParams = ((defaultRoute<<16)|(protoRoute<<8)|(techRoute)); + nfaStat = NFA_CeRegisterAidOnDH (NULL, 0, stackCallback); + if (nfaStat != NFA_STATUS_OK) + ALOGE ("Failed to register wildcard AID for DH"); + nfaStat = NFA_CeSetIsoDepListenTech(mHostListnTechMask & 0xB); + if (nfaStat != NFA_STATUS_OK) + ALOGE ("Failed to configure CE IsoDep technologies"); } -#endif - SyncEventGuard guard (mRoutingEvent); - if (mDefaultEe == SecureElement::ESE_ID) //eSE + checkProtoSeID(); + + initialiseTableEntries (); + + compileProtoEntries (); + + consolidateProtoEntries (); + + setProtoRouting (); + + compileTechEntries (); + + consolidateTechEntries (); + + setTechRouting (); + + ALOGD ("%s: exit", fn); + + return true; +} + +void RoutingManager::setCeRouteStrictDisable(UINT32 state) +{ + ALOGD ("%s: mCeRouteScreenLock = 0x%X", __FUNCTION__, state); + mCeRouteStrictDisable = state; +} + +void RoutingManager::printMemberData() +{ + ALOGD("%s: ACTIVE_SE = 0x%0X", __FUNCTION__, mActiveSe); + ALOGD("%s: ACTIVE_SE_NFCF = 0x%0X", __FUNCTION__, mActiveSeNfcF); + ALOGD("%s: AID_MATCHING_MODE = 0x%0X", __FUNCTION__, mAidMatchingMode); + ALOGD("%s: DEFAULT_NFCF_ROUTE = 0x%0X", __FUNCTION__, mDefaultEeNfcF); + ALOGD("%s: DEFAULT_ISODEP_ROUTE = 0x%0X", __FUNCTION__, mDefaultEe); + ALOGD("%s: DEFAULT_OFFHOST_ROUTE = 0x%0X", __FUNCTION__, mOffHostEe); + ALOGD("%s: AID_MATCHING_PLATFORM = 0x%0X", __FUNCTION__, mAidMatchingPlatform); + ALOGD("%s: HOST_LISTEN_TECH_MASK = 0x%0X;", __FUNCTION__, mHostListnTechMask); + ALOGD("%s: UICC_LISTEN_TECH_MASK = 0x%0X;", __FUNCTION__, mUiccListnTechMask); + ALOGD("%s: DEFAULT_FELICA_CLT_ROUTE = 0x%0X;", __FUNCTION__, mDefaultTechFSeID); + ALOGD("%s: DEFAULT_FELICA_CLT_PWR_STATE = 0x%0X;", __FUNCTION__, mDefaultTechFPowerstate); + + ALOGD("%s: NXP_NFC_CHIP = 0x%0X;", __FUNCTION__, mChipId); + ALOGD("%s: NXP_DEFAULT_SE = 0x%0X;", __FUNCTION__, mDefaultEe); + ALOGD("%s: NXP_ENABLE_ADD_AID = 0x%0X;", __FUNCTION__, mAddAid); + ALOGD("%s: NXP_ESE_WIRED_PRT_MASK = 0x%0X;", __FUNCTION__, gEseVirtualWiredProtectMask); + ALOGD("%s: NXP_UICC_WIRED_PRT_MASK = 0x%0X;", __FUNCTION__, gUICCVirtualWiredProtectMask); + ALOGD("%s: NXP_FWD_FUNCTIONALITY_ENABLE = 0x%0X;", __FUNCTION__, mFwdFuntnEnable); + ALOGD("%s: NXP_WIRED_MODE_RF_FIELD_ENABLE = 0x%0X;", __FUNCTION__, gWiredModeRfFieldEnable); + +} + +/* To check whether the route location for ISO-DEP protocol defined by user in config file is actually connected or not + * If not connected then set it to HOST by default*/ +void RoutingManager::checkProtoSeID(void) +{ + static const char fn [] = "RoutingManager::checkProtoSeID"; + UINT8 isDefaultIsoDepSeIDPresent = 0; + tNFA_HANDLE ActDevHandle = NFA_HANDLE_INVALID; + unsigned long check_default_proto_se_id_req = 0; + + ALOGD ("%s: enter", fn); + + if (GetNxpNumValue(NAME_CHECK_DEFAULT_PROTO_SE_ID, &check_default_proto_se_id_req, sizeof(check_default_proto_se_id_req))) { - preferred_defaultHandle = 0x4C0; + ALOGD("%s : CHECK_DEFAULT_PROTO_SE_ID - 0x%2X ",fn,check_default_proto_se_id_req); } - else if (mDefaultEe == SecureElement::UICC_ID) //UICC + else { - preferred_defaultHandle = 0x402; + ALOGE("%s : CHECK_DEFAULT_PROTO_SE_ID not defined. Taking default value - 0x%2X",fn,check_default_proto_se_id_req); } - uiccListenTech = NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B; + if(check_default_proto_se_id_req == 0x01) + { + UINT8 count,seId=0; + tNFA_HANDLE ee_handleList[SecureElement::MAX_NUM_EE]; + SecureElement::getInstance().getEeHandleList(ee_handleList, &count); - ALOGD ("%s: enter, defaultRoute:%x protoRoute:0x%x TechRoute:0x%x HostListenMask:0x%x", fn, defaultRoute, protoRoute, techRoute, mHostListnTechMask); + for (int i = 0; ((count != 0 ) && (i < count)); i++) + { + seId = SecureElement::getInstance().getGenericEseId(ee_handleList[i]); + ActDevHandle = SecureElement::getInstance().getEseHandleFromGenericId(seId); + ALOGD ("%s:ee_handleList[%d]:0x%2X", fn, i,ee_handleList[i]); + if (mDefaultIsoDepSeID == ActDevHandle) + { + isDefaultIsoDepSeIDPresent = 1; + break; + } + } - defaultSeID = (((defaultRoute & 0x60) >> 5) == 0x00) ? 0x400 : ((((defaultRoute & 0x60)>>5 )== 0x01 ) ? 0x4C0 : 0x402); - defaultPowerstate=defaultRoute & 0x1F; - ALOGD ("%s: enter, defaultSeID:%x defaultPowerstate:0x%x", fn, defaultSeID,defaultPowerstate); + ALOGD ("%s:isDefaultIsoDepSeIDPresent:0x%X", fn, isDefaultIsoDepSeIDPresent); + if(!isDefaultIsoDepSeIDPresent) + { + mDefaultIsoDepSeID = ROUTE_LOC_HOST_ID; + mDefaultIsoDepPowerstate = 0x01; + } + } - defaultProtoSeID = (((protoRoute & 0x60) >> 5) == 0x00) ? 0x400 : ((((protoRoute & 0x60)>>5 )== 0x01 ) ? 0x4C0 : 0x402); - defaultProtoPowerstate = protoRoute & 0x1F; - ALOGD ("%s: enter, defaultProtoSeID:%x defaultProtoPowerstate:0x%x", fn, defaultProtoSeID,defaultProtoPowerstate); + ALOGD ("%s: exit", fn); +} - defaultTechSeID = (((techRoute & 0x60) >> 5) == 0x00) ? 0x400 : ((((techRoute & 0x60)>>5 )== 0x01 ) ? 0x4C0 : 0x402); - defaultTechAPowerstate = techRoute & 0x1F; - DefaultTechType = (techRoute & 0x80) >> 7; - ALOGD ("%s: enter, defaultTechSeID:%x defaultTechAPowerstate:0x%x,defaultTechType:0x%x", fn, defaultTechSeID,defaultTechAPowerstate,DefaultTechType); +void RoutingManager::initialiseTableEntries(void) +{ + static const char fn [] = "RoutingManager::initialiseTableEntries"; - cleanRouting(); + ALOGD ("%s: enter", fn); - if (mHostListnTechMask) - { - nfaStat = NFA_CeRegisterAidOnDH (NULL, 0, stackCallback); - if (nfaStat != NFA_STATUS_OK) - ALOGE ("Failed to register wildcard AID for DH"); - } + /* Defined Protocol Masks + * T1T 0x01 + * T2T 0x02 + * T3T 0x04 + * ISO-DEP 0x08 + * NFC-DEP 0x10 + * ISO-7816 0x20 + */ - if (GetNxpNumValue(NAME_CHECK_DEFAULT_PROTO_SE_ID, &check_default_proto_se_id_req, sizeof(check_default_proto_se_id_req))) - { - ALOGE("%s : CHECK_DEFAULT_PROTO_SE_ID - 0x%02x ",fn,check_default_proto_se_id_req); - } - else - { - ALOGE("%s : CHECK_DEFAULT_PROTO_SE_ID not defined. Taking default value - 0x%02x ",fn,check_default_proto_se_id_req); - } - if(check_default_proto_se_id_req == 0x01) - { - UINT8 count,seId=0; - tNFA_HANDLE ee_handleList[SecureElement::MAX_NUM_EE]; - SecureElement::getInstance().getEeHandleList(ee_handleList, &count); - - for (int i = 0; ((count != 0 ) && (i < count)); i++) - { - seId = SecureElement::getInstance().getGenericEseId(ee_handleList[i]); - defaultHandle = SecureElement::getInstance().getEseHandleFromGenericId(seId); - ALOGD ("%s: enter, ee_handleList[%d]:%x", fn, i,ee_handleList[i]); - //defaultHandle = ee_handleList[i]; - if (preferred_defaultHandle == defaultHandle) - { - //ActSEhandle = defaultHandle; - break; - } - } - for (int i = 0; ((count != 0 ) && (i < count)); i++) - { - seId = SecureElement::getInstance().getGenericEseId(ee_handleList[i]); - ActDevHandle = SecureElement::getInstance().getEseHandleFromGenericId(seId); - ALOGD ("%s: enter, ee_handleList[%d]:%x", fn, i,ee_handleList[i]); - if (defaultProtoSeID == ActDevHandle) - { - isDefaultProtoSeIDPresent =1; - break; - } - } - - ALOGD ("%s: enter, isDefaultProtoSeIDPresent:%x", fn, isDefaultProtoSeIDPresent); - if(!isDefaultProtoSeIDPresent) - { - defaultProtoSeID = 0x400; - defaultProtoPowerstate = 0x01; - } - } + mProtoTableEntries[PROTO_T3T_IDX].protocol = NFA_PROTOCOL_MASK_T3T; + mProtoTableEntries[PROTO_ISODEP_IDX].protocol = NFA_PROTOCOL_MASK_ISO_DEP; + mProtoTableEntries[PROTO_ISO7816_IDX].protocol = NFC_PROTOCOL_MASK_ISO7816; - if( defaultProtoSeID == defaultSeID) - { - unsigned int default_proto_power_mask[5] = {0,}; - for(int pCount=0 ; pCount< 5 ;pCount++) - { - if((defaultPowerstate >> pCount)&0x01) - { - default_proto_power_mask[pCount] |= NFC_PROTOCOL_MASK_ISO7816; - } - if((defaultProtoPowerstate >> pCount)&0x01) - { - default_proto_power_mask[pCount] |= NFA_PROTOCOL_MASK_ISO_DEP; - } - } - if(defaultProtoSeID == 0x400 && mHostListnTechMask == 0x00) - { - ALOGE("%s, HOST is disabled hence skipping configure proto route to host", fn); - } - else - { - if(mCeRouteStrictDisable == 0x01) - { + mTechTableEntries[TECH_A_IDX].technology = NFA_TECHNOLOGY_MASK_A; + mTechTableEntries[TECH_B_IDX].technology = NFA_TECHNOLOGY_MASK_B; + mTechTableEntries[TECH_F_IDX].technology = NFA_TECHNOLOGY_MASK_F; -#if(NFC_NXP_CHIP_TYPE != PN547C2 && NXP_EXTNS == TRUE && NXP_NFCC_HCE_F == TRUE) - if(defaultProtoSeID == 0x400) - { - default_proto_power_mask[0] |= NFA_PROTOCOL_MASK_T3T; - } -#endif - nfaStat = NFA_EeSetDefaultProtoRouting(defaultProtoSeID , - default_proto_power_mask[0], - default_proto_power_mask[1], - default_proto_power_mask[2], - default_proto_power_mask[3], - default_proto_power_mask[4]); - } - else - { - nfaStat = NFA_EeSetDefaultProtoRouting(defaultProtoSeID , - default_proto_power_mask[0], - default_proto_power_mask[1], - default_proto_power_mask[2], - 0, 0); - } - if (nfaStat == NFA_STATUS_OK) - mRoutingEvent.wait (); - else - { - ALOGE ("Fail to set iso7816 routing"); - } - } - } - else - { - int t3t_protocol_mask = 0; - ALOGD ("%s: enter, defaultPowerstate:%x", fn, defaultPowerstate); - if(mHostListnTechMask == 0x00 && defaultSeID == 0x400) - { - ALOGE("%s, HOST is disabled hence skipping configure 7816 route to host", fn); - } - else - { - if(mCeRouteStrictDisable == 0x01) - { -#if(NFC_NXP_CHIP_TYPE != PN547C2) - if(defaultSeID == 0x400) - { - t3t_protocol_mask = NFA_PROTOCOL_MASK_T3T; - } -#endif - nfaStat = NFA_EeSetDefaultProtoRouting(defaultSeID , - (defaultPowerstate & 01) ? (NFC_PROTOCOL_MASK_ISO7816 | t3t_protocol_mask) :0, - (defaultPowerstate & 02) ? (NFC_PROTOCOL_MASK_ISO7816) :0, - (defaultPowerstate & 04) ? (NFC_PROTOCOL_MASK_ISO7816) :0, - (defaultPowerstate & 0x08) ? NFC_PROTOCOL_MASK_ISO7816 :0, - (defaultPowerstate & 0x10) ? NFC_PROTOCOL_MASK_ISO7816 :0); - }else - { - nfaStat = NFA_EeSetDefaultProtoRouting(defaultSeID , - (defaultPowerstate & 01) ? NFC_PROTOCOL_MASK_ISO7816 :0, - (defaultPowerstate & 02) ? NFC_PROTOCOL_MASK_ISO7816 :0, - (defaultPowerstate & 04) ? NFC_PROTOCOL_MASK_ISO7816 :0, - 0, 0); - } - if (nfaStat == NFA_STATUS_OK) - mRoutingEvent.wait (); - else - { - ALOGE ("Fail to set iso7816 routing"); - } - - t3t_protocol_mask =0; - } - if(mHostListnTechMask == 0x00 && defaultProtoSeID == 0x400) - { - ALOGE("%s, HOST is disabled hence skipping configure ISO-DEP route to host", fn); - } - else - { - if(mCeRouteStrictDisable == 0x01) - { -#if(NFC_NXP_CHIP_TYPE != PN547C2 && NXP_EXTNS == TRUE && NXP_NFCC_HCE_F == TRUE) - //Felicafrom host - int t3t_protocol_mask =0; - if(defaultProtoSeID == 0x400) - { - t3t_protocol_mask = NFA_PROTOCOL_MASK_T3T; - } -#endif -#if(NXP_EXTNS == TRUE && NXP_NFCC_HCE_F == TRUE) - nfaStat = NFA_EeSetDefaultProtoRouting(defaultProtoSeID, - (defaultProtoPowerstate& 01) ? (NFA_PROTOCOL_MASK_ISO_DEP | t3t_protocol_mask): 0, - (defaultProtoPowerstate & 02) ? (NFA_PROTOCOL_MASK_ISO_DEP) :0, - (defaultProtoPowerstate & 04) ? (NFA_PROTOCOL_MASK_ISO_DEP) :0, - (defaultProtoPowerstate & 0x08) ? NFA_PROTOCOL_MASK_ISO_DEP :0, - (defaultProtoPowerstate & 0x10) ? NFA_PROTOCOL_MASK_ISO_DEP :0 ); -#else - nfaStat = NFA_EeSetDefaultProtoRouting(defaultProtoSeID, - (defaultProtoPowerstate& 01) ? NFA_PROTOCOL_MASK_ISO_DEP: 0, - (defaultProtoPowerstate & 02) ? NFA_PROTOCOL_MASK_ISO_DEP :0, - (defaultProtoPowerstate & 04) ? NFA_PROTOCOL_MASK_ISO_DEP :0, - (defaultProtoPowerstate & 0x08) ? NFA_PROTOCOL_MASK_ISO_DEP :0, - (defaultProtoPowerstate & 0x10) ? NFA_PROTOCOL_MASK_ISO_DEP :0); -#endif - }else{ - nfaStat = NFA_EeSetDefaultProtoRouting(defaultProtoSeID, - (defaultProtoPowerstate& 01) ? NFA_PROTOCOL_MASK_ISO_DEP: 0, - (defaultProtoPowerstate & 02) ? NFA_PROTOCOL_MASK_ISO_DEP :0, - (defaultProtoPowerstate & 04) ? NFA_PROTOCOL_MASK_ISO_DEP :0, - 0, 0 ); - } - if (nfaStat == NFA_STATUS_OK) - mRoutingEvent.wait (); - else - { - ALOGE ("Fail to set ISO-7816 routing"); - } - t3t_protocol_mask =0; - } - } + for(int xx = 0; xx < MAX_PROTO_ENTRIES; xx++) + { + mProtoTableEntries[xx].routeLoc = mTechTableEntries[xx].routeLoc = 0x00; + mProtoTableEntries[xx].power = mTechTableEntries[xx].power = 0x00; + mProtoTableEntries[xx].enable = mTechTableEntries[xx].enable = FALSE; + } -#if(NFC_NXP_CHIP_TYPE != PN547C2 && NXP_EXTNS == TRUE && NXP_NFCC_HCE_F == TRUE) - if(0x400 != defaultProtoSeID && 0x400 != defaultSeID && mHostListnTechMask) - { - - if(mCeRouteStrictDisable == 0x01) - { - nfaStat = NFA_EeSetDefaultProtoRouting(0x400 , - NFA_PROTOCOL_MASK_T3T, - 0, - 0, - NFA_PROTOCOL_MASK_T3T, - 0); - - }else{ - nfaStat = NFA_EeSetDefaultProtoRouting(0x400 , - NFA_PROTOCOL_MASK_T3T, - 0, - 0, - 0, - 0); - } - if (nfaStat == NFA_STATUS_OK)//FelicaOnHost - mRoutingEvent.wait (); - else - { - ALOGE ("Fail to set T3T protocol routing to HOST"); - } - } -#endif -//ee_handle = SecureElement::getInstance().getEseHandleFromGenericId(switch_on); - ALOGD ("%s:defaultHandle:%x", fn, defaultHandle); - ALOGD ("%s:preferred_defaultHandle:%x", fn, preferred_defaultHandle); + mLmrtEntries[ROUTE_LOC_HOST_ID_IDX].nfceeID = ROUTE_LOC_HOST_ID; + mLmrtEntries[ROUTE_LOC_ESE_ID_IDX].nfceeID = ROUTE_LOC_ESE_ID; + mLmrtEntries[ROUTE_LOC_UICC1_ID_IDX].nfceeID = ROUTE_LOC_UICC1_ID; + mLmrtEntries[ROUTE_LOC_UICC2_ID_IDX].nfceeID = ROUTE_LOC_UICC2_ID; + for(int xx=0;xx<MAX_ROUTE_LOC_ENTRIES;xx++) { - unsigned long max_tech_mask = 0x03; - unsigned int default_tech_power_mask[5] = {0,}; - unsigned int defaultTechFPowerstate = 0x1F; + mLmrtEntries[xx].proto_switch_on = mLmrtEntries[xx].tech_switch_on = 0x00; + mLmrtEntries[xx].proto_switch_off = mLmrtEntries[xx].tech_switch_off = 0x00; + mLmrtEntries[xx].proto_battery_off = mLmrtEntries[xx].tech_battery_off = 0x00; + mLmrtEntries[xx].proto_screen_lock = mLmrtEntries[xx].tech_screen_lock = 0x00; + mLmrtEntries[xx].proto_screen_off = mLmrtEntries[xx].tech_screen_off = 0x00; + } + /*Get all the technologies supported by all the execution environments*/ + mTechSupportedByEse = SecureElement::getInstance().getSETechnology(ROUTE_LOC_ESE_ID); + mTechSupportedByUicc1 = SecureElement::getInstance().getSETechnology(ROUTE_LOC_UICC1_ID); + mTechSupportedByUicc2 = SecureElement::getInstance().getSETechnology(ROUTE_LOC_UICC2_ID); + ALOGD ("%s: exit; mTechSupportedByEse:0x%0X mTechSupportedByUicc1:0x%0X mTechSupportedByUicc2:0x%0X", fn, mTechSupportedByEse, mTechSupportedByUicc1, mTechSupportedByUicc2); +} + +/* Compilation of Proto Table entries strictly based on config file parameters + * Each entry in proto table consistes of route location, protocol and power state + * */ +void RoutingManager::compileProtoEntries(void) +{ + static const char fn [] = "RoutingManager::compileProtoEntries"; + tNFA_STATUS nfaStat = NFA_STATUS_FAILED; - max_tech_mask = SecureElement::getInstance().getSETechnology(defaultTechSeID); + ALOGD ("%s: enter", fn); + + /*Populate the entries on protocol table*/ + mProtoTableEntries[PROTO_T3T_IDX].routeLoc = ROUTE_LOC_HOST_ID;//T3T Proto always to HOST. For other EE used Tech F routing + mProtoTableEntries[PROTO_T3T_IDX].power = 0x01; //Only Screen ON UNLOCK allowed + mProtoTableEntries[PROTO_T3T_IDX].enable = ((mHostListnTechMask & 0x04) != 0x00) ? TRUE : FALSE; + + mProtoTableEntries[PROTO_ISODEP_IDX].routeLoc = mDefaultIsoDepSeID; + mProtoTableEntries[PROTO_ISODEP_IDX].power = mCeRouteStrictDisable ? mDefaultIsoDepPowerstate : (mDefaultIsoDepPowerstate & 0xE7); + mProtoTableEntries[PROTO_ISODEP_IDX].enable = ((mHostListnTechMask & 0x03) != 0x00) ? TRUE : FALSE; + + mProtoTableEntries[PROTO_ISO7816_IDX].routeLoc = mDefaultIso7816SeID; + mProtoTableEntries[PROTO_ISO7816_IDX].power = mCeRouteStrictDisable ? mDefaultIso7816Powerstate : (mDefaultIso7816Powerstate & 0xE7); + mProtoTableEntries[PROTO_ISO7816_IDX].enable = TRUE; - ALOGD ("%s:defaultTechSeID:%x", fn, defaultTechSeID); - ALOGD ("%s:Technologies supported by defaultTechSeID :%x", fn, max_tech_mask); + dumpTables(1); - if(defaultTechSeID == 0x402) + ALOGD ("%s: exit", fn); +} + +/* libnfc-nci takes protocols for each power-state for single route location + * The previous protocols set will be overwritten by new protocols set by NFA_EeSetDefaultProtoRouting + * So consolidate all the protocols/power state for a given NFCEE ID's + * For example: + * When PROTOCOL(ISO-DEP) and AID default route(ISO7816) set to same EE then set (ISO-DEP | ISO-7816) to that EE. + */ +void RoutingManager::consolidateProtoEntries(void) +{ + static const char fn [] = "RoutingManager::consolidateProtoEntries"; + + ALOGD ("%s: enter", fn); + + int index = -1; + + for(int xx=0;xx<MAX_PROTO_ENTRIES;xx++) + { + if(mProtoTableEntries[xx].enable) { - for(int pCount=0 ; pCount< 5 ;pCount++) - { - if((defaultTechAPowerstate >> pCount)&0x01) - { - default_tech_power_mask[pCount] |= (NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B); - } - if((defaultTechFPowerstate >> pCount)&0x01) - { - default_tech_power_mask[pCount] |= NFA_TECHNOLOGY_MASK_F; - } - } + switch(mProtoTableEntries[xx].routeLoc) + { + case ROUTE_LOC_HOST_ID: + index = ROUTE_LOC_HOST_ID_IDX; + break; + case ROUTE_LOC_ESE_ID: + index = ROUTE_LOC_ESE_ID_IDX; + break; + case ROUTE_LOC_UICC1_ID: + index = ROUTE_LOC_UICC1_ID_IDX; + break; + case ROUTE_LOC_UICC2_ID: + index = ROUTE_LOC_UICC2_ID_IDX; + break; + } + if(index != -1) + { + mLmrtEntries[index].proto_switch_on = (mLmrtEntries[index].proto_switch_on) | ((mProtoTableEntries[xx].power & 0X01)? mProtoTableEntries[xx].protocol:0); + mLmrtEntries[index].proto_switch_off = (mLmrtEntries[index].proto_switch_off) | ((mProtoTableEntries[xx].power & 0X02)? mProtoTableEntries[xx].protocol:0); + mLmrtEntries[index].proto_battery_off = (mLmrtEntries[index].proto_battery_off) | ((mProtoTableEntries[xx].power & 0X04)? mProtoTableEntries[xx].protocol:0); + mLmrtEntries[index].proto_screen_lock = (mLmrtEntries[index].proto_screen_lock) | ((mProtoTableEntries[xx].power & 0X08)? mProtoTableEntries[xx].protocol:0); + mLmrtEntries[index].proto_screen_off = (mLmrtEntries[index].proto_screen_off) | ((mProtoTableEntries[xx].power & 0X10)? mProtoTableEntries[xx].protocol:0); + } + } + } - if(mCeRouteStrictDisable == 0x01) - { - nfaStat = NFA_EeSetDefaultTechRouting (defaultTechSeID, - (max_tech_mask & default_tech_power_mask[0]), - (max_tech_mask & default_tech_power_mask[1]), - (max_tech_mask & default_tech_power_mask[2]), - (max_tech_mask & default_tech_power_mask[3]), - (max_tech_mask & default_tech_power_mask[4])); - }else{ - nfaStat = NFA_EeSetDefaultTechRouting (defaultTechSeID, - (max_tech_mask & default_tech_power_mask[0]), - (max_tech_mask & default_tech_power_mask[1]), - (max_tech_mask & default_tech_power_mask[2]), - 0, - 0); - } - if (nfaStat == NFA_STATUS_OK) - mRoutingEvent.wait (); - else - { - ALOGE ("Fail to set tech routing"); - } + dumpTables(2); + + ALOGD ("%s: exit", fn); +} + +void RoutingManager::setProtoRouting() +{ + static const char fn [] = "RoutingManager::setProtoRouting"; + tNFA_STATUS nfaStat = NFA_STATUS_FAILED; - if(mHostListnTechMask > 0 && mFwdFuntnEnable == TRUE) + ALOGD ("%s: enter", fn); + SyncEventGuard guard (mRoutingEvent); + for(int xx=0;xx<MAX_ROUTE_LOC_ENTRIES;xx++) + { + ALOGD ("%s: nfceeID:0x%X", fn, mLmrtEntries[xx].nfceeID); + if( mLmrtEntries[xx].nfceeID && + (mLmrtEntries[xx].proto_switch_on || + mLmrtEntries[xx].proto_switch_off || + mLmrtEntries[xx].proto_battery_off || + mLmrtEntries[xx].proto_screen_lock || + mLmrtEntries[xx].proto_screen_off) ) + { + /*Clear protocols for NFCEE ID control block */ + ALOGD ("%s: Clear Proto Routing Entries for nfceeID:0x%X", fn, mLmrtEntries[xx].nfceeID); + nfaStat = NFA_EeSetDefaultProtoRouting(mLmrtEntries[xx].nfceeID,0,0,0,0,0); + if(nfaStat == NFA_STATUS_OK) { - if(!(max_tech_mask & NFA_TECHNOLOGY_MASK_A) && (max_tech_mask & NFA_TECHNOLOGY_MASK_B)) - { - if(mCeRouteStrictDisable == 0x01) - { - switch(mHostListnTechMask) - { - case 0x01: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_A, - 0, - 0, - NFA_TECHNOLOGY_MASK_A, - 0 ); - break; - case 0x02: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - 0, - 0, - 0, - 0, - 0 ); - break; - case 0x03: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_A, - 0, - 0, - NFA_TECHNOLOGY_MASK_A, - 0 ); - break; - } - } - else - { - switch(mHostListnTechMask) - { - case 0x01: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_A, - 0, - 0, - 0, - 0 ); - break; - case 0x02: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - 0, - 0, - 0, - 0, - 0 ); - break; - case 0x03: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_A, - 0, - 0, - 0, - 0 ); - break; - } - } - if(nfaStat == NFA_STATUS_OK) - { - mRoutingEvent.wait (); - } - else - { - ALOGE ("Fail to set Tech A routing to DH"); - } - } - else if(!(max_tech_mask & NFA_TECHNOLOGY_MASK_B) && (max_tech_mask & NFA_TECHNOLOGY_MASK_A)) - { - if(mCeRouteStrictDisable == 0x01) - { - switch(mHostListnTechMask) - { - case 0x01: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - 0, - 0, - 0, - 0, - 0 ); - break; - case 0x02: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_B, - 0, - 0, - NFA_TECHNOLOGY_MASK_B, - 0 ); - break; - case 0x03: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_B, - 0, - 0, - NFA_TECHNOLOGY_MASK_B, - 0 ); - break; - } - } - else - { - switch(mHostListnTechMask) - { - case 0x01: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - 0, - 0, - 0, - 0, - 0 ); - break; - case 0x02: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_B, - 0, - 0, - 0, - 0 ); - break; - case 0x03: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_B, - 0, - 0, - 0, - 0 ); - break; - } - } - if(nfaStat == NFA_STATUS_OK) - { - mRoutingEvent.wait (); - } - else - { - ALOGE ("Fail to set Tech B routing to DH"); - } - } - else if((max_tech_mask == (NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B)) || - (max_tech_mask == (NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B | NFA_TECHNOLOGY_MASK_F)))// When there is NO UICC or Type AB/ABF UICC detected - { - ALOGD ("TypeAB or Type ABF UICC detected, not setting any tech route to DH"); - } - else if(max_tech_mask == 0x00) //When NO UICC - { - ALOGD ("No UICC connected"); - if(mCeRouteStrictDisable == 0x01) - { - switch(mHostListnTechMask) - { - case 0x01: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_A, - 0, - 0, - NFA_TECHNOLOGY_MASK_A, - 0 ); - break; - case 0x02: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_B, - 0, - 0, - NFA_TECHNOLOGY_MASK_B, - 0 ); - break; - case 0x03: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - 0, - 0, - 0, - 0, - 0 ); - break; - } - } - else - { - switch(mHostListnTechMask) - { - case 0x01: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_A, - 0, - 0, - 0, - 0 ); - break; - case 0x02: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_B, - 0, - 0, - 0, - 0 ); - break; - case 0x03: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - 0, - 0, - 0, - 0, - 0 ); - break; - } - } - if(nfaStat == NFA_STATUS_OK) - { - mRoutingEvent.wait (); - } - else - { - ALOGE ("Fail to set Tech A or B routing to DH"); - } - } + mRoutingEvent.wait (); } else { - ALOGD ("Host Listen is disabled, Not setting any tech route to DH"); + ALOGE ("Fail to clear proto routing to 0x%X",mLmrtEntries[xx].nfceeID); } - } - else - { - DefaultTechType &= ~NFA_TECHNOLOGY_MASK_F; - DefaultTechType |= (NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B); - - if(mCeRouteStrictDisable == 0x01) - { - nfaStat = NFA_EeSetDefaultTechRouting (defaultTechSeID, - (defaultTechAPowerstate& 01) ? (max_tech_mask & DefaultTechType): 0, - (defaultTechAPowerstate & 02) ? (max_tech_mask & DefaultTechType) :0, - (defaultTechAPowerstate & 04) ? (max_tech_mask & DefaultTechType) :0, - (defaultTechAPowerstate & 0x08) ? (max_tech_mask & DefaultTechType) :0, - (defaultTechAPowerstate & 0x10) ? (max_tech_mask & DefaultTechType) :0); - }else{ - nfaStat = NFA_EeSetDefaultTechRouting (defaultTechSeID, - (defaultTechAPowerstate& 01) ? (max_tech_mask & DefaultTechType): 0, - (defaultTechAPowerstate & 02) ? (max_tech_mask & DefaultTechType) :0, - (defaultTechAPowerstate & 04) ? (max_tech_mask & DefaultTechType) :0, - 0, 0 ); - } - if (nfaStat == NFA_STATUS_OK) - mRoutingEvent.wait (); - else - { - ALOGE ("Fail to set Tech A/B/AB routing to ESE/DH"); - } - - max_tech_mask = SecureElement::getInstance().getSETechnology(0x402); - - if(mCeRouteStrictDisable == 0x01) - { - nfaStat = NFA_EeSetDefaultTechRouting (0x402, - (defaultTechFPowerstate& 01) ? (max_tech_mask & NFA_TECHNOLOGY_MASK_F): 0, - (defaultTechFPowerstate & 02) ? (max_tech_mask & NFA_TECHNOLOGY_MASK_F) :0, - (defaultTechFPowerstate & 04) ? (max_tech_mask & NFA_TECHNOLOGY_MASK_F) :0, - (defaultTechFPowerstate & 0x08) ? (max_tech_mask & NFA_TECHNOLOGY_MASK_F) :0, - (defaultTechFPowerstate & 0x10) ? (max_tech_mask & NFA_TECHNOLOGY_MASK_F) :0); - }else{ - nfaStat = NFA_EeSetDefaultTechRouting (0x402, - (defaultTechFPowerstate& 01) ? (max_tech_mask & NFA_TECHNOLOGY_MASK_F): 0, - (defaultTechFPowerstate & 02) ? (max_tech_mask & NFA_TECHNOLOGY_MASK_F) :0, - (defaultTechFPowerstate & 04) ? (max_tech_mask & NFA_TECHNOLOGY_MASK_F) :0, - 0, 0 ); - } - if (nfaStat == NFA_STATUS_OK) - mRoutingEvent.wait (); - else - { - ALOGE ("Fail to set Tech F routing to UICC"); - } - - if(mHostListnTechMask > 0 && mFwdFuntnEnable == TRUE) + /*Set Required protocols for NFCEE ID control block in libnfc-nci*/ + nfaStat = NFA_EeSetDefaultProtoRouting(mLmrtEntries[xx].nfceeID, + mLmrtEntries[xx].proto_switch_on, + mLmrtEntries[xx].proto_switch_off, + mLmrtEntries[xx].proto_battery_off, + mLmrtEntries[xx].proto_screen_lock, + mLmrtEntries[xx].proto_screen_off); + if(nfaStat == NFA_STATUS_OK) { - if(!(max_tech_mask & NFA_TECHNOLOGY_MASK_A) && ( max_tech_mask & NFA_TECHNOLOGY_MASK_B)) - { - if(mCeRouteStrictDisable == 0x01) - { - switch(mHostListnTechMask) - { - case 0x01: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_A, - 0, - 0, - NFA_TECHNOLOGY_MASK_A, - 0 ); - break; - case 0x02: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - 0, - 0, - 0, - 0, - 0 ); - break; - case 0x03: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_A, - 0, - 0, - NFA_TECHNOLOGY_MASK_A, - 0 ); - break; - } - } - else - { - switch(mHostListnTechMask) - { - case 0x01: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_A, - 0, - 0, - 0, - 0 ); - break; - case 0x02: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - 0, - 0, - 0, - 0, - 0 ); - break; - case 0x03: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_A, - 0, - 0, - 0, - 0 ); - break; - } - } - if(nfaStat == NFA_STATUS_OK) - { - mRoutingEvent.wait (); - } - else - { - ALOGE ("Fail to set Tech A routing to DH"); - } - } - else if(!(max_tech_mask & NFA_TECHNOLOGY_MASK_B) && (max_tech_mask & NFA_TECHNOLOGY_MASK_A)) - { - if(mCeRouteStrictDisable == 0x01) - { - switch(mHostListnTechMask) - { - case 0x01: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - 0, - 0, - 0, - 0, - 0 ); - break; - case 0x02: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_B, - 0, - 0, - NFA_TECHNOLOGY_MASK_B, - 0 ); - break; - case 0x03: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_B, - 0, - 0, - NFA_TECHNOLOGY_MASK_B, - 0 ); - break; - } - } - else - { - switch(mHostListnTechMask) - { - case 0x01: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - 0, - 0, - 0, - 0, - 0 ); - break; - case 0x02: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_B, - 0, - 0, - 0, - 0 ); - break; - case 0x03: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_B, - 0, - 0, - 0, - 0 ); - break; - } - } - if(nfaStat == NFA_STATUS_OK) - { - mRoutingEvent.wait (); - } - else - { - ALOGE ("Fail to set Tech B routing to DH"); - } - } - else if((max_tech_mask == (NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B)) || - (max_tech_mask == (NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B | NFA_TECHNOLOGY_MASK_F)))// When there is NO UICC or Type AB/ABF UICC detected - { - ALOGD ("TypeAB or Type ABF UICC detected, not setting any tech route to DH"); - } - else if(max_tech_mask == 0x00) //When NO UICC - { - ALOGD ("No UICC connected"); - if(mCeRouteStrictDisable == 0x01) - { - switch(mHostListnTechMask) - { - case 0x01: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_A, - 0, - 0, - NFA_TECHNOLOGY_MASK_A, - 0 ); - break; - case 0x02: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_B, - 0, - 0, - NFA_TECHNOLOGY_MASK_B, - 0 ); - break; - case 0x03: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - 0, - 0, - 0, - 0, - 0 ); - break; - } - } - else - { - switch(mHostListnTechMask) - { - case 0x01: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_A, - 0, - 0, - 0, - 0 ); - break; - case 0x02: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - NFA_TECHNOLOGY_MASK_B, - 0, - 0, - 0, - 0 ); - break; - case 0x03: - nfaStat = NFA_EeSetDefaultTechRouting (0x400, - 0, - 0, - 0, - 0, - 0 ); - break; - } - } - - if(nfaStat == NFA_STATUS_OK) - { - mRoutingEvent.wait (); - } - else - { - ALOGE ("Fail to set Tech A or B routing to DH"); - } - } + mRoutingEvent.wait (); + } + else + { + ALOGE ("Fail to set proto routing to 0x%X",mLmrtEntries[xx].nfceeID); } } } + ALOGD ("%s: exit", fn); +} - if ((GetNumValue(NAME_UICC_LISTEN_TECH_MASK, &uiccListenTech, sizeof(uiccListenTech)))) +/* Compilation of Tech Table entries strictly based on config file parameters + * Each entry in tech table consistes of route location, technology and power state + * */ +void RoutingManager::compileTechEntries(void) +{ + static const char fn [] = "RoutingManager::compileTechEntries"; + UINT32 techSupportedBySelectedEE = 0; + + ALOGD ("%s: enter", fn); + + /*Check technologies supported by EE selected in conf file*/ + if(mDefaultTechASeID == ROUTE_LOC_UICC1_ID) + techSupportedBySelectedEE = mTechSupportedByUicc1; + else if(mDefaultTechASeID == ROUTE_LOC_UICC2_ID) + techSupportedBySelectedEE = mTechSupportedByUicc2; + else if(mDefaultTechASeID == ROUTE_LOC_ESE_ID) + techSupportedBySelectedEE = mTechSupportedByEse; + else + techSupportedBySelectedEE = 0; /*For Host, no tech based route supported as Host always reads protocol data*/ + + /*Populate the entries on tech route table*/ + mTechTableEntries[TECH_A_IDX].routeLoc = mDefaultTechASeID; + mTechTableEntries[TECH_A_IDX].power = mCeRouteStrictDisable ? mDefaultTechAPowerstate : (mDefaultTechAPowerstate & 0xE7); + mTechTableEntries[TECH_A_IDX].enable = (techSupportedBySelectedEE & NFA_TECHNOLOGY_MASK_A)? TRUE : FALSE; + + /*Reuse the same power state and route location used for A*/ + mTechTableEntries[TECH_B_IDX].routeLoc = mDefaultTechASeID; + mTechTableEntries[TECH_B_IDX].power = mCeRouteStrictDisable ? mDefaultTechAPowerstate : (mDefaultTechAPowerstate & 0xE7); + mTechTableEntries[TECH_B_IDX].enable = (techSupportedBySelectedEE & NFA_TECHNOLOGY_MASK_B)? TRUE : FALSE; + + /*Check technologies supported by EE selected in conf file - For TypeF*/ + if(mDefaultTechFSeID == ROUTE_LOC_UICC1_ID) + techSupportedBySelectedEE = mTechSupportedByUicc1; + else if(mDefaultTechFSeID == ROUTE_LOC_UICC2_ID) + techSupportedBySelectedEE = mTechSupportedByUicc2; + else if(mDefaultTechFSeID == ROUTE_LOC_ESE_ID) + techSupportedBySelectedEE = mTechSupportedByEse; + else + techSupportedBySelectedEE = 0;/*For Host, no tech based route supported as Host always reads protocol data*/ + + mTechTableEntries[TECH_F_IDX].routeLoc = mDefaultTechFSeID; + mTechTableEntries[TECH_F_IDX].power = mCeRouteStrictDisable ? mDefaultTechFPowerstate : (mDefaultTechFPowerstate & 0xE7); + mTechTableEntries[TECH_F_IDX].enable = (techSupportedBySelectedEE & NFA_TECHNOLOGY_MASK_F)? TRUE : FALSE; + + dumpTables(3); + if(((mHostListnTechMask) && (mHostListnTechMask != 0X04)) && (mFwdFuntnEnable == TRUE)) { - ALOGD ("%s:UICC_TECH_MASK=0x0%lu;", __FUNCTION__, uiccListenTech); + processTechEntriesForFwdfunctionality(); } - if((defaultHandle != NFA_HANDLE_INVALID) && (0 != uiccListenTech)) + ALOGD ("%s: exit", fn); +} + +/* Forward Functionality is to handle either technology which is supported by UICC + * We are handling it by setting the alternate technology(A/B) to HOST + * */ +void RoutingManager::processTechEntriesForFwdfunctionality(void) +{ + static const char fn [] = "RoutingManager::processTechEntriesForFwdfunctionality"; + UINT32 techSupportedByUICC = mTechSupportedByUicc1; +#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE) + techSupportedByUICC = mTechSupportedByUicc1 | mTechSupportedByUicc2; +#endif + + ALOGD ("%s: enter", fn); + + switch(mHostListnTechMask) { - { - SyncEventGuard guard (SecureElement::getInstance().mUiccListenEvent); - nfaStat = NFA_CeConfigureUiccListenTech (defaultHandle, 0x00); - if (nfaStat == NFA_STATUS_OK) - { - SecureElement::getInstance().mUiccListenEvent.wait (); - } - else - ALOGE ("fail to start UICC listen"); - } - { - SyncEventGuard guard (SecureElement::getInstance().mUiccListenEvent); - nfaStat = NFA_CeConfigureUiccListenTech (defaultHandle, (uiccListenTech & 0x07)); - if(nfaStat == NFA_STATUS_OK) - { - SecureElement::getInstance().mUiccListenEvent.wait (); - } - else - ALOGE ("fail to start UICC listen"); - } + case 0x01://Host wants to listen ISO-DEP in A tech only then following cases will arises:- + //i.Tech A only UICC present(Dont route Tech B to HOST), + //ii.Tech B only UICC present(Route Tech A to HOST), + //iii.Tech AB UICC present(Dont route any tech to HOST) + if(((mTechTableEntries[TECH_B_IDX].routeLoc == ROUTE_LOC_UICC1_ID) || (mTechTableEntries[TECH_B_IDX].routeLoc == ROUTE_LOC_UICC2_ID)) && + ((((techSupportedByUICC & NFA_TECHNOLOGY_MASK_B) == 0) && (techSupportedByUICC & NFA_TECHNOLOGY_MASK_A) != 0)))//Tech A only supported UICC + { + //Tech A will goto UICC according to previous table + //Disable Tech B entry as host wants to listen A only + mTechTableEntries[TECH_B_IDX].enable = FALSE; + } + if(((mTechTableEntries[TECH_A_IDX].routeLoc == ROUTE_LOC_UICC1_ID) || (mTechTableEntries[TECH_A_IDX].routeLoc == ROUTE_LOC_UICC2_ID)) && + ((((techSupportedByUICC & NFA_TECHNOLOGY_MASK_A) == 0) && (techSupportedByUICC & NFA_TECHNOLOGY_MASK_B) != 0)))//Tech B only supported UICC + { + //Tech B will goto UICC according to previous table + //Route Tech A to HOST as Host wants to listen A only + mTechTableEntries[TECH_A_IDX].routeLoc = ROUTE_LOC_HOST_ID; + /*Allow only (screen On+unlock) and (screen On+lock) power state when routing to HOST*/ + mTechTableEntries[TECH_A_IDX].power = (mTechTableEntries[TECH_A_IDX].power & 0x09); + mTechTableEntries[TECH_A_IDX].enable = TRUE; + } + if((techSupportedByUICC & 0x03) == 0x03)//AB both supported UICC + { + //Do Nothing + //Tech A and Tech B will goto according to previous table + //HCE A only / HCE-B only functionality wont work in this case + } + break; + case 0x02://Host wants to listen ISO-DEP in B tech only then if Cases: Tech A only UICC present(Route Tech B to HOST), Tech B only UICC present(Dont route Tech A to HOST), Tech AB UICC present(Dont route any tech to HOST) + if(((mTechTableEntries[TECH_B_IDX].routeLoc == ROUTE_LOC_UICC1_ID) || (mTechTableEntries[TECH_B_IDX].routeLoc == ROUTE_LOC_UICC2_ID)) && + ((((techSupportedByUICC & NFA_TECHNOLOGY_MASK_B) == 0) && (techSupportedByUICC & NFA_TECHNOLOGY_MASK_A) != 0)))//Tech A only supported UICC + { + //Tech A will goto UICC according to previous table + //Route Tech B to HOST as host wants to listen B only + mTechTableEntries[TECH_B_IDX].routeLoc = ROUTE_LOC_HOST_ID; + /*Allow only (screen On+unlock) and (screen On+lock) power state when routing to HOST*/ + mTechTableEntries[TECH_B_IDX].power = (mTechTableEntries[TECH_A_IDX].power & 0x09); + mTechTableEntries[TECH_B_IDX].enable = TRUE; + } + if(((mTechTableEntries[TECH_A_IDX].routeLoc == ROUTE_LOC_UICC1_ID) || (mTechTableEntries[TECH_A_IDX].routeLoc == ROUTE_LOC_UICC2_ID)) && + ((((techSupportedByUICC & NFA_TECHNOLOGY_MASK_A) == 0) && (techSupportedByUICC & NFA_TECHNOLOGY_MASK_B) != 0)))//Tech B only supported UICC + { + //Tech B will goto UICC according to previous table + //Disable Tech A to HOST as host wants to listen B only + mTechTableEntries[TECH_A_IDX].enable = FALSE; + } + if((techSupportedByUICC & 0x03) == 0x03)//AB both supported UICC + { + //Do Nothing + //Tech A and Tech B will goto UICC + //HCE A only / HCE-B only functionality wont work in this case + } + break; + case 0x03: + case 0x07://Host wants to listen ISO-DEP in AB both tech then if Cases: Tech A only UICC present(Route Tech B to HOST), Tech B only UICC present(Route Tech A to HOST), Tech AB UICC present(Dont route any tech to HOST) + /*If selected EE is UICC and it supports Bonly , then Set Tech A to Host */ + /*Host doesn't support Tech Routing, To enable FWD functionality enabling tech route to Host.*/ + if(((mTechTableEntries[TECH_A_IDX].routeLoc == ROUTE_LOC_UICC1_ID) || (mTechTableEntries[TECH_A_IDX].routeLoc == ROUTE_LOC_UICC2_ID)) && + ((((techSupportedByUICC & NFA_TECHNOLOGY_MASK_A) == 0) && (techSupportedByUICC & NFA_TECHNOLOGY_MASK_B) != 0))) + { + mTechTableEntries[TECH_A_IDX].routeLoc = ROUTE_LOC_HOST_ID; + /*Allow only (screen On+unlock) and (screen On+lock) power state when routing to HOST*/ + mTechTableEntries[TECH_A_IDX].power = (mTechTableEntries[TECH_A_IDX].power & 0x09); + mTechTableEntries[TECH_A_IDX].enable = TRUE; + } + /*If selected EE is UICC and it supports Aonly , then Set Tech B to Host*/ + if(((mTechTableEntries[TECH_B_IDX].routeLoc == ROUTE_LOC_UICC1_ID) || (mTechTableEntries[TECH_B_IDX].routeLoc == ROUTE_LOC_UICC2_ID)) && + ((((techSupportedByUICC & NFA_TECHNOLOGY_MASK_B) == 0) && (techSupportedByUICC & NFA_TECHNOLOGY_MASK_A) != 0))) + { + mTechTableEntries[TECH_B_IDX].routeLoc = ROUTE_LOC_HOST_ID; + /*Allow only (screen On+unlock) and (screen On+lock) power state when routing to HOST*/ + mTechTableEntries[TECH_B_IDX].power = (mTechTableEntries[TECH_A_IDX].power & 0x09); + mTechTableEntries[TECH_B_IDX].enable = TRUE; + } + if((techSupportedByUICC & 0x03) == 0x03)//AB both supported UICC + { + //Do Nothing + //Tech A and Tech B will goto UICC + //HCE A only / HCE-B only functionality wont work in this case + } + break; } - return true; + dumpTables(3); + ALOGD ("%s: exit", fn); } -void RoutingManager::setCeRouteStrictDisable(UINT32 state) + +/* libnfc-nci takes technologies for each power-state for single route location + * The previous technologies set will be overwritten by new technologies set by NFA_EeSetDefaultTechRouting + * So consolidate all the techs/power state for a given NFCEE ID's + * For example: + * When Tech A and Tech F set to same EE then set (TechA | Tech F) to that EE. + */ +void RoutingManager::consolidateTechEntries(void) { - ALOGD ("%s: mCeRouteScreenLock = 0x%X", __FUNCTION__, state); - mCeRouteStrictDisable = state; + static const char fn [] = "RoutingManager::consolidateTechEntries"; + ALOGD ("%s: enter", fn); + int index=-1; + for(int xx=0;xx<MAX_TECH_ENTRIES;xx++) + { + if(mTechTableEntries[xx].enable) + { + switch(mTechTableEntries[xx].routeLoc) + { + case ROUTE_LOC_HOST_ID: + index = ROUTE_LOC_HOST_ID_IDX; + break; + case ROUTE_LOC_ESE_ID: + index = ROUTE_LOC_ESE_ID_IDX; + break; + case ROUTE_LOC_UICC1_ID: + index = ROUTE_LOC_UICC1_ID_IDX; + break; + case ROUTE_LOC_UICC2_ID: + index = ROUTE_LOC_UICC2_ID_IDX; + break; + } + if(index != -1) + { + mLmrtEntries[index].tech_switch_on = mLmrtEntries[index].tech_switch_on | + ((mTechTableEntries[xx].power & 0X01)? mTechTableEntries[xx].technology:0); + mLmrtEntries[index].tech_switch_off = mLmrtEntries[index].tech_switch_off | + ((mTechTableEntries[xx].power & 0X02)? mTechTableEntries[xx].technology:0); + mLmrtEntries[index].tech_battery_off = mLmrtEntries[index].tech_battery_off | + ((mTechTableEntries[index].power & 0X04)? mTechTableEntries[xx].technology:0); + mLmrtEntries[index].tech_screen_lock = mLmrtEntries[index].tech_screen_lock | + ((mTechTableEntries[xx].power & 0X08)? mTechTableEntries[xx].technology:0); + mLmrtEntries[index].tech_screen_off = mLmrtEntries[index].tech_screen_off | + ((mTechTableEntries[xx].power & 0X10)? mTechTableEntries[xx].technology:0); + } + } + } + dumpTables(4); + ALOGD ("%s: exit", fn); +} + +void RoutingManager::setTechRouting(void) +{ + static const char fn [] = "RoutingManager::setTechRouting"; + tNFA_STATUS nfaStat = NFA_STATUS_FAILED; + ALOGD ("%s: enter", fn); + SyncEventGuard guard (mRoutingEvent); + for(int xx=0;xx<MAX_ROUTE_LOC_ENTRIES;xx++) + { + if( mLmrtEntries[xx].nfceeID && + (mLmrtEntries[xx].tech_switch_on || + mLmrtEntries[xx].tech_switch_off || + mLmrtEntries[xx].tech_battery_off || + mLmrtEntries[xx].tech_screen_lock || + mLmrtEntries[xx].tech_screen_off) ) + { + /*Clear technologies for NFCEE ID control block */ + ALOGD ("%s: Clear Routing Entries for nfceeID:0x%X", fn, mLmrtEntries[xx].nfceeID); + nfaStat = NFA_EeSetDefaultTechRouting(mLmrtEntries[xx].nfceeID, 0, 0, 0, 0, 0); + if(nfaStat == NFA_STATUS_OK) + { + mRoutingEvent.wait (); + } + else + { + ALOGE ("Fail to clear tech routing to 0x%x",mLmrtEntries[xx].nfceeID); + } + + /*Set Required technologies for NFCEE ID control block */ + nfaStat = NFA_EeSetDefaultTechRouting(mLmrtEntries[xx].nfceeID, + mLmrtEntries[xx].tech_switch_on, + mLmrtEntries[xx].tech_switch_off, + mLmrtEntries[xx].tech_battery_off, + mLmrtEntries[xx].tech_screen_lock, + mLmrtEntries[xx].tech_screen_off); + if(nfaStat == NFA_STATUS_OK) + { + mRoutingEvent.wait (); + } + else + { + ALOGE ("Fail to set tech routing to 0x%x",mLmrtEntries[xx].nfceeID); + } + } + } + ALOGD ("%s: exit", fn); +} + +void RoutingManager::dumpTables(int xx) +{ + switch(xx) + { + case 1://print only proto table + ALOGD ("------------------Proto Table Entries-----------------" ); + for(int xx=0;xx<MAX_PROTO_ENTRIES;xx++) + { + ALOGD ("|Index=%d|RouteLoc=0x%X|Proto=0x%X|Power=0x%x|Enable=%d|", + xx,mProtoTableEntries[xx].routeLoc, + mProtoTableEntries[xx].protocol, + mProtoTableEntries[xx].power, + mProtoTableEntries[xx].enable); + } + ALOGD ("------------------------------------------------------" ); + break; + case 2://print Lmrt proto table + ALOGD ("-----------------------------------Lmrt Proto Entries-------------------------------" ); + for(int xx=0;xx<MAX_PROTO_ENTRIES;xx++) + { + ALOGD ("|Index=%d|nfceeID=0x%X|SWTCH-ON=0x%X|SWTCH-OFF=0x%x|BAT-OFF=%d|SCRN-LOCK=%d|SCRN-OFF=%d|", + xx, + mLmrtEntries[xx].nfceeID, + mLmrtEntries[xx].proto_switch_on, + mLmrtEntries[xx].proto_switch_off, + mLmrtEntries[xx].proto_battery_off, + mLmrtEntries[xx].proto_screen_lock, + mLmrtEntries[xx].proto_screen_off); + } + ALOGD ("------------------------------------------------------------------------------------" ); + break; + case 3://print only tech table + ALOGD ("------------------Tech Table Entries-----------------" ); + for(int xx=0;xx<MAX_TECH_ENTRIES;xx++) + { + ALOGD ("|Index=%d|RouteLoc=0x%X|Tech=0x%X|Power=0x%x|Enable=%d|", + xx, + mTechTableEntries[xx].routeLoc, + mTechTableEntries[xx].technology, + mTechTableEntries[xx].power, + mTechTableEntries[xx].enable); + } + ALOGD ("-----------------------------------------------------" ); + break; + case 4://print Lmrt tech table + ALOGD ("-----------------------------------Lmrt Tech Entries-------------------------------" ); + for(int xx=0;xx<MAX_TECH_ENTRIES;xx++) + { + ALOGD ("|Index=%d|nfceeID=0x%X|SWTCH-ON=0x%X|SWTCH-OFF=0x%x|BAT-OFF=%d|SCRN-LOCK=%d|SCRN-OFF=%d|", + xx, + mLmrtEntries[xx].nfceeID, + mLmrtEntries[xx].tech_switch_on, + mLmrtEntries[xx].tech_switch_off, + mLmrtEntries[xx].tech_battery_off, + mLmrtEntries[xx].tech_screen_lock, + mLmrtEntries[xx].tech_screen_off); + } + ALOGD ("------------------------------------------------------------------------------------" ); + break; + } } #endif @@ -1890,7 +1680,12 @@ bool RoutingManager::addAidRouting(const UINT8* aid, UINT8 aidLen, int route) ALOGD ("%s: enter, mAddAid set to 0 from config file, ignoring all aids", fn); return false; } +#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE) + current_handle = ((handle == 0x4C0)?0xF3:(handle == 0x402)?SecureElement::UICC_ID:SecureElement::UICC2_ID); + +#else current_handle = ((handle == 0x4C0)?SecureElement::ESE_ID:SecureElement::UICC_ID); +#endif if(handle == 0x400) current_handle = 0x00; @@ -2484,21 +2279,22 @@ void RoutingManager::notifyLmrtFull () void RoutingManager::handleData (UINT8 technology, const UINT8* data, UINT32 dataLen, tNFA_STATUS status) { - if (dataLen <= 0) - { - ALOGE("no data"); - goto TheEnd; - } if (status == NFA_STATUS_CONTINUE) { ALOGE ("jni env is null"); - mRxDataBuffer.insert (mRxDataBuffer.end(), &data[0], &data[dataLen]); //append data; more to come + if (dataLen > 0) + { + mRxDataBuffer.insert (mRxDataBuffer.end(), &data[0], &data[dataLen]); //append data; more to come + } return; //expect another NFA_CE_DATA_EVT to come } else if (status == NFA_STATUS_OK) { - mRxDataBuffer.insert (mRxDataBuffer.end(), &data[0], &data[dataLen]); //append data + if (dataLen > 0) + { + mRxDataBuffer.insert (mRxDataBuffer.end(), &data[0], &data[dataLen]); //append data + } //entire data packet has been received; no more NFA_CE_DATA_EVT } else if (status == NFA_STATUS_FAILED) @@ -2593,6 +2389,12 @@ void RoutingManager::stackCallback (UINT8 event, tNFA_CONN_EVT_DATA* eventData) { android::checkforTranscation(NFA_CE_DEACTIVATED_EVT, (void *)eventData); routingManager.notifyDeactivated(NFA_TECHNOLOGY_MASK_A); +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) + if (android::is_wired_mode_open && se.mPassiveListenEnabled) + { + se.startThread(0x00); + } +#endif } #if (NXP_EXTNS == TRUE) android::rfActivation = false; @@ -2600,12 +2402,9 @@ void RoutingManager::stackCallback (UINT8 event, tNFA_CONN_EVT_DATA* eventData) break; case NFA_CE_DATA_EVT: { -#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if ((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) se.mRecvdTransEvt = true; se.mAllowWiredMode = true; - ALOGD("%s: Sem Post for mAllowWiredModeEvent", __FUNCTION__); - SyncEventGuard guard (se.mAllowWiredModeEvent); - se.mAllowWiredModeEvent.notifyOne(); #endif tNFA_CE_DATA& ce_data = eventData->ce_data; ALOGD("%s: NFA_CE_DATA_EVT; stat=0x%X; h=0x%X; data len=%u", fn, ce_data.status, ce_data.handle, ce_data.len); @@ -2652,6 +2451,16 @@ void RoutingManager::nfaEeCallback (tNFA_EE_EVT event, tNFA_EE_CBACK_DATA* event se.notifyModeSet(eventData->mode_set.ee_handle, !(eventData->mode_set.status),eventData->mode_set.ee_status ); } break; +#if (NXP_EXTNS == TRUE) && (NXP_WIRED_MODE_STANDBY == TRUE) + case NFA_EE_PWR_LINK_CTRL_EVT: + { + ALOGD ("%s: NFA_EE_PWR_LINK_CTRL_EVT; status: 0x%04X ", fn, + eventData->pwr_lnk_ctrl.status); + SyncEventGuard guard (se.mPwrLinkCtrlEvent); + se.mPwrLinkCtrlEvent.notifyOne(); + } + break; +#endif case NFA_EE_SET_TECH_CFG_EVT: { @@ -2674,7 +2483,7 @@ void RoutingManager::nfaEeCallback (tNFA_EE_EVT event, tNFA_EE_CBACK_DATA* event tNFA_EE_ACTION& action = eventData->action; tNFC_APP_INIT& app_init = action.param.app_init; android::checkforTranscation(NFA_EE_ACTION_EVT, (void *)eventData); -#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if (NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) se.mRecvdTransEvt = true; #endif if (action.trigger == NFC_EE_TRIG_SELECT) @@ -2703,8 +2512,7 @@ void RoutingManager::nfaEeCallback (tNFA_EE_EVT event, tNFA_EE_CBACK_DATA* event ALOGD ("%s: NFA_EE_ACTION_EVT; h=0x%X; trigger=rf tech (0x%X)", fn, action.ee_handle, action.trigger); else ALOGE ("%s: NFA_EE_ACTION_EVT; h=0x%X; unknown trigger (0x%X)", fn, action.ee_handle, action.trigger); - -#if((NXP_EXTNS == TRUE)&&(NFC_NXP_ESE == TRUE) && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if((NXP_EXTNS == TRUE)&&(NFC_NXP_ESE == TRUE)) if((action.ee_handle == 0x4C0)) { ALOGE ("%s: NFA_EE_ACTION_EVT; h=0x%X;DWP CL activated (0x%X)", fn, action.ee_handle, action.trigger); @@ -2712,17 +2520,17 @@ void RoutingManager::nfaEeCallback (tNFA_EE_EVT event, tNFA_EE_CBACK_DATA* event } #endif -#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if (NFC_NXP_CHIP_TYPE != PN547C2) /*if(action.ee_handle == 0x4C0 && (action.trigger != NFC_EE_TRIG_RF_TECHNOLOGY) && - !(action.trigger == NFC_EE_TRIG_RF_PROTOCOL && action.param.protocol == NFA_PROTOCOL_ISO_DEP)) + ((se.mIsDesfireMifareDisable) || !(action.trigger == NFC_EE_TRIG_RF_PROTOCOL && action.param.protocol == NFA_PROTOCOL_ISO_DEP))) { ALOGE("%s,Allow wired mode connection", fn); se.mAllowWiredMode = true; - SyncEventGuard guard (se.mAllowWiredModeEvent); - se.mAllowWiredModeEvent.notifyOne(); } else se.mAllowWiredMode = false;*/ + se.mIsActionNtfReceived = true; + se.mActiveCeHandle = action.ee_handle; if(action.ee_handle == 0x4C0) { if((action.trigger == NFC_EE_TRIG_RF_TECHNOLOGY)&& (gEseVirtualWiredProtectMask & 0x04)) @@ -2772,6 +2580,7 @@ void RoutingManager::nfaEeCallback (tNFA_EE_EVT event, tNFA_EE_CBACK_DATA* event UINT8 num_ee = eventData->ee_discover.num_ee; tNFA_EE_DISCOVER ee_disc_info = eventData->ee_discover; ALOGD ("%s: NFA_EE_DISCOVER_EVT; status=0x%X; num ee=%u", __FUNCTION__,eventData->status, eventData->ee_discover.num_ee); +#if (JCOP_WA_ENABLE == TRUE) if(android::isNfcInitializationDone() == true) { if(mChipId == 0x02 || mChipId == 0x04 || mChipId == 0x06) @@ -2791,11 +2600,14 @@ void RoutingManager::nfaEeCallback (tNFA_EE_EVT event, tNFA_EE_CBACK_DATA* event } } } +#endif gSeDiscoverycount++; if(gSeDiscoverycount == gActualSeCount) { SyncEventGuard g (gNfceeDiscCbEvent); ALOGD("%s: Sem Post for gNfceeDiscCbEvent", __FUNCTION__); + usleep(1000000); // wait for 1000 millisec + //wait for atleast 1 sec to receive all ntf gNfceeDiscCbEvent.notifyOne (); } } @@ -2804,8 +2616,7 @@ void RoutingManager::nfaEeCallback (tNFA_EE_EVT event, tNFA_EE_CBACK_DATA* event case NFA_EE_DISCOVER_REQ_EVT: ALOGD ("%s: NFA_EE_DISCOVER_REQ_EVT; status=0x%X; num ee=%u", __FUNCTION__, eventData->discover_req.status, eventData->discover_req.num_ee); -#if(NXP_EXTNS == TRUE) -#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if((NXP_EXTNS == TRUE) && (NFC_NXP_ESE == TRUE)) /* Handle Reader over SWP. * 1. Check if the event is for Reader over SWP. * 2. IF yes than send this info(READER_REQUESTED_EVENT) till FWK level. @@ -2922,7 +2733,6 @@ void RoutingManager::nfaEeCallback (tNFA_EE_EVT event, tNFA_EE_CBACK_DATA* event /*Set the configuration for UICC/ESE */ se.storeUiccInfo (eventData->discover_req); #endif -#endif break; case NFA_EE_NO_CB_ERR_EVT: @@ -3138,7 +2948,7 @@ int RoutingManager::com_android_nfc_cardemulation_doGetAidMatchingPlatform(JNIEn :When ever the second removal request is also reached , it is handled. */ -#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) void reader_req_event_ntf (union sigval) { static const char fn [] = "RoutingManager::reader_req_event_ntf"; @@ -3201,10 +3011,12 @@ void *ee_removed_ntf_handler_thread(void *data) SyncEventGuard guard(se.mEeSetModeEvent); se.mEeSetModeEvent.wait (); } +#if (JCOP_WA_ENABLE == TRUE) NFA_HciW4eSETransaction_Complete(Release); SyncEventGuard guard(se.mEEdatapacketEvent); recovery=FALSE; se.mEEdatapacketEvent.notifyOne(); +#endif rm.mResetHandlerMutex.unlock(); #if(NXP_EXTNS == TRUE) && (NFC_NXP_ESE == TRUE) if(active_ese_reset_control & TRANS_WIRED_ONGOING) @@ -3236,7 +3048,7 @@ void RoutingManager::ee_removed_disc_ntf_handler(tNFA_HANDLE handle, tNFA_EE_STA ALOGE("Unable to create the thread"); } } -#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) /******************************************************************************* ** ** Function: getEtsiReaederState @@ -3294,6 +3106,7 @@ Rdr_req_ntf_info_t RoutingManager::getSwpRrdReqInfo() #endif #if(NXP_EXTNS == TRUE) +#if (JCOP_WA_ENABLE == TRUE) bool RoutingManager::is_ee_recovery_ongoing() { ALOGD("is_ee_recovery_ongoing : recovery"); @@ -3302,6 +3115,7 @@ bool RoutingManager::is_ee_recovery_ongoing() else return false; } +#endif /******************************************************************************* ** @@ -3363,6 +3177,7 @@ void RoutingManager::processGetRoutingRsp(tNFA_DM_CBACK_DATA* eventData, UINT8* xx++; } } +#if (JCOP_WA_ENABLE == TRUE) /******************************************************************************* ** ** Function: handleSERemovedNtf() @@ -3375,20 +3190,20 @@ void RoutingManager::processGetRoutingRsp(tNFA_DM_CBACK_DATA* eventData, UINT8* void RoutingManager::handleSERemovedNtf() { static const char fn [] = "RoutingManager::handleSERemovedNtf()"; - UINT8 mActualNumEe = SecureElement::MAX_NUM_EE; - tNFA_EE_INFO mEeInfo [mActualNumEe]; + UINT8 ActualNumEe = SecureElement::MAX_NUM_EE; + tNFA_EE_INFO mEeInfo [ActualNumEe]; tNFA_STATUS nfaStat; ALOGE ("%s:Enter", __FUNCTION__); - if ((nfaStat = NFA_AllEeGetInfo (&mActualNumEe, mEeInfo)) != NFA_STATUS_OK) + if ((nfaStat = NFA_AllEeGetInfo (&ActualNumEe, mEeInfo)) != NFA_STATUS_OK) { ALOGE ("%s: fail get info; error=0x%X", fn, nfaStat); - mActualNumEe = 0; + ActualNumEe = 0; } else { if(mChipId == 0x02 || mChipId == 0x04 || mChipId == 0x06) { - for(int xx = 0; xx < mActualNumEe; xx++) + for(int xx = 0; xx < ActualNumEe; xx++) { ALOGE("xx=%d, ee_handle=0x0%x, status=0x0%x", xx, mEeInfo[xx].ee_handle,mEeInfo[xx].ee_status); if ((mEeInfo[xx].ee_handle == 0x4C0) && @@ -3402,6 +3217,7 @@ void RoutingManager::handleSERemovedNtf() } } } +#endif /******************************************************************************* ** ** Function: LmrtRspTimerCb @@ -3417,3 +3233,4 @@ static void LmrtRspTimerCb(union sigval) RoutingManager::getInstance().mEeUpdateEvent.notifyOne(); } #endif + diff --git a/nci/jni/RoutingManager.h b/nci/jni/RoutingManager.h index 581c6f3a..b0d6487f 100644 --- a/nci/jni/RoutingManager.h +++ b/nci/jni/RoutingManager.h @@ -86,6 +86,37 @@ typedef struct{ Mutex mMutex; }NfcID2_rmv_req_info_t; +typedef struct +{ + UINT8 protocol; + UINT16 routeLoc; + UINT8 power; + UINT8 enable; +} protoEntry_t; + +typedef struct +{ + UINT8 technology; + UINT16 routeLoc; + UINT8 power; + UINT8 enable; +} techEntry_t; + +typedef struct +{ + UINT16 nfceeID;//ID for the route location + tNFA_TECHNOLOGY_MASK tech_switch_on; /* default routing - technologies switch_on */ + tNFA_TECHNOLOGY_MASK tech_switch_off; /* default routing - technologies switch_off */ + tNFA_TECHNOLOGY_MASK tech_battery_off; /* default routing - technologies battery_off*/ + tNFA_TECHNOLOGY_MASK tech_screen_lock; /* default routing - technologies screen_lock*/ + tNFA_TECHNOLOGY_MASK tech_screen_off; /* default routing - technologies screen_off*/ + tNFA_PROTOCOL_MASK proto_switch_on; /* default routing - protocols switch_on */ + tNFA_PROTOCOL_MASK proto_switch_off; /* default routing - protocols switch_off */ + tNFA_PROTOCOL_MASK proto_battery_off; /* default routing - protocols battery_off */ + tNFA_PROTOCOL_MASK proto_screen_lock; /* default routing - protocols screen_lock */ + tNFA_PROTOCOL_MASK proto_screen_off; /* default routing - protocols screen_off */ +} LmrtEntry_t; + class RoutingManager { public: @@ -112,8 +143,11 @@ public: void HandleAddNfcID2_Req(); void HandleRmvNfcID2_Req(); void setCeRouteStrictDisable(UINT32 state); +#if (JCOP_WA_ENABLE == TRUE) bool is_ee_recovery_ongoing(); -#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) + void handleSERemovedNtf(); +#endif +#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) se_rd_req_state_t getEtsiReaederState(); Rdr_req_ntf_info_t getSwpRrdReqInfo(); #endif @@ -123,9 +157,7 @@ public: int addNfcid2Routing(UINT8* nfcid2, UINT8 aidLen,const UINT8* syscode, int syscodelen,const UINT8* optparam, int optparamlen); bool removeNfcid2Routing(UINT8* nfcID2); - void getRouting(); - void handleSERemovedNtf(); void processGetRoutingRsp(tNFA_DM_CBACK_DATA* eventData, UINT8* sRoutingBuff); bool addAidRouting(const UINT8* aid, UINT8 aidLen, int route, int power, bool isprefix); #else @@ -156,20 +188,51 @@ private: void notifyActivated (UINT8 technology); void notifyDeactivated (UINT8 technology); void notifyLmrtFull(); + void printMemberData(void); + void initialiseTableEntries(void); + void compileProtoEntries(void); + void compileTechEntries(void); + void consolidateProtoEntries(void); + void consolidateTechEntries(void); + void setProtoRouting(void); + void setTechRouting(void); + void processTechEntriesForFwdfunctionality(void); + void checkProtoSeID(void); + void dumpTables(int); + static const int DBG = true; + //Currently 4 protocols supported namely T3T, ISO-DEP, ISO-7816, NFC-DEP(taken care internally by the libnfc stack) + static const int MAX_PROTO_ENTRIES = 0x03; + static const int PROTO_T3T_IDX = 0x00; + static const int PROTO_ISODEP_IDX = 0x01; + static const int PROTO_ISO7816_IDX = 0x02; + //Currently 3 Technologies supported namely A,B,F + static const int MAX_TECH_ENTRIES = 0x03; + static const int TECH_A_IDX = 0x00; + static const int TECH_B_IDX = 0x01; + static const int TECH_F_IDX = 0x02; + //Fixed number of Lmrt entries + static const int MAX_ROUTE_LOC_ENTRIES = 0x04; + //Fixed route location Lmrt index + static const int ROUTE_LOC_HOST_ID_IDX = 0x00; + static const int ROUTE_LOC_ESE_ID_IDX = 0x01; + static const int ROUTE_LOC_UICC1_ID_IDX = 0x02; + static const int ROUTE_LOC_UICC2_ID_IDX = 0x03; + //Fixed route location Lmrt entries + static const int ROUTE_LOC_HOST_ID = 0x400; + static const int ROUTE_LOC_ESE_ID = 0x4C0; + static const int ROUTE_LOC_UICC1_ID = 0x402; + static const int ROUTE_LOC_UICC2_ID = 0x481; // See AidRoutingManager.java for corresponding // AID_MATCHING_ constants - // Every routing table entry is matched exact (BCM20793) static const int AID_MATCHING_EXACT_ONLY = 0x00; // Every routing table entry can be matched either exact or prefix static const int AID_MATCHING_EXACT_OR_PREFIX = 0x01; // Every routing table entry is matched as a prefix static const int AID_MATCHING_PREFIX_ONLY = 0x02; - // See AidRoutingManager.java for corresponding // AID_MATCHING_ platform constants - //Behavior as per Android-L, supporting prefix match and full //match for both OnHost and OffHost apps. static const int AID_MATCHING_L = 0x01; @@ -199,20 +262,33 @@ private: static const JNINativeMethod sMethods []; int mDefaultEe; //since this variable is used in both cases moved out of compiler switch int mHostListnTechMask; + int mUiccListnTechMask; int mFwdFuntnEnable; static int mChipId; SyncEvent mEeRegisterEvent; SyncEvent mRoutingEvent; #if(NXP_EXTNS == TRUE) - UINT32 mCeRouteStrictDisable; - int defaultSeID ; - bool mIsDirty; - int defaultPowerstate; - int defaultProtoSeID; - int defaultProtoPowerstate; - int defaultTechSeID; - int defaultTechAPowerstate; - int DefaultTechType; - int mAddAid; + bool mIsDirty; + protoEntry_t mProtoTableEntries[MAX_PROTO_ENTRIES]; + techEntry_t mTechTableEntries[MAX_TECH_ENTRIES]; + LmrtEntry_t mLmrtEntries[MAX_ROUTE_LOC_ENTRIES]; + UINT32 mCeRouteStrictDisable; + UINT32 mDefaultIso7816SeID; + UINT32 mDefaultIso7816Powerstate; + UINT32 mDefaultIsoDepSeID; + UINT32 mDefaultIsoDepPowerstate; + UINT32 mDefaultT3TSeID; + UINT32 mDefaultT3TPowerstate; + UINT32 mDefaultTechType; + UINT32 mDefaultTechASeID; + UINT32 mDefaultTechAPowerstate; + UINT32 mDefaultTechBSeID; + UINT32 mDefaultTechBPowerstate; + UINT32 mDefaultTechFSeID; + UINT32 mDefaultTechFPowerstate; + UINT32 mAddAid; + UINT32 mTechSupportedByEse; + UINT32 mTechSupportedByUicc1; + UINT32 mTechSupportedByUicc2; #endif }; diff --git a/nci/jni/SecureElement.cpp b/nci/jni/SecureElement.cpp index 840fa36b..9654f5d2 100644 --- a/nci/jni/SecureElement.cpp +++ b/nci/jni/SecureElement.cpp @@ -53,7 +53,11 @@ #include <signal.h> #include <sys/types.h> #endif +extern "C"{ +#include "nfa_api.h" +} #endif + /***************************************************************************** ** ** public variables @@ -67,21 +71,32 @@ bool gReaderNotificationflag = false; bool hold_the_transceive = false; int dual_mode_current_state=0; nfc_jni_native_data* mthreadnative; -#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) extern Rdr_req_ntf_info_t swp_rdr_req_ntf_info ; #endif +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) +pthread_t passiveListenEnable_thread; +static void passiveListenDisablecallBack(union sigval); +void *passiveListenEnableThread(void *arg); +static uint8_t passiveListenState = 0x00; +static bool isTransceiveOngoing = false; +bool ceTransactionPending = false; +#endif namespace android { extern void startRfDiscovery (bool isStart); extern void setUiccIdleTimeout (bool enable); extern bool isDiscoveryStarted(); extern int getScreenState(); -#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) - extern bool isp2pActivated(); +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) + extern bool is_wired_mode_open; #endif + extern bool isp2pActivated(); extern SyncEvent sNfaSetConfigEvent; extern tNFA_STATUS EmvCo_dosetPoll(jboolean enable); +#if (JCOP_WA_ENABLE == TRUE) extern tNFA_STATUS ResetEseSession(); +#endif extern void config_swp_reader_mode(bool mode); extern void start_timer_msec(struct timeval *start_tv); extern long stop_timer_getdifference_msec(struct timeval *start_tv, struct timeval *stop_tv); @@ -94,6 +109,9 @@ SyncEvent sSPIPrioSessionEndEvent; static UINT32 nfccStandbytimeout; // timeout for secelem standby mode detection static void NFCC_StandbyModeTimerCallBack (union sigval); int active_ese_reset_control = 0; + bool hold_wired_mode = false; + SyncEvent mWiredModeHoldEvent; + #endif SyncEvent mDualModeEvent; static void setSPIState(bool mState); @@ -145,7 +163,7 @@ static const tNCI_DISCOVER_MAPS nfc_interface_mapping_ese[NFC_SWP_RD_NUM_INTERFA } }; -#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) /******************************************************************************* ** ** Function: startStopSwpReaderProc @@ -202,6 +220,15 @@ SecureElement::SecureElement () : mActiveEeHandle (NFA_HANDLE_INVALID), mRecvdTransEvt(false), mAllowWiredMode(false), + mPassiveListenCnt(0), + mPassiveListenTimeout(0), +#if(NXP_EXTNS == TRUE) + mActiveCeHandle(NFA_HANDLE_INVALID), + mIsWiredModeOpen(false), + mIsActionNtfReceived(false), + mIsDesfireMifareDisable(false), + mIsAllowWiredInDesfireMifareCE(false), +#endif mDestinationGate (4), //loopback gate mNfaHciHandle (NFA_HANDLE_INVALID), mNativeData (NULL), @@ -223,8 +250,6 @@ SecureElement::SecureElement () mGetAtrRspwait (false), mRfFieldIsOn(false), mTransceiveWaitOk(false), - - mWiredModeRfFiledEnable(0) { memset (&mEeInfo, 0, sizeof(mEeInfo)); @@ -299,6 +324,7 @@ bool SecureElement::initialize (nfc_jni_native_data* native) static const char fn [] = "SecureElement::initialize"; tNFA_STATUS nfaStat; unsigned long num = 0; + unsigned long retValue; ALOGD ("%s: enter", fn); @@ -312,7 +338,7 @@ bool SecureElement::initialize (nfc_jni_native_data* native) mActiveSeOverride = num; ALOGD ("%s: Active SE override: 0x%X", fn, mActiveSeOverride); } -#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if (NFC_NXP_CHIP_TYPE != PN547C2) if (GetNxpNumValue (NAME_NXP_WIRED_MODE_RF_FIELD_ENABLE, (void*)&num, sizeof(num))) { ALOGD ("%s: NAME_NXP_WIRED_MODE_RF_FIELD_ENABLE =%d",fn, num); @@ -320,6 +346,14 @@ bool SecureElement::initialize (nfc_jni_native_data* native) } #endif #if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) +#if(CONCURRENCY_PROTECTION == TRUE) + if (GetNxpNumValue(NAME_NXP_NFCC_PASSIVE_LISTEN_TIMEOUT, &mPassiveListenTimeout, sizeof(mPassiveListenTimeout)) == false) + { + mPassiveListenTimeout = 2500; + ALOGD ("%s: NFCC Passive Listen Disable timeout =%d", fn, mPassiveListenTimeout); + } + ALOGD ("%s: NFCC Passive Listen Disable timeout =%d", fn, mPassiveListenTimeout); +#endif if (GetNxpNumValue(NAME_NXP_NFCC_STANDBY_TIMEOUT, &nfccStandbytimeout, sizeof(nfccStandbytimeout)) == false) { nfccStandbytimeout = 20000; @@ -336,6 +370,27 @@ bool SecureElement::initialize (nfc_jni_native_data* native) dual_mode_current_state = SPI_DWPCL_NOT_ACTIVE; hold_the_transceive = false; active_ese_reset_control = 0; + hold_wired_mode = false; + mlistenDisabled = false; + mIsExclusiveWiredMode = false; + + if (GetNxpNumValue(NAME_NXP_MIFARE_DESFIRE_DISABLE, &retValue, sizeof(retValue)) == false) + { + mIsDesfireMifareDisable = false; + } + else + { + mIsDesfireMifareDisable = (retValue == 0x00)? false: true; + } + if (GetNxpNumValue(NAME_NXP_ALLOW_WIRED_IN_MIFARE_DESFIRE_CLT, &retValue, sizeof(retValue)) == false) + { + mIsAllowWiredInDesfireMifareCE = false; + } + else + { + mIsAllowWiredInDesfireMifareCE = (retValue == 0x00)? false: true; + } + #endif /* * Since NXP doesn't support OBERTHUR RESET COMMAND, Hence commented @@ -357,6 +412,10 @@ bool SecureElement::initialize (nfc_jni_native_data* native) mRfFieldIsOn = false; mActivatedInListenMode = false; mCurrentRouteSelection = NoRoute; +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) + mPassiveListenEnabled = true; + meseUiccConcurrentAccess = false; +#endif memset (mEeInfo, 0, sizeof(mEeInfo)); memset (&mUiccInfo, 0, sizeof(mUiccInfo)); memset (&mHciCfg, 0, sizeof(mHciCfg)); @@ -453,6 +512,43 @@ bool SecureElement::updateEEStatus () ALOGD ("%s: exit", __FUNCTION__); return (true); } + +/******************************************************************************* + ** + ** Function: isTeckInfoReceived + ** + ** Description: isTeckInfoReceived + ** Checks if discovery_req_ntf received + ** for a given EE + ** + ** Returns: True if discovery_req_ntf is received. + ** + *******************************************************************************/ +bool SecureElement::isTeckInfoReceived (UINT16 eeHandle) +{ + ALOGD ("%s: enter", __FUNCTION__); + bool stat = false; + if (! getEeInfo()) + { + ALOGE ("%s: No updated eeInfo available", __FUNCTION__); + stat = false; + } + else + { + for (UINT8 xx = 0; xx < mActualNumEe; xx++) + { + if ((mEeInfo[xx].ee_handle == eeHandle) && + ((mEeInfo[xx].la_protocol != 0x00) || (mEeInfo[xx].lb_protocol != 0x00) || + (mEeInfo[xx].lf_protocol != 0x00) || (mEeInfo[xx].lbp_protocol != 0x00))) + { + stat = true; + break; + } + } + } + ALOGD ("%s: stat : 0x%02x", __FUNCTION__,stat); + return stat; +} #endif /******************************************************************************* ** @@ -836,7 +932,7 @@ bool SecureElement::activate (jint seID) ALOGD ("%s: override ee h=0x%X", fn, overrideEeHandle ); -#if (NFC_NXP_ESE != TRUE || ((NFC_NXP_CHIP_TYPE != PN548C2) && (NFC_NXP_CHIP_TYPE != PN551))) +#if (NFC_NXP_ESE != TRUE) if (mRfFieldIsOn) { ALOGE("%s: RF field indication still on, resetting", fn); mRfFieldIsOn = false; @@ -848,7 +944,11 @@ bool SecureElement::activate (jint seID) { tNFA_EE_INFO& eeItem = mEeInfo[index]; - if ((eeItem.ee_handle == EE_HANDLE_0xF3) || (eeItem.ee_handle == EE_HANDLE_0xF4)) + if ((eeItem.ee_handle == EE_HANDLE_0xF3) || (eeItem.ee_handle == EE_HANDLE_0xF4) +#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE) + || (eeItem.ee_handle == EE_HANDLE_0xF8) +#endif + ) { if (overrideEeHandle && (overrideEeHandle != eeItem.ee_handle) ) continue; // do not enable all SEs; only the override one @@ -874,6 +974,11 @@ bool SecureElement::activate (jint seID) } } } //for +#if (NXP_EXTNS == TRUE) + mActiveEeHandle = getActiveEeHandle(handle); +#else + mActiveEeHandle = getDefaultEeHandle(); +#endif mActiveEeHandle = getDefaultEeHandle(); if (mActiveEeHandle == NFA_HANDLE_INVALID) @@ -940,7 +1045,11 @@ bool SecureElement::deactivate (jint seID) tNFA_EE_INFO& eeItem = mEeInfo[index]; if ( eeItem.ee_handle == handle && - ((eeItem.ee_handle == EE_HANDLE_0xF3) || (eeItem.ee_handle == EE_HANDLE_0xF4))) + ((eeItem.ee_handle == EE_HANDLE_0xF3) || (eeItem.ee_handle == EE_HANDLE_0xF4) +#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE) + || (eeItem.ee_handle == EE_HANDLE_0xF8) +#endif + )) { if (eeItem.ee_status == NFC_NFCEE_STATUS_INACTIVE) @@ -1200,8 +1309,11 @@ bool SecureElement::connectEE () return (false); } -#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) -//Do Nothing +#if (((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))) +#if (NXP_ESE_WIRED_MODE_DISABLE_DISCOVERY == TRUE) + // Disable RF discovery completely while the DH is connected + android::startRfDiscovery(false); +#endif #else android::startRfDiscovery(false); #endif @@ -1246,17 +1358,44 @@ bool SecureElement::connectEE () if (mNewPipeId != 0) { #if(NXP_EXTNS == TRUE) - UINT8 host = (mNewPipeId == STATIC_PIPE_0x70) ? 0xC0 : 0x03; + UINT8 host; + if(mActiveEeHandle == EE_HANDLE_0xF3) + { + host = (mNewPipeId == STATIC_PIPE_0x70) ? 0xC0 : 0x03; + } + else + { + host = (mNewPipeId == STATIC_PIPE_UICC) ? 0x02 : 0x03; + } #else UINT8 host = (mNewPipeId == STATIC_PIPE_0x70) ? 0x02 : 0x03; #endif + //TODO according ETSI12 APDU Gate +#if(NXP_EXTNS == TRUE) + UINT8 gate; + if(mActiveEeHandle == EE_HANDLE_0xF3) + { + gate = (mNewPipeId == STATIC_PIPE_0x70) ? 0xF0 : 0xF1; + } + else + { + gate = (mNewPipeId == STATIC_PIPE_UICC) ? 0x30 : 0x31; + } +#else UINT8 gate = (mNewPipeId == STATIC_PIPE_0x70) ? 0xF0 : 0xF1; - nfaStat = NFA_HciAddStaticPipe(mNfaHciHandle, host, gate, mNewPipeId); - if (nfaStat != NFA_STATUS_OK) +#endif +#if(NXP_EXTNS == TRUE) + ALOGD ("%s: Using host id : 0x%X,gate id : 0x%X,pipe id : 0x%X", __FUNCTION__,host,gate, mNewPipeId); +#endif + if(!isEtsi12ApduGatePresent()) { - ALOGE ("%s: fail create static pipe; error=0x%X", fn, nfaStat); - retVal = false; - goto TheEnd; + nfaStat = NFA_HciAddStaticPipe(mNfaHciHandle, host, gate, mNewPipeId); + if (nfaStat != NFA_STATUS_OK) + { + ALOGE ("%s: fail create static pipe; error=0x%X", fn, nfaStat); + retVal = false; + goto TheEnd; + } } } else @@ -1404,6 +1543,9 @@ bool SecureElement::disconnectEE (jint seID) dual_mode_current_state ^= SPI_ON; hold_the_transceive = false; +#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) + hold_wired_mode = false; +#endif // Re-enable UICC low-power mode // Re-enable RF discovery @@ -1506,6 +1648,7 @@ bool SecureElement::transceive (UINT8* xmitBuffer, INT32 xmitBufferSize, UINT8* { android::start_timer_msec(&start_timer); ALOGD("%s: holding the transceive for %d ms.\n", fn, (timeoutMillisec - time_elapsed)); + SyncEventGuard guard(sSPIPrioSessionEndEvent); if(sSPIPrioSessionEndEvent.wait(timeoutMillisec - time_elapsed)== FALSE) { ALOGE ("%s: wait response timeout \n", fn); @@ -1525,6 +1668,7 @@ bool SecureElement::transceive (UINT8* xmitBuffer, INT32 xmitBufferSize, UINT8* if ((mNewPipeId == STATIC_PIPE_0x70) || (mNewPipeId == STATIC_PIPE_0x71)) #if(NXP_EXTNS == TRUE) { +#if (JCOP_WA_ENABLE == TRUE) if((RoutingManager::getInstance().is_ee_recovery_ongoing())) { ALOGE ("%s: is_ee_recovery_ongoing ", fn); @@ -1535,13 +1679,17 @@ bool SecureElement::transceive (UINT8* xmitBuffer, INT32 xmitBufferSize, UINT8* { ALOGE ("%s: Not in Recovery State", fn); } -#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) - if(!isWiredModeAllowedInRfState()) +#endif +#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) +#if((NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_WIRED_MODE_RESUME)||\ + (NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_WIRED_MODE_TIMEOUT)) + if(!checkForWiredModeAccess()) { ALOGD("%s, Dont allow wired mode in this RF state", fn); goto TheEnd; } #endif +#endif #if((NFC_NXP_TRIPLE_MODE_PROTECTION==TRUE)&&((NFC_NXP_ESE_VER == JCOP_VER_3_2)||(NFC_NXP_ESE_VER == JCOP_VER_3_3))) if((dual_mode_current_state == SPI_DWPCL_BOTH_ACTIVE)) { @@ -1562,9 +1710,17 @@ bool SecureElement::transceive (UINT8* xmitBuffer, INT32 xmitBufferSize, UINT8* #endif #endif #endif +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) + isTransceiveOngoing = true; +#endif nfaStat = NFA_HciSendEvent (mNfaHciHandle, mNewPipeId, EVT_SEND_DATA, xmitBufferSize, xmitBuffer, sizeof(mResponseData), mResponseData, timeoutMillisec); #if(NXP_EXTNS == TRUE) } + else if (mNewPipeId == STATIC_PIPE_UICC) + { + ALOGD("%s, Starting UICC wired mode!!!!!!.....", fn); + nfaStat = NFA_HciSendEvent (mNfaHciHandle, mNewPipeId, EVT_SEND_DATA, xmitBufferSize, xmitBuffer, sizeof(mResponseData), mResponseData, timeoutMillisec); + } #endif else #if(NXP_EXTNS == TRUE) @@ -1581,6 +1737,9 @@ bool SecureElement::transceive (UINT8* xmitBuffer, INT32 xmitBufferSize, UINT8* #endif #endif #endif +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) + isTransceiveOngoing = true; +#endif nfaStat = NFA_HciSendEvent (mNfaHciHandle, mNewPipeId, NFA_HCI_EVT_POST_DATA, xmitBufferSize, xmitBuffer, sizeof(mResponseData), mResponseData, timeoutMillisec); #if(NXP_EXTNS == TRUE) } @@ -1589,8 +1748,12 @@ bool SecureElement::transceive (UINT8* xmitBuffer, INT32 xmitBufferSize, UINT8* { // waitOk = mTransceiveEvent.wait (timeoutMillisec); mTransceiveEvent.wait (); +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) + isTransceiveOngoing = false; +#endif #if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) +#if (JCOP_WA_ENABLE == TRUE) if(active_ese_reset_control & TRANS_WIRED_ONGOING) { active_ese_reset_control ^= TRANS_WIRED_ONGOING; @@ -1608,6 +1771,7 @@ bool SecureElement::transceive (UINT8* xmitBuffer, INT32 xmitBufferSize, UINT8* } } #endif +#endif if (mTransceiveWaitOk == false) //timeout occurs { ALOGE ("%s: wait response timeout", fn); @@ -1640,9 +1804,11 @@ TheEnd: } } #endif +#if (JCOP_WA_ENABLE == TRUE) if((active_ese_reset_control&TRANS_WIRED_ONGOING)) active_ese_reset_control ^= TRANS_WIRED_ONGOING; #endif +#endif ALOGD ("%s: exit; isSuccess: %d; recvBufferActualSize: %ld", fn, isSuccess, recvBufferActualSize); return (isSuccess); } @@ -1664,8 +1830,10 @@ void SecureElement::setCLState(bool mState) { dual_mode_current_state |= CL_ACTIVE; #if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) +#if (JCOP_WA_ENABLE == TRUE) active_ese_reset_control |= TRANS_CL_ONGOING; #endif +#endif } else { @@ -1673,6 +1841,7 @@ void SecureElement::setCLState(bool mState) { dual_mode_current_state ^= CL_ACTIVE; #if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) +#if (JCOP_WA_ENABLE == TRUE) if((active_ese_reset_control&TRANS_CL_ONGOING)) { active_ese_reset_control ^= TRANS_CL_ONGOING; @@ -1688,12 +1857,21 @@ void SecureElement::setCLState(bool mState) } } #endif +#endif if(inDualModeAlready) { SyncEventGuard guard (mDualModeEvent); mDualModeEvent.notifyOne(); } } +#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) + if(hold_wired_mode) + { + SyncEventGuard guard (mWiredModeHoldEvent); + mWiredModeHoldEvent.notifyOne(); + hold_wired_mode = false; + } +#endif } ALOGD ("%s: Exit setCLState = %d\n", __FUNCTION__, dual_mode_current_state); } @@ -1754,15 +1932,14 @@ void SecureElement::notifyListenModeState (bool isActivated) { } mActivatedInListenMode = isActivated; -#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if ((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) if(!isActivated) { mRecvdTransEvt = false; mAllowWiredMode = false; - ALOGD("%s: Sem Post for mAllowWiredModeEvent", __FUNCTION__); - SyncEventGuard guard (mAllowWiredModeEvent); - mAllowWiredModeEvent.notifyOne(); + mIsActionNtfReceived = false; setCLState(false); + mActiveCeHandle = NFA_HANDLE_INVALID; } else { @@ -1816,18 +1993,37 @@ void SecureElement::notifyRfFieldEvent (bool isActive) ALOGE("%s: clock_gettime failed", fn); // There is no good choice here... } +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) + if (android::is_wired_mode_open) + { + if (isActive) + { + ceTransactionPending = true; + ALOGD ("%s: CE Transaction pending flag set", fn); + } + else + { + ceTransactionPending = false; + ALOGD ("%s: CE Transaction pending flag cleared", fn); + } + } + if (ceTransactionPending) + { + if(isTransceiveOngoing == false && mPassiveListenEnabled == false) + { + startThread(0x01); + } + } +#endif if (isActive) { mRfFieldIsOn = true; e->CallVoidMethod (mNativeData->manager, android::gCachedNfcManagerNotifySeFieldActivated); } else { mRfFieldIsOn = false; -#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if (NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) mRecvdTransEvt = false; mAllowWiredMode = false; - ALOGD("%s: Sem Post for mAllowWiredModeEvent", __FUNCTION__); - SyncEventGuard guard (mAllowWiredModeEvent); - mAllowWiredModeEvent.notifyOne(); #endif setCLState(false); e->CallVoidMethod (mNativeData->manager, android::gCachedNfcManagerNotifySeFieldDeactivated); @@ -1842,7 +2038,7 @@ void SecureElement::notifyRfFieldEvent (bool isActive) ALOGD ("%s: exit", fn); } -#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) /*Reader over SWP*/ void SecureElement::notifyEEReaderEvent (int evt, int data) { @@ -2204,6 +2400,22 @@ void SecureElement::nfaHciCallback (tNFA_HCI_EVT event, tNFA_HCI_EVT_DATA* event { ALOGD ("%s: NFA_HCI_EVENT_RCVD_EVT: NFA_HCI_EVT_WTX ", fn); } +#if(NXP_EXTNS == TRUE) + else if ((eventData->rcvd_evt.evt_code == NFA_HCI_ABORT)&&(eventData->rcvd_evt.pipe != 0x16)&&(eventData->rcvd_evt.pipe != 0x0A)) + { + ALOGD ("%s: NFA_HCI_EVENT_RCVD_EVT: NFA_HCI_ABORT; status:0x%X, pipe:0x%X, len:%d", fn,\ + eventData->rcvd_evt.status, eventData->rcvd_evt.pipe, eventData->rcvd_evt.evt_len); + if(eventData->rcvd_evt.evt_len > 0) + { + sSecElem.mAbortEventWaitOk = true; + SyncEventGuard guard(sSecElem.mAbortEvent); + memcpy(sSecElem.mAtrInfo, eventData->rcvd_evt.p_evt_buf, eventData->rcvd_evt.evt_len); + sSecElem.mAtrInfolen = eventData->rcvd_evt.evt_len; + sSecElem.mAtrStatus = eventData->rcvd_evt.status; + sSecElem.mAbortEvent.notifyOne(); + } + } +#endif else if ((eventData->rcvd_evt.pipe == STATIC_PIPE_0x70) || (eventData->rcvd_evt.pipe == STATIC_PIPE_0x71)) { ALOGD ("%s: NFA_HCI_EVENT_RCVD_EVT; data from static pipe", fn); @@ -2216,6 +2428,7 @@ void SecureElement::nfaHciCallback (tNFA_HCI_EVT event, tNFA_HCI_EVT_DATA* event sSecElem.mTransceiveWaitOk = true; SecureElement::getInstance().NfccStandByOperation(STANDBY_TIMER_START); } +#if (JCOP_WA_ENABLE == TRUE) /*If there is pending reset event to process*/ if((active_ese_reset_control&RESET_BLOCKED)&& (!(active_ese_reset_control &(TRANS_CL_ONGOING)))) @@ -2223,6 +2436,7 @@ void SecureElement::nfaHciCallback (tNFA_HCI_EVT event, tNFA_HCI_EVT_DATA* event SyncEventGuard guard (sSecElem.mResetEvent); sSecElem.mResetEvent.notifyOne(); } +#endif #else if(eventData->rcvd_evt.evt_len > 0) { @@ -2254,7 +2468,7 @@ void SecureElement::nfaHciCallback (tNFA_HCI_EVT event, tNFA_HCI_EVT_DATA* event //BERTLV decoding here, to support extended data length for params. datalen = SecureElement::decodeBerTlvLength((UINT8 *)eventData->rcvd_evt.p_evt_buf, 2+aidlen+1, eventData->rcvd_evt.evt_len); } - if(datalen != -1) + if(datalen > 0) { /* Over 128 bytes data of transaction can not receive on PN547, Ref. BER-TLV length fields in ISO/IEC 7816 */ if ( datalen < 0x80) @@ -2274,7 +2488,10 @@ void SecureElement::nfaHciCallback (tNFA_HCI_EVT event, tNFA_HCI_EVT_DATA* event dataStartPosition = 2+aidlen+5; } data = &eventData->rcvd_evt.p_evt_buf[dataStartPosition]; - sSecElem.notifyTransactionListenersOfAid (&eventData->rcvd_evt.p_evt_buf[2],aidlen,data,datalen,evtSrc); + if(datalen > 0) + { + sSecElem.notifyTransactionListenersOfAid (&eventData->rcvd_evt.p_evt_buf[2],aidlen,data,datalen,evtSrc); + } } else { @@ -2306,7 +2523,28 @@ void SecureElement::nfaHciCallback (tNFA_HCI_EVT event, tNFA_HCI_EVT_DATA* event sSecElem.mRegistryEvent.notifyOne (); break; } - +#if(NXP_EXTNS == TRUE) + case NFA_HCI_RSP_SENT_ADMIN_EVT: + { + ALOGD ("%s: NFA_HCI_RSP_SENT_ADMIN_EVT; status=0x%X", fn, eventData->admin_rsp_rcvd.status); + SyncEventGuard guard(sSecElem.mNfceeInitCbEvent); + sSecElem.mHostsPresent = eventData->admin_rsp_rcvd.NoHostsPresent; + ALOGD ("%s: NFA_HCI_RSP_SENT_ADMIN_EVT; NoHostsPresent=0x%X", fn, eventData->admin_rsp_rcvd.NoHostsPresent); + if(eventData->admin_rsp_rcvd.NoHostsPresent > 0) + { + memcpy(sSecElem.mHostsId, eventData->admin_rsp_rcvd.HostIds,eventData->admin_rsp_rcvd.NoHostsPresent); + } + sSecElem.mNfceeInitCbEvent.notifyOne(); + break; + } + case NFA_HCI_CONFIG_DONE_EVT: + { + ALOGD ("%s: NFA_HCI_CONFIG_DONE_EVT; status=0x%X", fn, eventData->admin_rsp_rcvd.status); + SyncEventGuard guard(sSecElem.mNfceeInitCbEvent); + sSecElem.mNfceeInitCbEvent.notifyOne(); + break; + } +#endif default: ALOGE ("%s: unknown event code=0x%X ????", fn, event); break; @@ -2406,7 +2644,11 @@ tNFA_HANDLE SecureElement::getDefaultEeHandle () (mEeInfo[xx].ee_interface[0] != NCI_NFCEE_INTERFACE_HCI_ACCESS) #else && - (mEeInfo[xx].ee_handle == EE_HANDLE_0xF3 || mEeInfo[xx].ee_handle == EE_HANDLE_0xF4) + (mEeInfo[xx].ee_handle == EE_HANDLE_0xF3 || mEeInfo[xx].ee_handle == EE_HANDLE_0xF4 +#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE) + || mEeInfo[xx].ee_handle == EE_HANDLE_0xF8 +#endif + ) #endif && (mEeInfo[xx].ee_status != NFC_NFCEE_STATUS_INACTIVE)) @@ -2414,8 +2656,51 @@ tNFA_HANDLE SecureElement::getDefaultEeHandle () } return NFA_HANDLE_INVALID; } +#if(NXP_EXTNS == TRUE) +/******************************************************************************* +** +** Function: getActiveEeHandle +** +** Description: Get the handle to the execution environment. +** +** Returns: Handle to the execution environment. +** +*******************************************************************************/ +tNFA_HANDLE SecureElement::getActiveEeHandle (tNFA_HANDLE handle) +{ + static const char fn [] = "SecureElement::getActiveEeHandle"; + ALOGE ("%s: - Enter", fn); + ALOGE ("%s: - mActualNumEe = %x mActiveSeOverride = 0x%02X", fn,mActualNumEe, mActiveSeOverride); + UINT16 overrideEeHandle = NFA_HANDLE_GROUP_EE | mActiveSeOverride; + ALOGE ("%s: - mActualNumEe = %x overrideEeHandle = 0x%02X", fn,mActualNumEe, overrideEeHandle); + + for (UINT8 xx = 0; xx < mActualNumEe; xx++) + { + if ( (mActiveSeOverride != ACTIVE_SE_USE_ANY) && (overrideEeHandle != mEeInfo[xx].ee_handle)) + ALOGE ("%s: - mEeInfo[xx].ee_handle = 0x%02x, mEeInfo[xx].ee_status = 0x%02x", fn,mEeInfo[xx].ee_handle, mEeInfo[xx].ee_status); + + if ((mEeInfo[xx].num_interface != 0) +#ifndef GEMALTO_SE_SUPPORT + && + (mEeInfo[xx].ee_interface[0] != NCI_NFCEE_INTERFACE_HCI_ACCESS) +#else + && + (mEeInfo[xx].ee_handle == EE_HANDLE_0xF3 || mEeInfo[xx].ee_handle == EE_HANDLE_0xF4 +#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE) + || mEeInfo[xx].ee_handle == EE_HANDLE_0xF8 +#endif +) + +#endif + && + (mEeInfo[xx].ee_status != NFC_NFCEE_STATUS_INACTIVE)&& (mEeInfo[xx].ee_handle == handle)) + return (mEeInfo[xx].ee_handle); + } + return NFA_HANDLE_INVALID; +} +#endif /******************************************************************************* ** ** Function: findUiccByHandle @@ -2513,8 +2798,8 @@ bool SecureElement::getAtr(jint seID, UINT8* recvBuffer, INT32 *recvBufferSize) ALOGD("%s: enter ;seID=0x%X", fn, seID); int timeoutMillisec = 30000; -#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) - if(!isWiredModeAllowedInRfState()) +#if ((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) + if(!checkForWiredModeAccess()) { ALOGD("Denying /atr in SE listen mode active"); return false; @@ -2527,6 +2812,7 @@ bool SecureElement::getAtr(jint seID, UINT8* recvBuffer, INT32 *recvBufferSize) } #endif #endif + if(!isEtsi12ApduGatePresent()) { SyncEventGuard guard (mGetRegisterEvent); nfaStat = NFA_HciGetRegistry (mNfaHciHandle, mNewPipeId, reg_index); @@ -2536,21 +2822,45 @@ bool SecureElement::getAtr(jint seID, UINT8* recvBuffer, INT32 *recvBufferSize) mGetRegisterEvent.wait(); ALOGE("%s: Received ATR response on pipe 0x%x ", fn, mNewPipeId); } + *recvBufferSize = mAtrInfolen; + memcpy(recvBuffer, mAtrInfo, mAtrInfolen); + } + else + { + mAbortEventWaitOk = false; + uint8_t mAtrInfo1[32]={0}; + uint8_t atr_len = 0; + SyncEventGuard guard (mAbortEvent); + nfaStat = NFA_HciSendEvent(mNfaHciHandle, mNewPipeId, EVT_ABORT, 0, NULL, atr_len, mAtrInfo1, 3000); + if(nfaStat == NFA_STATUS_OK) + { + mAbortEvent.wait(); + } + if(mAbortEventWaitOk == false) + { + ALOGE("%s (EVT_ABORT)Wait reposne timeout"); + nfaStat = NFA_STATUS_FAILED; + } + else + { + *recvBufferSize = mAtrInfolen; + memcpy(recvBuffer, mAtrInfo, mAtrInfolen); + } } - *recvBufferSize = mAtrInfolen; - memcpy(recvBuffer, mAtrInfo, mAtrInfolen); - if(mAtrStatus == NFA_HCI_ANY_E_NOK) - reconfigureEseHciInit(); +#if (JCOP_WA_ENABLE == TRUE) + if(mAtrStatus == NFA_HCI_ANY_E_NOK) + reconfigureEseHciInit(); +#endif #if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) #if((NFC_NXP_ESE_VER == JCOP_VER_3_1) || (NFC_NXP_ESE_VER == JCOP_VER_3_2)) - if (NFC_RelEseAccess((void *)&nfaStat) != 0) - { - ALOGE ("%s: NFC_ReqWiredAccess timeout", fn); - } + if (NFC_RelEseAccess((void *)&nfaStat) != 0) + { + ALOGE ("%s: NFC_ReqWiredAccess timeout", fn); + } #endif #endif - return (nfaStat == NFA_STATUS_OK)?true:false; + return (nfaStat == NFA_STATUS_OK)?true:false; } /******************************************************************************* @@ -2632,7 +2942,13 @@ jint SecureElement::getGenericEseId(tNFA_HANDLE handle) { ret = UICC_ID; } +#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE) + else if(handle == (EE_HANDLE_0xF8 & ~NFA_HANDLE_GROUP_EE) ) //UICC2 - 0x04 + { + ret = UICC2_ID; + } +#endif return ret; } @@ -2650,6 +2966,12 @@ tNFA_HANDLE SecureElement::getEseHandleFromGenericId(jint eseId) { handle = EE_HANDLE_0xF4; //0x402; } +#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE) + else if(eseId == UICC2_ID) //UICC + { + handle = EE_HANDLE_0xF8; //0x481; + } +#endif else if(eseId == DH_ID) //Host { handle = NFA_EE_HANDLE_DH; //0x400; @@ -2731,6 +3053,38 @@ bool SecureElement::sendEvent(UINT8 event) return retval; } +#if (NXP_EXTNS == TRUE) +bool SecureElement::getNfceeHostTypeList() +{ + static const char fn [] = "SecureElement::getNfceeHostTypeList"; + ALOGD ("%s: enter", fn); + tNFA_STATUS nfaStat = NFA_STATUS_FAILED; + bool retval = true; + + nfaStat = NFA_HciSendHostTypeListCommand(mNfaHciHandle); + + if(nfaStat != NFA_STATUS_OK) + retval = false; + + return retval; +} + +bool SecureElement::configureNfceeETSI12(UINT8 hostId) +{ + static const char fn [] = "SecureElement::configureNfceeETSI12"; + ALOGD ("%s: enter", fn); + tNFA_STATUS nfaStat = NFA_STATUS_FAILED; + bool retval = true; + + nfaStat = NFA_HciConfigureNfceeETSI12(hostId); + + if(nfaStat != NFA_STATUS_OK) + retval = false; + + return retval; +} +#endif + #if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) /******************************************************************************* @@ -2745,11 +3099,16 @@ bool SecureElement::sendEvent(UINT8 event) void SecureElement::NfccStandByOperation(nfcc_standby_operation_t value) { static IntervalTimer mNFCCStandbyModeTimer; // timer to enable standby mode for NFCC - - ALOGD("In SecureElement::NfccStandByOperation value = %d", value); + static nfcc_standby_operation_t state = STANDBY_MODE_ON; +#if (NXP_WIRED_MODE_STANDBY == TRUE) + tNFA_STATUS nfaStat = NFA_STATUS_FAILED; + bool stat = false; +#endif + ALOGD("In SecureElement::NfccStandByOperation value = %d, state = %d", value, state); switch(value) { case STANDBY_TIMER_START: + state = STANDBY_MODE_OFF; if(nfccStandbytimeout > 0) { mNFCCStandbyModeTimer.set(nfccStandbytimeout , NFCC_StandbyModeTimerCallBack ); @@ -2761,15 +3120,73 @@ void SecureElement::NfccStandByOperation(nfcc_standby_operation_t value) mNFCCStandbyModeTimer.kill(); } break; + case STANDBY_MODE_ON: + { +#if (NXP_WIRED_MODE_STANDBY_PROP == TRUE) + if(state == STANDBY_MODE_ON) + break; + else if(nfccStandbytimeout > 0) +#endif +#if (NXP_WIRED_MODE_STANDBY == TRUE) + if(nfccStandbytimeout > 0) +#endif + mNFCCStandbyModeTimer.kill(); + +#if (NXP_WIRED_MODE_STANDBY == TRUE) + stat = SecureElement::getInstance().sendEvent(SecureElement::EVT_END_OF_APDU_TRANSFER); + if(stat) + { + state = STANDBY_MODE_OFF; + ALOGD ("%s sending standby mode command EVT_END_OF_APDU_TRANSFER successful", __FUNCTION__); + } +#endif + } +#if (NXP_WIRED_MODE_STANDBY == TRUE) + break; +#endif case STANDBY_TIMER_TIMEOUT: { +#if (NXP_WIRED_MODE_STANDBY_PROP == TRUE) bool stat = false; //Send the EVT_END_OF_APDU_TRANSFER after the transceive timer timed out stat = SecureElement::getInstance().sendEvent(SecureElement::EVT_END_OF_APDU_TRANSFER); if(stat) { - ALOGD ("%s sending standby mode command successful", __FUNCTION__); + state = STANDBY_MODE_ON; + ALOGD ("%s sending standby mode command EVT_END_OF_APDU_TRANSFER successful", __FUNCTION__); } +#endif +#if (NXP_WIRED_MODE_STANDBY == TRUE) + UINT8 num = 0; + + SyncEventGuard guard (mPwrLinkCtrlEvent); + if (GetNxpNumValue (NAME_NXP_ESE_POWER_DH_CONTROL, (void*)&num, sizeof(num)) == true) + { + ALOGE ("%s: NXP_ESE_POWER_DH_CONTROL =%d", __FUNCTION__, num); + if(num == 1) + { + nfaStat = NFC_Nfcee_PwrLinkCtrl((UINT8)EE_HANDLE_0xF3, POWER_ALWAYS_ON); + if(nfaStat == NFA_STATUS_OK) + mPwrLinkCtrlEvent.wait(); + + stat = SecureElement::getInstance().sendEvent(SecureElement::EVT_SUSPEND_APDU_TRANSFER); + if(stat) + { + state = STANDBY_MODE_ON; + ALOGD ("%s sending standby mode command successful", __FUNCTION__); + } + } + else if (num == 2) + { + stat = SecureElement::getInstance().sendEvent(SecureElement::EVT_SUSPEND_APDU_TRANSFER); + if(stat) + { + state = STANDBY_MODE_ON; + ALOGD ("%s sending standby mode command successful", __FUNCTION__); + } + } + } +#endif } break; case STANDBY_GPIO_HIGH: @@ -2819,8 +3236,37 @@ void SecureElement::NfccStandByOperation(nfcc_standby_operation_t value) } } +/******************************************************************************* +** +** Function eSE_ISO_Reset +** +** Description Performs ISO Reset on eSE +** +** Returns void +** +*******************************************************************************/ +void SecureElement::eSE_ISO_Reset(void) +{ + jint ret_val = -1; + NFCSTATUS status = NFCSTATUS_FAILED; + /* Reset P73 using ISO Reset Pin. */ + ret_val = NFC_P73ISOReset ((void *)&status); + if (ret_val < 0) + { + ALOGD("Reset eSE failed"); + } + else + { + if (status != NFCSTATUS_SUCCESS) + { + ALOGD("SE is not being released by Pn54x driver"); + } + } +} #endif + +#if (JCOP_WA_ENABLE == TRUE) /******************************************************************************* ** ** Function: reconfigureEseHciInit @@ -2860,47 +3306,106 @@ tNFA_STATUS SecureElement::reconfigureEseHciInit() android::startRfDiscovery(true); return status; } +#endif -#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) -bool SecureElement::isWiredModeAllowedInRfState() +#if (NXP_EXTNS == TRUE) +bool SecureElement::isEtsi12ApduGatePresent() { - static const char fn[] = "isWiredModeAllowedInRfState"; - bool status = false; - ALOGD("%s; enter", fn); - //mRecvdTransEvt = false; //reset to false before 2.5sec wait - SyncEventGuard guard (mAllowWiredModeEvent); - if(android::isp2pActivated()) - { - status = true; - } - else if(isActivatedInListenMode()) + tNFA_STATUS nfaStat = NFA_STATUS_FAILED; + bool ret = false; + + ALOGD ("isEtsi12ApduGatePresent : get gate, pipe list"); + /*HCI initialised and secure element available*/ + if((mNfaHciHandle != NFA_HANDLE_INVALID) && (mActiveEeHandle != NFA_HANDLE_INVALID)) { - ALOGD("%s; mAllowWiredMode=%d ",fn, mAllowWiredMode); - if(mAllowWiredMode) - status = true; - else - status = mAllowWiredModeEvent.wait(2500); + SyncEventGuard guard (mPipeListEvent); + nfaStat = NFA_HciGetGateAndPipeList (mNfaHciHandle); + if (nfaStat == NFA_STATUS_OK) + { + mPipeListEvent.wait(); + if (mHciCfg.status == NFA_STATUS_OK) + { + for (UINT8 xx = 0; xx < mHciCfg.num_pipes; xx++) + { + ALOGD ("isEtsi12ApduGatePresent : get gate, pipe list host = 0x%x gate = 0x%x", mHciCfg.pipe[xx].dest_host, + mHciCfg.pipe[xx].dest_gate); + if ( (mHciCfg.pipe[xx].dest_host == 0xC0) + && (mHciCfg.pipe[xx].dest_gate == NFA_HCI_ETSI12_APDU_GATE) ) + { + ret = true; + ALOGD ("isEtsi12ApduGatePresent: found configured gate: 0x%02x pipe: 0x%02x", mNewSourceGate, mNewPipeId); + break; + } + } + } + } } - else if(isRfFieldOn() && (mWiredModeRfFiledEnable != 0x00)) + return ret; +} +#if(NFC_NXP_ESE == TRUE) +bool SecureElement::checkForWiredModeAccess() +{ + static const char fn[] = "checkForWiredModeAccess"; + bool status = true; + ALOGD("%s; enter", fn); + //mRecvdTransEvt = false; //reset to false before 2.5sec wait + if(mIsExclusiveWiredMode) { - status = mAllowWiredModeEvent.wait(2500); + if(mIsWiredModeOpen) + { + return status; + } + if(android::isp2pActivated()||isActivatedInListenMode()||isRfFieldOn()) + { + status = false; + return status; + } } else - { - status = true; - } - - if(status == false) - { - ALOGD("%s; Timeout occurs: Check for RF_OFF, Link loss and mRecvdTransEvt=%d",fn, mRecvdTransEvt); - if(!isActivatedInListenMode() || !isRfFieldOn() || !mRecvdTransEvt) + { //Wired mode resume and wired mode time out feature + if(android::isp2pActivated()) + { status = true; + } + else if(isActivatedInListenMode()) + { + ALOGD("%s; mAllowWiredMode=%d ",fn, mAllowWiredMode); + if (mIsActionNtfReceived) + { + if(mAllowWiredMode) + { + status = true; + if ((mIsWiredModeOpen)&&(mActiveEeHandle != mActiveCeHandle)) + { + ALOGD("%s; hold wired mode ",fn); + hold_wired_mode = true; + SyncEventGuard guard (mWiredModeHoldEvent); + mWiredModeHoldEvent.wait(); + status = true; + } + return status; + } + else + { + ALOGD("%s; Desfire/Mifare CLT activated ",fn); + if(!mIsAllowWiredInDesfireMifareCE) + { + hold_wired_mode = true; + SyncEventGuard guard (mWiredModeHoldEvent); + mWiredModeHoldEvent.wait(); + } + status = true; + } + } + } } + ALOGD("%s; status:%d ",fn, status); return status; } #endif +#endif -#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) /******************************************************************************* ** ** Function: etsiInitConfig @@ -3217,14 +3722,147 @@ void SecureElement::setCPTimeout() received_setCPTimeout, (int)sizeof(received_setCPTimeout), recvBufferActualSize, timeout); } } + NfccStandByOperation(STANDBY_MODE_ON); + disconnectEE(ESE_ID); } } sendEvent(SecureElement::EVT_END_OF_APDU_TRANSFER); + NfccStandByOperation(STANDBY_TIMER_STOP); disconnectEE(ESE_ID); } } } + +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) +/******************************************************************************* +** +** Function: enablePassiveListen +** +** Description: Enable or disable Passive A/B listen +** +** Returns: True if ok. +** +*******************************************************************************/ +UINT16 SecureElement::enablePassiveListen (UINT8 event) +{ + tNFA_STATUS status = NFA_STATUS_FAILED; + + mPassiveListenMutex.lock(); + + if(event == 0x00 && mPassiveListenEnabled == true) + { + if(android::isDiscoveryStarted() == true) + { + android::startRfDiscovery(false); + } + status = NFA_DisablePassiveListening(); + if(status == NFA_STATUS_OK) + { + SyncEventGuard g (mPassiveListenEvt); + mPassiveListenEvt.wait(100); + } + mPassiveListenEnabled = false; + if(android::isDiscoveryStarted() == false) + { + android::startRfDiscovery(true); + } + } + else if (event == 0x01 && mPassiveListenEnabled == false) + { + if(android::isDiscoveryStarted() == true) + { + android::startRfDiscovery(false); + } + status = NFA_EnableListening(); + if(status == NFA_STATUS_OK) + { + SyncEventGuard g (mPassiveListenEvt); + mPassiveListenEvt.wait(100); + } + mPassiveListenTimer.set(mPassiveListenTimeout , passiveListenDisablecallBack); + mPassiveListenEnabled = true; + if(android::isDiscoveryStarted() == false) + { + android::startRfDiscovery(true); + } + } + mPassiveListenMutex.unlock(); + ALOGD(" enablePassiveListen exit"); + return 0x00; +} + +/******************************************************************************* + ** + ** Function: passiveListenEnable + ** + ** Description: thread to trigger passive Listen Enable + ** + ** Returns: None . + ** + *******************************************************************************/ +void *passiveListenEnableThread(void *arg) +{ + ALOGD(" passiveListenEnableThread %d",*((uint8_t*)arg)); + if (*((uint8_t*)arg)) + { + SecureElement::getInstance().enablePassiveListen(0x01); + } + else + { + SecureElement::getInstance().enablePassiveListen(0x00); + } + pthread_exit(NULL); + return NULL; +} + +UINT16 SecureElement::startThread(UINT8 thread_arg) +{ + passiveListenState = thread_arg; + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + mPassiveListenCnt = 0x00; + if (pthread_create(&passiveListenEnable_thread, &attr, passiveListenEnableThread, (void*) &passiveListenState) != 0) + { + ALOGD("Unable to create the thread"); + } + pthread_attr_destroy(&attr); + return 0x00; +} + +/******************************************************************************* +** +** Function: passiveListenDisablecallBack +** +** Description: Enable or disable Passive A/B listen +** +** Returns: None +** +*******************************************************************************/ +static void passiveListenDisablecallBack(union sigval) +{ + ALOGD(" passiveListenDisablecallBack enter"); + + if(SecureElement::getInstance().isRfFieldOn() == true) + { + if(SecureElement::getInstance().isActivatedInListenMode()) + { + //do nothing , + return; + } + else if((SecureElement::getInstance().isActivatedInListenMode() == false) && (SecureElement::getInstance().mPassiveListenCnt < 0x02)) + { + ALOGD(" passiveListenEnableThread timer restart"); + SecureElement::getInstance().mPassiveListenTimer.set(SecureElement::getInstance().mPassiveListenTimeout , passiveListenDisablecallBack); + SecureElement::getInstance().mPassiveListenCnt++; + return; + } + } + SecureElement::getInstance().enablePassiveListen (0x00); +} +#endif + #endif #if(NXP_EXTNS == TRUE) @@ -3276,6 +3914,7 @@ tNFA_STATUS SecureElement::SecElem_EeModeSet(uint16_t handle, uint8_t mode) ALOGD("%s:Enter mode = %d", __FUNCTION__, mode); #if((NFC_NXP_ESE == TRUE)) +#if (JCOP_WA_ENABLE == TRUE) if((mode == NFA_EE_MD_DEACTIVATE)&&(active_ese_reset_control&(TRANS_WIRED_ONGOING|TRANS_CL_ONGOING))) { active_ese_reset_control |= RESET_BLOCKED; @@ -3283,6 +3922,7 @@ tNFA_STATUS SecureElement::SecElem_EeModeSet(uint16_t handle, uint8_t mode) sSecElem.mResetEvent.wait(); } #endif +#endif SyncEventGuard guard (sSecElem.mEeSetModeEvent); stat = NFA_EeModeSet(handle, mode); if(stat == NFA_STATUS_OK) @@ -3291,12 +3931,14 @@ tNFA_STATUS SecureElement::SecElem_EeModeSet(uint16_t handle, uint8_t mode) } #if((NFC_NXP_ESE == TRUE)) +#if (JCOP_WA_ENABLE == TRUE) if((active_ese_reset_control&RESET_BLOCKED)) { SyncEventGuard guard (sSecElem.mResetOngoingEvent); sSecElem.mResetOngoingEvent.notifyOne(); } #endif +#endif return stat; } /********************************************************************************** @@ -3374,4 +4016,38 @@ uicc_stat_t SecureElement::getUiccStatus(UINT8 selected_uicc) return uicc_stat; } #endif +#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) +/******************************************************************************* + ** + ** Function: SecElem_sendEvt_Abort + ** + ** Description: Perform interface level reset by sending EVT_ABORT event + ** + ** Returns: NFA_STATUS_OK/NFA_STATUS_FAILED. + ** + *******************************************************************************/ + +tNFA_STATUS SecureElement::SecElem_sendEvt_Abort() +{ + static const char fn[] = "SecureElement::SecElem_sendEvt_Abort"; + tNFA_STATUS nfaStat = NFA_STATUS_FAILED; + INT32 timeoutMillisec = 3000; + UINT8 atr_len = 0x10; + UINT8 recvBuffer[MAX_RESPONSE_SIZE]; + mAbortEventWaitOk = false; + + SyncEventGuard guard (mAbortEvent); + nfaStat = NFA_HciSendEvent(mNfaHciHandle, mNewPipeId, EVT_ABORT, 0, NULL, atr_len, recvBuffer, timeoutMillisec); + if(nfaStat == NFA_STATUS_OK) + { + mAbortEvent.wait(); + } + if(mAbortEventWaitOk == false) + { + ALOGE("%s (EVT_ABORT)Wait reposne timeout",fn); + return NFA_STATUS_FAILED; + } + return nfaStat; +} +#endif #endif diff --git a/nci/jni/SecureElement.h b/nci/jni/SecureElement.h index 2cd568bd..8d015a70 100644 --- a/nci/jni/SecureElement.h +++ b/nci/jni/SecureElement.h @@ -107,7 +107,7 @@ typedef enum }se_rd_req_failures_t; -#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if (NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) typedef struct{ rd_swp_req_t swp_rd_req_info ; rd_swp_req_t swp_rd_req_current_info ; @@ -123,7 +123,9 @@ typedef enum operation{ STANDBY_TIMER_STOP, STANDBY_TIMER_TIMEOUT, STANDBY_GPIO_HIGH, - STANDBY_GPIO_LOW + STANDBY_GPIO_LOW, + STANDBY_MODE_ON, + STANDBY_MODE_OFF }nfcc_standby_operation_t; void spi_prio_signal_handler (int signum, siginfo_t *info, void *unused); #endif @@ -147,9 +149,11 @@ public: UINT8 mNfceePresent; }; mNfceeData mNfceeData_t; + UINT8 mHostsPresent; + UINT8 mHostsId[MAX_NFCEE]; #endif -#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) IntervalTimer sSwpReaderTimer; // timer swp reader timeout. #endif @@ -556,6 +560,9 @@ public: *******************************************************************************/ bool getAtr(jint seID, UINT8* recvBuffer, INT32 *recvBufferSize); #if(NXP_EXTNS == TRUE) + bool getNfceeHostTypeList (void); + bool configureNfceeETSI12 (UINT8 host_id); + /********************************************************************************** ** ** Function: getEeStatus @@ -590,15 +597,48 @@ public: ** *******************************************************************************/ bool updateEEStatus (); + + /******************************************************************************* + ** + ** Function: isTeckInfoReceived + ** + ** Description: isTeckInfoReceived + ** Checks if discovery_req_ntf received + ** for a given EE + ** + ** Returns: True if ok. + ** + *******************************************************************************/ + bool isTeckInfoReceived (UINT16 eeHandle); #endif #endif -#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))) +#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2)) void etsiInitConfig(); tNFC_STATUS etsiReaderConfig(int eeHandle); tNFC_STATUS etsiResetReaderConfig(); #endif + +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) + /******************************************************************************* + ** + ** Function: enablePassiveListen + ** + ** Description: Enable or disable listening to Passive A/B + ** + ** Returns: True if ok. + ** + *******************************************************************************/ + UINT16 enablePassiveListen (UINT8 event); + + UINT16 startThread(UINT8 thread_arg); + + bool mPassiveListenEnabled; + bool meseUiccConcurrentAccess; + IntervalTimer mPassiveListenTimer; +#endif jint getSETechnology(tNFA_HANDLE eeHandle); static const UINT8 UICC_ID = 0x02; + static const UINT8 UICC2_ID = 0x04; static const UINT8 ESE_ID = 0x01; static const UINT8 DH_ID = 0x00; @@ -607,28 +647,54 @@ public: tNFA_HANDLE getEseHandleFromGenericId(jint eseId); jint getGenericEseId(tNFA_HANDLE handle); - +#if (JCOP_WA_ENABLE == TRUE) tNFA_STATUS reconfigureEseHciInit(); +#endif #if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)) void setCPTimeout(); void NfccStandByOperation(nfcc_standby_operation_t value); + void eSE_ISO_Reset(void); + tNFA_STATUS SecElem_sendEvt_Abort(); #endif - bool isWiredModeAllowedInRfState(); + bool checkForWiredModeAccess(); + bool isEtsi12ApduGatePresent(); bool mRecvdTransEvt; bool mAllowWiredMode; - + UINT8 mPassiveListenCnt; //Retry cnt for passive listen enable timer SyncEvent mRoutingEvent; SyncEvent mAidAddRemoveEvent; SyncEvent mUiccListenEvent; SyncEvent mEseListenEvent; SyncEvent mAllowWiredModeEvent; SyncEvent mEeSetModeEvent; + UINT32 mPassiveListenTimeout; //Retry timout value for passive listen enable timer +#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE)) + SyncEvent mPassiveListenEvt; + Mutex mPassiveListenMutex; +#endif +#if ((NXP_EXTNS == TRUE) && (NXP_WIRED_MODE_STANDBY == TRUE)) + SyncEvent mPwrLinkCtrlEvent; +#endif #if(NXP_EXTNS == TRUE) + SyncEvent mNfceeInitCbEvent; tNFA_STATUS SecElem_EeModeSet(uint16_t handle, uint8_t mode); +#if (JCOP_WA_ENABLE == TRUE) SyncEvent mEEdatapacketEvent; +#endif SyncEvent mTransceiveEvent; static const UINT8 EVT_END_OF_APDU_TRANSFER = 0x21; //NXP Propritory +#if (NXP_WIRED_MODE_STANDBY == TRUE) + static const UINT8 EVT_SUSPEND_APDU_TRANSFER = 0x31; +#endif + tNFA_HANDLE mActiveCeHandle; + bool mIsWiredModeOpen; + bool mlistenDisabled; + bool mIsExclusiveWiredMode; + bool mIsActionNtfReceived; + bool mIsDesfireMifareDisable; + bool mIsAllowWiredInDesfireMifareCE; + static const UINT8 EVT_ABORT = 0x11; //ETSI12 void setCLState(bool mState); #endif @@ -643,7 +709,14 @@ private: 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 UINT8 STATIC_PIPE_UICC = 0x20; //UICC's proprietary static pipe +#if (NXP_WIRED_MODE_STANDBY == TRUE) + static const UINT8 NFCC_DECIDES = 0x00; //NFCC decides + static const UINT8 POWER_ALWAYS_ON = 0x01; //NFCEE Power Supply always On + static const UINT8 COMM_LINK_ACTIVE = 0x02; //NFCC to NFCEE Communication link always active when the NFCEE is powered on. +#endif static const tNFA_HANDLE EE_HANDLE_0xF3 = 0x4C0;//0x401; //handle to secure element in slot 0 + static const tNFA_HANDLE EE_HANDLE_0xF8 = 0x481; //handle to secure element in slot 2 #ifdef NXP_UICC_ENABLE static const tNFA_HANDLE EE_HANDLE_0xF4 = 0x402; //handle to secure element in slot 1 #else @@ -681,9 +754,10 @@ private: tNFA_HCI_GET_GATE_PIPE_LIST mHciCfg; SyncEvent mEeRegisterEvent; SyncEvent mHciRegisterEvent; - +#if (JCOP_WA_ENABLE == TRUE) SyncEvent mResetEvent; SyncEvent mResetOngoingEvent; +#endif SyncEvent mPipeListEvent; SyncEvent mCreatePipeEvent; SyncEvent mPipeOpenedEvent; @@ -709,6 +783,10 @@ private: IntervalTimer mTransceiveTimer; bool mTransceiveWaitOk; int mWiredModeRfFiledEnable; +#if(NXP_EXTNS == TRUE) + SyncEvent mAbortEvent; + bool mAbortEventWaitOk; +#endif /******************************************************************************* ** ** Function: SecureElement @@ -799,6 +877,18 @@ private: tNFA_HANDLE getDefaultEeHandle (); +#if(NXP_EXTNS == TRUE) + /******************************************************************************* + ** + ** Function: getActiveEeHandle + ** + ** Description: Get the handle of the active execution environment. + ** + ** Returns: Handle to the execution environment. + ** + *******************************************************************************/ + tNFA_HANDLE getActiveEeHandle (tNFA_HANDLE eeHandle); +#endif /******************************************************************************* ** ** Function: adjustRoutes diff --git a/nci/jni/extns/pn54x/inc/phNxpExtns.h b/nci/jni/extns/pn54x/inc/phNxpExtns.h index 6fafbd13..b8a3b405 100755 --- a/nci/jni/extns/pn54x/inc/phNxpExtns.h +++ b/nci/jni/extns/pn54x/inc/phNxpExtns.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 NXP Semiconductors + * Copyright (C) 2015 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. diff --git a/nci/jni/extns/pn54x/inc/phNxpExtns_Custom.h b/nci/jni/extns/pn54x/inc/phNxpExtns_Custom.h index 945d0e0f..a9d10c8d 100755 --- a/nci/jni/extns/pn54x/inc/phNxpExtns_Custom.h +++ b/nci/jni/extns/pn54x/inc/phNxpExtns_Custom.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 NXP Semiconductors + * Copyright (C) 2015 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. diff --git a/nci/jni/extns/pn54x/src/common/phNfcTypes.h b/nci/jni/extns/pn54x/src/common/phNfcTypes.h index 8cfdbd4e..6ba7ff32 100755..100644 --- a/nci/jni/extns/pn54x/src/common/phNfcTypes.h +++ b/nci/jni/extns/pn54x/src/common/phNfcTypes.h @@ -303,6 +303,6 @@ typedef enum p61_access_state{ P61_STATE_SPI_END = 0x4000, /*End of p61 access by SPI*/ } p61_access_state_t; -#define UNUSED(X) (void)X; +#define UNUSED(X) (void)(X); #endif /* PHNFCTYPES_H */ diff --git a/nci/jni/extns/pn54x/src/utils/phNxpConfig.h b/nci/jni/extns/pn54x/src/utils/phNxpConfig.h index bb34ee01..1eb4c70c 100644 --- a/nci/jni/extns/pn54x/src/utils/phNxpConfig.h +++ b/nci/jni/extns/pn54x/src/utils/phNxpConfig.h @@ -93,6 +93,9 @@ int updateNxpConfigTimestamp (); #define NAME_NXP_UICC_WIRED_PRT_MASK "NXP_UICC_WIRED_PRT_MASK" #define NAME_NXP_ESE_WIRED_PRT_MASK "NXP_ESE_WIRED_PRT_MASK" #define NAME_NXP_ENABLE_ADD_AID "NXP_ENABLE_ADD_AID" +#if(NXP_ESE_POWER_MODE==TRUE) +#define NAME_NXP_ESE_POWER_DH_CONTROL "NXP_ESE_POWER_DH_CONTROL" +#endif /* default configuration */ #define default_storage_location "/data/nfc" diff --git a/nci/src/com/android/nfc/dhimpl/NativeNfcSecureElement.java b/nci/src/com/android/nfc/dhimpl/NativeNfcSecureElement.java index 3d7a7f3a..c8e72295 100755 --- a/nci/src/com/android/nfc/dhimpl/NativeNfcSecureElement.java +++ b/nci/src/com/android/nfc/dhimpl/NativeNfcSecureElement.java @@ -60,13 +60,13 @@ public class NativeNfcSecureElement { mPrefsEditor = mPrefs.edit(); } - private native int doNativeOpenSecureElementConnection(); + private native int doNativeOpenSecureElementConnection(int seId); - public int doOpenSecureElementConnection() { + public int doOpenSecureElementConnection(int seId) { mPrefsEditor.putBoolean(PREF_SE_WIRED, true); mPrefsEditor.apply(); - return doNativeOpenSecureElementConnection(); + return doNativeOpenSecureElementConnection(seId); } private native boolean doNativeDisconnectSecureElementConnection(int handle); diff --git a/nxp/jni/com_android_nfc_NativeNfcSecureElement.cpp b/nxp/jni/com_android_nfc_NativeNfcSecureElement.cpp index d7b3e77d..1e04dd83 100755 --- a/nxp/jni/com_android_nfc_NativeNfcSecureElement.cpp +++ b/nxp/jni/com_android_nfc_NativeNfcSecureElement.cpp @@ -194,7 +194,7 @@ clean_and_return: } -static jint com_android_nfc_NativeNfcSecureElement_doOpenSecureElementConnection(JNIEnv *e, jobject o) +static jint com_android_nfc_NativeNfcSecureElement_doOpenSecureElementConnection(JNIEnv *e, jobject o, jint seId) { NFCSTATUS ret; int semResult; @@ -762,7 +762,7 @@ static jintArray com_android_nfc_NativeNfcSecureElement_doGetTechList(JNIEnv *e, */ static JNINativeMethod gMethods[] = { - {"doNativeOpenSecureElementConnection", "()I", + {"doNativeOpenSecureElementConnection", "(I)I", (void *)com_android_nfc_NativeNfcSecureElement_doOpenSecureElementConnection}, {"doNativeDisconnectSecureElementConnection", "(I)Z", (void *)com_android_nfc_NativeNfcSecureElement_doDisconnect}, diff --git a/nxp/src/com/android/nfc/dhimpl/NativeNfcSecureElement.java b/nxp/src/com/android/nfc/dhimpl/NativeNfcSecureElement.java index ce611b06..6c7aaebc 100755 --- a/nxp/src/com/android/nfc/dhimpl/NativeNfcSecureElement.java +++ b/nxp/src/com/android/nfc/dhimpl/NativeNfcSecureElement.java @@ -61,11 +61,11 @@ public class NativeNfcSecureElement { private native int doNativeOpenSecureElementConnection(); - public int doOpenSecureElementConnection() { + public int doOpenSecureElementConnection(int seId) { mPrefsEditor.putBoolean(PREF_SE_WIRED, true); mPrefsEditor.apply(); - return doNativeOpenSecureElementConnection(); + return doNativeOpenSecureElementConnection(seId); } private native boolean doNativeDisconnectSecureElementConnection(int handle); diff --git a/src/com/android/nfc/NfcDispatcher.java b/src/com/android/nfc/NfcDispatcher.java index 3fef436f..07a9bab1 100644 --- a/src/com/android/nfc/NfcDispatcher.java +++ b/src/com/android/nfc/NfcDispatcher.java @@ -227,6 +227,7 @@ class NfcDispatcher { PendingIntent overrideIntent; IntentFilter[] overrideFilters; String[][] overrideTechLists; + String[] provisioningMimes; boolean provisioningOnly; synchronized (this) { @@ -234,6 +235,7 @@ class NfcDispatcher { overrideIntent = mOverrideIntent; overrideTechLists = mOverrideTechLists; provisioningOnly = mProvisioningOnly; + provisioningMimes = mProvisioningMimes; } boolean screenUnlocked = false; @@ -267,6 +269,20 @@ class NfcDispatcher { return screenUnlocked ? DISPATCH_UNLOCK : DISPATCH_SUCCESS; } + if (provisioningOnly) { + if (message == null) { + // We only allow NDEF-message dispatch in provisioning mode + return DISPATCH_FAIL; + } + // Restrict to mime-types in whitelist. + String ndefMimeType = message.getRecords()[0].toMimeType(); + if (provisioningMimes == null || + !(Arrays.asList(provisioningMimes).contains(ndefMimeType))) { + Log.e(TAG, "Dropping NFC intent in provisioning mode."); + return DISPATCH_FAIL; + } + } + if (tryPeripheralHandover(message)) { if (DBG) Log.i(TAG, "matched BT HANDOVER"); return screenUnlocked ? DISPATCH_UNLOCK : DISPATCH_SUCCESS; @@ -277,7 +293,7 @@ class NfcDispatcher { return screenUnlocked ? DISPATCH_UNLOCK : DISPATCH_SUCCESS; } - if (tryNdef(dispatch, message, provisioningOnly)) { + if (tryNdef(dispatch, message)) { return screenUnlocked ? DISPATCH_UNLOCK : DISPATCH_SUCCESS; } @@ -286,11 +302,6 @@ class NfcDispatcher { return DISPATCH_UNLOCK; } - if (provisioningOnly) { - // We only allow NDEF-based mimeType matching - return DISPATCH_FAIL; - } - // Only allow NDEF-based mimeType matching for unlock tags if (tryTech(dispatch, tag)) { return DISPATCH_SUCCESS; @@ -449,7 +460,7 @@ class NfcDispatcher { return false; } - boolean tryNdef(DispatchInfo dispatch, NdefMessage message, boolean provisioningOnly) { + boolean tryNdef(DispatchInfo dispatch, NdefMessage message) { if (message == null) { return false; } @@ -458,14 +469,6 @@ class NfcDispatcher { // Bail out if the intent does not contain filterable NDEF data if (intent == null) return false; - if (provisioningOnly) { - if (mProvisioningMimes == null || - !(Arrays.asList(mProvisioningMimes).contains(intent.getType()))) { - Log.e(TAG, "Dropping NFC intent in provisioning mode."); - return false; - } - } - // Try to start AAR activity with matching filter List<String> aarPackages = extractAarPackages(message); for (String pkg : aarPackages) { diff --git a/src/com/android/nfc/NfcService.java b/src/com/android/nfc/NfcService.java index fbaef85b..49939e8c 100644..100755 --- a/src/com/android/nfc/NfcService.java +++ b/src/com/android/nfc/NfcService.java @@ -171,7 +171,6 @@ public class NfcService implements DeviceHostListener { static final boolean NDEF_PUSH_ON_DEFAULT = true; static final String PREF_FIRST_BEAM = "first_beam"; static final String PREF_FIRST_BOOT = "first_boot"; - static final String PREF_AIRPLANE_OVERRIDE = "airplane_override"; private static final String PREF_SECURE_ELEMENT_ON = "secure_element_on"; private boolean SECURE_ELEMENT_ON_DEFAULT = false; private int SECURE_ELEMENT_ID_DEFAULT = 0; @@ -194,9 +193,10 @@ public class NfcService implements DeviceHostListener { private static final long[] JCOP_MODTIME_TEMP = {-1,-1,-1}; private boolean ETSI_STOP_CONFIG = false; - private int ROUTE_ID_HOST= 0x00; - private int ROUTE_ID_SMX= 0x01; - private int ROUTE_ID_UICC= 0x02; + private int ROUTE_ID_HOST = 0x00; + private int ROUTE_ID_SMX = 0x01; + private int ROUTE_ID_UICC = 0x02; + private int ROUTE_ID_UICC2 = 0x04; private int ROUTE_SWITCH_ON = 0x01; private int ROUTE_SWITCH_OFF = 0x02; @@ -393,9 +393,13 @@ public class NfcService implements DeviceHostListener { public static final int UICC_ID_TYPE = 2; /** + * UICC2 ID to be able to select it as the default Secure Element + */ + public static final int UICC2_ID_TYPE = 4; + /** * ID to be able to select all Secure Elements */ - public static final int ALL_SE_ID_TYPE = 3; + public static final int ALL_SE_ID_TYPE = 7; public static final int PN547C2_ID = 1; public static final int PN65T_ID = 2; @@ -473,8 +477,6 @@ public class NfcService implements DeviceHostListener { NxpNfcAdapterExtrasService mNxpExtrasService; NxpExtrasService mNxpExtras; EseClientServicesAdapter mEseClientServicesAdapter; - boolean mIsAirplaneSensitive; - boolean mIsAirplaneToggleable; boolean mIsDebugBuild; boolean mIsHceCapable; boolean mIsHceFCapable; @@ -882,7 +884,6 @@ public class NfcService implements DeviceHostListener { filter.addAction(Intent.ACTION_USER_PRESENT); filter.addAction(Intent.ACTION_USER_SWITCHED); filter.addAction(Intent.ACTION_SHUTDOWN); - registerForAirplaneMode(filter); mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, filter, null, null); IntentFilter ownerFilter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE); @@ -952,21 +953,6 @@ public class NfcService implements DeviceHostListener { } } - void registerForAirplaneMode(IntentFilter filter) { - final String airplaneModeRadios = Settings.System.getString(mContentResolver, - Settings.Global.AIRPLANE_MODE_RADIOS); - final String toggleableRadios = Settings.System.getString(mContentResolver, - Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS); - - mIsAirplaneSensitive = airplaneModeRadios == null ? true : - airplaneModeRadios.contains(Settings.Global.RADIO_NFC); - mIsAirplaneToggleable = toggleableRadios == null ? false : - toggleableRadios.contains(Settings.Global.RADIO_NFC); - - if (mIsAirplaneSensitive) { - filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); - } - } void updatePackageCache() { PackageManager pm = mContext.getPackageManager(); List<PackageInfo> packages = pm.getInstalledPackages(0, UserHandle.USER_OWNER); @@ -975,10 +961,10 @@ public class NfcService implements DeviceHostListener { } } - int doOpenSecureElementConnection() { + int doOpenSecureElementConnection(int seId) { mEeWakeLock.acquire(); try { - return mSecureElement.doOpenSecureElementConnection(); + return mSecureElement.doOpenSecureElementConnection(seId); } finally { mEeWakeLock.release(); } @@ -1115,9 +1101,7 @@ public class NfcService implements DeviceHostListener { break; case TASK_BOOT: Log.d(TAG, "checking on firmware download"); - boolean airplaneOverride = mPrefs.getBoolean(PREF_AIRPLANE_OVERRIDE, false); - if (mPrefs.getBoolean(PREF_NFC_ON, NFC_ON_DEFAULT) && - (!mIsAirplaneSensitive || !isAirplaneModeOn() || airplaneOverride)) { + if (mPrefs.getBoolean(PREF_NFC_ON, NFC_ON_DEFAULT)) { Log.d(TAG, "NFC is on. Doing normal stuff"); enableInternal(); } else { @@ -1147,14 +1131,12 @@ public class NfcService implements DeviceHostListener { filter.addAction(Intent.ACTION_USER_PRESENT); filter.addAction(Intent.ACTION_USER_SWITCHED); filter.addAction(Intent.ACTION_SHUTDOWN); - registerForAirplaneMode(filter); mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, filter, null, null); }else if (mState == NfcAdapter.STATE_OFF){ mContext.unregisterReceiver(mReceiver); IntentFilter filter = new IntentFilter(NativeNfcManager.INTERNAL_TARGET_DESELECTED_ACTION); filter.addAction(Intent.ACTION_USER_SWITCHED); filter.addAction(Intent.ACTION_SHUTDOWN); - registerForAirplaneMode(filter); mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, filter, null, null); } @@ -1194,6 +1176,7 @@ public class NfcService implements DeviceHostListener { if (secureElementId != ALL_SE_ID_TYPE/* SECURE_ELEMENT_ALL */) { mDeviceHost.doDeselectSecureElement(UICC_ID_TYPE); + mDeviceHost.doDeselectSecureElement(UICC2_ID_TYPE); mDeviceHost.doDeselectSecureElement(SMART_MX_ID_TYPE); for (int i = 0; i < Se_list.length; i++) { @@ -1219,6 +1202,16 @@ public class NfcService implements DeviceHostListener { mDeviceHost.doSelectSecureElement(secureElementId); mSelectedSeId = secureElementId; break; + }else if (secureElementId == UICC2_ID_TYPE/* SECURE_ELEMENT_UICC_ID */) { + if (Se_list.length > 1) { + if (DBG) { + Log.d(TAG, "Deselect SMX"); + } + } + Log.d(TAG, "Select UICC2"); + mDeviceHost.doSelectSecureElement(secureElementId); + mSelectedSeId = secureElementId; + break; } else if (secureElementId == SECURE_ELEMENT_ID_DEFAULT) { if (Se_list.length > 1) { if (DBG) { @@ -1254,6 +1247,7 @@ public class NfcService implements DeviceHostListener { Log.d(TAG, "UICC/eSE deselected by default"); } mDeviceHost.doDeselectSecureElement(UICC_ID_TYPE); + mDeviceHost.doDeselectSecureElement(UICC2_ID_TYPE); mDeviceHost.doDeselectSecureElement(SMART_MX_ID_TYPE); } } @@ -1549,15 +1543,6 @@ public class NfcService implements DeviceHostListener { saveNfcOnSetting(true); - if (mIsAirplaneSensitive && isAirplaneModeOn()) { - if (!mIsAirplaneToggleable) { - Log.i(TAG, "denying enable() request (airplane mode)"); - return false; - } - // Make sure the override survives a reboot - mPrefsEditor.putBoolean(PREF_AIRPLANE_OVERRIDE, true); - mPrefsEditor.apply(); - } new EnableDisableTask().execute(TASK_ENABLE); return true; @@ -1577,6 +1562,7 @@ public class NfcService implements DeviceHostListener { //Since only Nfc is getting disabled so disable CE from EE. mDeviceHost.doSetScreenOrPowerState(ScreenStateHelper.POWER_STATE_ON); mDeviceHost.doDeselectSecureElement(UICC_ID_TYPE); + mDeviceHost.doDeselectSecureElement(UICC2_ID_TYPE); mDeviceHost.doDeselectSecureElement(SMART_MX_ID_TYPE); } else { Log.i(TAG, "Power off : Disabling NFC Disabling ESE/UICC"); @@ -2084,8 +2070,18 @@ public class NfcService implements DeviceHostListener { throws RemoteException { int protoRouteEntry = 0; - protoRouteEntry=((routeLoc & 0x03)== 0x01) ? (0x01 << 3) : (((routeLoc & 0x03) == 0x02) ? (0x01 << 4) : 0x00) ; - protoRouteEntry |= ((fullPower ? 0x01 : 0) | (lowPower ? 0x01 << 1 :0 ) | (noPower ? 0x01 << 2 :0) ); + protoRouteEntry=((routeLoc & 0x03)== 0x01) ? (0x01 << ROUTE_LOC_MASK) : (((routeLoc & 0x03) == 0x02) ? (0x02 << ROUTE_LOC_MASK) : 0x00) ; + if(routeLoc == 0x00) + //if routeLocation is HOST, Allow HCE only for SCREEN_ON_UNLOCKED + { + protoRouteEntry |= ((fullPower ? 0x01 : 0) | (lowPower ? 0x01 << 1 :0 ) | (noPower ? 0x01 << 2 :0)); + } + else + //if routeLocation is ESE/UICC, Allow CE for the states requested + { + protoRouteEntry |= ((fullPower ? (mDeviceHost.getDefaultDesfirePowerState() & 0x1F) | 0x01 : 0) | (lowPower ? 0x01 << 1 :0 ) | (noPower ? 0x01 << 2 :0)); + } + Log.i(TAG,"MifareDesfireRouteSet : " + protoRouteEntry); mNxpPrefsEditor = mNxpPrefs.edit(); mNxpPrefsEditor.putInt("PREF_MIFARE_DESFIRE_PROTO_ROUTE_ID", protoRouteEntry); mNxpPrefsEditor.commit(); @@ -2098,8 +2094,18 @@ public class NfcService implements DeviceHostListener { { if (mIsHceCapable) { int protoRouteEntry = 0; - protoRouteEntry=((routeLoc & 0x03)== 0x01) ? (0x01 << 3) : (((routeLoc & 0x03) == 0x02) ? (0x01 << 4) : 0x00) ; - protoRouteEntry |= ((fullPower ? 0x01 : 0) | (lowPower ? 0x01 << 1 :0 ) | (noPower ? 0x01 << 2 :0)); + protoRouteEntry=((routeLoc & 0x03)== 0x01) ? (0x01 << ROUTE_LOC_MASK) : (((routeLoc & 0x03) == 0x02) ? (0x02 << ROUTE_LOC_MASK) : 0x00) ; + if(routeLoc == 0x00) + //if routeLocation is HOST, Allow HCE only for SCREEN_ON_UNLOCKED + { + protoRouteEntry |= ((fullPower ? 0x01 : 0) | (lowPower ? 0x01 << 1 :0 ) | (noPower ? 0x01 << 2 :0)); + } + else + //if routeLocation is ESE/UICC, Allow CE for the states requested + { + protoRouteEntry |= ((fullPower ? (mDeviceHost.getDefaultAidPowerState() & 0x1F) | 0x01 : 0) | (lowPower ? 0x01 << 1 :0 ) | (noPower ? 0x01 << 2 :0)); + } + Log.i(TAG,"DefaultRouteSet : " + protoRouteEntry); if(GetDefaultRouteLoc() != routeLoc) { mNxpPrefsEditor = mNxpPrefs.edit(); @@ -2125,9 +2131,11 @@ public class NfcService implements DeviceHostListener { throws RemoteException { int techRouteEntry=0; - techRouteEntry=((routeLoc & 0x03)== 0x01) ? (0x01 << 3) : (((routeLoc & 0x03) == 0x02) ? (0x01 << 4) : 0x00) ; - techRouteEntry |= ((fullPower ? 0x01 : 0) | (lowPower ? 0x01 << 1 :0 ) | (noPower ? 0x01 << 2 :0) ); - techRouteEntry |=0x20; + techRouteEntry=((routeLoc & 0x03) == 0x01) ? (0x01 << ROUTE_LOC_MASK) : (((routeLoc & 0x03) == 0x02) ? (0x02 << ROUTE_LOC_MASK) : 0x00); + techRouteEntry |= ((fullPower ? (mDeviceHost.getDefaultMifareCLTPowerState() & 0x1F) | 0x01 : 0) | (lowPower ? 0x01 << 1 :0 ) | (noPower ? 0x01 << 2 :0)); + techRouteEntry |= (TECH_TYPE_A << TECH_TYPE_MASK); + + Log.i(TAG,"MifareCLTRouteSet : " + techRouteEntry); mNxpPrefsEditor = mNxpPrefs.edit(); mNxpPrefsEditor.putInt("PREF_MIFARE_CLT_ROUTE_ID", techRouteEntry); mNxpPrefsEditor.commit(); @@ -2636,6 +2644,9 @@ public class NfcService implements DeviceHostListener { int Ver = mDeviceHost.getChipVer(); if(Ver == PN67T_ID || Ver == PN66T_ID || Ver == PN65T_ID) { status = mDeviceHost.JCOSDownload(); + } + else { + status = ErrorCodes.ERROR_NOT_SUPPORTED; } } else { @@ -3102,12 +3113,14 @@ public class NfcService implements DeviceHostListener { // Deny access to the NFCEE as long as the device is being setup return EE_ERROR_IO; } + /*Concurrent access for DWP transactions to be allowed even when P2P is already ongoing */ + /* if (mP2pLinkManager.isLlcpActive()) { // Don't allow PN544-based devices to open the SE while the LLCP // link is still up or in a debounce state. This avoids race // conditions in the NXP stack around P2P/SMX switching. return EE_ERROR_EXT_FIELD; - } + } */ if (mOpenEe != null) { return EE_ERROR_ALREADY_OPEN; } @@ -3121,7 +3134,7 @@ public class NfcService implements DeviceHostListener { mNfcPollingEnabled = false; restorePolling = true; } - int handle = doOpenSecureElementConnection(); + int handle = doOpenSecureElementConnection(0xF3); if (handle < 0) { if (restorePolling) { @@ -3130,7 +3143,7 @@ public class NfcService implements DeviceHostListener { } return handle; } - mDeviceHost.setTimeout(TagTechnology.ISO_DEP, 1000); + mDeviceHost.setTimeout(TagTechnology.ISO_DEP, 30000); mOpenEe = new OpenSecureElement(getCallingPid(), handle, b); try { @@ -3373,12 +3386,14 @@ public class NfcService implements DeviceHostListener { // Deny access to the NFCEE as long as the device is being setup return EE_ERROR_IO; } + /*Concurrent access for DWP transactions to be allowed even when P2P is already ongoing */ + /* if (mP2pLinkManager.isLlcpActive()) { // Don't allow PN544-based devices to open the SE while the LLCP // link is still up or in a debounce state. This avoids race // conditions in the NXP stack around P2P/SMX switching. return EE_ERROR_EXT_FIELD; - } + }*/ if (mOpenEe != null) { Log.i(TAG, "SE is Busy. returning.."); return EE_ERROR_ALREADY_OPEN; @@ -3393,7 +3408,7 @@ public class NfcService implements DeviceHostListener { restorePolling = true; } - int handle = doOpenSecureElementConnection(); + int handle = doOpenSecureElementConnection(0xF3); if (handle < 0) { if (restorePolling) { @@ -3402,7 +3417,7 @@ public class NfcService implements DeviceHostListener { } return handle; } - mDeviceHost.setTimeout(TagTechnology.ISO_DEP, 1000); + mDeviceHost.setTimeout(TagTechnology.ISO_DEP, 30000); mOpenEe = new OpenSecureElement(getCallingPid(), handle, b); try { b.linkToDeath(mOpenEe, 0); @@ -3706,6 +3721,129 @@ public class NfcService implements DeviceHostListener { return mDeviceHost.doGetSelectedUicc(); } + @Override + public Bundle openuicc(String pkg, IBinder b) throws RemoteException { + NfcService.this.enforceNfceeAdminPerm(pkg); + + Bundle result; + int handle = _openuicc(b); + if (handle < 0) { + result = writeEeException(handle, "NFCEE UICC open exception."); + } else { + result = writeNoException(); + } + return result; + } + + /** + * Opens a connection to the UICC element. + * + * @return A handle with a value >= 0 in case of success, or a + * negative value in case of failure. + */ + private int _openuicc(IBinder b) { + synchronized(NfcService.this) { + if (!isNfcEnabled()) { + return EE_ERROR_NFC_DISABLED; + } + if (mInProvisionMode) { + // Deny access to the NFCEE as long as the device is being setup + return EE_ERROR_IO; + } + if (mP2pLinkManager.isLlcpActive()) { + // Don't allow PN544-based devices to open the SE while the LLCP + // link is still up or in a debounce state. This avoids race + // conditions in the NXP stack around P2P/SMX switching. + return EE_ERROR_EXT_FIELD; + } + if (mOpenEe != null) { + return EE_ERROR_ALREADY_OPEN; + } + + boolean restorePolling = false; + if (mNfcPollingEnabled) { + // Disable polling for tags/P2P when connecting to the SMX + // on PN544-based devices. Whenever nfceeClose is called, + // the polling configuration will be restored. + mDeviceHost.disableDiscovery(); + mNfcPollingEnabled = false; + restorePolling = true; + } + + int handle = doOpenSecureElementConnection(0xF4); + if (handle < 0) { + + if (restorePolling) { + mDeviceHost.enableDiscovery(mCurrentDiscoveryParameters, true); + mNfcPollingEnabled = true; + } + return handle; + } + mDeviceHost.setTimeout(TagTechnology.ISO_DEP, 30000); + + mOpenEe = new OpenSecureElement(getCallingPid(), handle, b); + try { + b.linkToDeath(mOpenEe, 0); + } catch (RemoteException e) { + mOpenEe.binderDied(); + } + + // Add the calling package to the list of packages that have accessed + // the secure element. + for (String packageName : mContext.getPackageManager().getPackagesForUid(getCallingUid())) { + mSePackages.add(packageName); + } + + return handle; + } + } + + @Override + public Bundle closeuicc(String pkg, IBinder binder) throws RemoteException { + NfcService.this.enforceNfceeAdminPerm(pkg); + + Bundle result; + try { + Log.w("Nxp", "Close UICC!"); + _nfcEeClose(getCallingPid(), binder); + result = writeNoException(); + } catch (IOException e) { + result = writeEeException(EE_ERROR_IO, e.getMessage()); + } + return result; + } + + @Override + public Bundle transceiveuicc(String pkg, byte[] in) throws RemoteException { + NfcService.this.enforceNfceeAdminPerm(pkg); + + Bundle result; + byte[] out; + try { + out = _transceiveuicc(in); + result = writeNoException(); + result.putByteArray("out", out); + } catch (IOException e) { + result = writeEeException(EE_ERROR_IO, e.getMessage()); + } + return result; + } + + private byte[] _transceiveuicc(byte[] data) throws IOException { + synchronized(NfcService.this) { + if (!isNfcEnabled()) { + throw new IOException("NFC is not enabled"); + } + if (mOpenEe == null) { + throw new IOException("NFC EE is not open"); + } + if (getCallingPid() != mOpenEe.pid) { + throw new SecurityException("Wrong PID"); + } + } + + return doTransceive(mOpenEe.handle, data); + } } /** resources kept while secure element is open */ @@ -4172,9 +4310,17 @@ public class NfcService implements DeviceHostListener { */ public int GetDefaultMifareDesfireRouteEntry() { - //return ((ROUTE_ID_UICC << ROUTE_LOC_MASK ) | ROUTE_SWITCH_ON | ROUTE_SWITCH_OFF) ; - Log.d(TAG, "GetDefaultMifareDesfireRouteEntry :" + mDeviceHost.getDefaultDesfireRoute() ); - return ((mDeviceHost.getDefaultDesfirePowerState() & 0x1F) | (mDeviceHost.getDefaultDesfireRoute() << ROUTE_LOC_MASK)) ; + int routeLoc = mDeviceHost.getDefaultDesfireRoute(); + int defaultMifareDesfireRoute = ((mDeviceHost.getDefaultDesfirePowerState() & 0x1F) | (routeLoc << ROUTE_LOC_MASK)); + if(routeLoc == 0x00) + { + /*bit pos 3 = Screen Lock + bit pos 4 = Screen Off + Set these 2 bits to 0 because in case routeLoc = HOST it can work only in SCREEN_ON_UNLOCKED*/ + defaultMifareDesfireRoute &= 0xE7; + } + Log.d(TAG, "defaultMifareDesfireRoute : " + defaultMifareDesfireRoute); + return defaultMifareDesfireRoute; } /** * set default Aid route entry in case application does not configure this route entry @@ -4182,8 +4328,16 @@ public class NfcService implements DeviceHostListener { public int GetDefaultRouteEntry() { - int defaultAidRoute = ((mDeviceHost.getDefaultAidPowerState() & 0x1F) | (mDeviceHost.getDefaultAidRoute()<< ROUTE_LOC_MASK)); - Log.d(TAG, "GetDefaultRouteEntry :" + defaultAidRoute ); + int routeLoc = mDeviceHost.getDefaultAidRoute(); + int defaultAidRoute = ((mDeviceHost.getDefaultAidPowerState() & 0x1F) | (routeLoc << ROUTE_LOC_MASK)); + if(routeLoc == 0x00) + { + /*bit pos 3 = Screen Lock + bit pos 4 = Screen Off + Set these 2 bits to 0 because in case routeLoc = HOST it can work only in SCREEN_ON_UNLOCKED*/ + defaultAidRoute &= 0xE7; + } + Log.d(TAG, "defaultAidRoute : " + defaultAidRoute); return defaultAidRoute; } @@ -4192,9 +4346,11 @@ public class NfcService implements DeviceHostListener { */ public int GetDefaultMifateCLTRouteEntry() { - //return ((ROUTE_ID_UICC << ROUTE_LOC_MASK ) | ROUTE_SWITCH_ON | ROUTE_SWITCH_OFF | (TECH_TYPE_A << TECH_TYPE_MASK)) ; - Log.d(TAG, "getDefaultMifareCLTRoute :" + mDeviceHost.getDefaultMifareCLTRoute() ); - return ((mDeviceHost.getDefaultMifareCLTPowerState() & 0x1F) | (mDeviceHost.getDefaultMifareCLTRoute() << ROUTE_LOC_MASK) | (TECH_TYPE_A << TECH_TYPE_MASK)) ; + int routeLoc = mDeviceHost.getDefaultMifareCLTRoute(); + int defaultMifateCLTRoute = ((mDeviceHost.getDefaultMifareCLTPowerState() & 0x1F) | (routeLoc << ROUTE_LOC_MASK) | (TECH_TYPE_A << TECH_TYPE_MASK)); + + Log.d(TAG, "defaultMifateCLTRoute : " + defaultMifateCLTRoute); + return defaultMifateCLTRoute; } public boolean setDefaultRoute(int defaultRouteEntry, int defaultProtoRouteEntry, int defaultTechRouteEntry) { @@ -4626,6 +4782,9 @@ public class NfcService implements DeviceHostListener { if(dataSrcInfo.second == UICC_ID_TYPE) { evtSrc = NxpConstants.UICC_ID; gsmaSrc = "SIM1"; + } else if(dataSrcInfo.second == UICC2_ID_TYPE) { + evtSrc = NxpConstants.UICC2_ID; + gsmaSrc = "SIM2"; } else if(dataSrcInfo.second == SMART_MX_ID_TYPE) { evtSrc = NxpConstants.SMART_MX_ID; gsmaSrc = "ESE"; @@ -4670,6 +4829,8 @@ public class NfcService implements DeviceHostListener { String evtSrc = ""; if(evtSrcInfo == UICC_ID_TYPE) { evtSrc = NxpConstants.UICC_ID; + } else if(evtSrcInfo == UICC2_ID_TYPE) { + evtSrc = NxpConstants.UICC2_ID; } else if(evtSrcInfo == SMART_MX_ID_TYPE) { evtSrc = NxpConstants.SMART_MX_ID; } @@ -5198,23 +5359,7 @@ public class NfcService implements DeviceHostListener { // TODO mCardEmulationManager.setScreenState(screenState); sendMessage(NfcService.MSG_APPLY_SREEN_STATE, screenState); //new ApplyRoutingTask().execute(Integer.valueOf(screenState)); - } else if (action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) { - boolean isAirplaneModeOn = intent.getBooleanExtra("state", false); - // Query the airplane mode from Settings.System just to make sure that - // some random app is not sending this intent - if (isAirplaneModeOn != isAirplaneModeOn()) { - return; - } - if (!mIsAirplaneSensitive) { - return; - } - mPrefsEditor.putBoolean(PREF_AIRPLANE_OVERRIDE, false); - mPrefsEditor.apply(); - if (isAirplaneModeOn) { - new EnableDisableTask().execute(TASK_DISABLE); - } else if (!isAirplaneModeOn && mPrefs.getBoolean(PREF_NFC_ON, NFC_ON_DEFAULT)) { - new EnableDisableTask().execute(TASK_ENABLE); - } + } else if (action.equals(Intent.ACTION_USER_SWITCHED)) { int screenState = ScreenStateHelper.SCREEN_STATE_OFF; int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0); @@ -5287,14 +5432,6 @@ public class NfcService implements DeviceHostListener { }; /** - * Returns true if airplane mode is currently on - */ - boolean isAirplaneModeOn() { - return Settings.System.getInt(mContentResolver, - Settings.Global.AIRPLANE_MODE_ON, 0) == 1; - } - - /** * for debugging only - no i18n */ static String stateToString(int state) { @@ -5328,8 +5465,6 @@ public class NfcService implements DeviceHostListener { pw.println("mNfcPollingEnabled=" + mNfcPollingEnabled); pw.println("mNfceeRouteEnabled=" + mNfceeRouteEnabled); pw.println("mOpenEe=" + mOpenEe); - pw.println("mIsAirplaneSensitive=" + mIsAirplaneSensitive); - pw.println("mIsAirplaneToggleable=" + mIsAirplaneToggleable); pw.println("mLockscreenPollMask=" + mLockscreenPollMask); pw.println(mCurrentDiscoveryParameters); mP2pLinkManager.dump(fd, pw, args); diff --git a/src/com/android/nfc/cardemulation/CardEmulationManager.java b/src/com/android/nfc/cardemulation/CardEmulationManager.java index e24d98cd..332cea2b 100644 --- a/src/com/android/nfc/cardemulation/CardEmulationManager.java +++ b/src/com/android/nfc/cardemulation/CardEmulationManager.java @@ -53,6 +53,8 @@ import android.nfc.cardemulation.NfcFCardEmulation; import android.os.Binder; import android.os.RemoteException; import android.os.UserHandle; +import android.os.PowerManager; +import android.os.SystemClock; import android.provider.Settings; import android.util.Log; @@ -99,6 +101,7 @@ public class CardEmulationManager implements RegisteredServicesCache.Callback, final CardEmulationInterface mCardEmulationInterface; final RegisteredNxpServicesCache mRegisteredNxpServicesCache; final NfcFCardEmulationInterface mNfcFCardEmulationInterface; + final PowerManager mPowerManager; public CardEmulationManager(Context context, AidRoutingManager aidRoutingManager, Nfcid2RoutingManager nfcid2RoutingManager) { mContext = context; @@ -118,6 +121,7 @@ public class CardEmulationManager implements RegisteredServicesCache.Callback, mServiceCache.initialize(mRegisteredNxpServicesCache); mNfcFServicesCache.initialize(); + mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); } public RegisteredNxpServicesCache getRegisteredNxpServicesCache() { @@ -138,6 +142,9 @@ public class CardEmulationManager implements RegisteredServicesCache.Callback, } public void onHostCardEmulationActivated(int technology) { + if (mPowerManager != null) { + mPowerManager.userActivity(SystemClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0); + } if (technology == NFC_HCE_APDU) { mHostEmulationManager.onHostEmulationActivated(); mPreferredServices.onHostEmulationActivated(); @@ -149,6 +156,9 @@ public class CardEmulationManager implements RegisteredServicesCache.Callback, } public void onHostCardEmulationData(int technology, byte[] data) { + if (mPowerManager != null) { + mPowerManager.userActivity(SystemClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0); + } if (technology == NFC_HCE_APDU) { mHostEmulationManager.onHostEmulationData(data); } else if (technology == NFC_HCE_NFCF) { |