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