aboutsummaryrefslogtreecommitdiffstats
path: root/nci/jni/NativeNfcManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'nci/jni/NativeNfcManager.cpp')
-rw-r--r--nci/jni/NativeNfcManager.cpp107
1 files changed, 72 insertions, 35 deletions
diff --git a/nci/jni/NativeNfcManager.cpp b/nci/jni/NativeNfcManager.cpp
index 73574ed8..132d99bb 100644
--- a/nci/jni/NativeNfcManager.cpp
+++ b/nci/jni/NativeNfcManager.cpp
@@ -48,6 +48,7 @@
#include "DwpChannel.h"
#include "TransactionController.h"
#include <fcntl.h>
+#include "JcopManager.h"
extern "C"
{
#include "nfc_api.h"
@@ -60,10 +61,6 @@ extern "C"
#include "phNxpExtns.h"
#include "phNxpConfig.h"
-#if(NXP_EXTNS == TRUE)
- #include "JcDnld.h"
- #include "IChannel.h"
-#endif
}
#define ALOGV ALOGD
#define SAK_VALUE_AT 17
@@ -96,6 +93,7 @@ extern bool recovery;
extern uint8_t swp_getconfig_status;
extern int gUICCVirtualWiredProtectMask;
extern int gEseVirtualWiredProtectMask;
+extern bool IsEseCeDisabled;
static int32_t gNfcInitTimeout;
int32_t gdisc_timeout;
int32_t gSeDiscoverycount = 0;
@@ -529,7 +527,6 @@ void *enableThread(void *arg);
static IntervalTimer scleanupTimerProc_transaction;
static bool gIsDtaEnabled=false;
-tNfc_featureList nfcFL;
static void nfcManager_getFeatureList();
static jbyteArray nfcManager_getAdditionalConfigOptions(JNIEnv *e, jobject o);
static void register_signal_handler();
@@ -635,7 +632,7 @@ void *p2p_prio_logic_multiprotocol(void* /* arg */)
ALOGD ("%s: enter", __FUNCTION__);
/* Do not need if it is already in screen off state */
- if ((getScreenState() != (NFA_SCREEN_STATE_OFF_LOCKED || NFA_SCREEN_STATE_OFF_UNLOCKED)))
+ if (!(getScreenState() & (NFA_SCREEN_STATE_OFF_LOCKED | NFA_SCREEN_STATE_OFF_UNLOCKED)))
{
/* Stop polling */
if (sRfEnabled)
@@ -1632,7 +1629,17 @@ void nfaDeviceManagementCallback (uint8_t dmEvent, tNFA_DM_CBACK_DATA* eventData
}
else
{
- pTransactionController->transactionEnd(TRANSACTION_REQUESTOR(RF_FIELD_EVT));
+ /*In case of 66T/67T if Field On is not received before activation, consider NFA_ACTIVATED_EVENT for
+ locking the transaction and use Field Off received while removing the reader from proximity to end the lock*/
+ if(((nfcFL.chipType == pn548C2) || (nfcFL.chipType == pn551)) &&
+ pTransactionController->getCurTransactionRequestor() == TRANSACTION_REQUESTOR(NFA_ACTIVATED_EVENT))
+ {
+ pTransactionController->transactionEnd(TRANSACTION_REQUESTOR(NFA_ACTIVATED_EVENT));
+ }
+ else
+ {
+ pTransactionController->transactionEnd(TRANSACTION_REQUESTOR(RF_FIELD_EVT));
+ }
sRfFieldOff = true;
e->CallVoidMethod (nat->manager, android::gCachedNfcManagerNotifyRfFieldDeactivated);
}
@@ -1821,12 +1828,21 @@ static jboolean nfcManager_routeAid (JNIEnv* e, jobject, jbyteArray aid, jint ro
ScopedByteArrayRO bytes(e, aid);
uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0]));
size_t bufLen = bytes.size();
+
#if (NXP_EXTNS == TRUE)
if((nfcFL.nfccFL._NFC_NXP_STAT_DUAL_UICC_WO_EXT_SWITCH) &&
(route == 2 || route == 4)) { //UICC or UICC2 HANDLE
ALOGV("sCurrentSelectedUICCSlot: %d", sCurrentSelectedUICCSlot);
route = (sCurrentSelectedUICCSlot != 0x02) ? 0x02 : 0x04;
}
+ /*In case of 66T/67T field on is observed as last field event once reader
+ is removed from proximity, which will hold the transaction lock unnecessarily
+ In such cases end the lock as it is not required*/
+ if(((nfcFL.chipType == pn548C2) || (nfcFL.chipType == pn551)) &&
+ pTransactionController->getCurTransactionRequestor() == TRANSACTION_REQUESTOR(RF_FIELD_EVT))
+ {
+ pTransactionController->transactionEnd(TRANSACTION_REQUESTOR(RF_FIELD_EVT));
+ }
if(nfcManager_isTransanctionOnGoing(true))
{
return false;
@@ -2050,6 +2066,14 @@ static jint nfcManager_getRemainingAidTableSize (JNIEnv* , jobject )
static bool nfcManager_clearAidTable (JNIEnv*, jobject)
{
#if(NXP_EXTNS == TRUE)
+ /*In case of 66T/67T field on is observed as last field event once reader
+ is removed from proximity, which will hold the transaction lock unnecessarily
+ In such cases end the lock as it is not required*/
+ if(((nfcFL.chipType == pn548C2) || (nfcFL.chipType == pn551)) &&
+ pTransactionController->getCurTransactionRequestor() == TRANSACTION_REQUESTOR(RF_FIELD_EVT))
+ {
+ pTransactionController->transactionEnd(TRANSACTION_REQUESTOR(RF_FIELD_EVT));
+ }
if(nfcManager_isTransanctionOnGoing(true))
{
return false;
@@ -2139,6 +2163,7 @@ static jboolean nfcManager_doInitialize (JNIEnv* e, jobject o)
tNFA_PMID ven_config_addr[] = {0xA0, 0x07};
bool isSuccess = false;
sNfcee_disc_state = UICC_SESSION_NOT_INTIALIZED;
+ IsEseCeDisabled = false;
/* NFC initialization in progress */
if(NFC_OFF == sNfcState)
@@ -2187,6 +2212,11 @@ static jboolean nfcManager_doInitialize (JNIEnv* e, jobject o)
#endif
stat = nfcManagerEnableNfc(theInstance);
nfcManager_getFeatureList();
+ if(nfcFL.nfcNxpEse){
+ ALOGV("ESE Present Loading p61-jcop-lib");
+ pJcopMgr->JcopInitialize();
+ }else
+ ALOGV("ESE Not Present");
EXTNS_Init (nfaDeviceManagementCallback, nfaConnectionCallback);
if (stat == NFA_STATUS_OK )
@@ -2229,6 +2259,8 @@ static jboolean nfcManager_doInitialize (JNIEnv* e, jobject o)
ALOGV("All ESE are discovered ");
}
}
+ //Create transaction controller
+ (void)transactionController::controller();
if(nfcFL.nfccFL._NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH) {
checkforESERemoval();
GetNxpNumValue (NAME_NXP_DUAL_UICC_ENABLE, (void*)&dualUiccInfo.dualUiccEnable, sizeof(dualUiccInfo.dualUiccEnable));
@@ -2286,6 +2318,19 @@ static jboolean nfcManager_doInitialize (JNIEnv* e, jobject o)
/////////////////////////////////////////////////////////////////////////////////
// Add extra configuration here (work-arounds, etc.)
#if (NXP_EXTNS == TRUE)
+ if(IsEseCeDisabled)
+ {
+ ALOGV("CE with ESE is disable, Hence reset the session");
+ stat = android::ResetEseSession();
+ if(stat == NFA_STATUS_OK)
+ {
+ SecureElement::getInstance().SecEle_Modeset(0x00);
+ usleep(50*1000);
+ SecureElement::getInstance().SecEle_Modeset(0x01);
+ }
+ IsEseCeDisabled = false;
+ }
+
if(nfcFL.nfcNxpEse) {
if(nfcFL.eseFL._ESE_SVDD_SYNC || nfcFL.eseFL._ESE_JCOP_DWNLD_PROTECTION ||
nfcFL.nfccFL._NFCC_SPI_FW_DOWNLOAD_SYNC ||
@@ -2300,8 +2345,6 @@ static jboolean nfcManager_doInitialize (JNIEnv* e, jobject o)
}
}
#endif
- //Create transaction controller
- (void)transactionController::controller();
pendingScreenState = false;
{
SyncEventGuard guard (android::sNfaGetConfigEvent);
@@ -2854,7 +2897,7 @@ static void nfcManager_enableDiscovery (JNIEnv* e, jobject o, jint technologies_
handle = SecureElement::getInstance().getEseHandleFromGenericId(SecureElement::UICC_ID);
#if(NXP_EXTNS == TRUE)
- if((getScreenState() == (NFA_SCREEN_STATE_ON_LOCKED)) || sProvisionMode)
+ if((getScreenState() == (NFA_SCREEN_STATE_ON_UNLOCKED)) || sProvisionMode)
{
ALOGV("%s: Enable p2pListening", __func__);
PeerToPeer::getInstance().enableP2pListening (true);
@@ -3341,6 +3384,11 @@ if(nfcFL.eseFL._JCOP_WA_ENABLE) {
if(nfcFL.eseFL._JCOP_WA_ENABLE) {
NFA_HciW4eSETransaction_Complete(Wait);
}
+ if(nfcFL.nfcNxpEse){
+ ALOGV("De-Initializing p61-jcop-lib library");
+ pJcopMgr->JcopDeInitialize();
+ pJcopMgr->deleteInstance();
+ }
pn544InteropAbortNow ();
RoutingManager::getInstance().onNfccShutdown();
@@ -5540,14 +5588,14 @@ static int nfcManager_doJcosDownload(JNIEnv* /* e */, jobject /* o */)
if(nfcFL.nfcNxpEse) {
ALOGV("%s: enter", __func__);
bool stat = false;
+ int ret_val = -1;
+ NFCSTATUS ese_status = NFA_STATUS_FAILED;
+ p61_access_state_t p61_current_state = P61_STATE_INVALID;
+ eScreenState_t last_screen_state_request = get_lastScreenStateRequest();
SecureElement &se = SecureElement::getInstance();
if(nfcFL.eseFL._ESE_JCOP_DWNLD_PROTECTION) {
- int ret_val = -1;
- NFCSTATUS ese_status = NFA_STATUS_FAILED;
- p61_access_state_t p61_current_state = P61_STATE_INVALID;
- eScreenState_t last_screen_state_request = get_lastScreenStateRequest();
if (sIsDisabling || !sIsNfaEnabled || nfcManager_checkNfcStateBusy())
{
@@ -5592,12 +5640,14 @@ static int nfcManager_doJcosDownload(JNIEnv* /* e */, jobject /* o */)
return NFA_STATUS_FAILED;
}
}
+ }
+ }
if (sRfEnabled) {
// Stop RF Discovery if we were polling
startRfDiscovery (false);
}
DWPChannel_init(&Dwp);
- status = JCDNLD_Init(&Dwp);
+ status = pJcopMgr->JCDnldInit(&Dwp);
if(status != NFA_STATUS_OK)
{
ALOGE("%s: JCDND initialization failed", __func__);
@@ -5606,7 +5656,7 @@ static int nfcManager_doJcosDownload(JNIEnv* /* e */, jobject /* o */)
{
ALOGE("%s: start JcopOs_Download", __func__);
se.mDownloadMode = JCOP_DOWNLOAD;
- status = JCDNLD_StartDownload();
+ status = pJcopMgr->JCDnldStartDownload();
}
if(nfcFL.eseFL._ESE_JCOP_DWNLD_PROTECTION) {
ret_val = NFC_SetP61Status ((void *)&ese_status, JCP_DWP_DWNLD_COMPLETE);
@@ -5623,7 +5673,7 @@ static int nfcManager_doJcosDownload(JNIEnv* /* e */, jobject /* o */)
}
}
}
- stat = JCDNLD_DeInit();
+ stat = pJcopMgr->JCDnldDeInit();
if(nfcFL.eseFL._ESE_JCOP_DWNLD_PROTECTION) {
pTransactionController->transactionEnd(TRANSACTION_REQUESTOR(jcosDownload));
if(pendingScreenState == true)
@@ -5633,8 +5683,6 @@ static int nfcManager_doJcosDownload(JNIEnv* /* e */, jobject /* o */)
nfcManager_doSetScreenState(NULL,NULL,last_screen_state_request);
}
}
- }
- }
startRfDiscovery (true);
se.mDownloadMode = NONE;
ALOGV("%s: exit; status =0x%X", __func__,status);
@@ -5704,11 +5752,6 @@ static void nfcManager_doCommitRouting(JNIEnv* e, jobject o)
startRfDiscovery(true);
#if(NXP_EXTNS == TRUE && NXP_NFCC_HCE_F == TRUE)
}
-#endif
-
- RoutingManager::getInstance().commitRouting();
- startRfDiscovery(true);
-#if(NXP_EXTNS == TRUE && NXP_NFCC_HCE_F == TRUE)
pTransactionController->transactionEnd(TRANSACTION_REQUESTOR(commitRouting));
#endif
ALOGV("%s: exit", __func__);
@@ -5831,7 +5874,7 @@ static void nfcManager_doSetScreenState (JNIEnv* /* e */, jobject /* o */, jint
return;
}
#endif
-
+ pendingScreenState = false;
int prevScreenState = getScreenState();
if(prevScreenState == state) {
ALOGV("Screen state is not changed. ");
@@ -6005,13 +6048,13 @@ static void nfcManager_doSetScreenState (JNIEnv* /* e */, jobject /* o */, jint
static void nfcManager_doSetScreenOrPowerState (JNIEnv* e, jobject o, jint state)
{
ALOGE("%s: Enter", __func__);
- if (state <= NFA_SCREEN_STATE_ON_UNLOCKED ) // SCREEN_STATE
+ if ((state & NFA_SCREEN_STATE_MASK) <= NFA_SCREEN_STATE_ON_UNLOCKED ) // SCREEN_STATE
nfcManager_doSetScreenState(e, o, state);
- else if (state == VEN_POWER_STATE_ON) // POWER_ON NFC_OFF
+ else if ((state & NFA_SCREEN_STATE_MASK) == VEN_POWER_STATE_ON) // POWER_ON NFC_OFF
{
nfcManager_doSetNfcMode(e , o, NFC_MODE_OFF);
}
- else if (state == VEN_POWER_STATE_OFF) // POWER_OFF
+ else if ((state & NFA_SCREEN_STATE_MASK) == VEN_POWER_STATE_OFF) // POWER_OFF
{
if(sIsNfaEnabled)
{
@@ -6041,7 +6084,6 @@ static void nfcManager_doSetScreenOrPowerState (JNIEnv* e, jobject o, jint state
bool nfcManager_isRequestPending(void)
{
bool isPending = false;
-
if((transaction_data.current_transcation_state != NFA_TRANS_ACTIVATED_EVT) &&
((pendingScreenState == true) || (get_last_request() != 0x00)))
{
@@ -6441,12 +6483,7 @@ void *enableThread(void *arg)
if(nfcFL.chipType != pn547C2) {
set_AGC_process_state(false);
}
-#if (NXP_EXTNS == TRUE)
- if(!pTransactionController->transactionTerminate(TRANSACTION_REQUESTOR(exec_pending_req)))
- {
- ALOGE("%s: Transaction in progress. Can not reset", __func__);
- }
-#endif
+
bool screen_lock_flag = false;
bool disable_discovery = false;