NativeNfcManager.cpp revision 97a71fe90493efd5947bb6f18c7b58a7e795c1dd
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"
25525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "NfcTag.h"
26525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "config.h"
27525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "PowerSwitch.h"
28525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "JavaClassConstants.h"
29525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "Pn544Interop.h"
302534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes#include <ScopedLocalRef.h>
312534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes#include <ScopedUtfChars.h>
32525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
33525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectextern "C"
34525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
35525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "nfa_api.h"
36525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "nfa_p2p_api.h"
37525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "rw_api.h"
38525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "nfa_ee_api.h"
39525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "nfc_brcm_defs.h"
40525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "nfa_cho_api.h"
41525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "ce_api.h"
42525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
43525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
44525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectextern UINT8 *p_nfa_dm_lptd_cfg;
45525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectextern UINT8 *p_nfa_dm_start_up_cfg;
46525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectextern const UINT8 nfca_version_string [];
47525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android
48525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
49525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern bool gIsTagDeactivating;
50525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern bool gIsSelectingRfInterface;
51525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doTransceiveStatus (uint8_t * buf, uint32_t buflen);
52525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doConnectStatus (jboolean is_connect_ok);
53525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doDeactivateStatus (int status);
54525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doWriteStatus (jboolean is_write_ok);
55525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doCheckNdefResult (tNFA_STATUS status, uint32_t max_size, uint32_t current_size, uint8_t flags);
56525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doMakeReadonlyResult (tNFA_STATUS status);
57525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doPresenceCheckResult (tNFA_STATUS status);
58525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_formatStatus (bool is_ok);
59525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_resetPresenceCheck ();
60525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doReadCompleted (tNFA_STATUS status);
61525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_abortWaits ();
62525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeLlcpConnectionlessSocket_abortWait ();
63525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_registerNdefTypeHandler ();
64525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeLlcpConnectionlessSocket_receiveData (uint8_t* data, uint32_t len, uint32_t remote_sap);
65525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
66525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
67525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
68525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*****************************************************************************
69525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
70525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** public variables and functions
71525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
72525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/
73525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
74525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android
75525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
76525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    int                     gGeneralTransceiveTimeout = 1000;
77525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jmethodID               gCachedNfcManagerNotifyNdefMessageListeners;
78525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jmethodID               gCachedNfcManagerNotifyTransactionListeners;
79525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jmethodID               gCachedNfcManagerNotifyLlcpLinkActivation;
80525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jmethodID               gCachedNfcManagerNotifyLlcpLinkDeactivated;
81525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jmethodID               gCachedNfcManagerNotifySeFieldActivated;
82525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jmethodID               gCachedNfcManagerNotifySeFieldDeactivated;
83525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jmethodID               gCachedNfcManagerNotifySeListenActivated;
84525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jmethodID               gCachedNfcManagerNotifySeListenDeactivated;
85525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeP2pDeviceClassName                 = "com/android/nfc/dhimpl/NativeP2pDevice";
86525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeLlcpServiceSocketClassName         = "com/android/nfc/dhimpl/NativeLlcpServiceSocket";
87525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeLlcpConnectionlessSocketClassName  = "com/android/nfc/dhimpl/NativeLlcpConnectionlessSocket";
88525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeLlcpSocketClassName                = "com/android/nfc/dhimpl/NativeLlcpSocket";
89525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeNfcTagClassName                    = "com/android/nfc/dhimpl/NativeNfcTag";
90525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeNfcManagerClassName                = "com/android/nfc/dhimpl/NativeNfcManager";
91525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeNfcSecureElementClassName          = "com/android/nfc/dhimpl/NativeNfcSecureElement";
92525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    void                    doStartupConfig ();
93525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    void                    startStopPolling (bool isStartPolling);
94525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    void                    startRfDiscovery (bool isStart);
95525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
96525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
97525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
98525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*****************************************************************************
99525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
100525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** private variables and functions
101525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
102525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/
103525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android
104525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
105525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jint                 sLastError = ERROR_BUFFER_TOO_SMALL;
106525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jmethodID            sCachedNfcManagerNotifySeApduReceived;
107525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jmethodID            sCachedNfcManagerNotifySeMifareAccess;
108525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jmethodID            sCachedNfcManagerNotifySeEmvCardRemoval;
109525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jmethodID            sCachedNfcManagerNotifyTargetDeselected;
110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent            sNfaEnableEvent;  //event for NFA_Enable()
111525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent            sNfaDisableEvent;  //event for NFA_Disable()
112525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent            sNfaEnableDisablePollingEvent;  //event for NFA_EnablePolling(), NFA_DisablePolling()
113525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent            sNfaSetConfigEvent;  // event for Set_Config....
114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sIsNfaEnabled = false;
115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sDiscoveryEnabled = false;  //is polling for tag?
116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sIsDisabling = false;
117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sRfEnabled = false; // whether RF discovery is enabled
118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sSeRfActive = false;  // whether RF with SE is likely active
119525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sP2pActive = false; // whether p2p was last active
120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sAbortConnlessWait = false;
121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sIsSecElemSelected = false;  //has NFC service selected a sec elem
122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic UINT8 *              sOriginalLptdCfg = NULL;
123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define CONFIG_UPDATE_LPTD          (1 << 0)
124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define CONFIG_UPDATE_TECH_MASK     (1 << 1)
125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define DEFAULT_TECH_MASK           (NFA_TECHNOLOGY_MASK_A \
126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                                     | NFA_TECHNOLOGY_MASK_B \
127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                                     | NFA_TECHNOLOGY_MASK_F \
128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                                     | NFA_TECHNOLOGY_MASK_ISO15693 \
129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                                     | NFA_TECHNOLOGY_MASK_B_PRIME \
130525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                                     | NFA_TECHNOLOGY_MASK_A_ACTIVE \
13197a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu                                     | NFA_TECHNOLOGY_MASK_F_ACTIVE \
13297a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu                                     | NFA_TECHNOLOGY_MASK_KOVIO)
133525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
135525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void nfaConnectionCallback (UINT8 event, tNFA_CONN_EVT_DATA *eventData);
136525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void nfaDeviceManagementCallback (UINT8 event, tNFA_DM_CBACK_DATA *eventData);
137525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool isPeerToPeer (tNFA_ACTIVATED& activated);
138525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool isListenMode(tNFA_ACTIVATED& activated);
139525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
140525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/////////////////////////////////////////////////////////////
141525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/////////////////////////////////////////////////////////////
142525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
144525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
145525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
146525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        getNative
147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
148525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Get native data
149525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
150525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Native data structure.
151525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
152525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
153525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnfc_jni_native_data *getNative (JNIEnv* e, jobject o)
154525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
155525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static struct nfc_jni_native_data *sCachedNat = NULL;
156525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (e)
157525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
158525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sCachedNat = nfc_jni_get_nat(e, o);
159525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return sCachedNat;
161525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
162525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        handleRfDiscoveryEvent
167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Handle RF-discovery events from the stack.
169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  discoveredDevice: Discovered device.
170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
172525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
173525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
174525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void handleRfDiscoveryEvent (tNFC_RESULT_DEVT* discoveredDevice)
175525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
176525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (discoveredDevice->more)
177525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
178525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //there is more discovery notification coming
179525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return;
180525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
181525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
182525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    bool isP2p = NfcTag::getInstance ().isP2pDiscovered ();
183525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (isP2p)
184525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
185525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //select the peer that supports P2P
186525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcTag::getInstance ().selectP2p();
187525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
188525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else
189525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
190525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //select the first of multiple tags that is discovered
191525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcTag::getInstance ().selectFirstTag();
192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
193525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
194525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
195525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
196525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
197525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
198525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfaConnectionCallback
199525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
200525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Receive connection-related events from stack.
201525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  connEvent: Event code.
202525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  eventData: Event data.
203525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
204525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
205525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
206525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
207525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void nfaConnectionCallback (UINT8 connEvent, tNFA_CONN_EVT_DATA* eventData)
208525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
209525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS status = NFA_STATUS_FAILED;
210525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD("%s: event= %u", __FUNCTION__, connEvent);
211525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
212525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (gIsTagDeactivating && connEvent != NFA_DEACTIVATED_EVT && connEvent != NFA_PRESENCE_CHECK_EVT && connEvent != NFA_DATA_EVT)
213525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
214525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // special case to switching frame interface for ISO_DEP tags
215525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        gIsTagDeactivating = false;
216525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: deactivating, should get NFA_DEACTIVATED_EVT", __FUNCTION__);
217525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_doDeactivateStatus(1);
218525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
219525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
220525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    switch (connEvent)
221525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
222525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_POLL_ENABLED_EVT: // whether polling successfully started
223525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
224525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD("%s: NFA_POLL_ENABLED_EVT: status = %u", __FUNCTION__, eventData->status);
225525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
226525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaEnableDisablePollingEvent);
227525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableDisablePollingEvent.notifyOne ();
228525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
229525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
230525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
231525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_POLL_DISABLED_EVT: // Listening/Polling stopped
232525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
233525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD("%s: NFA_POLL_DISABLED_EVT: status = %u", __FUNCTION__, eventData->status);
234525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
235525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaEnableDisablePollingEvent);
236525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableDisablePollingEvent.notifyOne ();
237525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
238525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
239525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
240525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_RF_DISCOVERY_STARTED_EVT: // RF Discovery started
241525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
242525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD("%s: NFA_RF_DISCOVERY_STARTED_EVT: status = %u", __FUNCTION__, eventData->status);
243525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
244525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaEnableDisablePollingEvent);
245525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableDisablePollingEvent.notifyOne ();
246525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
247525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
248525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
249525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_RF_DISCOVERY_STOPPED_EVT: // RF Discovery stopped event
250525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
251525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD("%s: NFA_RF_DISCOVERY_STOPPED_EVT: status = %u", __FUNCTION__, eventData->status);
252525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
253525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaEnableDisablePollingEvent);
254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableDisablePollingEvent.notifyOne ();
255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
256525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DISC_RESULT_EVT: // NFC link/protocol discovery notificaiton
259525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = eventData->disc_result.status;
260525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_DISC_RESULT_EVT: status = %d", __FUNCTION__, status);
261525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (status != NFA_STATUS_OK)
262525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
263525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE("%s: NFA_DISC_RESULT_EVT error: status = %d", __FUNCTION__, status);
264525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
265525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else
266525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
267525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NfcTag::getInstance().connectionEventHandler(connEvent, eventData);
268525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            handleRfDiscoveryEvent(&eventData->disc_result.discovery_ntf);
269525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
270525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
271525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
272525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_SELECT_RESULT_EVT: // NFC link/protocol discovery select response
273525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_SELECT_RESULT_EVT: status = %d, gIsSelectingRfInterface = %d, sIsDisabling=%d", __FUNCTION__, eventData->status, gIsSelectingRfInterface, sIsDisabling);
274525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
275525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (sIsDisabling)
276525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
277525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
278525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (eventData->status != NFA_STATUS_OK)
279525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
280525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (gIsSelectingRfInterface)
281525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
282525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                nativeNfcTag_doConnectStatus(false);
283525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
284525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
285525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE("%s: NFA_SELECT_RESULT_EVT error: status = %d", __FUNCTION__, eventData->status);
286525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NFA_Deactivate (FALSE);
287525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
288525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
289525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
290525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DEACTIVATE_FAIL_EVT:
291525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_DEACTIVATE_FAIL_EVT: status = %d", __FUNCTION__, eventData->status);
292525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
293525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
294525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_ACTIVATED_EVT: // NFC link/protocol activated
295525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_ACTIVATED_EVT: gIsSelectingRfInterface=%d, sIsDisabling=%d", __FUNCTION__, gIsSelectingRfInterface, sIsDisabling);
296525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (sIsDisabling)
297525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
298525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
299525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcTag::getInstance().setActivationState ();
300525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (gIsSelectingRfInterface)
301525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
302525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            nativeNfcTag_doConnectStatus(true);
303525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
304525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
305525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
306525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_resetPresenceCheck();
307525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (isPeerToPeer(eventData->activated))
308525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
309525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sP2pActive = true;
310525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD("%s: NFA_ACTIVATED_EVT; is p2p", __FUNCTION__);
311525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            // Disable RF field events in case of p2p
312525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            UINT8  nfa_disable_rf_events[] = { 0x00 };
313525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: Disabling RF field events", __FUNCTION__);
314525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            status = NFA_SetConfig(NCI_PARAM_ID_RF_FIELD_INFO, sizeof(nfa_disable_rf_events),
315525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    &nfa_disable_rf_events[0]);
316525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (status == NFA_STATUS_OK) {
317525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGD ("%s: Disabled RF field events", __FUNCTION__);
318525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            } else {
319525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGE ("%s: Failed to disable RF field events", __FUNCTION__);
320525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
321525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
322525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else if (pn544InteropIsBusy() == false)
323525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
324525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NfcTag::getInstance().connectionEventHandler (connEvent, eventData);
325525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
326525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            // We know it is not activating for P2P.  If it activated in
327525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            // listen mode then it is likely for and SE transaction.
328525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            // Send the RF Event.
329525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (isListenMode(eventData->activated))
330525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
331525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sSeRfActive = true;
332525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                SecureElement::getInstance().notifyListenModeState (true);
333525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
334525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
335525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
336525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
337525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
338525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DEACTIVATED_EVT: // NFC link/protocol deactivated
339525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_DEACTIVATED_EVT   Type: %u, gIsTagDeactivating: %d", __FUNCTION__, eventData->deactivated.type,gIsTagDeactivating);
340525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcTag::getInstance().setDeactivationState (eventData->deactivated);
341525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (eventData->deactivated.type != NFA_DEACTIVATE_TYPE_SLEEP)
342525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
343525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            nativeNfcTag_resetPresenceCheck();
344525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NfcTag::getInstance().connectionEventHandler (connEvent, eventData);
345525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            nativeNfcTag_abortWaits();
346525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NfcTag::getInstance().abort ();
347525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
348525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else if (gIsTagDeactivating)
349525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
350525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            nativeNfcTag_doDeactivateStatus(0);
351525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
352525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
353525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // If RF is activated for what we think is a Secure Element transaction
354525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // and it is deactivated to either IDLE or DISCOVERY mode, notify w/event.
355525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if ((eventData->deactivated.type == NFA_DEACTIVATE_TYPE_IDLE)
356525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                || (eventData->deactivated.type == NFA_DEACTIVATE_TYPE_DISCOVERY))
357525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
358525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (sSeRfActive) {
359525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sSeRfActive = false;
360525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                SecureElement::getInstance().notifyListenModeState (false);
361525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            } else if (sP2pActive) {
362525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sP2pActive = false;
363525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                // Make sure RF field events are re-enabled
364525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGD("%s: NFA_ACTIVATED_EVT; is p2p", __FUNCTION__);
365525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                // Disable RF field events in case of p2p
366525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                UINT8  nfa_enable_rf_events[] = { 0x01 };
367525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
368525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGD ("%s: Enabling RF field events", __FUNCTION__);
369525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                status = NFA_SetConfig(NCI_PARAM_ID_RF_FIELD_INFO, sizeof(nfa_enable_rf_events),
370525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        &nfa_enable_rf_events[0]);
371525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                if (status == NFA_STATUS_OK) {
372525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    ALOGD ("%s: Enabled RF field events", __FUNCTION__);
373525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                } else {
374525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    ALOGE ("%s: Failed to enable RF field events", __FUNCTION__);
375525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                }
376525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
377525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
378525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
379525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
380525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
381525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_TLV_DETECT_EVT: // TLV Detection complete
382525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = eventData->tlv_detect.status;
383525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_TLV_DETECT_EVT: status = %d, protocol = %d, num_tlvs = %d, num_bytes = %d",
384525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             __FUNCTION__, status, eventData->tlv_detect.protocol,
385525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->tlv_detect.num_tlvs, eventData->tlv_detect.num_bytes);
386525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (status != NFA_STATUS_OK)
387525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
388525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE("%s: NFA_TLV_DETECT_EVT error: status = %d", __FUNCTION__, status);
389525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
390525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
391525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
392525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_NDEF_DETECT_EVT: // NDEF Detection complete;
393525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //if status is failure, it means the tag does not contain any or valid NDEF data;
394525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //pass the failure status to the NFC Service;
395525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = eventData->ndef_detect.status;
396525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_NDEF_DETECT_EVT: status = 0x%X, protocol = %u, "
397525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             "max_size = %lu, cur_size = %lu, flags = 0x%X", __FUNCTION__,
398525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             status,
399525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->ndef_detect.protocol, eventData->ndef_detect.max_size,
400525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->ndef_detect.cur_size, eventData->ndef_detect.flags);
401525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcTag::getInstance().connectionEventHandler (connEvent, eventData);
402525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_doCheckNdefResult(status,
403525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            eventData->ndef_detect.max_size, eventData->ndef_detect.cur_size,
404525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            eventData->ndef_detect.flags);
405525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
406525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
407525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DATA_EVT: // Data message received (for non-NDEF reads)
408525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_DATA_EVT:  len = %d", __FUNCTION__, eventData->data.len);
409525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_doTransceiveStatus(eventData->data.p_data,eventData->data.len);
410525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
411525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
412525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_SELECT_CPLT_EVT: // Select completed
413525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = eventData->status;
414525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_SELECT_CPLT_EVT: status = %d", __FUNCTION__, status);
415525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (status != NFA_STATUS_OK)
416525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
417525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE("%s: NFA_SELECT_CPLT_EVT error: status = %d", __FUNCTION__, status);
418525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
419525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
420525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
421525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_READ_CPLT_EVT: // NDEF-read or tag-specific-read completed
422525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_READ_CPLT_EVT: status = 0x%X", __FUNCTION__, eventData->status);
423525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_doReadCompleted (eventData->status);
424525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcTag::getInstance().connectionEventHandler (connEvent, eventData);
425525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
426525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
427525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_WRITE_CPLT_EVT: // Write completed
428525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_WRITE_CPLT_EVT: status = %d", __FUNCTION__, eventData->status);
429525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_doWriteStatus (eventData->status == NFA_STATUS_OK);
430525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
431525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
432525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_SET_TAG_RO_EVT: // Tag set as Read only
433525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_SET_TAG_RO_EVT: status = %d", __FUNCTION__, eventData->status);
434525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_doMakeReadonlyResult(eventData->status);
435525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
436525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
437525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_CE_NDEF_WRITE_START_EVT: // NDEF write started
438525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_CE_NDEF_WRITE_START_EVT: status: %d", __FUNCTION__, eventData->status);
439525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
440525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (eventData->status != NFA_STATUS_OK)
441525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE("%s: NFA_CE_NDEF_WRITE_START_EVT error: status = %d", __FUNCTION__, eventData->status);
442525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
443525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
444525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_CE_NDEF_WRITE_CPLT_EVT: // NDEF write completed
445525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: FA_CE_NDEF_WRITE_CPLT_EVT: len = %lu", __FUNCTION__, eventData->ndef_write_cplt.len);
446525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
447525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
448525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_LLCP_ACTIVATED_EVT: // LLCP link is activated
449525c260303268a83da4c3413b953d13c9084e834The 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",
450525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             __FUNCTION__,
451525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->llcp_activated.is_initiator,
452525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->llcp_activated.remote_wks,
453525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->llcp_activated.remote_lsc,
454525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->llcp_activated.remote_link_miu,
455525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->llcp_activated.local_link_miu);
456525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
457525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PeerToPeer::getInstance().llcpActivatedHandler (getNative(0, 0), eventData->llcp_activated);
458525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
459525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
460525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_LLCP_DEACTIVATED_EVT: // LLCP link is deactivated
461525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_LLCP_DEACTIVATED_EVT", __FUNCTION__);
462525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PeerToPeer::getInstance().llcpDeactivatedHandler (getNative(0, 0), eventData->llcp_deactivated);
463525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
464525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
465525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_PRESENCE_CHECK_EVT:
466525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_PRESENCE_CHECK_EVT", __FUNCTION__);
467525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_doPresenceCheckResult (eventData->status);
468525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
469525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
470525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_FORMAT_CPLT_EVT:
471525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_FORMAT_CPLT_EVT: status=0x%X", __FUNCTION__, eventData->status);
472525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_formatStatus (eventData->status == NFA_STATUS_OK);
473525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
474525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
475525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_I93_CMD_CPLT_EVT:
476525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_I93_CMD_CPLT_EVT: status=0x%X", __FUNCTION__, eventData->status);
477525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
478525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
479525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_CE_UICC_LISTEN_CONFIGURED_EVT :
480525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_CE_UICC_LISTEN_CONFIGURED_EVT : status=0x%X", __FUNCTION__, eventData->status);
481525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SecureElement::getInstance().connectionEventHandler (connEvent, eventData);
482525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
483525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
484525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_SET_P2P_LISTEN_TECH_EVT:
485525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_SET_P2P_LISTEN_TECH_EVT", __FUNCTION__);
486525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PeerToPeer::getInstance().connectionEventHandler (connEvent, eventData);
487525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
488525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
489525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    default:
490525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE("%s: unknown event ????", __FUNCTION__);
491525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
492525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
493525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
494525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
495525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
496525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
497525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
498525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_initNativeStruc
499525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
500525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Initialize variables.
501525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
502525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
503525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
504525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if ok.
505525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
506525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
507525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean nfcManager_initNativeStruc (JNIEnv* e, jobject o)
508525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
509525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
510525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
5112534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    nfc_jni_native_data* nat = (nfc_jni_native_data*)malloc(sizeof(struct nfc_jni_native_data));
512525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (nat == NULL)
513525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
514525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: fail allocate native data", __FUNCTION__);
515525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_FALSE;
516525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
517525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
518525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    memset (nat, 0, sizeof(*nat));
5192534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->GetJavaVM(&(nat->vm));
5202534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    nat->env_version = e->GetVersion();
5212534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    nat->manager = e->NewGlobalRef(o);
522525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
5232534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jclass> cls(e, e->GetObjectClass(o));
5242534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jfieldID f = e->GetFieldID(cls.get(), "mNative", "I");
5252534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetIntField(o, f, (jint)nat);
526525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
527525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Initialize native cached references */
5282534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    gCachedNfcManagerNotifyNdefMessageListeners = e->GetMethodID(cls.get(),
529525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            "notifyNdefMessageListeners", "(Lcom/android/nfc/dhimpl/NativeNfcTag;)V");
5302534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    gCachedNfcManagerNotifyTransactionListeners = e->GetMethodID(cls.get(),
531525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            "notifyTransactionListeners", "([B)V");
5322534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    gCachedNfcManagerNotifyLlcpLinkActivation = e->GetMethodID(cls.get(),
533525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            "notifyLlcpLinkActivation", "(Lcom/android/nfc/dhimpl/NativeP2pDevice;)V");
5342534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    gCachedNfcManagerNotifyLlcpLinkDeactivated = e->GetMethodID(cls.get(),
535525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            "notifyLlcpLinkDeactivated", "(Lcom/android/nfc/dhimpl/NativeP2pDevice;)V");
5362534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    sCachedNfcManagerNotifyTargetDeselected = e->GetMethodID(cls.get(),
537525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            "notifyTargetDeselected","()V");
5382534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    gCachedNfcManagerNotifySeFieldActivated = e->GetMethodID(cls.get(),
539525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            "notifySeFieldActivated", "()V");
5402534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    gCachedNfcManagerNotifySeFieldDeactivated = e->GetMethodID(cls.get(),
541525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            "notifySeFieldDeactivated", "()V");
5422534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    gCachedNfcManagerNotifySeListenActivated = e->GetMethodID(cls.get(),
543525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            "notifySeListenActivated", "()V");
5442534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    gCachedNfcManagerNotifySeListenDeactivated = e->GetMethodID(cls.get(),
545525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            "notifySeListenDeactivated", "()V");
546525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
5472534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    sCachedNfcManagerNotifySeApduReceived = e->GetMethodID(cls.get(),
548525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            "notifySeApduReceived", "([B)V");
549525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
5502534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    sCachedNfcManagerNotifySeMifareAccess = e->GetMethodID(cls.get(),
551525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            "notifySeMifareAccess", "([B)V");
552525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
5532534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    sCachedNfcManagerNotifySeEmvCardRemoval =  e->GetMethodID(cls.get(),
554525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            "notifySeEmvCardRemoval", "()V");
555525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
5562534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    if (nfc_jni_cache_object(e, gNativeNfcTagClassName, &(nat->cached_NfcTag)) == -1)
557525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
558525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: fail cache NativeNfcTag", __FUNCTION__);
559525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_FALSE;
560525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
561525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
5622534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    if (nfc_jni_cache_object(e, gNativeP2pDeviceClassName, &(nat->cached_P2pDevice)) == -1)
563525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
564525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: fail cache NativeP2pDevice", __FUNCTION__);
565525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_FALSE;
566525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
567525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
568525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
569525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return JNI_TRUE;
570525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
571525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
572525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
573525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
574525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
575525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfaDeviceManagementCallback
576525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
577525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Receive device management events from stack.
578525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  dmEvent: Device-management event ID.
579525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  eventData: Data associated with event ID.
580525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
581525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
582525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
583525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
584525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nfaDeviceManagementCallback (UINT8 dmEvent, tNFA_DM_CBACK_DATA* eventData)
585525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
586525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter; event=0x%X", __FUNCTION__, dmEvent);
587525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
588525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    switch (dmEvent)
589525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
590525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_ENABLE_EVT: /* Result of NFA_Enable */
591525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
592525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaEnableEvent);
593525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: NFA_DM_ENABLE_EVT; status=0x%X",
594525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    __FUNCTION__, eventData->status);
595525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sIsNfaEnabled = eventData->status == NFA_STATUS_OK;
596525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sIsDisabling = false;
597525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableEvent.notifyOne ();
598525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
599525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
600525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
601525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_DISABLE_EVT: /* Result of NFA_Disable */
602525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
603525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaDisableEvent);
604525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: NFA_DM_DISABLE_EVT", __FUNCTION__);
605525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sIsNfaEnabled = false;
606525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sIsDisabling = false;
607525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaDisableEvent.notifyOne ();
608525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
609525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
610525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
611525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_SET_CONFIG_EVT: //result of NFA_SetConfig
612525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: NFA_DM_SET_CONFIG_EVT", __FUNCTION__);
613525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
614525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaSetConfigEvent);
615525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaSetConfigEvent.notifyOne();
616525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
617525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
618525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
619525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_GET_CONFIG_EVT: /* Result of NFA_GetConfig */
620525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: NFA_DM_GET_CONFIG_EVT", __FUNCTION__);
621525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
622525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
623525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_RF_FIELD_EVT:
624525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: NFA_DM_RF_FIELD_EVT; status=0x%X; field status=%u", __FUNCTION__,
625525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project              eventData->rf_field.status, eventData->rf_field.rf_field_status);
626525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
627525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (!sIsDisabling && eventData->rf_field.status == NFA_STATUS_OK)
628525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SecureElement::getInstance().notifyRfFieldEvent (eventData->rf_field.rf_field_status == NFA_DM_RF_FIELD_ON);
629525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
630525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
631525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_NFCC_TRANSPORT_ERR_EVT:
632525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_NFCC_TIMEOUT_EVT:
633525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
634525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (dmEvent == NFA_DM_NFCC_TIMEOUT_EVT)
635525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGD ("%s: NFA_DM_NFCC_TIMEOUT_EVT; abort all outstanding operations", __FUNCTION__);
636525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            else
637525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGD ("%s: NFA_DM_NFCC_TRANSPORT_ERR_EVT; abort all outstanding operations", __FUNCTION__);
638525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
639525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            nativeNfcTag_abortWaits();
640525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NfcTag::getInstance().abort ();
641525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sAbortConnlessWait = true;
642525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            nativeLlcpConnectionlessSocket_abortWait();
643525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
644525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGD ("%s: aborting  sNfaEnableDisablePollingEvent", __FUNCTION__);
645525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                SyncEventGuard guard (sNfaEnableDisablePollingEvent);
646525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sNfaEnableDisablePollingEvent.notifyOne();
647525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
648525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
649525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGD ("%s: aborting  sNfaEnableEvent", __FUNCTION__);
650525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                SyncEventGuard guard (sNfaEnableEvent);
651525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sNfaEnableEvent.notifyOne();
652525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
653525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
654525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGD ("%s: aborting  sNfaDisableEvent", __FUNCTION__);
655525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                SyncEventGuard guard (sNfaDisableEvent);
656525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sNfaDisableEvent.notifyOne();
657525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
658525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sDiscoveryEnabled = false;
659525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            PowerSwitch::getInstance ().abort ();
660525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
661525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (!sIsDisabling && sIsNfaEnabled)
662525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
663525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                NFA_Disable(FALSE);
664525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sIsDisabling = true;
665525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
666525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            else
667525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
668525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sIsNfaEnabled = false;
669525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sIsDisabling = false;
670525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
671525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            PowerSwitch::getInstance ().initialize (PowerSwitch::UNKNOWN_LEVEL);
672525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: aborted all waiting events", __FUNCTION__);
673525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
674525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
675525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
676525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_PWR_MODE_CHANGE_EVT:
677525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PowerSwitch::getInstance ().deviceManagementCallback (dmEvent, eventData);
678525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
679525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
680525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    default:
681525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: unhandled event", __FUNCTION__);
682525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
683525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
684525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
685525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
686525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
687525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
688525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
689525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doInitialize
690525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
691525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Turn on NFC.
692525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
693525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
694525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
695525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if ok.
696525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
697525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
698525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean nfcManager_doInitialize (JNIEnv* e, jobject o)
699525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
700525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter; NCI_VERSION=0x%02X", __FUNCTION__, NCI_VERSION);
701525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS stat = NFA_STATUS_OK;
702525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
703525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sIsNfaEnabled)
704525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
705525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: already enabled", __FUNCTION__);
706525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
707525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
708525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
709525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PowerSwitch::getInstance ().initialize (PowerSwitch::FULL_POWER);
710525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
711525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
712525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        unsigned long num = 0;
713525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
714525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcAdaptation& theInstance = NfcAdaptation::GetInstance();
715525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        theInstance.Initialize(); //start GKI, NCI task, NFC task
716525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
717525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
718525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaEnableEvent);
719525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            tHAL_NFC_ENTRY* halFuncEntries = theInstance.GetHalEntryFuncs ();
720525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
721525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NFA_Init (halFuncEntries);
722525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
723525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            stat = NFA_Enable (nfaDeviceManagementCallback, nfaConnectionCallback);
724525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (stat == NFA_STATUS_OK)
725525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
726525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                num = initializeGlobalAppLogLevel ();
727525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                CE_SetTraceLevel (num);
728525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                LLCP_SetTraceLevel (num);
729525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                NFC_SetTraceLevel (num);
730525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                RW_SetTraceLevel (num);
731525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                NFA_SetTraceLevel (num);
732525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                NFA_ChoSetTraceLevel (num);
733525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                NFA_P2pSetTraceLevel (num);
734525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                NFA_SnepSetTraceLevel (num);
735525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sNfaEnableEvent.wait(); //wait for NFA command to finish
736525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
737525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
738525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
739525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (stat == NFA_STATUS_OK)
740525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
741525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            //sIsNfaEnabled indicates whether stack started successfully
742525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (sIsNfaEnabled)
743525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
744525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                SecureElement::getInstance().initialize (getNative(e, o));
745525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                nativeNfcTag_registerNdefTypeHandler ();
746525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                NfcTag::getInstance().initialize (getNative(e, o));
747525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                PeerToPeer::getInstance().initialize ();
748525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                PeerToPeer::getInstance().handleNfcOnOff (true);
749525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
750525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                /////////////////////////////////////////////////////////////////////////////////
751525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                // Add extra configuration here (work-arounds, etc.)
752525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
753525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                struct nfc_jni_native_data *nat = getNative(e, o);
754525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
755525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                if ( nat )
756525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                {
757525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    if (GetNumValue(NAME_POLLING_TECH_MASK, &num, sizeof(num)))
758525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        nat->tech_mask = num;
759525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    else
760525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        nat->tech_mask = DEFAULT_TECH_MASK;
761525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
762525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    ALOGD ("%s: tag polling tech mask=0x%X", __FUNCTION__, nat->tech_mask);
763525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                }
764525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
765525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                // Always restore LPTD Configuration to the stack default.
766525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                if (sOriginalLptdCfg != NULL)
767525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    p_nfa_dm_lptd_cfg = sOriginalLptdCfg;
768525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
769525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                // if this value exists, set polling interval.
770525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                if (GetNumValue(NAME_NFA_DM_DISC_DURATION_POLL, &num, sizeof(num)))
771525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    NFA_SetRfDiscoveryDuration(num);
772525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
773525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                // Do custom NFCA startup configuration.
774525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                doStartupConfig();
775525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                goto TheEnd;
776525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
777525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
778525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
779525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: fail nfa enable; error=0x%X", __FUNCTION__, stat);
780525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
781525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (sIsNfaEnabled)
782525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            stat = NFA_Disable (FALSE /* ungraceful */);
783525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
784525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        theInstance.Finalize();
785525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
786525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
787525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd:
788525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sIsNfaEnabled)
789525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER);
790525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
791525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return sIsNfaEnabled ? JNI_TRUE : JNI_FALSE;
792525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
793525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
794525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
795525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
796525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
797525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_enableDiscovery
798525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
799525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Start polling and listening for devices.
800525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
801525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
802525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  mode: Not used.
803525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
804525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
805525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
806525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
807525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void nfcManager_enableDiscovery (JNIEnv* e, jobject o)
808525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
809525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_TECHNOLOGY_MASK tech_mask = DEFAULT_TECH_MASK;
810525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    struct nfc_jni_native_data *nat = getNative(e, o);
811525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
812525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (nat)
813525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        tech_mask = (tNFA_TECHNOLOGY_MASK)nat->tech_mask;
814525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
815525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter; tech_mask = %02x", __FUNCTION__, tech_mask);
816525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
817525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sDiscoveryEnabled)
818525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
819525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: already polling", __FUNCTION__);
820525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return;
821525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
822525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
823525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS stat = NFA_STATUS_OK;
824525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
825525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: sIsSecElemSelected=%u", __FUNCTION__, sIsSecElemSelected);
826525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
827525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PowerSwitch::getInstance ().setLevel (PowerSwitch::FULL_POWER);
828525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
829525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sRfEnabled) {
830525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // Stop RF discovery to reconfigure
831525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        startRfDiscovery(false);
832525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
833525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
834525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
835525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard guard (sNfaEnableDisablePollingEvent);
836525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        stat = NFA_EnablePolling (tech_mask);
837525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (stat == NFA_STATUS_OK)
838525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
839525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: wait for enable event", __FUNCTION__);
840525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sDiscoveryEnabled = true;
841525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_ENABLED_EVT
842525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: got enabled event", __FUNCTION__);
843525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
844525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else
845525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
846525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE ("%s: fail enable discovery; error=0x%X", __FUNCTION__, stat);
847525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
848525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
849525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
850525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // Start P2P listening if tag polling was enabled or the mask was 0.
851525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sDiscoveryEnabled || (tech_mask == 0))
852525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
853525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: Enable p2pListening", __FUNCTION__);
854525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PeerToPeer::getInstance().enableP2pListening (true);
855525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
856525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //if NFC service has deselected the sec elem, then apply default routes
857525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (!sIsSecElemSelected)
858525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            stat = SecureElement::getInstance().routeToDefault ();
859525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
860525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
861525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // Actually start discovery.
862525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    startRfDiscovery (true);
863525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
864525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PowerSwitch::getInstance ().setModeOn (PowerSwitch::DISCOVERY);
865525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
866525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
867525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
868525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
869525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
870525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
871525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
872525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_disableDiscovery
873525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
874525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Stop polling and listening for devices.
875525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
876525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
877525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
878525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
879525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
880525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
8812534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesvoid nfcManager_disableDiscovery (JNIEnv*, jobject)
882525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
883525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS status = NFA_STATUS_OK;
884525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter;", __FUNCTION__);
885525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
886525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    pn544InteropAbortNow ();
887525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sDiscoveryEnabled == false)
888525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
889525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: already disabled", __FUNCTION__);
890525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
891525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
892525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
893525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // Stop RF Discovery.
894525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    startRfDiscovery (false);
895525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
896525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sDiscoveryEnabled)
897525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
898525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard guard (sNfaEnableDisablePollingEvent);
899525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = NFA_DisablePolling ();
900525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (status == NFA_STATUS_OK)
901525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
902525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sDiscoveryEnabled = false;
903525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_DISABLED_EVT
904525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
905525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else
906525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE ("%s: Failed to disable polling; error=0x%X", __FUNCTION__, status);
907525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
908525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
909525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PeerToPeer::getInstance().enableP2pListening (false);
910525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
911525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //if nothing is active after this, then tell the controller to power down
912525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (! PowerSwitch::getInstance ().setModeOff (PowerSwitch::DISCOVERY))
913525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER);
914525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
915525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd:
916525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
917525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
918525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
919525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
920525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
921525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function         nfc_jni_cache_object_local
922525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
923525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description      Allocates a java object and calls it's constructor
924525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
925525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns          -1 on failure, 0 on success
926525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
927525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
9282534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic int nfc_jni_cache_object_local (JNIEnv *e, const char *className, jobject *cachedObj)
929525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
9302534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jclass> cls(e, e->FindClass(className));
9312534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    if(cls.get() == NULL) {
932525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: find class error", __FUNCTION__);
933525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return -1;
934525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
935525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
9362534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jmethodID ctor = e->GetMethodID(cls.get(), "<init>", "()V");
9372534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jobject obj = e->NewObject(cls.get(), ctor);
9382534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    if (obj == NULL) {
939525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project       ALOGE ("%s: create object error", __FUNCTION__);
940525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project       return -1;
941525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
942525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
9432534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    *cachedObj = obj;
9442534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    if (*cachedObj == NULL) {
945525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: global ref error", __FUNCTION__);
946525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return -1;
947525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
948525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return 0;
949525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
950525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
951525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
952525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
953525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
954525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doCreateLlcpServiceSocket
955525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
956525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Create a new LLCP server socket.
957525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
958525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
959525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  nSap: Service access point.
960525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  sn: Service name
961525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  miu: Maximum information unit.
962525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  rw: Receive window size.
963525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  linearBufferLength: Max buffer size.
964525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
965525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         NativeLlcpServiceSocket Java object.
966525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
967525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
9682534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jobject nfcManager_doCreateLlcpServiceSocket (JNIEnv* e, jobject, jint nSap, jstring sn, jint miu, jint rw, jint linearBufferLength)
969525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
970525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PeerToPeer::tJNI_HANDLE jniHandle = PeerToPeer::getInstance().getNewJniHandle ();
971525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
9722534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedUtfChars serviceName(e, sn);
9732534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes
9742534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ALOGD ("%s: enter: sap=%i; name=%s; miu=%i; rw=%i; buffLen=%i", __FUNCTION__, nSap, serviceName.c_str(), miu, rw, linearBufferLength);
975525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
976525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Create new NativeLlcpServiceSocket object */
9772534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jobject serviceSocket = NULL;
978525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (nfc_jni_cache_object(e, gNativeLlcpServiceSocketClassName, &(serviceSocket)) == -1)
979525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
980525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: Llcp socket object creation error", __FUNCTION__);
981525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return NULL;
982525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
983525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
984525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Get NativeLlcpServiceSocket class object */
9852534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jclass> clsNativeLlcpServiceSocket(e, e->GetObjectClass(serviceSocket));
986525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (e->ExceptionCheck())
987525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
988525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        e->ExceptionClear();
989525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE("%s: Llcp Socket get object class error", __FUNCTION__);
990525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return NULL;
991525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
992525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
9932534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    if (!PeerToPeer::getInstance().registerServer (jniHandle, serviceName.c_str()))
994525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
995525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE("%s: RegisterServer error", __FUNCTION__);
996525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return NULL;
997525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
998525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
9992534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jfieldID f;
10002534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes
1001525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket handle to be the same as the NfaHandle*/
10022534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mHandle", "I");
10032534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetIntField(serviceSocket, f, (jint) jniHandle);
1004525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: socket Handle = 0x%X", __FUNCTION__, jniHandle);
1005525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1006525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket linear buffer length */
10072534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mLocalLinearBufferLength", "I");
10082534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetIntField(serviceSocket, f,(jint)linearBufferLength);
1009525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: buffer length = %d", __FUNCTION__, linearBufferLength);
1010525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1011525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket MIU */
10122534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mLocalMiu", "I");
10132534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetIntField(serviceSocket, f,(jint)miu);
1014525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: MIU = %d", __FUNCTION__, miu);
1015525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1016525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket RW */
10172534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mLocalRw", "I");
10182534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetIntField(serviceSocket, f,(jint)rw);
1019525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s:  RW = %d", __FUNCTION__, rw);
1020525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1021525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sLastError = 0;
1022525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
1023525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return serviceSocket;
1024525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1025525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1026525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1027525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1028525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1029525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doGetLastError
1030525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1031525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Get the last error code.
1032525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1033525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1034525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1035525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Last error code.
1036525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1037525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
10382534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jint nfcManager_doGetLastError(JNIEnv*, jobject)
1039525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1040525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: last error=%i", __FUNCTION__, sLastError);
1041525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return sLastError;
1042525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1043525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1044525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1045525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1046525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1047525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doDeinitialize
1048525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1049525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Turn off NFC.
1050525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1051525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1052525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1053525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if ok.
1054525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1055525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
10562534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nfcManager_doDeinitialize (JNIEnv*, jobject)
1057525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1058525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
1059525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1060525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sIsDisabling = true;
1061525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    pn544InteropAbortNow ();
1062525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    SecureElement::getInstance().finalize ();
1063525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1064525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sIsNfaEnabled)
1065525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1066525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard guard (sNfaDisableEvent);
1067525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        tNFA_STATUS stat = NFA_Disable (TRUE /* graceful */);
1068525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (stat == NFA_STATUS_OK)
1069525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
1070525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: wait for completion", __FUNCTION__);
1071525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaDisableEvent.wait (); //wait for NFA command to finish
1072525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            PeerToPeer::getInstance ().handleNfcOnOff (false);
1073525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1074525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else
1075525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
1076525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE ("%s: fail disable; error=0x%X", __FUNCTION__, stat);
1077525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1078525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1079525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    nativeNfcTag_abortWaits();
1080525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    NfcTag::getInstance().abort ();
1081525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sAbortConnlessWait = true;
1082525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    nativeLlcpConnectionlessSocket_abortWait();
1083525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sIsNfaEnabled = false;
1084525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sDiscoveryEnabled = false;
1085525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sIsDisabling = false;
1086525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sIsSecElemSelected = false;
1087525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1088525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1089525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //unblock NFA_EnablePolling() and NFA_DisablePolling()
1090525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard guard (sNfaEnableDisablePollingEvent);
1091525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sNfaEnableDisablePollingEvent.notifyOne ();
1092525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1093525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1094525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    NfcAdaptation& theInstance = NfcAdaptation::GetInstance();
1095525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    theInstance.Finalize();
1096525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1097525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
1098525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return JNI_TRUE;
1099525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1100525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1101525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1102525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1103525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1104525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doCreateLlcpSocket
1105525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1106525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Create a LLCP connection-oriented socket.
1107525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1108525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1109525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  nSap: Service access point.
1110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  miu: Maximum information unit.
1111525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  rw: Receive window size.
1112525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  linearBufferLength: Max buffer size.
1113525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         NativeLlcpSocket Java object.
1115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
11172534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jobject nfcManager_doCreateLlcpSocket (JNIEnv* e, jobject, jint nSap, jint miu, jint rw, jint linearBufferLength)
1118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1119525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter; sap=%d; miu=%d; rw=%d; buffer len=%d", __FUNCTION__, nSap, miu, rw, linearBufferLength);
1120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
11212534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    PeerToPeer::tJNI_HANDLE jniHandle = PeerToPeer::getInstance().getNewJniHandle ();
11222534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    bool stat = PeerToPeer::getInstance().createClient (jniHandle, miu, rw);
1123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Create new NativeLlcpSocket object */
11252534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jobject clientSocket = NULL;
1126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (nfc_jni_cache_object_local(e, gNativeLlcpSocketClassName, &(clientSocket)) == -1)
1127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: fail Llcp socket creation", __FUNCTION__);
11292534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        return clientSocket;
1130525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1131525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1132525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Get NativeConnectionless class object */
11332534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jclass> clsNativeLlcpSocket(e, e->GetObjectClass(clientSocket));
1134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (e->ExceptionCheck())
1135525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1136525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        e->ExceptionClear();
1137525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: fail get class object", __FUNCTION__);
11382534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        return clientSocket;
1139525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1140525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
11412534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jfieldID f;
11422534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes
1143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket SAP */
11442534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID (clsNativeLlcpSocket.get(), "mSap", "I");
1145525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    e->SetIntField (clientSocket, f, (jint) nSap);
1146525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket handle */
11482534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID (clsNativeLlcpSocket.get(), "mHandle", "I");
1149525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    e->SetIntField (clientSocket, f, (jint) jniHandle);
1150525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1151525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket MIU */
11522534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID (clsNativeLlcpSocket.get(), "mLocalMiu", "I");
1153525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    e->SetIntField (clientSocket, f, (jint) miu);
1154525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1155525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket RW */
11562534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID (clsNativeLlcpSocket.get(), "mLocalRw", "I");
1157525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    e->SetIntField (clientSocket, f, (jint) rw);
1158525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1159525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
1160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return clientSocket;
1161525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1162525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doCreateLlcpConnectionlessSocket
1167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Create a connection-less socket.
1169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  nSap: Service access point.
1172525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  sn: Service name.
1173525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1174525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         NativeLlcpConnectionlessSocket Java object.
1175525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1176525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
11772534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jobject nfcManager_doCreateLlcpConnectionlessSocket (JNIEnv *, jobject, jint nSap, jstring /*sn*/)
1178525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1179525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: nSap=0x%X", __FUNCTION__, nSap);
1180525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return NULL;
1181525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1182525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1183525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1184525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1185525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1186525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doGetSecureElementList
1187525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1188525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Get a list of secure element handles.
1189525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1190525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1191525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         List of secure element handles.
1193525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1194525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
11952534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jintArray nfcManager_doGetSecureElementList(JNIEnv* e, jobject)
1196525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1197525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s", __FUNCTION__);
1198525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return SecureElement::getInstance().getListOfEeHandles (e);
1199525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1200525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1201525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1202525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1203525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1204525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doSelectSecureElement
1205525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1206525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     NFC controller starts routing data in listen mode.
1207525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1208525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1209525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1210525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1211525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1212525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
12132534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic void nfcManager_doSelectSecureElement(JNIEnv*, jobject)
1214525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1215525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
1216525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    bool stat = true;
1217525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1218525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PowerSwitch::getInstance ().setLevel (PowerSwitch::FULL_POWER);
1219525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1220525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sRfEnabled) {
1221525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // Stop RF Discovery if we were polling
1222525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        startRfDiscovery (false);
1223525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1224525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1225525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sIsSecElemSelected)
1226525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1227525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: already selected", __FUNCTION__);
1228525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
1229525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1230525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1231525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    stat = SecureElement::getInstance().activate (0xABCDEF);
1232525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (stat)
1233525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SecureElement::getInstance().routeToSecureElement ();
1234525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sIsSecElemSelected = true;
1235525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1236525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd:
1237525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    startRfDiscovery (true);
1238525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1239525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PowerSwitch::getInstance ().setModeOn (PowerSwitch::SE_ROUTING);
1240525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1241525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
1242525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1243525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1244525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1245525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1246525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1247525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doDeselectSecureElement
1248525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1249525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     NFC controller stops routing data in listen mode.
1250525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1251525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1252525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1253525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
12562534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic void nfcManager_doDeselectSecureElement(JNIEnv*, jobject)
1257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
1259525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    bool stat = false;
1260be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project    bool bRestartDiscovery = false;
1261525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1262525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (! sIsSecElemSelected)
1263525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1264525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: already deselected", __FUNCTION__);
1265525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
1266525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1267525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1268525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (PowerSwitch::getInstance ().getLevel() == PowerSwitch::LOW_POWER)
1269525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1270525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: do not deselect while power is OFF", __FUNCTION__);
1271525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sIsSecElemSelected = false;
1272525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
1273525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1274525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1275be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project    if (sRfEnabled) {
1276be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project        // Stop RF Discovery if we were polling
1277be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project        startRfDiscovery (false);
1278be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project        bRestartDiscovery = true;
1279be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project    }
1280be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project
1281525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    stat = SecureElement::getInstance().routeToDefault ();
1282525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sIsSecElemSelected = false;
1283525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1284525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //if controller is not routing to sec elems AND there is no pipe connected,
1285525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //then turn off the sec elems
1286525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (SecureElement::getInstance().isBusy() == false)
1287525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SecureElement::getInstance().deactivate (0xABCDEF);
1288525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1289525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd:
1290be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project    if (bRestartDiscovery)
1291be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project        startRfDiscovery (true);
1292be1939b4b6003ac7a65fcb95a3912f5e1ce8e75fThe Android Open Source Project
1293525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //if nothing is active after this, then tell the controller to power down
1294525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (! PowerSwitch::getInstance ().setModeOff (PowerSwitch::SE_ROUTING))
1295525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER);
1296525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1297525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
1298525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1299525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1300525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1301525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1302525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1303525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        isPeerToPeer
1304525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1305525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Whether the activation data indicates the peer supports NFC-DEP.
1306525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  activated: Activation data.
1307525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1308525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if the peer supports NFC-DEP.
1309525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1310525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1311525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool isPeerToPeer (tNFA_ACTIVATED& activated)
1312525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1313525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return activated.activate_ntf.protocol == NFA_PROTOCOL_NFC_DEP;
1314525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1315525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1316525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1317525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1318525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        isListenMode
1319525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1320525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Indicates whether the activation data indicates it is
1321525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  listen mode.
1322525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1323525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if this listen mode.
1324525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1325525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1326525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool isListenMode(tNFA_ACTIVATED& activated)
1327525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1328525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return ((NFC_DISCOVERY_TYPE_LISTEN_A == activated.activate_ntf.rf_tech_param.mode)
1329525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            || (NFC_DISCOVERY_TYPE_LISTEN_B == activated.activate_ntf.rf_tech_param.mode)
1330525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            || (NFC_DISCOVERY_TYPE_LISTEN_F == activated.activate_ntf.rf_tech_param.mode)
1331525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            || (NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE == activated.activate_ntf.rf_tech_param.mode)
1332525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            || (NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE == activated.activate_ntf.rf_tech_param.mode)
1333525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            || (NFC_DISCOVERY_TYPE_LISTEN_ISO15693 == activated.activate_ntf.rf_tech_param.mode)
1334525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            || (NFC_DISCOVERY_TYPE_LISTEN_B_PRIME == activated.activate_ntf.rf_tech_param.mode));
1335525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1336525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1337525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1338525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1339525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doCheckLlcp
1340525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1341525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Not used.
1342525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1343525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True
1344525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1345525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
13462534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nfcManager_doCheckLlcp(JNIEnv*, jobject)
1347525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1348525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD("%s", __FUNCTION__);
1349525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return JNI_TRUE;
1350525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1351525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1352525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1353525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1354525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1355525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doActivateLlcp
1356525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1357525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Not used.
1358525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1359525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True
1360525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1361525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
13622534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nfcManager_doActivateLlcp(JNIEnv*, jobject)
1363525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1364525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD("%s", __FUNCTION__);
1365525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return JNI_TRUE;
1366525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1367525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1368525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1369525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1370525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1371525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doAbort
1372525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1373525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Not used.
1374525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1375525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1376525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1377525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
13782534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic void nfcManager_doAbort(JNIEnv*, jobject)
1379525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1380525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGE("%s: abort()", __FUNCTION__);
1381525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    abort();
1382525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1383525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1384525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1385525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1386525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1387525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doDownload
1388525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1389525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Not used.
1390525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1391525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True
1392525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1393525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
13942534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nfcManager_doDownload(JNIEnv*, jobject)
1395525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1396525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD("%s", __FUNCTION__);
1397525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return JNI_TRUE;
1398525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1399525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1400525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1401525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1402525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1403525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doResetTimeouts
1404525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1405525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Not used.
1406525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1407525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1408525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1409525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
14102534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic void nfcManager_doResetTimeouts(JNIEnv*, jobject)
1411525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1412525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: %d millisec", __FUNCTION__, DEFAULT_GENERAL_TRANS_TIMEOUT);
1413525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    gGeneralTransceiveTimeout = DEFAULT_GENERAL_TRANS_TIMEOUT;
1414525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1415525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1416525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1417525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1418525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1419525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doSetTimeout
1420525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1421525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Set timeout value.
1422525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1423525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1424525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  timeout: Timeout value.
1425525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1426525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if ok.
1427525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1428525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
14292534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic bool nfcManager_doSetTimeout(JNIEnv*, jobject, jint /*tech*/, jint timeout)
1430525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1431525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (timeout <= 0)
1432525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1433525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE("%s: Timeout must be positive.",__FUNCTION__);
1434525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return false;
1435525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1436525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1437525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: timeout=%d", __FUNCTION__, timeout);
1438525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    gGeneralTransceiveTimeout = timeout;
1439525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return true;
1440525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1441525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1442525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1443525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1444525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1445525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doGetTimeout
1446525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1447525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Get timeout value.
1448525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1449525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1450525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  tech: Not used.
1451525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1452525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Timeout value.
1453525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1454525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
14552534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jint nfcManager_doGetTimeout(JNIEnv*, jobject, jint /*tech*/)
1456525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1457525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: timeout=%d", __FUNCTION__, gGeneralTransceiveTimeout);
1458525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return gGeneralTransceiveTimeout;
1459525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1460525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1461525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1462525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1463525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1464525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doDump
1465525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1466525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Not used.
1467525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1468525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1469525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1470525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Text dump.
1471525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1472525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
14732534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jstring nfcManager_doDump(JNIEnv* e, jobject)
1474525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1475525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    char buffer[100];
1476525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    snprintf(buffer, sizeof(buffer), "libnfc llc error_count=%u", /*libnfc_llc_error_count*/ 0);
1477525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return e->NewStringUTF(buffer);
1478525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1479525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1480525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1481525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1482525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1483525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doSetP2pInitiatorModes
1484525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1485525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Set P2P initiator's activation modes.
1486525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1487525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1488525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  modes: Active and/or passive modes.  The values are specified
1489525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                          in external/libnfc-nxp/inc/phNfcTypes.h.  See
1490525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                          enum phNfc_eP2PMode_t.
1491525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1492525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None.
1493525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1494525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1495525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void nfcManager_doSetP2pInitiatorModes (JNIEnv *e, jobject o, jint modes)
1496525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1497525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: modes=0x%X", __FUNCTION__, modes);
1498525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    struct nfc_jni_native_data *nat = getNative(e, o);
1499525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1500525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_TECHNOLOGY_MASK mask = 0;
1501525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x01) mask |= NFA_TECHNOLOGY_MASK_A;
1502525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x02) mask |= NFA_TECHNOLOGY_MASK_F;
1503525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x04) mask |= NFA_TECHNOLOGY_MASK_F;
1504525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x08) mask |= NFA_TECHNOLOGY_MASK_A_ACTIVE;
1505525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x10) mask |= NFA_TECHNOLOGY_MASK_F_ACTIVE;
1506525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x20) mask |= NFA_TECHNOLOGY_MASK_F_ACTIVE;
1507525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    nat->tech_mask = mask;
1508525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1509525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //this function is not called by the NFC service nor exposed by public API.
1510525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1511525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1512525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1513525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1514525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1515525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doSetP2pTargetModes
1516525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1517525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Set P2P target's activation modes.
1518525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1519525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1520525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  modes: Active and/or passive modes.
1521525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1522525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None.
1523525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1524525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
15252534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic void nfcManager_doSetP2pTargetModes (JNIEnv*, jobject, jint modes)
1526525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1527525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: modes=0x%X", __FUNCTION__, modes);
1528525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // Map in the right modes
1529525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_TECHNOLOGY_MASK mask = 0;
1530525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x01) mask |= NFA_TECHNOLOGY_MASK_A;
1531525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x02) mask |= NFA_TECHNOLOGY_MASK_F;
1532525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x04) mask |= NFA_TECHNOLOGY_MASK_F;
1533525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x08) mask |= NFA_TECHNOLOGY_MASK_A_ACTIVE | NFA_TECHNOLOGY_MASK_F_ACTIVE;
1534525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1535525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PeerToPeer::getInstance().setP2pListenMask(mask);
1536525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //this function is not called by the NFC service nor exposed by public API.
1537525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1538525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1539525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*****************************************************************************
1540525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1541525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** JNI functions for android-4.0.1_r1
1542525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1543525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/
1544525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic JNINativeMethod gMethods[] =
1545525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1546525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doDownload", "()Z",
1547525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doDownload},
1548525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1549525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"initializeNativeStructure", "()Z",
1550525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_initNativeStruc},
1551525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1552525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doInitialize", "()Z",
1553525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_doInitialize},
1554525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1555525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doDeinitialize", "()Z",
1556525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_doDeinitialize},
1557525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1558525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"enableDiscovery", "()V",
1559525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_enableDiscovery},
1560525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1561525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doGetSecureElementList", "()[I",
1562525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doGetSecureElementList},
1563525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1564525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doSelectSecureElement", "()V",
1565525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doSelectSecureElement},
1566525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1567525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doDeselectSecureElement", "()V",
1568525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doDeselectSecureElement},
1569525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1570525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doCheckLlcp", "()Z",
1571525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doCheckLlcp},
1572525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1573525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doActivateLlcp", "()Z",
1574525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doActivateLlcp},
1575525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1576525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doCreateLlcpConnectionlessSocket", "(ILjava/lang/String;)Lcom/android/nfc/dhimpl/NativeLlcpConnectionlessSocket;",
1577525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doCreateLlcpConnectionlessSocket},
1578525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1579525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doCreateLlcpServiceSocket", "(ILjava/lang/String;III)Lcom/android/nfc/dhimpl/NativeLlcpServiceSocket;",
1580525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_doCreateLlcpServiceSocket},
1581525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1582525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doCreateLlcpSocket", "(IIII)Lcom/android/nfc/dhimpl/NativeLlcpSocket;",
1583525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_doCreateLlcpSocket},
1584525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1585525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doGetLastError", "()I",
1586525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_doGetLastError},
1587525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1588525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"disableDiscovery", "()V",
1589525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_disableDiscovery},
1590525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1591525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doSetTimeout", "(II)Z",
1592525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doSetTimeout},
1593525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1594525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doGetTimeout", "(I)I",
1595525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doGetTimeout},
1596525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1597525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doResetTimeouts", "()V",
1598525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doResetTimeouts},
1599525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1600525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doAbort", "()V",
1601525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doAbort},
1602525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1603525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doSetP2pInitiatorModes", "(I)V",
1604525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doSetP2pInitiatorModes},
1605525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1606525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doSetP2pTargetModes", "(I)V",
1607525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doSetP2pTargetModes},
1608525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1609525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doDump", "()Ljava/lang/String;",
1610525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doDump},
1611525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project};
1612525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1613525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1614525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1615525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1616525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        register_com_android_nfc_NativeNfcManager
1617525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1618525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Regisgter JNI functions with Java Virtual Machine.
1619525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: Environment of JVM.
1620525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1621525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Status of registration.
1622525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1623525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1624525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectint register_com_android_nfc_NativeNfcManager (JNIEnv *e)
1625525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1626525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
1627525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PowerSwitch::getInstance ().initialize (PowerSwitch::UNKNOWN_LEVEL);
1628525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
1629525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return jniRegisterNativeMethods (e, gNativeNfcManagerClassName, gMethods, NELEM (gMethods));
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:        startRfDiscovery
1636525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1637525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Ask stack to start polling and listening for devices.
1638525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  isStart: Whether to start.
1639525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1640525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1641525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1642525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1643525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid startRfDiscovery(bool isStart)
1644525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1645525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS status = NFA_STATUS_FAILED;
1646525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1647525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: is start=%d", __FUNCTION__, isStart);
1648525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    SyncEventGuard guard (sNfaEnableDisablePollingEvent);
1649525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    status  = isStart ? NFA_StartRfDiscovery () : NFA_StopRfDiscovery ();
1650525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (status == NFA_STATUS_OK)
1651525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1652525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sNfaEnableDisablePollingEvent.wait (); //wait for NFA_RF_DISCOVERY_xxxx_EVT
1653525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sRfEnabled = isStart;
1654525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1655525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else
1656525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1657525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: Failed to start/stop RF discovery; error=0x%X", __FUNCTION__, status);
1658525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1659525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1660525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1661525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1662525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1663525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1664525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        doStartupConfig
1665525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1666525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Configure the NFC controller.
1667525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1668525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1669525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1670525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1671525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid doStartupConfig()
1672525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1673525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    unsigned long num = 0;
1674525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    struct nfc_jni_native_data *nat = getNative(0, 0);
1675525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS stat = NFA_STATUS_FAILED;
1676525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1677525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // Enable the "RC workaround" to allow our stack/firmware to work with a retail
1678525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // Nexus S that causes IOP issues.  Only enable if value exists and set to 1.
1679525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (GetNumValue(NAME_USE_NXP_P2P_RC_WORKAROUND, &num, sizeof(num)) && (num == 1))
1680525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1681525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#if (NCI_VERSION > NCI_VERSION_20791B0)
1682525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        UINT8  nfa_dm_rc_workaround[] = { 0x03, 0x0f, 0xab };
1683525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#else
1684525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        UINT8  nfa_dm_rc_workaround[] = { 0x01, 0x0f, 0xab, 0x01 };
1685525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#endif
1686525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1687525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: Configure RC work-around", __FUNCTION__);
1688525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard guard (sNfaSetConfigEvent);
1689525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        stat = NFA_SetConfig(NCI_PARAM_ID_FW_WORKAROUND, sizeof(nfa_dm_rc_workaround), &nfa_dm_rc_workaround[0]);
1690525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (stat == NFA_STATUS_OK)
1691525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaSetConfigEvent.wait ();
1692525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1693525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1694525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // If polling for Active mode, set the ordering so that we choose Active over Passive mode first.
1695525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (nat && (nat->tech_mask & (NFA_TECHNOLOGY_MASK_A_ACTIVE | NFA_TECHNOLOGY_MASK_F_ACTIVE)))
1696525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1697525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        UINT8  act_mode_order_param[] = { 0x01 };
1698525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard guard (sNfaSetConfigEvent);
1699525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        stat = NFA_SetConfig(NCI_PARAM_ID_ACT_ORDER, sizeof(act_mode_order_param), &act_mode_order_param[0]);
1700525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (stat == NFA_STATUS_OK)
1701525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaSetConfigEvent.wait ();
1702525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1703525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1704525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // Set configuration to allow UICC to Power off if there is no traffic.
1705525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (GetNumValue(NAME_UICC_IDLE_TIMEOUT, &num, sizeof(num)) && (num != 0))
1706525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1707525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // 61 => The least significant bit of this byte enables the power off when Idle mode.
1708525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // 00 87 93 03 == > These 4 bytes form a 4 byte value which decides the idle timeout(in us)
1709525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //                  value to trigger the uicc deactivation.
1710525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // e.g. in current example its value is 0x3938700 i.e. 60000000 is 60 seconds.
1711525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        UINT8  swpcfg_param[] = { 0x61, 0x00, 0x82, 0x04, 0x20, 0xA1, 0x07, 0x00,
1712525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                                  0x90, 0xD0, 0x03, 0x00, 0x00, 0x87, 0x93, 0x03 };
1713525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1714525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: Configure UICC idle-timeout to %lu ms", __FUNCTION__, num);
1715525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1716525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // Set the timeout from the .conf file value.
1717525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        num *= 1000;
1718525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        UINT8 * p = &swpcfg_param[12];
1719525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        UINT32_TO_STREAM(p, num)
1720525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1721525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard guard (sNfaSetConfigEvent);
1722525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        stat = NFA_SetConfig(NCI_PARAM_ID_SWPCFG, sizeof(swpcfg_param), &swpcfg_param[0]);
1723525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (stat == NFA_STATUS_OK)
1724525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaSetConfigEvent.wait ();
1725525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1726525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1727525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // Set antenna tuning configuration if configured.
1728525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define PREINIT_DSP_CFG_SIZE    30
1729525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    UINT8   preinit_dsp_param[PREINIT_DSP_CFG_SIZE];
1730525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1731525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (GetStrValue(NAME_PREINIT_DSP_CFG, (char*)&preinit_dsp_param[0], sizeof(preinit_dsp_param)))
1732525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1733525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard guard (sNfaSetConfigEvent);
1734525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        stat = NFA_SetConfig(NCI_PARAM_ID_PREINIT_DSP_CFG, sizeof(preinit_dsp_param), &preinit_dsp_param[0]);
1735525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (stat == NFA_STATUS_OK)
1736525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaSetConfigEvent.wait ();
1737525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1738525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1739525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1740525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1741525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1742525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1743525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_isNfcActive
1744525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1745525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Used externaly to determine if NFC is active or not.
1746525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1747525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         'true' if the NFC stack is running, else 'false'.
1748525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1749525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1750525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool nfcManager_isNfcActive()
1751525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1752525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return sIsNfaEnabled;
1753525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1754525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1755525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1756525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1757525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1758525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        startStopPolling
1759525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1760525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Start or stop polling.
1761525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  isStartPolling: true to start polling; false to stop polling.
1762525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1763525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None.
1764525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1765525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1766525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid startStopPolling (bool isStartPolling)
1767525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1768525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter; isStart=%u", __FUNCTION__, isStartPolling);
1769525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS stat = NFA_STATUS_FAILED;
1770525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1771525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    startRfDiscovery (false);
1772525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (isStartPolling)
1773525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1774525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        tNFA_TECHNOLOGY_MASK tech_mask = DEFAULT_TECH_MASK;
1775525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        unsigned long num = 0;
1776525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (GetNumValue(NAME_POLLING_TECH_MASK, &num, sizeof(num)))
1777525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            tech_mask = num;
1778525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1779525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard guard (sNfaEnableDisablePollingEvent);
1780525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: enable polling", __FUNCTION__);
1781525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        stat = NFA_EnablePolling (tech_mask);
1782525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (stat == NFA_STATUS_OK)
1783525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
1784525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: wait for enable event", __FUNCTION__);
1785525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_ENABLED_EVT
1786525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1787525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else
1788525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE ("%s: fail enable polling; error=0x%X", __FUNCTION__, stat);
1789525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1790525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else
1791525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1792525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard guard (sNfaEnableDisablePollingEvent);
1793525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: disable polling", __FUNCTION__);
1794525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        stat = NFA_DisablePolling ();
1795525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (stat == NFA_STATUS_OK)
1796525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
1797525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_DISABLED_EVT
1798525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1799525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else
1800525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE ("%s: fail disable polling; error=0x%X", __FUNCTION__, stat);
1801525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1802525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    startRfDiscovery (true);
1803525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
1804525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1805525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1806525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1807525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} /* namespace android */
1808