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"
249f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen#include "RoutingManager.h"
25525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "NfcTag.h"
26525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "config.h"
27525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "PowerSwitch.h"
28525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "JavaClassConstants.h"
29525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "Pn544Interop.h"
302534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes#include <ScopedLocalRef.h>
312534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes#include <ScopedUtfChars.h>
329f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen#include <ScopedPrimitiveArray.h>
33525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
34525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectextern "C"
35525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
36525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "nfa_api.h"
37525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "nfa_p2p_api.h"
38525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "rw_api.h"
39525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "nfa_ee_api.h"
40525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "nfc_brcm_defs.h"
41525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    #include "ce_api.h"
42525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
43525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
44525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectextern const UINT8 nfca_version_string [];
45a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuextern const UINT8 nfa_version_string [];
46a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuextern tNFA_DM_DISC_FREQ_CFG* p_nfa_dm_rf_disc_freq_cfg; //defined in stack
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;
51b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    extern void nativeNfcTag_doTransceiveStatus (tNFA_STATUS status, uint8_t * buf, uint32_t buflen);
52a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    extern void nativeNfcTag_notifyRfTimeout ();
53525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doConnectStatus (jboolean is_connect_ok);
54525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doDeactivateStatus (int status);
55525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doWriteStatus (jboolean is_write_ok);
56525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doCheckNdefResult (tNFA_STATUS status, uint32_t max_size, uint32_t current_size, uint8_t flags);
57525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doMakeReadonlyResult (tNFA_STATUS status);
58525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doPresenceCheckResult (tNFA_STATUS status);
59525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_formatStatus (bool is_ok);
60525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_resetPresenceCheck ();
61525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_doReadCompleted (tNFA_STATUS status);
62525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_abortWaits ();
63525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeLlcpConnectionlessSocket_abortWait ();
64525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeNfcTag_registerNdefTypeHandler ();
65525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    extern void nativeLlcpConnectionlessSocket_receiveData (uint8_t* data, uint32_t len, uint32_t remote_sap);
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**
71525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** public variables and functions
72525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
73525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/
74a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chubool                        gActivated = false;
75a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan ChuSyncEvent                   gDeactivatedEvent;
76525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
77525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android
78525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
79525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jmethodID               gCachedNfcManagerNotifyNdefMessageListeners;
80525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jmethodID               gCachedNfcManagerNotifyTransactionListeners;
81525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jmethodID               gCachedNfcManagerNotifyLlcpLinkActivation;
82525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    jmethodID               gCachedNfcManagerNotifyLlcpLinkDeactivated;
8357a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen    jmethodID               gCachedNfcManagerNotifyLlcpFirstPacketReceived;
849f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    jmethodID               gCachedNfcManagerNotifyHostEmuActivated;
859f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    jmethodID               gCachedNfcManagerNotifyHostEmuData;
869f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    jmethodID               gCachedNfcManagerNotifyHostEmuDeactivated;
87c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen    jmethodID               gCachedNfcManagerNotifyRfFieldActivated;
88c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen    jmethodID               gCachedNfcManagerNotifyRfFieldDeactivated;
89525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeP2pDeviceClassName                 = "com/android/nfc/dhimpl/NativeP2pDevice";
90525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeLlcpServiceSocketClassName         = "com/android/nfc/dhimpl/NativeLlcpServiceSocket";
91525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeLlcpConnectionlessSocketClassName  = "com/android/nfc/dhimpl/NativeLlcpConnectionlessSocket";
92525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeLlcpSocketClassName                = "com/android/nfc/dhimpl/NativeLlcpSocket";
93525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeNfcTagClassName                    = "com/android/nfc/dhimpl/NativeNfcTag";
94525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    const char*             gNativeNfcManagerClassName                = "com/android/nfc/dhimpl/NativeNfcManager";
95525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    void                    doStartupConfig ();
96525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    void                    startStopPolling (bool isStartPolling);
97525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    void                    startRfDiscovery (bool isStart);
98525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
99525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
100525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
101525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*****************************************************************************
102525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
103525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** private variables and functions
104525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
105525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/
106525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android
107525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
108525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jint                 sLastError = ERROR_BUFFER_TOO_SMALL;
109525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jmethodID            sCachedNfcManagerNotifySeApduReceived;
110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jmethodID            sCachedNfcManagerNotifySeMifareAccess;
111525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jmethodID            sCachedNfcManagerNotifySeEmvCardRemoval;
112525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jmethodID            sCachedNfcManagerNotifyTargetDeselected;
113525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent            sNfaEnableEvent;  //event for NFA_Enable()
114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent            sNfaDisableEvent;  //event for NFA_Disable()
115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent            sNfaEnableDisablePollingEvent;  //event for NFA_EnablePolling(), NFA_DisablePolling()
116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent            sNfaSetConfigEvent;  // event for Set_Config....
117f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenenstatic SyncEvent            sNfaGetConfigEvent;  // event for Get_Config....
118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sIsNfaEnabled = false;
1190799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Moralesstatic bool                 sDiscoveryEnabled = false;  //is polling or listening
1200799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Moralesstatic bool                 sPollingEnabled = false;  //is polling for tag?
121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sIsDisabling = false;
122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sRfEnabled = false; // whether RF discovery is enabled
123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sSeRfActive = false;  // whether RF with SE is likely active
124c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenenstatic bool                 sReaderModeEnabled = false; // whether we're only reading tags, not allowing P2p/card emu
12531b0f4653686119d74876cae5d637c5baf52b935Andres Moralesstatic bool                 sP2pEnabled = false;
126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sP2pActive = false; // whether p2p was last active
127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool                 sAbortConnlessWait = false;
128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define CONFIG_UPDATE_TECH_MASK     (1 << 1)
129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define DEFAULT_TECH_MASK           (NFA_TECHNOLOGY_MASK_A \
130525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                                     | NFA_TECHNOLOGY_MASK_B \
131525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                                     | NFA_TECHNOLOGY_MASK_F \
132525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                                     | NFA_TECHNOLOGY_MASK_ISO15693 \
133525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                                     | NFA_TECHNOLOGY_MASK_B_PRIME \
134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                                     | NFA_TECHNOLOGY_MASK_A_ACTIVE \
13597a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu                                     | NFA_TECHNOLOGY_MASK_F_ACTIVE \
13697a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu                                     | NFA_TECHNOLOGY_MASK_KOVIO)
137c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen#define DEFAULT_DISCOVERY_DURATION       500
1388d154680537afa5242edeb98c8f414d6186558cfMartijn Coenen#define READER_MODE_DISCOVERY_DURATION   200
139525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
140525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void nfaConnectionCallback (UINT8 event, tNFA_CONN_EVT_DATA *eventData);
141525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void nfaDeviceManagementCallback (UINT8 event, tNFA_DM_CBACK_DATA *eventData);
142525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool isPeerToPeer (tNFA_ACTIVATED& activated);
143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool isListenMode(tNFA_ACTIVATED& activated);
144d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Moralesstatic void enableDisableLptd (bool enable);
1450799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Moralesstatic tNFA_STATUS stopPolling_rfDiscoveryDisabled();
1460799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Moralesstatic tNFA_STATUS startPolling_rfDiscoveryDisabled(tNFA_TECHNOLOGY_MASK tech_mask);
147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
148f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenenstatic UINT16 sCurrentConfigLen;
149f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenenstatic UINT8 sConfig[256];
150c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen
151525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/////////////////////////////////////////////////////////////
152525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/////////////////////////////////////////////////////////////
153525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
154525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
155525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
156525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
157525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        getNative
158525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
159525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Get native data
160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
161525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Native data structure.
162525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnfc_jni_native_data *getNative (JNIEnv* e, jobject o)
165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    static struct nfc_jni_native_data *sCachedNat = NULL;
167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (e)
168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sCachedNat = nfc_jni_get_nat(e, o);
170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return sCachedNat;
172525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
173525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
174525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
175525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
176525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
177525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        handleRfDiscoveryEvent
178525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
179525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Handle RF-discovery events from the stack.
180525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  discoveredDevice: Discovered device.
181525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
182525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
183525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
184525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
185525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void handleRfDiscoveryEvent (tNFC_RESULT_DEVT* discoveredDevice)
186525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
187525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (discoveredDevice->more)
188525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
189525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //there is more discovery notification coming
190525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return;
191525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
193525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    bool isP2p = NfcTag::getInstance ().isP2pDiscovered ();
194c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen    if (!sReaderModeEnabled && isP2p)
195525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
196525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //select the peer that supports P2P
197525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcTag::getInstance ().selectP2p();
198525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
199525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else
200525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
201525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //select the first of multiple tags that is discovered
202525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcTag::getInstance ().selectFirstTag();
203525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
204525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
205525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
206525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
207525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
208525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
209525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfaConnectionCallback
210525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
211525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Receive connection-related events from stack.
212525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  connEvent: Event code.
213525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  eventData: Event data.
214525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
215525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
216525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
217525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
218525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void nfaConnectionCallback (UINT8 connEvent, tNFA_CONN_EVT_DATA* eventData)
219525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
220525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS status = NFA_STATUS_FAILED;
221525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD("%s: event= %u", __FUNCTION__, connEvent);
222525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
223525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    switch (connEvent)
224525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
225525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_POLL_ENABLED_EVT: // whether polling successfully started
226525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
227525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD("%s: NFA_POLL_ENABLED_EVT: status = %u", __FUNCTION__, eventData->status);
228525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
229525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaEnableDisablePollingEvent);
230525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableDisablePollingEvent.notifyOne ();
231525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
232525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
233525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
234525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_POLL_DISABLED_EVT: // Listening/Polling stopped
235525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
236525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD("%s: NFA_POLL_DISABLED_EVT: status = %u", __FUNCTION__, eventData->status);
237525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
238525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaEnableDisablePollingEvent);
239525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableDisablePollingEvent.notifyOne ();
240525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
241525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
242525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
243525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_RF_DISCOVERY_STARTED_EVT: // RF Discovery started
244525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
245525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD("%s: NFA_RF_DISCOVERY_STARTED_EVT: status = %u", __FUNCTION__, eventData->status);
246525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
247525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaEnableDisablePollingEvent);
248525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableDisablePollingEvent.notifyOne ();
249525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
250525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
251525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
252525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_RF_DISCOVERY_STOPPED_EVT: // RF Discovery stopped event
253525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD("%s: NFA_RF_DISCOVERY_STOPPED_EVT: status = %u", __FUNCTION__, eventData->status);
255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
256525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaEnableDisablePollingEvent);
257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableDisablePollingEvent.notifyOne ();
258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
259525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
260525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
261525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DISC_RESULT_EVT: // NFC link/protocol discovery notificaiton
262525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = eventData->disc_result.status;
263525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_DISC_RESULT_EVT: status = %d", __FUNCTION__, status);
264525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (status != NFA_STATUS_OK)
265525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
266525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE("%s: NFA_DISC_RESULT_EVT error: status = %d", __FUNCTION__, status);
267525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
268525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else
269525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
270525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NfcTag::getInstance().connectionEventHandler(connEvent, eventData);
271525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            handleRfDiscoveryEvent(&eventData->disc_result.discovery_ntf);
272525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
273525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
274525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
275525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_SELECT_RESULT_EVT: // NFC link/protocol discovery select response
276525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_SELECT_RESULT_EVT: status = %d, gIsSelectingRfInterface = %d, sIsDisabling=%d", __FUNCTION__, eventData->status, gIsSelectingRfInterface, sIsDisabling);
277525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
278525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (sIsDisabling)
279525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
280525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
281525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (eventData->status != NFA_STATUS_OK)
282525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
283525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (gIsSelectingRfInterface)
284525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
285525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                nativeNfcTag_doConnectStatus(false);
286525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
287525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
288525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE("%s: NFA_SELECT_RESULT_EVT error: status = %d", __FUNCTION__, eventData->status);
289525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NFA_Deactivate (FALSE);
290525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
291525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
292525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
293525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DEACTIVATE_FAIL_EVT:
294525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_DEACTIVATE_FAIL_EVT: status = %d", __FUNCTION__, eventData->status);
295525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
296525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
297525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_ACTIVATED_EVT: // NFC link/protocol activated
298525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_ACTIVATED_EVT: gIsSelectingRfInterface=%d, sIsDisabling=%d", __FUNCTION__, gIsSelectingRfInterface, sIsDisabling);
299a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        NfcTag::getInstance().setActive(true);
300b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen        if (sIsDisabling || !sIsNfaEnabled)
301525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
302a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        gActivated = true;
303525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
304525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcTag::getInstance().setActivationState ();
305525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (gIsSelectingRfInterface)
306525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
307525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            nativeNfcTag_doConnectStatus(true);
308525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            break;
309525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
310525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
311525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_resetPresenceCheck();
312525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (isPeerToPeer(eventData->activated))
313525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
314f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen            if (sReaderModeEnabled)
315f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen            {
316f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen                ALOGD("%s: ignoring peer target in reader mode.", __FUNCTION__);
317f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen                NFA_Deactivate (FALSE);
318f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen                break;
319f5cd84c3a7ffb66196ab3c0745569da937d7533bMartijn Coenen            }
320525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sP2pActive = true;
321525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD("%s: NFA_ACTIVATED_EVT; is p2p", __FUNCTION__);
322525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            // Disable RF field events in case of p2p
323525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            UINT8  nfa_disable_rf_events[] = { 0x00 };
324525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: Disabling RF field events", __FUNCTION__);
325525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            status = NFA_SetConfig(NCI_PARAM_ID_RF_FIELD_INFO, sizeof(nfa_disable_rf_events),
326525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    &nfa_disable_rf_events[0]);
327525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (status == NFA_STATUS_OK) {
328525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGD ("%s: Disabled RF field events", __FUNCTION__);
329525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            } else {
330525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGE ("%s: Failed to disable RF field events", __FUNCTION__);
331525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
332525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
333525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else if (pn544InteropIsBusy() == false)
334525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
335525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NfcTag::getInstance().connectionEventHandler (connEvent, eventData);
336525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
337525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            // We know it is not activating for P2P.  If it activated in
33857a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen            // listen mode then it is likely for an SE transaction.
339525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            // Send the RF Event.
340525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (isListenMode(eventData->activated))
341525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
342525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sSeRfActive = true;
343525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
344525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
345525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
346525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
347525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DEACTIVATED_EVT: // NFC link/protocol deactivated
348525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_DEACTIVATED_EVT   Type: %u, gIsTagDeactivating: %d", __FUNCTION__, eventData->deactivated.type,gIsTagDeactivating);
349525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcTag::getInstance().setDeactivationState (eventData->deactivated);
350525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (eventData->deactivated.type != NFA_DEACTIVATE_TYPE_SLEEP)
351525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
352a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            {
353a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                SyncEventGuard g (gDeactivatedEvent);
354a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                gActivated = false; //guard this variable from multi-threaded access
355a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                gDeactivatedEvent.notifyOne ();
356a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            }
357525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            nativeNfcTag_resetPresenceCheck();
358525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NfcTag::getInstance().connectionEventHandler (connEvent, eventData);
359525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            nativeNfcTag_abortWaits();
360525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NfcTag::getInstance().abort ();
361525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
362525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else if (gIsTagDeactivating)
363525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
364a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            NfcTag::getInstance().setActive(false);
365525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            nativeNfcTag_doDeactivateStatus(0);
366525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
367525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
368525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // If RF is activated for what we think is a Secure Element transaction
369525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // and it is deactivated to either IDLE or DISCOVERY mode, notify w/event.
370525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if ((eventData->deactivated.type == NFA_DEACTIVATE_TYPE_IDLE)
371525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                || (eventData->deactivated.type == NFA_DEACTIVATE_TYPE_DISCOVERY))
372525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
373525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (sSeRfActive) {
374525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sSeRfActive = false;
375525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            } else if (sP2pActive) {
376525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sP2pActive = false;
377525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                // Make sure RF field events are re-enabled
378b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen                ALOGD("%s: NFA_DEACTIVATED_EVT; is p2p", __FUNCTION__);
379525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                // Disable RF field events in case of p2p
380525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                UINT8  nfa_enable_rf_events[] = { 0x01 };
381525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
382b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen                if (!sIsDisabling && sIsNfaEnabled)
383b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen                {
384b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen                    ALOGD ("%s: Enabling RF field events", __FUNCTION__);
385b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen                    status = NFA_SetConfig(NCI_PARAM_ID_RF_FIELD_INFO, sizeof(nfa_enable_rf_events),
386b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen                            &nfa_enable_rf_events[0]);
387b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen                    if (status == NFA_STATUS_OK) {
388b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen                        ALOGD ("%s: Enabled RF field events", __FUNCTION__);
389b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen                    } else {
390b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen                        ALOGE ("%s: Failed to enable RF field events", __FUNCTION__);
391b408fc371821c397b47c8722c339c6b4359e062fMartijn Coenen                    }
392525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                }
393525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
394525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
395525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
396525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
397525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
398525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_TLV_DETECT_EVT: // TLV Detection complete
399525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = eventData->tlv_detect.status;
400525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_TLV_DETECT_EVT: status = %d, protocol = %d, num_tlvs = %d, num_bytes = %d",
401525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             __FUNCTION__, status, eventData->tlv_detect.protocol,
402525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->tlv_detect.num_tlvs, eventData->tlv_detect.num_bytes);
403525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (status != NFA_STATUS_OK)
404525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
405525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE("%s: NFA_TLV_DETECT_EVT error: status = %d", __FUNCTION__, status);
406525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
407525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
408525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
409525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_NDEF_DETECT_EVT: // NDEF Detection complete;
410525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //if status is failure, it means the tag does not contain any or valid NDEF data;
411525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //pass the failure status to the NFC Service;
412525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = eventData->ndef_detect.status;
413525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_NDEF_DETECT_EVT: status = 0x%X, protocol = %u, "
414525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             "max_size = %lu, cur_size = %lu, flags = 0x%X", __FUNCTION__,
415525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             status,
416525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->ndef_detect.protocol, eventData->ndef_detect.max_size,
417525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->ndef_detect.cur_size, eventData->ndef_detect.flags);
418525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcTag::getInstance().connectionEventHandler (connEvent, eventData);
419525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_doCheckNdefResult(status,
420525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            eventData->ndef_detect.max_size, eventData->ndef_detect.cur_size,
421525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            eventData->ndef_detect.flags);
422525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
423525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
424525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DATA_EVT: // Data message received (for non-NDEF reads)
425b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        ALOGD("%s: NFA_DATA_EVT: status = 0x%X, len = %d", __FUNCTION__, eventData->status, eventData->data.len);
426b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        nativeNfcTag_doTransceiveStatus(eventData->status, eventData->data.p_data, eventData->data.len);
427525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
428a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    case NFA_RW_INTF_ERROR_EVT:
429a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        ALOGD("%s: NFC_RW_INTF_ERROR_EVT", __FUNCTION__);
430a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        nativeNfcTag_notifyRfTimeout();
431b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen        nativeNfcTag_doReadCompleted (NFA_STATUS_TIMEOUT);
432a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        break;
433525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_SELECT_CPLT_EVT: // Select completed
434525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        status = eventData->status;
435525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_SELECT_CPLT_EVT: status = %d", __FUNCTION__, status);
436525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (status != NFA_STATUS_OK)
437525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
438525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE("%s: NFA_SELECT_CPLT_EVT error: status = %d", __FUNCTION__, status);
439525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
440525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
441525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
442525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_READ_CPLT_EVT: // NDEF-read or tag-specific-read completed
443525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_READ_CPLT_EVT: status = 0x%X", __FUNCTION__, eventData->status);
444525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_doReadCompleted (eventData->status);
445525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcTag::getInstance().connectionEventHandler (connEvent, eventData);
446525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
447525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
448525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_WRITE_CPLT_EVT: // Write completed
449525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_WRITE_CPLT_EVT: status = %d", __FUNCTION__, eventData->status);
450525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_doWriteStatus (eventData->status == NFA_STATUS_OK);
451525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
452525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
453525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_SET_TAG_RO_EVT: // Tag set as Read only
454525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_SET_TAG_RO_EVT: status = %d", __FUNCTION__, eventData->status);
455525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_doMakeReadonlyResult(eventData->status);
456525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
457525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
458525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_CE_NDEF_WRITE_START_EVT: // NDEF write started
459525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_CE_NDEF_WRITE_START_EVT: status: %d", __FUNCTION__, eventData->status);
460525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
461525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (eventData->status != NFA_STATUS_OK)
462525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE("%s: NFA_CE_NDEF_WRITE_START_EVT error: status = %d", __FUNCTION__, eventData->status);
463525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
464525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
465525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_CE_NDEF_WRITE_CPLT_EVT: // NDEF write completed
466525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: FA_CE_NDEF_WRITE_CPLT_EVT: len = %lu", __FUNCTION__, eventData->ndef_write_cplt.len);
467525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
468525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
469525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_LLCP_ACTIVATED_EVT: // LLCP link is activated
470525c260303268a83da4c3413b953d13c9084e834The 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",
471525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             __FUNCTION__,
472525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->llcp_activated.is_initiator,
473525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->llcp_activated.remote_wks,
474525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->llcp_activated.remote_lsc,
475525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->llcp_activated.remote_link_miu,
476525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project             eventData->llcp_activated.local_link_miu);
477525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
478525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PeerToPeer::getInstance().llcpActivatedHandler (getNative(0, 0), eventData->llcp_activated);
479525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
480525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
481525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_LLCP_DEACTIVATED_EVT: // LLCP link is deactivated
482525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_LLCP_DEACTIVATED_EVT", __FUNCTION__);
483525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PeerToPeer::getInstance().llcpDeactivatedHandler (getNative(0, 0), eventData->llcp_deactivated);
484525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
48557a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen    case NFA_LLCP_FIRST_PACKET_RECEIVED_EVT: // Received first packet over llcp
48657a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen        ALOGD("%s: NFA_LLCP_FIRST_PACKET_RECEIVED_EVT", __FUNCTION__);
48757a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen        PeerToPeer::getInstance().llcpFirstPacketHandler (getNative(0, 0));
48857a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen        break;
489525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_PRESENCE_CHECK_EVT:
490525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_PRESENCE_CHECK_EVT", __FUNCTION__);
491525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_doPresenceCheckResult (eventData->status);
492525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
493525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_FORMAT_CPLT_EVT:
494525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_FORMAT_CPLT_EVT: status=0x%X", __FUNCTION__, eventData->status);
495525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        nativeNfcTag_formatStatus (eventData->status == NFA_STATUS_OK);
496525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
497525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
498525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_I93_CMD_CPLT_EVT:
499525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_I93_CMD_CPLT_EVT: status=0x%X", __FUNCTION__, eventData->status);
500525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
501525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
502525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_CE_UICC_LISTEN_CONFIGURED_EVT :
503525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_CE_UICC_LISTEN_CONFIGURED_EVT : status=0x%X", __FUNCTION__, eventData->status);
504525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
505525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
506525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_SET_P2P_LISTEN_TECH_EVT:
507525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD("%s: NFA_SET_P2P_LISTEN_TECH_EVT", __FUNCTION__);
508525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PeerToPeer::getInstance().connectionEventHandler (connEvent, eventData);
509525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
510525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
511525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    default:
512525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE("%s: unknown event ????", __FUNCTION__);
513525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
514525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
515525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
516525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
517525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
518525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
519525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
520525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_initNativeStruc
521525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
522525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Initialize variables.
523525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
524525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
525525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
526525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if ok.
527525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
528525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
529525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean nfcManager_initNativeStruc (JNIEnv* e, jobject o)
530525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
531525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
532525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
5332534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    nfc_jni_native_data* nat = (nfc_jni_native_data*)malloc(sizeof(struct nfc_jni_native_data));
534525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (nat == NULL)
535525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
536525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: fail allocate native data", __FUNCTION__);
537525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_FALSE;
538525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
539525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
540525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    memset (nat, 0, sizeof(*nat));
5412534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->GetJavaVM(&(nat->vm));
5422534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    nat->env_version = e->GetVersion();
5432534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    nat->manager = e->NewGlobalRef(o);
544525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
5452534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jclass> cls(e, e->GetObjectClass(o));
546fb18ffb259fe8f40e81516842497735a7c0b6a8cAndres Morales    jfieldID f = e->GetFieldID(cls.get(), "mNative", "J");
547fb18ffb259fe8f40e81516842497735a7c0b6a8cAndres Morales    e->SetLongField(o, f, (jlong)nat);
548525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
549525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Initialize native cached references */
5502534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    gCachedNfcManagerNotifyNdefMessageListeners = e->GetMethodID(cls.get(),
551525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            "notifyNdefMessageListeners", "(Lcom/android/nfc/dhimpl/NativeNfcTag;)V");
5522534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    gCachedNfcManagerNotifyLlcpLinkActivation = e->GetMethodID(cls.get(),
553525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            "notifyLlcpLinkActivation", "(Lcom/android/nfc/dhimpl/NativeP2pDevice;)V");
5542534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    gCachedNfcManagerNotifyLlcpLinkDeactivated = e->GetMethodID(cls.get(),
555525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            "notifyLlcpLinkDeactivated", "(Lcom/android/nfc/dhimpl/NativeP2pDevice;)V");
55657a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen    gCachedNfcManagerNotifyLlcpFirstPacketReceived = e->GetMethodID(cls.get(),
55757a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen            "notifyLlcpLinkFirstPacketReceived", "(Lcom/android/nfc/dhimpl/NativeP2pDevice;)V");
558525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
5599f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    gCachedNfcManagerNotifyHostEmuActivated = e->GetMethodID(cls.get(),
5609f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen            "notifyHostEmuActivated", "()V");
5619f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
5629f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    gCachedNfcManagerNotifyHostEmuData = e->GetMethodID(cls.get(),
5639f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen            "notifyHostEmuData", "([B)V");
5649f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
5659f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    gCachedNfcManagerNotifyHostEmuDeactivated = e->GetMethodID(cls.get(),
5669f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen            "notifyHostEmuDeactivated", "()V");
5679f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
568c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen    gCachedNfcManagerNotifyRfFieldActivated = e->GetMethodID(cls.get(),
569c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            "notifyRfFieldActivated", "()V");
570c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen    gCachedNfcManagerNotifyRfFieldDeactivated = e->GetMethodID(cls.get(),
571c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            "notifyRfFieldDeactivated", "()V");
572c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen
5732534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    if (nfc_jni_cache_object(e, gNativeNfcTagClassName, &(nat->cached_NfcTag)) == -1)
574525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
575525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: fail cache NativeNfcTag", __FUNCTION__);
576525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_FALSE;
577525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
578525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
5792534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    if (nfc_jni_cache_object(e, gNativeP2pDeviceClassName, &(nat->cached_P2pDevice)) == -1)
580525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
581525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: fail cache NativeP2pDevice", __FUNCTION__);
582525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_FALSE;
583525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
584525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
585525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
586525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return JNI_TRUE;
587525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
588525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
589525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
590525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
591525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
592525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfaDeviceManagementCallback
593525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
594525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Receive device management events from stack.
595525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  dmEvent: Device-management event ID.
596525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  eventData: Data associated with event ID.
597525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
598525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
599525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
600525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
601525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nfaDeviceManagementCallback (UINT8 dmEvent, tNFA_DM_CBACK_DATA* eventData)
602525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
603525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter; event=0x%X", __FUNCTION__, dmEvent);
604525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
605525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    switch (dmEvent)
606525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
607525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_ENABLE_EVT: /* Result of NFA_Enable */
608525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
609525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaEnableEvent);
610525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: NFA_DM_ENABLE_EVT; status=0x%X",
611525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    __FUNCTION__, eventData->status);
612525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sIsNfaEnabled = eventData->status == NFA_STATUS_OK;
613525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sIsDisabling = false;
614525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaEnableEvent.notifyOne ();
615525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
616525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
617525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
618525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_DISABLE_EVT: /* Result of NFA_Disable */
619525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
620525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaDisableEvent);
621525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: NFA_DM_DISABLE_EVT", __FUNCTION__);
622525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sIsNfaEnabled = false;
623525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sIsDisabling = false;
624525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaDisableEvent.notifyOne ();
625525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
626525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
627525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
628525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_SET_CONFIG_EVT: //result of NFA_SetConfig
629525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: NFA_DM_SET_CONFIG_EVT", __FUNCTION__);
630525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
631525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaSetConfigEvent);
632525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaSetConfigEvent.notifyOne();
633525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
634525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
635525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
636525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_GET_CONFIG_EVT: /* Result of NFA_GetConfig */
637525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: NFA_DM_GET_CONFIG_EVT", __FUNCTION__);
638f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen        {
639f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen            SyncEventGuard guard (sNfaGetConfigEvent);
640f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen            if (eventData->status == NFA_STATUS_OK &&
641f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen                    eventData->get_config.tlv_size <= sizeof(sConfig))
642f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen            {
643f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen                sCurrentConfigLen = eventData->get_config.tlv_size;
644f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen                memcpy(sConfig, eventData->get_config.param_tlvs, eventData->get_config.tlv_size);
645f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen            }
646f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen            else
647f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen            {
648f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen                ALOGE("%s: NFA_DM_GET_CONFIG failed", __FUNCTION__);
649f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen                sCurrentConfigLen = 0;
650f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen            }
651f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen            sNfaGetConfigEvent.notifyOne();
652f5954743f1d8b8ace641880fd55466fff4d914cbMartijn Coenen        }
653525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
654525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
655525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_RF_FIELD_EVT:
656525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: NFA_DM_RF_FIELD_EVT; status=0x%X; field status=%u", __FUNCTION__,
657525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project              eventData->rf_field.status, eventData->rf_field.rf_field_status);
658c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen        if (!sP2pActive && eventData->rf_field.status == NFA_STATUS_OK)
659c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen        {
660c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            struct nfc_jni_native_data *nat = getNative(NULL, NULL);
661c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            JNIEnv* e = NULL;
662c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            ScopedAttach attach(nat->vm, &e);
663c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            if (e == NULL)
664c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            {
665c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen                ALOGE ("jni env is null");
666c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen                return;
667c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            }
668c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            if (eventData->rf_field.rf_field_status == NFA_DM_RF_FIELD_ON)
669c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen                e->CallVoidMethod (nat->manager, android::gCachedNfcManagerNotifyRfFieldActivated);
670c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen            else
671c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen                e->CallVoidMethod (nat->manager, android::gCachedNfcManagerNotifyRfFieldDeactivated);
672c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen        }
673525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
674525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
675525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_NFCC_TRANSPORT_ERR_EVT:
676525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_NFCC_TIMEOUT_EVT:
677525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
678525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (dmEvent == NFA_DM_NFCC_TIMEOUT_EVT)
679a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                ALOGE ("%s: NFA_DM_NFCC_TIMEOUT_EVT; abort", __FUNCTION__);
680a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            else if (dmEvent == NFA_DM_NFCC_TRANSPORT_ERR_EVT)
681a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu                ALOGE ("%s: NFA_DM_NFCC_TRANSPORT_ERR_EVT; abort", __FUNCTION__);
682525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
683525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            nativeNfcTag_abortWaits();
684525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NfcTag::getInstance().abort ();
685525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sAbortConnlessWait = true;
686525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            nativeLlcpConnectionlessSocket_abortWait();
687525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
688525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGD ("%s: aborting  sNfaEnableDisablePollingEvent", __FUNCTION__);
689525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                SyncEventGuard guard (sNfaEnableDisablePollingEvent);
690525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sNfaEnableDisablePollingEvent.notifyOne();
691525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
692525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
693525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGD ("%s: aborting  sNfaEnableEvent", __FUNCTION__);
694525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                SyncEventGuard guard (sNfaEnableEvent);
695525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sNfaEnableEvent.notifyOne();
696525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
697525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
698525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                ALOGD ("%s: aborting  sNfaDisableEvent", __FUNCTION__);
699525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                SyncEventGuard guard (sNfaDisableEvent);
700525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sNfaDisableEvent.notifyOne();
701525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
702525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sDiscoveryEnabled = false;
7030799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales            sPollingEnabled = false;
704525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            PowerSwitch::getInstance ().abort ();
705525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
706525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (!sIsDisabling && sIsNfaEnabled)
707525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
708525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                NFA_Disable(FALSE);
709525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sIsDisabling = true;
710525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
711525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            else
712525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
713525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sIsNfaEnabled = false;
714525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sIsDisabling = false;
715525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
716525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            PowerSwitch::getInstance ().initialize (PowerSwitch::UNKNOWN_LEVEL);
717a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            ALOGE ("%s: crash NFC service", __FUNCTION__);
718a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            //////////////////////////////////////////////
719a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            //crash the NFC service process so it can restart automatically
720a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            abort ();
721a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu            //////////////////////////////////////////////
722525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
723525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
724525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
725525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    case NFA_DM_PWR_MODE_CHANGE_EVT:
726525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PowerSwitch::getInstance ().deviceManagementCallback (dmEvent, eventData);
727525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
728525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
729525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    default:
730525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: unhandled event", __FUNCTION__);
731525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        break;
732525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
733525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
734525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
7359f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen/*******************************************************************************
7369f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
7379f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Function:        nfcManager_sendRawFrame
7389f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
7399f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Description:     Send a raw frame.
7409f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**                  e: JVM environment.
7419f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**                  o: Java object.
7429f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
7439f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Returns:         True if ok.
7449f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
7459f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen*******************************************************************************/
746c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenenstatic jboolean nfcManager_sendRawFrame (JNIEnv* e, jobject, jbyteArray data)
7479f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen{
7489f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    ScopedByteArrayRO bytes(e, data);
7499f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0]));
7509f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    size_t bufLen = bytes.size();
7519f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    tNFA_STATUS status = NFA_SendRawFrame (buf, bufLen, 0);
7529f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
7539f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    return (status == NFA_STATUS_OK);
7549f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen}
7559f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
7569f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen/*******************************************************************************
7579f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
7589f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Function:        nfcManager_routeAid
7599f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
7609f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Description:     Route an AID to an EE
7619f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**                  e: JVM environment.
7629f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**                  o: Java object.
7639f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
7649f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Returns:         True if ok.
7659f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
7669f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen*******************************************************************************/
767c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenenstatic jboolean nfcManager_routeAid (JNIEnv* e, jobject, jbyteArray aid, jint route)
7689f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen{
7699f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    ScopedByteArrayRO bytes(e, aid);
7709f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0]));
7719f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    size_t bufLen = bytes.size();
7729f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    bool result = RoutingManager::getInstance().addAidRouting(buf, bufLen, route);
7739f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    return result;
7749f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen}
7759f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
7769f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen/*******************************************************************************
7779f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
7789f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Function:        nfcManager_unrouteAid
7799f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
7809f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Description:     Remove a AID routing
7819f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**                  e: JVM environment.
7829f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**                  o: Java object.
7839f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
7849f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen** Returns:         True if ok.
7859f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen**
7869f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen*******************************************************************************/
787c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenenstatic jboolean nfcManager_unrouteAid (JNIEnv* e, jobject, jbyteArray aid)
7889f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen{
7899f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    ScopedByteArrayRO bytes(e, aid);
7909f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0]));
7919f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    size_t bufLen = bytes.size();
7929f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    bool result = RoutingManager::getInstance().removeAidRouting(buf, bufLen);
7939f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    return result;
7949f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen}
795525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
796525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
797525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
798f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen** Function:        nfcManager_commitRouting
799f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen**
800f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen** Description:     Sends the AID routing table to the controller
801f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen**                  e: JVM environment.
802f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen**                  o: Java object.
803f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen**
804f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen** Returns:         True if ok.
805f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen**
806f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen*******************************************************************************/
807f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenenstatic jboolean nfcManager_commitRouting (JNIEnv* e, jobject)
808f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen{
809f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen    return RoutingManager::getInstance().commitRouting();
810f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen}
811f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen
812f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen/*******************************************************************************
813f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen**
814525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doInitialize
815525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
816525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Turn on NFC.
817525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
818525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
819525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
820525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if ok.
821525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
822525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
823304a6342ee7e5620d3b50d988755c035f1686dc2Martijn Coenenstatic jboolean nfcManager_doInitialize (JNIEnv* e, jobject o)
824525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
825a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    ALOGD ("%s: enter; ver=%s nfa=%s NCI_VERSION=0x%02X",
826a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        __FUNCTION__, nfca_version_string, nfa_version_string, NCI_VERSION);
827525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS stat = NFA_STATUS_OK;
828525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
829d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    PowerSwitch & powerSwitch = PowerSwitch::getInstance ();
830d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales
831525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sIsNfaEnabled)
832525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
833525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: already enabled", __FUNCTION__);
834525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
835525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
836525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
837d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    powerSwitch.initialize (PowerSwitch::FULL_POWER);
838525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
839525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
840525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        unsigned long num = 0;
841525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
842525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        NfcAdaptation& theInstance = NfcAdaptation::GetInstance();
843525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        theInstance.Initialize(); //start GKI, NCI task, NFC task
844525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
845525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
846525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            SyncEventGuard guard (sNfaEnableEvent);
847525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            tHAL_NFC_ENTRY* halFuncEntries = theInstance.GetHalEntryFuncs ();
848525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
849525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            NFA_Init (halFuncEntries);
850525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
851525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            stat = NFA_Enable (nfaDeviceManagementCallback, nfaConnectionCallback);
852525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (stat == NFA_STATUS_OK)
853525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
854525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                num = initializeGlobalAppLogLevel ();
855525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                CE_SetTraceLevel (num);
856525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                LLCP_SetTraceLevel (num);
857525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                NFC_SetTraceLevel (num);
858525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                RW_SetTraceLevel (num);
859525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                NFA_SetTraceLevel (num);
860525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                NFA_P2pSetTraceLevel (num);
861525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                sNfaEnableEvent.wait(); //wait for NFA command to finish
862525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
863525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
864525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
865525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (stat == NFA_STATUS_OK)
866525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
867525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            //sIsNfaEnabled indicates whether stack started successfully
868525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            if (sIsNfaEnabled)
869525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            {
8709f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen                RoutingManager::getInstance().initialize(getNative(e, o));
871525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                nativeNfcTag_registerNdefTypeHandler ();
872525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                NfcTag::getInstance().initialize (getNative(e, o));
873525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                PeerToPeer::getInstance().initialize ();
874525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                PeerToPeer::getInstance().handleNfcOnOff (true);
875525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
876525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                /////////////////////////////////////////////////////////////////////////////////
877525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                // Add extra configuration here (work-arounds, etc.)
878525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
879525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                struct nfc_jni_native_data *nat = getNative(e, o);
880525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
881525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                if ( nat )
882525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                {
883525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    if (GetNumValue(NAME_POLLING_TECH_MASK, &num, sizeof(num)))
884525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        nat->tech_mask = num;
885525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    else
886525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                        nat->tech_mask = DEFAULT_TECH_MASK;
887525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                    ALOGD ("%s: tag polling tech mask=0x%X", __FUNCTION__, nat->tech_mask);
888525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                }
889525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
890525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                // if this value exists, set polling interval.
891525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                if (GetNumValue(NAME_NFA_DM_DISC_DURATION_POLL, &num, sizeof(num)))
892c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen                    nat->discovery_duration = num;
893c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen                else
894c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen                    nat->discovery_duration = DEFAULT_DISCOVERY_DURATION;
895c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen
896c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen                NFA_SetRfDiscoveryDuration(nat->discovery_duration);
897525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
898525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                // Do custom NFCA startup configuration.
899525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                doStartupConfig();
900525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project                goto TheEnd;
901525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            }
902525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
903525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
904525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: fail nfa enable; error=0x%X", __FUNCTION__, stat);
905525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
906525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (sIsNfaEnabled)
907525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            stat = NFA_Disable (FALSE /* ungraceful */);
908525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
909525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        theInstance.Finalize();
910525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
911525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
912525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd:
913525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sIsNfaEnabled)
914525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER);
915525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
916525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return sIsNfaEnabled ? JNI_TRUE : JNI_FALSE;
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**
922525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_enableDiscovery
923525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
924525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Start polling and listening for devices.
925525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
926525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
927d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales**                  technologies_mask: the bitmask of technologies for which to enable discovery
928d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales**                  enable_lptd: whether to enable low power polling (default: false)
929525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
930525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
931525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
932525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
933d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Moralesstatic void nfcManager_enableDiscovery (JNIEnv* e, jobject o, jint technologies_mask, \
93431b0f4653686119d74876cae5d637c5baf52b935Andres Morales    jboolean enable_lptd, jboolean reader_mode, jboolean enable_host_routing, jboolean enable_p2p,
9350799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    jboolean restart)
936525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
937525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_TECHNOLOGY_MASK tech_mask = DEFAULT_TECH_MASK;
938525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    struct nfc_jni_native_data *nat = getNative(e, o);
939525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
9400799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    if (technologies_mask == -1 && nat)
941525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        tech_mask = (tNFA_TECHNOLOGY_MASK)nat->tech_mask;
9420799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    else if (technologies_mask != -1)
943d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales        tech_mask = (tNFA_TECHNOLOGY_MASK) technologies_mask;
944525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter; tech_mask = %02x", __FUNCTION__, tech_mask);
945525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
9460799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    if (sDiscoveryEnabled && !restart)
947525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
9480799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        ALOGE ("%s: already discovering", __FUNCTION__);
949525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return;
950525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
951525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
952525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS stat = NFA_STATUS_OK;
953525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
954525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PowerSwitch::getInstance ().setLevel (PowerSwitch::FULL_POWER);
955525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
956525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sRfEnabled) {
957525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        // Stop RF discovery to reconfigure
958525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        startRfDiscovery(false);
959525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
960525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
9610799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    // Check polling configuration
9620799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    if (tech_mask != 0)
963a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales    {
9640799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        stopPolling_rfDiscoveryDisabled();
9650799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        enableDisableLptd(enable_lptd);
9660799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        startPolling_rfDiscoveryDisabled(tech_mask);
9670799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
9680799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        // Start P2P listening if tag polling was enabled
9690799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        if (sPollingEnabled)
970a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales        {
9710799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales            ALOGD ("%s: Enable p2pListening", __FUNCTION__);
97231b0f4653686119d74876cae5d637c5baf52b935Andres Morales
97331b0f4653686119d74876cae5d637c5baf52b935Andres Morales            if (enable_p2p && !sP2pEnabled) {
97431b0f4653686119d74876cae5d637c5baf52b935Andres Morales                sP2pEnabled = true;
97531b0f4653686119d74876cae5d637c5baf52b935Andres Morales                PeerToPeer::getInstance().enableP2pListening (true);
97631b0f4653686119d74876cae5d637c5baf52b935Andres Morales                NFA_ResumeP2p();
97731b0f4653686119d74876cae5d637c5baf52b935Andres Morales            } else if (!enable_p2p && sP2pEnabled) {
97831b0f4653686119d74876cae5d637c5baf52b935Andres Morales                sP2pEnabled = false;
97931b0f4653686119d74876cae5d637c5baf52b935Andres Morales                PeerToPeer::getInstance().enableP2pListening (false);
98031b0f4653686119d74876cae5d637c5baf52b935Andres Morales                NFA_PauseP2p();
98131b0f4653686119d74876cae5d637c5baf52b935Andres Morales            }
9820799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
9830799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales            if (reader_mode && !sReaderModeEnabled)
9840799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales            {
9850799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                sReaderModeEnabled = true;
9860799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                NFA_DisableListening();
9870799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                NFA_SetRfDiscoveryDuration(READER_MODE_DISCOVERY_DURATION);
9880799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales            }
98931b0f4653686119d74876cae5d637c5baf52b935Andres Morales            else if (!reader_mode && sReaderModeEnabled)
9900799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales            {
9910799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                struct nfc_jni_native_data *nat = getNative(e, o);
9920799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                sReaderModeEnabled = false;
9930799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                NFA_EnableListening();
9940799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales                NFA_SetRfDiscoveryDuration(nat->discovery_duration);
9950799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales            }
996a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales        }
997a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales    }
9980799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    else
999525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
10000799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        // No technologies configured, stop polling
10010799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        stopPolling_rfDiscoveryDisabled();
1002525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1003525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
10040799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    // Check listen configuration
10050799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    if (enable_host_routing)
10060799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    {
10070799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        RoutingManager::getInstance().enableRoutingToHost();
10080799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        RoutingManager::getInstance().commitRouting();
10090799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    }
10100799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    else
10110799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    {
10120799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        RoutingManager::getInstance().disableRoutingToHost();
10130799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        RoutingManager::getInstance().commitRouting();
10140799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    }
1015525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // Actually start discovery.
1016525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    startRfDiscovery (true);
10170799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    sDiscoveryEnabled = true;
1018a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales
1019525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PowerSwitch::getInstance ().setModeOn (PowerSwitch::DISCOVERY);
1020525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1021525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
1022525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1023525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1024525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1025525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1026525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1027525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_disableDiscovery
1028525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1029525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Stop polling and listening for devices.
1030525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1031525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1032525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1033525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1034525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1035525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
10360799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Moralesvoid nfcManager_disableDiscovery (JNIEnv* e, jobject o)
1037525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1038525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS status = NFA_STATUS_OK;
1039525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter;", __FUNCTION__);
1040525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1041525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    pn544InteropAbortNow ();
1042525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sDiscoveryEnabled == false)
1043525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1044525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGD ("%s: already disabled", __FUNCTION__);
1045525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        goto TheEnd;
1046525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1047525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1048525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // Stop RF Discovery.
1049525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    startRfDiscovery (false);
1050525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
10510799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    if (sPollingEnabled)
10520799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        status = stopPolling_rfDiscoveryDisabled();
1053525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1054525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PeerToPeer::getInstance().enableP2pListening (false);
1055e6b10cf6f5c7bb363890428e2c52505c76b13b8dAndres Morales    sP2pEnabled = false;
10560799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    sDiscoveryEnabled = false;
1057525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    //if nothing is active after this, then tell the controller to power down
1058525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (! PowerSwitch::getInstance ().setModeOff (PowerSwitch::DISCOVERY))
1059525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER);
1060525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd:
1061525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
1062525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1063525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1064d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenenvoid enableDisableLptd (bool enable)
1065d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen{
1066d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    // This method is *NOT* thread-safe. Right now
1067d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    // it is only called from the same thread so it's
1068d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    // not an issue.
1069d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    static bool sCheckedLptd = false;
1070d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    static bool sHasLptd = false;
1071d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen
1072d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    tNFA_STATUS stat = NFA_STATUS_OK;
1073d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    if (!sCheckedLptd)
1074d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    {
1075d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        sCheckedLptd = true;
1076d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        SyncEventGuard guard (sNfaGetConfigEvent);
1077d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        tNFA_PMID configParam[1] = {NCI_PARAM_ID_TAGSNIFF_CFG};
1078d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        stat = NFA_GetConfig(1, configParam);
1079d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        if (stat != NFA_STATUS_OK)
1080d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        {
1081d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen            ALOGE("%s: NFA_GetConfig failed", __FUNCTION__);
1082d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen            return;
1083d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        }
1084d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        sNfaGetConfigEvent.wait ();
1085d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        if (sCurrentConfigLen < 4 || sConfig[1] != NCI_PARAM_ID_TAGSNIFF_CFG) {
1086d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen            ALOGE("%s: Config TLV length %d returned is too short", __FUNCTION__,
1087d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen                    sCurrentConfigLen);
1088d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen            return;
1089d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        }
10904181521d0157554a59e32bf06f80bfbc6288f01dMartijn Coenen        if (sConfig[3] == 0) {
10914181521d0157554a59e32bf06f80bfbc6288f01dMartijn Coenen            ALOGE("%s: LPTD is disabled, not enabling in current config", __FUNCTION__);
10924181521d0157554a59e32bf06f80bfbc6288f01dMartijn Coenen            return;
10934181521d0157554a59e32bf06f80bfbc6288f01dMartijn Coenen        }
1094d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        sHasLptd = true;
1095d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    }
1096d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    // Bail if we checked and didn't find any LPTD config before
1097d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    if (!sHasLptd) return;
109833aeb7c13f8fd9d9bd301f31680836b8ec912d51Martijn Coenen    UINT8 enable_byte = enable ? 0x01 : 0x00;
1099d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen
1100d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    SyncEventGuard guard(sNfaSetConfigEvent);
1101d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen
110233aeb7c13f8fd9d9bd301f31680836b8ec912d51Martijn Coenen    stat = NFA_SetConfig(NCI_PARAM_ID_TAGSNIFF_CFG, 1, &enable_byte);
1103d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    if (stat == NFA_STATUS_OK)
1104d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        sNfaSetConfigEvent.wait ();
1105d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    else
1106d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen        ALOGE("%s: Could not configure LPTD feature", __FUNCTION__);
1107d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen    return;
1108d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen}
1109d6ead4d11c56cc4b1e90a93d6d5fe7583abbbfb8Martijn Coenen
1110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1111525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1112525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1113525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doCreateLlcpServiceSocket
1114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Create a new LLCP server socket.
1116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  nSap: Service access point.
1119525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  sn: Service name
1120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  miu: Maximum information unit.
1121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  rw: Receive window size.
1122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  linearBufferLength: Max buffer size.
1123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         NativeLlcpServiceSocket Java object.
1125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
11272534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jobject nfcManager_doCreateLlcpServiceSocket (JNIEnv* e, jobject, jint nSap, jstring sn, jint miu, jint rw, jint linearBufferLength)
1128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PeerToPeer::tJNI_HANDLE jniHandle = PeerToPeer::getInstance().getNewJniHandle ();
1130525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
11312534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedUtfChars serviceName(e, sn);
11322534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes
11332534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ALOGD ("%s: enter: sap=%i; name=%s; miu=%i; rw=%i; buffLen=%i", __FUNCTION__, nSap, serviceName.c_str(), miu, rw, linearBufferLength);
1134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1135525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Create new NativeLlcpServiceSocket object */
11362534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jobject serviceSocket = NULL;
1137b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen    if (nfc_jni_cache_object_local(e, gNativeLlcpServiceSocketClassName, &(serviceSocket)) == -1)
1138525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1139525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: Llcp socket object creation error", __FUNCTION__);
1140525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return NULL;
1141525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1142525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Get NativeLlcpServiceSocket class object */
11442534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jclass> clsNativeLlcpServiceSocket(e, e->GetObjectClass(serviceSocket));
1145525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (e->ExceptionCheck())
1146525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        e->ExceptionClear();
1148525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE("%s: Llcp Socket get object class error", __FUNCTION__);
1149525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return NULL;
1150525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1151525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
11522534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    if (!PeerToPeer::getInstance().registerServer (jniHandle, serviceName.c_str()))
1153525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1154525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE("%s: RegisterServer error", __FUNCTION__);
1155525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return NULL;
1156525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1157525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
11582534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jfieldID f;
11592534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes
1160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket handle to be the same as the NfaHandle*/
11612534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mHandle", "I");
11622534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetIntField(serviceSocket, f, (jint) jniHandle);
1163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: socket Handle = 0x%X", __FUNCTION__, jniHandle);
1164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket linear buffer length */
11662534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mLocalLinearBufferLength", "I");
11672534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetIntField(serviceSocket, f,(jint)linearBufferLength);
1168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: buffer length = %d", __FUNCTION__, linearBufferLength);
1169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket MIU */
11712534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mLocalMiu", "I");
11722534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetIntField(serviceSocket, f,(jint)miu);
1173525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: MIU = %d", __FUNCTION__, miu);
1174525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1175525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket RW */
11762534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID(clsNativeLlcpServiceSocket.get(), "mLocalRw", "I");
11772534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    e->SetIntField(serviceSocket, f,(jint)rw);
1178525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s:  RW = %d", __FUNCTION__, rw);
1179525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1180525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sLastError = 0;
1181525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
1182525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return serviceSocket;
1183525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1184525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1185525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1186525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1187525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1188525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doGetLastError
1189525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1190525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Get the last error code.
1191525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1193525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1194525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Last error code.
1195525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1196525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
11972534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jint nfcManager_doGetLastError(JNIEnv*, jobject)
1198525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1199525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: last error=%i", __FUNCTION__, sLastError);
1200525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return sLastError;
1201525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1202525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1203525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1204525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1205525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1206525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doDeinitialize
1207525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1208525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Turn off NFC.
1209525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1210525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1211525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1212525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if ok.
1213525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1214525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
12152534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nfcManager_doDeinitialize (JNIEnv*, jobject)
1216525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1217525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
1218525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1219525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sIsDisabling = true;
1220525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    pn544InteropAbortNow ();
1221f3e09e66825850178879e76ccc7708509dbbc5b6Martijn Coenen    RoutingManager::getInstance().onNfccShutdown();
1222a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    PowerSwitch::getInstance ().initialize (PowerSwitch::UNKNOWN_LEVEL);
1223525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1224525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (sIsNfaEnabled)
1225525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1226525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard guard (sNfaDisableEvent);
1227525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        tNFA_STATUS stat = NFA_Disable (TRUE /* graceful */);
1228525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (stat == NFA_STATUS_OK)
1229525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
1230525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGD ("%s: wait for completion", __FUNCTION__);
1231525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaDisableEvent.wait (); //wait for NFA command to finish
1232525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            PeerToPeer::getInstance ().handleNfcOnOff (false);
1233525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1234525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        else
1235525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        {
1236525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            ALOGE ("%s: fail disable; error=0x%X", __FUNCTION__, stat);
1237525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        }
1238525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1239525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    nativeNfcTag_abortWaits();
1240525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    NfcTag::getInstance().abort ();
1241525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sAbortConnlessWait = true;
1242525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    nativeLlcpConnectionlessSocket_abortWait();
1243525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sIsNfaEnabled = false;
1244525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sDiscoveryEnabled = false;
12450799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    sPollingEnabled = false;
1246525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    sIsDisabling = false;
12478d154680537afa5242edeb98c8f414d6186558cfMartijn Coenen    gActivated = false;
1248525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1249525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1250525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        //unblock NFA_EnablePolling() and NFA_DisablePolling()
1251525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard guard (sNfaEnableDisablePollingEvent);
1252525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sNfaEnableDisablePollingEvent.notifyOne ();
1253525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    NfcAdaptation& theInstance = NfcAdaptation::GetInstance();
1256525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    theInstance.Finalize();
1257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
1259525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return JNI_TRUE;
1260525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1261525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1262525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1263525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1264525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1265525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doCreateLlcpSocket
1266525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1267525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Create a LLCP connection-oriented socket.
1268525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1269525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1270525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  nSap: Service access point.
1271525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  miu: Maximum information unit.
1272525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  rw: Receive window size.
1273525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  linearBufferLength: Max buffer size.
1274525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1275525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         NativeLlcpSocket Java object.
1276525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1277525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
12782534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jobject nfcManager_doCreateLlcpSocket (JNIEnv* e, jobject, jint nSap, jint miu, jint rw, jint linearBufferLength)
1279525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1280525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter; sap=%d; miu=%d; rw=%d; buffer len=%d", __FUNCTION__, nSap, miu, rw, linearBufferLength);
1281525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
12822534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    PeerToPeer::tJNI_HANDLE jniHandle = PeerToPeer::getInstance().getNewJniHandle ();
1283a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    PeerToPeer::getInstance().createClient (jniHandle, miu, rw);
1284525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1285525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Create new NativeLlcpSocket object */
12862534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jobject clientSocket = NULL;
1287525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (nfc_jni_cache_object_local(e, gNativeLlcpSocketClassName, &(clientSocket)) == -1)
1288525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1289525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: fail Llcp socket creation", __FUNCTION__);
12902534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        return clientSocket;
1291525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1292525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1293525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Get NativeConnectionless class object */
12942534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jclass> clsNativeLlcpSocket(e, e->GetObjectClass(clientSocket));
1295525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (e->ExceptionCheck())
1296525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1297525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        e->ExceptionClear();
1298525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: fail get class object", __FUNCTION__);
12992534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        return clientSocket;
1300525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1301525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
13022534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jfieldID f;
13032534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes
1304525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket SAP */
13052534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID (clsNativeLlcpSocket.get(), "mSap", "I");
1306525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    e->SetIntField (clientSocket, f, (jint) nSap);
1307525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1308525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket handle */
13092534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID (clsNativeLlcpSocket.get(), "mHandle", "I");
1310525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    e->SetIntField (clientSocket, f, (jint) jniHandle);
1311525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1312525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket MIU */
13132534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID (clsNativeLlcpSocket.get(), "mLocalMiu", "I");
1314525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    e->SetIntField (clientSocket, f, (jint) miu);
1315525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1316525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /* Set socket RW */
13172534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    f = e->GetFieldID (clsNativeLlcpSocket.get(), "mLocalRw", "I");
1318525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    e->SetIntField (clientSocket, f, (jint) rw);
1319525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1320525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
1321525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return clientSocket;
1322525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1323525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1324525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1325525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1326525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1327525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doCreateLlcpConnectionlessSocket
1328525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1329525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Create a connection-less socket.
1330525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1331525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1332525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  nSap: Service access point.
1333525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  sn: Service name.
1334525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1335525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         NativeLlcpConnectionlessSocket Java object.
1336525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1337525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
13382534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jobject nfcManager_doCreateLlcpConnectionlessSocket (JNIEnv *, jobject, jint nSap, jstring /*sn*/)
1339525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1340525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: nSap=0x%X", __FUNCTION__, nSap);
1341525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return NULL;
1342525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1343525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1344525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1345525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1346525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        isPeerToPeer
1347525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1348525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Whether the activation data indicates the peer supports NFC-DEP.
1349525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  activated: Activation data.
1350525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1351525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if the peer supports NFC-DEP.
1352525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1353525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1354525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool isPeerToPeer (tNFA_ACTIVATED& activated)
1355525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1356525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return activated.activate_ntf.protocol == NFA_PROTOCOL_NFC_DEP;
1357525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1358525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1359525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1360525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1361525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        isListenMode
1362525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1363525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Indicates whether the activation data indicates it is
1364525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  listen mode.
1365525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1366525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if this listen mode.
1367525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1368525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1369525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool isListenMode(tNFA_ACTIVATED& activated)
1370525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1371525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return ((NFC_DISCOVERY_TYPE_LISTEN_A == activated.activate_ntf.rf_tech_param.mode)
1372525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            || (NFC_DISCOVERY_TYPE_LISTEN_B == activated.activate_ntf.rf_tech_param.mode)
1373525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            || (NFC_DISCOVERY_TYPE_LISTEN_F == activated.activate_ntf.rf_tech_param.mode)
1374525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            || (NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE == activated.activate_ntf.rf_tech_param.mode)
1375525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            || (NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE == activated.activate_ntf.rf_tech_param.mode)
1376525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            || (NFC_DISCOVERY_TYPE_LISTEN_ISO15693 == activated.activate_ntf.rf_tech_param.mode)
1377525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            || (NFC_DISCOVERY_TYPE_LISTEN_B_PRIME == activated.activate_ntf.rf_tech_param.mode));
1378525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1379525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1380525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1381525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1382525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doCheckLlcp
1383525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1384525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Not used.
1385525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1386525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True
1387525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1388525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
13892534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nfcManager_doCheckLlcp(JNIEnv*, jobject)
1390525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1391525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD("%s", __FUNCTION__);
1392525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return JNI_TRUE;
1393525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1394525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1395525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1396525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1397525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1398525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doActivateLlcp
1399525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1400525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Not used.
1401525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1402525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True
1403525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1404525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
14052534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nfcManager_doActivateLlcp(JNIEnv*, jobject)
1406525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1407525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD("%s", __FUNCTION__);
1408525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return JNI_TRUE;
1409525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1410525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1411525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1412525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1413525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1414525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doAbort
1415525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1416525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Not used.
1417525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1418525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1419525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1420525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
14212534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic void nfcManager_doAbort(JNIEnv*, jobject)
1422525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1423525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGE("%s: abort()", __FUNCTION__);
1424525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    abort();
1425525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1426525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1427525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1428525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1429525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1430525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doDownload
1431525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1432a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Description:     Download firmware patch files.  Do not turn on NFC.
1433525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1434a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Returns:         True if ok.
1435525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1436525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
14372534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nfcManager_doDownload(JNIEnv*, jobject)
1438525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1439a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    ALOGD ("%s: enter", __FUNCTION__);
1440a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    NfcAdaptation& theInstance = NfcAdaptation::GetInstance();
1441a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
1442a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    theInstance.Initialize(); //start GKI, NCI task, NFC task
1443a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    theInstance.DownloadFirmware ();
1444a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    theInstance.Finalize();
1445a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    ALOGD ("%s: exit", __FUNCTION__);
1446525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return JNI_TRUE;
1447525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1448525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1449525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1450525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1451525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1452525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doResetTimeouts
1453525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1454525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Not used.
1455525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1456525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1457525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1458525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
14592534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic void nfcManager_doResetTimeouts(JNIEnv*, jobject)
1460525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1461a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    ALOGD ("%s", __FUNCTION__);
1462a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    NfcTag::getInstance().resetAllTransceiveTimeouts ();
1463525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1464525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1465525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1466525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1467525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1468525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doSetTimeout
1469525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1470525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Set timeout value.
1471525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1472525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1473a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**                  tech: technology ID.
1474525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  timeout: Timeout value.
1475525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1476525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         True if ok.
1477525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1478525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1479a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chustatic bool nfcManager_doSetTimeout(JNIEnv*, jobject, jint tech, jint timeout)
1480525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1481525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (timeout <= 0)
1482525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1483525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE("%s: Timeout must be positive.",__FUNCTION__);
1484525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return false;
1485525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1486a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    ALOGD ("%s: tech=%d, timeout=%d", __FUNCTION__, tech, timeout);
1487a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    NfcTag::getInstance().setTransceiveTimeout (tech, timeout);
1488525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return true;
1489525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1490525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1491525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1492525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1493525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1494525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doGetTimeout
1495525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1496525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Get timeout value.
1497525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1498525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1499a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu**                  tech: technology ID.
1500525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1501525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Timeout value.
1502525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1503525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1504a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chustatic jint nfcManager_doGetTimeout(JNIEnv*, jobject, jint tech)
1505525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1506a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    int timeout = NfcTag::getInstance().getTransceiveTimeout (tech);
1507a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    ALOGD ("%s: tech=%d, timeout=%d", __FUNCTION__, tech, timeout);
1508a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    return timeout;
1509525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
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** Function:        nfcManager_doDump
1515525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1516525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Not used.
1517525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1518525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1519525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1520525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Text dump.
1521525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1522525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
15232534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jstring nfcManager_doDump(JNIEnv* e, jobject)
1524525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1525525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    char buffer[100];
1526525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    snprintf(buffer, sizeof(buffer), "libnfc llc error_count=%u", /*libnfc_llc_error_count*/ 0);
1527525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return e->NewStringUTF(buffer);
1528525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1529525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1530525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1531525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1532525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1533525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doSetP2pInitiatorModes
1534525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1535525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Set P2P initiator's activation modes.
1536525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1537525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1538525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  modes: Active and/or passive modes.  The values are specified
1539525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                          in external/libnfc-nxp/inc/phNfcTypes.h.  See
1540525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                          enum phNfc_eP2PMode_t.
1541525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1542525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None.
1543525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1544525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1545525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void nfcManager_doSetP2pInitiatorModes (JNIEnv *e, jobject o, jint modes)
1546525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1547525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: modes=0x%X", __FUNCTION__, modes);
1548525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    struct nfc_jni_native_data *nat = getNative(e, o);
1549525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1550525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_TECHNOLOGY_MASK mask = 0;
1551525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x01) mask |= NFA_TECHNOLOGY_MASK_A;
1552525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x02) mask |= NFA_TECHNOLOGY_MASK_F;
1553525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x04) mask |= NFA_TECHNOLOGY_MASK_F;
1554525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x08) mask |= NFA_TECHNOLOGY_MASK_A_ACTIVE;
1555525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x10) mask |= NFA_TECHNOLOGY_MASK_F_ACTIVE;
1556525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x20) mask |= NFA_TECHNOLOGY_MASK_F_ACTIVE;
1557525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    nat->tech_mask = mask;
1558525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1559525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1560525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1561525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1562525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1563525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_doSetP2pTargetModes
1564525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1565525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Set P2P target's activation modes.
1566525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
1567525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
1568525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  modes: Active and/or passive modes.
1569525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1570525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None.
1571525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1572525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
15732534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic void nfcManager_doSetP2pTargetModes (JNIEnv*, jobject, jint modes)
1574525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1575525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: modes=0x%X", __FUNCTION__, modes);
1576525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // Map in the right modes
1577525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_TECHNOLOGY_MASK mask = 0;
1578525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x01) mask |= NFA_TECHNOLOGY_MASK_A;
1579525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x02) mask |= NFA_TECHNOLOGY_MASK_F;
1580525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x04) mask |= NFA_TECHNOLOGY_MASK_F;
1581525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (modes & 0x08) mask |= NFA_TECHNOLOGY_MASK_A_ACTIVE | NFA_TECHNOLOGY_MASK_F_ACTIVE;
1582525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1583525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PeerToPeer::getInstance().setP2pListenMask(mask);
1584525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1585525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1586d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Moralesstatic void nfcManager_doEnableScreenOffSuspend(JNIEnv* e, jobject o)
1587d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales{
1588d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    PowerSwitch::getInstance().setScreenOffPowerState(PowerSwitch::POWER_STATE_FULL);
1589d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales}
1590d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales
1591d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Moralesstatic void nfcManager_doDisableScreenOffSuspend(JNIEnv* e, jobject o)
1592d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales{
1593d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    PowerSwitch::getInstance().setScreenOffPowerState(PowerSwitch::POWER_STATE_OFF);
1594d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales}
1595c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen
1596525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*****************************************************************************
1597525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1598525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** JNI functions for android-4.0.1_r1
1599525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1600525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/
1601525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic JNINativeMethod gMethods[] =
1602525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1603525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doDownload", "()Z",
1604525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doDownload},
1605525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1606525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"initializeNativeStructure", "()Z",
1607525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_initNativeStruc},
1608525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1609304a6342ee7e5620d3b50d988755c035f1686dc2Martijn Coenen    {"doInitialize", "()Z",
1610525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_doInitialize},
1611525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1612525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doDeinitialize", "()Z",
1613525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_doDeinitialize},
1614525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
16159f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    {"sendRawFrame", "([B)Z",
16169f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen            (void*) nfcManager_sendRawFrame},
16179f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
16189f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    {"routeAid", "([BI)Z",
16199f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen            (void*) nfcManager_routeAid},
16209f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
16219f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen    {"unrouteAid", "([B)Z",
16229f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen            (void*) nfcManager_unrouteAid},
16239f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen
1624f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen    {"commitRouting", "()Z",
1625f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen            (void*) nfcManager_commitRouting},
1626f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen
162731b0f4653686119d74876cae5d637c5baf52b935Andres Morales    {"doEnableDiscovery", "(IZZZZZ)V",
1628525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_enableDiscovery},
1629525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1630525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doCheckLlcp", "()Z",
1631525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doCheckLlcp},
1632525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1633525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doActivateLlcp", "()Z",
1634525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doActivateLlcp},
1635525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1636525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doCreateLlcpConnectionlessSocket", "(ILjava/lang/String;)Lcom/android/nfc/dhimpl/NativeLlcpConnectionlessSocket;",
1637525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doCreateLlcpConnectionlessSocket},
1638525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1639525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doCreateLlcpServiceSocket", "(ILjava/lang/String;III)Lcom/android/nfc/dhimpl/NativeLlcpServiceSocket;",
1640525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_doCreateLlcpServiceSocket},
1641525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1642525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doCreateLlcpSocket", "(IIII)Lcom/android/nfc/dhimpl/NativeLlcpSocket;",
1643525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_doCreateLlcpSocket},
1644525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1645525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doGetLastError", "()I",
1646525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_doGetLastError},
1647525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1648a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales    {"disableDiscovery", "()V",
1649525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void*) nfcManager_disableDiscovery},
1650525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1651525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doSetTimeout", "(II)Z",
1652525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doSetTimeout},
1653525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1654525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doGetTimeout", "(I)I",
1655525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doGetTimeout},
1656525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1657525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doResetTimeouts", "()V",
1658525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doResetTimeouts},
1659525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1660525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doAbort", "()V",
1661525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doAbort},
1662525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1663525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doSetP2pInitiatorModes", "(I)V",
1664525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doSetP2pInitiatorModes},
1665525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1666525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doSetP2pTargetModes", "(I)V",
1667525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doSetP2pTargetModes},
1668525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1669d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    {"doEnableScreenOffSuspend", "()V",
1670d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales            (void *)nfcManager_doEnableScreenOffSuspend},
1671d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales
1672d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales    {"doDisableScreenOffSuspend", "()V",
1673d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales            (void *)nfcManager_doDisableScreenOffSuspend},
1674d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales
1675525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {"doDump", "()Ljava/lang/String;",
1676525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            (void *)nfcManager_doDump},
1677525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project};
1678525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1679525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1680525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1681525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1682525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        register_com_android_nfc_NativeNfcManager
1683525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1684525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Regisgter JNI functions with Java Virtual Machine.
1685525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: Environment of JVM.
1686525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1687525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Status of registration.
1688525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1689525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1690525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectint register_com_android_nfc_NativeNfcManager (JNIEnv *e)
1691525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1692525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
1693525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    PowerSwitch::getInstance ().initialize (PowerSwitch::UNKNOWN_LEVEL);
1694525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
1695525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return jniRegisterNativeMethods (e, gNativeNfcManagerClassName, gMethods, NELEM (gMethods));
1696525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1697525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1698525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1699525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1700525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1701525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        startRfDiscovery
1702525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1703525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Ask stack to start polling and listening for devices.
1704525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  isStart: Whether to start.
1705525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1706525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1707525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1708525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1709525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid startRfDiscovery(bool isStart)
1710525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1711525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS status = NFA_STATUS_FAILED;
1712525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1713525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: is start=%d", __FUNCTION__, isStart);
1714525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    SyncEventGuard guard (sNfaEnableDisablePollingEvent);
1715525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    status  = isStart ? NFA_StartRfDiscovery () : NFA_StopRfDiscovery ();
1716525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (status == NFA_STATUS_OK)
1717525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1718525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sNfaEnableDisablePollingEvent.wait (); //wait for NFA_RF_DISCOVERY_xxxx_EVT
1719525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        sRfEnabled = isStart;
1720525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1721525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else
1722525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1723525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        ALOGE ("%s: Failed to start/stop RF discovery; error=0x%X", __FUNCTION__, status);
1724525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1725525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1726525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1727525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1728525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1729525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1730525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        doStartupConfig
1731525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1732525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Configure the NFC controller.
1733525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1734525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None
1735525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1736525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1737525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid doStartupConfig()
1738525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1739525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    struct nfc_jni_native_data *nat = getNative(0, 0);
1740525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS stat = NFA_STATUS_FAILED;
1741a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    int actualLen = 0;
1742525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1743525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // If polling for Active mode, set the ordering so that we choose Active over Passive mode first.
1744525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (nat && (nat->tech_mask & (NFA_TECHNOLOGY_MASK_A_ACTIVE | NFA_TECHNOLOGY_MASK_F_ACTIVE)))
1745525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
1746525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        UINT8  act_mode_order_param[] = { 0x01 };
1747525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        SyncEventGuard guard (sNfaSetConfigEvent);
1748525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        stat = NFA_SetConfig(NCI_PARAM_ID_ACT_ORDER, sizeof(act_mode_order_param), &act_mode_order_param[0]);
1749525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        if (stat == NFA_STATUS_OK)
1750525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project            sNfaSetConfigEvent.wait ();
1751525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1752a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
1753a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    //configure RF polling frequency for each technology
1754a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    static tNFA_DM_DISC_FREQ_CFG nfa_dm_disc_freq_cfg;
1755a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    //values in the polling_frequency[] map to members of nfa_dm_disc_freq_cfg
1756a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    UINT8 polling_frequency [8] = {1, 1, 1, 1, 1, 1, 1, 1};
1757a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    actualLen = GetStrValue(NAME_POLL_FREQUENCY, (char*)polling_frequency, 8);
1758a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    if (actualLen == 8)
1759a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    {
1760a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        ALOGD ("%s: polling frequency", __FUNCTION__);
1761a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        memset (&nfa_dm_disc_freq_cfg, 0, sizeof(nfa_dm_disc_freq_cfg));
1762a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        nfa_dm_disc_freq_cfg.pa = polling_frequency [0];
1763a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        nfa_dm_disc_freq_cfg.pb = polling_frequency [1];
1764a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        nfa_dm_disc_freq_cfg.pf = polling_frequency [2];
1765a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        nfa_dm_disc_freq_cfg.pi93 = polling_frequency [3];
1766a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        nfa_dm_disc_freq_cfg.pbp = polling_frequency [4];
1767a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        nfa_dm_disc_freq_cfg.pk = polling_frequency [5];
1768a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        nfa_dm_disc_freq_cfg.paa = polling_frequency [6];
1769a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        nfa_dm_disc_freq_cfg.pfa = polling_frequency [7];
1770a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu        p_nfa_dm_rf_disc_freq_cfg = &nfa_dm_disc_freq_cfg;
1771a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    }
1772525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1773525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1774525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1775525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1776525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1777525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfcManager_isNfcActive
1778525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1779525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Used externaly to determine if NFC is active or not.
1780525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1781525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         'true' if the NFC stack is running, else 'false'.
1782525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1783525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1784525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool nfcManager_isNfcActive()
1785525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1786525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return sIsNfaEnabled;
1787525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1788525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1789525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
1790525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1791525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        startStopPolling
1792525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1793525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Start or stop polling.
1794525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  isStartPolling: true to start polling; false to stop polling.
1795525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1796525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         None.
1797525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
1798525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
1799525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid startStopPolling (bool isStartPolling)
1800525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1801525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter; isStart=%u", __FUNCTION__, isStartPolling);
18020799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    startRfDiscovery (false);
18030799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
18040799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    if (isStartPolling) startPolling_rfDiscoveryDisabled(0);
18050799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    else stopPolling_rfDiscoveryDisabled();
18060799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
18070799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    startRfDiscovery (true);
18080799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    ALOGD ("%s: exit", __FUNCTION__);
18090799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales}
18100799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
18110799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
18120799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Moralesstatic tNFA_STATUS startPolling_rfDiscoveryDisabled(tNFA_TECHNOLOGY_MASK tech_mask) {
1813525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    tNFA_STATUS stat = NFA_STATUS_FAILED;
1814525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
18150799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    unsigned long num = 0;
1816a1e95d30dbe8dad0a8bb333b4ca17c009fc34e2fAndres Morales
18170799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    if (tech_mask == 0 && GetNumValue(NAME_POLLING_TECH_MASK, &num, sizeof(num)))
18180799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        tech_mask = num;
18190799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    else if (tech_mask == 0) tech_mask = DEFAULT_TECH_MASK;
18200799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
18210799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    SyncEventGuard guard (sNfaEnableDisablePollingEvent);
18220799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    ALOGD ("%s: enable polling", __FUNCTION__);
18230799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    stat = NFA_EnablePolling (tech_mask);
18240799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    if (stat == NFA_STATUS_OK)
18250799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    {
18260799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        ALOGD ("%s: wait for enable event", __FUNCTION__);
18270799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        sPollingEnabled = true;
18280799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_ENABLED_EVT
1829525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
1830525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    else
1831525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
18320799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        ALOGE ("%s: fail enable polling; error=0x%X", __FUNCTION__, stat);
1833525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
18340799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
18350799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    return stat;
18360799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales}
18370799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
18380799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Moralesstatic tNFA_STATUS stopPolling_rfDiscoveryDisabled() {
18390799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    tNFA_STATUS stat = NFA_STATUS_FAILED;
18400799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
18410799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    SyncEventGuard guard (sNfaEnableDisablePollingEvent);
18420799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    ALOGD ("%s: disable polling", __FUNCTION__);
18430799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    stat = NFA_DisablePolling ();
18440799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    if (stat == NFA_STATUS_OK) {
18450799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        sPollingEnabled = false;
18460799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        sNfaEnableDisablePollingEvent.wait (); //wait for NFA_POLL_DISABLED_EVT
18470799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    } else {
18480799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales        ALOGE ("%s: fail disable polling; error=0x%X", __FUNCTION__, stat);
18490799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    }
18500799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales
18510799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales    return stat;
1852525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
1853525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1854525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
1855525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} /* namespace android */
1856