NFC_NCIHALx_ARC0.4.7.0_M_OpnSrc
diff --git a/nci/jni/Android.mk b/nci/jni/Android.mk
index 2a7d34a..bfbb172 100644
--- a/nci/jni/Android.mk
+++ b/nci/jni/Android.mk
@@ -17,6 +17,7 @@
PN547C2 := 1
PN548C2 := 2
PN551 := 3
+PN553 := 4
NQ110 := $PN547C2
NQ120 := $PN547C2
NQ210 := $PN548C2
@@ -32,6 +33,9 @@
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 @@
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 @@
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 6c66a27..5984674 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 @@
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 @@
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 @@
{
ALOGE ("%s: Not in Recovery State", fn);
}
+#endif
}
namespace android
{
@@ -247,3 +253,78 @@
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 e363719..fbeedf1 100644
--- a/nci/jni/DwpChannel.h
+++ b/nci/jni/DwpChannel.h
@@ -36,4 +36,5 @@
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 dd8cfa2..a613498 100644
--- a/nci/jni/HciRFParams.cpp
+++ b/nci/jni/HciRFParams.cpp
@@ -147,7 +147,7 @@
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 dbbd7c5..54df8a5 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 @@
#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 @@
{
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 @@
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 @@
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 @@
#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_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 @@
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 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 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 @@
#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 @@
#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 @@
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 @@
}
#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 @@
{
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 @@
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 @@
|| (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 @@
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 @@
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 @@
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 @@
*******************************************************************************/
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 @@
#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 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
}
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 @@
#endif
//PeerToPeer::getInstance().setP2pListenMask(p2p_listen_mask & 0x05);
//PeerToPeer::getInstance().enableP2pListening (true);
+
PeerToPeer::getInstance().enableP2pListening (false);
startRfDiscovery (true);
}
@@ -2959,10 +3037,14 @@
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 @@
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 @@
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 @@
{
SyncEventGuard guard (sNfceeHciCbDisableEvent);
NFA_EE_HCI_Control(false);
- sNfceeHciCbDisableEvent.wait();
+ sNfceeHciCbDisableEvent.wait(500);
}
/*Reset Nfcc*/
@@ -4324,7 +4417,7 @@
{
SyncEventGuard guard (sNfceeHciCbEnableEvent);
NFA_EE_HCI_Control(true);
- sNfceeHciCbEnableEvent.wait ();
+ sNfceeHciCbEnableEvent.wait (500);
}
{
@@ -4337,22 +4430,24 @@
}
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 @@
DWP->close = close;
DWP->transceive = transceive;
DWP->doeSE_Reset = doeSE_Reset;
+ DWP->doeSE_JcopDownLoadReset = doeSE_JcopDownLoadReset;
}
#endif
/*******************************************************************************
@@ -5064,12 +5160,12 @@
gGeneralPowershutDown = nfcMode;
}
#endif
-
+#if (JCOP_WA_ENABLE == TRUE)
bool isNfcInitializationDone()
{
return sIsNfaEnabled;
}
-
+#endif
/*******************************************************************************
**
** Function: StoreScreenState
@@ -5101,7 +5197,7 @@
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 @@
{
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 @@
&& 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 @@
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 @@
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 @@
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 @@
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 @@
pthread_exit(NULL);
return NULL;
}
-
+#if (JCOP_WA_ENABLE == TRUE)
/*******************************************************************************
**
** Function sig_handler
@@ -5653,6 +5750,9 @@
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 @@
break;
}
}
+#endif
/*******************************************************************************
**
@@ -5829,7 +5930,15 @@
**********************************************************************************/
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 @@
}
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 @@
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 @@
retry_cnt=0;
#if(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE)
sCheckNfceeFlag = 0;
- getUiccContext();
#endif
}
@@ -5965,7 +6118,9 @@
retry_cnt=0;
}
}
+#if (JCOP_WA_ENABLE == TRUE)
RoutingManager::getInstance().handleSERemovedNtf();
+#endif
sCheckNfceeFlag = 0;
}
#endif
@@ -5980,6 +6135,59 @@
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 @@
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 @@
/**********************************************************************************
**
+ ** 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 @@
}
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 @@
//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 @@
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 69958b9..6dcde90 100644
--- a/nci/jni/NativeNfcTag.cpp
+++ b/nci/jni/NativeNfcTag.cpp
@@ -95,7 +95,7 @@
// 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 405d0e9..c3a0045 100644
--- a/nci/jni/NativeNxpFeature.cpp
+++ b/nci/jni/NativeNxpFeature.cpp
@@ -182,7 +182,7 @@
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 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 @@
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 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 @@
}
#endif
+#if (JCOP_WA_ENABLE == TRUE)
/*******************************************************************************
**
** Function: ResetEseSession
@@ -704,6 +717,7 @@
ALOGD("%s: exit", __FUNCTION__);
return status;
}
+#endif
/*******************************************************************************
**
** Function: SetUICC_SWPBitRate()
diff --git a/nci/jni/NativeSecureElement.cpp b/nci/jni/NativeSecureElement.cpp
index f1659e5..943ef37 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_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 @@
** 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 @@
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 @@
}
#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 @@
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 @@
}
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 @@
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 @@
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 @@
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 @@
{
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(checkP61Status() && (is_wired_mode_open == true))
- se.NfccStandByOperation(STANDBY_GPIO_HIGH);
- }
- stat = se.SecEle_Modeset(0x01);
- usleep(2000 * 1000);
+#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
+ {
+ 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);
+ }
#endif
ALOGD("%s: exit", __FUNCTION__);
return stat ? JNI_TRUE : JNI_FALSE;
@@ -450,9 +630,16 @@
//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 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
old mode 100644
new mode 100755
index ad370db..884898c
--- 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 fb874d1..4e5b192 100644
--- a/nci/jni/NfcTag.cpp
+++ b/nci/jni/NfcTag.cpp
@@ -85,8 +85,8 @@
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 baf7e66..e1d74f8 100644
--- a/nci/jni/NfcTag.h
+++ b/nci/jni/NfcTag.h
@@ -516,8 +516,9 @@
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 cb95223..5f6a25f 100644
--- a/nci/jni/PeerToPeer.cpp
+++ b/nci/jni/PeerToPeer.cpp
@@ -132,11 +132,13 @@
*******************************************************************************/
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 88b600c..4aeffe8 100644
--- a/nci/jni/RoutingManager.cpp
+++ b/nci/jni/RoutingManager.cpp
@@ -74,7 +74,7 @@
#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 @@
{
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 @@
: 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 @@
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 @@
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 @@
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 @@
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 @@
// 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 @@
#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 @@
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,865 +602,632 @@
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_EXTNS == TRUE) && (NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE))
- if(mSetDefaulRouteParams == 0)
- {
- mSetDefaulRouteParams = ((defaultRoute<<16)|(protoRoute<<8)|(techRoute));
- }
-#endif
-
- SyncEventGuard guard (mRoutingEvent);
- if (mDefaultEe == SecureElement::ESE_ID) //eSE
- {
- preferred_defaultHandle = 0x4C0;
- }
- else if (mDefaultEe == SecureElement::UICC_ID) //UICC
- {
- preferred_defaultHandle = 0x402;
- }
-
- uiccListenTech = NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B;
-
- ALOGD ("%s: enter, defaultRoute:%x protoRoute:0x%x TechRoute:0x%x HostListenMask:0x%x", fn, defaultRoute, protoRoute, techRoute, mHostListnTechMask);
-
- 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);
-
- 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);
-
- 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);
-
- cleanRouting();
-
- if (mHostListnTechMask)
- {
- nfaStat = NFA_CeRegisterAidOnDH (NULL, 0, stackCallback);
- if (nfaStat != NFA_STATUS_OK)
- ALOGE ("Failed to register wildcard AID for DH");
- }
-
- 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;
- }
- }
-
- 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)
- {
-
-#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 );
+#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
- 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);
+ mDefaultIso7816SeID = (((defaultRoute & 0x60) >> 5) == 0x00) ? ROUTE_LOC_HOST_ID : ((((defaultRoute & 0x60)>>5 )== 0x01 ) ? ROUTE_LOC_ESE_ID : ROUTE_LOC_UICC1_ID);
#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;
- }
- }
+ mDefaultIso7816Powerstate = defaultRoute & 0x1F;
+ ALOGD ("%s:mDefaultIso7816SeID:0x%2X mDefaultIso7816Powerstate:0x%X", fn, mDefaultIso7816SeID, mDefaultIso7816Powerstate);
-#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");
- }
- }
+#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
-//ee_handle = SecureElement::getInstance().getEseHandleFromGenericId(switch_on);
- ALOGD ("%s:defaultHandle:%x", fn, defaultHandle);
- ALOGD ("%s:preferred_defaultHandle:%x", fn, preferred_defaultHandle);
+ 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)
{
- unsigned long max_tech_mask = 0x03;
- unsigned int default_tech_power_mask[5] = {0,};
- unsigned int defaultTechFPowerstate = 0x1F;
-
- max_tech_mask = SecureElement::getInstance().getSETechnology(defaultTechSeID);
-
- ALOGD ("%s:defaultTechSeID:%x", fn, defaultTechSeID);
- ALOGD ("%s:Technologies supported by defaultTechSeID :%x", fn, max_tech_mask);
-
- if(defaultTechSeID == 0x402)
- {
- 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;
- }
- }
-
- 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");
- }
-
- if(mHostListnTechMask > 0 && mFwdFuntnEnable == TRUE)
- {
- 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");
- }
- }
- }
- else
- {
- ALOGD ("Host Listen is disabled, Not setting any tech route to DH");
- }
- }
- 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)
- {
- 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");
- }
- }
- }
- }
+ 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");
}
- if ((GetNumValue(NAME_UICC_LISTEN_TECH_MASK, &uiccListenTech, sizeof(uiccListenTech))))
- {
- ALOGD ("%s:UICC_TECH_MASK=0x0%lu;", __FUNCTION__, uiccListenTech);
- }
- if((defaultHandle != NFA_HANDLE_INVALID) && (0 != uiccListenTech))
- {
- {
- 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");
- }
- }
+ 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)))
+ {
+ ALOGD("%s : CHECK_DEFAULT_PROTO_SE_ID - 0x%2X ",fn,check_default_proto_se_id_req);
+ }
+ else
+ {
+ ALOGE("%s : CHECK_DEFAULT_PROTO_SE_ID not defined. Taking default value - 0x%2X",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]);
+ ActDevHandle = SecureElement::getInstance().getEseHandleFromGenericId(seId);
+ ALOGD ("%s:ee_handleList[%d]:0x%2X", fn, i,ee_handleList[i]);
+ if (mDefaultIsoDepSeID == ActDevHandle)
+ {
+ isDefaultIsoDepSeIDPresent = 1;
+ break;
+ }
+ }
+
+ ALOGD ("%s:isDefaultIsoDepSeIDPresent:0x%X", fn, isDefaultIsoDepSeIDPresent);
+ if(!isDefaultIsoDepSeIDPresent)
+ {
+ mDefaultIsoDepSeID = ROUTE_LOC_HOST_ID;
+ mDefaultIsoDepPowerstate = 0x01;
+ }
+ }
+
+ ALOGD ("%s: exit", fn);
+}
+
+void RoutingManager::initialiseTableEntries(void)
+{
+ static const char fn [] = "RoutingManager::initialiseTableEntries";
+
+ ALOGD ("%s: enter", fn);
+
+ /* Defined Protocol Masks
+ * T1T 0x01
+ * T2T 0x02
+ * T3T 0x04
+ * ISO-DEP 0x08
+ * NFC-DEP 0x10
+ * ISO-7816 0x20
+ */
+
+ 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;
+
+ 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;
+
+ 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;
+ }
+
+ 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++)
+ {
+ 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;
+
+ 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;
+
+ dumpTables(1);
+
+ 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)
+ {
+ 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);
+ }
+ }
+ }
+
+ dumpTables(2);
+
+ ALOGD ("%s: exit", fn);
+}
+
+void RoutingManager::setProtoRouting()
+{
+ static const char fn [] = "RoutingManager::setProtoRouting";
+ tNFA_STATUS nfaStat = NFA_STATUS_FAILED;
+
+ 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)
+ {
+ mRoutingEvent.wait ();
+ }
+ else
+ {
+ ALOGE ("Fail to clear proto routing to 0x%X",mLmrtEntries[xx].nfceeID);
+ }
+ /*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)
+ {
+ mRoutingEvent.wait ();
+ }
+ else
+ {
+ ALOGE ("Fail to set proto routing to 0x%X",mLmrtEntries[xx].nfceeID);
+ }
+ }
+ }
+ ALOGD ("%s: exit", fn);
+}
+
+/* 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))
+ {
+ processTechEntriesForFwdfunctionality();
+ }
+ 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)
+ {
+ 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;
+ }
+ dumpTables(3);
+ ALOGD ("%s: exit", fn);
+}
+
+/* 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)
+{
+ 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
void RoutingManager::enableRoutingToHost()
@@ -1890,7 +1680,12 @@
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::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 @@
{
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 @@
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 @@
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 @@
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 @@
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 @@
}
#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 @@
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 @@
}
}
}
+#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 @@
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 @@
/*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 @@
: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 @@
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 @@
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 @@
#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 @@
else
return false;
}
+#endif
/*******************************************************************************
**
@@ -3363,6 +3177,7 @@
xx++;
}
}
+#if (JCOP_WA_ENABLE == TRUE)
/*******************************************************************************
**
** Function: handleSERemovedNtf()
@@ -3375,20 +3190,20 @@
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 @@
}
}
}
+#endif
/*******************************************************************************
**
** Function: LmrtRspTimerCb
@@ -3417,3 +3233,4 @@
RoutingManager::getInstance().mEeUpdateEvent.notifyOne();
}
#endif
+
diff --git a/nci/jni/RoutingManager.h b/nci/jni/RoutingManager.h
index 581c6f3..b0d6487 100644
--- a/nci/jni/RoutingManager.h
+++ b/nci/jni/RoutingManager.h
@@ -86,6 +86,37 @@
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 @@
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 @@
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 @@
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 @@
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 840fa36..9654f5d 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 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 @@
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 @@
}
};
-#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 @@
: 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 @@
mGetAtrRspwait (false),
mRfFieldIsOn(false),
mTransceiveWaitOk(false),
-
-
mWiredModeRfFiledEnable(0)
{
memset (&mEeInfo, 0, sizeof(mEeInfo));
@@ -299,6 +324,7 @@
static const char fn [] = "SecureElement::initialize";
tNFA_STATUS nfaStat;
unsigned long num = 0;
+ unsigned long retValue;
ALOGD ("%s: enter", fn);
@@ -312,7 +338,7 @@
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 @@
}
#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 @@
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 @@
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 @@
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 @@
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 @@
{
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 @@
}
}
} //for
+#if (NXP_EXTNS == TRUE)
+ mActiveEeHandle = getActiveEeHandle(handle);
+#else
+ mActiveEeHandle = getDefaultEeHandle();
+#endif
mActiveEeHandle = getDefaultEeHandle();
if (mActiveEeHandle == NFA_HANDLE_INVALID)
@@ -940,7 +1045,11 @@
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 @@
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 @@
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
- UINT8 gate = (mNewPipeId == STATIC_PIPE_0x70) ? 0xF0 : 0xF1;
- nfaStat = NFA_HciAddStaticPipe(mNfaHciHandle, host, gate, mNewPipeId);
- if (nfaStat != NFA_STATUS_OK)
+ //TODO according ETSI12 APDU Gate
+#if(NXP_EXTNS == TRUE)
+ UINT8 gate;
+ if(mActiveEeHandle == EE_HANDLE_0xF3)
{
- ALOGE ("%s: fail create static pipe; error=0x%X", fn, nfaStat);
- retVal = false;
- goto TheEnd;
+ gate = (mNewPipeId == STATIC_PIPE_0x70) ? 0xF0 : 0xF1;
+ }
+ else
+ {
+ gate = (mNewPipeId == STATIC_PIPE_UICC) ? 0x30 : 0x31;
+ }
+#else
+ UINT8 gate = (mNewPipeId == STATIC_PIPE_0x70) ? 0xF0 : 0xF1;
+#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())
+ {
+ 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 @@
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 @@
{
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 @@
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 @@
{
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 @@
#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 @@
#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 @@
{
// 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 @@
}
}
#endif
+#endif
if (mTransceiveWaitOk == false) //timeout occurs
{
ALOGE ("%s: wait response timeout", fn);
@@ -1640,9 +1804,11 @@
}
}
#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 @@
{
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 @@
{
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 @@
}
}
#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 @@
}
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 @@
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 @@
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 @@
{
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 @@
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 @@
SyncEventGuard guard (sSecElem.mResetEvent);
sSecElem.mResetEvent.notifyOne();
}
+#endif
#else
if(eventData->rcvd_evt.evt_len > 0)
{
@@ -2254,7 +2468,7 @@
//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 @@
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 @@
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 @@
(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 @@
}
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 @@
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 @@
}
#endif
#endif
+ if(!isEtsi12ApduGatePresent())
{
SyncEventGuard guard (mGetRegisterEvent);
nfaStat = NFA_HciGetRegistry (mNfaHciHandle, mNewPipeId, reg_index);
@@ -2536,21 +2822,45 @@
mGetRegisterEvent.wait();
ALOGE("%s: Received ATR response on pipe 0x%x ", fn, mNewPipeId);
}
+ *recvBufferSize = mAtrInfolen;
+ memcpy(recvBuffer, mAtrInfo, mAtrInfolen);
}
- *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);
+ }
+ }
- 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 @@
{
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 @@
{
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 @@
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 @@
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 @@
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 @@
}
}
+/*******************************************************************************
+**
+** 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 @@
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;
+ 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))
+ {
+ 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;
+ }
+ }
+ }
+ }
+ }
+ 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
- SyncEventGuard guard (mAllowWiredModeEvent);
- if(android::isp2pActivated())
+ if(mIsExclusiveWiredMode)
{
- status = true;
- }
- else if(isActivatedInListenMode())
- {
- ALOGD("%s; mAllowWiredMode=%d ",fn, mAllowWiredMode);
- if(mAllowWiredMode)
- status = true;
- else
- status = mAllowWiredModeEvent.wait(2500);
- }
- else if(isRfFieldOn() && (mWiredModeRfFiledEnable != 0x00))
- {
- 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 @@
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 @@
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 @@
sSecElem.mResetEvent.wait();
}
#endif
+#endif
SyncEventGuard guard (sSecElem.mEeSetModeEvent);
stat = NFA_EeModeSet(handle, mode);
if(stat == NFA_STATUS_OK)
@@ -3291,12 +3931,14 @@
}
#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 @@
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 2cd568b..8d015a7 100644
--- a/nci/jni/SecureElement.h
+++ b/nci/jni/SecureElement.h
@@ -107,7 +107,7 @@
}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 @@
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 @@
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 @@
*******************************************************************************/
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 @@
**
*******************************************************************************/
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 @@
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 @@
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 @@
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 @@
IntervalTimer mTransceiveTimer;
bool mTransceiveWaitOk;
int mWiredModeRfFiledEnable;
+#if(NXP_EXTNS == TRUE)
+ SyncEvent mAbortEvent;
+ bool mAbortEventWaitOk;
+#endif
/*******************************************************************************
**
** Function: SecureElement
@@ -799,6 +877,18 @@
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 6fafbd1..b8a3b40 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 945d0e0..a9d10c8 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
old mode 100755
new mode 100644
index 8cfdbd4..6ba7ff3
--- a/nci/jni/extns/pn54x/src/common/phNfcTypes.h
+++ b/nci/jni/extns/pn54x/src/common/phNfcTypes.h
@@ -303,6 +303,6 @@
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 bb34ee0..1eb4c70 100644
--- a/nci/jni/extns/pn54x/src/utils/phNxpConfig.h
+++ b/nci/jni/extns/pn54x/src/utils/phNxpConfig.h
@@ -93,6 +93,9 @@
#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 3d7a7f3..c8e7229 100755
--- a/nci/src/com/android/nfc/dhimpl/NativeNfcSecureElement.java
+++ b/nci/src/com/android/nfc/dhimpl/NativeNfcSecureElement.java
@@ -60,13 +60,13 @@
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);