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>
19c5956ce2009414eef843b413eeb822b529ddb85cRuchi Kandoi#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"
249f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen#include "RoutingManager.h"
25525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "NfcTag.h"
26525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "config.h"
27525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "PowerSwitch.h"
28525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "JavaClassConstants.h"
29525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "Pn544Interop.h"
302534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes#include <ScopedLocalRef.h>
312534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes#include <ScopedUtfChars.h>
329f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen#include <ScopedPrimitiveArray.h>
33525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
34525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectextern "C"
35525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
36525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "nfa_api.h"
37525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "nfa_p2p_api.h"
38525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "rw_api.h"
39525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "nfa_ee_api.h"
40525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "nfc_brcm_defs.h"
41525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "ce_api.h"
428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    #include "phNxpExtns.h"
43525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
44525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
452dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoiextern const uint8_t nfca_version_string [];
462dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoiextern const uint8_t nfa_version_string [];
47a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuextern tNFA_DM_DISC_FREQ_CFG* p_nfa_dm_rf_disc_freq_cfg; //defined in stack
48525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android
49525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
50525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern bool gIsTagDeactivating;
51525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern bool gIsSelectingRfInterface;
52b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    extern void nativeNfcTag_doTransceiveStatus (tNFA_STATUS status, uint8_t * buf, uint32_t buflen);
53a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    extern void nativeNfcTag_notifyRfTimeout ();
54525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doConnectStatus (jboolean is_connect_ok);
55525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doDeactivateStatus (int status);
56525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doWriteStatus (jboolean is_write_ok);
57525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doCheckNdefResult (tNFA_STATUS status, uint32_t max_size, uint32_t current_size, uint8_t flags);
58525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doMakeReadonlyResult (tNFA_STATUS status);
59525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doPresenceCheckResult (tNFA_STATUS status);
60525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_formatStatus (bool is_ok);
61525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_resetPresenceCheck ();
62525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doReadCompleted (tNFA_STATUS status);
638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    extern void nativeNfcTag_setRfInterface (tNFA_INTF_TYPE rfInterface);
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 ();
6734d6116d82975f558378e2b16fdad04ac70d4130Jizhou Liao    extern void nativeNfcTag_acquireRfInterfaceMutexLock();
6834d6116d82975f558378e2b16fdad04ac70d4130Jizhou Liao    extern void nativeNfcTag_releaseRfInterfaceMutexLock();
69525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeLlcpConnectionlessSocket_receiveData (uint8_t* data, uint32_t len, uint32_t remote_sap);
70525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
71525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
72525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
73525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*****************************************************************************
74525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
75525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** public variables and functions
76525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
77525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/
78a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chubool                        gActivated = false;
79a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan ChuSyncEvent                   gDeactivatedEvent;
803a894dda035a331860f0f23e93528527493a07a3Love KhannaSyncEvent                   sNfaSetPowerSubState;
81525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
82525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android
83525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
84525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jmethodID               gCachedNfcManagerNotifyNdefMessageListeners;
85525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jmethodID               gCachedNfcManagerNotifyTransactionListeners;
86525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jmethodID               gCachedNfcManagerNotifyLlcpLinkActivation;
87525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jmethodID               gCachedNfcManagerNotifyLlcpLinkDeactivated;
8857a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen    jmethodID               gCachedNfcManagerNotifyLlcpFirstPacketReceived;
899f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    jmethodID               gCachedNfcManagerNotifyHostEmuActivated;
909f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    jmethodID               gCachedNfcManagerNotifyHostEmuData;
919f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    jmethodID               gCachedNfcManagerNotifyHostEmuDeactivated;
92c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen    jmethodID               gCachedNfcManagerNotifyRfFieldActivated;
93c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen    jmethodID               gCachedNfcManagerNotifyRfFieldDeactivated;
94525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeP2pDeviceClassName                 = "com/android/nfc/dhimpl/NativeP2pDevice";
95525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeLlcpServiceSocketClassName         = "com/android/nfc/dhimpl/NativeLlcpServiceSocket";
96525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeLlcpConnectionlessSocketClassName  = "com/android/nfc/dhimpl/NativeLlcpConnectionlessSocket";
97525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeLlcpSocketClassName                = "com/android/nfc/dhimpl/NativeLlcpSocket";
98525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeNfcTagClassName                    = "com/android/nfc/dhimpl/NativeNfcTag";
99525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeNfcManagerClassName                = "com/android/nfc/dhimpl/NativeNfcManager";
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);
103c5eec3c659d60a469259340608d7403c73fd6865Jizhou Liao    bool                    isDiscoveryStarted ();
104525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
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** private variables and functions
110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
111525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/
112525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android
113525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jint                 sLastError = ERROR_BUFFER_TOO_SMALL;
115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent            sNfaEnableEvent;  //event for NFA_Enable()
116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent            sNfaDisableEvent;  //event for NFA_Disable()
117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent            sNfaEnableDisablePollingEvent;  //event for NFA_EnablePolling(), NFA_DisablePolling()
118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent            sNfaSetConfigEvent;  // event for Set_Config....
119f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenenstatic SyncEvent            sNfaGetConfigEvent;  // event for Get_Config....
120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sIsNfaEnabled = false;
1210799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Moralesstatic bool                 sDiscoveryEnabled = false;  //is polling or listening
1220799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Moralesstatic bool                 sPollingEnabled = false;  //is polling for tag?
123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sIsDisabling = false;
124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sRfEnabled = false; // whether RF discovery is enabled
125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sSeRfActive = false;  // whether RF with SE is likely active
126c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenenstatic bool                 sReaderModeEnabled = false; // whether we're only reading tags, not allowing P2p/card emu
12731b0f4653686119d74876cae5d637c5baf52b935Andres Moralesstatic bool                 sP2pEnabled = false;
128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sP2pActive = false; // whether p2p was last active
129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sAbortConnlessWait = false;
130ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Itostatic jint                 sLfT3tMax = 0;
131ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito
132525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define CONFIG_UPDATE_TECH_MASK     (1 << 1)
133525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define DEFAULT_TECH_MASK           (NFA_TECHNOLOGY_MASK_A \
134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                                     | NFA_TECHNOLOGY_MASK_B \
135525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                                     | NFA_TECHNOLOGY_MASK_F \
1362aff4f645910cdc16a91c4670ee26e4d00045470Love Khanna                                     | NFA_TECHNOLOGY_MASK_V \
137525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                                     | NFA_TECHNOLOGY_MASK_B_PRIME \
138525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                                     | NFA_TECHNOLOGY_MASK_A_ACTIVE \
13997a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu                                     | NFA_TECHNOLOGY_MASK_F_ACTIVE \
14097a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu                                     | NFA_TECHNOLOGY_MASK_KOVIO)
141c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen#define DEFAULT_DISCOVERY_DURATION       500
1428d154680537afa5242edeb98c8f414d6186558cfMartijn Coenen#define READER_MODE_DISCOVERY_DURATION   200
143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1442dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoistatic void nfaConnectionCallback (uint8_t event, tNFA_CONN_EVT_DATA *eventData);
1452dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoistatic void nfaDeviceManagementCallback (uint8_t event, tNFA_DM_CBACK_DATA *eventData);
146525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool isPeerToPeer (tNFA_ACTIVATED& activated);
147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool isListenMode(tNFA_ACTIVATED& activated);
148d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Moralesstatic void enableDisableLptd (bool enable);
1490799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Moralesstatic tNFA_STATUS stopPolling_rfDiscoveryDisabled();
1500799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Moralesstatic tNFA_STATUS startPolling_rfDiscoveryDisabled(tNFA_TECHNOLOGY_MASK tech_mask);
1513a894dda035a331860f0f23e93528527493a07a3Love Khannastatic void nfcManager_doSetScreenState(JNIEnv* e, jobject o, jint screen_state_mask);
152525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1532dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoistatic uint16_t sCurrentConfigLen;
1542dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoistatic uint8_t sConfig[256];
1553a894dda035a331860f0f23e93528527493a07a3Love Khannastatic int prevScreenState = NFA_SCREEN_STATE_OFF_LOCKED;
1563a894dda035a331860f0f23e93528527493a07a3Love Khannastatic int NFA_SCREEN_POLLING_TAG_MASK = 0x10;
157f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoistatic bool gIsDtaEnabled = false;
158525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/////////////////////////////////////////////////////////////
159525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/////////////////////////////////////////////////////////////
160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
161525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
162525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        getNative
165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Get native data
167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Native data structure.
169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnfc_jni_native_data *getNative (JNIEnv* e, jobject o)
172525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
173525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static struct nfc_jni_native_data *sCachedNat = NULL;
174525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (e)
175525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
176525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sCachedNat = nfc_jni_get_nat(e, o);
177525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
178525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return sCachedNat;
179525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
180525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
181525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
182525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
183525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
184525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        handleRfDiscoveryEvent
185525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
186525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Handle RF-discovery events from the stack.
187525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  discoveredDevice: Discovered device.
188525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
189525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
190525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
191525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void handleRfDiscoveryEvent (tNFC_RESULT_DEVT* discoveredDevice)
193525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
194a0190709be02f0064bbc7d509c0d71690803e6b5Martijn Coenen    if (discoveredDevice->more == NCI_DISCOVER_NTF_MORE)
195525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
196525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //there is more discovery notification coming
197525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return;
198525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
199525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
200525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    bool isP2p = NfcTag::getInstance ().isP2pDiscovered ();
201c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen    if (!sReaderModeEnabled && isP2p)
202525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
203525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //select the peer that supports P2P
204525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcTag::getInstance ().selectP2p();
205525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
206525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else
207525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
208525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //select the first of multiple tags that is discovered
209525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcTag::getInstance ().selectFirstTag();
210525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
211525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
212525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
213525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
214525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
215525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
216525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfaConnectionCallback
217525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
218525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Receive connection-related events from stack.
219525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  connEvent: Event code.
220525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  eventData: Event data.
221525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
222525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
223525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
224525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
2252dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoistatic void nfaConnectionCallback (uint8_t connEvent, tNFA_CONN_EVT_DATA* eventData)
226525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
227525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS status = NFA_STATUS_FAILED;
2285f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: event= %u", __func__, connEvent);
229525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
230525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    switch (connEvent)
231525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
232525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_POLL_ENABLED_EVT: // whether polling successfully started
233525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
2345f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato            ALOGV("%s: NFA_POLL_ENABLED_EVT: status = %u", __func__, eventData->status);
235525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
236525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaEnableDisablePollingEvent);
237525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableDisablePollingEvent.notifyOne ();
238525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
239525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
240525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
241525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_POLL_DISABLED_EVT: // Listening/Polling stopped
242525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
2435f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato            ALOGV("%s: NFA_POLL_DISABLED_EVT: status = %u", __func__, eventData->status);
244525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
245525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaEnableDisablePollingEvent);
246525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableDisablePollingEvent.notifyOne ();
247525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
248525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
249525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
250525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_RF_DISCOVERY_STARTED_EVT: // RF Discovery started
251525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
2525f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato            ALOGV("%s: NFA_RF_DISCOVERY_STARTED_EVT: status = %u", __func__, eventData->status);
253525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaEnableDisablePollingEvent);
255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableDisablePollingEvent.notifyOne ();
256525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
259525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_RF_DISCOVERY_STOPPED_EVT: // RF Discovery stopped event
260525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
2615f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato            ALOGV("%s: NFA_RF_DISCOVERY_STOPPED_EVT: status = %u", __func__, eventData->status);
262525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
263525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaEnableDisablePollingEvent);
264525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableDisablePollingEvent.notifyOne ();
265525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
266525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
267525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
268525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DISC_RESULT_EVT: // NFC link/protocol discovery notificaiton
269525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = eventData->disc_result.status;
2705f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_DISC_RESULT_EVT: status = %d", __func__, status);
271525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (status != NFA_STATUS_OK)
272525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
2732dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi            ALOGE("%s: NFA_DISC_RESULT_EVT error: status = %d", __func__, status);
274525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
275525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else
276525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
277525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NfcTag::getInstance().connectionEventHandler(connEvent, eventData);
278525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            handleRfDiscoveryEvent(&eventData->disc_result.discovery_ntf);
279525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
280525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
281525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
282525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_SELECT_RESULT_EVT: // NFC link/protocol discovery select response
2835f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_SELECT_RESULT_EVT: status = %d, gIsSelectingRfInterface = %d, sIsDisabling=%d", __func__, eventData->status, gIsSelectingRfInterface, sIsDisabling);
284525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
285525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (sIsDisabling)
286525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
287525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
288525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (eventData->status != NFA_STATUS_OK)
289525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
290525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (gIsSelectingRfInterface)
291525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
292525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                nativeNfcTag_doConnectStatus(false);
293525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
294525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
2952dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi            ALOGE("%s: NFA_SELECT_RESULT_EVT error: status = %d", __func__, eventData->status);
296525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NFA_Deactivate (FALSE);
297525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
298525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
299525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
300525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DEACTIVATE_FAIL_EVT:
3015f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_DEACTIVATE_FAIL_EVT: status = %d", __func__, eventData->status);
302525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
303525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
304525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_ACTIVATED_EVT: // NFC link/protocol activated
3055f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_ACTIVATED_EVT: gIsSelectingRfInterface=%d, sIsDisabling=%d", __func__, gIsSelectingRfInterface, sIsDisabling);
3068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if((eventData->activated.activate_ntf.protocol != NFA_PROTOCOL_NFC_DEP) && (!isListenMode (eventData->activated)))
3078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
3088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            nativeNfcTag_setRfInterface ((tNFA_INTF_TYPE) eventData->activated.activate_ntf.intf_param.type);
3098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
3108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (EXTNS_GetConnectFlag () == TRUE)
3118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
3128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NfcTag::getInstance().setActivationState ();
3138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            nativeNfcTag_doConnectStatus (true);
3148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
3158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
316a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        NfcTag::getInstance().setActive(true);
317b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen        if (sIsDisabling || !sIsNfaEnabled)
318525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
319a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        gActivated = true;
320525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
321525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcTag::getInstance().setActivationState ();
322525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (gIsSelectingRfInterface)
323525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
324525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            nativeNfcTag_doConnectStatus(true);
325525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
326525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
327525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
328525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_resetPresenceCheck();
329525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (isPeerToPeer(eventData->activated))
330525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
331f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen            if (sReaderModeEnabled)
332f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen            {
3335f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato                ALOGV("%s: ignoring peer target in reader mode.", __func__);
334f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen                NFA_Deactivate (FALSE);
335f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen                break;
336f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen            }
337525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sP2pActive = true;
33809922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna            ALOGD("%s: NFA_ACTIVATED_EVT; is p2p", __func__);
33909922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna            if (NFC_GetNCIVersion() == NCI_VERSION_1_0)
34009922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna            {
34109922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                // Disable RF field events in case of p2p
34209922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                uint8_t  nfa_disable_rf_events[] = { 0x00 };
34309922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                ALOGD ("%s: Disabling RF field events", __func__);
34409922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                status = NFA_SetConfig(NCI_PARAM_ID_RF_FIELD_INFO, sizeof(nfa_disable_rf_events),
34509922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                        &nfa_disable_rf_events[0]);
34609922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                if (status == NFA_STATUS_OK) {
34709922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                    ALOGD ("%s: Disabled RF field events", __func__);
34809922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                } else {
34909922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                    ALOGE ("%s: Failed to disable RF field events", __func__);
35009922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                }
351525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
352525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
353525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else if (pn544InteropIsBusy() == false)
354525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
355525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NfcTag::getInstance().connectionEventHandler (connEvent, eventData);
356525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
357525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            // We know it is not activating for P2P.  If it activated in
35857a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen            // listen mode then it is likely for an SE transaction.
359525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            // Send the RF Event.
360525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (isListenMode(eventData->activated))
361525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
362525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sSeRfActive = true;
363525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
364525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
365525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
366525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
367525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DEACTIVATED_EVT: // NFC link/protocol deactivated
3685f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_DEACTIVATED_EVT   Type: %u, gIsTagDeactivating: %d", __func__, eventData->deactivated.type,gIsTagDeactivating);
369525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcTag::getInstance().setDeactivationState (eventData->deactivated);
370525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (eventData->deactivated.type != NFA_DEACTIVATE_TYPE_SLEEP)
371525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
372a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            {
373a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                SyncEventGuard g (gDeactivatedEvent);
374a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                gActivated = false; //guard this variable from multi-threaded access
375a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                gDeactivatedEvent.notifyOne ();
376a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            }
377525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            nativeNfcTag_resetPresenceCheck();
378525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NfcTag::getInstance().connectionEventHandler (connEvent, eventData);
379525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            nativeNfcTag_abortWaits();
380525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NfcTag::getInstance().abort ();
381525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
382525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else if (gIsTagDeactivating)
383525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
3848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NfcTag::getInstance ().setActive (false);
3858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            nativeNfcTag_doDeactivateStatus (0);
3868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
3878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else if (EXTNS_GetDeactivateFlag () == TRUE)
3888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
3898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NfcTag::getInstance().setActive (false);
3908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            nativeNfcTag_doDeactivateStatus (0);
391525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
392525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
393525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // If RF is activated for what we think is a Secure Element transaction
394525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // and it is deactivated to either IDLE or DISCOVERY mode, notify w/event.
395525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if ((eventData->deactivated.type == NFA_DEACTIVATE_TYPE_IDLE)
396525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                || (eventData->deactivated.type == NFA_DEACTIVATE_TYPE_DISCOVERY))
397525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
398525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (sSeRfActive) {
399525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sSeRfActive = false;
400525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            } else if (sP2pActive) {
401525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sP2pActive = false;
402525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                // Make sure RF field events are re-enabled
40309922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                ALOGD("%s: NFA_DEACTIVATED_EVT; is p2p", __func__);
40409922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                if (NFC_GetNCIVersion() == NCI_VERSION_1_0)
405b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen                {
40609922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                    // Disable RF field events in case of p2p
40709922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                    uint8_t  nfa_enable_rf_events[] = { 0x01 };
40809922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna
40909922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                    if (!sIsDisabling && sIsNfaEnabled)
41009922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                    {
41109922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                        ALOGD ("%s: Enabling RF field events", __func__);
41209922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                        status = NFA_SetConfig(NCI_PARAM_ID_RF_FIELD_INFO, sizeof(nfa_enable_rf_events),
41309922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                                &nfa_enable_rf_events[0]);
41409922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                        if (status == NFA_STATUS_OK) {
41509922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                            ALOGD ("%s: Enabled RF field events", __func__);
41609922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                        } else {
41709922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                            ALOGE ("%s: Failed to enable RF field events", __func__);
41809922d2d1dcb21cf7b0bf830efe577381f855c4bLove Khanna                        }
419b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen                    }
420525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                }
421525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
422525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
423525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
424525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
425525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
426525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_TLV_DETECT_EVT: // TLV Detection complete
427525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = eventData->tlv_detect.status;
4285f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_TLV_DETECT_EVT: status = %d, protocol = %d, num_tlvs = %d, num_bytes = %d",
4292dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi             __func__, status, eventData->tlv_detect.protocol,
430525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->tlv_detect.num_tlvs, eventData->tlv_detect.num_bytes);
431525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (status != NFA_STATUS_OK)
432525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
4332dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi            ALOGE("%s: NFA_TLV_DETECT_EVT error: status = %d", __func__, status);
434525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
435525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
436525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
437525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_NDEF_DETECT_EVT: // NDEF Detection complete;
438525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //if status is failure, it means the tag does not contain any or valid NDEF data;
439525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //pass the failure status to the NFC Service;
440525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = eventData->ndef_detect.status;
4415f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_NDEF_DETECT_EVT: status = 0x%X, protocol = %u, "
44244a6057818840847033a795da9546a3ac4bae76bRuchi Kandoi             "max_size = %u, cur_size = %u, flags = 0x%X", __func__,
443525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             status,
444525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->ndef_detect.protocol, eventData->ndef_detect.max_size,
445525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->ndef_detect.cur_size, eventData->ndef_detect.flags);
446525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcTag::getInstance().connectionEventHandler (connEvent, eventData);
447525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_doCheckNdefResult(status,
448525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            eventData->ndef_detect.max_size, eventData->ndef_detect.cur_size,
449525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            eventData->ndef_detect.flags);
450525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
451525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
452525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DATA_EVT: // Data message received (for non-NDEF reads)
4535f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_DATA_EVT: status = 0x%X, len = %d", __func__, eventData->status, eventData->data.len);
454b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        nativeNfcTag_doTransceiveStatus(eventData->status, eventData->data.p_data, eventData->data.len);
455525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
456a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    case NFA_RW_INTF_ERROR_EVT:
4575f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFC_RW_INTF_ERROR_EVT", __func__);
458a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        nativeNfcTag_notifyRfTimeout();
459b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        nativeNfcTag_doReadCompleted (NFA_STATUS_TIMEOUT);
460a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        break;
461525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_SELECT_CPLT_EVT: // Select completed
462525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = eventData->status;
4635f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_SELECT_CPLT_EVT: status = %d", __func__, status);
464525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (status != NFA_STATUS_OK)
465525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
4662dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi            ALOGE("%s: NFA_SELECT_CPLT_EVT error: status = %d", __func__, status);
467525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
468525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
469525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
470525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_READ_CPLT_EVT: // NDEF-read or tag-specific-read completed
4715f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_READ_CPLT_EVT: status = 0x%X", __func__, eventData->status);
472525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_doReadCompleted (eventData->status);
473525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcTag::getInstance().connectionEventHandler (connEvent, eventData);
474525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
475525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
476525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_WRITE_CPLT_EVT: // Write completed
4775f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_WRITE_CPLT_EVT: status = %d", __func__, eventData->status);
478525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_doWriteStatus (eventData->status == NFA_STATUS_OK);
479525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
480525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
481525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_SET_TAG_RO_EVT: // Tag set as Read only
4825f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_SET_TAG_RO_EVT: status = %d", __func__, eventData->status);
483525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_doMakeReadonlyResult(eventData->status);
484525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
485525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
486525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_CE_NDEF_WRITE_START_EVT: // NDEF write started
4875f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_CE_NDEF_WRITE_START_EVT: status: %d", __func__, eventData->status);
488525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
489525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (eventData->status != NFA_STATUS_OK)
4902dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi            ALOGE("%s: NFA_CE_NDEF_WRITE_START_EVT error: status = %d", __func__, eventData->status);
491525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
492525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
493525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_CE_NDEF_WRITE_CPLT_EVT: // NDEF write completed
4945f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: FA_CE_NDEF_WRITE_CPLT_EVT: len = %u", __func__, eventData->ndef_write_cplt.len);
495525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
496525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
497525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_LLCP_ACTIVATED_EVT: // LLCP link is activated
4985f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_LLCP_ACTIVATED_EVT: is_initiator: %d  remote_wks: %d, remote_lsc: %d, remote_link_miu: %d, local_link_miu: %d",
4992dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi             __func__,
500525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->llcp_activated.is_initiator,
501525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->llcp_activated.remote_wks,
502525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->llcp_activated.remote_lsc,
503525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->llcp_activated.remote_link_miu,
504525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->llcp_activated.local_link_miu);
505525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
506525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PeerToPeer::getInstance().llcpActivatedHandler (getNative(0, 0), eventData->llcp_activated);
507525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
508525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
509525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_LLCP_DEACTIVATED_EVT: // LLCP link is deactivated
5105f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_LLCP_DEACTIVATED_EVT", __func__);
511525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PeerToPeer::getInstance().llcpDeactivatedHandler (getNative(0, 0), eventData->llcp_deactivated);
512525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
51357a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen    case NFA_LLCP_FIRST_PACKET_RECEIVED_EVT: // Received first packet over llcp
5145f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_LLCP_FIRST_PACKET_RECEIVED_EVT", __func__);
51557a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen        PeerToPeer::getInstance().llcpFirstPacketHandler (getNative(0, 0));
51657a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen        break;
517525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_PRESENCE_CHECK_EVT:
5185f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_PRESENCE_CHECK_EVT", __func__);
519525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_doPresenceCheckResult (eventData->status);
520525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
521525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_FORMAT_CPLT_EVT:
5225f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_FORMAT_CPLT_EVT: status=0x%X", __func__, eventData->status);
523525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_formatStatus (eventData->status == NFA_STATUS_OK);
524525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
525525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
526525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_I93_CMD_CPLT_EVT:
5275f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_I93_CMD_CPLT_EVT: status=0x%X", __func__, eventData->status);
528525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
529525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
530525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_CE_UICC_LISTEN_CONFIGURED_EVT :
5315f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_CE_UICC_LISTEN_CONFIGURED_EVT : status=0x%X", __func__, eventData->status);
532525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
533525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
534525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_SET_P2P_LISTEN_TECH_EVT:
5355f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_SET_P2P_LISTEN_TECH_EVT", __func__);
536525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PeerToPeer::getInstance().connectionEventHandler (connEvent, eventData);
537525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
538525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
539525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    default:
5405f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: unknown event ????", __func__);
541525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
542525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
543525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
544525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
545525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
546525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
547525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
548525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_initNativeStruc
549525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
550525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Initialize variables.
551525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
552525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
553525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
554525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if ok.
555525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
556525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
557525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean nfcManager_initNativeStruc (JNIEnv* e, jobject o)
558525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
5595f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: enter", __func__);
560525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
5612534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    nfc_jni_native_data* nat = (nfc_jni_native_data*)malloc(sizeof(struct nfc_jni_native_data));
562525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (nat == NULL)
563525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
5645f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGE("%s: fail allocate native data", __func__);
565525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_FALSE;
566525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
567525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
568525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    memset (nat, 0, sizeof(*nat));
5692534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->GetJavaVM(&(nat->vm));
5702534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    nat->env_version = e->GetVersion();
5712534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    nat->manager = e->NewGlobalRef(o);
572525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
5732534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jclass> cls(e, e->GetObjectClass(o));
574fb18ffb259fe8f40e81516842497735a7c0b6a8cAndres Morales    jfieldID f = e->GetFieldID(cls.get(), "mNative", "J");
575fb18ffb259fe8f40e81516842497735a7c0b6a8cAndres Morales    e->SetLongField(o, f, (jlong)nat);
576525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
577525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Initialize native cached references */
5782534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    gCachedNfcManagerNotifyNdefMessageListeners = e->GetMethodID(cls.get(),
579525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            "notifyNdefMessageListeners", "(Lcom/android/nfc/dhimpl/NativeNfcTag;)V");
5802534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    gCachedNfcManagerNotifyLlcpLinkActivation = e->GetMethodID(cls.get(),
581525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            "notifyLlcpLinkActivation", "(Lcom/android/nfc/dhimpl/NativeP2pDevice;)V");
5822534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    gCachedNfcManagerNotifyLlcpLinkDeactivated = e->GetMethodID(cls.get(),
583525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            "notifyLlcpLinkDeactivated", "(Lcom/android/nfc/dhimpl/NativeP2pDevice;)V");
58457a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen    gCachedNfcManagerNotifyLlcpFirstPacketReceived = e->GetMethodID(cls.get(),
58557a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen            "notifyLlcpLinkFirstPacketReceived", "(Lcom/android/nfc/dhimpl/NativeP2pDevice;)V");
586525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
5879f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    gCachedNfcManagerNotifyHostEmuActivated = e->GetMethodID(cls.get(),
588ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito            "notifyHostEmuActivated", "(I)V");
5899f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
5909f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    gCachedNfcManagerNotifyHostEmuData = e->GetMethodID(cls.get(),
591ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito            "notifyHostEmuData", "(I[B)V");
5929f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
5939f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    gCachedNfcManagerNotifyHostEmuDeactivated = e->GetMethodID(cls.get(),
594ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito            "notifyHostEmuDeactivated", "(I)V");
5959f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
596c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen    gCachedNfcManagerNotifyRfFieldActivated = e->GetMethodID(cls.get(),
597c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            "notifyRfFieldActivated", "()V");
598c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen    gCachedNfcManagerNotifyRfFieldDeactivated = e->GetMethodID(cls.get(),
599c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            "notifyRfFieldDeactivated", "()V");
600c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen
6012534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    if (nfc_jni_cache_object(e, gNativeNfcTagClassName, &(nat->cached_NfcTag)) == -1)
602525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
6035f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGE("%s: fail cache NativeNfcTag", __func__);
604525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_FALSE;
605525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
606525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
6072534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    if (nfc_jni_cache_object(e, gNativeP2pDeviceClassName, &(nat->cached_P2pDevice)) == -1)
608525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
6095f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGE("%s: fail cache NativeP2pDevice", __func__);
610525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_FALSE;
611525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
612525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
6135f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: exit", __func__);
614525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return JNI_TRUE;
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**
620525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfaDeviceManagementCallback
621525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
622525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Receive device management events from stack.
623525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  dmEvent: Device-management event ID.
624525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  eventData: Data associated with event ID.
625525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
626525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
627525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
628525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
6292dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoivoid nfaDeviceManagementCallback (uint8_t dmEvent, tNFA_DM_CBACK_DATA* eventData)
630525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
6315f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: enter; event=0x%X", __func__, dmEvent);
632525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
633525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    switch (dmEvent)
634525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
635525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_ENABLE_EVT: /* Result of NFA_Enable */
636525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
637525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaEnableEvent);
6385f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato            ALOGV("%s: NFA_DM_ENABLE_EVT; status=0x%X",
6392dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi                    __func__, eventData->status);
640525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sIsNfaEnabled = eventData->status == NFA_STATUS_OK;
641525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sIsDisabling = false;
642525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableEvent.notifyOne ();
643525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
644525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
645525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
646525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_DISABLE_EVT: /* Result of NFA_Disable */
647525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
648525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaDisableEvent);
6495f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato            ALOGV("%s: NFA_DM_DISABLE_EVT", __func__);
650525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sIsNfaEnabled = false;
651525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sIsDisabling = false;
652525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaDisableEvent.notifyOne ();
653525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
654525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
655525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
656525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_SET_CONFIG_EVT: //result of NFA_SetConfig
6575f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_DM_SET_CONFIG_EVT", __func__);
658525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
659525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaSetConfigEvent);
660525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaSetConfigEvent.notifyOne();
661525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
662525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
663525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
664525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_GET_CONFIG_EVT: /* Result of NFA_GetConfig */
6655f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_DM_GET_CONFIG_EVT", __func__);
666f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen        {
667f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen            SyncEventGuard guard (sNfaGetConfigEvent);
668f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen            if (eventData->status == NFA_STATUS_OK &&
669f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen                    eventData->get_config.tlv_size <= sizeof(sConfig))
670f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen            {
671f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen                sCurrentConfigLen = eventData->get_config.tlv_size;
672f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen                memcpy(sConfig, eventData->get_config.param_tlvs, eventData->get_config.tlv_size);
673f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen            }
674f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen            else
675f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen            {
6762dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi                ALOGE("%s: NFA_DM_GET_CONFIG failed", __func__);
677f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen                sCurrentConfigLen = 0;
678f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen            }
679f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen            sNfaGetConfigEvent.notifyOne();
680f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen        }
681525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
682525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
683525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_RF_FIELD_EVT:
6845f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: NFA_DM_RF_FIELD_EVT; status=0x%X; field status=%u", __func__,
685525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project              eventData->rf_field.status, eventData->rf_field.rf_field_status);
686c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen        if (!sP2pActive && eventData->rf_field.status == NFA_STATUS_OK)
687c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen        {
688c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            struct nfc_jni_native_data *nat = getNative(NULL, NULL);
689c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            JNIEnv* e = NULL;
690c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            ScopedAttach attach(nat->vm, &e);
691c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            if (e == NULL)
692c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            {
6935f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato                ALOGE("jni env is null");
694c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen                return;
695c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            }
696c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            if (eventData->rf_field.rf_field_status == NFA_DM_RF_FIELD_ON)
697c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen                e->CallVoidMethod (nat->manager, android::gCachedNfcManagerNotifyRfFieldActivated);
698c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            else
699c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen                e->CallVoidMethod (nat->manager, android::gCachedNfcManagerNotifyRfFieldDeactivated);
700c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen        }
701525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
702525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
703525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_NFCC_TRANSPORT_ERR_EVT:
704525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_NFCC_TIMEOUT_EVT:
705525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
706525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (dmEvent == NFA_DM_NFCC_TIMEOUT_EVT)
7075f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato                ALOGE("%s: NFA_DM_NFCC_TIMEOUT_EVT; abort", __func__);
708a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            else if (dmEvent == NFA_DM_NFCC_TRANSPORT_ERR_EVT)
7095f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato                ALOGE("%s: NFA_DM_NFCC_TRANSPORT_ERR_EVT; abort", __func__);
710525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
711525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            nativeNfcTag_abortWaits();
712525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NfcTag::getInstance().abort ();
713525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sAbortConnlessWait = true;
714525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            nativeLlcpConnectionlessSocket_abortWait();
715525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
7165f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato                ALOGV("%s: aborting  sNfaEnableDisablePollingEvent", __func__);
717525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                SyncEventGuard guard (sNfaEnableDisablePollingEvent);
718525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sNfaEnableDisablePollingEvent.notifyOne();
719525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
720525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
7215f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato                ALOGV("%s: aborting  sNfaEnableEvent", __func__);
722525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                SyncEventGuard guard (sNfaEnableEvent);
723525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sNfaEnableEvent.notifyOne();
724525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
725525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
7265f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato                ALOGV("%s: aborting  sNfaDisableEvent", __func__);
727525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                SyncEventGuard guard (sNfaDisableEvent);
728525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sNfaDisableEvent.notifyOne();
729525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
730525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sDiscoveryEnabled = false;
7310799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales            sPollingEnabled = false;
732525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            PowerSwitch::getInstance ().abort ();
733525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
734525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (!sIsDisabling && sIsNfaEnabled)
735525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
7368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                EXTNS_Close ();
737525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                NFA_Disable(FALSE);
738525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sIsDisabling = true;
739525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
740525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            else
741525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
742525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sIsNfaEnabled = false;
743525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sIsDisabling = false;
744525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
745525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            PowerSwitch::getInstance ().initialize (PowerSwitch::UNKNOWN_LEVEL);
7465f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato            ALOGE("%s: crash NFC service", __func__);
747a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            //////////////////////////////////////////////
748a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            //crash the NFC service process so it can restart automatically
749a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            abort ();
750a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            //////////////////////////////////////////////
751525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
752525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
753525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
754525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_PWR_MODE_CHANGE_EVT:
755525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PowerSwitch::getInstance ().deviceManagementCallback (dmEvent, eventData);
756525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
757525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
7583a894dda035a331860f0f23e93528527493a07a3Love Khanna    case NFA_DM_SET_POWER_SUB_STATE_EVT:
7593a894dda035a331860f0f23e93528527493a07a3Love Khanna        {
7603a894dda035a331860f0f23e93528527493a07a3Love Khanna            ALOGD("%s: NFA_DM_SET_POWER_SUB_STATE_EVT; status=0x%X",
7613a894dda035a331860f0f23e93528527493a07a3Love Khanna                    __FUNCTION__, eventData->power_sub_state.status);
7623a894dda035a331860f0f23e93528527493a07a3Love Khanna            SyncEventGuard guard (sNfaSetPowerSubState);
7633a894dda035a331860f0f23e93528527493a07a3Love Khanna            sNfaSetPowerSubState.notifyOne();
7643a894dda035a331860f0f23e93528527493a07a3Love Khanna        }
7653a894dda035a331860f0f23e93528527493a07a3Love Khanna        break;
766525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    default:
7675f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: unhandled event", __func__);
768525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
769525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
770525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
771525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
7729f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen/*******************************************************************************
7739f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
7749f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Function:        nfcManager_sendRawFrame
7759f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
7769f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Description:     Send a raw frame.
7779f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**                  e: JVM environment.
7789f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**                  o: Java object.
7799f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
7809f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Returns:         True if ok.
7819f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
7829f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen*******************************************************************************/
783c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenenstatic jboolean nfcManager_sendRawFrame (JNIEnv* e, jobject, jbyteArray data)
7849f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen{
7859f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    ScopedByteArrayRO bytes(e, data);
7869f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0]));
7879f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    size_t bufLen = bytes.size();
7889f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    tNFA_STATUS status = NFA_SendRawFrame (buf, bufLen, 0);
7899f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
7909f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    return (status == NFA_STATUS_OK);
7919f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen}
7929f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
7939f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen/*******************************************************************************
7949f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
7959f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Function:        nfcManager_routeAid
7969f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
7979f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Description:     Route an AID to an EE
7989f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**                  e: JVM environment.
7998ee2015a9c4639d465a390af93df3fdcd983cac8Love Khanna**                  aid: aid to be added to routing table.
8008ee2015a9c4639d465a390af93df3fdcd983cac8Love Khanna**                  route: aid route location. i.e. DH/eSE/UICC
8018ee2015a9c4639d465a390af93df3fdcd983cac8Love Khanna**                  aidInfo: prefix or suffix aid.
8029f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
8038ee2015a9c4639d465a390af93df3fdcd983cac8Love Khanna** Returns:         True if aid is accpted by NFA Layer.
8049f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
8059f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen*******************************************************************************/
8068ee2015a9c4639d465a390af93df3fdcd983cac8Love Khannastatic jboolean nfcManager_routeAid (JNIEnv* e, jobject, jbyteArray aid, jint route, jint aidInfo)
8079f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen{
8089f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    ScopedByteArrayRO bytes(e, aid);
8099f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0]));
8109f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    size_t bufLen = bytes.size();
8118ee2015a9c4639d465a390af93df3fdcd983cac8Love Khanna    return RoutingManager::getInstance().addAidRouting(buf, bufLen, route, aidInfo);
8129f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen}
8139f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
8149f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen/*******************************************************************************
8159f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
8169f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Function:        nfcManager_unrouteAid
8179f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
8189f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Description:     Remove a AID routing
8199f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**                  e: JVM environment.
8209f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**                  o: Java object.
8219f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
8229f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Returns:         True if ok.
8239f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
8249f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen*******************************************************************************/
825c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenenstatic jboolean nfcManager_unrouteAid (JNIEnv* e, jobject, jbyteArray aid)
8269f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen{
8279f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    ScopedByteArrayRO bytes(e, aid);
8289f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0]));
8299f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    size_t bufLen = bytes.size();
8309f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    bool result = RoutingManager::getInstance().removeAidRouting(buf, bufLen);
8319f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    return result;
8329f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen}
833525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
834525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
835525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
836f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen** Function:        nfcManager_commitRouting
837f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen**
838f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen** Description:     Sends the AID routing table to the controller
839f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen**                  e: JVM environment.
840f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen**                  o: Java object.
841f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen**
842f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen** Returns:         True if ok.
843f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen**
844f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen*******************************************************************************/
845f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenenstatic jboolean nfcManager_commitRouting (JNIEnv* e, jobject)
846f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen{
847f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen    return RoutingManager::getInstance().commitRouting();
848f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen}
849f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen
850f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen/*******************************************************************************
851f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen**
852ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito** Function:        nfcManager_doRegisterT3tIdentifier
853ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**
854ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito** Description:     Registers LF_T3T_IDENTIFIER for NFC-F.
855ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**                  e: JVM environment.
856ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**                  o: Java object.
857ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**                  t3tIdentifier: LF_T3T_IDENTIFIER value (10 or 18 bytes)
858ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**
859ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito** Returns:         Handle retrieve from RoutingManager.
860ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**
861ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito*******************************************************************************/
862ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Itostatic jint nfcManager_doRegisterT3tIdentifier(JNIEnv* e, jobject, jbyteArray t3tIdentifier)
863ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito{
8645f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: enter", __func__);
865ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito
866ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito    ScopedByteArrayRO bytes(e, t3tIdentifier);
867ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito    uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0]));
868ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito    size_t bufLen = bytes.size();
869ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito    int handle = RoutingManager::getInstance().registerT3tIdentifier(buf, bufLen);
870ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito
8715f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: handle=%d", __func__, handle);
8725f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: exit", __func__);
873ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito
874ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito    return handle;
875ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito}
876ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito
877ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito/*******************************************************************************
878ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**
879ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito** Function:        nfcManager_doDeregisterT3tIdentifier
880ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**
881ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito** Description:     Deregisters LF_T3T_IDENTIFIER for NFC-F.
882ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**                  e: JVM environment.
883ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**                  o: Java object.
884ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**                  handle: Handle retrieve from libnfc-nci.
885ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**
886ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito** Returns:         None
887ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**
888ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito*******************************************************************************/
889ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Itostatic void nfcManager_doDeregisterT3tIdentifier(JNIEnv*, jobject, jint handle)
890ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito{
8915f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: enter; handle=%d", __func__, handle);
892ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito
893ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito    RoutingManager::getInstance().deregisterT3tIdentifier(handle);
894ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito
8955f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: exit", __func__);
896ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito}
897ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito
898ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito/*******************************************************************************
899ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**
900ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito** Function:        nfcManager_getLfT3tMax
901ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**
902ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito** Description:     Returns LF_T3T_MAX value.
903ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**                  e: JVM environment.
904ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**                  o: Java object.
905ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**
906ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito** Returns:         LF_T3T_MAX value.
907ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**
908ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito*******************************************************************************/
909ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Itostatic jint nfcManager_getLfT3tMax(JNIEnv*, jobject)
910ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito{
9115f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: enter", __func__);
9125f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("LF_T3T_MAX=%d", sLfT3tMax);
9135f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: exit", __func__);
914ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito
915ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito    return sLfT3tMax;
916ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito}
917ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito
918ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito/*******************************************************************************
919ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito**
920525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doInitialize
921525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
922525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Turn on NFC.
923525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
924525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
925525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
926525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if ok.
927525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
928525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
929304a6342ee7e5620d3b50d988755c035f1686dc2Martijn Coenenstatic jboolean nfcManager_doInitialize (JNIEnv* e, jobject o)
930525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
9315f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: enter; ver=%s nfa=%s NCI_VERSION=0x%02X",
9322dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi        __func__, nfca_version_string, nfa_version_string, NCI_VERSION);
933525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS stat = NFA_STATUS_OK;
934525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
935d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    PowerSwitch & powerSwitch = PowerSwitch::getInstance ();
936d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales
937525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sIsNfaEnabled)
938525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
9395f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: already enabled", __func__);
940525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
941525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
942525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
943d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    powerSwitch.initialize (PowerSwitch::FULL_POWER);
944525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
945525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
946525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        unsigned long num = 0;
947525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
948525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcAdaptation& theInstance = NfcAdaptation::GetInstance();
949525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        theInstance.Initialize(); //start GKI, NCI task, NFC task
950525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
951525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
952525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaEnableEvent);
953525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            tHAL_NFC_ENTRY* halFuncEntries = theInstance.GetHalEntryFuncs ();
954525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
955525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NFA_Init (halFuncEntries);
956525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
957525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            stat = NFA_Enable (nfaDeviceManagementCallback, nfaConnectionCallback);
958525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (stat == NFA_STATUS_OK)
959525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
960525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                num = initializeGlobalAppLogLevel ();
961525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                CE_SetTraceLevel (num);
962525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                LLCP_SetTraceLevel (num);
963525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                NFC_SetTraceLevel (num);
964525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                RW_SetTraceLevel (num);
965525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                NFA_SetTraceLevel (num);
966525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                NFA_P2pSetTraceLevel (num);
967525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sNfaEnableEvent.wait(); //wait for NFA command to finish
968525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
9698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            EXTNS_Init (nfaDeviceManagementCallback, nfaConnectionCallback);
970525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
971525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
972525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (stat == NFA_STATUS_OK)
973525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
974525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            //sIsNfaEnabled indicates whether stack started successfully
975525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (sIsNfaEnabled)
976525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
9779f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen                RoutingManager::getInstance().initialize(getNative(e, o));
978525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                nativeNfcTag_registerNdefTypeHandler ();
979525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                NfcTag::getInstance().initialize (getNative(e, o));
980525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                PeerToPeer::getInstance().initialize ();
981525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                PeerToPeer::getInstance().handleNfcOnOff (true);
982525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
983525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                /////////////////////////////////////////////////////////////////////////////////
984525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                // Add extra configuration here (work-arounds, etc.)
985525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
986f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi                if (gIsDtaEnabled == true)
987f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi                {
988f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi                    uint8_t configData = 0;
989f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi                    configData = 0x01;    /* Poll NFC-DEP : Highest Available Bit Rates */
990f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi                    NFA_SetConfig(NFC_PMID_BITR_NFC_DEP, sizeof(uint8_t), &configData);
991f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi                    configData = 0x0B;    /* Listen NFC-DEP : Waiting Time */
992f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi                    NFA_SetConfig(NFC_PMID_WT, sizeof(uint8_t), &configData);
993f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi                    configData = 0x0F;    /* Specific Parameters for NFC-DEP RF Interface */
994f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi                    NFA_SetConfig(NFC_PMID_NFC_DEP_OP, sizeof(uint8_t), &configData);
995f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi                }
996f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi
997525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                struct nfc_jni_native_data *nat = getNative(e, o);
998525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
999525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                if ( nat )
1000525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                {
1001525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    if (GetNumValue(NAME_POLLING_TECH_MASK, &num, sizeof(num)))
1002525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        nat->tech_mask = num;
1003525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    else
1004525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        nat->tech_mask = DEFAULT_TECH_MASK;
10055f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato                    ALOGV("%s: tag polling tech mask=0x%X", __func__, nat->tech_mask);
1006525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                }
1007525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1008525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                // if this value exists, set polling interval.
1009525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                if (GetNumValue(NAME_NFA_DM_DISC_DURATION_POLL, &num, sizeof(num)))
1010c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen                    nat->discovery_duration = num;
1011c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen                else
1012c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen                    nat->discovery_duration = DEFAULT_DISCOVERY_DURATION;
1013c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen
1014c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen                NFA_SetRfDiscoveryDuration(nat->discovery_duration);
1015525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1016ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito                // get LF_T3T_MAX
1017ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito                {
1018ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito                    SyncEventGuard guard (sNfaGetConfigEvent);
1019ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito                    tNFA_PMID configParam[1] = {NCI_PARAM_ID_LF_T3T_MAX};
1020ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito                    stat = NFA_GetConfig(1, configParam);
1021ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito                    if (stat == NFA_STATUS_OK)
1022ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito                    {
1023ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito                        sNfaGetConfigEvent.wait ();
1024ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito                        if (sCurrentConfigLen >= 4 || sConfig[1] == NCI_PARAM_ID_LF_T3T_MAX) {
10255f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato                            ALOGV("%s: lfT3tMax=%d", __func__, sConfig[3]);
1026ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito                            sLfT3tMax = sConfig[3];
1027ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito                        }
1028ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito                    }
1029ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito                }
1030ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito
10311227736a352797f6bebe7f4e098dab6a15f3164cLove Khanna                prevScreenState = NFA_SCREEN_STATE_OFF_LOCKED;
10321227736a352797f6bebe7f4e098dab6a15f3164cLove Khanna
1033525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                // Do custom NFCA startup configuration.
1034525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                doStartupConfig();
1035525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                goto TheEnd;
1036525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
1037525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1038525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
10395f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGE("%s: fail nfa enable; error=0x%X", __func__, stat);
1040525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1041525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (sIsNfaEnabled)
10428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
10438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            EXTNS_Close ();
1044525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            stat = NFA_Disable (FALSE /* ungraceful */);
10458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
1046525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1047525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        theInstance.Finalize();
1048525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1049525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1050525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd:
1051525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sIsNfaEnabled)
1052525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER);
10535f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: exit", __func__);
1054525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return sIsNfaEnabled ? JNI_TRUE : JNI_FALSE;
1055525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1056525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1057f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoistatic void nfcManager_doEnableDtaMode (JNIEnv*, jobject)
1058f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi{
1059f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi    gIsDtaEnabled = true;
1060f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi}
1061525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1062f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoistatic void nfcManager_doDisableDtaMode(JNIEnv*, jobject)
1063f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi{
1064f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi    gIsDtaEnabled = false;
1065f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi}
1066525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1067525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1068525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_enableDiscovery
1069525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1070525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Start polling and listening for devices.
1071525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1072525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1073d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales**                  technologies_mask: the bitmask of technologies for which to enable discovery
1074d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales**                  enable_lptd: whether to enable low power polling (default: false)
1075525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1076525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1077525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1078525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1079d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Moralesstatic void nfcManager_enableDiscovery (JNIEnv* e, jobject o, jint technologies_mask, \
108031b0f4653686119d74876cae5d637c5baf52b935Andres Morales    jboolean enable_lptd, jboolean reader_mode, jboolean enable_host_routing, jboolean enable_p2p,
10810799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    jboolean restart)
1082525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1083525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_TECHNOLOGY_MASK tech_mask = DEFAULT_TECH_MASK;
1084525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    struct nfc_jni_native_data *nat = getNative(e, o);
1085525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
10860799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    if (technologies_mask == -1 && nat)
1087525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        tech_mask = (tNFA_TECHNOLOGY_MASK)nat->tech_mask;
10880799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    else if (technologies_mask != -1)
1089d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales        tech_mask = (tNFA_TECHNOLOGY_MASK) technologies_mask;
10905f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: enter; tech_mask = %02x", __func__, tech_mask);
1091525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
10920799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    if (sDiscoveryEnabled && !restart)
1093525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
10945f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGE("%s: already discovering", __func__);
1095525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return;
1096525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1097525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1098525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PowerSwitch::getInstance ().setLevel (PowerSwitch::FULL_POWER);
1099525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1100525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sRfEnabled) {
1101525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // Stop RF discovery to reconfigure
1102525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        startRfDiscovery(false);
1103525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1104525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
11050799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    // Check polling configuration
11060799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    if (tech_mask != 0)
1107a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales    {
11080799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        stopPolling_rfDiscoveryDisabled();
11090799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        enableDisableLptd(enable_lptd);
11100799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        startPolling_rfDiscoveryDisabled(tech_mask);
11110799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
11120799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        // Start P2P listening if tag polling was enabled
11130799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        if (sPollingEnabled)
1114a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales        {
11155f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato            ALOGV("%s: Enable p2pListening", __func__);
111631b0f4653686119d74876cae5d637c5baf52b935Andres Morales
111731b0f4653686119d74876cae5d637c5baf52b935Andres Morales            if (enable_p2p && !sP2pEnabled) {
111831b0f4653686119d74876cae5d637c5baf52b935Andres Morales                sP2pEnabled = true;
111931b0f4653686119d74876cae5d637c5baf52b935Andres Morales                PeerToPeer::getInstance().enableP2pListening (true);
112031b0f4653686119d74876cae5d637c5baf52b935Andres Morales                NFA_ResumeP2p();
112131b0f4653686119d74876cae5d637c5baf52b935Andres Morales            } else if (!enable_p2p && sP2pEnabled) {
112231b0f4653686119d74876cae5d637c5baf52b935Andres Morales                sP2pEnabled = false;
112331b0f4653686119d74876cae5d637c5baf52b935Andres Morales                PeerToPeer::getInstance().enableP2pListening (false);
112431b0f4653686119d74876cae5d637c5baf52b935Andres Morales                NFA_PauseP2p();
112531b0f4653686119d74876cae5d637c5baf52b935Andres Morales            }
11260799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
11270799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales            if (reader_mode && !sReaderModeEnabled)
11280799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales            {
11290799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                sReaderModeEnabled = true;
11300799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                NFA_DisableListening();
11310799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                NFA_SetRfDiscoveryDuration(READER_MODE_DISCOVERY_DURATION);
11320799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales            }
113331b0f4653686119d74876cae5d637c5baf52b935Andres Morales            else if (!reader_mode && sReaderModeEnabled)
11340799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales            {
11350799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                struct nfc_jni_native_data *nat = getNative(e, o);
11360799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                sReaderModeEnabled = false;
11370799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                NFA_EnableListening();
11380799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                NFA_SetRfDiscoveryDuration(nat->discovery_duration);
11390799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales            }
1140a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales        }
1141a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales    }
11420799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    else
1143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
11440799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        // No technologies configured, stop polling
11450799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        stopPolling_rfDiscoveryDisabled();
1146525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
11480799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    // Check listen configuration
11490799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    if (enable_host_routing)
11500799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    {
11510799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        RoutingManager::getInstance().enableRoutingToHost();
11520799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        RoutingManager::getInstance().commitRouting();
11530799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    }
11540799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    else
11550799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    {
11560799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        RoutingManager::getInstance().disableRoutingToHost();
11570799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        RoutingManager::getInstance().commitRouting();
11580799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    }
1159525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // Actually start discovery.
1160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    startRfDiscovery (true);
11610799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    sDiscoveryEnabled = true;
1162a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales
1163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PowerSwitch::getInstance ().setModeOn (PowerSwitch::DISCOVERY);
1164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
11655f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: exit", __func__);
1166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_disableDiscovery
1172525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1173525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Stop polling and listening for devices.
1174525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1175525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1176525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1177525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1178525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1179525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
11800799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Moralesvoid nfcManager_disableDiscovery (JNIEnv* e, jobject o)
1181525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1182525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS status = NFA_STATUS_OK;
11835f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: enter;", __func__);
1184525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1185525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    pn544InteropAbortNow ();
1186525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sDiscoveryEnabled == false)
1187525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
11885f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: already disabled", __func__);
1189525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
1190525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1191525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // Stop RF Discovery.
1193525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    startRfDiscovery (false);
1194525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
11950799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    if (sPollingEnabled)
11960799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        status = stopPolling_rfDiscoveryDisabled();
1197525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1198525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PeerToPeer::getInstance().enableP2pListening (false);
1199e6b10cf6f5c7bb363890428e2c52505c76b13b8dAndres Morales    sP2pEnabled = false;
12000799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    sDiscoveryEnabled = false;
1201525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //if nothing is active after this, then tell the controller to power down
1202525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (! PowerSwitch::getInstance ().setModeOff (PowerSwitch::DISCOVERY))
1203525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER);
1204525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd:
12055f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: exit", __func__);
1206525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1207525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1208d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenenvoid enableDisableLptd (bool enable)
1209d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen{
1210d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    // This method is *NOT* thread-safe. Right now
1211d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    // it is only called from the same thread so it's
1212d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    // not an issue.
1213d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    static bool sCheckedLptd = false;
1214d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    static bool sHasLptd = false;
1215d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen
1216d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    tNFA_STATUS stat = NFA_STATUS_OK;
1217d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    if (!sCheckedLptd)
1218d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    {
1219d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        sCheckedLptd = true;
1220d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        SyncEventGuard guard (sNfaGetConfigEvent);
1221d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        tNFA_PMID configParam[1] = {NCI_PARAM_ID_TAGSNIFF_CFG};
1222d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        stat = NFA_GetConfig(1, configParam);
1223d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        if (stat != NFA_STATUS_OK)
1224d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        {
12252dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi            ALOGE("%s: NFA_GetConfig failed", __func__);
1226d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen            return;
1227d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        }
1228d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        sNfaGetConfigEvent.wait ();
1229d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        if (sCurrentConfigLen < 4 || sConfig[1] != NCI_PARAM_ID_TAGSNIFF_CFG) {
12302dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi            ALOGE("%s: Config TLV length %d returned is too short", __func__,
1231d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen                    sCurrentConfigLen);
1232d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen            return;
1233d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        }
12344181521d0157554a59e32bf06f80bfbc6288f01dMartijn Coenen        if (sConfig[3] == 0) {
12352dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi            ALOGE("%s: LPTD is disabled, not enabling in current config", __func__);
12364181521d0157554a59e32bf06f80bfbc6288f01dMartijn Coenen            return;
12374181521d0157554a59e32bf06f80bfbc6288f01dMartijn Coenen        }
1238d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        sHasLptd = true;
1239d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    }
1240d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    // Bail if we checked and didn't find any LPTD config before
1241d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    if (!sHasLptd) return;
12422dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi    uint8_t enable_byte = enable ? 0x01 : 0x00;
1243d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen
1244d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    SyncEventGuard guard(sNfaSetConfigEvent);
1245d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen
124633aeb7c13f8fd9d9bd301f31680836b8ec912d51Martijn Coenen    stat = NFA_SetConfig(NCI_PARAM_ID_TAGSNIFF_CFG, 1, &enable_byte);
1247d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    if (stat == NFA_STATUS_OK)
1248d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        sNfaSetConfigEvent.wait ();
1249d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    else
12502dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi        ALOGE("%s: Could not configure LPTD feature", __func__);
1251d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    return;
1252d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen}
1253d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen
1254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1256525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doCreateLlcpServiceSocket
1258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1259525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Create a new LLCP server socket.
1260525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1261525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1262525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  nSap: Service access point.
1263525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  sn: Service name
1264525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  miu: Maximum information unit.
1265525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  rw: Receive window size.
1266525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  linearBufferLength: Max buffer size.
1267525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1268525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         NativeLlcpServiceSocket Java object.
1269525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1270525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
12712534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jobject nfcManager_doCreateLlcpServiceSocket (JNIEnv* e, jobject, jint nSap, jstring sn, jint miu, jint rw, jint linearBufferLength)
1272525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1273525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PeerToPeer::tJNI_HANDLE jniHandle = PeerToPeer::getInstance().getNewJniHandle ();
1274525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
12752534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedUtfChars serviceName(e, sn);
12762534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes
12775f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: enter: sap=%i; name=%s; miu=%i; rw=%i; buffLen=%i", __func__, nSap, serviceName.c_str(), miu, rw, linearBufferLength);
1278525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1279525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Create new NativeLlcpServiceSocket object */
12802534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jobject serviceSocket = NULL;
1281b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    if (nfc_jni_cache_object_local(e, gNativeLlcpServiceSocketClassName, &(serviceSocket)) == -1)
1282525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
12835f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGE("%s: Llcp socket object creation error", __func__);
1284525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return NULL;
1285525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1286525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1287525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Get NativeLlcpServiceSocket class object */
12882534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jclass> clsNativeLlcpServiceSocket(e, e->GetObjectClass(serviceSocket));
1289525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (e->ExceptionCheck())
1290525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1291525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        e->ExceptionClear();
12922dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi        ALOGE("%s: Llcp Socket get object class error", __func__);
1293525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return NULL;
1294525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1295525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
12962534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    if (!PeerToPeer::getInstance().registerServer (jniHandle, serviceName.c_str()))
1297525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
12982dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi        ALOGE("%s: RegisterServer error", __func__);
1299525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return NULL;
1300525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1301525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
13022534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jfieldID f;
13032534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes
1304525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket handle to be the same as the NfaHandle*/
13052534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mHandle", "I");
13062534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetIntField(serviceSocket, f, (jint) jniHandle);
13075f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: socket Handle = 0x%X", __func__, jniHandle);
1308525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1309525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket linear buffer length */
13102534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mLocalLinearBufferLength", "I");
13112534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetIntField(serviceSocket, f,(jint)linearBufferLength);
13125f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: buffer length = %d", __func__, linearBufferLength);
1313525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1314525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket MIU */
13152534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mLocalMiu", "I");
13162534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetIntField(serviceSocket, f,(jint)miu);
13175f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: MIU = %d", __func__, miu);
1318525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1319525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket RW */
13202534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mLocalRw", "I");
13212534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetIntField(serviceSocket, f,(jint)rw);
13225f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s:  RW = %d", __func__, rw);
1323525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1324525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sLastError = 0;
13255f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: exit", __func__);
1326525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return serviceSocket;
1327525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1328525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1329525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1330525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1331525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1332525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doGetLastError
1333525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1334525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Get the last error code.
1335525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1336525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1337525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1338525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Last error code.
1339525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1340525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
13412534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jint nfcManager_doGetLastError(JNIEnv*, jobject)
1342525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
13435f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: last error=%i", __func__, sLastError);
1344525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return sLastError;
1345525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1346525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1347525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1348525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1349525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1350525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doDeinitialize
1351525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1352525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Turn off NFC.
1353525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1354525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1355525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1356525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if ok.
1357525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1358525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
13592534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nfcManager_doDeinitialize (JNIEnv*, jobject)
1360525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
13615f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: enter", __func__);
1362525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1363525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sIsDisabling = true;
13648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
1365525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    pn544InteropAbortNow ();
1366f3e09e66825850178879e76ccc7708509dbbc5b6Martijn Coenen    RoutingManager::getInstance().onNfccShutdown();
1367a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    PowerSwitch::getInstance ().initialize (PowerSwitch::UNKNOWN_LEVEL);
1368525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1369525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sIsNfaEnabled)
1370525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1371525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard guard (sNfaDisableEvent);
13728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        EXTNS_Close ();
1373525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        tNFA_STATUS stat = NFA_Disable (TRUE /* graceful */);
1374525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (stat == NFA_STATUS_OK)
1375525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
13765f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato            ALOGV("%s: wait for completion", __func__);
1377525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaDisableEvent.wait (); //wait for NFA command to finish
1378525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            PeerToPeer::getInstance ().handleNfcOnOff (false);
1379525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1380525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else
1381525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
13825f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato            ALOGE("%s: fail disable; error=0x%X", __func__, stat);
1383525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1384525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1385525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    nativeNfcTag_abortWaits();
1386525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    NfcTag::getInstance().abort ();
1387525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sAbortConnlessWait = true;
1388525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    nativeLlcpConnectionlessSocket_abortWait();
1389525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sIsNfaEnabled = false;
1390525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sDiscoveryEnabled = false;
13910799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    sPollingEnabled = false;
1392525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sIsDisabling = false;
13932decd22cff017ed79d378356002aff83830f4919Jizhou Liao    sP2pEnabled = false;
13948d154680537afa5242edeb98c8f414d6186558cfMartijn Coenen    gActivated = false;
1395ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito    sLfT3tMax = 0;
1396525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1397525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1398525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //unblock NFA_EnablePolling() and NFA_DisablePolling()
1399525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard guard (sNfaEnableDisablePollingEvent);
1400525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sNfaEnableDisablePollingEvent.notifyOne ();
1401525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1402525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1403525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    NfcAdaptation& theInstance = NfcAdaptation::GetInstance();
1404525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    theInstance.Finalize();
1405525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
14065f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: exit", __func__);
1407525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return JNI_TRUE;
1408525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1409525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1410525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1411525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1412525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1413525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doCreateLlcpSocket
1414525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1415525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Create a LLCP connection-oriented socket.
1416525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1417525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1418525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  nSap: Service access point.
1419525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  miu: Maximum information unit.
1420525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  rw: Receive window size.
1421525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  linearBufferLength: Max buffer size.
1422525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1423525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         NativeLlcpSocket Java object.
1424525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1425525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
14262534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jobject nfcManager_doCreateLlcpSocket (JNIEnv* e, jobject, jint nSap, jint miu, jint rw, jint linearBufferLength)
1427525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
14285f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: enter; sap=%d; miu=%d; rw=%d; buffer len=%d", __func__, nSap, miu, rw, linearBufferLength);
1429525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
14302534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    PeerToPeer::tJNI_HANDLE jniHandle = PeerToPeer::getInstance().getNewJniHandle ();
1431a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    PeerToPeer::getInstance().createClient (jniHandle, miu, rw);
1432525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1433525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Create new NativeLlcpSocket object */
14342534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jobject clientSocket = NULL;
1435525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (nfc_jni_cache_object_local(e, gNativeLlcpSocketClassName, &(clientSocket)) == -1)
1436525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
14375f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGE("%s: fail Llcp socket creation", __func__);
14382534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        return clientSocket;
1439525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1440525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1441525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Get NativeConnectionless class object */
14422534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jclass> clsNativeLlcpSocket(e, e->GetObjectClass(clientSocket));
1443525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (e->ExceptionCheck())
1444525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1445525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        e->ExceptionClear();
14465f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGE("%s: fail get class object", __func__);
14472534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        return clientSocket;
1448525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1449525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
14502534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jfieldID f;
14512534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes
1452525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket SAP */
14532534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID (clsNativeLlcpSocket.get(), "mSap", "I");
1454525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    e->SetIntField (clientSocket, f, (jint) nSap);
1455525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1456525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket handle */
14572534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID (clsNativeLlcpSocket.get(), "mHandle", "I");
1458525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    e->SetIntField (clientSocket, f, (jint) jniHandle);
1459525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1460525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket MIU */
14612534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID (clsNativeLlcpSocket.get(), "mLocalMiu", "I");
1462525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    e->SetIntField (clientSocket, f, (jint) miu);
1463525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1464525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket RW */
14652534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID (clsNativeLlcpSocket.get(), "mLocalRw", "I");
1466525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    e->SetIntField (clientSocket, f, (jint) rw);
1467525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
14685f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: exit", __func__);
1469525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return clientSocket;
1470525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1471525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1472525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1473525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1474525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1475525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doCreateLlcpConnectionlessSocket
1476525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1477525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Create a connection-less socket.
1478525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1479525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1480525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  nSap: Service access point.
1481525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  sn: Service name.
1482525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1483525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         NativeLlcpConnectionlessSocket Java object.
1484525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1485525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
14862534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jobject nfcManager_doCreateLlcpConnectionlessSocket (JNIEnv *, jobject, jint nSap, jstring /*sn*/)
1487525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
14885f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: nSap=0x%X", __func__, nSap);
1489525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return NULL;
1490525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1491525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1492525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1493525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1494525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        isPeerToPeer
1495525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1496525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Whether the activation data indicates the peer supports NFC-DEP.
1497525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  activated: Activation data.
1498525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1499525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if the peer supports NFC-DEP.
1500525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1501525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1502525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool isPeerToPeer (tNFA_ACTIVATED& activated)
1503525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1504525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return activated.activate_ntf.protocol == NFA_PROTOCOL_NFC_DEP;
1505525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1506525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1507525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1508525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1509525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        isListenMode
1510525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1511525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Indicates whether the activation data indicates it is
1512525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  listen mode.
1513525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1514525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if this listen mode.
1515525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1516525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1517525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool isListenMode(tNFA_ACTIVATED& activated)
1518525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1519525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return ((NFC_DISCOVERY_TYPE_LISTEN_A == activated.activate_ntf.rf_tech_param.mode)
1520525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            || (NFC_DISCOVERY_TYPE_LISTEN_B == activated.activate_ntf.rf_tech_param.mode)
1521525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            || (NFC_DISCOVERY_TYPE_LISTEN_F == activated.activate_ntf.rf_tech_param.mode)
1522525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            || (NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE == activated.activate_ntf.rf_tech_param.mode)
1523525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            || (NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE == activated.activate_ntf.rf_tech_param.mode)
1524525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            || (NFC_DISCOVERY_TYPE_LISTEN_ISO15693 == activated.activate_ntf.rf_tech_param.mode)
1525525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            || (NFC_DISCOVERY_TYPE_LISTEN_B_PRIME == activated.activate_ntf.rf_tech_param.mode));
1526525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1527525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1528525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1529525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1530525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doCheckLlcp
1531525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1532525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Not used.
1533525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1534525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True
1535525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1536525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
15372534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nfcManager_doCheckLlcp(JNIEnv*, jobject)
1538525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
15395f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s", __func__);
1540525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return JNI_TRUE;
1541525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1542525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1543525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1544525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1545525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1546525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doActivateLlcp
1547525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1548525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Not used.
1549525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1550525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True
1551525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1552525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
15532534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nfcManager_doActivateLlcp(JNIEnv*, jobject)
1554525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
15555f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s", __func__);
1556525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return JNI_TRUE;
1557525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1558525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1559525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1560525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1561525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1562525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doAbort
1563525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1564525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Not used.
1565525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1566525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1567525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1568525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1569729dc345dae23c1990cf5377a3948584cff2171aAndre Eisenbachstatic void nfcManager_doAbort(JNIEnv* e, jobject, jstring msg)
1570525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1571729dc345dae23c1990cf5377a3948584cff2171aAndre Eisenbach    ScopedUtfChars message = {e, msg};
1572729dc345dae23c1990cf5377a3948584cff2171aAndre Eisenbach    e->FatalError(message.c_str());
1573729dc345dae23c1990cf5377a3948584cff2171aAndre Eisenbach    abort(); // <-- Unreachable
1574525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1575525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1576525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1577525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1578525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1579525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doDownload
1580525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1581a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Description:     Download firmware patch files.  Do not turn on NFC.
1582525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1583a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Returns:         True if ok.
1584525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1585525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
15862534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nfcManager_doDownload(JNIEnv*, jobject)
1587525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
15885f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: enter", __func__);
1589a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    NfcAdaptation& theInstance = NfcAdaptation::GetInstance();
1590a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
1591a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    theInstance.Initialize(); //start GKI, NCI task, NFC task
1592a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    theInstance.DownloadFirmware ();
1593a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    theInstance.Finalize();
15945f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: exit", __func__);
1595525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return JNI_TRUE;
1596525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1597525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1598525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1599525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1600525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1601525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doResetTimeouts
1602525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1603525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Not used.
1604525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1605525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1606525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1607525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
16082534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic void nfcManager_doResetTimeouts(JNIEnv*, jobject)
1609525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
16105f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s", __func__);
1611a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    NfcTag::getInstance().resetAllTransceiveTimeouts ();
1612525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1613525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1614525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1615525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1616525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1617525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doSetTimeout
1618525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1619525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Set timeout value.
1620525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1621525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1622a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**                  tech: technology ID.
1623525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  timeout: Timeout value.
1624525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1625525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if ok.
1626525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1627525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1628a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chustatic bool nfcManager_doSetTimeout(JNIEnv*, jobject, jint tech, jint timeout)
1629525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1630525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (timeout <= 0)
1631525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
16322dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi        ALOGE("%s: Timeout must be positive.",__func__);
1633525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return false;
1634525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
16355f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: tech=%d, timeout=%d", __func__, tech, timeout);
1636a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    NfcTag::getInstance().setTransceiveTimeout (tech, timeout);
1637525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return true;
1638525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1639525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1640525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1641525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1642525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1643525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doGetTimeout
1644525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1645525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Get timeout value.
1646525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1647525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1648a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**                  tech: technology ID.
1649525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1650525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Timeout value.
1651525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1652525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1653a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chustatic jint nfcManager_doGetTimeout(JNIEnv*, jobject, jint tech)
1654525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1655a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    int timeout = NfcTag::getInstance().getTransceiveTimeout (tech);
16565f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: tech=%d, timeout=%d", __func__, tech, timeout);
1657a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    return timeout;
1658525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1659525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1660525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1661525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1662525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1663525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doDump
1664525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1665fdcfcb0031a4fbf38dd828ac1b3ef8319342e2faRuchi Kandoi** Description:     Get libnfc-nci dump
1666525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1667fdcfcb0031a4fbf38dd828ac1b3ef8319342e2faRuchi Kandoi**                  obj: Java object.
1668fdcfcb0031a4fbf38dd828ac1b3ef8319342e2faRuchi Kandoi**                  fdobj: File descriptor to be used
1669525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1670fdcfcb0031a4fbf38dd828ac1b3ef8319342e2faRuchi Kandoi** Returns:         Void
1671525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1672525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1673fdcfcb0031a4fbf38dd828ac1b3ef8319342e2faRuchi Kandoistatic void nfcManager_doDump(JNIEnv* e, jobject obj, jobject fdobj)
1674525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1675fdcfcb0031a4fbf38dd828ac1b3ef8319342e2faRuchi Kandoi    int fd = jniGetFDFromFileDescriptor(e, fdobj);
1676fdcfcb0031a4fbf38dd828ac1b3ef8319342e2faRuchi Kandoi    if (fd < 0)
1677fdcfcb0031a4fbf38dd828ac1b3ef8319342e2faRuchi Kandoi        return;
1678fdcfcb0031a4fbf38dd828ac1b3ef8319342e2faRuchi Kandoi
1679fdcfcb0031a4fbf38dd828ac1b3ef8319342e2faRuchi Kandoi    NfcAdaptation& theInstance = NfcAdaptation::GetInstance();
1680fdcfcb0031a4fbf38dd828ac1b3ef8319342e2faRuchi Kandoi    theInstance.Dump(fd);
1681525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1682525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
16833a894dda035a331860f0f23e93528527493a07a3Love Khannastatic jint nfcManager_doGetNciVersion(JNIEnv* , jobject)
16843a894dda035a331860f0f23e93528527493a07a3Love Khanna{
16853a894dda035a331860f0f23e93528527493a07a3Love Khanna    return NFC_GetNCIVersion();
16863a894dda035a331860f0f23e93528527493a07a3Love Khanna}
16873a894dda035a331860f0f23e93528527493a07a3Love Khanna
16883a894dda035a331860f0f23e93528527493a07a3Love Khannastatic void nfcManager_doSetScreenState (JNIEnv* e, jobject o, jint screen_state_mask)
16893a894dda035a331860f0f23e93528527493a07a3Love Khanna{
16903a894dda035a331860f0f23e93528527493a07a3Love Khanna    tNFA_STATUS status = NFA_STATUS_OK;
16913a894dda035a331860f0f23e93528527493a07a3Love Khanna    uint8_t state = (screen_state_mask & NFA_SCREEN_STATE_MASK);
16923a894dda035a331860f0f23e93528527493a07a3Love Khanna    uint8_t discovry_param = NFA_LISTEN_DH_NFCEE_ENABLE_MASK | NFA_POLLING_DH_ENABLE_MASK;
16933a894dda035a331860f0f23e93528527493a07a3Love Khanna
16943a894dda035a331860f0f23e93528527493a07a3Love Khanna    ALOGD ("%s: state = %d discovry_param = %d", __FUNCTION__, state, discovry_param);
16953a894dda035a331860f0f23e93528527493a07a3Love Khanna
16963a894dda035a331860f0f23e93528527493a07a3Love Khanna    if (sIsDisabling || !sIsNfaEnabled ||(NFC_GetNCIVersion() != NCI_VERSION_2_0))
16973a894dda035a331860f0f23e93528527493a07a3Love Khanna        return;
16981227736a352797f6bebe7f4e098dab6a15f3164cLove Khanna    if (prevScreenState == NFA_SCREEN_STATE_OFF_LOCKED || prevScreenState == NFA_SCREEN_STATE_OFF_UNLOCKED ||
16991227736a352797f6bebe7f4e098dab6a15f3164cLove Khanna            prevScreenState == NFA_SCREEN_STATE_ON_LOCKED)
17003a894dda035a331860f0f23e93528527493a07a3Love Khanna    {
17013a894dda035a331860f0f23e93528527493a07a3Love Khanna        SyncEventGuard guard (sNfaSetPowerSubState);
17023a894dda035a331860f0f23e93528527493a07a3Love Khanna        status = NFA_SetPowerSubStateForScreenState(state);
17033a894dda035a331860f0f23e93528527493a07a3Love Khanna        if (status != NFA_STATUS_OK)
17043a894dda035a331860f0f23e93528527493a07a3Love Khanna        {
17053a894dda035a331860f0f23e93528527493a07a3Love Khanna            ALOGE ("%s: fail enable SetScreenState; error=0x%X", __FUNCTION__, status);
17063a894dda035a331860f0f23e93528527493a07a3Love Khanna            return;
17073a894dda035a331860f0f23e93528527493a07a3Love Khanna        }
17083a894dda035a331860f0f23e93528527493a07a3Love Khanna        else
17093a894dda035a331860f0f23e93528527493a07a3Love Khanna        {
17103a894dda035a331860f0f23e93528527493a07a3Love Khanna            sNfaSetPowerSubState.wait();
17113a894dda035a331860f0f23e93528527493a07a3Love Khanna        }
17123a894dda035a331860f0f23e93528527493a07a3Love Khanna    }
1713525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
17143a894dda035a331860f0f23e93528527493a07a3Love Khanna   if (state == NFA_SCREEN_STATE_OFF_LOCKED || state == NFA_SCREEN_STATE_OFF_UNLOCKED)
17153a894dda035a331860f0f23e93528527493a07a3Love Khanna   {
17163a894dda035a331860f0f23e93528527493a07a3Love Khanna       // disable both poll and listen on DH 0x02
17173a894dda035a331860f0f23e93528527493a07a3Love Khanna       discovry_param = NFA_POLLING_DH_DISABLE_MASK | NFA_LISTEN_DH_NFCEE_DISABLE_MASK;
17183a894dda035a331860f0f23e93528527493a07a3Love Khanna   }
17193a894dda035a331860f0f23e93528527493a07a3Love Khanna
17203a894dda035a331860f0f23e93528527493a07a3Love Khanna   if (state == NFA_SCREEN_STATE_ON_LOCKED)
17213a894dda035a331860f0f23e93528527493a07a3Love Khanna   {
17223a894dda035a331860f0f23e93528527493a07a3Love Khanna       // disable poll and enable listen on DH 0x00
17233a894dda035a331860f0f23e93528527493a07a3Love Khanna       discovry_param = (screen_state_mask & NFA_SCREEN_POLLING_TAG_MASK) ?
17243a894dda035a331860f0f23e93528527493a07a3Love Khanna           (NFA_LISTEN_DH_NFCEE_ENABLE_MASK | NFA_POLLING_DH_ENABLE_MASK):
17253a894dda035a331860f0f23e93528527493a07a3Love Khanna           (NFA_POLLING_DH_DISABLE_MASK | NFA_LISTEN_DH_NFCEE_ENABLE_MASK);
17263a894dda035a331860f0f23e93528527493a07a3Love Khanna   }
17273a894dda035a331860f0f23e93528527493a07a3Love Khanna
17283a894dda035a331860f0f23e93528527493a07a3Love Khanna   if (state == NFA_SCREEN_STATE_ON_UNLOCKED)
17293a894dda035a331860f0f23e93528527493a07a3Love Khanna   {
17303a894dda035a331860f0f23e93528527493a07a3Love Khanna      // enable both poll and listen on DH 0x01
17313a894dda035a331860f0f23e93528527493a07a3Love Khanna      discovry_param = NFA_LISTEN_DH_NFCEE_ENABLE_MASK | NFA_POLLING_DH_ENABLE_MASK;
17323a894dda035a331860f0f23e93528527493a07a3Love Khanna   }
17333a894dda035a331860f0f23e93528527493a07a3Love Khanna
17343a894dda035a331860f0f23e93528527493a07a3Love Khanna   SyncEventGuard guard (sNfaSetConfigEvent);
17353a894dda035a331860f0f23e93528527493a07a3Love Khanna   status = NFA_SetConfig(NFC_PMID_CON_DISCOVERY_PARAM, NCI_PARAM_LEN_CON_DISCOVERY_PARAM, &discovry_param);
17363a894dda035a331860f0f23e93528527493a07a3Love Khanna   if (status == NFA_STATUS_OK)
17373a894dda035a331860f0f23e93528527493a07a3Love Khanna   {
17383a894dda035a331860f0f23e93528527493a07a3Love Khanna       sNfaSetConfigEvent.wait ();
17393a894dda035a331860f0f23e93528527493a07a3Love Khanna   } else {
17403a894dda035a331860f0f23e93528527493a07a3Love Khanna       ALOGE ("%s: Failed to update CON_DISCOVER_PARAM", __FUNCTION__);
17413a894dda035a331860f0f23e93528527493a07a3Love Khanna       return;
17423a894dda035a331860f0f23e93528527493a07a3Love Khanna   }
17433a894dda035a331860f0f23e93528527493a07a3Love Khanna
17441227736a352797f6bebe7f4e098dab6a15f3164cLove Khanna   if (prevScreenState == NFA_SCREEN_STATE_ON_UNLOCKED)
17453a894dda035a331860f0f23e93528527493a07a3Love Khanna   {
17463a894dda035a331860f0f23e93528527493a07a3Love Khanna       SyncEventGuard guard (sNfaSetPowerSubState);
17473a894dda035a331860f0f23e93528527493a07a3Love Khanna       status = NFA_SetPowerSubStateForScreenState(state);
17483a894dda035a331860f0f23e93528527493a07a3Love Khanna       if (status != NFA_STATUS_OK)
17493a894dda035a331860f0f23e93528527493a07a3Love Khanna       {
17503a894dda035a331860f0f23e93528527493a07a3Love Khanna           ALOGE ("%s: fail enable SetScreenState; error=0x%X", __FUNCTION__, status);
17513a894dda035a331860f0f23e93528527493a07a3Love Khanna       } else {
17523a894dda035a331860f0f23e93528527493a07a3Love Khanna           sNfaSetPowerSubState.wait();
17533a894dda035a331860f0f23e93528527493a07a3Love Khanna       }
17543a894dda035a331860f0f23e93528527493a07a3Love Khanna   }
17553a894dda035a331860f0f23e93528527493a07a3Love Khanna   prevScreenState = state;
17563a894dda035a331860f0f23e93528527493a07a3Love Khanna}
1757525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1758525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1759525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doSetP2pInitiatorModes
1760525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1761525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Set P2P initiator's activation modes.
1762525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1763525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1764525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  modes: Active and/or passive modes.  The values are specified
1765525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                          in external/libnfc-nxp/inc/phNfcTypes.h.  See
1766525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                          enum phNfc_eP2PMode_t.
1767525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1768525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None.
1769525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1770525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1771525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void nfcManager_doSetP2pInitiatorModes (JNIEnv *e, jobject o, jint modes)
1772525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
17735f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: modes=0x%X", __func__, modes);
1774525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    struct nfc_jni_native_data *nat = getNative(e, o);
1775525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1776525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_TECHNOLOGY_MASK mask = 0;
1777525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x01) mask |= NFA_TECHNOLOGY_MASK_A;
1778525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x02) mask |= NFA_TECHNOLOGY_MASK_F;
1779525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x04) mask |= NFA_TECHNOLOGY_MASK_F;
1780525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x08) mask |= NFA_TECHNOLOGY_MASK_A_ACTIVE;
1781525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x10) mask |= NFA_TECHNOLOGY_MASK_F_ACTIVE;
1782525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x20) mask |= NFA_TECHNOLOGY_MASK_F_ACTIVE;
1783525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    nat->tech_mask = mask;
1784525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1785525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1786525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1787525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1788525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1789525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doSetP2pTargetModes
1790525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1791525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Set P2P target's activation modes.
1792525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1793525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1794525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  modes: Active and/or passive modes.
1795525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1796525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None.
1797525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1798525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
17992534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic void nfcManager_doSetP2pTargetModes (JNIEnv*, jobject, jint modes)
1800525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
18015f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: modes=0x%X", __func__, modes);
1802525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // Map in the right modes
1803525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_TECHNOLOGY_MASK mask = 0;
1804525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x01) mask |= NFA_TECHNOLOGY_MASK_A;
1805525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x02) mask |= NFA_TECHNOLOGY_MASK_F;
1806525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x04) mask |= NFA_TECHNOLOGY_MASK_F;
1807525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x08) mask |= NFA_TECHNOLOGY_MASK_A_ACTIVE | NFA_TECHNOLOGY_MASK_F_ACTIVE;
1808525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1809525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PeerToPeer::getInstance().setP2pListenMask(mask);
1810525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1811525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1812d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Moralesstatic void nfcManager_doEnableScreenOffSuspend(JNIEnv* e, jobject o)
1813d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales{
1814d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    PowerSwitch::getInstance().setScreenOffPowerState(PowerSwitch::POWER_STATE_FULL);
1815d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales}
1816d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales
1817d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Moralesstatic void nfcManager_doDisableScreenOffSuspend(JNIEnv* e, jobject o)
1818d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales{
1819d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    PowerSwitch::getInstance().setScreenOffPowerState(PowerSwitch::POWER_STATE_OFF);
1820d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales}
1821c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen
1822525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*****************************************************************************
1823525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1824525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** JNI functions for android-4.0.1_r1
1825525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1826525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/
1827525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic JNINativeMethod gMethods[] =
1828525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1829525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doDownload", "()Z",
1830525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doDownload},
1831525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1832525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"initializeNativeStructure", "()Z",
1833525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_initNativeStruc},
1834525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1835304a6342ee7e5620d3b50d988755c035f1686dc2Martijn Coenen    {"doInitialize", "()Z",
1836525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_doInitialize},
1837525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1838525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doDeinitialize", "()Z",
1839525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_doDeinitialize},
1840525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
18419f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    {"sendRawFrame", "([B)Z",
18429f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen            (void*) nfcManager_sendRawFrame},
18439f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
18448ee2015a9c4639d465a390af93df3fdcd983cac8Love Khanna    {"routeAid", "([BII)Z",
18459f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen            (void*) nfcManager_routeAid},
18469f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
18479f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    {"unrouteAid", "([B)Z",
18489f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen            (void*) nfcManager_unrouteAid},
18499f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
1850f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen    {"commitRouting", "()Z",
1851f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen            (void*) nfcManager_commitRouting},
1852f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen
1853ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito    {"doRegisterT3tIdentifier", "([B)I",
1854ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito            (void*) nfcManager_doRegisterT3tIdentifier},
1855ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito
1856ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito    {"doDeregisterT3tIdentifier", "(I)V",
1857ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito            (void*) nfcManager_doDeregisterT3tIdentifier},
1858ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito
1859ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito    {"getLfT3tMax", "()I",
1860ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito            (void*) nfcManager_getLfT3tMax},
1861ecb8d7bbd1a44cd3edbcb6c5d903fc8d9a625d70Yoshinobu Ito
186231b0f4653686119d74876cae5d637c5baf52b935Andres Morales    {"doEnableDiscovery", "(IZZZZZ)V",
1863525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_enableDiscovery},
1864525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1865525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doCheckLlcp", "()Z",
1866525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doCheckLlcp},
1867525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1868525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doActivateLlcp", "()Z",
1869525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doActivateLlcp},
1870525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1871525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doCreateLlcpConnectionlessSocket", "(ILjava/lang/String;)Lcom/android/nfc/dhimpl/NativeLlcpConnectionlessSocket;",
1872525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doCreateLlcpConnectionlessSocket},
1873525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1874525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doCreateLlcpServiceSocket", "(ILjava/lang/String;III)Lcom/android/nfc/dhimpl/NativeLlcpServiceSocket;",
1875525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_doCreateLlcpServiceSocket},
1876525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1877525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doCreateLlcpSocket", "(IIII)Lcom/android/nfc/dhimpl/NativeLlcpSocket;",
1878525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_doCreateLlcpSocket},
1879525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1880525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doGetLastError", "()I",
1881525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_doGetLastError},
1882525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1883a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales    {"disableDiscovery", "()V",
1884525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_disableDiscovery},
1885525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1886525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doSetTimeout", "(II)Z",
1887525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doSetTimeout},
1888525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1889525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doGetTimeout", "(I)I",
1890525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doGetTimeout},
1891525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1892525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doResetTimeouts", "()V",
1893525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doResetTimeouts},
1894525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1895729dc345dae23c1990cf5377a3948584cff2171aAndre Eisenbach    {"doAbort", "(Ljava/lang/String;)V",
1896525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doAbort},
1897525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1898525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doSetP2pInitiatorModes", "(I)V",
1899525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doSetP2pInitiatorModes},
1900525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1901525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doSetP2pTargetModes", "(I)V",
1902525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doSetP2pTargetModes},
1903525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1904d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    {"doEnableScreenOffSuspend", "()V",
1905d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales            (void *)nfcManager_doEnableScreenOffSuspend},
1906d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales
19073a894dda035a331860f0f23e93528527493a07a3Love Khanna    {"doSetScreenState", "(I)V",
19083a894dda035a331860f0f23e93528527493a07a3Love Khanna            (void*)nfcManager_doSetScreenState},
19093a894dda035a331860f0f23e93528527493a07a3Love Khanna
1910d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    {"doDisableScreenOffSuspend", "()V",
1911d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales            (void *)nfcManager_doDisableScreenOffSuspend},
1912d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales
1913fdcfcb0031a4fbf38dd828ac1b3ef8319342e2faRuchi Kandoi    {"doDump", "(Ljava/io/FileDescriptor;)V",
1914525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doDump},
19153a894dda035a331860f0f23e93528527493a07a3Love Khanna
19163a894dda035a331860f0f23e93528527493a07a3Love Khanna    {"getNciVersion","()I",
19173a894dda035a331860f0f23e93528527493a07a3Love Khanna             (void *)nfcManager_doGetNciVersion},
1918f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi    {"doEnableDtaMode", "()V",
1919f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi            (void*) nfcManager_doEnableDtaMode},
1920f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi    {"doDisableDtaMode", "()V",
1921f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi            (void*) nfcManager_doDisableDtaMode}
1922f939e8a61d3904ab30ec59e2762f5c543ebaa672Ruchi Kandoi
1923525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project};
1924525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1925525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1926525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1927525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1928525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        register_com_android_nfc_NativeNfcManager
1929525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1930525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Regisgter JNI functions with Java Virtual Machine.
1931525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: Environment of JVM.
1932525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1933525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Status of registration.
1934525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1935525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1936525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectint register_com_android_nfc_NativeNfcManager (JNIEnv *e)
1937525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
19385f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: enter", __func__);
1939525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PowerSwitch::getInstance ().initialize (PowerSwitch::UNKNOWN_LEVEL);
19405f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: exit", __func__);
1941525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return jniRegisterNativeMethods (e, gNativeNfcManagerClassName, gMethods, NELEM (gMethods));
1942525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1943525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1944525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1945525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1946525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1947525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        startRfDiscovery
1948525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1949525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Ask stack to start polling and listening for devices.
1950525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  isStart: Whether to start.
1951525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1952525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1953525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1954525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1955525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid startRfDiscovery(bool isStart)
1956525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1957525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS status = NFA_STATUS_FAILED;
1958525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
19595f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: is start=%d", __func__, isStart);
196034d6116d82975f558378e2b16fdad04ac70d4130Jizhou Liao    nativeNfcTag_acquireRfInterfaceMutexLock();
1961525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    SyncEventGuard guard (sNfaEnableDisablePollingEvent);
1962525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    status  = isStart ? NFA_StartRfDiscovery () : NFA_StopRfDiscovery ();
1963525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (status == NFA_STATUS_OK)
1964525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1965525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sNfaEnableDisablePollingEvent.wait (); //wait for NFA_RF_DISCOVERY_xxxx_EVT
1966525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sRfEnabled = isStart;
1967525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1968525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else
1969525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
19705f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGE("%s: Failed to start/stop RF discovery; error=0x%X", __func__, status);
1971525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
197234d6116d82975f558378e2b16fdad04ac70d4130Jizhou Liao    nativeNfcTag_releaseRfInterfaceMutexLock();
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**
1978c5eec3c659d60a469259340608d7403c73fd6865Jizhou Liao** Function:        isDiscoveryStarted
1979c5eec3c659d60a469259340608d7403c73fd6865Jizhou Liao**
1980c5eec3c659d60a469259340608d7403c73fd6865Jizhou Liao** Description:     Indicates whether the discovery is started.
1981c5eec3c659d60a469259340608d7403c73fd6865Jizhou Liao**
1982c5eec3c659d60a469259340608d7403c73fd6865Jizhou Liao** Returns:         True if discovery is started
1983c5eec3c659d60a469259340608d7403c73fd6865Jizhou Liao**
1984c5eec3c659d60a469259340608d7403c73fd6865Jizhou Liao*******************************************************************************/
1985c5eec3c659d60a469259340608d7403c73fd6865Jizhou Liaobool isDiscoveryStarted ()
1986c5eec3c659d60a469259340608d7403c73fd6865Jizhou Liao{
1987c5eec3c659d60a469259340608d7403c73fd6865Jizhou Liao    return sRfEnabled;
1988c5eec3c659d60a469259340608d7403c73fd6865Jizhou Liao}
1989c5eec3c659d60a469259340608d7403c73fd6865Jizhou Liao
1990c5eec3c659d60a469259340608d7403c73fd6865Jizhou Liao
1991c5eec3c659d60a469259340608d7403c73fd6865Jizhou Liao/*******************************************************************************
1992c5eec3c659d60a469259340608d7403c73fd6865Jizhou Liao**
1993525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        doStartupConfig
1994525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1995525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Configure the NFC controller.
1996525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1997525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1998525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1999525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
2000525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid doStartupConfig()
2001525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
2002525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    struct nfc_jni_native_data *nat = getNative(0, 0);
2003525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS stat = NFA_STATUS_FAILED;
2004a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    int actualLen = 0;
2005525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
2006525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // If polling for Active mode, set the ordering so that we choose Active over Passive mode first.
2007525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (nat && (nat->tech_mask & (NFA_TECHNOLOGY_MASK_A_ACTIVE | NFA_TECHNOLOGY_MASK_F_ACTIVE)))
2008525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
20092dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi        uint8_t  act_mode_order_param[] = { 0x01 };
2010525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard guard (sNfaSetConfigEvent);
2011525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        stat = NFA_SetConfig(NCI_PARAM_ID_ACT_ORDER, sizeof(act_mode_order_param), &act_mode_order_param[0]);
2012525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (stat == NFA_STATUS_OK)
2013525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaSetConfigEvent.wait ();
2014525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
2015a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
2016a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    //configure RF polling frequency for each technology
2017a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    static tNFA_DM_DISC_FREQ_CFG nfa_dm_disc_freq_cfg;
2018a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    //values in the polling_frequency[] map to members of nfa_dm_disc_freq_cfg
20192dfff7620070cff76fb117aafcd06e57cceb59fbRuchi Kandoi    uint8_t polling_frequency [8] = {1, 1, 1, 1, 1, 1, 1, 1};
2020a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    actualLen = GetStrValue(NAME_POLL_FREQUENCY, (char*)polling_frequency, 8);
2021a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    if (actualLen == 8)
2022a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    {
20235f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: polling frequency", __func__);
2024a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        memset (&nfa_dm_disc_freq_cfg, 0, sizeof(nfa_dm_disc_freq_cfg));
2025a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        nfa_dm_disc_freq_cfg.pa = polling_frequency [0];
2026a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        nfa_dm_disc_freq_cfg.pb = polling_frequency [1];
2027a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        nfa_dm_disc_freq_cfg.pf = polling_frequency [2];
2028a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        nfa_dm_disc_freq_cfg.pi93 = polling_frequency [3];
2029a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        nfa_dm_disc_freq_cfg.pbp = polling_frequency [4];
2030a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        nfa_dm_disc_freq_cfg.pk = polling_frequency [5];
2031a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        nfa_dm_disc_freq_cfg.paa = polling_frequency [6];
2032a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        nfa_dm_disc_freq_cfg.pfa = polling_frequency [7];
2033a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        p_nfa_dm_rf_disc_freq_cfg = &nfa_dm_disc_freq_cfg;
2034a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    }
2035525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
2036525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
2037525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
2038525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
2039525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
2040525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_isNfcActive
2041525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
2042525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Used externaly to determine if NFC is active or not.
2043525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
2044525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         'true' if the NFC stack is running, else 'false'.
2045525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
2046525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
2047525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool nfcManager_isNfcActive()
2048525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
2049525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return sIsNfaEnabled;
2050525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
2051525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
2052525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
2053525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
2054525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        startStopPolling
2055525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
2056525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Start or stop polling.
2057525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  isStartPolling: true to start polling; false to stop polling.
2058525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
2059525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None.
2060525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
2061525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
2062525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid startStopPolling (bool isStartPolling)
2063525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
20645f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: enter; isStart=%u", __func__, isStartPolling);
20650799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    startRfDiscovery (false);
20660799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
20670799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    if (isStartPolling) startPolling_rfDiscoveryDisabled(0);
20680799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    else stopPolling_rfDiscoveryDisabled();
20690799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
20700799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    startRfDiscovery (true);
20715f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: exit", __func__);
20720799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales}
20730799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
20740799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
20750799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Moralesstatic tNFA_STATUS startPolling_rfDiscoveryDisabled(tNFA_TECHNOLOGY_MASK tech_mask) {
2076525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS stat = NFA_STATUS_FAILED;
2077525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
20780799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    unsigned long num = 0;
2079a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales
20800799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    if (tech_mask == 0 && GetNumValue(NAME_POLLING_TECH_MASK, &num, sizeof(num)))
20810799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        tech_mask = num;
20820799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    else if (tech_mask == 0) tech_mask = DEFAULT_TECH_MASK;
20830799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
208434d6116d82975f558378e2b16fdad04ac70d4130Jizhou Liao    nativeNfcTag_acquireRfInterfaceMutexLock();
20850799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    SyncEventGuard guard (sNfaEnableDisablePollingEvent);
20865f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: enable polling", __func__);
20870799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    stat = NFA_EnablePolling (tech_mask);
20880799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    if (stat == NFA_STATUS_OK)
20890799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    {
20905f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGV("%s: wait for enable event", __func__);
20910799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        sPollingEnabled = true;
20920799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_ENABLED_EVT
2093525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
2094525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else
2095525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
20965f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGE("%s: fail enable polling; error=0x%X", __func__, stat);
2097525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
209834d6116d82975f558378e2b16fdad04ac70d4130Jizhou Liao    nativeNfcTag_releaseRfInterfaceMutexLock();
20990799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
21000799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    return stat;
21010799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales}
21020799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
21030799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Moralesstatic tNFA_STATUS stopPolling_rfDiscoveryDisabled() {
21040799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    tNFA_STATUS stat = NFA_STATUS_FAILED;
21050799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
210634d6116d82975f558378e2b16fdad04ac70d4130Jizhou Liao    nativeNfcTag_acquireRfInterfaceMutexLock();
21070799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    SyncEventGuard guard (sNfaEnableDisablePollingEvent);
21085f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato    ALOGV("%s: disable polling", __func__);
21090799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    stat = NFA_DisablePolling ();
21100799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    if (stat == NFA_STATUS_OK) {
21110799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        sPollingEnabled = false;
21120799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_DISABLED_EVT
21130799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    } else {
21145f28e5ee8f39bd58e182f911ebb50960b2a77830Joe Onorato        ALOGE("%s: fail disable polling; error=0x%X", __func__, stat);
21150799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    }
211634d6116d82975f558378e2b16fdad04ac70d4130Jizhou Liao    nativeNfcTag_releaseRfInterfaceMutexLock();
21170799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
21180799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    return stat;
2119525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
2120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
2121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
2122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} /* namespace android */
2123