NFC: Update third party NfcService to 4.3.0_M
Merge branch 'caf/caf-3/nxpnfc-project/br_android_ncihalx_m' into nfc.lnx.1.0-dev.1.0
* caf/caf-3/nxpnfc-project/br_android_ncihalx_m:
NFC_NCIHALx_AR0F.4.3.0_M_OpnSrc
NFC_NCIHALx_AR0F.4.3.0_M_OpnSrc
NFC_NCIHALx_AR0F.4.3.0_M_OpnSrc
Change-Id: I392881b85f79254c135663e538d0f3e65b938353
CRs-Fixed: 970257
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index ac318eb..986d40b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -53,10 +53,12 @@
<uses-permission android:name="com.android.permission.WHITELIST_BLUETOOTH_DEVICE" />
<uses-permission android:name="android.permission.DISPATCH_NFC_MESSAGE" />
<uses-permission android:name="android.permission.DEVICE_POWER" />
-
- <permission android:name="com.gsma.service.nfc.permission.TRANSACTION_EVENT"
- android:permissionGroup = "android.permission-group.NFC"
- android:protectionLevel="dangerous"
+ <permission-group android:name ="com.gsma.services.nfc.permission"
+ android:label ="@string/permgrouplab_NFC"
+ android:description="@string/permgroupdesc_NFC"
+ android:priority="270" />
+ <permission android:name="com.gsma.services.nfc.permission.TRANSACTION_EVENT"
+ android:permissionGroup = "com.gsma.services.nfc.permission"
android:label= "@string/permlab_nfcReceiveEvent"
android:description = "@string/permdesc_nfcReceiveEvent" />
diff --git a/README.md b/README.md
index 031055a..5433176 100644
--- a/README.md
+++ b/README.md
@@ -17,5 +17,6 @@
| Android Version | NXP Release | NXP Tag |
| :-------------: |:-------------:| :-----:|
| 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 |
diff --git a/nci/jni/DwpChannel.cpp b/nci/jni/DwpChannel.cpp
index 583037d..6c66a27 100644
--- a/nci/jni/DwpChannel.cpp
+++ b/nci/jni/DwpChannel.cpp
@@ -15,6 +15,7 @@
*/
#include "DwpChannel.h"
#include "SecureElement.h"
+#include "RoutingManager.h"
#include <cutils/log.h>
static const int EE_ERROR_OPEN_FAIL = -1;
@@ -177,9 +178,10 @@
//if controller is not routing AND there is no pipe connected,
//then turn off the sec elem
+ #if((NFC_NXP_CHIP_TYPE == PN547C2)&&(NFC_NXP_ESE == TRUE))
if (! se.isBusy())
se.deactivate (SecureElement::ESE_ID);
-
+ #endif
return stat;
}
@@ -209,8 +211,10 @@
{
static const char fn [] = "DwpChannel::doeSE_Reset";
SecureElement &se = SecureElement::getInstance();
+ RoutingManager &rm = RoutingManager::getInstance();
ALOGD("%s: enter:", fn);
+ rm.mResetHandlerMutex.lock();
ALOGD("1st mode set calling");
se.SecEle_Modeset(0x00);
usleep(100 * 1000);
@@ -221,6 +225,17 @@
ALOGD("2nd mode set called");
usleep(2000 * 1000);
+ rm.mResetHandlerMutex.unlock();
+ 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);
+ }
}
namespace android
{
diff --git a/nci/jni/NativeNfcManager.cpp b/nci/jni/NativeNfcManager.cpp
index 4a35b68..3c0b8b9 100644
--- a/nci/jni/NativeNfcManager.cpp
+++ b/nci/jni/NativeNfcManager.cpp
@@ -41,7 +41,7 @@
#include "HciRFParams.h"
#include <pthread.h>
#include <ScopedPrimitiveArray.h>
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
#include <signal.h>
#include <sys/types.h>
#endif
@@ -63,20 +63,23 @@
#endif
}
-
-
-
+#define SAK_VALUE_AT 17
#if(NXP_EXTNS == TRUE)
#define UICC_HANDLE 0x402
#define ESE_HANDLE 0x4C0
#define RETRY_COUNT 10
#define default_count 3
-
+extern bool recovery;
+static INT32 gNfcInitTimeout;
+static INT32 gdisc_timeout;
+INT32 gSeDiscoverycount = 0;
+INT32 gActualSeCount = 0;
+SyncEvent gNfceeDiscCbEvent;
+extern int gUICCVirtualWiredProtectMask;
+extern int gEseVirtualWiredProtectMask;
#endif
-#define SAK_VALUE_AT 17
-
extern const UINT8 nfca_version_string [];
extern const UINT8 nfa_version_string [];
@@ -87,16 +90,6 @@
extern tNFA_DM_DISC_FREQ_CFG* p_nfa_dm_rf_disc_freq_cfg; //defined in stack
bool sHCEEnabled = true; // whether HCE is enabled
extern bool gReaderNotificationflag;
-#if(NXP_EXTNS == TRUE)
-extern bool recovery;
-static INT32 gNfcInitTimeout;
-static INT32 gdisc_timeout;
-INT32 gSeDiscoverycount = 0;
-INT32 gActualSeCount = 0;
-SyncEvent gNfceeDiscCbEvent;
-extern int gUICCVirtualWiredProtectMask;
-extern int gEseVirtualWiredProtectMask;
-#endif
namespace android
{
@@ -133,7 +126,7 @@
static void nfaNxpSelfTestNtfTimerCb (union sigval);
//Factory Test Code --end
extern bool getReconnectState(void);
- extern tNFA_STATUS SetVenConfigValue(jint venconfig);
+ extern tNFA_STATUS SetVenConfigValue(jint nfcMode);
extern tNFA_STATUS SetHfoConfigValue(void);
extern tNFA_STATUS SetUICC_SWPBitRate(bool);
extern tNFA_STATUS GetSwpStausValue(void);
@@ -239,6 +232,9 @@
static UINT8 sIsSecElemSelected = 0; //has NFC service selected a sec elem
static UINT8 sIsSecElemDetected = 0; //has NFC service deselected a sec elem
static bool sDiscCmdwhleNfcOff = false;
+#if (NXP_EXTNS == TRUE)
+static bool gsNfaPartialEnabled = false;
+#endif
#define CONFIG_UPDATE_TECH_MASK (1 << 1)
#define TRANSACTION_TIMER_VALUE 50
@@ -258,6 +254,9 @@
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))
+bool isp2pActivated();
+#endif
static void nfaConnectionCallback (UINT8 event, tNFA_CONN_EVT_DATA *eventData);
static void nfaDeviceManagementCallback (UINT8 event, tNFA_DM_CBACK_DATA *eventData);
static bool isPeerToPeer (tNFA_ACTIVATED& activated);
@@ -272,6 +271,9 @@
static int nfcManager_getNfcInitTimeout(JNIEnv* e, jobject o);
static int nfcManager_doJcosDownload(JNIEnv* e, jobject o);
static void nfcManager_doCommitRouting(JNIEnv* e, jobject o);
+#if(NXP_EXTNS == TRUE)
+static void nfcManager_doSetNfcMode (JNIEnv *e, jobject o, jint nfcMode);
+#endif
static void nfcManager_doSetVenConfigValue (JNIEnv *e, jobject o, jint venconfig);
static jint nfcManager_getSecureElementTechList(JNIEnv* e, jobject o);
static void nfcManager_setSecureElementListenTechMask(JNIEnv *e, jobject o, jint tech_mask);
@@ -307,9 +309,6 @@
UINT16 sRoutingBuffLen;
static UINT8 sRoutingBuff[MAX_GET_ROUTING_BUFFER_SIZE];
-#endif
-
-#if(NXP_EXTNS == TRUE)
static UINT8 sNfceeConfigured;
static UINT8 sCheckNfceeFlag;
void checkforNfceeBuffer();
@@ -329,6 +328,8 @@
static IntervalTimer LmrtRspTimer;
static void LmrtRspTimerCb(union sigval);
static void nfcManager_setProvisionMode(JNIEnv* e, jobject o, jboolean provisionMode);
+static bool nfcManager_doPartialInitialize ();
+static bool nfcManager_doPartialDeInitialize();
#endif
@@ -339,6 +340,7 @@
#endif
#if(NXP_EXTNS == TRUE)
tNFC_FW_VERSION get_fw_version();
+bool isNfcInitializationDone();
static UINT16 discDuration = 0x00;
UINT16 getrfDiscoveryDuration();
#if (NFC_NXP_CHIP_TYPE == PN548C2)
@@ -422,9 +424,6 @@
jboolean restart);
void nfcManager_disableDiscovery (JNIEnv*, jobject);
static bool get_transcation_stat(void);
-#if(NXP_EXTNS == TRUE)
-void set_transcation_stat(bool result);
-#endif
static char get_last_request(void);
static void set_last_request(char status, struct nfc_jni_native_data *nat);
static eScreenState_t get_lastScreenStateRequest(void);
@@ -443,6 +442,7 @@
void reconfigure_poll_cb(union sigval);
void clear_multiprotocol();
void multiprotocol_clear_flag(union sigval);
+void set_transcation_stat(bool result);
#endif
/////////////////////////////////////////////////////////////
@@ -508,6 +508,7 @@
#if(NXP_EXTNS == TRUE)
else if(!sReaderModeEnabled && multiprotocol_flag)
{
+ NfcTag::getInstance ().mNumDiscNtf = 0x00;
multiprotocol_flag = 0;
multiprotocol_detected = 1;
ALOGD("Prio_Logic_multiprotocol Logic");
@@ -743,6 +744,10 @@
#endif
nativeNfcTag_doConnectStatus(false);
}
+#if(NXP_EXTNS == TRUE)
+ NfcTag::getInstance().selectCompleteStatus(false);
+ NfcTag::getInstance ().mNumDiscNtf = 0x00;
+#endif
NfcTag::getInstance().mTechListIndex = 0;
ALOGE("%s: NFA_SELECT_RESULT_EVT error: status = %d", __FUNCTION__, eventData->status);
NFA_Deactivate (FALSE);
@@ -774,8 +779,10 @@
case NFA_ACTIVATED_EVT: // NFC link/protocol activated
checkforTranscation(NFA_ACTIVATED_EVT, (void *)eventData);
+
ALOGD("%s: NFA_ACTIVATED_EVT: gIsSelectingRfInterface=%d, sIsDisabling=%d", __FUNCTION__, gIsSelectingRfInterface, sIsDisabling);
- #if(NXP_EXTNS == TRUE)
+#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);
@@ -827,6 +834,7 @@
gActivated = true;
NfcTag::getInstance().setActivationState ();
+
if (gIsSelectingRfInterface)
{
nativeNfcTag_doConnectStatus(true);
@@ -840,10 +848,6 @@
nativeNfcTag_resetPresenceCheck();
if (isPeerToPeer(eventData->activated))
{
-#if (NFC_NXP_ESE == TRUE && NFC_NXP_CHIP_TYPE != PN547C2)
- SyncEventGuard guard (SecureElement::getInstance().mAllowWiredModeEvent);
- SecureElement::getInstance().mAllowWiredModeEvent.notifyOne();
-#endif
if (sReaderModeEnabled)
{
#if(NXP_EXTNS == TRUE)
@@ -998,6 +1002,7 @@
SecureElement::getInstance().notifyListenModeState (false);
} else if (sP2pActive) {
sP2pActive = false;
+ SecureElement::getInstance().notifyRfFieldEvent (false);
// Make sure RF field events are re-enabled
ALOGD("%s: NFA_DEACTIVATED_EVT; is p2p", __FUNCTION__);
// Disable RF field events in case of p2p
@@ -1014,7 +1019,6 @@
ALOGE ("%s: Failed to enable RF field events", __FUNCTION__);
}
// Consider the field to be off at this point
- SecureElement::getInstance().notifyRfFieldEvent (false);
}
*/
}
@@ -1686,16 +1690,14 @@
#if (NXP_EXTNS == TRUE)
result = RoutingManager::getInstance().setDefaultRoute(defaultRouteEntry, defaultProtoRouteEntry, defaultTechRouteEntry);
RoutingManager::getInstance().commitRouting();
-#else
- result = RoutingManager::getInstance().setDefaultRouting();
-#endif
-
-#if(NXP_EXTNS == TRUE)
LmrtRspTimer.set(1000, LmrtRspTimerCb);
SyncEventGuard guard (RoutingManager::getInstance().mLmrtEvent);
if(result == true)
RoutingManager::getInstance().mLmrtEvent.wait();
+#else
+ result = RoutingManager::getInstance().setDefaultRouting();
#endif
+
startRfDiscovery(true);
return result;
}
@@ -1758,6 +1760,9 @@
gSeDiscoverycount = 0;
gActualSeCount = 0;
UINT8 configData = 0;
+#if(NXP_EXTNS == TRUE)
+ gGeneralPowershutDown = 0;
+#endif
ALOGD ("%s: enter; ver=%s nfa=%s NCI_VERSION=0x%02X",
__FUNCTION__, nfca_version_string, nfa_version_string, NCI_VERSION);
mwVer= NFA_GetMwVersion();
@@ -1768,7 +1773,7 @@
tNFA_STATUS stat = NFA_STATUS_OK;
NfcTag::getInstance ().mNfcDisableinProgress = false;
PowerSwitch & powerSwitch = PowerSwitch::getInstance ();
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
struct sigaction sig;
memset(&sig, 0, sizeof(struct sigaction));
@@ -1784,7 +1789,13 @@
ALOGD ("%s: already enabled", __FUNCTION__);
goto TheEnd;
}
-
+#if(NXP_EXTNS == TRUE)
+ if(gsNfaPartialEnabled)
+ {
+ ALOGD ("%s: already partial enable calling deinitialize", __FUNCTION__);
+ nfcManager_doPartialDeInitialize();
+ }
+#endif
if ((signal(SIGABRT, sig_handler) == SIG_ERR) &&
(signal(SIGSEGV, sig_handler) == SIG_ERR))
{
@@ -1800,11 +1811,12 @@
theInstance.Initialize(); //start GKI, NCI task, NFC task
{
+#if(NXP_EXTNS == TRUE)
+ NFA_SetBootMode(NFA_NORMAL_BOOT_MODE);
+#endif
SyncEventGuard guard (sNfaEnableEvent);
tHAL_NFC_ENTRY* halFuncEntries = theInstance.GetHalEntryFuncs ();
-
NFA_Init (halFuncEntries);
-
stat = NFA_Enable (nfaDeviceManagementCallback, nfaConnectionCallback);
if (stat == NFA_STATUS_OK)
{
@@ -1856,7 +1868,6 @@
}
}
checkforNfceeConfig();
- getUICC_RF_Param_SetSWPBitRate();
#endif
#if((NFC_NXP_ESE_VER == JCOP_VER_3_3)&& (NXP_EXTNS == TRUE))
if(isNxpConfigModified())
@@ -1874,13 +1885,6 @@
#if(NXP_EXTNS == TRUE)
set_transcation_stat(false);
pendingScreenState = false;
- stat = SetVenConfigValue(VEN_CFG_NFC_ON_POWER_ON);
- if (stat != NFA_STATUS_OK)
- {
- ALOGE ("%s: fail enable SetVenConfigValue; error=0x%X", __FUNCTION__, stat);
- }
- ALOGE ("%s: set the VEN_CFG to VEN_CFG_NFC_ON_POWER_ON", __FUNCTION__);
- gGeneralPowershutDown = 0;
if(gIsDtaEnabled == true){
configData = 0x01; /**< Poll NFC-DEP : Highest Available Bit Rates */
@@ -2659,6 +2663,11 @@
}
ScopedUtfChars serviceName(e, sn);
+ if (serviceName.c_str() == NULL)
+ {
+ ALOGE ("%s: service name can not be null error", __FUNCTION__);
+ return NULL;
+ }
ALOGD ("%s: enter: sap=%i; name=%s; miu=%i; rw=%i; buffLen=%i", __FUNCTION__, nSap, serviceName.c_str(), miu, rw, linearBufferLength);
@@ -2760,30 +2769,6 @@
if (sIsNfaEnabled)
{
-#if(NXP_EXTNS == TRUE)
- jint venconfig;
- if (gGeneralPowershutDown == VEN_CFG_NFC_OFF_POWER_OFF)
- {
- stat = SetVenConfigValue(gGeneralPowershutDown);
- if (stat != NFA_STATUS_OK)
- {
- ALOGE ("%s: fail enable SetVenConfigValue; error=0x%X", __FUNCTION__, stat);
- }
- ALOGE ("%s: set the VEN_CFG to %d", __FUNCTION__,gGeneralPowershutDown);
- gGeneralPowershutDown = 0;
- }
-
-#if(NFC_NXP_HFO_SETTINGS == TRUE)
- if (gGeneralPowershutDown == VEN_CFG_NFC_ON_POWER_ON)
- {
- stat = SetHfoConfigValue();
- if (stat != NFA_STATUS_OK)
- {
- ALOGE ("%s: fail to enable HFO; error=0x%X", __FUNCTION__, stat);
- }
- }
-#endif
-#endif
SyncEventGuard guard (sNfaDisableEvent);
EXTNS_Close();
stat = NFA_Disable (TRUE /* graceful */);
@@ -3297,7 +3282,7 @@
* conditional check is added to avoid multiple dicovery cmds
* at the time of NFC OFF in progress
*/
- if ((gGeneralPowershutDown != VEN_CFG_NFC_OFF_POWER_OFF) && bRestartDiscovery)
+ if ((gGeneralPowershutDown != NFC_MODE_OFF) && bRestartDiscovery)
startRfDiscovery (true);
//if nothing is active after this, then tell the controller to power down
@@ -3372,6 +3357,58 @@
#if(NXP_EXTNS == TRUE)
/*******************************************************************************
**
+** Function: nfcManager_getDefaultAidPowerState
+**
+** Description: Get the default Desfire Power States.
+** e: JVM environment.
+** o: Java object.
+**
+** Returns: Power State
+**
+*******************************************************************************/
+static jint nfcManager_getDefaultAidPowerState (JNIEnv* e, jobject o)
+{
+ unsigned long num = 0;
+ GetNxpNumValue(NAME_DEFAULT_AID_PWR_STATE, &num, sizeof(num));
+ return num;
+}
+
+/*******************************************************************************
+**
+** Function: nfcManager_getDefaultDesfirePowerState
+**
+** Description: Get the default Desfire Power States.
+** e: JVM environment.
+** o: Java object.
+**
+** Returns: Power State
+**
+*******************************************************************************/
+static jint nfcManager_getDefaultDesfirePowerState (JNIEnv* e, jobject o)
+{
+ unsigned long num = 0;
+ GetNxpNumValue(NAME_DEFAULT_DESFIRE_PWR_STATE, &num, sizeof(num));
+ return num;
+}
+/*******************************************************************************
+**
+** Function: nfcManager_getDefaultMifareCLTPowerState
+**
+** Description: Get the default mifare CLT Power States.
+** e: JVM environment.
+** o: Java object.
+**
+** Returns: Power State
+**
+*******************************************************************************/
+static jint nfcManager_getDefaultMifareCLTPowerState (JNIEnv* e, jobject o)
+{
+ unsigned long num = 0;
+ GetNxpNumValue(NAME_DEFAULT_MIFARE_CLT_PWR_STATE, &num, sizeof(num));
+ return num;
+}
+/*******************************************************************************
+**
** Function: nfcManager_setDefaultTechRoute
**
** Description: Setting Default Technology Routing
@@ -4028,6 +4065,16 @@
{"getDefaultMifareCLTRoute", "()I",
(void*) nfcManager_getDefaultMifareCLTRoute},
+#if(NXP_EXTNS == TRUE)
+ {"getDefaultAidPowerState", "()I",
+ (void*) nfcManager_getDefaultAidPowerState},
+
+ {"getDefaultDesfirePowerState", "()I",
+ (void*) nfcManager_getDefaultDesfirePowerState},
+
+ {"getDefaultMifareCLTPowerState", "()I",
+ (void*) nfcManager_getDefaultMifareCLTPowerState},
+#endif
{"doEnableDiscovery", "(IZZZZZ)V",
(void*) nfcManager_enableDiscovery},
@@ -4109,10 +4156,10 @@
(void *)nfcManager_doJcosDownload},
{"doCommitRouting", "()V",
(void *)nfcManager_doCommitRouting},
-
- {"doSetVenConfigValue", "(I)V",
- (void *)nfcManager_doSetVenConfigValue},
-
+#if(NXP_EXTNS == TRUE)
+ {"doSetNfcMode", "(I)V",
+ (void *)nfcManager_doSetNfcMode},
+#endif
{"doGetSecureElementTechList", "()I",
(void *)nfcManager_getSecureElementTechList},
@@ -4228,7 +4275,7 @@
status = isStart ? NFA_StartRfDiscovery () : NFA_StopRfDiscovery ();
if (status == NFA_STATUS_OK)
{
- if(gGeneralPowershutDown == VEN_CFG_NFC_OFF_POWER_OFF)
+ if(gGeneralPowershutDown == NFC_MODE_OFF)
sDiscCmdwhleNfcOff = true;
sNfaEnableDisablePollingEvent.wait (); //wait for NFA_RF_DISCOVERY_xxxx_EVT
sRfEnabled = isStart;
@@ -4238,6 +4285,7 @@
{
ALOGE ("%s: Failed to start/stop RF discovery; error=0x%X", __FUNCTION__, status);
}
+ ALOGD ("%s: is exit=%d", __FUNCTION__, isStart);
}
/*******************************************************************************
@@ -4554,17 +4602,22 @@
ALOGD ("%s: exit", __FUNCTION__);
}
-
-static void nfcManager_doSetVenConfigValue(JNIEnv *e, jobject o, jint venconfig)
+#if(NXP_EXTNS == TRUE)
+static void nfcManager_doSetNfcMode(JNIEnv *e, jobject o, jint nfcMode)
{
/* Store the shutdown state */
- gGeneralPowershutDown = venconfig;
+ gGeneralPowershutDown = nfcMode;
}
-
+#endif
bool isDiscoveryStarted()
{
return sRfEnabled;
}
+
+bool isNfcInitializationDone()
+{
+ return sIsNfaEnabled;
+}
/*******************************************************************************
**
** Function: StoreScreenState
@@ -4593,6 +4646,23 @@
{
return screenstate;
}
+
+#if((NFC_NXP_ESE == TRUE) && (NFC_NXP_CHIP_TYPE == PN548C2))
+/*******************************************************************************
+**
+** Function: isp2pActivated
+**
+** Description: returns p2pActive state
+**
+** Returns: bool
+**
+*******************************************************************************/
+bool isp2pActivated()
+{
+ return sP2pActive;
+}
+#endif
+
/*******************************************************************************
**
** Function: nfcManager_doSetScreenState
@@ -4718,12 +4788,49 @@
*******************************************************************************/
static void nfcManager_doSetScreenOrPowerState (JNIEnv* e, jobject o, jint state)
{
+ tNFA_STATUS stat = NFA_STATUS_OK;
if (state <= NFA_SCREEN_STATE_UNLOCKED ) // SCREEN_STATE
nfcManager_doSetScreenState(e, o, state);
- else if (state == VEN_POWER_STATE_ON ) // POWER_STATE_ON
- nfcManager_doSetVenConfigValue(e , o, VEN_CFG_NFC_ON_POWER_ON);
- else if (state == VEN_POWER_STATE_OFF ) // POWER_STATE_OFF
- nfcManager_doSetVenConfigValue(e , o, VEN_CFG_NFC_OFF_POWER_OFF);
+ else if (state == VEN_POWER_STATE_ON) // POWER_ON NFC_OFF
+ {
+ nfcManager_doSetNfcMode(e , o, NFC_MODE_OFF);
+ }
+ else if (state == VEN_POWER_STATE_OFF) // POWER_OFF
+ {
+ if(sIsNfaEnabled)
+ {
+ if (sRfEnabled)
+ {
+ // Stop RF discovery to reconfigure
+ startRfDiscovery(false);
+ }
+ ALOGE ("%s: NfaEnabled", __FUNCTION__);
+ nfcManager_doSetNfcMode(e , o, NFC_MODE_ON);
+ SetVenConfigValue(NFC_MODE_ON);
+ if (stat != NFA_STATUS_OK)
+ {
+ ALOGE ("%s: fail enable SetVenConfigValue; error=0x%X", __FUNCTION__, stat);
+ }
+ }
+ else
+ {
+ ALOGE ("%s: NfaDisabled", __FUNCTION__);
+ if(nfcManager_doPartialInitialize() == true)
+ {
+ nfcManager_doSetNfcMode(e , o, NFC_MODE_OFF);
+ stat = SetVenConfigValue(NFC_MODE_OFF);
+ if (stat != NFA_STATUS_OK)
+ {
+ ALOGE ("%s: fail enable SetVenConfigValue; error=0x%X", __FUNCTION__, stat);
+ }
+ }
+
+ if(gsNfaPartialEnabled)
+ {
+ nfcManager_doPartialDeInitialize();
+ }
+ }
+ }
else
ALOGE ("%s: unknown screen or power state. state=%d", __FUNCTION__, state);
}
@@ -4912,9 +5019,6 @@
ALOGD("ACTIVATED_EVT setting flag");
transaction_data.current_transcation_state = NFA_TRANS_ACTIVATED_EVT;
set_transcation_stat(true);
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
- nfcManagerEnableAGCDebug(connEvent);
-#endif
}else{
// ALOGD("other event clearing flag ");
// memset(&transaction_data, 0x00, sizeof(Transcation_Check_t));
@@ -4924,9 +5028,6 @@
if (transaction_data.current_transcation_state == NFA_TRANS_DEFAULT
|| transaction_data.current_transcation_state == NFA_TRANS_ACTIVATED_EVT)
{
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
- nfcManagerEnableAGCDebug(connEvent);
-#endif
if(getScreenState() == NFA_SCREEN_STATE_OFF)
{
if (!sP2pActive && eventDM_Conn_data->rf_field.status == NFA_STATUS_OK)
@@ -4949,9 +5050,6 @@
case NFA_TRANS_CE_ACTIVATED:
if (transaction_data.current_transcation_state == NFA_TRANS_DEFAULT || transaction_data.current_transcation_state == NFA_TRANS_ACTIVATED_EVT)
{
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
- nfcManagerEnableAGCDebug(connEvent);
-#endif
if(getScreenState() == NFA_SCREEN_STATE_OFF)
{
if (!sP2pActive && eventDM_Conn_data->rf_field.status == NFA_STATUS_OK)
@@ -4993,7 +5091,7 @@
eventDM_Conn_data->rf_field.rf_field_status == 1)
{
#if (NFC_NXP_CHIP_TYPE == PN548C2)
- set_AGC_process_state(true);
+ nfcManagerEnableAGCDebug(connEvent);
#endif
transaction_data.current_transcation_state = NFA_TRANS_DM_RF_FIELD_EVT_ON;
ALOGD("Payment is in progress hold the screen on/off request ");
@@ -5442,7 +5540,7 @@
}
}
-
+ RoutingManager::getInstance().handleSERemovedNtf();
sCheckNfceeFlag = 0;
}
@@ -5722,6 +5820,102 @@
ALOGD ("%s: exit; status =0x%X", __FUNCTION__,status);
return status;
}
+
+
+/*******************************************************************************
+ **
+ ** Function: nfcManager_doPartialInitialize
+ **
+ ** Description: Initializes the NFC partially if it is not initialized.
+ ** This will be required for transceive during NFC off.
+ **
+ **
+ ** Returns: true/false .
+ **
+ *******************************************************************************/
+static bool nfcManager_doPartialInitialize ()
+{
+
+ ALOGD("%s enter", __FUNCTION__);
+ tNFA_STATUS stat = NFA_STATUS_OK;
+ if (sIsNfaEnabled || gsNfaPartialEnabled)
+ {
+ ALOGD ("%s: NFC already enabled", __FUNCTION__);
+ return true;
+ }
+ NfcAdaptation& theInstance = NfcAdaptation::GetInstance();
+ theInstance.MinInitialize();
+
+ tHAL_NFC_ENTRY* halFuncEntries = theInstance.GetHalEntryFuncs ();
+ ALOGD("%s: calling nfa init", __FUNCTION__);
+ if(NULL == halFuncEntries)
+ {
+ theInstance.Finalize();
+ gsNfaPartialEnabled = false;
+ return false;
+ }
+
+ NFA_SetBootMode(NFA_FAST_BOOT_MODE);
+ NFA_Init (halFuncEntries);
+ ALOGD("%s: calling enable", __FUNCTION__);
+ stat = NFA_Enable (nfaDeviceManagementCallback, nfaConnectionCallback);
+ if (stat == NFA_STATUS_OK)
+ {
+ SyncEventGuard guard (sNfaEnableEvent);
+ sNfaEnableEvent.wait(); //wait for NFA command to finish
+ }
+
+ if (sIsNfaEnabled)
+ {
+ gsNfaPartialEnabled = true;
+ sIsNfaEnabled = false;
+ }
+ else
+ {
+ NFA_Disable (FALSE /* ungraceful */);
+ theInstance.Finalize();
+ gsNfaPartialEnabled = false;
+ }
+
+ ALOGD("%s exit status = 0x%x", __FUNCTION__ ,gsNfaPartialEnabled);
+ return gsNfaPartialEnabled;
+}
+/*******************************************************************************
+ **
+ ** Function: nfcManager_doPartialDeInitialize
+ **
+ ** Description: DeInitializes the NFC partially if it is partially initialized.
+ **
+ ** Returns: true/false .
+ **
+ *******************************************************************************/
+static bool nfcManager_doPartialDeInitialize()
+{
+ tNFA_STATUS stat = NFA_STATUS_OK;
+ if(!gsNfaPartialEnabled)
+ {
+ ALOGD ("%s: cannot deinitialize NFC , not partially initilaized", __FUNCTION__);
+ return true;
+ }
+ ALOGD ("%s:enter", __FUNCTION__);
+ stat = NFA_Disable (TRUE /* graceful */);
+ if (stat == NFA_STATUS_OK)
+ {
+ ALOGD ("%s: wait for completion", __FUNCTION__);
+ SyncEventGuard guard (sNfaDisableEvent);
+ sNfaDisableEvent.wait (); //wait for NFA command to finish
+ }
+ else
+ {
+ ALOGE ("%s: fail disable; error=0x%X", __FUNCTION__, stat);
+ }
+ NfcAdaptation& theInstance = NfcAdaptation::GetInstance();
+ theInstance.Finalize();
+ NFA_SetBootMode(NFA_NORMAL_BOOT_MODE);
+ gsNfaPartialEnabled = false;
+ return true;
+}
+
/**********************************************************************************
**
** Function: nfcManager_getFwVersion
@@ -5847,28 +6041,21 @@
ALOGD ("%s AGCDebug not enabled", __FUNCTION__);
return;
}
- switch(connEvent)
+ if(connEvent == NFA_TRANS_DM_RF_FIELD_EVT &&
+ menableAGC_debug_t.AGCdebugstarted == false)
{
- case NFA_ACTIVATED_EVT:
- case NFA_EE_ACTION_EVT:
- case NFA_TRANS_CE_ACTIVATED:
- if(menableAGC_debug_t.AGCdebugstarted == false)
- {
- pthread_t agcThread;
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- retvalue = pthread_create(&agcThread, &attr, enableAGCThread, NULL);
- pthread_attr_destroy(&attr);
- if(retvalue == 0)
- {
- menableAGC_debug_t.AGCdebugstarted = true;
- set_AGC_process_state(true);
- }
- }
- break;
+ pthread_t agcThread;
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ retvalue = pthread_create(&agcThread, &attr, enableAGCThread, NULL);
+ pthread_attr_destroy(&attr);
+ if(retvalue == 0)
+ {
+ menableAGC_debug_t.AGCdebugstarted = true;
+ set_AGC_process_state(true);
+ }
}
-
}
void *enableAGCThread(void *arg)
diff --git a/nci/jni/NativeNfcTag.cpp b/nci/jni/NativeNfcTag.cpp
index cdbf4a6..4771ac9 100644
--- a/nci/jni/NativeNfcTag.cpp
+++ b/nci/jni/NativeNfcTag.cpp
@@ -873,13 +873,13 @@
goto TheEnd;
}
#if(NXP_EXTNS == TRUE)
+ sCurrentConnectedHandle = targetHandle;
if(natTag.mTechLibNfcTypes[i] == NFC_PROTOCOL_T3BT)
{
goto TheEnd;
}
#endif
sCurrentConnectedTargetType = natTag.mTechList[i];
- sCurrentConnectedHandle = targetHandle;
if (natTag.mTechLibNfcTypes[i] != NFC_PROTOCOL_ISO_DEP)
{
ALOGD ("%s() Nfc type = %d, do nothing for non ISO_DEP", __FUNCTION__, natTag.mTechLibNfcTypes[i]);
@@ -945,7 +945,9 @@
tNFA_STATUS status;
int rVal = 1;
-
+#if(NFC_NXP_NON_STD_CARD == TRUE)
+ unsigned char retry_cnt = 1;
+#endif
do
{
//if tag has shutdown, abort this method
@@ -955,7 +957,10 @@
rVal = STATUS_CODE_TARGET_LOST;
break;
}
-
+#if(NFC_NXP_NON_STD_CARD == TRUE)
+ if(!retry_cnt && (natTag.mTechLibNfcTypes[handle] != NFA_PROTOCOL_MIFARE))
+ NfcTag::getInstance ().mCashbeeDetected = true;
+#endif
{
SyncEventGuard g (sReconnectEvent);
gIsTagDeactivating = true;
@@ -1024,7 +1029,13 @@
{
ALOGD ("%s: tag is not in sleep", __FUNCTION__);
rVal = STATUS_CODE_TARGET_LOST;
- break;
+#if(NFC_NXP_NON_STD_CARD == TRUE)
+ if(!retry_cnt)
+#endif
+ break;
+#if(NFC_NXP_NON_STD_CARD == TRUE)
+ else continue;
+#endif
}
}
else
@@ -1065,10 +1076,19 @@
if (sReconnectEvent.wait (1000) == false) //if timeout occured
{
ALOGE ("%s: timeout waiting for select", __FUNCTION__);
- status = NFA_Deactivate (FALSE);
- if (status != NFA_STATUS_OK)
- ALOGE ("%s: deactivate failed; error=0x%X", __FUNCTION__, status);
+#if(NXP_EXTNS == TRUE)
+ if (!(NfcTag::getInstance ().isCashBeeActivated() == true || NfcTag::getInstance ().isEzLinkTagActivated() == true
+ #if(NFC_NXP_NON_STD_CARD == TRUE)
+ || sNonNciCard_t.chinaTransp_Card == true
+ #endif
+ ))
+ {
+ status = NFA_Deactivate (FALSE);
+ if (status != NFA_STATUS_OK)
+ ALOGE ("%s: deactivate failed; error=0x%X", __FUNCTION__, status);
+ }
break;
+#endif
}
}
@@ -1077,23 +1097,39 @@
{
ALOGD("%s: tag is not active", __FUNCTION__);
rVal = STATUS_CODE_TARGET_LOST;
+#if(NFC_NXP_NON_STD_CARD == TRUE)
+ if(!retry_cnt)
+#endif
break;
}
if(NfcTag::getInstance ().isEzLinkTagActivated() == true)
{
NfcTag::getInstance ().mEzLinkTypeTag = false;
}
+#if(NFC_NXP_NON_STD_CARD == TRUE)
+ if(NfcTag::getInstance ().isCashBeeActivated() == true)
+ {
+ NfcTag::getInstance ().mCashbeeDetected = false;
+ }
+#endif
if (sConnectOk)
{
rVal = 0; // success
sCurrentRfInterface = rfInterface;
+#if(NFC_NXP_NON_STD_CARD == TRUE)
+ break;
+#endif
}
else
{
rVal = 1;
}
- } while (0);
-
+ }
+#if(NFC_NXP_NON_STD_CARD == TRUE)
+ while (retry_cnt--);
+#else
+ while(0);
+#endif
setReconnectState(false);
NFA_SetReconnectState(FALSE);
sConnectWaitingForComplete = JNI_FALSE;
@@ -1943,29 +1979,6 @@
{
sSwitchBackTimer.kill ();
}
-
- // Special case for Kovio. The deactivation would have already occurred
- // but was ignored so that normal tag opertions could complete. Now we
- // want to process as if the deactivate just happened.
- if (NfcTag::getInstance ().mTechList [handle] == TARGET_TYPE_KOVIO_BARCODE)
- {
- ALOGD ("%s: Kovio, force deactivate handling", __FUNCTION__);
- tNFA_DEACTIVATED deactivated = {NFA_DEACTIVATE_TYPE_IDLE};
- {
- SyncEventGuard g (gDeactivatedEvent);
- gActivated = false; //guard this variable from multi-threaded access
- gDeactivatedEvent.notifyOne ();
- }
-
- NfcTag::getInstance().setDeactivationState (deactivated);
- nativeNfcTag_resetPresenceCheck();
- NfcTag::getInstance().connectionEventHandler (NFA_DEACTIVATED_EVT, NULL);
- nativeNfcTag_abortWaits();
- NfcTag::getInstance().abort ();
-
- return JNI_FALSE;
- }
-
if (nfcManager_isNfcActive() == false)
{
ALOGD ("%s: NFC is no longer active.", __FUNCTION__);
@@ -1986,6 +1999,39 @@
return JNI_FALSE;
}
+ /*Presence check for Kovio - RF Deactive command with type Discovery*/
+ ALOGD ("%s: handle=%d", __FUNCTION__, handle);
+ if (NfcTag::getInstance ().mTechList [handle] == TARGET_TYPE_KOVIO_BARCODE)
+ {
+ SyncEventGuard guard (sPresenceCheckEvent);
+ status = NFA_RwPresenceCheck (NfcTag::getInstance().getPresenceCheckAlgorithm());
+ if (status == NFA_STATUS_OK)
+ {
+ sPresenceCheckEvent.wait ();
+ isPresent = sIsTagPresent ? JNI_TRUE : JNI_FALSE;
+ }
+ if (isPresent == JNI_FALSE)
+ ALOGD ("%s: tag absent", __FUNCTION__);
+ return isPresent;
+#if 0
+ ALOGD ("%s: Kovio, force deactivate handling", __FUNCTION__);
+ tNFA_DEACTIVATED deactivated = {NFA_DEACTIVATE_TYPE_IDLE};
+ {
+ SyncEventGuard g (gDeactivatedEvent);
+ gActivated = false; //guard this variable from multi-threaded access
+ gDeactivatedEvent.notifyOne ();
+ }
+
+ NfcTag::getInstance().setDeactivationState (deactivated);
+ nativeNfcTag_resetPresenceCheck();
+ NfcTag::getInstance().connectionEventHandler (NFA_DEACTIVATED_EVT, NULL);
+ nativeNfcTag_abortWaits();
+ NfcTag::getInstance().abort ();
+
+ return JNI_FALSE;
+#endif
+ }
+
/*
* This fix is made because NFA_RwPresenceCheck cmd is not woking for ISO-DEP in CEFH mode
* Hence used the Properitary presence check cmd
@@ -2113,7 +2159,7 @@
**
** Description: Can tag be formatted to store NDEF message?
** e: JVM environment.
-** o: Java object.�
+** o: Java object.
** libNfcType: Type of tag.
** uidBytes: Tag's unique ID.
** pollBytes: Data from activation.
@@ -2275,7 +2321,7 @@
sem_init (&sFormatSem, 0, 0);
- status |= nativeNfcTag_doReconnect (e, o);
+ status = nativeNfcTag_doReconnect (e, o);
ALOGD ("Format with Second Key");
status |= EXTNS_MfcFormatTag(key2,sizeof(key2));
if (status == NFA_STATUS_OK)
diff --git a/nci/jni/NativeNxpFeature.cpp b/nci/jni/NativeNxpFeature.cpp
index e7615f9..8213663 100644
--- a/nci/jni/NativeNxpFeature.cpp
+++ b/nci/jni/NativeNxpFeature.cpp
@@ -484,17 +484,17 @@
** Returns: success/failure
**
*******************************************************************************/
-tNFA_STATUS SetVenConfigValue(jint venconfig)
+tNFA_STATUS SetVenConfigValue(jint nfcMode)
{
tNFA_STATUS status = NFA_STATUS_FAILED;
uint8_t cmd_buf[] = {0x20, 0x02, 0x05, 0x01, 0xA0, 0x07, 0x01, 0x03};
ALOGD("%s: enter", __FUNCTION__);
- if(venconfig == VEN_CFG_NFC_OFF_POWER_OFF)
+ if(nfcMode == NFC_MODE_OFF)
{
ALOGD("Setting the VEN_CFG to 2, Disable ESE events");
cmd_buf[7] = 0x02;
}
- else if(venconfig == VEN_CFG_NFC_ON_POWER_ON)
+ else if(nfcMode == NFC_MODE_ON)
{
ALOGD("Setting the VEN_CFG to 3, Make ");
cmd_buf[7] = 0x03;
diff --git a/nci/jni/NativeSecureElement.cpp b/nci/jni/NativeSecureElement.cpp
index 7796f17..6664995 100644
--- a/nci/jni/NativeSecureElement.cpp
+++ b/nci/jni/NativeSecureElement.cpp
@@ -37,6 +37,7 @@
#include "JavaClassConstants.h"
#include "PowerSwitch.h"
#include "NfcTag.h"
+#include "RoutingManager.h"
#include <ScopedPrimitiveArray.h>
extern bool hold_the_transceive;
@@ -71,7 +72,7 @@
static const int EE_ERROR_LISTEN_MODE = -4;
static const int EE_ERROR_EXT_FIELD = -5;
static const int EE_ERROR_NFC_DISABLED = -6;
-
+static bool is_wired_mode_open = false;
/*******************************************************************************
**
** Function: nativeNfcSecureElement_doOpenSecureElementConnection
@@ -88,7 +89,7 @@
ALOGD("%s: enter", __FUNCTION__);
bool stat = false;
jint secElemHandle = EE_ERROR_INIT;
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
long ret_val = -1;
NFCSTATUS status = NFCSTATUS_FAILED;
p61_access_state_t p61_current_state = P61_STATE_INVALID;
@@ -99,6 +100,11 @@
goto TheEnd;
}
#if (NFC_NXP_ESE == TRUE && NFC_NXP_CHIP_TYPE != PN547C2)
+ if((RoutingManager::getInstance().is_ee_recovery_ongoing()))
+ {
+ ALOGD ("ee recovery ongoing!!!");
+ goto TheEnd;
+ }
stat = se.isWiredModeAllowedInRfState();
if(stat == false)
{
@@ -120,7 +126,7 @@
}
#endif
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
ret_val = NFC_GetP61Status ((void *)&p61_current_state);
if (ret_val < 0)
{
@@ -157,6 +163,7 @@
}
else
{
+ is_wired_mode_open = true;
ALOGD("SE Access granted");
}
}
@@ -199,10 +206,6 @@
if (stat)
{
- se.SecEle_Modeset(0x00);
- usleep(10*1000);
- se.SecEle_Modeset(0x01);
- usleep(10*1000);
//establish a pipe to sec elem
stat = se.connectEE();
if (stat)
@@ -244,7 +247,7 @@
{
ALOGD("%s: enter; handle=0x%04x", __FUNCTION__, handle);
bool stat = false;
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
long ret_val = -1;
NFCSTATUS status = NFCSTATUS_FAILED;
#endif
@@ -278,7 +281,7 @@
//if controller is not routing AND there is no pipe connected,
//then turn off the sec elem
-#if(NFC_NXP_ESE == TRUE && NFC_NXP_CHIP_TYPE != PN547C2)
+#if(NFC_NXP_ESE == TRUE)
//Do Nothing
#else
if (! SecureElement::getInstance().isBusy())
@@ -287,7 +290,7 @@
//if nothing is active after this, then tell the controller to power down
if (! PowerSwitch::getInstance ().setModeOff (PowerSwitch::SE_CONNECTED))
PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER);
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
ret_val = NFC_RelWiredAccess ((void *)&status);
if (ret_val < 0)
{
@@ -301,16 +304,40 @@
ALOGD("Denying SE close due to SE is not being released by Pn54x driver");
stat = false;
}
+ is_wired_mode_open = false;
}
#endif
TheEnd:
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
ALOGD("%s: exit stat = %d", __FUNCTION__, stat);
#else
ALOGD("%s: exit", __FUNCTION__);
#endif
return stat ? JNI_TRUE : JNI_FALSE;
}
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+static int checkP61Status(void)
+{
+ jint ret_val = -1;
+ p61_access_state_t p61_current_state = P61_STATE_INVALID;
+ ret_val = NFC_GetP61Status ((void *)&p61_current_state);
+ if (ret_val < 0)
+ {
+ ALOGD("NFC_GetP61Status failed");
+ return -1;
+ }
+ if(p61_current_state & (P61_STATE_SPI)||(p61_current_state & (P61_STATE_SPI_PRIO)))
+ {
+ ALOGD("No gpio change");
+ ret_val = 0;
+ }
+ else
+ {
+ ret_val = -1;
+ }
+ return ret_val;
+}
+#endif
/*******************************************************************************
**
** Function: nativeNfcSecureElement_doResetSecureElement
@@ -329,10 +356,24 @@
#if (NFC_NXP_ESE == TRUE)
SecureElement &se = SecureElement::getInstance();
ALOGD("%s: enter; handle=0x%04x", __FUNCTION__, handle);
+ if(!is_wired_mode_open)
+ {
+ ALOGD("wired mode is not open");
+ return stat;
+ }
stat = se.SecEle_Modeset(0x00);
+ if (handle == 0x4C0)
+ {
+ if(checkP61Status())
+ se.NfccStandByOperation(STANDBY_GPIO_LOW);
+ }
usleep(100 * 1000);
-
+ if (handle == 0x4C0)
+ {
+ if(checkP61Status() && (is_wired_mode_open == true))
+ se.NfccStandByOperation(STANDBY_GPIO_HIGH);
+ }
stat = se.SecEle_Modeset(0x01);
usleep(2000 * 1000);
@@ -396,17 +437,22 @@
INT32 recvBufferActualSize = 0;
ScopedByteArrayRW bytes(e, data);
+#if(NXP_EXTNS == TRUE)
ALOGD("%s: enter; handle=0x%X; buf len=%zu", __FUNCTION__, handle, bytes.size());
SecureElement::getInstance().transceive(reinterpret_cast<UINT8*>(&bytes[0]), bytes.size(), recvBuffer, recvBufferMaxSize, recvBufferActualSize, gGeneralTransceiveTimeout);
- //copy results back to java
- jbyteArray result = e->NewByteArray(recvBufferActualSize);
- if (result != NULL)
- {
- e->SetByteArrayRegion(result, 0, recvBufferActualSize, (jbyte *) recvBuffer);
- }
- ALOGD("%s: exit: recv len=%ld", __FUNCTION__, recvBufferActualSize);
- return result;
+ //copy results back to java
+ jbyteArray result = e->NewByteArray(recvBufferActualSize);
+ if (result != NULL)
+ {
+ e->SetByteArrayRegion(result, 0, recvBufferActualSize, (jbyte *) recvBuffer);
+ }
+ ALOGD("%s: exit: recv len=%ld", __FUNCTION__, recvBufferActualSize);
+ return result;
+#else
+ jbyteArray result = e->NewByteArray(0);
+ return result;
+#endif
}
/*****************************************************************************
diff --git a/nci/jni/NfcJniUtil.h b/nci/jni/NfcJniUtil.h
index a7421eb..ad370db 100644
--- a/nci/jni/NfcJniUtil.h
+++ b/nci/jni/NfcJniUtil.h
@@ -93,6 +93,8 @@
#if(NXP_EXTNS == TRUE)
#define VEN_POWER_STATE_ON 6
#define VEN_POWER_STATE_OFF 7
+// ESE Suppored Technologies
+#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
@@ -110,14 +112,8 @@
#define TARGET_TYPE_ISO14443_4B 12
/* Setting VEN_CFG */
-#define VEN_CFG_NFC_ON_POWER_ON 3
-#define VEN_CFG_NFC_OFF_POWER_OFF 2
-
-#if(NXP_EXTNS == TRUE)
-// ESE Suppored Technologies
-#define TARGET_TYPE_ISO14443_3A_3B 11
-#endif
-
+#define NFC_MODE_ON 3
+#define NFC_MODE_OFF 2
//define a few NXP error codes that NFC service expects;
//see external/libnfc-nxp/src/phLibNfcStatus.h;
diff --git a/nci/jni/NfcTag.cpp b/nci/jni/NfcTag.cpp
index 1c02acd..acfa464 100644
--- a/nci/jni/NfcTag.cpp
+++ b/nci/jni/NfcTag.cpp
@@ -41,18 +41,20 @@
#include "config.h"
#include <ScopedLocalRef.h>
#include <ScopedPrimitiveArray.h>
-
+#include "IntervalTimer.h"
extern "C"
{
#include "rw_int.h"
#include "phNxpExtns.h"
}
-
+#if(NXP_EXTNS == TRUE)
static void deleteglobaldata(JNIEnv* e);
+static void selectCompleteCallBack(union sigval);
static jobjectArray techActBytes1;
int selectedId = 0;
static jobjectArray techPollBytes2;
-
+IntervalTimer gSelectCompleteTimer;
+#endif
/*******************************************************************************
**
** Function: NfcTag
@@ -81,6 +83,9 @@
mIsFelicaLite(false),
mCashbeeDetected(false),
mEzLinkTypeTag(false)
+#if(NXP_EXTNS == TRUE)
+ ,mWaitingForSelect(false)
+#endif
{
memset (mTechList, 0, sizeof(mTechList));
memset (mTechHandles, 0, sizeof(mTechHandles));
@@ -1380,6 +1385,14 @@
tNFA_STATUS stat = NFA_Select (rfDiscoveryId, NFA_PROTOCOL_NFC_DEP, NFA_INTERFACE_NFC_DEP);
if (stat != NFA_STATUS_OK)
ALOGE ("%s: fail select P2P; error=0x%X", fn, stat);
+#if(NXP_EXTNS == TRUE)
+ else
+ {
+ mWaitingForSelect = true;
+ ALOGE ("%s: starting timer", fn);
+ gSelectCompleteTimer.set(1000, selectCompleteCallBack);
+ }
+#endif
}
else
ALOGE ("%s: cannot find P2P", fn);
@@ -1409,6 +1422,9 @@
mIsDynamicTagId = false;
mIsFelicaLite = false;
resetAllTransceiveTimeouts ();
+#if(NXP_EXTNS == TRUE)
+ mNumDiscNtf = 0;
+#endif
}
@@ -1457,6 +1473,14 @@
tNFA_STATUS stat = NFA_Select (mTechHandles [foundIdx], mTechLibNfcTypes [foundIdx], rf_intf);
if (stat != NFA_STATUS_OK)
ALOGE ("%s: fail select; error=0x%X", fn, stat);
+#if(NXP_EXTNS == TRUE)
+ else
+ {
+ mWaitingForSelect = true;
+ gSelectCompleteTimer.set(1000, selectCompleteCallBack);
+ ALOGE ("%s:starting timer", fn);
+ }
+#endif
}
else
ALOGE ("%s: only found NFC-DEP technology.", fn);
@@ -1538,6 +1562,13 @@
if (stat == NFA_STATUS_OK)
{
ALOGE ("%s: stat=%x; wait for activated ntf", fn, stat);
+#if(NXP_EXTNS == TRUE)
+ {
+ mWaitingForSelect = true;
+ ALOGE ("%s:starting timer", fn);
+ gSelectCompleteTimer.set(1000, selectCompleteCallBack);
+ }
+#endif
}
else
ALOGE ("%s: fail select; error=0x%X", fn, stat);
@@ -2068,3 +2099,44 @@
*len = 0;
*uid = NULL;
}
+#if(NXP_EXTNS == TRUE)
+/*******************************************************************************
+**
+** Function: selectCompleteStatus
+**
+** Description: Notify whether tag select is success/failure
+**
+** Returns: None
+**
+*******************************************************************************/
+void NfcTag::selectCompleteStatus(bool status)
+{
+
+ if(mWaitingForSelect == true)
+ {
+ ALOGD ("selectCompleteStatus=%u", status);
+ gSelectCompleteTimer.kill();
+ mWaitingForSelect = false;
+ }
+}
+
+/*******************************************************************************
+**
+** Function: selectCompleteCallBack
+**
+** Description: CallBack called when tag select is timed out.
+**
+** Returns: None
+**
+*******************************************************************************/
+void selectCompleteCallBack(union sigval)
+{
+
+ if(NfcTag::getInstance().mWaitingForSelect == true)
+ {
+ ALOGD ("selectCompleteCallBack");
+ NfcTag::getInstance().mWaitingForSelect = false;
+ NFA_Deactivate (FALSE);
+ }
+}
+#endif
diff --git a/nci/jni/NfcTag.h b/nci/jni/NfcTag.h
index 9a7d22d..baf7e66 100644
--- a/nci/jni/NfcTag.h
+++ b/nci/jni/NfcTag.h
@@ -66,6 +66,9 @@
bool mCashbeeDetected;
bool mEzLinkTypeTag;
activationParams_t mActivationParams_t;
+#if(NXP_EXTNS == TRUE)
+ bool mWaitingForSelect;
+#endif
/*******************************************************************************
**
** Function: NfcTag
@@ -485,7 +488,18 @@
**
*******************************************************************************/
void storeActivationParams();
-
+#if(NXP_EXTNS == TRUE)
+ /*******************************************************************************
+ **
+ ** Function: selectCompleteStatus
+ **
+ ** Description: Notify whether tag select is success/failure
+ **
+ ** Returns: None
+ **
+ *******************************************************************************/
+ void selectCompleteStatus(bool status);
+#endif
private:
std::vector<int> mTechnologyTimeoutsTable;
std::vector<int> mTechnologyDefaultTimeoutsTable;
@@ -673,4 +687,5 @@
**
*******************************************************************************/
void calculateT1tMaxMessageSize (tNFA_ACTIVATED& activate);
+
};
diff --git a/nci/jni/PeerToPeer.cpp b/nci/jni/PeerToPeer.cpp
index fe8dd39..2b0a217 100644
--- a/nci/jni/PeerToPeer.cpp
+++ b/nci/jni/PeerToPeer.cpp
@@ -538,7 +538,7 @@
* conditional check is added to avoid multiple dicovery cmds
* at the time of NFC OFF in progress
*/
- if((gGeneralPowershutDown != VEN_CFG_NFC_OFF_POWER_OFF) && isDiscStopped == true)
+ if((gGeneralPowershutDown != NFC_MODE_OFF) && isDiscStopped == true)
{
startRfDiscovery(true);
}
diff --git a/nci/jni/Pn544Interop.cpp b/nci/jni/Pn544Interop.cpp
index 2699885..bb589d9 100644
--- a/nci/jni/Pn544Interop.cpp
+++ b/nci/jni/Pn544Interop.cpp
@@ -29,6 +29,8 @@
namespace android
{
extern void startStopPolling (bool isStartPolling);
+ extern void releaseRfInterfaceMutexLock();
+ extern void acquireRfInterfaceMutexLock();
}
@@ -84,6 +86,7 @@
void pn544InteropStartPolling (union sigval)
{
ALOGD ("%s: enter", __FUNCTION__);
+ android::acquireRfInterfaceMutexLock();
gMutex.lock ();
NfcTag::ActivationState state = NfcTag::getInstance ().getActivationState ();
@@ -108,6 +111,7 @@
TheEnd:
gMutex.unlock ();
+ android::releaseRfInterfaceMutexLock();
ALOGD ("%s: exit", __FUNCTION__);
}
diff --git a/nci/jni/RouteDataSet.cpp b/nci/jni/RouteDataSet.cpp
index 6b73ed8..d677397 100644
--- a/nci/jni/RouteDataSet.cpp
+++ b/nci/jni/RouteDataSet.cpp
@@ -42,7 +42,7 @@
#include <errno.h>
#include <sys/stat.h>
-extern char bcm_nfc_location_jni[];
+extern char bcm_nfc_location[];
/*******************************************************************************
@@ -273,7 +273,7 @@
FILE* fh = NULL;
size_t actualWritten = 0;
bool retval = false;
- std::string filename (bcm_nfc_location_jni);
+ std::string filename (bcm_nfc_location);
int stat = 0;
filename.append (sConfigFile);
@@ -316,7 +316,7 @@
FILE* fh = NULL;
size_t actual = 0;
char buffer [1024];
- std::string filename (bcm_nfc_location_jni);
+ std::string filename (bcm_nfc_location);
filename.append (sConfigFile);
fh = fopen (filename.c_str (), "r");
@@ -496,7 +496,7 @@
bool RouteDataSet::deleteFile ()
{
static const char fn [] = "RouteDataSet::deleteFile";
- std::string filename (bcm_nfc_location_jni);
+ std::string filename (bcm_nfc_location);
filename.append (sConfigFile);
int stat = remove (filename.c_str());
ALOGD ("%s: exit %u", fn, stat==0);
diff --git a/nci/jni/RoutingManager.cpp b/nci/jni/RoutingManager.cpp
index 5b648d8..5379631 100644
--- a/nci/jni/RoutingManager.cpp
+++ b/nci/jni/RoutingManager.cpp
@@ -49,10 +49,7 @@
#include "nfc_api.h"
#include "nfa_api.h"
}
-#endif
-extern bool sHCEEnabled;
-#if (NXP_EXTNS == TRUE)
extern INT32 gSeDiscoverycount;
extern SyncEvent gNfceeDiscCbEvent;
extern INT32 gActualSeCount;
@@ -61,6 +58,7 @@
int gEseVirtualWiredProtectMask = 0;
int gWiredModeRfFieldEnable = 0;
#endif
+extern bool sHCEEnabled;
const JNINativeMethod RoutingManager::sMethods [] =
{
@@ -85,6 +83,7 @@
extern void checkforTranscation(UINT8 connEvent, void* eventData );
#if (NXP_EXTNS == TRUE)
extern UINT16 sRoutingBuffLen;
+ extern bool isNfcInitializationDone();
extern void startRfDiscovery (bool isStart);
extern bool isDiscoveryStarted();
extern int getScreenState();
@@ -564,7 +563,7 @@
tNFA_STATUS nfaStat;
static const char fn [] = "RoutingManager::setDefaultRoute"; /*commented to eliminate unused variable warning*/
- unsigned long uiccListenTech = 0;
+ 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;
@@ -582,18 +581,18 @@
uiccListenTech = NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B;
ALOGD ("%s: enter, defaultRoute:%x protoRoute:0x%x TechRoute:0x%x ", fn, defaultRoute, protoRoute, techRoute);
- defaultSeID = (((defaultRoute & 0x18) >> 3) == 0x00) ? 0x400 : ((((defaultRoute & 0x18)>>3 )== 0x01 ) ? 0x4C0 : 0x402);
- defaultPowerstate=defaultRoute & 0x07;
+ defaultSeID = (((defaultRoute & 0x60) >> 5) == 0x00) ? 0x400 : ((((defaultRoute & 0x60)>>5 )== 0x01 ) ? 0x4C0 : 0x402);
+ defaultPowerstate=defaultRoute & 0x1F;
ALOGD ("%s: enter, defaultSeID:%x defaultPowerstate:0x%x", fn, defaultSeID,defaultPowerstate);
- defaultProtoSeID = (((protoRoute & 0x18) >> 3) == 0x00) ? 0x400 : ((((protoRoute & 0x18)>>3 )== 0x01 ) ? 0x4C0 : 0x402);
- defaultProtoPowerstate = protoRoute & 0x07;
+ defaultProtoSeID = (((protoRoute & 0x60) >> 5) == 0x00) ? 0x400 : ((((protoRoute & 0x60)>>5 )== 0x01 ) ? 0x4C0 : 0x402);
+ defaultProtoPowerstate = protoRoute & 0x1F;
ALOGD ("%s: enter, defaultProtoSeID:%x defaultProtoPowerstate:0x%x", fn, defaultProtoSeID,defaultProtoPowerstate);
- defaultTechSeID = (((techRoute & 0x18) >> 3) == 0x00) ? 0x400 : ((((techRoute & 0x18)>>3 )== 0x01 ) ? 0x4C0 : 0x402);
- defaultTechAPowerstate = techRoute & 0x07;
- DefaultTechType = (techRoute & 0x20) >> 5;
+ 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);
@@ -604,6 +603,16 @@
if (nfaStat != NFA_STATUS_OK)
ALOGE("Failed to register wildcard AID for DH");
}
+
+ if (GetNxpNumValue(NAME_CHECK_DEFAULT_PROTO_SE_ID, &check_default_proto_se_id_req, sizeof(check_default_proto_se_id_req)))
+ {
+ ALOGE("%s : CHECK_DEFAULT_PROTO_SE_ID - 0x%02x ",fn,check_default_proto_se_id_req);
+ }
+ else
+ {
+ ALOGE("%s : CHECK_DEFAULT_PROTO_SE_ID not defined. Taking default value - 0x%02x ",fn,check_default_proto_se_id_req);
+ }
+ if(check_default_proto_se_id_req == 0x01)
{
UINT8 count,seId=0;
tNFA_HANDLE ee_handleList[SecureElement::MAX_NUM_EE];
@@ -611,40 +620,41 @@
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;
- }
- }
+ 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;
- }
+ 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;
+ }
}
- }
- if(!isDefaultProtoSeIDPresent)
- {
- defaultProtoSeID = 0x400;
- defaultProtoPowerstate = 0x01;
+
+ if(!isDefaultProtoSeIDPresent)
+ {
+ defaultProtoSeID = 0x400;
+ defaultProtoPowerstate = 0x01;
+ }
+ ALOGD ("%s: enter, isDefaultProtoSeIDPresent:%x", fn, isDefaultProtoSeIDPresent);
}
- ALOGD ("%s: enter, isDefaultProtoSeIDPresent:%x", fn, isDefaultProtoSeIDPresent);
if( defaultProtoSeID == defaultSeID)
{
- unsigned int default_proto_power_mask[3] = {0,};
- for(int pCount=0 ; pCount< 3 ;pCount++)
+ unsigned int default_proto_power_mask[5] = {0,};
+ for(int pCount=0 ; pCount< 5 ;pCount++)
{
if((defaultPowerstate >> pCount)&0x01)
{
@@ -674,8 +684,8 @@
default_proto_power_mask[0],
default_proto_power_mask[1],
default_proto_power_mask[2],
- NFC_PROTOCOL_MASK_ISO7816|NFA_PROTOCOL_MASK_ISO_DEP,
- NFC_PROTOCOL_MASK_ISO7816|NFA_PROTOCOL_MASK_ISO_DEP);
+ default_proto_power_mask[3],
+ default_proto_power_mask[4]);
}
else
{
@@ -715,8 +725,8 @@
(defaultPowerstate & 01) ? (NFC_PROTOCOL_MASK_ISO7816 | t3t_protocol_mask) :0,
(defaultPowerstate & 02) ? (NFC_PROTOCOL_MASK_ISO7816) :0,
(defaultPowerstate & 04) ? (NFC_PROTOCOL_MASK_ISO7816) :0,
- NFC_PROTOCOL_MASK_ISO7816 ,
- NFC_PROTOCOL_MASK_ISO7816 );
+ (defaultPowerstate & 0x08) ? NFC_PROTOCOL_MASK_ISO7816 :0,
+ (defaultPowerstate & 0x10) ? NFC_PROTOCOL_MASK_ISO7816 :0);
}else
{
nfaStat = NFA_EeSetDefaultProtoRouting(defaultSeID ,
@@ -754,8 +764,8 @@
(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,
- NFA_PROTOCOL_MASK_ISO_DEP,
- NFA_PROTOCOL_MASK_ISO_DEP );
+ (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,
@@ -811,13 +821,13 @@
unsigned long max_tech_mask = 0x03;
max_tech_mask = SecureElement::getInstance().getSETechnology(defaultTechSeID);
ALOGD ("%s: enter,max_tech_mask :%x", fn, max_tech_mask);
- unsigned int default_tech_power_mask[3]={0,};
- unsigned int defaultTechFPowerstate=0x07;
+ unsigned int default_tech_power_mask[5]={0,};
+ unsigned int defaultTechFPowerstate=0x1F;
ALOGD ("%s: enter, defaultTechSeID:%x", fn, defaultTechSeID);
if(defaultTechSeID == 0x402)
{
- for(int pCount=0 ; pCount< 3 ;pCount++)
+ for(int pCount=0 ; pCount< 5 ;pCount++)
{
if((defaultTechAPowerstate >> pCount)&0x01)
{
@@ -884,8 +894,8 @@
(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 & (NFA_TECHNOLOGY_MASK_A| NFA_TECHNOLOGY_MASK_B| NFA_TECHNOLOGY_MASK_F)),
- (max_tech_mask & (NFA_TECHNOLOGY_MASK_A| NFA_TECHNOLOGY_MASK_B| NFA_TECHNOLOGY_MASK_F)));
+ (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]),
@@ -911,8 +921,8 @@
(defaultTechAPowerstate& 01) ? (max_tech_mask & DefaultTechType): 0,
(defaultTechAPowerstate & 02) ? (max_tech_mask & DefaultTechType) :0,
(defaultTechAPowerstate & 04) ? (max_tech_mask & DefaultTechType) :0,
- (max_tech_mask & DefaultTechType),
- (max_tech_mask & DefaultTechType));
+ (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,
@@ -933,8 +943,8 @@
(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,
- (max_tech_mask & NFA_TECHNOLOGY_MASK_F),
- (max_tech_mask & NFA_TECHNOLOGY_MASK_F));
+ (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,
@@ -1929,12 +1939,7 @@
&& (eeInfo[xx].ee_status == NFA_EE_STATUS_ACTIVE))
{
ALOGD ("%s: Handle: 0x%04x Change Status Active to Inactive", fn, eeInfo[xx].ee_handle);
- SyncEventGuard guard (mEeSetModeEvent);
- if ((nfaStat = NFA_EeModeSet (eeInfo[xx].ee_handle, NFA_EE_MD_DEACTIVATE)) == NFA_STATUS_OK)
- {
- mEeSetModeEvent.wait (); //wait for NFA_EE_MODE_SET_EVT
- }
- else
+ if ((nfaStat = SecureElement::getInstance().SecElem_EeModeSet (eeInfo[xx].ee_handle, NFA_EE_MD_DEACTIVATE)) != NFA_STATUS_OK)
{
ALOGE ("Failed to set EE inactive");
}
@@ -2285,20 +2290,22 @@
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(mChipId == 0x02 || mChipId == 0x04)
+ if(android::isNfcInitializationDone() == true)
{
- for(int xx = 0; xx < num_ee; xx++)
+ if(mChipId == 0x02 || mChipId == 0x04)
{
- ALOGE("xx=%d, ee_handle=0x0%x, status=0x0%x", xx, ee_disc_info.ee_info[xx].ee_handle,ee_disc_info.ee_info[xx].ee_status);
- if ((ee_disc_info.ee_info[xx].ee_handle == 0x4C0) &&
- (ee_disc_info.ee_info[xx].ee_status == 0x02))
+ for(int xx = 0; xx < num_ee; xx++)
{
+ ALOGE("xx=%d, ee_handle=0x0%x, status=0x0%x", xx, ee_disc_info.ee_info[xx].ee_handle,ee_disc_info.ee_info[xx].ee_status);
+ if ((ee_disc_info.ee_info[xx].ee_handle == 0x4C0) &&
+ (ee_disc_info.ee_info[xx].ee_status == 0x02))
+ {
#if(NXP_EXTNS == TRUE)
- recovery=TRUE;
+ recovery=TRUE;
#endif
- routingManager.ee_removed_disc_ntf_handler(ee_disc_info.ee_info[xx].ee_handle, ee_disc_info.ee_info[xx].ee_status);
- break;
+ routingManager.ee_removed_disc_ntf_handler(ee_disc_info.ee_info[xx].ee_handle, ee_disc_info.ee_info[xx].ee_status);
+ break;
+ }
}
}
}
@@ -2561,18 +2568,38 @@
void *ee_removed_ntf_handler_thread(void *data)
{
static const char fn [] = "ee_removed_ntf_handler_thread";
+ tNFA_STATUS stat = NFA_STATUS_FAILED;
SecureElement &se = SecureElement::getInstance();
- ALOGD ("%s: ", fn);
- se.SecEle_Modeset(0x00);
+ RoutingManager &rm = RoutingManager::getInstance();
+ ALOGD ("%s: Enter: ", fn);
+ rm.mResetHandlerMutex.lock();
+ ALOGD ("%s: enter sEseRemovedHandlerMutex lock", fn);
+ stat = NFA_EeModeSet(0x4c0, NFA_EE_MD_DEACTIVATE);
+
+ if(stat == NFA_STATUS_OK)
+ {
+ SyncEventGuard guard (se.mEeSetModeEvent);
+ se.mEeSetModeEvent.wait ();
+ }
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+ se.NfccStandByOperation(STANDBY_GPIO_LOW);
usleep(10*1000);
- se.SecEle_Modeset(0x01);
- usleep(10*1000);
+ se.NfccStandByOperation(STANDBY_GPIO_HIGH);
+#endif
+ stat = NFA_EeModeSet(0x4c0, NFA_EE_MD_ACTIVATE);
+
+ if(stat == NFA_STATUS_OK)
+ {
+ SyncEventGuard guard(se.mEeSetModeEvent);
+ se.mEeSetModeEvent.wait ();
+ }
NFA_HciW4eSETransaction_Complete(Release);
-#if(NXP_EXTNS == TRUE)
SyncEventGuard guard(se.mEEdatapacketEvent);
recovery=FALSE;
se.mEEdatapacketEvent.notifyOne();
-#endif
+ rm.mResetHandlerMutex.unlock();
+ ALOGD ("%s: exit sEseRemovedHandlerMutex lock ", fn);
+ ALOGD ("%s: exit ", fn);
return NULL;
}
@@ -2720,4 +2747,43 @@
xx++;
}
}
+/*******************************************************************************
+**
+** Function: handleSERemovedNtf()
+**
+** Description: The Function checks whether eSE is Removed Ntf
+**
+** Returns: None
+**
+*******************************************************************************/
+void RoutingManager::handleSERemovedNtf()
+{
+ static const char fn [] = "RoutingManager::handleSERemovedNtf()";
+ UINT8 mActualNumEe = SecureElement::MAX_NUM_EE;
+ tNFA_EE_INFO mEeInfo [mActualNumEe];
+ tNFA_STATUS nfaStat;
+ ALOGE ("%s:Enter", __FUNCTION__);
+ if ((nfaStat = NFA_AllEeGetInfo (&mActualNumEe, mEeInfo)) != NFA_STATUS_OK)
+ {
+ ALOGE ("%s: fail get info; error=0x%X", fn, nfaStat);
+ mActualNumEe = 0;
+ }
+ else
+ {
+ if(mChipId == 0x02 || mChipId == 0x04)
+ {
+ for(int xx = 0; xx < mActualNumEe; 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) &&
+ (mEeInfo[xx].ee_status == 0x02))
+ {
+ recovery = TRUE;
+ ee_removed_disc_ntf_handler(mEeInfo[xx].ee_handle, mEeInfo[xx].ee_status);
+ break;
+ }
+ }
+ }
+ }
+}
#endif
diff --git a/nci/jni/RoutingManager.h b/nci/jni/RoutingManager.h
index 58bb649..2ed1726 100644
--- a/nci/jni/RoutingManager.h
+++ b/nci/jni/RoutingManager.h
@@ -100,31 +100,11 @@
static const int ROUTE_HOST = 0;
static const int ROUTE_ESE = 1;
-
static RoutingManager& getInstance ();
bool initialize(nfc_jni_native_data* native);
void enableRoutingToHost();
void disableRoutingToHost();
#if(NXP_EXTNS == TRUE)
- void setDefaultTechRouting (int seId, int tech_switchon,int tech_switchoff);
- void setDefaultProtoRouting (int seId, int proto_switchon,int proto_switchoff);
- int addNfcid2Routing(UINT8* nfcid2, UINT8 aidLen,const UINT8* syscode,
- int syscodelen,const UINT8* optparam, int optparamlen);
- bool removeNfcid2Routing(UINT8* nfcID2);
-
- void getRouting();
- void processGetRoutingRsp(tNFA_DM_CBACK_DATA* eventData, UINT8* sRoutingBuff);
-#endif
-#if(NXP_EXTNS == TRUE)
- bool addAidRouting(const UINT8* aid, UINT8 aidLen, int route, int power, bool isprefix);
-#else
- bool addAidRouting(const UINT8* aid, UINT8 aidLen, int route);
-#endif
- bool removeAidRouting(const UINT8* aid, UINT8 aidLen);
- bool commitRouting();
- void onNfccShutdown();
- int registerJniFunctions (JNIEnv* e);
-#if(NXP_EXTNS == TRUE)
bool setRoutingEntry(int type, int value, int route, int power);
bool clearRoutingEntry(int type);
void setRouting(bool);
@@ -137,11 +117,28 @@
se_rd_req_state_t getEtsiReaederState();
Rdr_req_ntf_info_t getSwpRrdReqInfo();
void setEtsiReaederState(se_rd_req_state_t newState);
+ void setDefaultTechRouting (int seId, int tech_switchon,int tech_switchoff);
+ void setDefaultProtoRouting (int seId, int proto_switchon,int proto_switchoff);
+ 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
+ bool addAidRouting(const UINT8* aid, UINT8 aidLen, int route);
#endif
+ bool removeAidRouting(const UINT8* aid, UINT8 aidLen);
+ bool commitRouting();
+ void onNfccShutdown();
+ int registerJniFunctions (JNIEnv* e);
void ee_removed_disc_ntf_handler(tNFA_HANDLE handle, tNFA_EE_STATUS status);
SyncEvent mLmrtEvent;
SyncEvent mCeRegisterEvent;//FelicaOnHost
SyncEvent mCeDeRegisterEvent;
+ Mutex mResetHandlerMutex;
private:
RoutingManager();
~RoutingManager();
@@ -183,9 +180,6 @@
std::vector<UINT8> mRxDataBuffer;
// Fields below are final after initialize()
-#if(NXP_EXTNS == TRUE)
- UINT32 mCeRouteStrictDisable;
-#endif
//int mDefaultEe;
int mOffHostEe;
int mActiveSe;
@@ -202,6 +196,7 @@
SyncEvent mEeUpdateEvent;
SyncEvent mEeSetModeEvent;
#if(NXP_EXTNS == TRUE)
+ UINT32 mCeRouteStrictDisable;
int defaultSeID ;
bool mIsDirty;
int defaultPowerstate;
diff --git a/nci/jni/SecureElement.cpp b/nci/jni/SecureElement.cpp
index 8655f44..ed6e05a 100644
--- a/nci/jni/SecureElement.cpp
+++ b/nci/jni/SecureElement.cpp
@@ -38,7 +38,7 @@
#include "PeerToPeer.h"
#if(NXP_EXTNS == TRUE)
#include "RoutingManager.h"
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
#include <signal.h>
#include <sys/types.h>
#endif
@@ -64,19 +64,22 @@
extern void setUiccIdleTimeout (bool enable);
extern bool isDiscoveryStarted();
extern int getScreenState();
+#if((NFC_NXP_ESE == TRUE) && (NFC_NXP_CHIP_TYPE == PN548C2))
+ extern bool isp2pActivated();
+#endif
extern SyncEvent sNfaSetConfigEvent;
extern tNFA_STATUS EmvCo_dosetPoll(jboolean enable);
extern tNFA_STATUS ResetEseSession();
extern void config_swp_reader_mode(bool mode);
extern void set_transcation_stat(bool result);
}
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
/* hold the transceive flag should be set when the prio session is actrive/about to active*/
/* Event used to inform the prio session end and transceive resume*/
SyncEvent sSPIPrioSessionEndEvent;
- static IntervalTimer mNFCCStandbyModeTimer; // timer to enable standby mode for NFCC
static UINT32 nfccStandbytimeout; // timeout for secelem standby mode detection
static void NFCC_StandbyModeTimerCallBack (union sigval);
+ int active_ese_reset_control = 0;
#endif
SyncEvent mDualModeEvent;
static void setSPIState(bool mState);
@@ -85,9 +88,7 @@
#if(NXP_EXTNS == TRUE)
#define NFC_NUM_INTERFACE_MAP 3
#define NFC_SWP_RD_NUM_INTERFACE_MAP 1
-#endif
-#if(NXP_EXTNS == TRUE)
static const tNCI_DISCOVER_MAPS nfc_interface_mapping_default[NFC_NUM_INTERFACE_MAP] =
{
/* Protocols that use Frame Interface do not need to be included in the interface mapping */
@@ -173,9 +174,6 @@
SecureElement SecureElement::sSecElem;
const char* SecureElement::APP_NAME = "nfc_jni";
const UINT16 ACTIVE_SE_USE_ANY = 0xFFFF;
-#if(NXP_EXTNS == TRUE)
-char bcm_nfc_location_jni[]="/etc";
-#endif
/*******************************************************************************
**
@@ -305,7 +303,7 @@
mWiredModeRfFiledEnable = num;
}
#endif
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
if (GetNxpNumValue(NAME_NXP_NFCC_STANDBY_TIMEOUT, &nfccStandbytimeout, sizeof(nfccStandbytimeout)) == false)
{
nfccStandbytimeout = 20000;
@@ -321,6 +319,7 @@
}
dual_mode_current_state = SPI_DWPCL_NOT_ACTIVE;
hold_the_transceive = false;
+ active_ese_reset_control = 0;
#endif
/*
* Since NXP doesn't support OBERTHUR RESET COMMAND, Hence commented
@@ -407,7 +406,9 @@
/* if (mNfaHciHandle != NFA_HANDLE_INVALID)
NFA_HciDeregister (const_cast<char*>(APP_NAME));*/
-
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+ NfccStandByOperation(STANDBY_TIMER_STOP);
+#endif
mNfaHciHandle = NFA_HANDLE_INVALID;
mNativeData = NULL;
mIsInit = false;
@@ -796,11 +797,9 @@
}
{
- SyncEventGuard guard (mEeSetModeEvent);
ALOGD ("%s: set EE mode activate; h=0x%X", fn, eeItem.ee_handle);
- if ((nfaStat = NFA_EeModeSet (eeItem.ee_handle, NFA_EE_MD_ACTIVATE)) == NFA_STATUS_OK)
+ if ((nfaStat = SecElem_EeModeSet (eeItem.ee_handle, NFA_EE_MD_ACTIVATE)) == NFA_STATUS_OK)
{
- mEeSetModeEvent.wait (); //wait for NFA_EE_MODE_SET_EVT
if (eeItem.ee_status == NFC_NFCEE_STATUS_ACTIVE)
numActivatedEe++;
}
@@ -885,11 +884,9 @@
}
{
- SyncEventGuard guard (mEeSetModeEvent);
ALOGD ("%s: set EE mode activate; h=0x%X", fn, eeItem.ee_handle);
- if ((nfaStat = NFA_EeModeSet (eeItem.ee_handle, NFA_EE_MD_DEACTIVATE)) == NFA_STATUS_OK)
+ if ((nfaStat = SecElem_EeModeSet (eeItem.ee_handle, NFA_EE_MD_DEACTIVATE)) == NFA_STATUS_OK)
{
- mEeSetModeEvent.wait (); //wait for NFA_EE_MODE_SET_EVT
ALOGD ("%s: eeItem.ee_status =0x%X NFC_NFCEE_STATUS_INACTIVE = %x", fn, eeItem.ee_status, NFC_NFCEE_STATUS_INACTIVE);
if (eeItem.ee_status == NFC_NFCEE_STATUS_INACTIVE)
{
@@ -1426,14 +1423,14 @@
ALOGD ("%s: Empty AID SELECT cmd detected, substituting AID from config file, new length=%d", fn, idx);
}
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
- mNFCCStandbyModeTimer.kill();
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+ NfccStandByOperation(STANDBY_TIMER_STOP);
#endif
{
SyncEventGuard guard (mTransceiveEvent);
mActualResponseSize = 0;
memset (mResponseData, 0, sizeof(mResponseData));
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
if(hold_the_transceive == true){
ALOGD("%s: holding the transceive\n", fn);
sSPIPrioSessionEndEvent.wait(timeoutMillisec);
@@ -1472,17 +1469,48 @@
mDualModeEvent.wait();
}
#endif
+#if(NFC_NXP_ESE == TRUE)
+ active_ese_reset_control |= TRANS_WIRED_ONGOING;
+#endif
#endif
nfaStat = NFA_HciSendEvent (mNfaHciHandle, mNewPipeId, EVT_SEND_DATA, xmitBufferSize, xmitBuffer, sizeof(mResponseData), mResponseData, timeoutMillisec);
#if(NXP_EXTNS == TRUE)
}
#endif
else
+#if(NXP_EXTNS == TRUE)
+ {
+#if(NFC_NXP_ESE == TRUE)
+ active_ese_reset_control |= TRANS_WIRED_ONGOING;
+#endif
+#endif
nfaStat = NFA_HciSendEvent (mNfaHciHandle, mNewPipeId, NFA_HCI_EVT_POST_DATA, xmitBufferSize, xmitBuffer, sizeof(mResponseData), mResponseData, timeoutMillisec);
+#if(NXP_EXTNS == TRUE)
+ }
+#endif
if (nfaStat == NFA_STATUS_OK)
{
// waitOk = mTransceiveEvent.wait (timeoutMillisec);
mTransceiveEvent.wait ();
+
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+ if(active_ese_reset_control & TRANS_WIRED_ONGOING)
+ {
+ active_ese_reset_control ^= TRANS_WIRED_ONGOING;
+
+ /*If only reset event is pending*/
+ if((active_ese_reset_control&RESET_BLOCKED))
+ {
+ SyncEventGuard guard (mResetOngoingEvent);
+ mResetOngoingEvent.wait();
+ }
+ if(!(active_ese_reset_control&TRANS_CL_ONGOING) &&
+ (active_ese_reset_control&RESET_BLOCKED))
+ {
+ active_ese_reset_control ^= RESET_BLOCKED;
+ }
+ }
+#endif
if (mTransceiveWaitOk == false) //timeout occurs
{
ALOGE ("%s: wait response timeout", fn);
@@ -1505,6 +1533,10 @@
isSuccess = true;
TheEnd:
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+ if((active_ese_reset_control&TRANS_WIRED_ONGOING))
+ active_ese_reset_control ^= TRANS_WIRED_ONGOING;
+#endif
ALOGD ("%s: exit; isSuccess: %d; recvBufferActualSize: %ld", fn, isSuccess, recvBufferActualSize);
return (isSuccess);
}
@@ -1525,12 +1557,31 @@
if(mState)
{
dual_mode_current_state |= CL_ACTIVE;
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+ active_ese_reset_control |= TRANS_CL_ONGOING;
+#endif
}
else
{
if(dual_mode_current_state & CL_ACTIVE)
{
dual_mode_current_state ^= CL_ACTIVE;
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+ if((active_ese_reset_control&TRANS_CL_ONGOING))
+ {
+ active_ese_reset_control ^= TRANS_CL_ONGOING;
+
+ /*If there is no pending wired rapdu or CL session*/
+ if(((active_ese_reset_control&RESET_BLOCKED))&&
+ (!(active_ese_reset_control &(TRANS_WIRED_ONGOING))))
+ {
+ /*unblock pending reset event*/
+ SyncEventGuard guard (sSecElem.mResetEvent);
+ sSecElem.mResetEvent.notifyOne();
+ active_ese_reset_control ^= RESET_BLOCKED;
+ }
+ }
+#endif
if(inDualModeAlready)
{
SyncEventGuard guard (mDualModeEvent);
@@ -1559,17 +1610,11 @@
sSecElem.mEeSetModeEvent.notifyOne();
}
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
static void NFCC_StandbyModeTimerCallBack (union sigval)
{
ALOGD ("%s timer timedout , sending standby mode cmd", __FUNCTION__);
- 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__);
- }
+ SecureElement::getInstance().NfccStandByOperation(STANDBY_TIMER_TIMEOUT);
}
#endif
/*******************************************************************************
@@ -1735,8 +1780,7 @@
if (e == NULL)
{
ALOGE ("%s: jni env is null", fn);
- mMutex.unlock();
- return;
+ break;
}
sSwpReaderTimer.kill();
/*
@@ -2057,17 +2101,27 @@
ALOGD ("%s: NFA_HCI_EVENT_RCVD_EVT; data from static pipe", fn);
SyncEventGuard guard (sSecElem.mTransceiveEvent);
sSecElem.mActualResponseSize = (eventData->rcvd_evt.evt_len > MAX_RESPONSE_SIZE) ? MAX_RESPONSE_SIZE : eventData->rcvd_evt.evt_len;
+#if(NXP_EXTNS == TRUE)
+#if(NFC_NXP_ESE == TRUE)
if(eventData->rcvd_evt.evt_len > 0)
{
sSecElem.mTransceiveWaitOk = true;
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
- if(nfccStandbytimeout > 0)
- {
- mNFCCStandbyModeTimer.set(nfccStandbytimeout , NFCC_StandbyModeTimerCallBack );
- ALOGE ("%s: starting NFCC standby mode timer", fn);
- }
-#endif
+ SecureElement::getInstance().NfccStandByOperation(STANDBY_TIMER_START);
}
+ /*If there is pending reset event to process*/
+ if((active_ese_reset_control&RESET_BLOCKED)&&
+ (!(active_ese_reset_control &(TRANS_CL_ONGOING))))
+ {
+ SyncEventGuard guard (sSecElem.mResetEvent);
+ sSecElem.mResetEvent.notifyOne();
+ }
+#else
+ if(eventData->rcvd_evt.evt_len > 0)
+ {
+ sSecElem.mTransceiveWaitOk = true;
+ }
+#endif
+#endif
sSecElem.mTransceiveEvent.notifyOne ();
}
else if (eventData->rcvd_evt.evt_code == NFA_HCI_EVT_POST_DATA)
@@ -2488,11 +2542,9 @@
tNFA_STATUS nfaStat = NFA_STATUS_FAILED;
bool retval = true;
- SyncEventGuard guard (mEeSetModeEvent);
ALOGD ("set EE mode = 0x%X", type);
- if ((nfaStat = NFA_EeModeSet (0x4C0, type)) == NFA_STATUS_OK)
+ if ((nfaStat = SecElem_EeModeSet (0x4C0, type)) == NFA_STATUS_OK)
{
- mEeSetModeEvent.wait (); //wait for NFA_EE_MODE_SET_EVT
#if 0
if (eeItem.ee_status == NFC_NFCEE_STATUS_INACTIVE)
{
@@ -2555,6 +2607,95 @@
return retval;
}
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+/*******************************************************************************
+**
+** Function NfccStandByTimerOperation
+**
+** Description start/stops the standby timer
+**
+** Returns void
+**
+*******************************************************************************/
+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);
+ switch(value)
+ {
+ case STANDBY_TIMER_START:
+ if(nfccStandbytimeout > 0)
+ {
+ mNFCCStandbyModeTimer.set(nfccStandbytimeout , NFCC_StandbyModeTimerCallBack );
+ }
+ break;
+ case STANDBY_TIMER_STOP:
+ {
+ if(nfccStandbytimeout > 0)
+ mNFCCStandbyModeTimer.kill();
+ }
+ break;
+ case STANDBY_TIMER_TIMEOUT:
+ {
+ 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__);
+ }
+ }
+ break;
+ case STANDBY_GPIO_HIGH:
+ {
+ jint ret_val = -1;
+ NFCSTATUS status = NFCSTATUS_FAILED;
+
+ /* Set the ESE VDD gpio to high to make sure P61 is powered, even if NFCC
+ * is in standby
+ */
+ ret_val = NFC_EnableWired ((void *)&status);
+ if (ret_val < 0)
+ {
+ ALOGD("NFC_EnableWired failed");
+ }
+ else
+ {
+ if (status != NFCSTATUS_SUCCESS)
+ {
+ ALOGD("SE is being used by SPI");
+ }
+ }
+ }
+ break;
+ case STANDBY_GPIO_LOW:
+ {
+ jint ret_val = -1;
+ NFCSTATUS status = NFCSTATUS_FAILED;
+ /* Set the ESE VDD gpio to low to make sure P61 is reset. */
+ ret_val = NFC_DisableWired ((void *)&status);
+ if (ret_val < 0)
+ {
+ ALOGD("NFC_DisableWired failed");
+ }
+ else
+ {
+ if (status != NFCSTATUS_SUCCESS)
+ {
+ ALOGD("SE is not being released by Pn54x driver");
+ }
+ }
+ }
+ break;
+ default:
+ ALOGE("Wrong param");
+ break;
+
+ }
+}
+#endif
+
/*******************************************************************************
**
** Function: reconfigureEseHciInit
@@ -2603,7 +2744,11 @@
ALOGD("%s; enter", fn);
//mRecvdTransEvt = false; //reset to false before 2.5sec wait
SyncEventGuard guard (mAllowWiredModeEvent);
- if(isActivatedInListenMode())
+ if(android::isp2pActivated())
+ {
+ status = true;
+ }
+ else if(isActivatedInListenMode())
{
ALOGD("%s; mAllowWiredMode=%d ",fn, mAllowWiredMode);
if(mAllowWiredMode)
@@ -2626,7 +2771,6 @@
if(!isActivatedInListenMode() || !isRfFieldOn() || !mRecvdTransEvt)
status = true;
}
-
return status;
}
#endif
@@ -2839,7 +2983,7 @@
return decoded_length;
}
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
void spi_prio_signal_handler (int signum, siginfo_t *info, void *unused)
{
ALOGD ("%s: Inside the Signal Handler %d\n", __FUNCTION__, SIG_NFC);
@@ -2874,7 +3018,7 @@
}
#endif
-#if(NXP_EXTNS == TRUE)
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
/*******************************************************************************
**
** Function: setCPTimeout
@@ -2904,7 +3048,6 @@
static const char fn [] = "SecureElement::setCPTimeout";
for ( i = 0; i < mActualNumEe; i++)
{
-
if (mEeInfo[i].ee_handle == 0x4C0)
{
nfaStat = NFA_STATUS_OK;
@@ -2928,20 +3071,38 @@
}
if(found)
{
- SecEle_Modeset(0x01);
- activate(0xF3);
- connectEE();
- getAtr(0xF3,received_getatr,&recvBufferActualSize);
- transceive(selectISD,(INT32)sizeof(selectISD),received_selectISD,(int)sizeof(received_selectISD),recvBufferActualSize,
- timeout);
- transceive(setCPTimeoutcmdbuff,(INT32)sizeof(setCPTimeoutcmdbuff),received_setCPTimeout,(int)sizeof(received_setCPTimeout),recvBufferActualSize,
- timeout);
- disconnectEE(0xF3);
+ bool stat = false;
+
+ stat = SecEle_Modeset(0x01);
+ if(stat == true)
+ {
+ stat = connectEE();
+ if(stat == true)
+ {
+ stat = getAtr(ESE_ID,received_getatr,&recvBufferActualSize);
+ if(stat == true)
+ {
+ /*select card manager*/
+ stat = transceive(selectISD,(INT32)sizeof(selectISD),received_selectISD,
+ (int)sizeof(received_selectISD), recvBufferActualSize, timeout);
+ if(stat == true)
+ {
+ /*set timeout value in CP registry*/
+ transceive(setCPTimeoutcmdbuff,(INT32)sizeof(setCPTimeoutcmdbuff),
+ received_setCPTimeout, (int)sizeof(received_setCPTimeout), recvBufferActualSize, timeout);
+ }
+ }
+ }
+ }
+ sendEvent(SecureElement::EVT_END_OF_APDU_TRANSFER);
+ disconnectEE(ESE_ID);
}
}
}
+#endif
+#if(NXP_EXTNS == TRUE)
/*******************************************************************************
**
** Function: setSPIState
@@ -2974,4 +3135,43 @@
}
ALOGD ("%s: Exit setSPIState = %d\n", __FUNCTION__, dual_mode_current_state);
}
+
+/*******************************************************************************
+ **
+ ** Function: SecElem_EeModeSet
+ **
+ ** Description: Perform SE mode set ON/OFF based on mode type
+ **
+ ** Returns: NFA_STATUS_OK/NFA_STATUS_FAILED.
+ **
+ *******************************************************************************/
+tNFA_STATUS SecureElement::SecElem_EeModeSet(uint16_t handle, uint8_t mode)
+{
+ tNFA_STATUS stat = NFA_STATUS_FAILED;
+ ALOGD("%s:Enter mode = %d", __FUNCTION__, mode);
+
+#if((NFC_NXP_ESE == TRUE))
+ if((mode == NFA_EE_MD_DEACTIVATE)&&(active_ese_reset_control&(TRANS_WIRED_ONGOING|TRANS_CL_ONGOING)))
+ {
+ active_ese_reset_control |= RESET_BLOCKED;
+ SyncEventGuard guard (sSecElem.mResetEvent);
+ sSecElem.mResetEvent.wait();
+ }
+#endif
+ SyncEventGuard guard (sSecElem.mEeSetModeEvent);
+ stat = NFA_EeModeSet(handle, mode);
+ if(stat == NFA_STATUS_OK)
+ {
+ sSecElem.mEeSetModeEvent.wait ();
+ }
+
+#if((NFC_NXP_ESE == TRUE))
+ if((active_ese_reset_control&RESET_BLOCKED))
+ {
+ SyncEventGuard guard (sSecElem.mResetOngoingEvent);
+ sSecElem.mResetOngoingEvent.notifyOne();
+ }
+#endif
+ return stat;
+}
#endif
diff --git a/nci/jni/SecureElement.h b/nci/jni/SecureElement.h
index c8fea1f..932e582 100644
--- a/nci/jni/SecureElement.h
+++ b/nci/jni/SecureElement.h
@@ -49,11 +49,11 @@
#include "nfa_hci_defs.h"
#include "nfa_ce_api.h"
#include "phNxpExtns.h"
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
#include "phNfcTypes.h"
#endif
}
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
#define SIG_NFC 44
#endif
typedef enum dual_mode{
@@ -63,6 +63,12 @@
SPI_DWPCL_BOTH_ACTIVE = 0x03,
}dual_mode_state;
+typedef enum reset_management{
+ TRANS_IDLE = 0x00,
+ TRANS_WIRED_ONGOING = 0x01,
+ TRANS_CL_ONGOING = 0x02,
+ RESET_BLOCKED = 0x04,
+}ese_reset_control;
typedef struct {
tNFA_HANDLE src;
tNFA_TECHNOLOGY_MASK tech_mask;
@@ -97,7 +103,14 @@
Mutex mMutex;
}Rdr_req_ntf_info_t;
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+typedef enum operation{
+ STANDBY_TIMER_START,
+ STANDBY_TIMER_STOP,
+ STANDBY_TIMER_TIMEOUT,
+ STANDBY_GPIO_HIGH,
+ STANDBY_GPIO_LOW
+}nfcc_standby_operation_t;
void spi_prio_signal_handler (int signum, siginfo_t *info, void *unused);
#endif
@@ -545,8 +558,9 @@
jint getGenericEseId(tNFA_HANDLE handle);
tNFA_STATUS reconfigureEseHciInit();
-#if(NXP_EXTNS == TRUE)
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
void setCPTimeout();
+ void NfccStandByOperation(nfcc_standby_operation_t value);
#endif
bool isWiredModeAllowedInRfState();
bool mRecvdTransEvt;
@@ -556,12 +570,12 @@
SyncEvent mAidAddRemoveEvent;
SyncEvent mUiccListenEvent;
SyncEvent mEseListenEvent;
-#if(NXP_EXTNS == TRUE)
- SyncEvent mEEdatapacketEvent;
-#endif
SyncEvent mAllowWiredModeEvent;
+ SyncEvent mEeSetModeEvent;
#if(NXP_EXTNS == TRUE)
+ tNFA_STATUS SecElem_EeModeSet(uint16_t handle, uint8_t mode);
+ SyncEvent mEEdatapacketEvent;
static const UINT8 EVT_END_OF_APDU_TRANSFER = 0x21; //NXP Propritory
void setCLState(bool mState);
#endif
@@ -578,16 +592,13 @@
static const UINT8 EVT_SEND_DATA = 0x10; //see specification ETSI TS 102 622 v9.0.0 (Host Controller Interface); section 9.3.3.3
#if(NXP_EXTNS == TRUE)
static const tNFA_HANDLE EE_HANDLE_0xF3 = 0x4C0;//0x401; //handle to secure element in slot 0
-#else
- static const tNFA_HANDLE EE_HANDLE_0xF3 = 0x4F3; //handle to secure element in slot 0
-#endif
-#if(NXP_EXTNS == TRUE)
#ifdef NXP_UICC_ENABLE
static const tNFA_HANDLE EE_HANDLE_0xF4 = 0x402; //handle to secure element in slot 1
#else
static const tNFA_HANDLE EE_HANDLE_0xF4 = 0x0F4;//0x4C0; //handle to secure element in slot 1
#endif
#else
+ static const tNFA_HANDLE EE_HANDLE_0xF3 = 0x4F3; //handle to secure element in slot 0
static const tNFA_HANDLE EE_HANDLE_0xF4 = 0x4F4; //handle to secure element in slot 1
#endif
@@ -618,7 +629,9 @@
tNFA_HCI_GET_GATE_PIPE_LIST mHciCfg;
SyncEvent mEeRegisterEvent;
SyncEvent mHciRegisterEvent;
- SyncEvent mEeSetModeEvent;
+
+ SyncEvent mResetEvent;
+ SyncEvent mResetOngoingEvent;
SyncEvent mPipeListEvent;
SyncEvent mCreatePipeEvent;
SyncEvent mPipeOpenedEvent;
diff --git a/nci/jni/extns/pn54x/src/phNxpExtns.c b/nci/jni/extns/pn54x/src/phNxpExtns.c
index 9e90e69..63a101b 100644
--- a/nci/jni/extns/pn54x/src/phNxpExtns.c
+++ b/nci/jni/extns/pn54x/src/phNxpExtns.c
@@ -613,6 +613,8 @@
if (sem_timedwait (&gAuthCmdBuf.semPresenceCheck, &ts))
{
ALOGE ("%s: failed to wait (errno=0x%08x)", __FUNCTION__, errno);
+ sem_destroy (&gAuthCmdBuf.semPresenceCheck);
+ gAuthCmdBuf.auth_sent = FALSE;
return NFCSTATUS_FAILED;
}
if (sem_destroy (&gAuthCmdBuf.semPresenceCheck))
diff --git a/nci/jni/extns/pn54x/src/utils/phNxpConfig.cpp b/nci/jni/extns/pn54x/src/utils/phNxpConfig.cpp
index dea3647..0127a15 100644
--- a/nci/jni/extns/pn54x/src/utils/phNxpConfig.cpp
+++ b/nci/jni/extns/pn54x/src/utils/phNxpConfig.cpp
@@ -822,13 +822,13 @@
** Returns: 0 if not modified, 1 otherwise.
**
*******************************************************************************/
-
int CNfcConfig::updateTimestamp()
{
FILE* fd;
struct stat st;
unsigned long value = 0;
int ret = 0;
+
if(stat(config_timestamp_path, &st) != 0)
{
ALOGD("%s file %s not exist, creat it.\n", __func__, config_timestamp_path);
@@ -847,6 +847,7 @@
ALOGE("%s Cannot open file %s\n", __func__, config_timestamp_path);
return 1;
}
+
fread(&value, sizeof(unsigned long), 1, fd);
ret = (value != m_timeStamp);
if(ret)
@@ -1013,3 +1014,4 @@
nxp::CNfcConfig& rConfig = nxp::CNfcConfig::GetInstance();
return rConfig.updateTimestamp();
}
+
diff --git a/nci/src/com/android/nfc/dhimpl/NativeNfcManager.java b/nci/src/com/android/nfc/dhimpl/NativeNfcManager.java
index a0759c9..7a7b609 100644
--- a/nci/src/com/android/nfc/dhimpl/NativeNfcManager.java
+++ b/nci/src/com/android/nfc/dhimpl/NativeNfcManager.java
@@ -292,6 +292,15 @@
public native int getDefaultMifareCLTRoute();
@Override
+ public native int getDefaultAidPowerState();
+
+ @Override
+ public native int getDefaultDesfirePowerState();
+
+ @Override
+ public native int getDefaultMifareCLTPowerState();
+
+ @Override
public native void doSetScreenOrPowerState(int state);
@Override
@@ -370,7 +379,7 @@
public native int JCOSDownload();
@Override
- public native void doSetVenConfigValue(int venconfig);
+ public native void doSetNfcMode(int nfcMode);
@Override
public native int GetDefaultSE();
diff --git a/nci/src/com/gsma/nfc/internal/NxpNfcController.java b/nci/src/com/gsma/nfc/internal/NxpNfcController.java
index f8fc69b..7af9651 100644
--- a/nci/src/com/gsma/nfc/internal/NxpNfcController.java
+++ b/nci/src/com/gsma/nfc/internal/NxpNfcController.java
@@ -26,6 +26,8 @@
import java.util.HashMap;
import java.util.Map;
import android.content.BroadcastReceiver;
+import android.content.pm.ResolveInfo;
+import android.content.pm.PackageInfo;
import android.util.Log;
import com.nxp.nfc.gsma.internal.INxpNfcController;
@@ -34,7 +36,8 @@
import android.nfc.cardemulation.NQApduServiceInfo;
import android.os.Binder;
import android.content.ComponentName;
-
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
import com.android.nfc.NfcPermissions;
import com.android.nfc.NfcService;
import com.nxp.nfc.NxpConstants;
@@ -61,7 +64,7 @@
private boolean mHasCert = false;
private Object mWaitOMACheckCert = null;
private boolean mHasOMACert = false;
-
+ private ComponentName unicastPkg = null;
public NxpNfcController(Context context, CardEmulationManager cardEmulationManager) {
mContext = context;
@@ -79,6 +82,10 @@
}
public ArrayList<String> getEnabledMultiEvtsPackageList() {
+ if(mEnabledMultiEvts.size() == 0x00) {
+ Log.d(TAG, " check for unicast mode service resolution");
+ getPackageListUnicastMode();
+ }
return mEnabledMultiEvts;
}
@@ -183,6 +190,92 @@
return data;
}
+ private long getApplicationInstallTime(String packageName) {
+ PackageManager pm = mContext.getPackageManager();
+ try {
+ PackageInfo pInfo = pm.getPackageInfo(packageName ,0);
+ return pInfo.firstInstallTime;
+ }catch(NameNotFoundException exception) {
+ Log.e(TAG, "Application install time not retrieved");
+ return 0;
+ }
+ }
+
+ private void getPackageListUnicastMode () {
+ unicastPkg = null;
+ ArrayList<NQApduServiceInfo> regApduServices = mServiceCache.getApduservicesList();
+ PackageManager pm = mContext.getPackageManager();
+ List<ResolveInfo> intentServices = pm.queryIntentActivities(
+ new Intent(NxpConstants.ACTION_MULTI_EVT_TRANSACTION),
+ PackageManager.GET_INTENT_FILTERS| PackageManager.GET_RESOLVED_FILTER);
+ ArrayList<String> apduResolvedServices = new ArrayList<String>();
+ String packageName = null;
+ String resolvedApduService = null;
+ int highestPriority = -1000;
+ long minInstallTime;
+ ResolveInfo resolveInfoService = null;
+
+ for(NQApduServiceInfo service : regApduServices) {
+ packageName = service.getComponent().getPackageName();
+ for(ResolveInfo resInfo : intentServices){
+ resolveInfoService = null;
+ Log.e(TAG, " Registered Service in resolved cache"+resInfo.activityInfo.packageName);
+ if(resInfo.activityInfo.packageName.equals(packageName)) {
+ resolveInfoService = resInfo;
+ break;
+ }
+ }
+ if(resolveInfoService == null) {
+ Log.e(TAG, " Registered Service is not found in cache");
+ continue;
+ }
+ int priority = resolveInfoService.priority;
+ if(pm.checkPermission(NxpConstants.PERMISSIONS_TRANSACTION_EVENT , packageName) ==
+ PackageManager.PERMISSION_GRANTED)
+ {
+ if(checkCertificatesFromUICC(packageName, NxpConstants.UICC_ID) == true)
+ {
+ if(priority == highestPriority) {
+ apduResolvedServices.add(packageName);
+ } else if(highestPriority < priority) {
+ highestPriority = priority;
+ apduResolvedServices.clear();
+ apduResolvedServices.add(packageName);
+ }
+ }
+ }
+ }
+ if(apduResolvedServices.size() == 0x00) {
+ Log.e(TAG, "No services to resolve, not starting the activity");
+ return;
+ }else if(apduResolvedServices.size() > 0x01) {
+ Log.e(TAG, " resolved"+apduResolvedServices.size());
+ minInstallTime = getApplicationInstallTime(apduResolvedServices.get(0));
+ for(String resolvedService : apduResolvedServices) {
+ if(getApplicationInstallTime(resolvedService) <= minInstallTime ) {
+ minInstallTime = getApplicationInstallTime(resolvedService);
+ resolvedApduService = resolvedService;
+ }
+ Log.e(TAG, " Install time of application"+ minInstallTime);
+ }
+
+ } else resolvedApduService = apduResolvedServices.get(0);
+
+ Log.e(TAG, " Final Resolved Service"+resolvedApduService);
+ if(resolvedApduService != null) {
+ for(ResolveInfo resolve : intentServices) {
+ if(resolve.activityInfo.packageName.equals(resolvedApduService)) {
+ unicastPkg = new ComponentName(resolvedApduService ,resolve.activityInfo.name);
+ break;
+ }
+ }
+ }
+ }
+
+ public ComponentName getUnicastPackage() {
+ return unicastPkg;
+ }
+
final class NxpNfcControllerInterface extends INxpNfcController.Stub {
@Override
@@ -200,6 +293,11 @@
HashMap<ComponentName, NQApduServiceInfo> mapServices = mServiceCache.getApduservicesMaps();
ComponentName preferredPaymentService = mRegisteredAidCache.getPreferredPaymentService();
if(preferredPaymentService != null) {
+ if(preferredPaymentService.getPackageName() != null &&
+ !preferredPaymentService.getPackageName().equals(packageName)) {
+ Log.d(TAG, "getDefaultOffHostService unregistered package Name");
+ return null;
+ }
String defaultservice = preferredPaymentService.getClassName();
//If Default is Dynamic Service
diff --git a/nci/src/com/gsma/nfc/internal/RegisteredNxpServicesCache.java b/nci/src/com/gsma/nfc/internal/RegisteredNxpServicesCache.java
index 95a7185..949f8b9 100644
--- a/nci/src/com/gsma/nfc/internal/RegisteredNxpServicesCache.java
+++ b/nci/src/com/gsma/nfc/internal/RegisteredNxpServicesCache.java
@@ -78,6 +78,7 @@
private RegisteredServicesCache mRegisteredServicesCache;
final HashMap<ComponentName, NQApduServiceInfo> mApduServices = Maps.newHashMap();
+ final HashMap<ComponentName , String> mApduBanner = Maps.newHashMap();
AtomicFile mDynamicApduServiceFile = null;
File dataDir = null;
@@ -94,6 +95,49 @@
mDynamicApduServiceFile = new AtomicFile(new File(dataDir, "dynamic_apduservice.xml"));
}
+
+ private String writeDrawableAsBitMap(Drawable drawable , String path) {
+ File file = new File(dataDir, path);
+ Log.d(TAG, " input Path "+ path);
+ Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();
+ Log.d(TAG, "drawablePath: "+ file.getPath());
+ try {
+ FileOutputStream outStream = new FileOutputStream(file);
+ bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);
+ outStream.flush();
+ outStream.close();
+ return file.getPath();
+ } catch (IOException e) {
+ Log.d(TAG, " input Path Not found"+ e.getMessage());
+ return null;
+ }
+ }
+
+ private Drawable readDrawableFromBitMap(String drawablePath) {
+ Log.d(TAG, " input Path "+ drawablePath);
+ File filePath = new File(drawablePath);
+ try {
+ FileInputStream fi = new FileInputStream(filePath);
+ Bitmap bitmap = BitmapFactory.decodeStream(fi);
+ Drawable DrawableResource = new BitmapDrawable(mContext.getResources(),bitmap);
+ return DrawableResource;
+ } catch (IOException e) {
+ Log.d(TAG, " input Path Not found"+ e.getMessage());
+ return null;
+ }
+ }
+
+ private boolean deleteBitMapfromFile(String drawablePath) {
+ Log.d(TAG, " delete Path "+ drawablePath);
+ boolean deleted = false;
+ File file = new File(drawablePath);
+ if (file.exists()) {
+ Log.d(TAG, " delete Path found"+ drawablePath);
+ deleted = file.delete();
+ }
+ Log.d(TAG, "deleted "+deleted);
+ return deleted;
+ }
// Register APDU Service
public boolean registerApduService(int userId, int uid, String packageName, String serviceName, NQApduServiceInfo apduService) {
ComponentName componentName = new ComponentName(packageName, serviceName);
@@ -146,6 +190,10 @@
if(uninstalledpackageName.equals(entry.getKey().getPackageName())){
it.remove();
Log.d(TAG, "Removed packageName: "+ entry.getKey().getPackageName());
+ if(mApduBanner.containsKey(entry.getKey())) {
+ deleteBitMapfromFile(mApduBanner.get(entry.getKey()));
+ mApduBanner.remove(entry.getKey());
+ }
}
}
} else {
@@ -158,6 +206,10 @@
synchronized (mLock) {
mApduServices.values().remove(apduService);
writeDynamicApduService();
+ if(mApduBanner.containsKey(apduService.getComponent())) {
+ deleteBitMapfromFile(mApduBanner.get(apduService.getComponent()));
+ mApduBanner.remove(apduService.getComponent());
+ }
mRegisteredServicesCache.invalidateCache(userId);
}
return true;
@@ -194,10 +246,21 @@
for(Iterator<Map.Entry<ComponentName, NQApduServiceInfo>>it=mApduServices.entrySet().iterator(); it.hasNext();){
Map.Entry<ComponentName, NQApduServiceInfo> service = it.next();
- out.startTag(null, "service");
- out.attribute(null, "component", service.getKey().flattenToString());
- service.getValue().writeToXml(out);
- out.endTag(null, "service");
+ if( null != service) {
+ out.startTag(null, "service");
+ out.attribute(null, "component", service.getKey().flattenToString());
+ if(service.getValue().getBannerId() <= 0x00 && null != service.getValue().mBanner) {
+ Log.e(TAG, "writeDynamicApduService "+service.getValue().getBannerId());
+ String path = service.getKey().getPackageName() + "_"+ service.getKey().getClassName()+".png";
+ path = writeDrawableAsBitMap(service.getValue().mBanner ,path);
+ if(!mApduBanner.containsKey(service.getKey())) {
+ mApduBanner.put(service.getKey(),path);
+ }
+ out.attribute(null, "drawableResourcepath", path);
+ }
+ service.getValue().writeToXml(out);
+ out.endTag(null, "service");
+ }
}
out.endTag(null, "apduservices");
out.endDocument();
@@ -253,6 +316,7 @@
description = parser.getAttributeValue(null, "description");
bannerId = Integer.parseInt(parser.getAttributeValue(null, "bannerId"));
String isModifiable = parser.getAttributeValue(null, "modifiable");
+ drawbalePath = parser.getAttributeValue(null, "drawableResourcepath");
if(isModifiable.equals("true")) {
modifiable = true;
} else {
@@ -262,6 +326,14 @@
String seIdString = parser.getAttributeValue(null, "seId");
seId = Integer.parseInt(seIdString);
inService = true;
+ Log.e(TAG, "readDynamicApduService "+bannerId);
+ if(bannerId <= 0x00) {
+ bannerId = -1;
+ DrawableResource = readDrawableFromBitMap(drawbalePath);
+ if(!mApduBanner.containsKey(currentComponent)) {
+ mApduBanner.put(currentComponent, drawbalePath);
+ }
+ }
}
if ("aid-group".equals(tagName) && parser.getDepth() == 3 && inService) {
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 17fe502..e0e7231 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -99,6 +99,10 @@
<string name="nfc_enabled_dialog"> Nfc is Currently Disabled. \nDo you want to Enable it for your NFC Service </string>
+ <string name="permgrouplab_NFC">NFC-Near Field communication</string>
+
+ <string name="permgroupdesc_NFC"> Access various NFC features</string>
+
<string name="ok">OK</string>
<string name="no">NO</string>
diff --git a/src/com/android/nfc/DeviceHost.java b/src/com/android/nfc/DeviceHost.java
index 9b67fe8..f7d38c8 100644
--- a/src/com/android/nfc/DeviceHost.java
+++ b/src/com/android/nfc/DeviceHost.java
@@ -306,6 +306,12 @@
public int getDefaultMifareCLTRoute();
+ public int getDefaultAidPowerState();
+
+ public int getDefaultDesfirePowerState();
+
+ public int getDefaultMifareCLTPowerState();
+
public boolean setRoutingEntry(int type, int value, int route, int power);
public boolean clearRoutingEntry(int type);
@@ -359,7 +365,7 @@
int JCOSDownload();
- void doSetVenConfigValue(int VenConfig);
+ void doSetNfcMode(int nfcMode);
String dump();
diff --git a/src/com/android/nfc/NfcService.java b/src/com/android/nfc/NfcService.java
index 50f7cd2..2f88c1c 100644
--- a/src/com/android/nfc/NfcService.java
+++ b/src/com/android/nfc/NfcService.java
@@ -148,6 +148,7 @@
private static final String NFC_PERM_ERROR = "NFC permission required";
public static final String PREF = "NfcServicePrefs";
+ public static final String NXP_PREF = "NfcServiceNxpPrefs";
static final String PREF_NFC_ON = "nfc_on";
static final boolean NFC_ON_DEFAULT = true;
@@ -196,8 +197,8 @@
static final boolean SE_BROADCASTS_WITH_HCE = true;
private static final String PREF_SECURE_ELEMENT_ID = "secure_element_id";
- public static final int ROUTE_LOC_MASK=3;
- public static final int TECH_TYPE_MASK=5;
+ public static final int ROUTE_LOC_MASK=5;
+ public static final int TECH_TYPE_MASK=7;
static final int MSG_NDEF_TAG = 0;
static final int MSG_CARD_EMULATION = 1;
@@ -307,10 +308,6 @@
public static final int SOUND_END = 1;
public static final int SOUND_ERROR = 2;
- // for setting VEN_CFG
- public static final int VEN_CFG_NFC_ON_POWER_ON = 3;
- public static final int VEN_CFG_NFC_OFF_POWER_OFF = 2;
-
//ETSI Reader Events
public static final int ETSI_READER_REQUESTED = 0;
public static final int ETSI_READER_START = 1;
@@ -432,7 +429,9 @@
Context mContext;
private DeviceHost mDeviceHost;
private SharedPreferences mPrefs;
+ private SharedPreferences mNxpPrefs;
private SharedPreferences.Editor mPrefsEditor;
+ private SharedPreferences.Editor mNxpPrefsEditor;
private PowerManager.WakeLock mRoutingWakeLock;
private PowerManager.WakeLock mEeWakeLock;
@@ -818,6 +817,8 @@
mPrefs = mContext.getSharedPreferences(PREF, Context.MODE_PRIVATE);
mPrefsEditor = mPrefs.edit();
+ mNxpPrefs = mContext.getSharedPreferences(NXP_PREF, Context.MODE_PRIVATE);
+ mNxpPrefsEditor = mNxpPrefs.edit();
mState = NfcAdapter.STATE_OFF;
mIsNdefPushEnabled = mPrefs.getBoolean(PREF_NDEF_PUSH_ON, NDEF_PUSH_ON_DEFAULT);
@@ -1143,11 +1144,11 @@
}
mNfcSecureElementState =
- mPrefs.getBoolean(PREF_SECURE_ELEMENT_ON, SECURE_ELEMENT_ON_DEFAULT);
+ mNxpPrefs.getBoolean(PREF_SECURE_ELEMENT_ON, SECURE_ELEMENT_ON_DEFAULT);
if (mNfcSecureElementState) {
int secureElementId =
- mPrefs.getInt(PREF_SECURE_ELEMENT_ID, SECURE_ELEMENT_ID_DEFAULT);
+ mNxpPrefs.getInt(PREF_SECURE_ELEMENT_ID, SECURE_ELEMENT_ID_DEFAULT);
if (Se_list != null) {
@@ -1530,14 +1531,13 @@
if(!mPowerShutDown)
{
Log.i(TAG, "Disabling NFC Disabling ESE/UICC");
- mDeviceHost.doSetScreenOrPowerState(ScreenStateHelper.POWER_STATE_OFF);
//Since only Nfc is getting disabled so disable CE from EE.
+ mDeviceHost.doSetScreenOrPowerState(ScreenStateHelper.POWER_STATE_ON);
mDeviceHost.doDeselectSecureElement(UICC_ID_TYPE);
mDeviceHost.doDeselectSecureElement(SMART_MX_ID_TYPE);
} else {
Log.i(TAG, "Power off : Disabling NFC Disabling ESE/UICC");
mPowerShutDown = false;
- mDeviceHost.doSetScreenOrPowerState(ScreenStateHelper.POWER_STATE_ON);
mCardEmulationManager.onPreferredForegroundServiceChanged(null);
}
@@ -1965,9 +1965,9 @@
mSelectedSeId = 0;
/* store preference */
- mPrefsEditor.putBoolean(PREF_SECURE_ELEMENT_ON, false);
- mPrefsEditor.putInt(PREF_SECURE_ELEMENT_ID, 0);
- mPrefsEditor.apply();
+ mNxpPrefsEditor.putBoolean(PREF_SECURE_ELEMENT_ON, false);
+ mNxpPrefsEditor.putInt(PREF_SECURE_ELEMENT_ID, 0);
+ mNxpPrefsEditor.apply();
return ErrorCodes.SUCCESS;
}
@@ -1981,9 +1981,9 @@
NfcPermissions.enforceAdminPermissions(mContext);
/* store */
Log.d(TAG, "SE Preference stored");
- mPrefsEditor.putBoolean(PREF_SECURE_ELEMENT_ON, true);
- mPrefsEditor.putInt(PREF_SECURE_ELEMENT_ID, seId);
- mPrefsEditor.apply();
+ mNxpPrefsEditor.putBoolean(PREF_SECURE_ELEMENT_ON, true);
+ mNxpPrefsEditor.putInt(PREF_SECURE_ELEMENT_ID, seId);
+ mNxpPrefsEditor.apply();
}
@Override
@@ -2022,9 +2022,9 @@
}
}
/* store */
- mPrefsEditor.putBoolean(PREF_SECURE_ELEMENT_ON, true);
- mPrefsEditor.putInt(PREF_SECURE_ELEMENT_ID, mSelectedSeId);
- mPrefsEditor.apply();
+ mNxpPrefsEditor.putBoolean(PREF_SECURE_ELEMENT_ON, true);
+ mNxpPrefsEditor.putInt(PREF_SECURE_ELEMENT_ID, mSelectedSeId);
+ mNxpPrefsEditor.apply();
mNfcSecureElementState = true;
@@ -2037,9 +2037,9 @@
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) );
- mPrefsEditor = mPrefs.edit();
- mPrefsEditor.putInt("PREF_MIFARE_DESFIRE_PROTO_ROUTE_ID", protoRouteEntry);
- mPrefsEditor.commit();
+ mNxpPrefsEditor = mNxpPrefs.edit();
+ mNxpPrefsEditor.putInt("PREF_MIFARE_DESFIRE_PROTO_ROUTE_ID", protoRouteEntry);
+ mNxpPrefsEditor.commit();
Log.i(TAG,"MifareDesfireRouteSet function in");
commitRouting();
}
@@ -2053,9 +2053,9 @@
protoRouteEntry |= ((fullPower ? 0x01 : 0) | (lowPower ? 0x01 << 1 :0 ) | (noPower ? 0x01 << 2 :0));
if(GetDefaultRouteLoc() != routeLoc)
{
- mPrefsEditor = mPrefs.edit();
- mPrefsEditor.putInt("PREF_SET_DEFAULT_ROUTE_ID", protoRouteEntry );
- mPrefsEditor.commit();
+ mNxpPrefsEditor = mNxpPrefs.edit();
+ mNxpPrefsEditor.putInt("PREF_SET_DEFAULT_ROUTE_ID", protoRouteEntry );
+ mNxpPrefsEditor.commit();
mIsRouteForced = true;
if (mIsHceCapable) {
mAidRoutingManager.onNfccRoutingTableCleared();
@@ -2079,9 +2079,9 @@
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;
- mPrefsEditor = mPrefs.edit();
- mPrefsEditor.putInt("PREF_MIFARE_CLT_ROUTE_ID", techRouteEntry);
- mPrefsEditor.commit();
+ mNxpPrefsEditor = mNxpPrefs.edit();
+ mNxpPrefsEditor.putInt("PREF_MIFARE_CLT_ROUTE_ID", techRouteEntry);
+ mNxpPrefsEditor.commit();
commitRouting();
}
@Override
@@ -2100,6 +2100,12 @@
public Map<String,Integer> getServicesAidCacheSize(int userId, String category){
return mCardEmulationManager.getServicesAidCacheSize(userId, category);
}
+
+ @Override
+ public int updateServiceState(int userId , Map serviceState) {
+ return mCardEmulationManager.updateServiceState(userId ,serviceState);
+ }
+
@Override
public int getSeInterface(int type) throws RemoteException {
return mDeviceHost.doGetSeInterface(type);
@@ -3137,7 +3143,7 @@
} else if(cmdType.equals("enableserver")) {
if(serviceName.equals(null))
return false;
- mP2pLinkManager.enableExtDtaSnepServer(serviceName, serviceSap, miu, rwSize);
+ mP2pLinkManager.enableExtDtaSnepServer(serviceName, serviceSap, miu, rwSize,testCaseId);
} else if(cmdType.equals("disableserver")) {
mP2pLinkManager.disableExtDtaSnepServer();
} else if(cmdType.equals("enableclient")) {
@@ -3848,9 +3854,9 @@
if(mIsRoutingTableDirty) {
mIsRoutingTableDirty = false;
//TODO: Take this logic from L_OSP_EXT [PN547C2]
- int protoRoute = mPrefs.getInt("PREF_MIFARE_DESFIRE_PROTO_ROUTE_ID", GetDefaultMifareDesfireRouteEntry());
- int defaultRoute=mPrefs.getInt("PREF_SET_DEFAULT_ROUTE_ID", GetDefaultRouteEntry());
- int techRoute=mPrefs.getInt("PREF_MIFARE_CLT_ROUTE_ID", GetDefaultMifateCLTRouteEntry());
+ int protoRoute = mNxpPrefs.getInt("PREF_MIFARE_DESFIRE_PROTO_ROUTE_ID", GetDefaultMifareDesfireRouteEntry());
+ int defaultRoute=mNxpPrefs.getInt("PREF_SET_DEFAULT_ROUTE_ID", GetDefaultRouteEntry());
+ int techRoute=mNxpPrefs.getInt("PREF_MIFARE_CLT_ROUTE_ID", GetDefaultMifateCLTRouteEntry());
Log.d(TAG, "Set default Route Entry");
setDefaultRoute(defaultRoute, protoRoute, techRoute);
}
@@ -3966,11 +3972,12 @@
public void notifyRoutingTableFull()
{
+ mNxpPrefsEditor = mNxpPrefs.edit();
+ mNxpPrefsEditor.putInt("PREF_SET_AID_ROUTING_TABLE_FULL",0x01);
+ mNxpPrefsEditor.commit();
//broadcast Aid Routing Table Full intent to the user
- String ACTION_ROUTING_TABLE_FULL =
- "com.nxp.action.AID_ROUTING_TABLE_FULL";
Intent aidTableFull = new Intent();
- aidTableFull.setAction(ACTION_ROUTING_TABLE_FULL);
+ aidTableFull.setAction(NxpConstants.ACTION_ROUTING_TABLE_FULL);
if (DBG) {
Log.d(TAG, "notify aid routing table full to the user");
}
@@ -3981,11 +3988,11 @@
*/
public void setDefaultAidRouteLoc( int defaultAidRouteEntry)
{
- mPrefsEditor = mPrefs.edit();
+ mNxpPrefsEditor = mNxpPrefs.edit();
Log.d(TAG, "writing to preferences setDefaultAidRouteLoc :" + defaultAidRouteEntry);
- mPrefsEditor.putInt("PREF_SET_DEFAULT_ROUTE_ID", (defaultAidRouteEntry << 0x03 )| ROUTE_SWITCH_ON );
- mPrefsEditor.commit();
- int defaultRoute=mPrefs.getInt("PREF_SET_DEFAULT_ROUTE_ID",0xFF);
+ mNxpPrefsEditor.putInt("PREF_SET_DEFAULT_ROUTE_ID", ((defaultAidRouteEntry << ROUTE_LOC_MASK)| (mDeviceHost.getDefaultAidPowerState() & 0x1F)));
+ mNxpPrefsEditor.commit();
+ int defaultRoute=mNxpPrefs.getInt("PREF_SET_DEFAULT_ROUTE_ID",0xFF);
Log.d(TAG, "reading preferences from user :" + defaultRoute);
}
@@ -4017,7 +4024,7 @@
*/
public int GetDefaultRouteLoc()
{
- int defaultRouteLoc = mPrefs.getInt("PREF_SET_DEFAULT_ROUTE_ID", GetDefaultRouteEntry()) >> ROUTE_LOC_MASK;
+ int defaultRouteLoc = mNxpPrefs.getInt("PREF_SET_DEFAULT_ROUTE_ID", GetDefaultRouteEntry()) >> ROUTE_LOC_MASK;
Log.d(TAG, "GetDefaultRouteLoc :" + defaultRouteLoc);
return defaultRouteLoc ;
}
@@ -4029,7 +4036,7 @@
{
//return ((ROUTE_ID_UICC << ROUTE_LOC_MASK ) | ROUTE_SWITCH_ON | ROUTE_SWITCH_OFF) ;
Log.d(TAG, "GetDefaultMifareDesfireRouteEntry :" + mDeviceHost.getDefaultDesfireRoute() );
- return ((mDeviceHost.getDefaultDesfireRoute() << ROUTE_LOC_MASK ) | ROUTE_SWITCH_ON | ROUTE_SWITCH_OFF) ;
+ return ((mDeviceHost.getDefaultDesfirePowerState() & 0x1F) | (mDeviceHost.getDefaultDesfireRoute() << ROUTE_LOC_MASK)) ;
}
/**
* set default Aid route entry in case application does not configure this route entry
@@ -4037,7 +4044,7 @@
public int GetDefaultRouteEntry()
{
- int defaultAidRoute = ((mDeviceHost.getDefaultAidRoute()<< ROUTE_LOC_MASK) | ROUTE_SWITCH_ON);
+ int defaultAidRoute = ((mDeviceHost.getDefaultAidPowerState() & 0x1F) | (mDeviceHost.getDefaultAidRoute()<< ROUTE_LOC_MASK));
Log.d(TAG, "GetDefaultRouteEntry :" + defaultAidRoute );
return defaultAidRoute;
}
@@ -4049,7 +4056,7 @@
{
//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.getDefaultMifareCLTRoute() << ROUTE_LOC_MASK ) | ROUTE_SWITCH_ON | ROUTE_SWITCH_OFF | (TECH_TYPE_A << TECH_TYPE_MASK)) ;
+ return ((mDeviceHost.getDefaultMifareCLTPowerState() & 0x1F) | (mDeviceHost.getDefaultMifareCLTRoute() << ROUTE_LOC_MASK) | (TECH_TYPE_A << TECH_TYPE_MASK)) ;
}
public boolean setDefaultRoute(int defaultRouteEntry, int defaultProtoRouteEntry, int defaultTechRouteEntry) {
@@ -4058,7 +4065,7 @@
}
public int getDefaultRoute() {
- return mPrefs.getInt(PREF_DEFAULT_ROUTE_ID, DEFAULT_ROUTE_ID_DEFAULT);
+ return mNxpPrefs.getInt(PREF_DEFAULT_ROUTE_ID, DEFAULT_ROUTE_ID_DEFAULT);
}
@@ -4070,6 +4077,11 @@
mHandler.sendEmptyMessage(MSG_COMMITED_FELICA_ROUTING);
}
+ public int getAidRoutingTableStatus() {
+ int aidTableStatus = 0x00;
+ aidTableStatus = mNxpPrefs.getInt("PREF_SET_AID_ROUTING_TABLE_FULL",0x00);
+ return aidTableStatus;
+ }
public void routeNfcid2(String nfcid2, String syscode, String optparam) {
Message msg = mHandler.obtainMessage();
@@ -4779,8 +4791,28 @@
private void sendMultiEvtBroadcast(Intent intent) {
ArrayList<String> packageList = mNxpNfcController.getEnabledMultiEvtsPackageList();
+ ComponentName unicastComponent = null;
if(packageList.size() == 0) {
Log.d(TAG, "No packages to send broadcast.");
+ unicastComponent = mNxpNfcController.getUnicastPackage();
+ if(unicastComponent != null)
+ {
+ intent.setComponent(unicastComponent);
+ try {
+ //start gsma
+ Log.d(TAG, "Starting activity uincast Pkg"+unicastComponent.flattenToString());
+ intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ if(mContext.getPackageManager().resolveActivity(intent, 0) != null)
+ {
+ mContext.startActivity(intent);
+ } else {
+ Log.d(TAG, "Intent not resolved");
+ }
+ } catch (Exception e) {
+ if (DBG) Log.d(TAG, "Exception: " + e.getMessage());
+ }
+ }
return;
}
@@ -5041,6 +5073,7 @@
} else if(action.equals(Intent.ACTION_SHUTDOWN)) {
mPowerShutDown = true;
Log.d(TAG,"Device is shutting down.");
+ mDeviceHost.doSetScreenOrPowerState(ScreenStateHelper.POWER_STATE_OFF);
}
}
};
diff --git a/src/com/android/nfc/P2pLinkManager.java b/src/com/android/nfc/P2pLinkManager.java
index 5e18eb6..c44818f 100644
--- a/src/com/android/nfc/P2pLinkManager.java
+++ b/src/com/android/nfc/P2pLinkManager.java
@@ -338,17 +338,17 @@
/**
* To Enable DTA SNEP Server for NFC Forum testing
*/
- public void enableExtDtaSnepServer(String serviceName, int serviceSap, int miu, int rwSize)
+ public void enableExtDtaSnepServer(String serviceName, int serviceSap, int miu, int rwSize,int testCaseId)
{
if (DBG) Log.d(TAG, "Enabling Extended DTA Server");
mServiceName = serviceName;
mServiceSap = serviceSap;
mDtaMiu = miu;
mDtaRwSize = rwSize;
- mTestCaseID = 0;
+ mTestCaseID = testCaseId;
synchronized (this) {
if(mExtDtaSnepServer == null)
- mExtDtaSnepServer = new ExtDtaSnepServer(mServiceName, mServiceSap, mDtaMiu, mDtaRwSize, mExtDtaSnepServerCallback,mContext);
+ mExtDtaSnepServer = new ExtDtaSnepServer(mServiceName, mServiceSap, mDtaMiu, mDtaRwSize, mExtDtaSnepServerCallback,mContext, mTestCaseID);
mExtDtaSnepServer.start();
mExtDtaSnepServerRunning = true;
}
diff --git a/src/com/android/nfc/cardemulation/AidRoutingManager.java b/src/com/android/nfc/cardemulation/AidRoutingManager.java
index 86c6047..eed1579 100644
--- a/src/com/android/nfc/cardemulation/AidRoutingManager.java
+++ b/src/com/android/nfc/cardemulation/AidRoutingManager.java
@@ -87,7 +87,8 @@
// see AID_MATCHING constants
final int mAidMatchingSupport;
final int mAidMatchingPlatform;
- final int mAidRoutingTableSize;
+ //Changed from final to private int to update RoutingtableSize later in configureRouting.
+ private int mAidRoutingTableSize;
// Maximum AID routing table size
final Object mLock = new Object();
@@ -118,8 +119,6 @@
mAidMatchingSupport = doGetAidMatchingMode();
if (DBG) Log.d(TAG, "mAidMatchingSupport=0x" + Integer.toHexString(mAidMatchingSupport));
mAidMatchingPlatform = doGetAidMatchingPlatform();
- if (DBG) Log.d(TAG, "mAidMatchingPlatform=0x" + Integer.toHexString(mAidMatchingPlatform));
- mAidRoutingTableSize = NfcService.getInstance().getAidRoutingTableSize();
if (DBG) Log.d(TAG, "mAidTableSize=0x" + Integer.toHexString(mAidRoutingTableSize));
mVzwRoutingCache = new VzwRoutingCache();
}
@@ -137,6 +136,8 @@
public boolean configureRouting(HashMap<String, AidElement> aidMap) {
mDefaultRoute = NfcService.getInstance().GetDefaultRouteLoc();
boolean aidRouteResolved = false;
+ if (DBG) Log.d(TAG, "mAidMatchingPlatform=0x" + Integer.toHexString(mAidMatchingPlatform));
+ mAidRoutingTableSize = NfcService.getInstance().getAidRoutingTableSize();
if (DBG) Log.d(TAG, "mDefaultRoute=0x" + Integer.toHexString(mDefaultRoute));
Hashtable<String, AidElement> routeCache = new Hashtable<String, AidElement>(50);
SparseArray<Set<String>> aidRoutingTable = new SparseArray<Set<String>>(aidMap.size());
diff --git a/src/com/android/nfc/cardemulation/CardEmulationManager.java b/src/com/android/nfc/cardemulation/CardEmulationManager.java
index 5f0214e..481a284 100644
--- a/src/com/android/nfc/cardemulation/CardEmulationManager.java
+++ b/src/com/android/nfc/cardemulation/CardEmulationManager.java
@@ -463,4 +463,11 @@
//Add dynamic non-payment services
return nonPaymentServiceAidCacheSize;
}
+
+ public int updateServiceState(int userId ,
+ Map<String , Boolean> serviceState) {
+ NfcPermissions.validateUserId(userId);
+ NfcPermissions.enforceUserPermissions(mContext);
+ return mServiceCache.updateServiceState(userId ,Binder.getCallingUid() ,serviceState);
+ }
}
diff --git a/src/com/android/nfc/cardemulation/Nfcid2RoutingManager.java b/src/com/android/nfc/cardemulation/Nfcid2RoutingManager.java
index c8f2e51..e3c06c9 100644
--- a/src/com/android/nfc/cardemulation/Nfcid2RoutingManager.java
+++ b/src/com/android/nfc/cardemulation/Nfcid2RoutingManager.java
@@ -41,7 +41,7 @@
import com.android.nfc.NfcService;
import com.android.nfc.cardemulation.Nfcid2RoutingCache;
-import android.nfc.cardemulation.ApduServiceInfo;
+import android.nfc.cardemulation.NQApduServiceInfo;
import java.util.HashMap;
import java.util.HashSet;
@@ -65,7 +65,7 @@
// For Nexus devices, just a static route to the eSE
// OEMs/Carriers could manually map off-host AIDs
// to the correct eSE/UICC based on state they keep.
-// static final int DEFAULT_OFFHOST_ROUTE = ApduServiceInfo.SECURE_ELEMENT_ROUTE_UICC;
+// static final int DEFAULT_OFFHOST_ROUTE = NQApduServiceInfo.SECURE_ELEMENT_ROUTE_UICC;
final Object mLock = new Object();
diff --git a/src/com/android/nfc/cardemulation/RegisteredAidCache.java b/src/com/android/nfc/cardemulation/RegisteredAidCache.java
index 8121d44..475d4e4 100644
--- a/src/com/android/nfc/cardemulation/RegisteredAidCache.java
+++ b/src/com/android/nfc/cardemulation/RegisteredAidCache.java
@@ -410,6 +410,11 @@
ServiceAidInfo serviceAidInfo = new ServiceAidInfo();
serviceAidInfo.service = service;
serviceAidInfo.category = service.getCategoryForAid(aid);
+ if( serviceAidInfo.category == CardEmulation.CATEGORY_OTHER &&
+ service.getServiceState(CardEmulation.CATEGORY_OTHER) == false) {
+ Log.e(TAG, "ignoring other category aid because service category disabled");
+ continue;
+ }
//NXP specific, Adding prefix (*) to all off host aid for prefix match.
if (mRoutingManager.getAidMatchingPlatform() == AidRoutingManager.AID_MATCHING_K
&& !service.isOnHost() && !aid.endsWith("*")) {
diff --git a/src/com/android/nfc/cardemulation/RegisteredServicesCache.java b/src/com/android/nfc/cardemulation/RegisteredServicesCache.java
index fd9161b..e2c64cf 100644
--- a/src/com/android/nfc/cardemulation/RegisteredServicesCache.java
+++ b/src/com/android/nfc/cardemulation/RegisteredServicesCache.java
@@ -63,6 +63,7 @@
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import com.gsma.nfc.internal.RegisteredNxpServicesCache;
+import com.android.nfc.NfcService;
/**
* This class is inspired by android.content.pm.RegisteredServicesCache
@@ -86,7 +87,7 @@
final SparseArray<UserServices> mUserServices = new SparseArray<UserServices>();
final Callback mCallback;
final AtomicFile mDynamicAidsFile;
-
+ final AtomicFile mServiceStateFile;
//public ArrayList<NQApduServiceInfo> mAllServices = new ArrayList<NQApduServiceInfo>();
final HashMap<ComponentName, NQApduServiceInfo> mAllServices = Maps.newHashMap();
@@ -177,6 +178,7 @@
File dataDir = mContext.getFilesDir();
mDynamicAidsFile = new AtomicFile(new File(dataDir, "dynamic_aids.xml"));
+ mServiceStateFile = new AtomicFile(new File(dataDir, "service_state.xml"));
}
void initialize(RegisteredNxpServicesCache registeredNxpServicesCache) {
@@ -353,6 +355,8 @@
// Persist to filesystem
writeDynamicAidsLocked();
}
+ updateServiceStateFromFile(userId);
+ writeServiceStateToFile(userId);
}
mCallback.onServicesUpdated(userId, Collections.unmodifiableList(validServices));
@@ -475,8 +479,185 @@
}
}
+ private void updateServiceStateFromFile(int currUserId)
+ {
+ FileInputStream fis = null;
+ try {
+ if(NfcService.getInstance().getAidRoutingTableStatus() == 0x00) {
+ Log.e(TAG, " Aid Routing Table still availble , No need to disable services");
+ return;
+ }
+ if(!mServiceStateFile.getBaseFile().exists()) {
+ Log.d(TAG,"mServiceStateFile does not exist");
+ return;
+ }
+ fis = mServiceStateFile.openRead();
+ XmlPullParser parser = Xml.newPullParser();
+ parser.setInput(fis , null);
+ int eventType = parser.getEventType();
+ int currUid = -1;
+ ComponentName currComponent = null;
+ HashMap<ComponentName ,NQApduServiceInfo> nxpOffHostServiceMap = mRegisteredNxpServicesCache.getApduservicesMaps();
+ boolean state = true;
+ while (eventType != XmlPullParser.START_TAG &&
+ eventType != XmlPullParser.END_DOCUMENT) {
+ eventType = parser.next();
+ }
+ String tagName = parser.getName();
+ if ("services".equals(tagName)) {
+ while (eventType != XmlPullParser.END_DOCUMENT) {
+ tagName = parser.getName();
+ if (eventType == XmlPullParser.START_TAG) {
+ if("service".equals(tagName) && parser.getDepth() == 0x02) {
+ String compString = parser.getAttributeValue(null ,"component");
+ String uidString = parser.getAttributeValue(null ,"uid");
+ String stateString = parser.getAttributeValue(null ,"serviceState");
+ if(compString == null || uidString == null || stateString == null) {
+ Log.e(TAG, "Invalid service attributes");
+ } else {
+ try {
+ currUid = Integer.parseInt(uidString);
+ currComponent = ComponentName.unflattenFromString(compString);
+ Log.d(TAG, " curr component "+compString);
+ Log.d(TAG, " curr uid "+uidString);
+ Log.d(TAG, " curr state "+stateString);
+ if(stateString.equalsIgnoreCase("false")) { state = false;}
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "could not parse the service attributes");
+ }
+ }
+ }
+ } else if (eventType == XmlPullParser.END_TAG) {
+ if("service".equals(tagName)) {
+ final int userId = UserHandle.getUserId(currUid);
+ if(currUserId == userId) {
+ UserServices serviceCache = findOrCreateUserLocked(userId);
+ NQApduServiceInfo serviceInfo = serviceCache.services.get(currComponent);
+ if(serviceInfo == null) {
+ // CHECK for GSMA related services also.
+ serviceInfo = nxpOffHostServiceMap.get(currComponent);
+ if(serviceInfo == null) {
+ Log.e(TAG, "could not find the required serviceInfo");
+ } else serviceInfo.setServiceState(CardEmulation.CATEGORY_OTHER ,state);
+ } else serviceInfo.setServiceState(CardEmulation.CATEGORY_OTHER ,state);
+ }
+ }
+ currUid = -1;
+ currComponent = null;
+ state = true;
+ }
+
+ eventType = parser.next();
+ }
+ }
+ } catch(Exception e) {
+ mServiceStateFile.delete();
+ Log.e(TAG, "could not parse the seriveState file , thrashing the file");
+ } finally {
+ try {
+ if(fis != null) {
+ fis.close();
+ }
+ } catch ( Exception e) {
+ }
+ }
+ }
+
+ private boolean writeServiceStateToFile(int currUserId) {
+ FileOutputStream fos = null;
+ ArrayList<NQApduServiceInfo> nxpOffHostServiceCache = mRegisteredNxpServicesCache.getApduservicesList();
+ if(NfcService.getInstance().getAidRoutingTableStatus() == 0x00) {
+ Log.e(TAG, " Aid Routing Table still availble , No need to disable services");
+ return false;
+ }
+ if(currUserId != ActivityManager.getCurrentUser()) {
+ return false;
+ }
+ try {
+ fos = mServiceStateFile.startWrite();
+ XmlSerializer out = new FastXmlSerializer();
+ out.setOutput(fos, "utf-8");
+ out.startDocument(null , true);
+ out.setFeature(XML_INDENT_OUTPUT_FEATURE, true);
+ out.startTag(null ,"services");
+ for(int userId = 0; userId < mUserServices.size(); userId++) {
+ final UserServices userServices = mUserServices.valueAt(userId);
+ for (NQApduServiceInfo serviceInfo : userServices.services.values()) {
+ if(!serviceInfo.hasCategory(CardEmulation.CATEGORY_OTHER)) {
+ continue;
+ }
+ out.startTag(null ,"service");
+ out.attribute(null, "component", serviceInfo.getComponent().flattenToString());
+ Log.d(TAG,"component name"+ serviceInfo.getComponent().flattenToString());
+ out.attribute(null, "uid", Integer.toString(serviceInfo.getUid()));
+ Log.d(TAG,"uid name"+ Integer.toString(serviceInfo.getUid()));
+ out.attribute(null, "serviceState", Boolean.toString(serviceInfo.getServiceState(CardEmulation.CATEGORY_OTHER)));
+ Log.d(TAG,"curr name"+ Boolean.toString(serviceInfo.getServiceState(CardEmulation.CATEGORY_OTHER)));
+ out.endTag(null, "service");
+ }
+ }
+ dump(nxpOffHostServiceCache);
+ //ADD GSMA services Cache
+ for(NQApduServiceInfo serviceInfo : nxpOffHostServiceCache) {
+ out.startTag(null ,"service");
+ out.attribute(null, "component", serviceInfo.getComponent().flattenToString());
+ Log.d(TAG,"component name"+ serviceInfo.getComponent().flattenToString());
+ out.attribute(null, "uid", Integer.toString(serviceInfo.getUid()));
+ Log.d(TAG,"uid name"+ Integer.toString(serviceInfo.getUid()));
+ out.attribute(null, "serviceState", Boolean.toString(serviceInfo.getServiceState(CardEmulation.CATEGORY_OTHER)));
+ Log.d(TAG,"curr name"+ Boolean.toString(serviceInfo.getServiceState(CardEmulation.CATEGORY_OTHER)));
+ out.endTag(null, "service");
+ }
+ out.endTag(null ,"services");
+ out.endDocument();
+ mServiceStateFile.finishWrite(fos);
+ return true;
+ } catch ( Exception e){
+ Log.e(TAG,"Failed to write serviceStateFile xml");
+ e.printStackTrace();
+ if (fos != null) {
+ mServiceStateFile.failWrite(fos);
+ }
+ return false;
+ }
+ }
+
+ public int updateServiceState(int userId , int uid,
+ Map<String , Boolean> serviceState) {
+ boolean success = false;
+ HashMap<ComponentName ,NQApduServiceInfo> nxpOffHostServiceMap = mRegisteredNxpServicesCache.getApduservicesMaps();
+ if(NfcService.getInstance().getAidRoutingTableStatus() == 0x00) {
+ Log.e(TAG, " Aid Routing Table still availble , No need to disable services");
+ return 0xFF;
+ }
+ synchronized(mLock) {
+ Iterator<Map.Entry<String , Boolean>> it =
+ serviceState.entrySet().iterator();
+ while(it.hasNext()) {
+ Map.Entry<String , Boolean> entry =
+ (Map.Entry<String , Boolean>) it.next();
+ ComponentName componentName = ComponentName.unflattenFromString(entry.getKey());
+ NQApduServiceInfo serviceInfo = getService(userId, componentName);
+ Log.e(TAG, "updateServiceState " + entry.getKey());
+ Log.e(TAG, "updateServiceState " + entry.getValue());
+ if (serviceInfo != null) {
+ serviceInfo.setServiceState(CardEmulation.CATEGORY_OTHER, entry.getValue());
+ } else if ((serviceInfo = nxpOffHostServiceMap.get(componentName)) != null) {
+ // CHECK for GSMA cache
+ serviceInfo.setServiceState(CardEmulation.CATEGORY_OTHER, entry.getValue());
+ } else {
+ Log.e(TAG, "Could not find service " + componentName);
+ return 0xFF;
+ }
+ }
+ success = writeServiceStateToFile(userId);
+ }
+ invalidateCache(ActivityManager.getCurrentUser());
+ return (success?0x00:0xFF);
+ }
+
public boolean registerAidGroupForService(int userId, int uid,
- ComponentName componentName, NQAidGroup aidGroup) {
+ ComponentName componentName, NQAidGroup nqaidGroup) {
ArrayList<NQApduServiceInfo> newServices = null;
boolean success;
synchronized (mLock) {
@@ -497,27 +678,27 @@
}
// Do another AID validation, since a caller could have thrown in a modified
// NQAidGroup object with invalid AIDs over Binder.
- List<String> aids = aidGroup.getAids();
+ List<String> aids = nqaidGroup.getAids();
for (String aid : aids) {
if (!CardEmulation.isValidAid(aid)) {
Log.e(TAG, "AID " + aid + " is not a valid AID");
return false;
}
}
- serviceInfo.setOrReplaceDynamicNQAidGroup(aidGroup);
+ serviceInfo.setOrReplaceDynamicNQAidGroup(nqaidGroup);
DynamicAids dynAids = services.dynamicAids.get(componentName);
if (dynAids == null) {
dynAids = new DynamicAids(uid);
services.dynamicAids.put(componentName, dynAids);
}
- dynAids.aidGroups.put(aidGroup.getCategory(), aidGroup);
+ dynAids.aidGroups.put(nqaidGroup.getCategory(), nqaidGroup);
success = writeDynamicAidsLocked();
if (success) {
newServices = new ArrayList<NQApduServiceInfo>(services.services.values());
} else {
Log.e(TAG, "Failed to persist AID group.");
// Undo registration
- dynAids.aidGroups.remove(aidGroup.getCategory());
+ dynAids.aidGroups.remove(nqaidGroup.getCategory());
}
}
if (success) {
diff --git a/src/com/android/nfc/snep/SnepMessenger.java b/src/com/android/nfc/snep/SnepMessenger.java
index 81053e2..5cd60bc 100644
--- a/src/com/android/nfc/snep/SnepMessenger.java
+++ b/src/com/android/nfc/snep/SnepMessenger.java
@@ -37,6 +37,7 @@
import com.android.nfc.DeviceHost.LlcpSocket;
import com.android.nfc.NfcService;
import com.android.nfc.sneptest.DtaSnepClient;
+import com.android.nfc.sneptest.ExtDtaSnepServer;
import android.nfc.FormatException;
import android.util.Log;
@@ -129,7 +130,7 @@
mSocket.send(tmpBuffer);
if(NfcService.mIsDtaMode) {
- if((!mIsClient)&&(DtaSnepClient.mTestCaseId == 0x01)){
+ if((!mIsClient)&&(ExtDtaSnepServer.mTestCaseId == 0x01)){
mSocket.receive(responseBytes);
try {
snepResponse = SnepMessage.fromByteArray(responseBytes);
diff --git a/src/com/android/nfc/sneptest/ExtDtaSnepServer.java b/src/com/android/nfc/sneptest/ExtDtaSnepServer.java
index 46672a5..5e25631 100644
--- a/src/com/android/nfc/sneptest/ExtDtaSnepServer.java
+++ b/src/com/android/nfc/sneptest/ExtDtaSnepServer.java
@@ -45,6 +45,7 @@
final int mDtaMiu;
final int mDtaRwSize;
public static Context mContext;
+ public static int mTestCaseId;
/** Protected by 'this', null when stopped, non-null when running */
ServerThread mServerThread = null;
@@ -58,7 +59,7 @@
}
// for NFC Forum SNEP DTA
- public ExtDtaSnepServer(String serviceName, int serviceSap, int miu, int rwSize, Callback callback,Context mContext)
+ public ExtDtaSnepServer(String serviceName, int serviceSap, int miu, int rwSize, Callback callback,Context mContext,int testCaseId)
{
mExtDtaSnepServerCallback = callback;
mDtaServiceName = serviceName;
@@ -66,6 +67,7 @@
mDtaFragmentLength = -1; // to get remote MIU
mDtaMiu = miu;
mDtaRwSize = rwSize;
+ mTestCaseId = testCaseId;
dtaServiceConnector=new DtaServiceConnector(mContext);
dtaServiceConnector.bindService();
}