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