NativeNfcManager.cpp revision a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2f
1525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/* 2525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Copyright (C) 2012 The Android Open Source Project 3525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * 4525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * you may not use this file except in compliance with the License. 6525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * You may obtain a copy of the License at 7525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * 8525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * 10525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * See the License for the specific language governing permissions and 14525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * limitations under the License. 15525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */ 16525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 17525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include <semaphore.h> 18525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include <errno.h> 19525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "OverrideLog.h" 20525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "NfcJniUtil.h" 21525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "NfcAdaptation.h" 22525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "SyncEvent.h" 23525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "PeerToPeer.h" 24525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "SecureElement.h" 259f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen#include "RoutingManager.h" 26525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "NfcTag.h" 27525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "config.h" 28525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "PowerSwitch.h" 29525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "JavaClassConstants.h" 30525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "Pn544Interop.h" 312534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes#include <ScopedLocalRef.h> 322534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes#include <ScopedUtfChars.h> 339f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen#include <ScopedPrimitiveArray.h> 34525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 35525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectextern "C" 36525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 37525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project #include "nfa_api.h" 38525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project #include "nfa_p2p_api.h" 39525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project #include "rw_api.h" 40525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project #include "nfa_ee_api.h" 41525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project #include "nfc_brcm_defs.h" 42525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project #include "ce_api.h" 43525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 44525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 45525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectextern UINT8 *p_nfa_dm_start_up_cfg; 46525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectextern const UINT8 nfca_version_string []; 47a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuextern const UINT8 nfa_version_string []; 48a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuextern tNFA_DM_DISC_FREQ_CFG* p_nfa_dm_rf_disc_freq_cfg; //defined in stack 49525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android 50525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 51525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project extern bool gIsTagDeactivating; 52525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project extern bool gIsSelectingRfInterface; 53525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project extern void nativeNfcTag_doTransceiveStatus (uint8_t * buf, uint32_t buflen); 54a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu extern void nativeNfcTag_notifyRfTimeout (); 55525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project extern void nativeNfcTag_doConnectStatus (jboolean is_connect_ok); 56525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project extern void nativeNfcTag_doDeactivateStatus (int status); 57525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project extern void nativeNfcTag_doWriteStatus (jboolean is_write_ok); 58525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project extern void nativeNfcTag_doCheckNdefResult (tNFA_STATUS status, uint32_t max_size, uint32_t current_size, uint8_t flags); 59525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project extern void nativeNfcTag_doMakeReadonlyResult (tNFA_STATUS status); 60525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project extern void nativeNfcTag_doPresenceCheckResult (tNFA_STATUS status); 61525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project extern void nativeNfcTag_formatStatus (bool is_ok); 62525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project extern void nativeNfcTag_resetPresenceCheck (); 63525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project extern void nativeNfcTag_doReadCompleted (tNFA_STATUS status); 64525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project extern void nativeNfcTag_abortWaits (); 65525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project extern void nativeLlcpConnectionlessSocket_abortWait (); 66525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project extern void nativeNfcTag_registerNdefTypeHandler (); 67525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project extern void nativeLlcpConnectionlessSocket_receiveData (uint8_t* data, uint32_t len, uint32_t remote_sap); 68525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 69525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 70525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 71525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/***************************************************************************** 72525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 73525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** public variables and functions 74525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 75525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/ 76a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chubool gActivated = false; 77a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan ChuSyncEvent gDeactivatedEvent; 78525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 79525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android 80525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 81525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project jmethodID gCachedNfcManagerNotifyNdefMessageListeners; 82525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project jmethodID gCachedNfcManagerNotifyTransactionListeners; 83525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project jmethodID gCachedNfcManagerNotifyLlcpLinkActivation; 84525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project jmethodID gCachedNfcManagerNotifyLlcpLinkDeactivated; 8557a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen jmethodID gCachedNfcManagerNotifyLlcpFirstPacketReceived; 86525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project jmethodID gCachedNfcManagerNotifySeFieldActivated; 87525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project jmethodID gCachedNfcManagerNotifySeFieldDeactivated; 88525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project jmethodID gCachedNfcManagerNotifySeListenActivated; 89525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project jmethodID gCachedNfcManagerNotifySeListenDeactivated; 909f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen jmethodID gCachedNfcManagerNotifyHostEmuActivated; 919f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen jmethodID gCachedNfcManagerNotifyHostEmuData; 929f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen jmethodID gCachedNfcManagerNotifyHostEmuDeactivated; 93525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project const char* gNativeP2pDeviceClassName = "com/android/nfc/dhimpl/NativeP2pDevice"; 94525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project const char* gNativeLlcpServiceSocketClassName = "com/android/nfc/dhimpl/NativeLlcpServiceSocket"; 95525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project const char* gNativeLlcpConnectionlessSocketClassName = "com/android/nfc/dhimpl/NativeLlcpConnectionlessSocket"; 96525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project const char* gNativeLlcpSocketClassName = "com/android/nfc/dhimpl/NativeLlcpSocket"; 97525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project const char* gNativeNfcTagClassName = "com/android/nfc/dhimpl/NativeNfcTag"; 98525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project const char* gNativeNfcManagerClassName = "com/android/nfc/dhimpl/NativeNfcManager"; 99525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project const char* gNativeNfcSecureElementClassName = "com/android/nfc/dhimpl/NativeNfcSecureElement"; 100525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project void doStartupConfig (); 101525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project void startStopPolling (bool isStartPolling); 102525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project void startRfDiscovery (bool isStart); 10361beae816af13f75dabb484d287739723c716deeMartijn Coenen void setUiccIdleTimeout (bool enable); 104c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen void restartPollingWithTechMask(int mask); 105525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 106525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 107525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 108525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/***************************************************************************** 109525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** private variables and functions 111525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 112525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/ 113525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android 114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jint sLastError = ERROR_BUFFER_TOO_SMALL; 116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jmethodID sCachedNfcManagerNotifySeApduReceived; 117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jmethodID sCachedNfcManagerNotifySeMifareAccess; 118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jmethodID sCachedNfcManagerNotifySeEmvCardRemoval; 119525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jmethodID sCachedNfcManagerNotifyTargetDeselected; 120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent sNfaEnableEvent; //event for NFA_Enable() 121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent sNfaDisableEvent; //event for NFA_Disable() 122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent sNfaEnableDisablePollingEvent; //event for NFA_EnablePolling(), NFA_DisablePolling() 123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent sNfaSetConfigEvent; // event for Set_Config.... 124f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenenstatic SyncEvent sNfaGetConfigEvent; // event for Get_Config.... 125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool sIsNfaEnabled = false; 126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool sDiscoveryEnabled = false; //is polling for tag? 127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool sIsDisabling = false; 128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool sRfEnabled = false; // whether RF discovery is enabled 129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool sSeRfActive = false; // whether RF with SE is likely active 130c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenenstatic bool sReaderModeEnabled = false; // whether we're only reading tags, not allowing P2p/card emu 131525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool sP2pActive = false; // whether p2p was last active 132525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool sAbortConnlessWait = false; 133525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool sIsSecElemSelected = false; //has NFC service selected a sec elem 134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define CONFIG_UPDATE_TECH_MASK (1 << 1) 135525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define DEFAULT_TECH_MASK (NFA_TECHNOLOGY_MASK_A \ 136525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project | NFA_TECHNOLOGY_MASK_B \ 137525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project | NFA_TECHNOLOGY_MASK_F \ 138525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project | NFA_TECHNOLOGY_MASK_ISO15693 \ 139525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project | NFA_TECHNOLOGY_MASK_B_PRIME \ 140525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project | NFA_TECHNOLOGY_MASK_A_ACTIVE \ 14197a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu | NFA_TECHNOLOGY_MASK_F_ACTIVE \ 14297a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu | NFA_TECHNOLOGY_MASK_KOVIO) 143c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen#define DEFAULT_DISCOVERY_DURATION 500 1448d154680537afa5242edeb98c8f414d6186558cfMartijn Coenen#define READER_MODE_DISCOVERY_DURATION 200 145525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 146525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void nfaConnectionCallback (UINT8 event, tNFA_CONN_EVT_DATA *eventData); 147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void nfaDeviceManagementCallback (UINT8 event, tNFA_DM_CBACK_DATA *eventData); 148525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool isPeerToPeer (tNFA_ACTIVATED& activated); 149525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool isListenMode(tNFA_ACTIVATED& activated); 150d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Moralesstatic void enableDisableLptd (bool enable); 151525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 152f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenenstatic UINT16 sCurrentConfigLen; 153f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenenstatic UINT8 sConfig[256]; 154c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen 155525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project///////////////////////////////////////////////////////////// 156525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project///////////////////////////////////////////////////////////// 157525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 158525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 159525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 161525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: getNative 162525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Get native data 164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Native data structure. 166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnfc_jni_native_data *getNative (JNIEnv* e, jobject o) 169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static struct nfc_jni_native_data *sCachedNat = NULL; 171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (e) 172525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 173525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sCachedNat = nfc_jni_get_nat(e, o); 174525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 175525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return sCachedNat; 176525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 177525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 178525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 179525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 180525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 181525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: handleRfDiscoveryEvent 182525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 183525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Handle RF-discovery events from the stack. 184525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** discoveredDevice: Discovered device. 185525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 186525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 187525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 188525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 189525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void handleRfDiscoveryEvent (tNFC_RESULT_DEVT* discoveredDevice) 190525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 191525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (discoveredDevice->more) 192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 193525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //there is more discovery notification coming 194525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return; 195525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 196525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 197525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project bool isP2p = NfcTag::getInstance ().isP2pDiscovered (); 198c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen if (!sReaderModeEnabled && isP2p) 199525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 200525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //select the peer that supports P2P 201525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcTag::getInstance ().selectP2p(); 202525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 203525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 204525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 205525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //select the first of multiple tags that is discovered 206525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcTag::getInstance ().selectFirstTag(); 207525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 208525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 209525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 210525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 211525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 212525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 213525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfaConnectionCallback 214525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 215525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Receive connection-related events from stack. 216525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** connEvent: Event code. 217525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** eventData: Event data. 218525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 219525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 220525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 221525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 222525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void nfaConnectionCallback (UINT8 connEvent, tNFA_CONN_EVT_DATA* eventData) 223525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 224525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_STATUS status = NFA_STATUS_FAILED; 225525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: event= %u", __FUNCTION__, connEvent); 226525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 227525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (connEvent) 228525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 229525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_POLL_ENABLED_EVT: // whether polling successfully started 230525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 231525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_POLL_ENABLED_EVT: status = %u", __FUNCTION__, eventData->status); 232525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 233525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (sNfaEnableDisablePollingEvent); 234525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sNfaEnableDisablePollingEvent.notifyOne (); 235525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 236525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 237525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 238525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_POLL_DISABLED_EVT: // Listening/Polling stopped 239525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 240525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_POLL_DISABLED_EVT: status = %u", __FUNCTION__, eventData->status); 241525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 242525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (sNfaEnableDisablePollingEvent); 243525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sNfaEnableDisablePollingEvent.notifyOne (); 244525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 245525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 246525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 247525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_RF_DISCOVERY_STARTED_EVT: // RF Discovery started 248525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 249525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_RF_DISCOVERY_STARTED_EVT: status = %u", __FUNCTION__, eventData->status); 250525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 251525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (sNfaEnableDisablePollingEvent); 252525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sNfaEnableDisablePollingEvent.notifyOne (); 253525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 256525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_RF_DISCOVERY_STOPPED_EVT: // RF Discovery stopped event 257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_RF_DISCOVERY_STOPPED_EVT: status = %u", __FUNCTION__, eventData->status); 259525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 260525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (sNfaEnableDisablePollingEvent); 261525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sNfaEnableDisablePollingEvent.notifyOne (); 262525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 263525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 264525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 265525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_DISC_RESULT_EVT: // NFC link/protocol discovery notificaiton 266525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project status = eventData->disc_result.status; 267525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_DISC_RESULT_EVT: status = %d", __FUNCTION__, status); 268525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (status != NFA_STATUS_OK) 269525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 270525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE("%s: NFA_DISC_RESULT_EVT error: status = %d", __FUNCTION__, status); 271525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 272525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 273525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 274525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcTag::getInstance().connectionEventHandler(connEvent, eventData); 275525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project handleRfDiscoveryEvent(&eventData->disc_result.discovery_ntf); 276525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 277525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 278525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 279525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_SELECT_RESULT_EVT: // NFC link/protocol discovery select response 280525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_SELECT_RESULT_EVT: status = %d, gIsSelectingRfInterface = %d, sIsDisabling=%d", __FUNCTION__, eventData->status, gIsSelectingRfInterface, sIsDisabling); 281525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 282525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sIsDisabling) 283525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 284525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 285525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (eventData->status != NFA_STATUS_OK) 286525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 287525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (gIsSelectingRfInterface) 288525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 289525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nativeNfcTag_doConnectStatus(false); 290525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 291525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 292525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE("%s: NFA_SELECT_RESULT_EVT error: status = %d", __FUNCTION__, eventData->status); 293525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NFA_Deactivate (FALSE); 294525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 295525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 296525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 297525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_DEACTIVATE_FAIL_EVT: 298525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_DEACTIVATE_FAIL_EVT: status = %d", __FUNCTION__, eventData->status); 299525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 300525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 301525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_ACTIVATED_EVT: // NFC link/protocol activated 302525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_ACTIVATED_EVT: gIsSelectingRfInterface=%d, sIsDisabling=%d", __FUNCTION__, gIsSelectingRfInterface, sIsDisabling); 303a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu NfcTag::getInstance().setActive(true); 304b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen if (sIsDisabling || !sIsNfaEnabled) 305525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 306a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu gActivated = true; 307525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 308525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcTag::getInstance().setActivationState (); 309525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (gIsSelectingRfInterface) 310525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 311525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nativeNfcTag_doConnectStatus(true); 312525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 313525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 314525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 315525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nativeNfcTag_resetPresenceCheck(); 316525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (isPeerToPeer(eventData->activated)) 317525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 318f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen if (sReaderModeEnabled) 319f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen { 320f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen ALOGD("%s: ignoring peer target in reader mode.", __FUNCTION__); 321f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen NFA_Deactivate (FALSE); 322f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen break; 323f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen } 324525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sP2pActive = true; 325525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_ACTIVATED_EVT; is p2p", __FUNCTION__); 326525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // Disable RF field events in case of p2p 327525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project UINT8 nfa_disable_rf_events[] = { 0x00 }; 328525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: Disabling RF field events", __FUNCTION__); 329525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project status = NFA_SetConfig(NCI_PARAM_ID_RF_FIELD_INFO, sizeof(nfa_disable_rf_events), 330525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project &nfa_disable_rf_events[0]); 331525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (status == NFA_STATUS_OK) { 332525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: Disabled RF field events", __FUNCTION__); 333525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } else { 334525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: Failed to disable RF field events", __FUNCTION__); 335525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 33657a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen // For the SE, consider the field to be on while p2p is active. 33757a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen SecureElement::getInstance().notifyRfFieldEvent (true); 338525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 339525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else if (pn544InteropIsBusy() == false) 340525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 341525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcTag::getInstance().connectionEventHandler (connEvent, eventData); 342525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 343525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // We know it is not activating for P2P. If it activated in 34457a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen // listen mode then it is likely for an SE transaction. 345525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // Send the RF Event. 346525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (isListenMode(eventData->activated)) 347525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 348525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sSeRfActive = true; 349525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SecureElement::getInstance().notifyListenModeState (true); 350525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 351525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 352525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 353525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 354525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_DEACTIVATED_EVT: // NFC link/protocol deactivated 355525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_DEACTIVATED_EVT Type: %u, gIsTagDeactivating: %d", __FUNCTION__, eventData->deactivated.type,gIsTagDeactivating); 356525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcTag::getInstance().setDeactivationState (eventData->deactivated); 357525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (eventData->deactivated.type != NFA_DEACTIVATE_TYPE_SLEEP) 358525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 359a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 360a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu SyncEventGuard g (gDeactivatedEvent); 361a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu gActivated = false; //guard this variable from multi-threaded access 362a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu gDeactivatedEvent.notifyOne (); 363a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu } 364525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nativeNfcTag_resetPresenceCheck(); 365525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcTag::getInstance().connectionEventHandler (connEvent, eventData); 366525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nativeNfcTag_abortWaits(); 367525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcTag::getInstance().abort (); 368525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 369525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else if (gIsTagDeactivating) 370525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 371a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu NfcTag::getInstance().setActive(false); 372525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nativeNfcTag_doDeactivateStatus(0); 373525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 374525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 375525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // If RF is activated for what we think is a Secure Element transaction 376525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // and it is deactivated to either IDLE or DISCOVERY mode, notify w/event. 377525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if ((eventData->deactivated.type == NFA_DEACTIVATE_TYPE_IDLE) 378525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project || (eventData->deactivated.type == NFA_DEACTIVATE_TYPE_DISCOVERY)) 379525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 380525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sSeRfActive) { 381525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sSeRfActive = false; 382b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen if (!sIsDisabling && sIsNfaEnabled) 383b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen SecureElement::getInstance().notifyListenModeState (false); 384525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } else if (sP2pActive) { 385525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sP2pActive = false; 386525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // Make sure RF field events are re-enabled 387b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen ALOGD("%s: NFA_DEACTIVATED_EVT; is p2p", __FUNCTION__); 388525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // Disable RF field events in case of p2p 389525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project UINT8 nfa_enable_rf_events[] = { 0x01 }; 390525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 391b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen if (!sIsDisabling && sIsNfaEnabled) 392b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen { 393b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen ALOGD ("%s: Enabling RF field events", __FUNCTION__); 394b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen status = NFA_SetConfig(NCI_PARAM_ID_RF_FIELD_INFO, sizeof(nfa_enable_rf_events), 395b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen &nfa_enable_rf_events[0]); 396b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen if (status == NFA_STATUS_OK) { 397b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen ALOGD ("%s: Enabled RF field events", __FUNCTION__); 398b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen } else { 399b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen ALOGE ("%s: Failed to enable RF field events", __FUNCTION__); 400b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen } 401b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen // Consider the field to be off at this point 402b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen SecureElement::getInstance().notifyRfFieldEvent (false); 403525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 404525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 405525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 406525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 407525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 408525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 409525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_TLV_DETECT_EVT: // TLV Detection complete 410525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project status = eventData->tlv_detect.status; 411525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_TLV_DETECT_EVT: status = %d, protocol = %d, num_tlvs = %d, num_bytes = %d", 412525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project __FUNCTION__, status, eventData->tlv_detect.protocol, 413525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project eventData->tlv_detect.num_tlvs, eventData->tlv_detect.num_bytes); 414525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (status != NFA_STATUS_OK) 415525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 416525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE("%s: NFA_TLV_DETECT_EVT error: status = %d", __FUNCTION__, status); 417525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 418525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 419525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 420525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_NDEF_DETECT_EVT: // NDEF Detection complete; 421525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //if status is failure, it means the tag does not contain any or valid NDEF data; 422525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //pass the failure status to the NFC Service; 423525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project status = eventData->ndef_detect.status; 424525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_NDEF_DETECT_EVT: status = 0x%X, protocol = %u, " 425525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project "max_size = %lu, cur_size = %lu, flags = 0x%X", __FUNCTION__, 426525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project status, 427525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project eventData->ndef_detect.protocol, eventData->ndef_detect.max_size, 428525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project eventData->ndef_detect.cur_size, eventData->ndef_detect.flags); 429525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcTag::getInstance().connectionEventHandler (connEvent, eventData); 430525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nativeNfcTag_doCheckNdefResult(status, 431525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project eventData->ndef_detect.max_size, eventData->ndef_detect.cur_size, 432525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project eventData->ndef_detect.flags); 433525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 434525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 435525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_DATA_EVT: // Data message received (for non-NDEF reads) 436525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_DATA_EVT: len = %d", __FUNCTION__, eventData->data.len); 437525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nativeNfcTag_doTransceiveStatus(eventData->data.p_data,eventData->data.len); 438525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 439a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu case NFA_RW_INTF_ERROR_EVT: 440a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD("%s: NFC_RW_INTF_ERROR_EVT", __FUNCTION__); 441a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu nativeNfcTag_notifyRfTimeout(); 442a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu break; 443525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_SELECT_CPLT_EVT: // Select completed 444525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project status = eventData->status; 445525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_SELECT_CPLT_EVT: status = %d", __FUNCTION__, status); 446525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (status != NFA_STATUS_OK) 447525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 448525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE("%s: NFA_SELECT_CPLT_EVT error: status = %d", __FUNCTION__, status); 449525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 450525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 451525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 452525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_READ_CPLT_EVT: // NDEF-read or tag-specific-read completed 453525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_READ_CPLT_EVT: status = 0x%X", __FUNCTION__, eventData->status); 454525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nativeNfcTag_doReadCompleted (eventData->status); 455525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcTag::getInstance().connectionEventHandler (connEvent, eventData); 456525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 457525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 458525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_WRITE_CPLT_EVT: // Write completed 459525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_WRITE_CPLT_EVT: status = %d", __FUNCTION__, eventData->status); 460525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nativeNfcTag_doWriteStatus (eventData->status == NFA_STATUS_OK); 461525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 462525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 463525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_SET_TAG_RO_EVT: // Tag set as Read only 464525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_SET_TAG_RO_EVT: status = %d", __FUNCTION__, eventData->status); 465525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nativeNfcTag_doMakeReadonlyResult(eventData->status); 466525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 467525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 468525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_CE_NDEF_WRITE_START_EVT: // NDEF write started 469525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_CE_NDEF_WRITE_START_EVT: status: %d", __FUNCTION__, eventData->status); 470525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 471525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (eventData->status != NFA_STATUS_OK) 472525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE("%s: NFA_CE_NDEF_WRITE_START_EVT error: status = %d", __FUNCTION__, eventData->status); 473525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 474525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 475525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_CE_NDEF_WRITE_CPLT_EVT: // NDEF write completed 476525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: FA_CE_NDEF_WRITE_CPLT_EVT: len = %lu", __FUNCTION__, eventData->ndef_write_cplt.len); 477525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 478525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 479525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_LLCP_ACTIVATED_EVT: // LLCP link is activated 480525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_LLCP_ACTIVATED_EVT: is_initiator: %d remote_wks: %d, remote_lsc: %d, remote_link_miu: %d, local_link_miu: %d", 481525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project __FUNCTION__, 482525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project eventData->llcp_activated.is_initiator, 483525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project eventData->llcp_activated.remote_wks, 484525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project eventData->llcp_activated.remote_lsc, 485525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project eventData->llcp_activated.remote_link_miu, 486525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project eventData->llcp_activated.local_link_miu); 487525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 488525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PeerToPeer::getInstance().llcpActivatedHandler (getNative(0, 0), eventData->llcp_activated); 489525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 490525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 491525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_LLCP_DEACTIVATED_EVT: // LLCP link is deactivated 492525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_LLCP_DEACTIVATED_EVT", __FUNCTION__); 493525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PeerToPeer::getInstance().llcpDeactivatedHandler (getNative(0, 0), eventData->llcp_deactivated); 494525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 49557a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen case NFA_LLCP_FIRST_PACKET_RECEIVED_EVT: // Received first packet over llcp 49657a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen ALOGD("%s: NFA_LLCP_FIRST_PACKET_RECEIVED_EVT", __FUNCTION__); 49757a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen PeerToPeer::getInstance().llcpFirstPacketHandler (getNative(0, 0)); 49857a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen break; 499525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_PRESENCE_CHECK_EVT: 500525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_PRESENCE_CHECK_EVT", __FUNCTION__); 501525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nativeNfcTag_doPresenceCheckResult (eventData->status); 502525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 503525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_FORMAT_CPLT_EVT: 504525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_FORMAT_CPLT_EVT: status=0x%X", __FUNCTION__, eventData->status); 505525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nativeNfcTag_formatStatus (eventData->status == NFA_STATUS_OK); 506525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 507525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 508525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_I93_CMD_CPLT_EVT: 509525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_I93_CMD_CPLT_EVT: status=0x%X", __FUNCTION__, eventData->status); 510525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 511525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 512525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_CE_UICC_LISTEN_CONFIGURED_EVT : 513525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_CE_UICC_LISTEN_CONFIGURED_EVT : status=0x%X", __FUNCTION__, eventData->status); 514525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SecureElement::getInstance().connectionEventHandler (connEvent, eventData); 515525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 516525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 517525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_SET_P2P_LISTEN_TECH_EVT: 518525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: NFA_SET_P2P_LISTEN_TECH_EVT", __FUNCTION__); 519525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PeerToPeer::getInstance().connectionEventHandler (connEvent, eventData); 520525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 521525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 522525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project default: 523525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE("%s: unknown event ????", __FUNCTION__); 524525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 525525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 526525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 527525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 528525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 529525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 530525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 531525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_initNativeStruc 532525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 533525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Initialize variables. 534525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 535525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 536525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 537525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if ok. 538525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 539525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 540525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean nfcManager_initNativeStruc (JNIEnv* e, jobject o) 541525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 542525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter", __FUNCTION__); 543525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 5442534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes nfc_jni_native_data* nat = (nfc_jni_native_data*)malloc(sizeof(struct nfc_jni_native_data)); 545525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (nat == NULL) 546525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 547525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: fail allocate native data", __FUNCTION__); 548525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return JNI_FALSE; 549525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 550525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 551525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memset (nat, 0, sizeof(*nat)); 5522534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->GetJavaVM(&(nat->vm)); 5532534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes nat->env_version = e->GetVersion(); 5542534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes nat->manager = e->NewGlobalRef(o); 555525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 5562534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedLocalRef<jclass> cls(e, e->GetObjectClass(o)); 557fb18ffb259fe8f40e81516842497735a7c0b6a8cAndres Morales jfieldID f = e->GetFieldID(cls.get(), "mNative", "J"); 558fb18ffb259fe8f40e81516842497735a7c0b6a8cAndres Morales e->SetLongField(o, f, (jlong)nat); 559525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 560525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Initialize native cached references */ 5612534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes gCachedNfcManagerNotifyNdefMessageListeners = e->GetMethodID(cls.get(), 562525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project "notifyNdefMessageListeners", "(Lcom/android/nfc/dhimpl/NativeNfcTag;)V"); 5632534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes gCachedNfcManagerNotifyTransactionListeners = e->GetMethodID(cls.get(), 564525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project "notifyTransactionListeners", "([B)V"); 5652534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes gCachedNfcManagerNotifyLlcpLinkActivation = e->GetMethodID(cls.get(), 566525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project "notifyLlcpLinkActivation", "(Lcom/android/nfc/dhimpl/NativeP2pDevice;)V"); 5672534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes gCachedNfcManagerNotifyLlcpLinkDeactivated = e->GetMethodID(cls.get(), 568525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project "notifyLlcpLinkDeactivated", "(Lcom/android/nfc/dhimpl/NativeP2pDevice;)V"); 56957a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen gCachedNfcManagerNotifyLlcpFirstPacketReceived = e->GetMethodID(cls.get(), 57057a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen "notifyLlcpLinkFirstPacketReceived", "(Lcom/android/nfc/dhimpl/NativeP2pDevice;)V"); 5712534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes sCachedNfcManagerNotifyTargetDeselected = e->GetMethodID(cls.get(), 572525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project "notifyTargetDeselected","()V"); 5732534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes gCachedNfcManagerNotifySeFieldActivated = e->GetMethodID(cls.get(), 574525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project "notifySeFieldActivated", "()V"); 5752534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes gCachedNfcManagerNotifySeFieldDeactivated = e->GetMethodID(cls.get(), 576525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project "notifySeFieldDeactivated", "()V"); 5772534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes gCachedNfcManagerNotifySeListenActivated = e->GetMethodID(cls.get(), 578525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project "notifySeListenActivated", "()V"); 5792534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes gCachedNfcManagerNotifySeListenDeactivated = e->GetMethodID(cls.get(), 580525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project "notifySeListenDeactivated", "()V"); 581525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 5829f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen gCachedNfcManagerNotifyHostEmuActivated = e->GetMethodID(cls.get(), 5839f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen "notifyHostEmuActivated", "()V"); 5849f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 5859f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen gCachedNfcManagerNotifyHostEmuData = e->GetMethodID(cls.get(), 5869f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen "notifyHostEmuData", "([B)V"); 5879f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 5889f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen gCachedNfcManagerNotifyHostEmuDeactivated = e->GetMethodID(cls.get(), 5899f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen "notifyHostEmuDeactivated", "()V"); 5909f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 5912534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes sCachedNfcManagerNotifySeApduReceived = e->GetMethodID(cls.get(), 592525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project "notifySeApduReceived", "([B)V"); 593525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 5942534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes sCachedNfcManagerNotifySeMifareAccess = e->GetMethodID(cls.get(), 595525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project "notifySeMifareAccess", "([B)V"); 596525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 5972534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes sCachedNfcManagerNotifySeEmvCardRemoval = e->GetMethodID(cls.get(), 598525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project "notifySeEmvCardRemoval", "()V"); 599525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 6002534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes if (nfc_jni_cache_object(e, gNativeNfcTagClassName, &(nat->cached_NfcTag)) == -1) 601525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 602525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: fail cache NativeNfcTag", __FUNCTION__); 603525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return JNI_FALSE; 604525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 605525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 6062534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes if (nfc_jni_cache_object(e, gNativeP2pDeviceClassName, &(nat->cached_P2pDevice)) == -1) 607525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 608525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: fail cache NativeP2pDevice", __FUNCTION__); 609525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return JNI_FALSE; 610525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 611525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 612525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit", __FUNCTION__); 613525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return JNI_TRUE; 614525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 615525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 616525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 617525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 618525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 619525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfaDeviceManagementCallback 620525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 621525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Receive device management events from stack. 622525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** dmEvent: Device-management event ID. 623525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** eventData: Data associated with event ID. 624525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 625525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 626525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 627525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 628525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nfaDeviceManagementCallback (UINT8 dmEvent, tNFA_DM_CBACK_DATA* eventData) 629525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 630525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter; event=0x%X", __FUNCTION__, dmEvent); 631525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 632525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (dmEvent) 633525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 634525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_DM_ENABLE_EVT: /* Result of NFA_Enable */ 635525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 636525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (sNfaEnableEvent); 637525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: NFA_DM_ENABLE_EVT; status=0x%X", 638525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project __FUNCTION__, eventData->status); 639525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sIsNfaEnabled = eventData->status == NFA_STATUS_OK; 640525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sIsDisabling = false; 641525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sNfaEnableEvent.notifyOne (); 642525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 643525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 644525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 645525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_DM_DISABLE_EVT: /* Result of NFA_Disable */ 646525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 647525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (sNfaDisableEvent); 648525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: NFA_DM_DISABLE_EVT", __FUNCTION__); 649525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sIsNfaEnabled = false; 650525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sIsDisabling = false; 651525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sNfaDisableEvent.notifyOne (); 652525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 653525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 654525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 655525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_DM_SET_CONFIG_EVT: //result of NFA_SetConfig 656525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: NFA_DM_SET_CONFIG_EVT", __FUNCTION__); 657525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 658525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (sNfaSetConfigEvent); 659525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sNfaSetConfigEvent.notifyOne(); 660525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 661525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 662525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 663525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_DM_GET_CONFIG_EVT: /* Result of NFA_GetConfig */ 664525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: NFA_DM_GET_CONFIG_EVT", __FUNCTION__); 665f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen { 666f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen SyncEventGuard guard (sNfaGetConfigEvent); 667f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen if (eventData->status == NFA_STATUS_OK && 668f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen eventData->get_config.tlv_size <= sizeof(sConfig)) 669f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen { 670f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen sCurrentConfigLen = eventData->get_config.tlv_size; 671f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen memcpy(sConfig, eventData->get_config.param_tlvs, eventData->get_config.tlv_size); 672f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen } 673f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen else 674f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen { 675f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen ALOGE("%s: NFA_DM_GET_CONFIG failed", __FUNCTION__); 676f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen sCurrentConfigLen = 0; 677f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen } 678f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen sNfaGetConfigEvent.notifyOne(); 679f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen } 680525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 681525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 682525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_DM_RF_FIELD_EVT: 683525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: NFA_DM_RF_FIELD_EVT; status=0x%X; field status=%u", __FUNCTION__, 684525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project eventData->rf_field.status, eventData->rf_field.rf_field_status); 685b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen if (sIsDisabling || !sIsNfaEnabled) 686b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen break; 687525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 688b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen if (!sP2pActive && eventData->rf_field.status == NFA_STATUS_OK) 689b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen SecureElement::getInstance().notifyRfFieldEvent ( 690b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen eventData->rf_field.rf_field_status == NFA_DM_RF_FIELD_ON); 691525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 692525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 693525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_DM_NFCC_TRANSPORT_ERR_EVT: 694525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_DM_NFCC_TIMEOUT_EVT: 695525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 696525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (dmEvent == NFA_DM_NFCC_TIMEOUT_EVT) 697a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGE ("%s: NFA_DM_NFCC_TIMEOUT_EVT; abort", __FUNCTION__); 698a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu else if (dmEvent == NFA_DM_NFCC_TRANSPORT_ERR_EVT) 699a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGE ("%s: NFA_DM_NFCC_TRANSPORT_ERR_EVT; abort", __FUNCTION__); 700525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 701525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nativeNfcTag_abortWaits(); 702525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcTag::getInstance().abort (); 703525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sAbortConnlessWait = true; 704525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nativeLlcpConnectionlessSocket_abortWait(); 705525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 706525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: aborting sNfaEnableDisablePollingEvent", __FUNCTION__); 707525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (sNfaEnableDisablePollingEvent); 708525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sNfaEnableDisablePollingEvent.notifyOne(); 709525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 710525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 711525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: aborting sNfaEnableEvent", __FUNCTION__); 712525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (sNfaEnableEvent); 713525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sNfaEnableEvent.notifyOne(); 714525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 715525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 716525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: aborting sNfaDisableEvent", __FUNCTION__); 717525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (sNfaDisableEvent); 718525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sNfaDisableEvent.notifyOne(); 719525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 720525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sDiscoveryEnabled = false; 721525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PowerSwitch::getInstance ().abort (); 722525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 723525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (!sIsDisabling && sIsNfaEnabled) 724525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 725525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NFA_Disable(FALSE); 726525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sIsDisabling = true; 727525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 728525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 729525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 730525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sIsNfaEnabled = false; 731525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sIsDisabling = false; 732525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 733525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PowerSwitch::getInstance ().initialize (PowerSwitch::UNKNOWN_LEVEL); 734a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGE ("%s: crash NFC service", __FUNCTION__); 735a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ////////////////////////////////////////////// 736a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu //crash the NFC service process so it can restart automatically 737a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu abort (); 738a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ////////////////////////////////////////////// 739525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 740525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 741525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 742525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_DM_PWR_MODE_CHANGE_EVT: 743525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PowerSwitch::getInstance ().deviceManagementCallback (dmEvent, eventData); 744525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 745525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 746525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project default: 747525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: unhandled event", __FUNCTION__); 748525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 749525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 750525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 751525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 7529f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen/******************************************************************************* 7539f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 7549f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Function: nfcManager_sendRawFrame 7559f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 7569f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Description: Send a raw frame. 7579f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** e: JVM environment. 7589f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** o: Java object. 7599f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 7609f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Returns: True if ok. 7619f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 7629f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen*******************************************************************************/ 763c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenenstatic jboolean nfcManager_sendRawFrame (JNIEnv* e, jobject, jbyteArray data) 7649f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen{ 7659f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen ScopedByteArrayRO bytes(e, data); 7669f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0])); 7679f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen size_t bufLen = bytes.size(); 7689f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen tNFA_STATUS status = NFA_SendRawFrame (buf, bufLen, 0); 7699f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 7709f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen return (status == NFA_STATUS_OK); 7719f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen} 7729f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 7739f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen/******************************************************************************* 7749f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 7759f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Function: nfcManager_routeAid 7769f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 7779f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Description: Route an AID to an EE 7789f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** e: JVM environment. 7799f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** o: Java object. 7809f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 7819f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Returns: True if ok. 7829f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 7839f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen*******************************************************************************/ 784c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenenstatic jboolean nfcManager_routeAid (JNIEnv* e, jobject, jbyteArray aid, jint route) 7859f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen{ 7869f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen ScopedByteArrayRO bytes(e, aid); 7879f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0])); 7889f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen size_t bufLen = bytes.size(); 7899f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen bool result = RoutingManager::getInstance().addAidRouting(buf, bufLen, route); 7909f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen return result; 7919f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen} 7929f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 7939f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen/******************************************************************************* 7949f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 7959f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Function: nfcManager_unrouteAid 7969f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 7979f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Description: Remove a AID routing 7989f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** e: JVM environment. 7999f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** o: Java object. 8009f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 8019f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Returns: True if ok. 8029f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 8039f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen*******************************************************************************/ 804c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenenstatic jboolean nfcManager_unrouteAid (JNIEnv* e, jobject, jbyteArray aid) 8059f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen{ 8069f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen ScopedByteArrayRO bytes(e, aid); 8079f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0])); 8089f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen size_t bufLen = bytes.size(); 8099f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen bool result = RoutingManager::getInstance().removeAidRouting(buf, bufLen); 8109f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen return result; 8119f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen} 812525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 813525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 814525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 815525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doInitialize 816525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 817525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Turn on NFC. 818525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 819525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 820525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 821525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if ok. 822525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 823525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 824d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Moralesstatic jboolean nfcManager_doInitialize (JNIEnv* e, jobject o, jboolean snooze_mode) 825525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 826a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD ("%s: enter; ver=%s nfa=%s NCI_VERSION=0x%02X", 827a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu __FUNCTION__, nfca_version_string, nfa_version_string, NCI_VERSION); 828525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_STATUS stat = NFA_STATUS_OK; 829525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 830d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales PowerSwitch & powerSwitch = PowerSwitch::getInstance (); 831d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales 832525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sIsNfaEnabled) 833525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 834525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: already enabled", __FUNCTION__); 835525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 836525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 837525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 838d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales powerSwitch.initialize (PowerSwitch::FULL_POWER); 839525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 840525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 841525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project unsigned long num = 0; 842525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 843525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcAdaptation& theInstance = NfcAdaptation::GetInstance(); 844525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project theInstance.Initialize(); //start GKI, NCI task, NFC task 845525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 846525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 847525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (sNfaEnableEvent); 848525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tHAL_NFC_ENTRY* halFuncEntries = theInstance.GetHalEntryFuncs (); 849525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 850d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales if (snooze_mode) 851d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales { 852d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales powerSwitch.setScreenOffPowerState ( 853d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales PowerSwitch::POWER_STATE_FULL); 854d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales } 855d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales 856525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NFA_Init (halFuncEntries); 857525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 858525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project stat = NFA_Enable (nfaDeviceManagementCallback, nfaConnectionCallback); 859525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (stat == NFA_STATUS_OK) 860525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 861525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project num = initializeGlobalAppLogLevel (); 862525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project CE_SetTraceLevel (num); 863525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project LLCP_SetTraceLevel (num); 864525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NFC_SetTraceLevel (num); 865525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project RW_SetTraceLevel (num); 866525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NFA_SetTraceLevel (num); 867525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NFA_P2pSetTraceLevel (num); 868525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sNfaEnableEvent.wait(); //wait for NFA command to finish 869525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 870525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 871525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 872525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (stat == NFA_STATUS_OK) 873525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 874525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //sIsNfaEnabled indicates whether stack started successfully 875525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sIsNfaEnabled) 876525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 877525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SecureElement::getInstance().initialize (getNative(e, o)); 8789f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen RoutingManager::getInstance().initialize(getNative(e, o)); 879525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nativeNfcTag_registerNdefTypeHandler (); 880525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcTag::getInstance().initialize (getNative(e, o)); 881525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PeerToPeer::getInstance().initialize (); 882525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PeerToPeer::getInstance().handleNfcOnOff (true); 883525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 884525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ///////////////////////////////////////////////////////////////////////////////// 885525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // Add extra configuration here (work-arounds, etc.) 886525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 887525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project struct nfc_jni_native_data *nat = getNative(e, o); 888525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 889525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if ( nat ) 890525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 891525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (GetNumValue(NAME_POLLING_TECH_MASK, &num, sizeof(num))) 892525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nat->tech_mask = num; 893525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 894525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nat->tech_mask = DEFAULT_TECH_MASK; 895525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: tag polling tech mask=0x%X", __FUNCTION__, nat->tech_mask); 896525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 897525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 898525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // if this value exists, set polling interval. 899525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (GetNumValue(NAME_NFA_DM_DISC_DURATION_POLL, &num, sizeof(num))) 900c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen nat->discovery_duration = num; 901c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen else 902c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen nat->discovery_duration = DEFAULT_DISCOVERY_DURATION; 903c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen 904c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen NFA_SetRfDiscoveryDuration(nat->discovery_duration); 905525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 906525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // Do custom NFCA startup configuration. 907525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project doStartupConfig(); 908525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 909525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 910525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 911525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 912525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: fail nfa enable; error=0x%X", __FUNCTION__, stat); 913525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 914525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sIsNfaEnabled) 915525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project stat = NFA_Disable (FALSE /* ungraceful */); 916525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 917525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project theInstance.Finalize(); 918525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 919525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 920525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd: 921525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sIsNfaEnabled) 922525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER); 923525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit", __FUNCTION__); 924525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return sIsNfaEnabled ? JNI_TRUE : JNI_FALSE; 925525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 926525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 927525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 928525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 929525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 930525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_enableDiscovery 931525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 932525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Start polling and listening for devices. 933525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 934525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 935d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales** technologies_mask: the bitmask of technologies for which to enable discovery 936d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales** enable_lptd: whether to enable low power polling (default: false) 937525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 938525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 939525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 940525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 941d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Moralesstatic void nfcManager_enableDiscovery (JNIEnv* e, jobject o, jint technologies_mask, \ 942a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales jboolean enable_lptd) 943525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 944525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_TECHNOLOGY_MASK tech_mask = DEFAULT_TECH_MASK; 945525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project struct nfc_jni_native_data *nat = getNative(e, o); 946525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 947d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales if (technologies_mask == 0 && nat) 948525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tech_mask = (tNFA_TECHNOLOGY_MASK)nat->tech_mask; 949d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales else if (technologies_mask != 0) 950d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales tech_mask = (tNFA_TECHNOLOGY_MASK) technologies_mask; 951525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 952525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter; tech_mask = %02x", __FUNCTION__, tech_mask); 953525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 954a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales if (sDiscoveryEnabled) 955525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 956525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: already polling", __FUNCTION__); 957525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return; 958525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 959525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 960525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_STATUS stat = NFA_STATUS_OK; 961525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 962525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: sIsSecElemSelected=%u", __FUNCTION__, sIsSecElemSelected); 963525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 964525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PowerSwitch::getInstance ().setLevel (PowerSwitch::FULL_POWER); 965525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 966525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sRfEnabled) { 967525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // Stop RF discovery to reconfigure 968525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project startRfDiscovery(false); 969525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 970525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 971d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales 972d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales enableDisableLptd(enable_lptd); 973d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales 974a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales { 975a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales SyncEventGuard guard (sNfaEnableDisablePollingEvent); 976a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales stat = NFA_EnablePolling (tech_mask); 977a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales if (stat == NFA_STATUS_OK) 978a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales { 979a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales ALOGD ("%s: wait for enable event", __FUNCTION__); 980a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales sDiscoveryEnabled = true; 981a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_ENABLED_EVT 982a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales ALOGD ("%s: got enabled event", __FUNCTION__); 983a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales } 984a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales else 985a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales { 986a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales ALOGE ("%s: fail enable discovery; error=0x%X", __FUNCTION__, stat); 987a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales } 988a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales } 989525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 990525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // Start P2P listening if tag polling was enabled or the mask was 0. 991525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sDiscoveryEnabled || (tech_mask == 0)) 992525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 993525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: Enable p2pListening", __FUNCTION__); 994a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales PeerToPeer::getInstance().enableP2pListening (true); 995525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 996525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 997525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // Actually start discovery. 998525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project startRfDiscovery (true); 999a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales 1000525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PowerSwitch::getInstance ().setModeOn (PowerSwitch::DISCOVERY); 1001525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1002525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit", __FUNCTION__); 1003525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1004525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1005525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1006525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1007525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1008525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_disableDiscovery 1009525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1010525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Stop polling and listening for devices. 1011525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1012525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1013525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1014525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 1015525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1016525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1017a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Moralesvoid nfcManager_disableDiscovery (JNIEnv*, jobject) 1018525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1019525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_STATUS status = NFA_STATUS_OK; 1020525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter;", __FUNCTION__); 1021525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1022525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project pn544InteropAbortNow (); 1023525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sDiscoveryEnabled == false) 1024525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1025525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: already disabled", __FUNCTION__); 1026525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 1027525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1028525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1029525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // Stop RF Discovery. 1030525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project startRfDiscovery (false); 1031525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1032525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sDiscoveryEnabled) 1033a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales { 1034a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales SyncEventGuard guard (sNfaEnableDisablePollingEvent); 1035a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales status = NFA_DisablePolling (); 1036a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales if (status == NFA_STATUS_OK) 1037a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales { 1038a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales sDiscoveryEnabled = false; 1039a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_DISABLED_EVT 1040a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales } 1041a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales else 1042a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales ALOGE ("%s: Failed to disable polling; error=0x%X", __FUNCTION__, status); 1043a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales } 1044525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1045525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PeerToPeer::getInstance().enableP2pListening (false); 1046525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1047525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //if nothing is active after this, then tell the controller to power down 1048525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (! PowerSwitch::getInstance ().setModeOff (PowerSwitch::DISCOVERY)) 1049525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER); 1050525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1051b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen // We may have had RF field notifications that did not cause 1052b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen // any activate/deactive events. For example, caused by wireless 1053b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen // charging orbs. Those may cause us to go to sleep while the last 1054b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen // field event was indicating a field. To prevent sticking in that 1055b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen // state, always reset the rf field status when we disable discovery. 1056b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen SecureElement::getInstance().resetRfFieldStatus(); 1057525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd: 1058525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit", __FUNCTION__); 1059525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1060525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1061d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenenvoid enableDisableLptd (bool enable) 1062d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen{ 1063d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen // This method is *NOT* thread-safe. Right now 1064d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen // it is only called from the same thread so it's 1065d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen // not an issue. 1066d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen static bool sCheckedLptd = false; 1067d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen static bool sHasLptd = false; 1068d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen 1069d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen tNFA_STATUS stat = NFA_STATUS_OK; 1070d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen if (!sCheckedLptd) 1071d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen { 1072d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen sCheckedLptd = true; 1073d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen SyncEventGuard guard (sNfaGetConfigEvent); 1074d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen tNFA_PMID configParam[1] = {NCI_PARAM_ID_TAGSNIFF_CFG}; 1075d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen stat = NFA_GetConfig(1, configParam); 1076d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen if (stat != NFA_STATUS_OK) 1077d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen { 1078d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen ALOGE("%s: NFA_GetConfig failed", __FUNCTION__); 1079d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen return; 1080d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen } 1081d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen sNfaGetConfigEvent.wait (); 1082d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen if (sCurrentConfigLen < 4 || sConfig[1] != NCI_PARAM_ID_TAGSNIFF_CFG) { 1083d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen ALOGE("%s: Config TLV length %d returned is too short", __FUNCTION__, 1084d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen sCurrentConfigLen); 1085d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen return; 1086d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen } 1087d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen sHasLptd = true; 1088d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen } 1089d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen // Bail if we checked and didn't find any LPTD config before 1090d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen if (!sHasLptd) return; 109133aeb7c13f8fd9d9bd301f31680836b8ec912d51Martijn Coenen UINT8 enable_byte = enable ? 0x01 : 0x00; 1092d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen 1093d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen SyncEventGuard guard(sNfaSetConfigEvent); 1094d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen 109533aeb7c13f8fd9d9bd301f31680836b8ec912d51Martijn Coenen stat = NFA_SetConfig(NCI_PARAM_ID_TAGSNIFF_CFG, 1, &enable_byte); 1096d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen if (stat == NFA_STATUS_OK) 1097d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen sNfaSetConfigEvent.wait (); 1098d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen else 1099d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen ALOGE("%s: Could not configure LPTD feature", __FUNCTION__); 1100d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen return; 1101d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen} 1102d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen 110361beae816af13f75dabb484d287739723c716deeMartijn Coenenvoid setUiccIdleTimeout (bool enable) 110461beae816af13f75dabb484d287739723c716deeMartijn Coenen{ 1105f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen // This method is *NOT* thread-safe. Right now 1106f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen // it is only called from the same thread so it's 1107f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen // not an issue. 110861beae816af13f75dabb484d287739723c716deeMartijn Coenen tNFA_STATUS stat = NFA_STATUS_OK; 1109f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen UINT8 swp_cfg_byte0 = 0x00; 111061beae816af13f75dabb484d287739723c716deeMartijn Coenen { 1111f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen SyncEventGuard guard (sNfaGetConfigEvent); 1112c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen tNFA_PMID configParam[1] = {0xC2}; 1113c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen stat = NFA_GetConfig(1, configParam); 1114f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen if (stat != NFA_STATUS_OK) 1115f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen { 1116f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen ALOGE("%s: NFA_GetConfig failed", __FUNCTION__); 1117f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen return; 1118f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen } 1119f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen sNfaGetConfigEvent.wait (); 1120f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen if (sCurrentConfigLen < 4 || sConfig[1] != 0xC2) { 1121f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen ALOGE("%s: Config TLV length %d returned is too short", __FUNCTION__, 1122f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen sCurrentConfigLen); 1123f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen return; 1124f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen } 1125f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen swp_cfg_byte0 = sConfig[3]; 112661beae816af13f75dabb484d287739723c716deeMartijn Coenen } 1127f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen SyncEventGuard guard(sNfaSetConfigEvent); 1128f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen if (enable) 1129f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen swp_cfg_byte0 |= 0x01; 113061beae816af13f75dabb484d287739723c716deeMartijn Coenen else 1131f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen swp_cfg_byte0 &= ~0x01; 1132f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen 1133f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen stat = NFA_SetConfig(0xC2, 1, &swp_cfg_byte0); 1134f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen if (stat == NFA_STATUS_OK) 1135f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen sNfaSetConfigEvent.wait (); 1136f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen else 1137f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen ALOGE("%s: Could not configure UICC idle timeout feature", __FUNCTION__); 1138f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen return; 113961beae816af13f75dabb484d287739723c716deeMartijn Coenen} 1140525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1141525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1142525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function nfc_jni_cache_object_local 1143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1144525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description Allocates a java object and calls it's constructor 1145525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1146525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns -1 on failure, 0 on success 1147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1148525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 11492534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic int nfc_jni_cache_object_local (JNIEnv *e, const char *className, jobject *cachedObj) 1150525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 11512534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedLocalRef<jclass> cls(e, e->FindClass(className)); 11522534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes if(cls.get() == NULL) { 1153525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: find class error", __FUNCTION__); 1154525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return -1; 1155525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1156525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 11572534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes jmethodID ctor = e->GetMethodID(cls.get(), "<init>", "()V"); 11582534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes jobject obj = e->NewObject(cls.get(), ctor); 11592534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes if (obj == NULL) { 1160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: create object error", __FUNCTION__); 1161525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return -1; 1162525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 11642534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes *cachedObj = obj; 11652534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes if (*cachedObj == NULL) { 1166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: global ref error", __FUNCTION__); 1167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return -1; 1168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return 0; 1170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1172525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1173525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1174525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1175525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doCreateLlcpServiceSocket 1176525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1177525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Create a new LLCP server socket. 1178525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1179525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1180525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** nSap: Service access point. 1181525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** sn: Service name 1182525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** miu: Maximum information unit. 1183525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** rw: Receive window size. 1184525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** linearBufferLength: Max buffer size. 1185525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1186525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: NativeLlcpServiceSocket Java object. 1187525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1188525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 11892534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jobject nfcManager_doCreateLlcpServiceSocket (JNIEnv* e, jobject, jint nSap, jstring sn, jint miu, jint rw, jint linearBufferLength) 1190525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1191525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PeerToPeer::tJNI_HANDLE jniHandle = PeerToPeer::getInstance().getNewJniHandle (); 1192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 11932534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedUtfChars serviceName(e, sn); 11942534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes 11952534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ALOGD ("%s: enter: sap=%i; name=%s; miu=%i; rw=%i; buffLen=%i", __FUNCTION__, nSap, serviceName.c_str(), miu, rw, linearBufferLength); 1196525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1197525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Create new NativeLlcpServiceSocket object */ 11982534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes jobject serviceSocket = NULL; 1199525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (nfc_jni_cache_object(e, gNativeLlcpServiceSocketClassName, &(serviceSocket)) == -1) 1200525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1201525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: Llcp socket object creation error", __FUNCTION__); 1202525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return NULL; 1203525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1204525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1205525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Get NativeLlcpServiceSocket class object */ 12062534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedLocalRef<jclass> clsNativeLlcpServiceSocket(e, e->GetObjectClass(serviceSocket)); 1207525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (e->ExceptionCheck()) 1208525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1209525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project e->ExceptionClear(); 1210525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE("%s: Llcp Socket get object class error", __FUNCTION__); 1211525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return NULL; 1212525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1213525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 12142534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes if (!PeerToPeer::getInstance().registerServer (jniHandle, serviceName.c_str())) 1215525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1216525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE("%s: RegisterServer error", __FUNCTION__); 1217525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return NULL; 1218525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1219525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 12202534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes jfieldID f; 12212534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes 1222525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Set socket handle to be the same as the NfaHandle*/ 12232534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mHandle", "I"); 12242534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetIntField(serviceSocket, f, (jint) jniHandle); 1225525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: socket Handle = 0x%X", __FUNCTION__, jniHandle); 1226525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1227525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Set socket linear buffer length */ 12282534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mLocalLinearBufferLength", "I"); 12292534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetIntField(serviceSocket, f,(jint)linearBufferLength); 1230525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: buffer length = %d", __FUNCTION__, linearBufferLength); 1231525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1232525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Set socket MIU */ 12332534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mLocalMiu", "I"); 12342534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetIntField(serviceSocket, f,(jint)miu); 1235525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: MIU = %d", __FUNCTION__, miu); 1236525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1237525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Set socket RW */ 12382534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mLocalRw", "I"); 12392534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetIntField(serviceSocket, f,(jint)rw); 1240525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: RW = %d", __FUNCTION__, rw); 1241525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1242525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sLastError = 0; 1243525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit", __FUNCTION__); 1244525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return serviceSocket; 1245525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1246525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1247525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1248525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1249525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1250525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doGetLastError 1251525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1252525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Get the last error code. 1253525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1256525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Last error code. 1257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 12592534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jint nfcManager_doGetLastError(JNIEnv*, jobject) 1260525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1261525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: last error=%i", __FUNCTION__, sLastError); 1262525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return sLastError; 1263525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1264525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1265525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1266525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1267525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1268525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doDeinitialize 1269525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1270525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Turn off NFC. 1271525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1272525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1273525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1274525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if ok. 1275525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1276525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 12772534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nfcManager_doDeinitialize (JNIEnv*, jobject) 1278525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1279525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter", __FUNCTION__); 1280525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1281525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sIsDisabling = true; 1282525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project pn544InteropAbortNow (); 1283525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SecureElement::getInstance().finalize (); 1284a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu PowerSwitch::getInstance ().initialize (PowerSwitch::UNKNOWN_LEVEL); 1285525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1286525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sIsNfaEnabled) 1287525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1288525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (sNfaDisableEvent); 1289525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_STATUS stat = NFA_Disable (TRUE /* graceful */); 1290525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (stat == NFA_STATUS_OK) 1291525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1292525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: wait for completion", __FUNCTION__); 1293525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sNfaDisableEvent.wait (); //wait for NFA command to finish 1294525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PeerToPeer::getInstance ().handleNfcOnOff (false); 1295525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1296525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 1297525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1298525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: fail disable; error=0x%X", __FUNCTION__, stat); 1299525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1300525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1301525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nativeNfcTag_abortWaits(); 1302525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcTag::getInstance().abort (); 1303525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sAbortConnlessWait = true; 1304525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nativeLlcpConnectionlessSocket_abortWait(); 1305525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sIsNfaEnabled = false; 1306525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sDiscoveryEnabled = false; 1307525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sIsDisabling = false; 1308525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sIsSecElemSelected = false; 13098d154680537afa5242edeb98c8f414d6186558cfMartijn Coenen gActivated = false; 1310525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1311525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1312525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //unblock NFA_EnablePolling() and NFA_DisablePolling() 1313525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (sNfaEnableDisablePollingEvent); 1314525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sNfaEnableDisablePollingEvent.notifyOne (); 1315525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1316525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1317525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcAdaptation& theInstance = NfcAdaptation::GetInstance(); 1318525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project theInstance.Finalize(); 1319525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1320525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit", __FUNCTION__); 1321525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return JNI_TRUE; 1322525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1323525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1324525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1325525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1326525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1327525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doCreateLlcpSocket 1328525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1329525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Create a LLCP connection-oriented socket. 1330525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1331525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1332525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** nSap: Service access point. 1333525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** miu: Maximum information unit. 1334525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** rw: Receive window size. 1335525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** linearBufferLength: Max buffer size. 1336525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1337525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: NativeLlcpSocket Java object. 1338525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1339525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 13402534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jobject nfcManager_doCreateLlcpSocket (JNIEnv* e, jobject, jint nSap, jint miu, jint rw, jint linearBufferLength) 1341525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1342525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter; sap=%d; miu=%d; rw=%d; buffer len=%d", __FUNCTION__, nSap, miu, rw, linearBufferLength); 1343525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 13442534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes PeerToPeer::tJNI_HANDLE jniHandle = PeerToPeer::getInstance().getNewJniHandle (); 1345a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu PeerToPeer::getInstance().createClient (jniHandle, miu, rw); 1346525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1347525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Create new NativeLlcpSocket object */ 13482534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes jobject clientSocket = NULL; 1349525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (nfc_jni_cache_object_local(e, gNativeLlcpSocketClassName, &(clientSocket)) == -1) 1350525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1351525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: fail Llcp socket creation", __FUNCTION__); 13522534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes return clientSocket; 1353525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1354525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1355525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Get NativeConnectionless class object */ 13562534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedLocalRef<jclass> clsNativeLlcpSocket(e, e->GetObjectClass(clientSocket)); 1357525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (e->ExceptionCheck()) 1358525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1359525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project e->ExceptionClear(); 1360525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: fail get class object", __FUNCTION__); 13612534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes return clientSocket; 1362525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1363525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 13642534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes jfieldID f; 13652534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes 1366525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Set socket SAP */ 13672534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes f = e->GetFieldID (clsNativeLlcpSocket.get(), "mSap", "I"); 1368525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project e->SetIntField (clientSocket, f, (jint) nSap); 1369525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1370525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Set socket handle */ 13712534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes f = e->GetFieldID (clsNativeLlcpSocket.get(), "mHandle", "I"); 1372525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project e->SetIntField (clientSocket, f, (jint) jniHandle); 1373525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1374525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Set socket MIU */ 13752534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes f = e->GetFieldID (clsNativeLlcpSocket.get(), "mLocalMiu", "I"); 1376525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project e->SetIntField (clientSocket, f, (jint) miu); 1377525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1378525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Set socket RW */ 13792534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes f = e->GetFieldID (clsNativeLlcpSocket.get(), "mLocalRw", "I"); 1380525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project e->SetIntField (clientSocket, f, (jint) rw); 1381525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1382525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit", __FUNCTION__); 1383525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return clientSocket; 1384525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1385525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1386525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1387525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1388525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1389525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doCreateLlcpConnectionlessSocket 1390525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1391525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Create a connection-less socket. 1392525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1393525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1394525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** nSap: Service access point. 1395525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** sn: Service name. 1396525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1397525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: NativeLlcpConnectionlessSocket Java object. 1398525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1399525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 14002534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jobject nfcManager_doCreateLlcpConnectionlessSocket (JNIEnv *, jobject, jint nSap, jstring /*sn*/) 1401525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1402525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: nSap=0x%X", __FUNCTION__, nSap); 1403525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return NULL; 1404525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1405525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1406525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1407525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1408525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1409525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doGetSecureElementList 1410525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1411525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Get a list of secure element handles. 1412525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1413525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1414525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1415525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: List of secure element handles. 1416525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1417525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 14182534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jintArray nfcManager_doGetSecureElementList(JNIEnv* e, jobject) 1419525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1420525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s", __FUNCTION__); 1421a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu return SecureElement::getInstance().getSecureElementIdList (e); 1422525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1423525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 14249f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen/******************************************************************************* 14259f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 14269f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Function: nfcManager_enableRoutingToHost 14279f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 1428d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen** Description: NFC controller starts routing data to host. 14299f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** e: JVM environment. 14309f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** o: Java object. 14319f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 14329f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Returns: None 14339f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 14349f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen*******************************************************************************/ 14359f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenenstatic void nfcManager_enableRoutingToHost(JNIEnv*, jobject) 14369f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen{ 14379f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen ALOGD ("%s: enter", __FUNCTION__); 14389f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen PowerSwitch::getInstance ().setLevel (PowerSwitch::FULL_POWER); 14399f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen PowerSwitch::getInstance ().setModeOn (PowerSwitch::HOST_ROUTING); 14409f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen if (sRfEnabled) { 14419f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen // Stop RF discovery to reconfigure 14429f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen startRfDiscovery(false); 14439f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen } 14449f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen RoutingManager::getInstance().commitRouting(); 14459f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen startRfDiscovery(true); 14469f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen ALOGD ("%s: exit", __FUNCTION__); 14479f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen} 14489f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 14499f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen/******************************************************************************* 14509f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 14519f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Function: nfcManager_disableRoutingToHost 14529f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 1453d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen** Description: NFC controller stops routing data to host. 14549f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** e: JVM environment. 14559f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** o: Java object. 14569f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 14579f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Returns: None 14589f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** 14599f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen*******************************************************************************/ 14609f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenenstatic void nfcManager_disableRoutingToHost(JNIEnv*, jobject) 14619f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen{ 14629f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen ALOGD ("%s: enter", __FUNCTION__); 1463d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen bool rfWasEnabled = false; 14649f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 1465d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen if (PowerSwitch::getInstance ().getLevel() == PowerSwitch::LOW_POWER) 1466d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen { 1467d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen ALOGD ("%s: no need to disable routing while power is OFF", __FUNCTION__); 1468d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen goto TheEnd; 1469d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen } 1470d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen 1471d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen if (sRfEnabled) { 1472d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen rfWasEnabled = true; 1473d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen // Stop RF discovery to reconfigure 1474d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen startRfDiscovery(false); 1475d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen } 1476d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen RoutingManager::getInstance().commitRouting(); 1477d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen if (rfWasEnabled) 1478d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen { 1479d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen startRfDiscovery(true); 1480d53c2b599c73f7404b5a604be4d9a5449cafdd72Martijn Coenen } 14819f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen if (! PowerSwitch::getInstance ().setModeOff (PowerSwitch::HOST_ROUTING)) 14829f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER); 14839f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn CoenenTheEnd: 14849f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen ALOGD ("%s: exit", __FUNCTION__); 14859f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen} 1486525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1487525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1488525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1489525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doSelectSecureElement 1490525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1491525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: NFC controller starts routing data in listen mode. 1492525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1493525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1494525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1495525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 1496525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1497525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 14982534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic void nfcManager_doSelectSecureElement(JNIEnv*, jobject) 1499525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1500525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter", __FUNCTION__); 1501525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project bool stat = true; 1502525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1503aafca6482d0b65b1ecab990659c07e4a82582db8Martijn Coenen if (sIsSecElemSelected) 1504aafca6482d0b65b1ecab990659c07e4a82582db8Martijn Coenen { 1505aafca6482d0b65b1ecab990659c07e4a82582db8Martijn Coenen ALOGD ("%s: already selected", __FUNCTION__); 1506aafca6482d0b65b1ecab990659c07e4a82582db8Martijn Coenen goto TheEnd; 1507aafca6482d0b65b1ecab990659c07e4a82582db8Martijn Coenen } 1508aafca6482d0b65b1ecab990659c07e4a82582db8Martijn Coenen 1509525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PowerSwitch::getInstance ().setLevel (PowerSwitch::FULL_POWER); 1510525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1511525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sRfEnabled) { 1512525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // Stop RF Discovery if we were polling 1513525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project startRfDiscovery (false); 1514525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1515525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 15169f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 1517525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project stat = SecureElement::getInstance().activate (0xABCDEF); 1518525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sIsSecElemSelected = true; 1519525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1520525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project startRfDiscovery (true); 1521525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PowerSwitch::getInstance ().setModeOn (PowerSwitch::SE_ROUTING); 1522aafca6482d0b65b1ecab990659c07e4a82582db8Martijn CoenenTheEnd: 1523525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit", __FUNCTION__); 1524525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1525525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1526525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1527525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1528525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1529525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doDeselectSecureElement 1530525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1531525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: NFC controller stops routing data in listen mode. 1532525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1533525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1534525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1535525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 1536525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1537525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 15382534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic void nfcManager_doDeselectSecureElement(JNIEnv*, jobject) 1539525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1540525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter", __FUNCTION__); 1541be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project bool bRestartDiscovery = false; 1542525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1543525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (! sIsSecElemSelected) 1544525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1545525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: already deselected", __FUNCTION__); 1546a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu goto TheEnd2; 1547525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1548525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1549525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (PowerSwitch::getInstance ().getLevel() == PowerSwitch::LOW_POWER) 1550525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1551525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: do not deselect while power is OFF", __FUNCTION__); 1552525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sIsSecElemSelected = false; 1553525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 1554525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1555525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1556be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project if (sRfEnabled) { 1557be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project // Stop RF Discovery if we were polling 1558be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project startRfDiscovery (false); 1559be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project bRestartDiscovery = true; 1560be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project } 1561be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project 1562525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //if controller is not routing to sec elems AND there is no pipe connected, 1563525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //then turn off the sec elems 1564525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (SecureElement::getInstance().isBusy() == false) 1565525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SecureElement::getInstance().deactivate (0xABCDEF); 1566525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 15679f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen sIsSecElemSelected = false; 1568525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd: 1569be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project if (bRestartDiscovery) 1570be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project startRfDiscovery (true); 1571be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project 1572525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //if nothing is active after this, then tell the controller to power down 1573525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (! PowerSwitch::getInstance ().setModeOff (PowerSwitch::SE_ROUTING)) 1574525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER); 1575525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1576a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan ChuTheEnd2: 1577525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit", __FUNCTION__); 1578525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1579525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1580525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1581525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1582525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1583525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: isPeerToPeer 1584525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1585525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Whether the activation data indicates the peer supports NFC-DEP. 1586525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** activated: Activation data. 1587525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1588525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if the peer supports NFC-DEP. 1589525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1590525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1591525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool isPeerToPeer (tNFA_ACTIVATED& activated) 1592525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1593525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return activated.activate_ntf.protocol == NFA_PROTOCOL_NFC_DEP; 1594525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1595525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1596525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1597525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1598525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: isListenMode 1599525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1600525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Indicates whether the activation data indicates it is 1601525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** listen mode. 1602525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1603525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if this listen mode. 1604525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1605525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1606525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool isListenMode(tNFA_ACTIVATED& activated) 1607525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1608525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return ((NFC_DISCOVERY_TYPE_LISTEN_A == activated.activate_ntf.rf_tech_param.mode) 1609525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project || (NFC_DISCOVERY_TYPE_LISTEN_B == activated.activate_ntf.rf_tech_param.mode) 1610525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project || (NFC_DISCOVERY_TYPE_LISTEN_F == activated.activate_ntf.rf_tech_param.mode) 1611525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project || (NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE == activated.activate_ntf.rf_tech_param.mode) 1612525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project || (NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE == activated.activate_ntf.rf_tech_param.mode) 1613525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project || (NFC_DISCOVERY_TYPE_LISTEN_ISO15693 == activated.activate_ntf.rf_tech_param.mode) 1614525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project || (NFC_DISCOVERY_TYPE_LISTEN_B_PRIME == activated.activate_ntf.rf_tech_param.mode)); 1615525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1616525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1617525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1618525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1619525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doCheckLlcp 1620525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1621525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Not used. 1622525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1623525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True 1624525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1625525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 16262534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nfcManager_doCheckLlcp(JNIEnv*, jobject) 1627525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1628525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s", __FUNCTION__); 1629525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return JNI_TRUE; 1630525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1631525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1632525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1633525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1634525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1635525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doActivateLlcp 1636525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1637525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Not used. 1638525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1639525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True 1640525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1641525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 16422534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nfcManager_doActivateLlcp(JNIEnv*, jobject) 1643525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1644525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s", __FUNCTION__); 1645525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return JNI_TRUE; 1646525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1647525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1648525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1649525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1650525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1651525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doAbort 1652525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1653525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Not used. 1654525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1655525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 1656525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1657525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 16582534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic void nfcManager_doAbort(JNIEnv*, jobject) 1659525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1660525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE("%s: abort()", __FUNCTION__); 1661525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project abort(); 1662525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1663525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1664525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1665525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1666525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1667525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doDownload 1668525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1669a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Description: Download firmware patch files. Do not turn on NFC. 1670525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1671a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Returns: True if ok. 1672525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1673525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 16742534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nfcManager_doDownload(JNIEnv*, jobject) 1675525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1676a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD ("%s: enter", __FUNCTION__); 1677a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu NfcAdaptation& theInstance = NfcAdaptation::GetInstance(); 1678a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 1679a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu theInstance.Initialize(); //start GKI, NCI task, NFC task 1680a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu theInstance.DownloadFirmware (); 1681a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu theInstance.Finalize(); 1682a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD ("%s: exit", __FUNCTION__); 1683525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return JNI_TRUE; 1684525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1685525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1686525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1687525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1688525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1689525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doResetTimeouts 1690525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1691525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Not used. 1692525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1693525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 1694525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1695525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 16962534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic void nfcManager_doResetTimeouts(JNIEnv*, jobject) 1697525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1698a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD ("%s", __FUNCTION__); 1699a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu NfcTag::getInstance().resetAllTransceiveTimeouts (); 1700525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1701525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1702525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1703525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1704525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1705525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doSetTimeout 1706525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1707525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Set timeout value. 1708525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1709525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1710a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** tech: technology ID. 1711525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** timeout: Timeout value. 1712525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1713525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if ok. 1714525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1715525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1716a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chustatic bool nfcManager_doSetTimeout(JNIEnv*, jobject, jint tech, jint timeout) 1717525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1718525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (timeout <= 0) 1719525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1720525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE("%s: Timeout must be positive.",__FUNCTION__); 1721525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return false; 1722525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1723a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD ("%s: tech=%d, timeout=%d", __FUNCTION__, tech, timeout); 1724a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu NfcTag::getInstance().setTransceiveTimeout (tech, timeout); 1725525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return true; 1726525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1727525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1728525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1729525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1730525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1731525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doGetTimeout 1732525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1733525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Get timeout value. 1734525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1735525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1736a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** tech: technology ID. 1737525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1738525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Timeout value. 1739525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1740525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1741a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chustatic jint nfcManager_doGetTimeout(JNIEnv*, jobject, jint tech) 1742525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1743a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu int timeout = NfcTag::getInstance().getTransceiveTimeout (tech); 1744a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD ("%s: tech=%d, timeout=%d", __FUNCTION__, tech, timeout); 1745a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu return timeout; 1746525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1747525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1748525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1749525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1750525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1751525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doDump 1752525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1753525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Not used. 1754525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1755525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1756525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1757525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Text dump. 1758525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1759525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 17602534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jstring nfcManager_doDump(JNIEnv* e, jobject) 1761525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1762525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project char buffer[100]; 1763525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project snprintf(buffer, sizeof(buffer), "libnfc llc error_count=%u", /*libnfc_llc_error_count*/ 0); 1764525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return e->NewStringUTF(buffer); 1765525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1766525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1767525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1768525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1769525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1770525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doSetP2pInitiatorModes 1771525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1772525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Set P2P initiator's activation modes. 1773525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1774525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1775525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** modes: Active and/or passive modes. The values are specified 1776525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** in external/libnfc-nxp/inc/phNfcTypes.h. See 1777525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** enum phNfc_eP2PMode_t. 1778525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1779525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None. 1780525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1781525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1782525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void nfcManager_doSetP2pInitiatorModes (JNIEnv *e, jobject o, jint modes) 1783525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1784525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: modes=0x%X", __FUNCTION__, modes); 1785525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project struct nfc_jni_native_data *nat = getNative(e, o); 1786525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1787525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_TECHNOLOGY_MASK mask = 0; 1788525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (modes & 0x01) mask |= NFA_TECHNOLOGY_MASK_A; 1789525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (modes & 0x02) mask |= NFA_TECHNOLOGY_MASK_F; 1790525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (modes & 0x04) mask |= NFA_TECHNOLOGY_MASK_F; 1791525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (modes & 0x08) mask |= NFA_TECHNOLOGY_MASK_A_ACTIVE; 1792525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (modes & 0x10) mask |= NFA_TECHNOLOGY_MASK_F_ACTIVE; 1793525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (modes & 0x20) mask |= NFA_TECHNOLOGY_MASK_F_ACTIVE; 1794525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nat->tech_mask = mask; 1795525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1796525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1797525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1798525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1799525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1800525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_doSetP2pTargetModes 1801525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1802525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Set P2P target's activation modes. 1803525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1804525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1805525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** modes: Active and/or passive modes. 1806525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1807525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None. 1808525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1809525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 18102534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic void nfcManager_doSetP2pTargetModes (JNIEnv*, jobject, jint modes) 1811525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1812525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: modes=0x%X", __FUNCTION__, modes); 1813525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // Map in the right modes 1814525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_TECHNOLOGY_MASK mask = 0; 1815525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (modes & 0x01) mask |= NFA_TECHNOLOGY_MASK_A; 1816525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (modes & 0x02) mask |= NFA_TECHNOLOGY_MASK_F; 1817525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (modes & 0x04) mask |= NFA_TECHNOLOGY_MASK_F; 1818525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (modes & 0x08) mask |= NFA_TECHNOLOGY_MASK_A_ACTIVE | NFA_TECHNOLOGY_MASK_F_ACTIVE; 1819525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1820525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PeerToPeer::getInstance().setP2pListenMask(mask); 1821525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1822525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1823c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenenstatic void nfcManager_doEnableReaderMode (JNIEnv*, jobject, jint technologies) 1824c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen{ 1825c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen if (sDiscoveryEnabled) { 1826c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen sReaderModeEnabled = true; 1827c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen PeerToPeer::getInstance().enableP2pListening(false); 1828f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen NFA_PauseP2p(); 1829c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen NFA_DisableListening(); 1830c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen // Limit polling to these technologies 1831c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen int tech_mask = 0; 1832c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen if (technologies & 0x01) 1833c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen tech_mask |= NFA_TECHNOLOGY_MASK_A; 1834c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen if (technologies & 0x02) 1835c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen tech_mask |= NFA_TECHNOLOGY_MASK_B; 1836c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen if (technologies & 0x04) 1837c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen tech_mask |= NFA_TECHNOLOGY_MASK_F; 1838c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen if (technologies & 0x08) 1839c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen tech_mask |= NFA_TECHNOLOGY_MASK_ISO15693; 1840c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen if (technologies & 0x10) 1841c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen tech_mask |= NFA_TECHNOLOGY_MASK_KOVIO; 1842c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen 1843d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen enableDisableLptd(false); 1844c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen NFA_SetRfDiscoveryDuration(READER_MODE_DISCOVERY_DURATION); 1845c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen restartPollingWithTechMask(tech_mask); 1846c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen } 1847c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen} 1848c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen 1849c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenenstatic void nfcManager_doDisableReaderMode (JNIEnv* e, jobject o) 1850c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen{ 1851c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen struct nfc_jni_native_data *nat = getNative(e, o); 1852c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen if (sDiscoveryEnabled) { 1853c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen sReaderModeEnabled = false; 1854f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen NFA_ResumeP2p(); 1855c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen PeerToPeer::getInstance().enableP2pListening(true); 1856c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen NFA_EnableListening(); 1857d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen 1858d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen enableDisableLptd(true); 1859c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen NFA_SetRfDiscoveryDuration(nat->discovery_duration); 1860c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen restartPollingWithTechMask(nat->tech_mask); 1861c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen } 1862c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen} 1863c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen 1864d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Moralesstatic void nfcManager_doEnableScreenOffSuspend(JNIEnv* e, jobject o) 1865d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales{ 1866d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales PowerSwitch::getInstance().setScreenOffPowerState(PowerSwitch::POWER_STATE_FULL); 1867d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales} 1868d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales 1869d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Moralesstatic void nfcManager_doDisableScreenOffSuspend(JNIEnv* e, jobject o) 1870d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales{ 1871d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales PowerSwitch::getInstance().setScreenOffPowerState(PowerSwitch::POWER_STATE_OFF); 1872d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales} 1873c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen 1874525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/***************************************************************************** 1875525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1876525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** JNI functions for android-4.0.1_r1 1877525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1878525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/ 1879525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic JNINativeMethod gMethods[] = 1880525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1881525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doDownload", "()Z", 1882525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void *)nfcManager_doDownload}, 1883525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1884525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"initializeNativeStructure", "()Z", 1885525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void*) nfcManager_initNativeStruc}, 1886525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1887d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales {"doInitialize", "(Z)Z", 1888525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void*) nfcManager_doInitialize}, 1889525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1890525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doDeinitialize", "()Z", 1891525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void*) nfcManager_doDeinitialize}, 1892525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 18939f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen {"sendRawFrame", "([B)Z", 18949f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen (void*) nfcManager_sendRawFrame}, 18959f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 18969f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen {"routeAid", "([BI)Z", 18979f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen (void*) nfcManager_routeAid}, 18989f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 18999f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen {"unrouteAid", "([B)Z", 19009f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen (void*) nfcManager_unrouteAid}, 19019f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 1902a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales {"enableDiscovery", "(IZ)V", 1903525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void*) nfcManager_enableDiscovery}, 1904525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 19059f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen {"enableRoutingToHost", "()V", 19069f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen (void*) nfcManager_enableRoutingToHost}, 19079f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 19089f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen {"disableRoutingToHost", "()V", 19099f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen (void*) nfcManager_disableRoutingToHost}, 19109f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 1911525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doGetSecureElementList", "()[I", 1912525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void *)nfcManager_doGetSecureElementList}, 1913525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1914525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doSelectSecureElement", "()V", 1915525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void *)nfcManager_doSelectSecureElement}, 1916525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1917525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doDeselectSecureElement", "()V", 1918525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void *)nfcManager_doDeselectSecureElement}, 1919525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1920525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doCheckLlcp", "()Z", 1921525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void *)nfcManager_doCheckLlcp}, 1922525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1923525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doActivateLlcp", "()Z", 1924525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void *)nfcManager_doActivateLlcp}, 1925525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1926525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doCreateLlcpConnectionlessSocket", "(ILjava/lang/String;)Lcom/android/nfc/dhimpl/NativeLlcpConnectionlessSocket;", 1927525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void *)nfcManager_doCreateLlcpConnectionlessSocket}, 1928525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1929525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doCreateLlcpServiceSocket", "(ILjava/lang/String;III)Lcom/android/nfc/dhimpl/NativeLlcpServiceSocket;", 1930525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void*) nfcManager_doCreateLlcpServiceSocket}, 1931525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1932525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doCreateLlcpSocket", "(IIII)Lcom/android/nfc/dhimpl/NativeLlcpSocket;", 1933525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void*) nfcManager_doCreateLlcpSocket}, 1934525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1935525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doGetLastError", "()I", 1936525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void*) nfcManager_doGetLastError}, 1937525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1938a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales {"disableDiscovery", "()V", 1939525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void*) nfcManager_disableDiscovery}, 1940525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1941525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doSetTimeout", "(II)Z", 1942525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void *)nfcManager_doSetTimeout}, 1943525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1944525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doGetTimeout", "(I)I", 1945525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void *)nfcManager_doGetTimeout}, 1946525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1947525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doResetTimeouts", "()V", 1948525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void *)nfcManager_doResetTimeouts}, 1949525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1950525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doAbort", "()V", 1951525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void *)nfcManager_doAbort}, 1952525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1953525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doSetP2pInitiatorModes", "(I)V", 1954525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void *)nfcManager_doSetP2pInitiatorModes}, 1955525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1956525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doSetP2pTargetModes", "(I)V", 1957525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void *)nfcManager_doSetP2pTargetModes}, 1958525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1959a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales {"doEnableReaderMode", "(I)V", 1960a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales (void *)nfcManager_doEnableReaderMode}, 1961a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales 1962a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales {"doDisableReaderMode", "()V", 1963a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales (void *)nfcManager_doDisableReaderMode}, 1964a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales 1965d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales {"doEnableScreenOffSuspend", "()V", 1966d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales (void *)nfcManager_doEnableScreenOffSuspend}, 1967d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales 1968d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales {"doDisableScreenOffSuspend", "()V", 1969d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales (void *)nfcManager_doDisableScreenOffSuspend}, 1970d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales 1971525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doDump", "()Ljava/lang/String;", 1972525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (void *)nfcManager_doDump}, 1973525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}; 1974525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1975525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1976525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1977525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1978525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: register_com_android_nfc_NativeNfcManager 1979525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1980525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Regisgter JNI functions with Java Virtual Machine. 1981525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: Environment of JVM. 1982525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1983525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Status of registration. 1984525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1985525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1986525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectint register_com_android_nfc_NativeNfcManager (JNIEnv *e) 1987525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1988525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter", __FUNCTION__); 1989525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PowerSwitch::getInstance ().initialize (PowerSwitch::UNKNOWN_LEVEL); 1990525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit", __FUNCTION__); 1991525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return jniRegisterNativeMethods (e, gNativeNfcManagerClassName, gMethods, NELEM (gMethods)); 1992525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1993525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1994525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1995525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1996525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1997525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: startRfDiscovery 1998525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1999525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Ask stack to start polling and listening for devices. 2000525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** isStart: Whether to start. 2001525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 2002525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 2003525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 2004525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 2005525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid startRfDiscovery(bool isStart) 2006525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 2007525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_STATUS status = NFA_STATUS_FAILED; 2008525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 2009525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: is start=%d", __FUNCTION__, isStart); 2010525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (sNfaEnableDisablePollingEvent); 2011525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project status = isStart ? NFA_StartRfDiscovery () : NFA_StopRfDiscovery (); 2012525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (status == NFA_STATUS_OK) 2013525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 2014525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sNfaEnableDisablePollingEvent.wait (); //wait for NFA_RF_DISCOVERY_xxxx_EVT 2015525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sRfEnabled = isStart; 2016525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 2017525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 2018525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 2019525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: Failed to start/stop RF discovery; error=0x%X", __FUNCTION__, status); 2020525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 2021525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 2022525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 2023525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 2024525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 2025525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 2026525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: doStartupConfig 2027525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 2028525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Configure the NFC controller. 2029525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 2030525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 2031525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 2032525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 2033525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid doStartupConfig() 2034525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 2035525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project struct nfc_jni_native_data *nat = getNative(0, 0); 2036525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_STATUS stat = NFA_STATUS_FAILED; 2037a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu int actualLen = 0; 2038525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 2039525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // If polling for Active mode, set the ordering so that we choose Active over Passive mode first. 2040525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (nat && (nat->tech_mask & (NFA_TECHNOLOGY_MASK_A_ACTIVE | NFA_TECHNOLOGY_MASK_F_ACTIVE))) 2041525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 2042525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project UINT8 act_mode_order_param[] = { 0x01 }; 2043525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (sNfaSetConfigEvent); 2044525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project stat = NFA_SetConfig(NCI_PARAM_ID_ACT_ORDER, sizeof(act_mode_order_param), &act_mode_order_param[0]); 2045525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (stat == NFA_STATUS_OK) 2046525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sNfaSetConfigEvent.wait (); 2047525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 2048a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 2049a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu //configure RF polling frequency for each technology 2050a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu static tNFA_DM_DISC_FREQ_CFG nfa_dm_disc_freq_cfg; 2051a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu //values in the polling_frequency[] map to members of nfa_dm_disc_freq_cfg 2052a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu UINT8 polling_frequency [8] = {1, 1, 1, 1, 1, 1, 1, 1}; 2053a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu actualLen = GetStrValue(NAME_POLL_FREQUENCY, (char*)polling_frequency, 8); 2054a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (actualLen == 8) 2055a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 2056a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD ("%s: polling frequency", __FUNCTION__); 2057a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu memset (&nfa_dm_disc_freq_cfg, 0, sizeof(nfa_dm_disc_freq_cfg)); 2058a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu nfa_dm_disc_freq_cfg.pa = polling_frequency [0]; 2059a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu nfa_dm_disc_freq_cfg.pb = polling_frequency [1]; 2060a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu nfa_dm_disc_freq_cfg.pf = polling_frequency [2]; 2061a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu nfa_dm_disc_freq_cfg.pi93 = polling_frequency [3]; 2062a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu nfa_dm_disc_freq_cfg.pbp = polling_frequency [4]; 2063a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu nfa_dm_disc_freq_cfg.pk = polling_frequency [5]; 2064a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu nfa_dm_disc_freq_cfg.paa = polling_frequency [6]; 2065a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu nfa_dm_disc_freq_cfg.pfa = polling_frequency [7]; 2066a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu p_nfa_dm_rf_disc_freq_cfg = &nfa_dm_disc_freq_cfg; 2067a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu } 2068525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 2069525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 2070525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 2071525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 2072525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 2073525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nfcManager_isNfcActive 2074525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 2075525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Used externaly to determine if NFC is active or not. 2076525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 2077525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: 'true' if the NFC stack is running, else 'false'. 2078525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 2079525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 2080525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool nfcManager_isNfcActive() 2081525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 2082525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return sIsNfaEnabled; 2083525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 2084525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 2085c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenenvoid restartPollingWithTechMask (int tech_mask) 2086c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen{ 2087c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen tNFA_STATUS stat = NFA_STATUS_FAILED; 2088c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen startRfDiscovery (false); 2089c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen { 2090a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales SyncEventGuard guard (sNfaEnableDisablePollingEvent); 2091a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales stat = NFA_DisablePolling (); 2092a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales if (stat == NFA_STATUS_OK) 2093a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales { 2094a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales ALOGD ("%s: wait for enable event", __FUNCTION__); 2095a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_DISABLED_EVT 2096a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales } 2097a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales else 2098a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales { 2099a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales ALOGE ("%s: failed to disable polling; error=0x%X", __FUNCTION__, stat); 2100a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales goto TheEnd; 2101a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales } 2102a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales stat = NFA_EnablePolling (tech_mask); 2103a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales if (stat == NFA_STATUS_OK) 2104a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales { 2105a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales ALOGD ("%s: wait for enable event", __FUNCTION__); 2106a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_ENABLED_EVT 2107a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales } 2108a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales else 2109a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales ALOGE ("%s: fail enable polling; error=0x%X", __FUNCTION__, stat); 2110c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen } 2111a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres MoralesTheEnd: 2112c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen startRfDiscovery(true); 2113c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen} 2114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 2115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 2116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 2117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: startStopPolling 2118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 2119525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Start or stop polling. 2120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** isStartPolling: true to start polling; false to stop polling. 2121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 2122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None. 2123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 2124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 2125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid startStopPolling (bool isStartPolling) 2126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 2127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter; isStart=%u", __FUNCTION__, isStartPolling); 2128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_STATUS stat = NFA_STATUS_FAILED; 2129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 2130a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales startRfDiscovery (false); 2131a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales if (isStartPolling) 213280e61a46c0541471ef01a9d3c91570139336bcffAndres Morales { 2133a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales tNFA_TECHNOLOGY_MASK tech_mask = DEFAULT_TECH_MASK; 2134a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales unsigned long num = 0; 2135a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales if (GetNumValue(NAME_POLLING_TECH_MASK, &num, sizeof(num))) 2136a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales tech_mask = num; 2137a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales 2138a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales SyncEventGuard guard (sNfaEnableDisablePollingEvent); 2139a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales ALOGD ("%s: enable polling", __FUNCTION__); 2140a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales stat = NFA_EnablePolling (tech_mask); 2141a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales if (stat == NFA_STATUS_OK) 2142a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales { 2143a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales ALOGD ("%s: wait for enable event", __FUNCTION__); 2144a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_ENABLED_EVT 2145a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales } 2146a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales else 2147a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales ALOGE ("%s: fail enable polling; error=0x%X", __FUNCTION__, stat); 2148525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 2149525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 2150525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 2151a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales SyncEventGuard guard (sNfaEnableDisablePollingEvent); 2152a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales ALOGD ("%s: disable polling", __FUNCTION__); 2153a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales stat = NFA_DisablePolling (); 2154a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales if (stat == NFA_STATUS_OK) 2155a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales { 2156a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_DISABLED_EVT 2157a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales } 2158a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales else 2159a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales ALOGE ("%s: fail disable polling; error=0x%X", __FUNCTION__, stat); 2160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 2161a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales startRfDiscovery (true); 2162a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales ALOGD ("%s: exit", __FUNCTION__); 2163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 2164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 2165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 2166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} /* namespace android */ 2167