Home | History | Annotate | Download | only in jni
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <semaphore.h>
     18 #include <errno.h>
     19 #include "OverrideLog.h"
     20 #include "NfcJniUtil.h"
     21 #include "NfcAdaptation.h"
     22 #include "SyncEvent.h"
     23 #include "PeerToPeer.h"
     24 #include "SecureElement.h"
     25 #include "RoutingManager.h"
     26 #include "NfcTag.h"
     27 #include "config.h"
     28 #include "PowerSwitch.h"
     29 #include "JavaClassConstants.h"
     30 #include "Pn544Interop.h"
     31 #include <ScopedLocalRef.h>
     32 #include <ScopedUtfChars.h>
     33 #include <ScopedPrimitiveArray.h>
     34 
     35 extern "C"
     36 {
     37     #include "nfa_api.h"
     38     #include "nfa_p2p_api.h"
     39     #include "rw_api.h"
     40     #include "nfa_ee_api.h"
     41     #include "nfc_brcm_defs.h"
     42     #include "ce_api.h"
     43 }
     44 
     45 extern UINT8 *p_nfa_dm_start_up_cfg;
     46 extern const UINT8 nfca_version_string [];
     47 extern const UINT8 nfa_version_string [];
     48 extern tNFA_DM_DISC_FREQ_CFG* p_nfa_dm_rf_disc_freq_cfg; //defined in stack
     49 namespace android
     50 {
     51     extern bool gIsTagDeactivating;
     52     extern bool gIsSelectingRfInterface;
     53     extern void nativeNfcTag_doTransceiveStatus (uint8_t * buf, uint32_t buflen);
     54     extern void nativeNfcTag_notifyRfTimeout ();
     55     extern void nativeNfcTag_doConnectStatus (jboolean is_connect_ok);
     56     extern void nativeNfcTag_doDeactivateStatus (int status);
     57     extern void nativeNfcTag_doWriteStatus (jboolean is_write_ok);
     58     extern void nativeNfcTag_doCheckNdefResult (tNFA_STATUS status, uint32_t max_size, uint32_t current_size, uint8_t flags);
     59     extern void nativeNfcTag_doMakeReadonlyResult (tNFA_STATUS status);
     60     extern void nativeNfcTag_doPresenceCheckResult (tNFA_STATUS status);
     61     extern void nativeNfcTag_formatStatus (bool is_ok);
     62     extern void nativeNfcTag_resetPresenceCheck ();
     63     extern void nativeNfcTag_doReadCompleted (tNFA_STATUS status);
     64     extern void nativeNfcTag_abortWaits ();
     65     extern void nativeLlcpConnectionlessSocket_abortWait ();
     66     extern void nativeNfcTag_registerNdefTypeHandler ();
     67     extern void nativeLlcpConnectionlessSocket_receiveData (uint8_t* data, uint32_t len, uint32_t remote_sap);
     68 }
     69 
     70 
     71 /*****************************************************************************
     72 **
     73 ** public variables and functions
     74 **
     75 *****************************************************************************/
     76 bool                        gActivated = false;
     77 SyncEvent                   gDeactivatedEvent;
     78 
     79 namespace android
     80 {
     81     jmethodID               gCachedNfcManagerNotifyNdefMessageListeners;
     82     jmethodID               gCachedNfcManagerNotifyTransactionListeners;
     83     jmethodID               gCachedNfcManagerNotifyLlcpLinkActivation;
     84     jmethodID               gCachedNfcManagerNotifyLlcpLinkDeactivated;
     85     jmethodID               gCachedNfcManagerNotifyLlcpFirstPacketReceived;
     86     jmethodID               gCachedNfcManagerNotifySeFieldActivated;
     87     jmethodID               gCachedNfcManagerNotifySeFieldDeactivated;
     88     jmethodID               gCachedNfcManagerNotifySeListenActivated;
     89     jmethodID               gCachedNfcManagerNotifySeListenDeactivated;
     90     jmethodID               gCachedNfcManagerNotifyHostEmuActivated;
     91     jmethodID               gCachedNfcManagerNotifyHostEmuData;
     92     jmethodID               gCachedNfcManagerNotifyHostEmuDeactivated;
     93     const char*             gNativeP2pDeviceClassName                 = "com/android/nfc/dhimpl/NativeP2pDevice";
     94     const char*             gNativeLlcpServiceSocketClassName         = "com/android/nfc/dhimpl/NativeLlcpServiceSocket";
     95     const char*             gNativeLlcpConnectionlessSocketClassName  = "com/android/nfc/dhimpl/NativeLlcpConnectionlessSocket";
     96     const char*             gNativeLlcpSocketClassName                = "com/android/nfc/dhimpl/NativeLlcpSocket";
     97     const char*             gNativeNfcTagClassName                    = "com/android/nfc/dhimpl/NativeNfcTag";
     98     const char*             gNativeNfcManagerClassName                = "com/android/nfc/dhimpl/NativeNfcManager";
     99     const char*             gNativeNfcSecureElementClassName          = "com/android/nfc/dhimpl/NativeNfcSecureElement";
    100     void                    doStartupConfig ();
    101     void                    startStopPolling (bool isStartPolling);
    102     void                    startRfDiscovery (bool isStart);
    103     void                    setUiccIdleTimeout (bool enable);
    104     void                    restartPollingWithTechMask(int mask);
    105 }
    106 
    107 
    108 /*****************************************************************************
    109 **
    110 ** private variables and functions
    111 **
    112 *****************************************************************************/
    113 namespace android
    114 {
    115 static jint                 sLastError = ERROR_BUFFER_TOO_SMALL;
    116 static jmethodID            sCachedNfcManagerNotifySeApduReceived;
    117 static jmethodID            sCachedNfcManagerNotifySeMifareAccess;
    118 static jmethodID            sCachedNfcManagerNotifySeEmvCardRemoval;
    119 static jmethodID            sCachedNfcManagerNotifyTargetDeselected;
    120 static SyncEvent            sNfaEnableEvent;  //event for NFA_Enable()
    121 static SyncEvent            sNfaDisableEvent;  //event for NFA_Disable()
    122 static SyncEvent            sNfaEnableDisablePollingEvent;  //event for NFA_EnablePolling(), NFA_DisablePolling()
    123 static SyncEvent            sNfaSetConfigEvent;  // event for Set_Config....
    124 static SyncEvent            sNfaGetConfigEvent;  // event for Get_Config....
    125 static bool                 sIsNfaEnabled = false;
    126 static bool                 sDiscoveryEnabled = false;  //is polling for tag?
    127 static bool                 sIsDisabling = false;
    128 static bool                 sRfEnabled = false; // whether RF discovery is enabled
    129 static bool                 sSeRfActive = false;  // whether RF with SE is likely active
    130 static bool                 sReaderModeEnabled = false; // whether we're only reading tags, not allowing P2p/card emu
    131 static bool                 sP2pActive = false; // whether p2p was last active
    132 static bool                 sAbortConnlessWait = false;
    133 static bool                 sIsSecElemSelected = false;  //has NFC service selected a sec elem
    134 #define CONFIG_UPDATE_TECH_MASK     (1 << 1)
    135 #define DEFAULT_TECH_MASK           (NFA_TECHNOLOGY_MASK_A \
    136                                      | NFA_TECHNOLOGY_MASK_B \
    137                                      | NFA_TECHNOLOGY_MASK_F \
    138                                      | NFA_TECHNOLOGY_MASK_ISO15693 \
    139                                      | NFA_TECHNOLOGY_MASK_B_PRIME \
    140                                      | NFA_TECHNOLOGY_MASK_A_ACTIVE \
    141                                      | NFA_TECHNOLOGY_MASK_F_ACTIVE \
    142                                      | NFA_TECHNOLOGY_MASK_KOVIO)
    143 #define DEFAULT_DISCOVERY_DURATION       500
    144 #define READER_MODE_DISCOVERY_DURATION   200
    145 
    146 static void nfaConnectionCallback (UINT8 event, tNFA_CONN_EVT_DATA *eventData);
    147 static void nfaDeviceManagementCallback (UINT8 event, tNFA_DM_CBACK_DATA *eventData);
    148 static bool isPeerToPeer (tNFA_ACTIVATED& activated);
    149 static bool isListenMode(tNFA_ACTIVATED& activated);
    150 
    151 static UINT16 sCurrentConfigLen;
    152 static UINT8 sConfig[256];
    153 static UINT8 sLongGuardTime[] = { 0x00, 0x20 };
    154 static UINT8 sDefaultGuardTime[] = { 0x00, 0x11 };
    155 
    156 /////////////////////////////////////////////////////////////
    157 /////////////////////////////////////////////////////////////
    158 
    159 
    160 /*******************************************************************************
    161 **
    162 ** Function:        getNative
    163 **
    164 ** Description:     Get native data
    165 **
    166 ** Returns:         Native data structure.
    167 **
    168 *******************************************************************************/
    169 nfc_jni_native_data *getNative (JNIEnv* e, jobject o)
    170 {
    171     static struct nfc_jni_native_data *sCachedNat = NULL;
    172     if (e)
    173     {
    174         sCachedNat = nfc_jni_get_nat(e, o);
    175     }
    176     return sCachedNat;
    177 }
    178 
    179 
    180 /*******************************************************************************
    181 **
    182 ** Function:        handleRfDiscoveryEvent
    183 **
    184 ** Description:     Handle RF-discovery events from the stack.
    185 **                  discoveredDevice: Discovered device.
    186 **
    187 ** Returns:         None
    188 **
    189 *******************************************************************************/
    190 static void handleRfDiscoveryEvent (tNFC_RESULT_DEVT* discoveredDevice)
    191 {
    192     if (discoveredDevice->more)
    193     {
    194         //there is more discovery notification coming
    195         return;
    196     }
    197 
    198     bool isP2p = NfcTag::getInstance ().isP2pDiscovered ();
    199     if (!sReaderModeEnabled && isP2p)
    200     {
    201         //select the peer that supports P2P
    202         NfcTag::getInstance ().selectP2p();
    203     }
    204     else
    205     {
    206         //select the first of multiple tags that is discovered
    207         NfcTag::getInstance ().selectFirstTag();
    208     }
    209 }
    210 
    211 
    212 /*******************************************************************************
    213 **
    214 ** Function:        nfaConnectionCallback
    215 **
    216 ** Description:     Receive connection-related events from stack.
    217 **                  connEvent: Event code.
    218 **                  eventData: Event data.
    219 **
    220 ** Returns:         None
    221 **
    222 *******************************************************************************/
    223 static void nfaConnectionCallback (UINT8 connEvent, tNFA_CONN_EVT_DATA* eventData)
    224 {
    225     tNFA_STATUS status = NFA_STATUS_FAILED;
    226     ALOGD("%s: event= %u", __FUNCTION__, connEvent);
    227 
    228     switch (connEvent)
    229     {
    230     case NFA_POLL_ENABLED_EVT: // whether polling successfully started
    231         {
    232             ALOGD("%s: NFA_POLL_ENABLED_EVT: status = %u", __FUNCTION__, eventData->status);
    233 
    234             SyncEventGuard guard (sNfaEnableDisablePollingEvent);
    235             sNfaEnableDisablePollingEvent.notifyOne ();
    236         }
    237         break;
    238 
    239     case NFA_POLL_DISABLED_EVT: // Listening/Polling stopped
    240         {
    241             ALOGD("%s: NFA_POLL_DISABLED_EVT: status = %u", __FUNCTION__, eventData->status);
    242 
    243             SyncEventGuard guard (sNfaEnableDisablePollingEvent);
    244             sNfaEnableDisablePollingEvent.notifyOne ();
    245         }
    246         break;
    247 
    248     case NFA_RF_DISCOVERY_STARTED_EVT: // RF Discovery started
    249         {
    250             ALOGD("%s: NFA_RF_DISCOVERY_STARTED_EVT: status = %u", __FUNCTION__, eventData->status);
    251 
    252             SyncEventGuard guard (sNfaEnableDisablePollingEvent);
    253             sNfaEnableDisablePollingEvent.notifyOne ();
    254         }
    255         break;
    256 
    257     case NFA_RF_DISCOVERY_STOPPED_EVT: // RF Discovery stopped event
    258         {
    259             ALOGD("%s: NFA_RF_DISCOVERY_STOPPED_EVT: status = %u", __FUNCTION__, eventData->status);
    260 
    261             SyncEventGuard guard (sNfaEnableDisablePollingEvent);
    262             sNfaEnableDisablePollingEvent.notifyOne ();
    263         }
    264         break;
    265 
    266     case NFA_DISC_RESULT_EVT: // NFC link/protocol discovery notificaiton
    267         status = eventData->disc_result.status;
    268         ALOGD("%s: NFA_DISC_RESULT_EVT: status = %d", __FUNCTION__, status);
    269         if (status != NFA_STATUS_OK)
    270         {
    271             ALOGE("%s: NFA_DISC_RESULT_EVT error: status = %d", __FUNCTION__, status);
    272         }
    273         else
    274         {
    275             NfcTag::getInstance().connectionEventHandler(connEvent, eventData);
    276             handleRfDiscoveryEvent(&eventData->disc_result.discovery_ntf);
    277         }
    278         break;
    279 
    280     case NFA_SELECT_RESULT_EVT: // NFC link/protocol discovery select response
    281         ALOGD("%s: NFA_SELECT_RESULT_EVT: status = %d, gIsSelectingRfInterface = %d, sIsDisabling=%d", __FUNCTION__, eventData->status, gIsSelectingRfInterface, sIsDisabling);
    282 
    283         if (sIsDisabling)
    284             break;
    285 
    286         if (eventData->status != NFA_STATUS_OK)
    287         {
    288             if (gIsSelectingRfInterface)
    289             {
    290                 nativeNfcTag_doConnectStatus(false);
    291             }
    292 
    293             ALOGE("%s: NFA_SELECT_RESULT_EVT error: status = %d", __FUNCTION__, eventData->status);
    294             NFA_Deactivate (FALSE);
    295         }
    296         break;
    297 
    298     case NFA_DEACTIVATE_FAIL_EVT:
    299         ALOGD("%s: NFA_DEACTIVATE_FAIL_EVT: status = %d", __FUNCTION__, eventData->status);
    300         break;
    301 
    302     case NFA_ACTIVATED_EVT: // NFC link/protocol activated
    303         ALOGD("%s: NFA_ACTIVATED_EVT: gIsSelectingRfInterface=%d, sIsDisabling=%d", __FUNCTION__, gIsSelectingRfInterface, sIsDisabling);
    304         NfcTag::getInstance().setActive(true);
    305         if (sIsDisabling || !sIsNfaEnabled)
    306             break;
    307         gActivated = true;
    308 
    309         NfcTag::getInstance().setActivationState ();
    310         if (gIsSelectingRfInterface)
    311         {
    312             nativeNfcTag_doConnectStatus(true);
    313             break;
    314         }
    315 
    316         nativeNfcTag_resetPresenceCheck();
    317         if (isPeerToPeer(eventData->activated))
    318         {
    319             if (sReaderModeEnabled)
    320             {
    321                 ALOGD("%s: ignoring peer target in reader mode.", __FUNCTION__);
    322                 NFA_Deactivate (FALSE);
    323                 break;
    324             }
    325             sP2pActive = true;
    326             ALOGD("%s: NFA_ACTIVATED_EVT; is p2p", __FUNCTION__);
    327             // Disable RF field events in case of p2p
    328             UINT8  nfa_disable_rf_events[] = { 0x00 };
    329             ALOGD ("%s: Disabling RF field events", __FUNCTION__);
    330             status = NFA_SetConfig(NCI_PARAM_ID_RF_FIELD_INFO, sizeof(nfa_disable_rf_events),
    331                     &nfa_disable_rf_events[0]);
    332             if (status == NFA_STATUS_OK) {
    333                 ALOGD ("%s: Disabled RF field events", __FUNCTION__);
    334             } else {
    335                 ALOGE ("%s: Failed to disable RF field events", __FUNCTION__);
    336             }
    337             // For the SE, consider the field to be on while p2p is active.
    338             SecureElement::getInstance().notifyRfFieldEvent (true);
    339         }
    340         else if (pn544InteropIsBusy() == false)
    341         {
    342             NfcTag::getInstance().connectionEventHandler (connEvent, eventData);
    343 
    344             // We know it is not activating for P2P.  If it activated in
    345             // listen mode then it is likely for an SE transaction.
    346             // Send the RF Event.
    347             if (isListenMode(eventData->activated))
    348             {
    349                 sSeRfActive = true;
    350                 SecureElement::getInstance().notifyListenModeState (true);
    351             }
    352         }
    353         break;
    354 
    355     case NFA_DEACTIVATED_EVT: // NFC link/protocol deactivated
    356         ALOGD("%s: NFA_DEACTIVATED_EVT   Type: %u, gIsTagDeactivating: %d", __FUNCTION__, eventData->deactivated.type,gIsTagDeactivating);
    357         NfcTag::getInstance().setDeactivationState (eventData->deactivated);
    358         if (eventData->deactivated.type != NFA_DEACTIVATE_TYPE_SLEEP)
    359         {
    360             {
    361                 SyncEventGuard g (gDeactivatedEvent);
    362                 gActivated = false; //guard this variable from multi-threaded access
    363                 gDeactivatedEvent.notifyOne ();
    364             }
    365             nativeNfcTag_resetPresenceCheck();
    366             NfcTag::getInstance().connectionEventHandler (connEvent, eventData);
    367             nativeNfcTag_abortWaits();
    368             NfcTag::getInstance().abort ();
    369         }
    370         else if (gIsTagDeactivating)
    371         {
    372             NfcTag::getInstance().setActive(false);
    373             nativeNfcTag_doDeactivateStatus(0);
    374         }
    375 
    376         // If RF is activated for what we think is a Secure Element transaction
    377         // and it is deactivated to either IDLE or DISCOVERY mode, notify w/event.
    378         if ((eventData->deactivated.type == NFA_DEACTIVATE_TYPE_IDLE)
    379                 || (eventData->deactivated.type == NFA_DEACTIVATE_TYPE_DISCOVERY))
    380         {
    381             if (sSeRfActive) {
    382                 sSeRfActive = false;
    383                 if (!sIsDisabling && sIsNfaEnabled)
    384                     SecureElement::getInstance().notifyListenModeState (false);
    385             } else if (sP2pActive) {
    386                 sP2pActive = false;
    387                 // Make sure RF field events are re-enabled
    388                 ALOGD("%s: NFA_DEACTIVATED_EVT; is p2p", __FUNCTION__);
    389                 // Disable RF field events in case of p2p
    390                 UINT8  nfa_enable_rf_events[] = { 0x01 };
    391 
    392                 if (!sIsDisabling && sIsNfaEnabled)
    393                 {
    394                     ALOGD ("%s: Enabling RF field events", __FUNCTION__);
    395                     status = NFA_SetConfig(NCI_PARAM_ID_RF_FIELD_INFO, sizeof(nfa_enable_rf_events),
    396                             &nfa_enable_rf_events[0]);
    397                     if (status == NFA_STATUS_OK) {
    398                         ALOGD ("%s: Enabled RF field events", __FUNCTION__);
    399                     } else {
    400                         ALOGE ("%s: Failed to enable RF field events", __FUNCTION__);
    401                     }
    402                     // Consider the field to be off at this point
    403                     SecureElement::getInstance().notifyRfFieldEvent (false);
    404                 }
    405             }
    406         }
    407 
    408         break;
    409 
    410     case NFA_TLV_DETECT_EVT: // TLV Detection complete
    411         status = eventData->tlv_detect.status;
    412         ALOGD("%s: NFA_TLV_DETECT_EVT: status = %d, protocol = %d, num_tlvs = %d, num_bytes = %d",
    413              __FUNCTION__, status, eventData->tlv_detect.protocol,
    414              eventData->tlv_detect.num_tlvs, eventData->tlv_detect.num_bytes);
    415         if (status != NFA_STATUS_OK)
    416         {
    417             ALOGE("%s: NFA_TLV_DETECT_EVT error: status = %d", __FUNCTION__, status);
    418         }
    419         break;
    420 
    421     case NFA_NDEF_DETECT_EVT: // NDEF Detection complete;
    422         //if status is failure, it means the tag does not contain any or valid NDEF data;
    423         //pass the failure status to the NFC Service;
    424         status = eventData->ndef_detect.status;
    425         ALOGD("%s: NFA_NDEF_DETECT_EVT: status = 0x%X, protocol = %u, "
    426              "max_size = %lu, cur_size = %lu, flags = 0x%X", __FUNCTION__,
    427              status,
    428              eventData->ndef_detect.protocol, eventData->ndef_detect.max_size,
    429              eventData->ndef_detect.cur_size, eventData->ndef_detect.flags);
    430         NfcTag::getInstance().connectionEventHandler (connEvent, eventData);
    431         nativeNfcTag_doCheckNdefResult(status,
    432             eventData->ndef_detect.max_size, eventData->ndef_detect.cur_size,
    433             eventData->ndef_detect.flags);
    434         break;
    435 
    436     case NFA_DATA_EVT: // Data message received (for non-NDEF reads)
    437         ALOGD("%s: NFA_DATA_EVT:  len = %d", __FUNCTION__, eventData->data.len);
    438         nativeNfcTag_doTransceiveStatus(eventData->data.p_data,eventData->data.len);
    439         break;
    440     case NFA_RW_INTF_ERROR_EVT:
    441         ALOGD("%s: NFC_RW_INTF_ERROR_EVT", __FUNCTION__);
    442         nativeNfcTag_notifyRfTimeout();
    443         break;
    444     case NFA_SELECT_CPLT_EVT: // Select completed
    445         status = eventData->status;
    446         ALOGD("%s: NFA_SELECT_CPLT_EVT: status = %d", __FUNCTION__, status);
    447         if (status != NFA_STATUS_OK)
    448         {
    449             ALOGE("%s: NFA_SELECT_CPLT_EVT error: status = %d", __FUNCTION__, status);
    450         }
    451         break;
    452 
    453     case NFA_READ_CPLT_EVT: // NDEF-read or tag-specific-read completed
    454         ALOGD("%s: NFA_READ_CPLT_EVT: status = 0x%X", __FUNCTION__, eventData->status);
    455         nativeNfcTag_doReadCompleted (eventData->status);
    456         NfcTag::getInstance().connectionEventHandler (connEvent, eventData);
    457         break;
    458 
    459     case NFA_WRITE_CPLT_EVT: // Write completed
    460         ALOGD("%s: NFA_WRITE_CPLT_EVT: status = %d", __FUNCTION__, eventData->status);
    461         nativeNfcTag_doWriteStatus (eventData->status == NFA_STATUS_OK);
    462         break;
    463 
    464     case NFA_SET_TAG_RO_EVT: // Tag set as Read only
    465         ALOGD("%s: NFA_SET_TAG_RO_EVT: status = %d", __FUNCTION__, eventData->status);
    466         nativeNfcTag_doMakeReadonlyResult(eventData->status);
    467         break;
    468 
    469     case NFA_CE_NDEF_WRITE_START_EVT: // NDEF write started
    470         ALOGD("%s: NFA_CE_NDEF_WRITE_START_EVT: status: %d", __FUNCTION__, eventData->status);
    471 
    472         if (eventData->status != NFA_STATUS_OK)
    473             ALOGE("%s: NFA_CE_NDEF_WRITE_START_EVT error: status = %d", __FUNCTION__, eventData->status);
    474         break;
    475 
    476     case NFA_CE_NDEF_WRITE_CPLT_EVT: // NDEF write completed
    477         ALOGD("%s: FA_CE_NDEF_WRITE_CPLT_EVT: len = %lu", __FUNCTION__, eventData->ndef_write_cplt.len);
    478         break;
    479 
    480     case NFA_LLCP_ACTIVATED_EVT: // LLCP link is activated
    481         ALOGD("%s: NFA_LLCP_ACTIVATED_EVT: is_initiator: %d  remote_wks: %d, remote_lsc: %d, remote_link_miu: %d, local_link_miu: %d",
    482              __FUNCTION__,
    483              eventData->llcp_activated.is_initiator,
    484              eventData->llcp_activated.remote_wks,
    485              eventData->llcp_activated.remote_lsc,
    486              eventData->llcp_activated.remote_link_miu,
    487              eventData->llcp_activated.local_link_miu);
    488 
    489         PeerToPeer::getInstance().llcpActivatedHandler (getNative(0, 0), eventData->llcp_activated);
    490         break;
    491 
    492     case NFA_LLCP_DEACTIVATED_EVT: // LLCP link is deactivated
    493         ALOGD("%s: NFA_LLCP_DEACTIVATED_EVT", __FUNCTION__);
    494         PeerToPeer::getInstance().llcpDeactivatedHandler (getNative(0, 0), eventData->llcp_deactivated);
    495         break;
    496     case NFA_LLCP_FIRST_PACKET_RECEIVED_EVT: // Received first packet over llcp
    497         ALOGD("%s: NFA_LLCP_FIRST_PACKET_RECEIVED_EVT", __FUNCTION__);
    498         PeerToPeer::getInstance().llcpFirstPacketHandler (getNative(0, 0));
    499         break;
    500     case NFA_PRESENCE_CHECK_EVT:
    501         ALOGD("%s: NFA_PRESENCE_CHECK_EVT", __FUNCTION__);
    502         nativeNfcTag_doPresenceCheckResult (eventData->status);
    503         break;
    504     case NFA_FORMAT_CPLT_EVT:
    505         ALOGD("%s: NFA_FORMAT_CPLT_EVT: status=0x%X", __FUNCTION__, eventData->status);
    506         nativeNfcTag_formatStatus (eventData->status == NFA_STATUS_OK);
    507         break;
    508 
    509     case NFA_I93_CMD_CPLT_EVT:
    510         ALOGD("%s: NFA_I93_CMD_CPLT_EVT: status=0x%X", __FUNCTION__, eventData->status);
    511         break;
    512 
    513     case NFA_CE_UICC_LISTEN_CONFIGURED_EVT :
    514         ALOGD("%s: NFA_CE_UICC_LISTEN_CONFIGURED_EVT : status=0x%X", __FUNCTION__, eventData->status);
    515         SecureElement::getInstance().connectionEventHandler (connEvent, eventData);
    516         break;
    517 
    518     case NFA_SET_P2P_LISTEN_TECH_EVT:
    519         ALOGD("%s: NFA_SET_P2P_LISTEN_TECH_EVT", __FUNCTION__);
    520         PeerToPeer::getInstance().connectionEventHandler (connEvent, eventData);
    521         break;
    522 
    523     default:
    524         ALOGE("%s: unknown event ????", __FUNCTION__);
    525         break;
    526     }
    527 }
    528 
    529 
    530 /*******************************************************************************
    531 **
    532 ** Function:        nfcManager_initNativeStruc
    533 **
    534 ** Description:     Initialize variables.
    535 **                  e: JVM environment.
    536 **                  o: Java object.
    537 **
    538 ** Returns:         True if ok.
    539 **
    540 *******************************************************************************/
    541 static jboolean nfcManager_initNativeStruc (JNIEnv* e, jobject o)
    542 {
    543     ALOGD ("%s: enter", __FUNCTION__);
    544 
    545     nfc_jni_native_data* nat = (nfc_jni_native_data*)malloc(sizeof(struct nfc_jni_native_data));
    546     if (nat == NULL)
    547     {
    548         ALOGE ("%s: fail allocate native data", __FUNCTION__);
    549         return JNI_FALSE;
    550     }
    551 
    552     memset (nat, 0, sizeof(*nat));
    553     e->GetJavaVM(&(nat->vm));
    554     nat->env_version = e->GetVersion();
    555     nat->manager = e->NewGlobalRef(o);
    556 
    557     ScopedLocalRef<jclass> cls(e, e->GetObjectClass(o));
    558     jfieldID f = e->GetFieldID(cls.get(), "mNative", "I");
    559     e->SetIntField(o, f, (jint)nat);
    560 
    561     /* Initialize native cached references */
    562     gCachedNfcManagerNotifyNdefMessageListeners = e->GetMethodID(cls.get(),
    563             "notifyNdefMessageListeners", "(Lcom/android/nfc/dhimpl/NativeNfcTag;)V");
    564     gCachedNfcManagerNotifyTransactionListeners = e->GetMethodID(cls.get(),
    565             "notifyTransactionListeners", "([B)V");
    566     gCachedNfcManagerNotifyLlcpLinkActivation = e->GetMethodID(cls.get(),
    567             "notifyLlcpLinkActivation", "(Lcom/android/nfc/dhimpl/NativeP2pDevice;)V");
    568     gCachedNfcManagerNotifyLlcpLinkDeactivated = e->GetMethodID(cls.get(),
    569             "notifyLlcpLinkDeactivated", "(Lcom/android/nfc/dhimpl/NativeP2pDevice;)V");
    570     gCachedNfcManagerNotifyLlcpFirstPacketReceived = e->GetMethodID(cls.get(),
    571             "notifyLlcpLinkFirstPacketReceived", "(Lcom/android/nfc/dhimpl/NativeP2pDevice;)V");
    572     sCachedNfcManagerNotifyTargetDeselected = e->GetMethodID(cls.get(),
    573             "notifyTargetDeselected","()V");
    574     gCachedNfcManagerNotifySeFieldActivated = e->GetMethodID(cls.get(),
    575             "notifySeFieldActivated", "()V");
    576     gCachedNfcManagerNotifySeFieldDeactivated = e->GetMethodID(cls.get(),
    577             "notifySeFieldDeactivated", "()V");
    578     gCachedNfcManagerNotifySeListenActivated = e->GetMethodID(cls.get(),
    579             "notifySeListenActivated", "()V");
    580     gCachedNfcManagerNotifySeListenDeactivated = e->GetMethodID(cls.get(),
    581             "notifySeListenDeactivated", "()V");
    582 
    583     gCachedNfcManagerNotifyHostEmuActivated = e->GetMethodID(cls.get(),
    584             "notifyHostEmuActivated", "()V");
    585 
    586     gCachedNfcManagerNotifyHostEmuData = e->GetMethodID(cls.get(),
    587             "notifyHostEmuData", "([B)V");
    588 
    589     gCachedNfcManagerNotifyHostEmuDeactivated = e->GetMethodID(cls.get(),
    590             "notifyHostEmuDeactivated", "()V");
    591 
    592     sCachedNfcManagerNotifySeApduReceived = e->GetMethodID(cls.get(),
    593             "notifySeApduReceived", "([B)V");
    594 
    595     sCachedNfcManagerNotifySeMifareAccess = e->GetMethodID(cls.get(),
    596             "notifySeMifareAccess", "([B)V");
    597 
    598     sCachedNfcManagerNotifySeEmvCardRemoval =  e->GetMethodID(cls.get(),
    599             "notifySeEmvCardRemoval", "()V");
    600 
    601     if (nfc_jni_cache_object(e, gNativeNfcTagClassName, &(nat->cached_NfcTag)) == -1)
    602     {
    603         ALOGE ("%s: fail cache NativeNfcTag", __FUNCTION__);
    604         return JNI_FALSE;
    605     }
    606 
    607     if (nfc_jni_cache_object(e, gNativeP2pDeviceClassName, &(nat->cached_P2pDevice)) == -1)
    608     {
    609         ALOGE ("%s: fail cache NativeP2pDevice", __FUNCTION__);
    610         return JNI_FALSE;
    611     }
    612 
    613     ALOGD ("%s: exit", __FUNCTION__);
    614     return JNI_TRUE;
    615 }
    616 
    617 
    618 /*******************************************************************************
    619 **
    620 ** Function:        nfaDeviceManagementCallback
    621 **
    622 ** Description:     Receive device management events from stack.
    623 **                  dmEvent: Device-management event ID.
    624 **                  eventData: Data associated with event ID.
    625 **
    626 ** Returns:         None
    627 **
    628 *******************************************************************************/
    629 void nfaDeviceManagementCallback (UINT8 dmEvent, tNFA_DM_CBACK_DATA* eventData)
    630 {
    631     ALOGD ("%s: enter; event=0x%X", __FUNCTION__, dmEvent);
    632 
    633     switch (dmEvent)
    634     {
    635     case NFA_DM_ENABLE_EVT: /* Result of NFA_Enable */
    636         {
    637             SyncEventGuard guard (sNfaEnableEvent);
    638             ALOGD ("%s: NFA_DM_ENABLE_EVT; status=0x%X",
    639                     __FUNCTION__, eventData->status);
    640             sIsNfaEnabled = eventData->status == NFA_STATUS_OK;
    641             sIsDisabling = false;
    642             sNfaEnableEvent.notifyOne ();
    643         }
    644         break;
    645 
    646     case NFA_DM_DISABLE_EVT: /* Result of NFA_Disable */
    647         {
    648             SyncEventGuard guard (sNfaDisableEvent);
    649             ALOGD ("%s: NFA_DM_DISABLE_EVT", __FUNCTION__);
    650             sIsNfaEnabled = false;
    651             sIsDisabling = false;
    652             sNfaDisableEvent.notifyOne ();
    653         }
    654         break;
    655 
    656     case NFA_DM_SET_CONFIG_EVT: //result of NFA_SetConfig
    657         ALOGD ("%s: NFA_DM_SET_CONFIG_EVT", __FUNCTION__);
    658         {
    659             SyncEventGuard guard (sNfaSetConfigEvent);
    660             sNfaSetConfigEvent.notifyOne();
    661         }
    662         break;
    663 
    664     case NFA_DM_GET_CONFIG_EVT: /* Result of NFA_GetConfig */
    665         ALOGD ("%s: NFA_DM_GET_CONFIG_EVT", __FUNCTION__);
    666         {
    667             SyncEventGuard guard (sNfaGetConfigEvent);
    668             if (eventData->status == NFA_STATUS_OK &&
    669                     eventData->get_config.tlv_size <= sizeof(sConfig))
    670             {
    671                 sCurrentConfigLen = eventData->get_config.tlv_size;
    672                 memcpy(sConfig, eventData->get_config.param_tlvs, eventData->get_config.tlv_size);
    673             }
    674             else
    675             {
    676                 ALOGE("%s: NFA_DM_GET_CONFIG failed", __FUNCTION__);
    677                 sCurrentConfigLen = 0;
    678             }
    679             sNfaGetConfigEvent.notifyOne();
    680         }
    681         break;
    682 
    683     case NFA_DM_RF_FIELD_EVT:
    684         ALOGD ("%s: NFA_DM_RF_FIELD_EVT; status=0x%X; field status=%u", __FUNCTION__,
    685               eventData->rf_field.status, eventData->rf_field.rf_field_status);
    686         if (sIsDisabling || !sIsNfaEnabled)
    687             break;
    688 
    689         if (!sP2pActive && eventData->rf_field.status == NFA_STATUS_OK)
    690             SecureElement::getInstance().notifyRfFieldEvent (
    691                     eventData->rf_field.rf_field_status == NFA_DM_RF_FIELD_ON);
    692         break;
    693 
    694     case NFA_DM_NFCC_TRANSPORT_ERR_EVT:
    695     case NFA_DM_NFCC_TIMEOUT_EVT:
    696         {
    697             if (dmEvent == NFA_DM_NFCC_TIMEOUT_EVT)
    698                 ALOGE ("%s: NFA_DM_NFCC_TIMEOUT_EVT; abort", __FUNCTION__);
    699             else if (dmEvent == NFA_DM_NFCC_TRANSPORT_ERR_EVT)
    700                 ALOGE ("%s: NFA_DM_NFCC_TRANSPORT_ERR_EVT; abort", __FUNCTION__);
    701 
    702             nativeNfcTag_abortWaits();
    703             NfcTag::getInstance().abort ();
    704             sAbortConnlessWait = true;
    705             nativeLlcpConnectionlessSocket_abortWait();
    706             {
    707                 ALOGD ("%s: aborting  sNfaEnableDisablePollingEvent", __FUNCTION__);
    708                 SyncEventGuard guard (sNfaEnableDisablePollingEvent);
    709                 sNfaEnableDisablePollingEvent.notifyOne();
    710             }
    711             {
    712                 ALOGD ("%s: aborting  sNfaEnableEvent", __FUNCTION__);
    713                 SyncEventGuard guard (sNfaEnableEvent);
    714                 sNfaEnableEvent.notifyOne();
    715             }
    716             {
    717                 ALOGD ("%s: aborting  sNfaDisableEvent", __FUNCTION__);
    718                 SyncEventGuard guard (sNfaDisableEvent);
    719                 sNfaDisableEvent.notifyOne();
    720             }
    721             sDiscoveryEnabled = false;
    722             PowerSwitch::getInstance ().abort ();
    723 
    724             if (!sIsDisabling && sIsNfaEnabled)
    725             {
    726                 NFA_Disable(FALSE);
    727                 sIsDisabling = true;
    728             }
    729             else
    730             {
    731                 sIsNfaEnabled = false;
    732                 sIsDisabling = false;
    733             }
    734             PowerSwitch::getInstance ().initialize (PowerSwitch::UNKNOWN_LEVEL);
    735             ALOGE ("%s: crash NFC service", __FUNCTION__);
    736             //////////////////////////////////////////////
    737             //crash the NFC service process so it can restart automatically
    738             abort ();
    739             //////////////////////////////////////////////
    740         }
    741         break;
    742 
    743     case NFA_DM_PWR_MODE_CHANGE_EVT:
    744         PowerSwitch::getInstance ().deviceManagementCallback (dmEvent, eventData);
    745         break;
    746 
    747     default:
    748         ALOGD ("%s: unhandled event", __FUNCTION__);
    749         break;
    750     }
    751 }
    752 
    753 /*******************************************************************************
    754 **
    755 ** Function:        nfcManager_sendRawFrame
    756 **
    757 ** Description:     Send a raw frame.
    758 **                  e: JVM environment.
    759 **                  o: Java object.
    760 **
    761 ** Returns:         True if ok.
    762 **
    763 *******************************************************************************/
    764 static jboolean nfcManager_sendRawFrame (JNIEnv* e, jobject, jbyteArray data)
    765 {
    766     ScopedByteArrayRO bytes(e, data);
    767     uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0]));
    768     size_t bufLen = bytes.size();
    769     tNFA_STATUS status = NFA_SendRawFrame (buf, bufLen, 0);
    770 
    771     return (status == NFA_STATUS_OK);
    772 }
    773 
    774 /*******************************************************************************
    775 **
    776 ** Function:        nfcManager_routeAid
    777 **
    778 ** Description:     Route an AID to an EE
    779 **                  e: JVM environment.
    780 **                  o: Java object.
    781 **
    782 ** Returns:         True if ok.
    783 **
    784 *******************************************************************************/
    785 static jboolean nfcManager_routeAid (JNIEnv* e, jobject, jbyteArray aid, jint route)
    786 {
    787     ScopedByteArrayRO bytes(e, aid);
    788     uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0]));
    789     size_t bufLen = bytes.size();
    790     bool result = RoutingManager::getInstance().addAidRouting(buf, bufLen, route);
    791     return result;
    792 }
    793 
    794 /*******************************************************************************
    795 **
    796 ** Function:        nfcManager_unrouteAid
    797 **
    798 ** Description:     Remove a AID routing
    799 **                  e: JVM environment.
    800 **                  o: Java object.
    801 **
    802 ** Returns:         True if ok.
    803 **
    804 *******************************************************************************/
    805 static jboolean nfcManager_unrouteAid (JNIEnv* e, jobject, jbyteArray aid)
    806 {
    807     ScopedByteArrayRO bytes(e, aid);
    808     uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0]));
    809     size_t bufLen = bytes.size();
    810     bool result = RoutingManager::getInstance().removeAidRouting(buf, bufLen);
    811     return result;
    812 }
    813 
    814 /*******************************************************************************
    815 **
    816 ** Function:        nfcManager_doInitialize
    817 **
    818 ** Description:     Turn on NFC.
    819 **                  e: JVM environment.
    820 **                  o: Java object.
    821 **
    822 ** Returns:         True if ok.
    823 **
    824 *******************************************************************************/
    825 static jboolean nfcManager_doInitialize (JNIEnv* e, jobject o)
    826 {
    827     ALOGD ("%s: enter; ver=%s nfa=%s NCI_VERSION=0x%02X",
    828         __FUNCTION__, nfca_version_string, nfa_version_string, NCI_VERSION);
    829     tNFA_STATUS stat = NFA_STATUS_OK;
    830 
    831     if (sIsNfaEnabled)
    832     {
    833         ALOGD ("%s: already enabled", __FUNCTION__);
    834         goto TheEnd;
    835     }
    836 
    837     PowerSwitch::getInstance ().initialize (PowerSwitch::FULL_POWER);
    838 
    839     {
    840         unsigned long num = 0;
    841 
    842         NfcAdaptation& theInstance = NfcAdaptation::GetInstance();
    843         theInstance.Initialize(); //start GKI, NCI task, NFC task
    844 
    845         {
    846             SyncEventGuard guard (sNfaEnableEvent);
    847             tHAL_NFC_ENTRY* halFuncEntries = theInstance.GetHalEntryFuncs ();
    848 
    849             NFA_Init (halFuncEntries);
    850 
    851             stat = NFA_Enable (nfaDeviceManagementCallback, nfaConnectionCallback);
    852             if (stat == NFA_STATUS_OK)
    853             {
    854                 num = initializeGlobalAppLogLevel ();
    855                 CE_SetTraceLevel (num);
    856                 LLCP_SetTraceLevel (num);
    857                 NFC_SetTraceLevel (num);
    858                 RW_SetTraceLevel (num);
    859                 NFA_SetTraceLevel (num);
    860                 NFA_P2pSetTraceLevel (num);
    861                 sNfaEnableEvent.wait(); //wait for NFA command to finish
    862             }
    863         }
    864 
    865         if (stat == NFA_STATUS_OK)
    866         {
    867             //sIsNfaEnabled indicates whether stack started successfully
    868             if (sIsNfaEnabled)
    869             {
    870                 SecureElement::getInstance().initialize (getNative(e, o));
    871                 RoutingManager::getInstance().initialize(getNative(e, o));
    872                 nativeNfcTag_registerNdefTypeHandler ();
    873                 NfcTag::getInstance().initialize (getNative(e, o));
    874                 PeerToPeer::getInstance().initialize ();
    875                 PeerToPeer::getInstance().handleNfcOnOff (true);
    876 
    877                 /////////////////////////////////////////////////////////////////////////////////
    878                 // Add extra configuration here (work-arounds, etc.)
    879 
    880                 struct nfc_jni_native_data *nat = getNative(e, o);
    881 
    882                 if ( nat )
    883                 {
    884                     if (GetNumValue(NAME_POLLING_TECH_MASK, &num, sizeof(num)))
    885                         nat->tech_mask = num;
    886                     else
    887                         nat->tech_mask = DEFAULT_TECH_MASK;
    888                     ALOGD ("%s: tag polling tech mask=0x%X", __FUNCTION__, nat->tech_mask);
    889                 }
    890 
    891                 // if this value exists, set polling interval.
    892                 if (GetNumValue(NAME_NFA_DM_DISC_DURATION_POLL, &num, sizeof(num)))
    893                     nat->discovery_duration = num;
    894                 else
    895                     nat->discovery_duration = DEFAULT_DISCOVERY_DURATION;
    896 
    897                 NFA_SetRfDiscoveryDuration(nat->discovery_duration);
    898 
    899                 // Do custom NFCA startup configuration.
    900                 doStartupConfig();
    901                 goto TheEnd;
    902             }
    903         }
    904 
    905         ALOGE ("%s: fail nfa enable; error=0x%X", __FUNCTION__, stat);
    906 
    907         if (sIsNfaEnabled)
    908             stat = NFA_Disable (FALSE /* ungraceful */);
    909 
    910         theInstance.Finalize();
    911     }
    912 
    913 TheEnd:
    914     if (sIsNfaEnabled)
    915         PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER);
    916     ALOGD ("%s: exit", __FUNCTION__);
    917     return sIsNfaEnabled ? JNI_TRUE : JNI_FALSE;
    918 }
    919 
    920 
    921 /*******************************************************************************
    922 **
    923 ** Function:        nfcManager_enableDiscovery
    924 **
    925 ** Description:     Start polling and listening for devices.
    926 **                  e: JVM environment.
    927 **                  o: Java object.
    928 **                  mode: Not used.
    929 **
    930 ** Returns:         None
    931 **
    932 *******************************************************************************/
    933 static void nfcManager_enableDiscovery (JNIEnv* e, jobject o)
    934 {
    935     tNFA_TECHNOLOGY_MASK tech_mask = DEFAULT_TECH_MASK;
    936     struct nfc_jni_native_data *nat = getNative(e, o);
    937 
    938     if (nat)
    939         tech_mask = (tNFA_TECHNOLOGY_MASK)nat->tech_mask;
    940 
    941     ALOGD ("%s: enter; tech_mask = %02x", __FUNCTION__, tech_mask);
    942 
    943     if (sDiscoveryEnabled)
    944     {
    945         ALOGE ("%s: already polling", __FUNCTION__);
    946         return;
    947     }
    948 
    949     tNFA_STATUS stat = NFA_STATUS_OK;
    950 
    951     ALOGD ("%s: sIsSecElemSelected=%u", __FUNCTION__, sIsSecElemSelected);
    952 
    953     PowerSwitch::getInstance ().setLevel (PowerSwitch::FULL_POWER);
    954 
    955     if (sRfEnabled) {
    956         // Stop RF discovery to reconfigure
    957         startRfDiscovery(false);
    958     }
    959 
    960     {
    961         SyncEventGuard guard (sNfaEnableDisablePollingEvent);
    962         stat = NFA_EnablePolling (tech_mask);
    963         if (stat == NFA_STATUS_OK)
    964         {
    965             ALOGD ("%s: wait for enable event", __FUNCTION__);
    966             sDiscoveryEnabled = true;
    967             sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_ENABLED_EVT
    968             ALOGD ("%s: got enabled event", __FUNCTION__);
    969         }
    970         else
    971         {
    972             ALOGE ("%s: fail enable discovery; error=0x%X", __FUNCTION__, stat);
    973         }
    974     }
    975 
    976     // Start P2P listening if tag polling was enabled or the mask was 0.
    977     if (sDiscoveryEnabled || (tech_mask == 0))
    978     {
    979         ALOGD ("%s: Enable p2pListening", __FUNCTION__);
    980         PeerToPeer::getInstance().enableP2pListening (true);
    981     }
    982 
    983     // Actually start discovery.
    984     startRfDiscovery (true);
    985 
    986     PowerSwitch::getInstance ().setModeOn (PowerSwitch::DISCOVERY);
    987 
    988     ALOGD ("%s: exit", __FUNCTION__);
    989 }
    990 
    991 
    992 /*******************************************************************************
    993 **
    994 ** Function:        nfcManager_disableDiscovery
    995 **
    996 ** Description:     Stop polling and listening for devices.
    997 **                  e: JVM environment.
    998 **                  o: Java object.
    999 **
   1000 ** Returns:         None
   1001 **
   1002 *******************************************************************************/
   1003 void nfcManager_disableDiscovery (JNIEnv*, jobject)
   1004 {
   1005     tNFA_STATUS status = NFA_STATUS_OK;
   1006     ALOGD ("%s: enter;", __FUNCTION__);
   1007 
   1008     pn544InteropAbortNow ();
   1009     if (sDiscoveryEnabled == false)
   1010     {
   1011         ALOGD ("%s: already disabled", __FUNCTION__);
   1012         goto TheEnd;
   1013     }
   1014 
   1015     // Stop RF Discovery.
   1016     startRfDiscovery (false);
   1017 
   1018     if (sDiscoveryEnabled)
   1019     {
   1020         SyncEventGuard guard (sNfaEnableDisablePollingEvent);
   1021         status = NFA_DisablePolling ();
   1022         if (status == NFA_STATUS_OK)
   1023         {
   1024             sDiscoveryEnabled = false;
   1025             sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_DISABLED_EVT
   1026         }
   1027         else
   1028             ALOGE ("%s: Failed to disable polling; error=0x%X", __FUNCTION__, status);
   1029     }
   1030 
   1031     PeerToPeer::getInstance().enableP2pListening (false);
   1032 
   1033     //if nothing is active after this, then tell the controller to power down
   1034     if (! PowerSwitch::getInstance ().setModeOff (PowerSwitch::DISCOVERY))
   1035         PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER);
   1036 
   1037     // We may have had RF field notifications that did not cause
   1038     // any activate/deactive events. For example, caused by wireless
   1039     // charging orbs. Those may cause us to go to sleep while the last
   1040     // field event was indicating a field. To prevent sticking in that
   1041     // state, always reset the rf field status when we disable discovery.
   1042     SecureElement::getInstance().resetRfFieldStatus();
   1043 TheEnd:
   1044     ALOGD ("%s: exit", __FUNCTION__);
   1045 }
   1046 
   1047 void enableDisableLongGuardTime (bool enable)
   1048 {
   1049     // TODO
   1050     // This is basically a work-around for an issue
   1051     // in BCM20791B5: if a reader is configured as follows
   1052     // 1) Only polls for NFC-A
   1053     // 2) Cuts field between polls
   1054     // 3) Has a short guard time (~5ms)
   1055     // the BCM20791B5 doesn't wake up when such a reader
   1056     // is polling it. Unfortunately the default reader
   1057     // mode configuration on Android matches those
   1058     // criteria. To avoid the issue, increase the guard
   1059     // time when in reader mode.
   1060     //
   1061     // Proper fix is firmware patch for B5 controllers.
   1062     SyncEventGuard guard(sNfaSetConfigEvent);
   1063     tNFA_STATUS stat = NFA_SetConfig(NCI_PARAM_ID_T1T_RDR_ONLY, 2,
   1064             enable ? sLongGuardTime : sDefaultGuardTime);
   1065     if (stat == NFA_STATUS_OK)
   1066         sNfaSetConfigEvent.wait ();
   1067     else
   1068         ALOGE("%s: Could not configure longer guard time", __FUNCTION__);
   1069     return;
   1070 }
   1071 
   1072 void enableDisableLptd (bool enable)
   1073 {
   1074     // This method is *NOT* thread-safe. Right now
   1075     // it is only called from the same thread so it's
   1076     // not an issue.
   1077     static bool sCheckedLptd = false;
   1078     static bool sHasLptd = false;
   1079 
   1080     tNFA_STATUS stat = NFA_STATUS_OK;
   1081     if (!sCheckedLptd)
   1082     {
   1083         sCheckedLptd = true;
   1084         SyncEventGuard guard (sNfaGetConfigEvent);
   1085         tNFA_PMID configParam[1] = {NCI_PARAM_ID_TAGSNIFF_CFG};
   1086         stat = NFA_GetConfig(1, configParam);
   1087         if (stat != NFA_STATUS_OK)
   1088         {
   1089             ALOGE("%s: NFA_GetConfig failed", __FUNCTION__);
   1090             return;
   1091         }
   1092         sNfaGetConfigEvent.wait ();
   1093         if (sCurrentConfigLen < 4 || sConfig[1] != NCI_PARAM_ID_TAGSNIFF_CFG) {
   1094             ALOGE("%s: Config TLV length %d returned is too short", __FUNCTION__,
   1095                     sCurrentConfigLen);
   1096             return;
   1097         }
   1098         sHasLptd = true;
   1099     }
   1100     // Bail if we checked and didn't find any LPTD config before
   1101     if (!sHasLptd) return;
   1102     UINT8 enable_byte = enable ? 0x01 : 0x00;
   1103 
   1104     SyncEventGuard guard(sNfaSetConfigEvent);
   1105 
   1106     stat = NFA_SetConfig(NCI_PARAM_ID_TAGSNIFF_CFG, 1, &enable_byte);
   1107     if (stat == NFA_STATUS_OK)
   1108         sNfaSetConfigEvent.wait ();
   1109     else
   1110         ALOGE("%s: Could not configure LPTD feature", __FUNCTION__);
   1111     return;
   1112 }
   1113 
   1114 void setUiccIdleTimeout (bool enable)
   1115 {
   1116     // This method is *NOT* thread-safe. Right now
   1117     // it is only called from the same thread so it's
   1118     // not an issue.
   1119     tNFA_STATUS stat = NFA_STATUS_OK;
   1120     UINT8 swp_cfg_byte0 = 0x00;
   1121     {
   1122         SyncEventGuard guard (sNfaGetConfigEvent);
   1123         tNFA_PMID configParam[1] = {0xC2};
   1124         stat = NFA_GetConfig(1, configParam);
   1125         if (stat != NFA_STATUS_OK)
   1126         {
   1127             ALOGE("%s: NFA_GetConfig failed", __FUNCTION__);
   1128             return;
   1129         }
   1130         sNfaGetConfigEvent.wait ();
   1131         if (sCurrentConfigLen < 4 || sConfig[1] != 0xC2) {
   1132             ALOGE("%s: Config TLV length %d returned is too short", __FUNCTION__,
   1133                     sCurrentConfigLen);
   1134             return;
   1135         }
   1136         swp_cfg_byte0 = sConfig[3];
   1137     }
   1138     SyncEventGuard guard(sNfaSetConfigEvent);
   1139     if (enable)
   1140         swp_cfg_byte0 |= 0x01;
   1141     else
   1142         swp_cfg_byte0 &= ~0x01;
   1143 
   1144     stat = NFA_SetConfig(0xC2, 1, &swp_cfg_byte0);
   1145     if (stat == NFA_STATUS_OK)
   1146         sNfaSetConfigEvent.wait ();
   1147     else
   1148         ALOGE("%s: Could not configure UICC idle timeout feature", __FUNCTION__);
   1149     return;
   1150 }
   1151 /*******************************************************************************
   1152 **
   1153 ** Function         nfc_jni_cache_object_local
   1154 **
   1155 ** Description      Allocates a java object and calls it's constructor
   1156 **
   1157 ** Returns          -1 on failure, 0 on success
   1158 **
   1159 *******************************************************************************/
   1160 static int nfc_jni_cache_object_local (JNIEnv *e, const char *className, jobject *cachedObj)
   1161 {
   1162     ScopedLocalRef<jclass> cls(e, e->FindClass(className));
   1163     if(cls.get() == NULL) {
   1164         ALOGE ("%s: find class error", __FUNCTION__);
   1165         return -1;
   1166     }
   1167 
   1168     jmethodID ctor = e->GetMethodID(cls.get(), "<init>", "()V");
   1169     jobject obj = e->NewObject(cls.get(), ctor);
   1170     if (obj == NULL) {
   1171        ALOGE ("%s: create object error", __FUNCTION__);
   1172        return -1;
   1173     }
   1174 
   1175     *cachedObj = obj;
   1176     if (*cachedObj == NULL) {
   1177         ALOGE ("%s: global ref error", __FUNCTION__);
   1178         return -1;
   1179     }
   1180     return 0;
   1181 }
   1182 
   1183 
   1184 /*******************************************************************************
   1185 **
   1186 ** Function:        nfcManager_doCreateLlcpServiceSocket
   1187 **
   1188 ** Description:     Create a new LLCP server socket.
   1189 **                  e: JVM environment.
   1190 **                  o: Java object.
   1191 **                  nSap: Service access point.
   1192 **                  sn: Service name
   1193 **                  miu: Maximum information unit.
   1194 **                  rw: Receive window size.
   1195 **                  linearBufferLength: Max buffer size.
   1196 **
   1197 ** Returns:         NativeLlcpServiceSocket Java object.
   1198 **
   1199 *******************************************************************************/
   1200 static jobject nfcManager_doCreateLlcpServiceSocket (JNIEnv* e, jobject, jint nSap, jstring sn, jint miu, jint rw, jint linearBufferLength)
   1201 {
   1202     PeerToPeer::tJNI_HANDLE jniHandle = PeerToPeer::getInstance().getNewJniHandle ();
   1203 
   1204     ScopedUtfChars serviceName(e, sn);
   1205 
   1206     ALOGD ("%s: enter: sap=%i; name=%s; miu=%i; rw=%i; buffLen=%i", __FUNCTION__, nSap, serviceName.c_str(), miu, rw, linearBufferLength);
   1207 
   1208     /* Create new NativeLlcpServiceSocket object */
   1209     jobject serviceSocket = NULL;
   1210     if (nfc_jni_cache_object(e, gNativeLlcpServiceSocketClassName, &(serviceSocket)) == -1)
   1211     {
   1212         ALOGE ("%s: Llcp socket object creation error", __FUNCTION__);
   1213         return NULL;
   1214     }
   1215 
   1216     /* Get NativeLlcpServiceSocket class object */
   1217     ScopedLocalRef<jclass> clsNativeLlcpServiceSocket(e, e->GetObjectClass(serviceSocket));
   1218     if (e->ExceptionCheck())
   1219     {
   1220         e->ExceptionClear();
   1221         ALOGE("%s: Llcp Socket get object class error", __FUNCTION__);
   1222         return NULL;
   1223     }
   1224 
   1225     if (!PeerToPeer::getInstance().registerServer (jniHandle, serviceName.c_str()))
   1226     {
   1227         ALOGE("%s: RegisterServer error", __FUNCTION__);
   1228         return NULL;
   1229     }
   1230 
   1231     jfieldID f;
   1232 
   1233     /* Set socket handle to be the same as the NfaHandle*/
   1234     f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mHandle", "I");
   1235     e->SetIntField(serviceSocket, f, (jint) jniHandle);
   1236     ALOGD ("%s: socket Handle = 0x%X", __FUNCTION__, jniHandle);
   1237 
   1238     /* Set socket linear buffer length */
   1239     f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mLocalLinearBufferLength", "I");
   1240     e->SetIntField(serviceSocket, f,(jint)linearBufferLength);
   1241     ALOGD ("%s: buffer length = %d", __FUNCTION__, linearBufferLength);
   1242 
   1243     /* Set socket MIU */
   1244     f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mLocalMiu", "I");
   1245     e->SetIntField(serviceSocket, f,(jint)miu);
   1246     ALOGD ("%s: MIU = %d", __FUNCTION__, miu);
   1247 
   1248     /* Set socket RW */
   1249     f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mLocalRw", "I");
   1250     e->SetIntField(serviceSocket, f,(jint)rw);
   1251     ALOGD ("%s:  RW = %d", __FUNCTION__, rw);
   1252 
   1253     sLastError = 0;
   1254     ALOGD ("%s: exit", __FUNCTION__);
   1255     return serviceSocket;
   1256 }
   1257 
   1258 
   1259 /*******************************************************************************
   1260 **
   1261 ** Function:        nfcManager_doGetLastError
   1262 **
   1263 ** Description:     Get the last error code.
   1264 **                  e: JVM environment.
   1265 **                  o: Java object.
   1266 **
   1267 ** Returns:         Last error code.
   1268 **
   1269 *******************************************************************************/
   1270 static jint nfcManager_doGetLastError(JNIEnv*, jobject)
   1271 {
   1272     ALOGD ("%s: last error=%i", __FUNCTION__, sLastError);
   1273     return sLastError;
   1274 }
   1275 
   1276 
   1277 /*******************************************************************************
   1278 **
   1279 ** Function:        nfcManager_doDeinitialize
   1280 **
   1281 ** Description:     Turn off NFC.
   1282 **                  e: JVM environment.
   1283 **                  o: Java object.
   1284 **
   1285 ** Returns:         True if ok.
   1286 **
   1287 *******************************************************************************/
   1288 static jboolean nfcManager_doDeinitialize (JNIEnv*, jobject)
   1289 {
   1290     ALOGD ("%s: enter", __FUNCTION__);
   1291 
   1292     sIsDisabling = true;
   1293     pn544InteropAbortNow ();
   1294     SecureElement::getInstance().finalize ();
   1295     PowerSwitch::getInstance ().initialize (PowerSwitch::UNKNOWN_LEVEL);
   1296 
   1297     if (sIsNfaEnabled)
   1298     {
   1299         SyncEventGuard guard (sNfaDisableEvent);
   1300         tNFA_STATUS stat = NFA_Disable (TRUE /* graceful */);
   1301         if (stat == NFA_STATUS_OK)
   1302         {
   1303             ALOGD ("%s: wait for completion", __FUNCTION__);
   1304             sNfaDisableEvent.wait (); //wait for NFA command to finish
   1305             PeerToPeer::getInstance ().handleNfcOnOff (false);
   1306         }
   1307         else
   1308         {
   1309             ALOGE ("%s: fail disable; error=0x%X", __FUNCTION__, stat);
   1310         }
   1311     }
   1312     nativeNfcTag_abortWaits();
   1313     NfcTag::getInstance().abort ();
   1314     sAbortConnlessWait = true;
   1315     nativeLlcpConnectionlessSocket_abortWait();
   1316     sIsNfaEnabled = false;
   1317     sDiscoveryEnabled = false;
   1318     sIsDisabling = false;
   1319     sIsSecElemSelected = false;
   1320     gActivated = false;
   1321 
   1322     {
   1323         //unblock NFA_EnablePolling() and NFA_DisablePolling()
   1324         SyncEventGuard guard (sNfaEnableDisablePollingEvent);
   1325         sNfaEnableDisablePollingEvent.notifyOne ();
   1326     }
   1327 
   1328     NfcAdaptation& theInstance = NfcAdaptation::GetInstance();
   1329     theInstance.Finalize();
   1330 
   1331     ALOGD ("%s: exit", __FUNCTION__);
   1332     return JNI_TRUE;
   1333 }
   1334 
   1335 
   1336 /*******************************************************************************
   1337 **
   1338 ** Function:        nfcManager_doCreateLlcpSocket
   1339 **
   1340 ** Description:     Create a LLCP connection-oriented socket.
   1341 **                  e: JVM environment.
   1342 **                  o: Java object.
   1343 **                  nSap: Service access point.
   1344 **                  miu: Maximum information unit.
   1345 **                  rw: Receive window size.
   1346 **                  linearBufferLength: Max buffer size.
   1347 **
   1348 ** Returns:         NativeLlcpSocket Java object.
   1349 **
   1350 *******************************************************************************/
   1351 static jobject nfcManager_doCreateLlcpSocket (JNIEnv* e, jobject, jint nSap, jint miu, jint rw, jint linearBufferLength)
   1352 {
   1353     ALOGD ("%s: enter; sap=%d; miu=%d; rw=%d; buffer len=%d", __FUNCTION__, nSap, miu, rw, linearBufferLength);
   1354 
   1355     PeerToPeer::tJNI_HANDLE jniHandle = PeerToPeer::getInstance().getNewJniHandle ();
   1356     PeerToPeer::getInstance().createClient (jniHandle, miu, rw);
   1357 
   1358     /* Create new NativeLlcpSocket object */
   1359     jobject clientSocket = NULL;
   1360     if (nfc_jni_cache_object_local(e, gNativeLlcpSocketClassName, &(clientSocket)) == -1)
   1361     {
   1362         ALOGE ("%s: fail Llcp socket creation", __FUNCTION__);
   1363         return clientSocket;
   1364     }
   1365 
   1366     /* Get NativeConnectionless class object */
   1367     ScopedLocalRef<jclass> clsNativeLlcpSocket(e, e->GetObjectClass(clientSocket));
   1368     if (e->ExceptionCheck())
   1369     {
   1370         e->ExceptionClear();
   1371         ALOGE ("%s: fail get class object", __FUNCTION__);
   1372         return clientSocket;
   1373     }
   1374 
   1375     jfieldID f;
   1376 
   1377     /* Set socket SAP */
   1378     f = e->GetFieldID (clsNativeLlcpSocket.get(), "mSap", "I");
   1379     e->SetIntField (clientSocket, f, (jint) nSap);
   1380 
   1381     /* Set socket handle */
   1382     f = e->GetFieldID (clsNativeLlcpSocket.get(), "mHandle", "I");
   1383     e->SetIntField (clientSocket, f, (jint) jniHandle);
   1384 
   1385     /* Set socket MIU */
   1386     f = e->GetFieldID (clsNativeLlcpSocket.get(), "mLocalMiu", "I");
   1387     e->SetIntField (clientSocket, f, (jint) miu);
   1388 
   1389     /* Set socket RW */
   1390     f = e->GetFieldID (clsNativeLlcpSocket.get(), "mLocalRw", "I");
   1391     e->SetIntField (clientSocket, f, (jint) rw);
   1392 
   1393     ALOGD ("%s: exit", __FUNCTION__);
   1394     return clientSocket;
   1395 }
   1396 
   1397 
   1398 /*******************************************************************************
   1399 **
   1400 ** Function:        nfcManager_doCreateLlcpConnectionlessSocket
   1401 **
   1402 ** Description:     Create a connection-less socket.
   1403 **                  e: JVM environment.
   1404 **                  o: Java object.
   1405 **                  nSap: Service access point.
   1406 **                  sn: Service name.
   1407 **
   1408 ** Returns:         NativeLlcpConnectionlessSocket Java object.
   1409 **
   1410 *******************************************************************************/
   1411 static jobject nfcManager_doCreateLlcpConnectionlessSocket (JNIEnv *, jobject, jint nSap, jstring /*sn*/)
   1412 {
   1413     ALOGD ("%s: nSap=0x%X", __FUNCTION__, nSap);
   1414     return NULL;
   1415 }
   1416 
   1417 
   1418 /*******************************************************************************
   1419 **
   1420 ** Function:        nfcManager_doGetSecureElementList
   1421 **
   1422 ** Description:     Get a list of secure element handles.
   1423 **                  e: JVM environment.
   1424 **                  o: Java object.
   1425 **
   1426 ** Returns:         List of secure element handles.
   1427 **
   1428 *******************************************************************************/
   1429 static jintArray nfcManager_doGetSecureElementList(JNIEnv* e, jobject)
   1430 {
   1431     ALOGD ("%s", __FUNCTION__);
   1432     return SecureElement::getInstance().getSecureElementIdList (e);
   1433 }
   1434 
   1435 /*******************************************************************************
   1436 **
   1437 ** Function:        nfcManager_enableRoutingToHost
   1438 **
   1439 ** Description:     NFC controller starts routing data to host.
   1440 **                  e: JVM environment.
   1441 **                  o: Java object.
   1442 **
   1443 ** Returns:         None
   1444 **
   1445 *******************************************************************************/
   1446 static void nfcManager_enableRoutingToHost(JNIEnv*, jobject)
   1447 {
   1448     ALOGD ("%s: enter", __FUNCTION__);
   1449     PowerSwitch::getInstance ().setLevel (PowerSwitch::FULL_POWER);
   1450     PowerSwitch::getInstance ().setModeOn (PowerSwitch::HOST_ROUTING);
   1451     if (sRfEnabled) {
   1452         // Stop RF discovery to reconfigure
   1453         startRfDiscovery(false);
   1454     }
   1455     RoutingManager::getInstance().commitRouting();
   1456     startRfDiscovery(true);
   1457     ALOGD ("%s: exit", __FUNCTION__);
   1458 }
   1459 
   1460 /*******************************************************************************
   1461 **
   1462 ** Function:        nfcManager_disableRoutingToHost
   1463 **
   1464 ** Description:     NFC controller stops routing data to host.
   1465 **                  e: JVM environment.
   1466 **                  o: Java object.
   1467 **
   1468 ** Returns:         None
   1469 **
   1470 *******************************************************************************/
   1471 static void nfcManager_disableRoutingToHost(JNIEnv*, jobject)
   1472 {
   1473     ALOGD ("%s: enter", __FUNCTION__);
   1474     bool rfWasEnabled = false;
   1475 
   1476     if (PowerSwitch::getInstance ().getLevel() == PowerSwitch::LOW_POWER)
   1477     {
   1478         ALOGD ("%s: no need to disable routing while power is OFF", __FUNCTION__);
   1479         goto TheEnd;
   1480     }
   1481 
   1482     if (sRfEnabled) {
   1483         rfWasEnabled = true;
   1484         // Stop RF discovery to reconfigure
   1485         startRfDiscovery(false);
   1486     }
   1487     RoutingManager::getInstance().commitRouting();
   1488     if (rfWasEnabled)
   1489     {
   1490         startRfDiscovery(true);
   1491     }
   1492     if (! PowerSwitch::getInstance ().setModeOff (PowerSwitch::HOST_ROUTING))
   1493         PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER);
   1494 TheEnd:
   1495     ALOGD ("%s: exit", __FUNCTION__);
   1496 }
   1497 
   1498 /*******************************************************************************
   1499 **
   1500 ** Function:        nfcManager_doSelectSecureElement
   1501 **
   1502 ** Description:     NFC controller starts routing data in listen mode.
   1503 **                  e: JVM environment.
   1504 **                  o: Java object.
   1505 **
   1506 ** Returns:         None
   1507 **
   1508 *******************************************************************************/
   1509 static void nfcManager_doSelectSecureElement(JNIEnv*, jobject)
   1510 {
   1511     ALOGD ("%s: enter", __FUNCTION__);
   1512     bool stat = true;
   1513 
   1514     if (sIsSecElemSelected)
   1515     {
   1516         ALOGD ("%s: already selected", __FUNCTION__);
   1517         goto TheEnd;
   1518     }
   1519 
   1520     PowerSwitch::getInstance ().setLevel (PowerSwitch::FULL_POWER);
   1521 
   1522     if (sRfEnabled) {
   1523         // Stop RF Discovery if we were polling
   1524         startRfDiscovery (false);
   1525     }
   1526 
   1527 
   1528     stat = SecureElement::getInstance().activate (0xABCDEF);
   1529     sIsSecElemSelected = true;
   1530 
   1531     startRfDiscovery (true);
   1532     PowerSwitch::getInstance ().setModeOn (PowerSwitch::SE_ROUTING);
   1533 TheEnd:
   1534     ALOGD ("%s: exit", __FUNCTION__);
   1535 }
   1536 
   1537 
   1538 /*******************************************************************************
   1539 **
   1540 ** Function:        nfcManager_doDeselectSecureElement
   1541 **
   1542 ** Description:     NFC controller stops routing data in listen mode.
   1543 **                  e: JVM environment.
   1544 **                  o: Java object.
   1545 **
   1546 ** Returns:         None
   1547 **
   1548 *******************************************************************************/
   1549 static void nfcManager_doDeselectSecureElement(JNIEnv*, jobject)
   1550 {
   1551     ALOGD ("%s: enter", __FUNCTION__);
   1552     bool bRestartDiscovery = false;
   1553 
   1554     if (! sIsSecElemSelected)
   1555     {
   1556         ALOGE ("%s: already deselected", __FUNCTION__);
   1557         goto TheEnd2;
   1558     }
   1559 
   1560     if (PowerSwitch::getInstance ().getLevel() == PowerSwitch::LOW_POWER)
   1561     {
   1562         ALOGD ("%s: do not deselect while power is OFF", __FUNCTION__);
   1563         sIsSecElemSelected = false;
   1564         goto TheEnd;
   1565     }
   1566 
   1567     if (sRfEnabled) {
   1568         // Stop RF Discovery if we were polling
   1569         startRfDiscovery (false);
   1570         bRestartDiscovery = true;
   1571     }
   1572 
   1573     //if controller is not routing to sec elems AND there is no pipe connected,
   1574     //then turn off the sec elems
   1575     if (SecureElement::getInstance().isBusy() == false)
   1576         SecureElement::getInstance().deactivate (0xABCDEF);
   1577 
   1578     sIsSecElemSelected = false;
   1579 TheEnd:
   1580     if (bRestartDiscovery)
   1581         startRfDiscovery (true);
   1582 
   1583     //if nothing is active after this, then tell the controller to power down
   1584     if (! PowerSwitch::getInstance ().setModeOff (PowerSwitch::SE_ROUTING))
   1585         PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER);
   1586 
   1587 TheEnd2:
   1588     ALOGD ("%s: exit", __FUNCTION__);
   1589 }
   1590 
   1591 
   1592 /*******************************************************************************
   1593 **
   1594 ** Function:        isPeerToPeer
   1595 **
   1596 ** Description:     Whether the activation data indicates the peer supports NFC-DEP.
   1597 **                  activated: Activation data.
   1598 **
   1599 ** Returns:         True if the peer supports NFC-DEP.
   1600 **
   1601 *******************************************************************************/
   1602 static bool isPeerToPeer (tNFA_ACTIVATED& activated)
   1603 {
   1604     return activated.activate_ntf.protocol == NFA_PROTOCOL_NFC_DEP;
   1605 }
   1606 
   1607 /*******************************************************************************
   1608 **
   1609 ** Function:        isListenMode
   1610 **
   1611 ** Description:     Indicates whether the activation data indicates it is
   1612 **                  listen mode.
   1613 **
   1614 ** Returns:         True if this listen mode.
   1615 **
   1616 *******************************************************************************/
   1617 static bool isListenMode(tNFA_ACTIVATED& activated)
   1618 {
   1619     return ((NFC_DISCOVERY_TYPE_LISTEN_A == activated.activate_ntf.rf_tech_param.mode)
   1620             || (NFC_DISCOVERY_TYPE_LISTEN_B == activated.activate_ntf.rf_tech_param.mode)
   1621             || (NFC_DISCOVERY_TYPE_LISTEN_F == activated.activate_ntf.rf_tech_param.mode)
   1622             || (NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE == activated.activate_ntf.rf_tech_param.mode)
   1623             || (NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE == activated.activate_ntf.rf_tech_param.mode)
   1624             || (NFC_DISCOVERY_TYPE_LISTEN_ISO15693 == activated.activate_ntf.rf_tech_param.mode)
   1625             || (NFC_DISCOVERY_TYPE_LISTEN_B_PRIME == activated.activate_ntf.rf_tech_param.mode));
   1626 }
   1627 
   1628 /*******************************************************************************
   1629 **
   1630 ** Function:        nfcManager_doCheckLlcp
   1631 **
   1632 ** Description:     Not used.
   1633 **
   1634 ** Returns:         True
   1635 **
   1636 *******************************************************************************/
   1637 static jboolean nfcManager_doCheckLlcp(JNIEnv*, jobject)
   1638 {
   1639     ALOGD("%s", __FUNCTION__);
   1640     return JNI_TRUE;
   1641 }
   1642 
   1643 
   1644 /*******************************************************************************
   1645 **
   1646 ** Function:        nfcManager_doActivateLlcp
   1647 **
   1648 ** Description:     Not used.
   1649 **
   1650 ** Returns:         True
   1651 **
   1652 *******************************************************************************/
   1653 static jboolean nfcManager_doActivateLlcp(JNIEnv*, jobject)
   1654 {
   1655     ALOGD("%s", __FUNCTION__);
   1656     return JNI_TRUE;
   1657 }
   1658 
   1659 
   1660 /*******************************************************************************
   1661 **
   1662 ** Function:        nfcManager_doAbort
   1663 **
   1664 ** Description:     Not used.
   1665 **
   1666 ** Returns:         None
   1667 **
   1668 *******************************************************************************/
   1669 static void nfcManager_doAbort(JNIEnv*, jobject)
   1670 {
   1671     ALOGE("%s: abort()", __FUNCTION__);
   1672     abort();
   1673 }
   1674 
   1675 
   1676 /*******************************************************************************
   1677 **
   1678 ** Function:        nfcManager_doDownload
   1679 **
   1680 ** Description:     Download firmware patch files.  Do not turn on NFC.
   1681 **
   1682 ** Returns:         True if ok.
   1683 **
   1684 *******************************************************************************/
   1685 static jboolean nfcManager_doDownload(JNIEnv*, jobject)
   1686 {
   1687     ALOGD ("%s: enter", __FUNCTION__);
   1688     NfcAdaptation& theInstance = NfcAdaptation::GetInstance();
   1689 
   1690     theInstance.Initialize(); //start GKI, NCI task, NFC task
   1691     theInstance.DownloadFirmware ();
   1692     theInstance.Finalize();
   1693     ALOGD ("%s: exit", __FUNCTION__);
   1694     return JNI_TRUE;
   1695 }
   1696 
   1697 
   1698 /*******************************************************************************
   1699 **
   1700 ** Function:        nfcManager_doResetTimeouts
   1701 **
   1702 ** Description:     Not used.
   1703 **
   1704 ** Returns:         None
   1705 **
   1706 *******************************************************************************/
   1707 static void nfcManager_doResetTimeouts(JNIEnv*, jobject)
   1708 {
   1709     ALOGD ("%s", __FUNCTION__);
   1710     NfcTag::getInstance().resetAllTransceiveTimeouts ();
   1711 }
   1712 
   1713 
   1714 /*******************************************************************************
   1715 **
   1716 ** Function:        nfcManager_doSetTimeout
   1717 **
   1718 ** Description:     Set timeout value.
   1719 **                  e: JVM environment.
   1720 **                  o: Java object.
   1721 **                  tech: technology ID.
   1722 **                  timeout: Timeout value.
   1723 **
   1724 ** Returns:         True if ok.
   1725 **
   1726 *******************************************************************************/
   1727 static bool nfcManager_doSetTimeout(JNIEnv*, jobject, jint tech, jint timeout)
   1728 {
   1729     if (timeout <= 0)
   1730     {
   1731         ALOGE("%s: Timeout must be positive.",__FUNCTION__);
   1732         return false;
   1733     }
   1734     ALOGD ("%s: tech=%d, timeout=%d", __FUNCTION__, tech, timeout);
   1735     NfcTag::getInstance().setTransceiveTimeout (tech, timeout);
   1736     return true;
   1737 }
   1738 
   1739 
   1740 /*******************************************************************************
   1741 **
   1742 ** Function:        nfcManager_doGetTimeout
   1743 **
   1744 ** Description:     Get timeout value.
   1745 **                  e: JVM environment.
   1746 **                  o: Java object.
   1747 **                  tech: technology ID.
   1748 **
   1749 ** Returns:         Timeout value.
   1750 **
   1751 *******************************************************************************/
   1752 static jint nfcManager_doGetTimeout(JNIEnv*, jobject, jint tech)
   1753 {
   1754     int timeout = NfcTag::getInstance().getTransceiveTimeout (tech);
   1755     ALOGD ("%s: tech=%d, timeout=%d", __FUNCTION__, tech, timeout);
   1756     return timeout;
   1757 }
   1758 
   1759 
   1760 /*******************************************************************************
   1761 **
   1762 ** Function:        nfcManager_doDump
   1763 **
   1764 ** Description:     Not used.
   1765 **                  e: JVM environment.
   1766 **                  o: Java object.
   1767 **
   1768 ** Returns:         Text dump.
   1769 **
   1770 *******************************************************************************/
   1771 static jstring nfcManager_doDump(JNIEnv* e, jobject)
   1772 {
   1773     char buffer[100];
   1774     snprintf(buffer, sizeof(buffer), "libnfc llc error_count=%u", /*libnfc_llc_error_count*/ 0);
   1775     return e->NewStringUTF(buffer);
   1776 }
   1777 
   1778 
   1779 /*******************************************************************************
   1780 **
   1781 ** Function:        nfcManager_doSetP2pInitiatorModes
   1782 **
   1783 ** Description:     Set P2P initiator's activation modes.
   1784 **                  e: JVM environment.
   1785 **                  o: Java object.
   1786 **                  modes: Active and/or passive modes.  The values are specified
   1787 **                          in external/libnfc-nxp/inc/phNfcTypes.h.  See
   1788 **                          enum phNfc_eP2PMode_t.
   1789 **
   1790 ** Returns:         None.
   1791 **
   1792 *******************************************************************************/
   1793 static void nfcManager_doSetP2pInitiatorModes (JNIEnv *e, jobject o, jint modes)
   1794 {
   1795     ALOGD ("%s: modes=0x%X", __FUNCTION__, modes);
   1796     struct nfc_jni_native_data *nat = getNative(e, o);
   1797 
   1798     tNFA_TECHNOLOGY_MASK mask = 0;
   1799     if (modes & 0x01) mask |= NFA_TECHNOLOGY_MASK_A;
   1800     if (modes & 0x02) mask |= NFA_TECHNOLOGY_MASK_F;
   1801     if (modes & 0x04) mask |= NFA_TECHNOLOGY_MASK_F;
   1802     if (modes & 0x08) mask |= NFA_TECHNOLOGY_MASK_A_ACTIVE;
   1803     if (modes & 0x10) mask |= NFA_TECHNOLOGY_MASK_F_ACTIVE;
   1804     if (modes & 0x20) mask |= NFA_TECHNOLOGY_MASK_F_ACTIVE;
   1805     nat->tech_mask = mask;
   1806 }
   1807 
   1808 
   1809 /*******************************************************************************
   1810 **
   1811 ** Function:        nfcManager_doSetP2pTargetModes
   1812 **
   1813 ** Description:     Set P2P target's activation modes.
   1814 **                  e: JVM environment.
   1815 **                  o: Java object.
   1816 **                  modes: Active and/or passive modes.
   1817 **
   1818 ** Returns:         None.
   1819 **
   1820 *******************************************************************************/
   1821 static void nfcManager_doSetP2pTargetModes (JNIEnv*, jobject, jint modes)
   1822 {
   1823     ALOGD ("%s: modes=0x%X", __FUNCTION__, modes);
   1824     // Map in the right modes
   1825     tNFA_TECHNOLOGY_MASK mask = 0;
   1826     if (modes & 0x01) mask |= NFA_TECHNOLOGY_MASK_A;
   1827     if (modes & 0x02) mask |= NFA_TECHNOLOGY_MASK_F;
   1828     if (modes & 0x04) mask |= NFA_TECHNOLOGY_MASK_F;
   1829     if (modes & 0x08) mask |= NFA_TECHNOLOGY_MASK_A_ACTIVE | NFA_TECHNOLOGY_MASK_F_ACTIVE;
   1830 
   1831     PeerToPeer::getInstance().setP2pListenMask(mask);
   1832 }
   1833 
   1834 static void nfcManager_doEnableReaderMode (JNIEnv*, jobject, jint technologies)
   1835 {
   1836     if (sDiscoveryEnabled) {
   1837         sReaderModeEnabled = true;
   1838         PeerToPeer::getInstance().enableP2pListening(false);
   1839         NFA_PauseP2p();
   1840         NFA_DisableListening();
   1841         // Limit polling to these technologies
   1842         int tech_mask = 0;
   1843         if (technologies & 0x01)
   1844            tech_mask |= NFA_TECHNOLOGY_MASK_A;
   1845         if (technologies & 0x02)
   1846            tech_mask |= NFA_TECHNOLOGY_MASK_B;
   1847         if (technologies & 0x04)
   1848            tech_mask |= NFA_TECHNOLOGY_MASK_F;
   1849         if (technologies & 0x08)
   1850            tech_mask |= NFA_TECHNOLOGY_MASK_ISO15693;
   1851         if (technologies & 0x10)
   1852            tech_mask |= NFA_TECHNOLOGY_MASK_KOVIO;
   1853 
   1854         enableDisableLptd(false);
   1855         enableDisableLongGuardTime(true);
   1856         NFA_SetRfDiscoveryDuration(READER_MODE_DISCOVERY_DURATION);
   1857         restartPollingWithTechMask(tech_mask);
   1858     }
   1859 }
   1860 
   1861 static void nfcManager_doDisableReaderMode (JNIEnv* e, jobject o)
   1862 {
   1863     struct nfc_jni_native_data *nat = getNative(e, o);
   1864     if (sDiscoveryEnabled) {
   1865         sReaderModeEnabled = false;
   1866         NFA_ResumeP2p();
   1867         PeerToPeer::getInstance().enableP2pListening(true);
   1868         NFA_EnableListening();
   1869 
   1870         enableDisableLptd(true);
   1871         enableDisableLongGuardTime(false);
   1872         NFA_SetRfDiscoveryDuration(nat->discovery_duration);
   1873         restartPollingWithTechMask(nat->tech_mask);
   1874     }
   1875 }
   1876 
   1877 
   1878 /*****************************************************************************
   1879 **
   1880 ** JNI functions for android-4.0.1_r1
   1881 **
   1882 *****************************************************************************/
   1883 static JNINativeMethod gMethods[] =
   1884 {
   1885     {"doDownload", "()Z",
   1886             (void *)nfcManager_doDownload},
   1887 
   1888     {"initializeNativeStructure", "()Z",
   1889             (void*) nfcManager_initNativeStruc},
   1890 
   1891     {"doInitialize", "()Z",
   1892             (void*) nfcManager_doInitialize},
   1893 
   1894     {"doDeinitialize", "()Z",
   1895             (void*) nfcManager_doDeinitialize},
   1896 
   1897     {"sendRawFrame", "([B)Z",
   1898             (void*) nfcManager_sendRawFrame},
   1899 
   1900     {"routeAid", "([BI)Z",
   1901             (void*) nfcManager_routeAid},
   1902 
   1903     {"unrouteAid", "([B)Z",
   1904             (void*) nfcManager_unrouteAid},
   1905 
   1906     {"enableDiscovery", "()V",
   1907             (void*) nfcManager_enableDiscovery},
   1908 
   1909     {"enableRoutingToHost", "()V",
   1910             (void*) nfcManager_enableRoutingToHost},
   1911 
   1912     {"disableRoutingToHost", "()V",
   1913             (void*) nfcManager_disableRoutingToHost},
   1914 
   1915     {"doGetSecureElementList", "()[I",
   1916             (void *)nfcManager_doGetSecureElementList},
   1917 
   1918     {"doSelectSecureElement", "()V",
   1919             (void *)nfcManager_doSelectSecureElement},
   1920 
   1921     {"doDeselectSecureElement", "()V",
   1922             (void *)nfcManager_doDeselectSecureElement},
   1923 
   1924     {"doCheckLlcp", "()Z",
   1925             (void *)nfcManager_doCheckLlcp},
   1926 
   1927     {"doActivateLlcp", "()Z",
   1928             (void *)nfcManager_doActivateLlcp},
   1929 
   1930     {"doCreateLlcpConnectionlessSocket", "(ILjava/lang/String;)Lcom/android/nfc/dhimpl/NativeLlcpConnectionlessSocket;",
   1931             (void *)nfcManager_doCreateLlcpConnectionlessSocket},
   1932 
   1933     {"doCreateLlcpServiceSocket", "(ILjava/lang/String;III)Lcom/android/nfc/dhimpl/NativeLlcpServiceSocket;",
   1934             (void*) nfcManager_doCreateLlcpServiceSocket},
   1935 
   1936     {"doCreateLlcpSocket", "(IIII)Lcom/android/nfc/dhimpl/NativeLlcpSocket;",
   1937             (void*) nfcManager_doCreateLlcpSocket},
   1938 
   1939     {"doGetLastError", "()I",
   1940             (void*) nfcManager_doGetLastError},
   1941 
   1942     {"disableDiscovery", "()V",
   1943             (void*) nfcManager_disableDiscovery},
   1944 
   1945     {"doSetTimeout", "(II)Z",
   1946             (void *)nfcManager_doSetTimeout},
   1947 
   1948     {"doGetTimeout", "(I)I",
   1949             (void *)nfcManager_doGetTimeout},
   1950 
   1951     {"doResetTimeouts", "()V",
   1952             (void *)nfcManager_doResetTimeouts},
   1953 
   1954     {"doAbort", "()V",
   1955             (void *)nfcManager_doAbort},
   1956 
   1957     {"doSetP2pInitiatorModes", "(I)V",
   1958             (void *)nfcManager_doSetP2pInitiatorModes},
   1959 
   1960     {"doSetP2pTargetModes", "(I)V",
   1961             (void *)nfcManager_doSetP2pTargetModes},
   1962 
   1963     {"doEnableReaderMode", "(I)V",
   1964             (void *)nfcManager_doEnableReaderMode},
   1965 
   1966     {"doDisableReaderMode", "()V",
   1967             (void *)nfcManager_doDisableReaderMode},
   1968 
   1969     {"doDump", "()Ljava/lang/String;",
   1970             (void *)nfcManager_doDump},
   1971 };
   1972 
   1973 
   1974 /*******************************************************************************
   1975 **
   1976 ** Function:        register_com_android_nfc_NativeNfcManager
   1977 **
   1978 ** Description:     Regisgter JNI functions with Java Virtual Machine.
   1979 **                  e: Environment of JVM.
   1980 **
   1981 ** Returns:         Status of registration.
   1982 **
   1983 *******************************************************************************/
   1984 int register_com_android_nfc_NativeNfcManager (JNIEnv *e)
   1985 {
   1986     ALOGD ("%s: enter", __FUNCTION__);
   1987     PowerSwitch::getInstance ().initialize (PowerSwitch::UNKNOWN_LEVEL);
   1988     ALOGD ("%s: exit", __FUNCTION__);
   1989     return jniRegisterNativeMethods (e, gNativeNfcManagerClassName, gMethods, NELEM (gMethods));
   1990 }
   1991 
   1992 
   1993 /*******************************************************************************
   1994 **
   1995 ** Function:        startRfDiscovery
   1996 **
   1997 ** Description:     Ask stack to start polling and listening for devices.
   1998 **                  isStart: Whether to start.
   1999 **
   2000 ** Returns:         None
   2001 **
   2002 *******************************************************************************/
   2003 void startRfDiscovery(bool isStart)
   2004 {
   2005     tNFA_STATUS status = NFA_STATUS_FAILED;
   2006 
   2007     ALOGD ("%s: is start=%d", __FUNCTION__, isStart);
   2008     SyncEventGuard guard (sNfaEnableDisablePollingEvent);
   2009     status  = isStart ? NFA_StartRfDiscovery () : NFA_StopRfDiscovery ();
   2010     if (status == NFA_STATUS_OK)
   2011     {
   2012         sNfaEnableDisablePollingEvent.wait (); //wait for NFA_RF_DISCOVERY_xxxx_EVT
   2013         sRfEnabled = isStart;
   2014     }
   2015     else
   2016     {
   2017         ALOGE ("%s: Failed to start/stop RF discovery; error=0x%X", __FUNCTION__, status);
   2018     }
   2019 }
   2020 
   2021 
   2022 /*******************************************************************************
   2023 **
   2024 ** Function:        doStartupConfig
   2025 **
   2026 ** Description:     Configure the NFC controller.
   2027 **
   2028 ** Returns:         None
   2029 **
   2030 *******************************************************************************/
   2031 void doStartupConfig()
   2032 {
   2033     struct nfc_jni_native_data *nat = getNative(0, 0);
   2034     tNFA_STATUS stat = NFA_STATUS_FAILED;
   2035     int actualLen = 0;
   2036 
   2037     // If polling for Active mode, set the ordering so that we choose Active over Passive mode first.
   2038     if (nat && (nat->tech_mask & (NFA_TECHNOLOGY_MASK_A_ACTIVE | NFA_TECHNOLOGY_MASK_F_ACTIVE)))
   2039     {
   2040         UINT8  act_mode_order_param[] = { 0x01 };
   2041         SyncEventGuard guard (sNfaSetConfigEvent);
   2042         stat = NFA_SetConfig(NCI_PARAM_ID_ACT_ORDER, sizeof(act_mode_order_param), &act_mode_order_param[0]);
   2043         if (stat == NFA_STATUS_OK)
   2044             sNfaSetConfigEvent.wait ();
   2045     }
   2046 
   2047     //configure RF polling frequency for each technology
   2048     static tNFA_DM_DISC_FREQ_CFG nfa_dm_disc_freq_cfg;
   2049     //values in the polling_frequency[] map to members of nfa_dm_disc_freq_cfg
   2050     UINT8 polling_frequency [8] = {1, 1, 1, 1, 1, 1, 1, 1};
   2051     actualLen = GetStrValue(NAME_POLL_FREQUENCY, (char*)polling_frequency, 8);
   2052     if (actualLen == 8)
   2053     {
   2054         ALOGD ("%s: polling frequency", __FUNCTION__);
   2055         memset (&nfa_dm_disc_freq_cfg, 0, sizeof(nfa_dm_disc_freq_cfg));
   2056         nfa_dm_disc_freq_cfg.pa = polling_frequency [0];
   2057         nfa_dm_disc_freq_cfg.pb = polling_frequency [1];
   2058         nfa_dm_disc_freq_cfg.pf = polling_frequency [2];
   2059         nfa_dm_disc_freq_cfg.pi93 = polling_frequency [3];
   2060         nfa_dm_disc_freq_cfg.pbp = polling_frequency [4];
   2061         nfa_dm_disc_freq_cfg.pk = polling_frequency [5];
   2062         nfa_dm_disc_freq_cfg.paa = polling_frequency [6];
   2063         nfa_dm_disc_freq_cfg.pfa = polling_frequency [7];
   2064         p_nfa_dm_rf_disc_freq_cfg = &nfa_dm_disc_freq_cfg;
   2065     }
   2066 }
   2067 
   2068 
   2069 /*******************************************************************************
   2070 **
   2071 ** Function:        nfcManager_isNfcActive
   2072 **
   2073 ** Description:     Used externaly to determine if NFC is active or not.
   2074 **
   2075 ** Returns:         'true' if the NFC stack is running, else 'false'.
   2076 **
   2077 *******************************************************************************/
   2078 bool nfcManager_isNfcActive()
   2079 {
   2080     return sIsNfaEnabled;
   2081 }
   2082 
   2083 void restartPollingWithTechMask (int tech_mask)
   2084 {
   2085     tNFA_STATUS stat = NFA_STATUS_FAILED;
   2086     startRfDiscovery (false);
   2087     {
   2088         SyncEventGuard guard (sNfaEnableDisablePollingEvent);
   2089         stat = NFA_DisablePolling ();
   2090         if (stat == NFA_STATUS_OK)
   2091         {
   2092             ALOGD ("%s: wait for enable event", __FUNCTION__);
   2093             sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_DISABLED_EVT
   2094         }
   2095         else
   2096         {
   2097             ALOGE ("%s: failed to disable polling; error=0x%X", __FUNCTION__, stat);
   2098             goto TheEnd;
   2099         }
   2100         stat = NFA_EnablePolling (tech_mask);
   2101         if (stat == NFA_STATUS_OK)
   2102         {
   2103             ALOGD ("%s: wait for enable event", __FUNCTION__);
   2104             sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_ENABLED_EVT
   2105         }
   2106         else
   2107             ALOGE ("%s: fail enable polling; error=0x%X", __FUNCTION__, stat);
   2108     }
   2109 TheEnd:
   2110     startRfDiscovery(true);
   2111 }
   2112 
   2113 /*******************************************************************************
   2114 **
   2115 ** Function:        startStopPolling
   2116 **
   2117 ** Description:     Start or stop polling.
   2118 **                  isStartPolling: true to start polling; false to stop polling.
   2119 **
   2120 ** Returns:         None.
   2121 **
   2122 *******************************************************************************/
   2123 void startStopPolling (bool isStartPolling)
   2124 {
   2125     ALOGD ("%s: enter; isStart=%u", __FUNCTION__, isStartPolling);
   2126     tNFA_STATUS stat = NFA_STATUS_FAILED;
   2127 
   2128     startRfDiscovery (false);
   2129     if (isStartPolling)
   2130     {
   2131         tNFA_TECHNOLOGY_MASK tech_mask = DEFAULT_TECH_MASK;
   2132         unsigned long num = 0;
   2133         if (GetNumValue(NAME_POLLING_TECH_MASK, &num, sizeof(num)))
   2134             tech_mask = num;
   2135 
   2136         SyncEventGuard guard (sNfaEnableDisablePollingEvent);
   2137         ALOGD ("%s: enable polling", __FUNCTION__);
   2138         stat = NFA_EnablePolling (tech_mask);
   2139         if (stat == NFA_STATUS_OK)
   2140         {
   2141             ALOGD ("%s: wait for enable event", __FUNCTION__);
   2142             sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_ENABLED_EVT
   2143         }
   2144         else
   2145             ALOGE ("%s: fail enable polling; error=0x%X", __FUNCTION__, stat);
   2146     }
   2147     else
   2148     {
   2149         SyncEventGuard guard (sNfaEnableDisablePollingEvent);
   2150         ALOGD ("%s: disable polling", __FUNCTION__);
   2151         stat = NFA_DisablePolling ();
   2152         if (stat == NFA_STATUS_OK)
   2153         {
   2154             sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_DISABLED_EVT
   2155         }
   2156         else
   2157             ALOGE ("%s: fail disable polling; error=0x%X", __FUNCTION__, stat);
   2158     }
   2159     startRfDiscovery (true);
   2160     ALOGD ("%s: exit", __FUNCTION__);
   2161 }
   2162 
   2163 
   2164 } /* namespace android */
   2165