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> 19983b839bc07f834b007a57d134352d477b1aa9a7Elliott Hughes#include <malloc.h> 20525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include <time.h> 21525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include <signal.h> 22983b839bc07f834b007a57d134352d477b1aa9a7Elliott Hughes#include <string.h> 23525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "OverrideLog.h" 24525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "NfcJniUtil.h" 25525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "NfcTag.h" 26525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "config.h" 27525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "Mutex.h" 28525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "IntervalTimer.h" 29525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "JavaClassConstants.h" 30525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "Pn544Interop.h" 312534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes#include <ScopedLocalRef.h> 322534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes#include <ScopedPrimitiveArray.h> 33b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen#include <string> 34525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 35525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectextern "C" 36525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 37525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project #include "nfa_api.h" 38525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project #include "nfa_rw_api.h" 398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao #include "nfc_brcm_defs.h" 40525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project #include "ndef_utils.h" 41525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project #include "rw_api.h" 428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao #include "phNxpExtns.h" 43525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 44525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android 45525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 46525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project extern nfc_jni_native_data* getNative(JNIEnv *e, jobject o); 47525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project extern bool nfcManager_isNfcActive(); 48525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 49525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 50a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuextern bool gActivated; 51a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuextern SyncEvent gDeactivatedEvent; 52525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 53525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/***************************************************************************** 54525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 55525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** public variables and functions 56525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 57525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/ 58525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android 59525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 60525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project bool gIsTagDeactivating = false; // flag for nfa callback indicating we are deactivating for RF interface switch 61525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project bool gIsSelectingRfInterface = false; // flag for nfa callback indicating we are selecting for RF interface switch 62525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 63525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 64525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 65525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/***************************************************************************** 66525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 67525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** private variables and functions 68525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 69525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/ 70525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android 71525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 72525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 73525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 74525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project// Pre-defined tag type values. These must match the values in 75525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project// framework Ndef.java for Google public NFC API. 76525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define NDEF_UNKNOWN_TYPE -1 77525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define NDEF_TYPE1_TAG 1 78525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define NDEF_TYPE2_TAG 2 79525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define NDEF_TYPE3_TAG 3 80525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define NDEF_TYPE4_TAG 4 81525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define NDEF_MIFARE_CLASSIC_TAG 101 82525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 83525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define STATUS_CODE_TARGET_LOST 146 // this error code comes from the service 84525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 85525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic uint32_t sCheckNdefCurrentSize = 0; 86525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic tNFA_STATUS sCheckNdefStatus = 0; //whether tag already contains a NDEF message 87525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool sCheckNdefCapable = false; //whether tag has NDEF capability 88525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic tNFA_HANDLE sNdefTypeHandlerHandle = NFA_HANDLE_INVALID; 89525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic tNFA_INTF_TYPE sCurrentRfInterface = NFA_INTERFACE_ISO_DEP; 90b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenenstatic std::basic_string<UINT8> sRxDataBuffer; 91b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenenstatic tNFA_STATUS sRxDataStatus = NFA_STATUS_OK; 92525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool sWaitingForTransceive = false; 93a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chustatic bool sTransceiveRfTimeout = false; 94525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic Mutex sRfInterfaceMutex; 95525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic uint32_t sReadDataLen = 0; 96525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic uint8_t* sReadData = NULL; 97525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool sIsReadingNdefMessage = false; 98525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent sReadEvent; 99525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic sem_t sWriteSem; 100525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic sem_t sFormatSem; 101525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent sTransceiveEvent; 102525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic SyncEvent sReconnectEvent; 103525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic sem_t sCheckNdefSem; 104b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenenstatic SyncEvent sPresenceCheckEvent; 105525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic sem_t sMakeReadonlySem; 106525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic IntervalTimer sSwitchBackTimer; // timer used to tell us to switch back to ISO_DEP frame interface 107525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean sWriteOk = JNI_FALSE; 108525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean sWriteWaitingForComplete = JNI_FALSE; 109525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool sFormatOk = false; 110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean sConnectOk = JNI_FALSE; 111525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean sConnectWaitingForComplete = JNI_FALSE; 112525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool sGotDeactivate = false; 113525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic uint32_t sCheckNdefMaxSize = 0; 114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool sCheckNdefCardReadOnly = false; 115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean sCheckNdefWaitingForComplete = JNI_FALSE; 116a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chustatic bool sIsTagPresent = true; 117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic tNFA_STATUS sMakeReadonlyStatus = NFA_STATUS_FAILED; 118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean sMakeReadonlyWaitingForComplete = JNI_FALSE; 119a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chustatic int sCurrentConnectedTargetType = TARGET_TYPE_UNKNOWN; 1208605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic int sCurrentConnectedTargetProtocol = NFC_PROTOCOL_UNKNOWN; 121a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chustatic int reSelect (tNFA_INTF_TYPE rfInterface, bool fSwitchIfNeeded); 122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool switchRfInterface(tNFA_INTF_TYPE rfInterface); 123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_abortWaits 128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Unblock all thread synchronization objects. 130525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 131525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 132525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 133525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_abortWaits () 135525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 136525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s", __FUNCTION__); 137525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 138525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard g (sReadEvent); 139525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sReadEvent.notifyOne (); 140525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 141525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sem_post (&sWriteSem); 142525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sem_post (&sFormatSem); 143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 144525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard g (sTransceiveEvent); 145525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sTransceiveEvent.notifyOne (); 146525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 148525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard g (sReconnectEvent); 149525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sReconnectEvent.notifyOne (); 150525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 151525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 152525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sem_post (&sCheckNdefSem); 153b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen { 154b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen SyncEventGuard guard (sPresenceCheckEvent); 155b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen sPresenceCheckEvent.notifyOne (); 156b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen } 157525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sem_post (&sMakeReadonlySem); 158b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen sCurrentRfInterface = NFA_INTERFACE_ISO_DEP; 159a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu sCurrentConnectedTargetType = TARGET_TYPE_UNKNOWN; 1608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao sCurrentConnectedTargetProtocol = NFC_PROTOCOL_UNKNOWN; 161525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 162525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doReadCompleted 166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Receive the completion status of read operation. Called by 168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** NFA_READ_CPLT_EVT. 169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** status: Status of operation. 170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 172525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 173525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 174525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_doReadCompleted (tNFA_STATUS status) 175525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 176525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: status=0x%X; is reading=%u", __FUNCTION__, status, sIsReadingNdefMessage); 177525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 178525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sIsReadingNdefMessage == false) 179525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return; //not reading NDEF message right now, so just return 180525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 181525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (status != NFA_STATUS_OK) 182525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 183525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sReadDataLen = 0; 184525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sReadData) 185525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project free (sReadData); 186525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sReadData = NULL; 187525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 188525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard g (sReadEvent); 189525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sReadEvent.notifyOne (); 190525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 191525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 193525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 194525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** Function: nativeNfcTag_setRfInterface 1968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** 1978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** Description: Set rf interface. 1988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** 1998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** Returns: void 2008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** 2018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao*******************************************************************************/ 2028605731e8f17d1fde003084811f13f52539eb20cJizhou Liaovoid nativeNfcTag_setRfInterface (tNFA_INTF_TYPE rfInterface) 2038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{ 2048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao sCurrentRfInterface = rfInterface; 2058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao} 2068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 2078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 2088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************* 2098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** 210525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: ndefHandlerCallback 211525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 212525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Receive NDEF-message related events from stack. 213525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** event: Event code. 214525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** p_data: Event data. 215525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 216525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 217525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 218525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 219525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic void ndefHandlerCallback (tNFA_NDEF_EVT event, tNFA_NDEF_EVT_DATA *eventData) 220525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 221525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: event=%u, eventData=%p", __FUNCTION__, event, eventData); 222525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 223525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (event) 224525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 225525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_NDEF_REGISTER_EVT: 226525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 227525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_NDEF_REGISTER& ndef_reg = eventData->ndef_reg; 228525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: NFA_NDEF_REGISTER_EVT; status=0x%X; h=0x%X", __FUNCTION__, ndef_reg.status, ndef_reg.ndef_type_handle); 229525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sNdefTypeHandlerHandle = ndef_reg.ndef_type_handle; 230525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 231525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 232525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 233525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_NDEF_DATA_EVT: 234525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 235525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: NFA_NDEF_DATA_EVT; data_len = %lu", __FUNCTION__, eventData->ndef_data.len); 236525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sReadDataLen = eventData->ndef_data.len; 237525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sReadData = (uint8_t*) malloc (sReadDataLen); 238525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memcpy (sReadData, eventData->ndef_data.p_data, eventData->ndef_data.len); 239525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 240525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 241525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 242525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project default: 243525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: Unknown event %u ????", __FUNCTION__, event); 244525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 245525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 246525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 247525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 248525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 249525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 250525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 251525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doRead 252525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 253525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Read the NDEF message on the tag. 254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 256525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: NDEF message. 258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 259525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 2602534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jbyteArray nativeNfcTag_doRead (JNIEnv* e, jobject) 261525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 262525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter", __FUNCTION__); 263525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_STATUS status = NFA_STATUS_FAILED; 264525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project jbyteArray buf = NULL; 265525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 266525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sReadDataLen = 0; 267525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sReadData != NULL) 268525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 269525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project free (sReadData); 270525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sReadData = NULL; 271525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 272525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 273525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sCheckNdefCurrentSize > 0) 274525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 275525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 276525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard g (sReadEvent); 277525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sIsReadingNdefMessage = true; 2788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE) 2798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 2808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = EXTNS_MfcReadNDef (); 2818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 2828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao else 2838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 2848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = NFA_RwReadNDef (); 2858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 286525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sReadEvent.wait (); //wait for NFA_READ_CPLT_EVT 287525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 288525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sIsReadingNdefMessage = false; 289525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 290525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sReadDataLen > 0) //if stack actually read data from the tag 291525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 292525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: read %u bytes", __FUNCTION__, sReadDataLen); 293525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project buf = e->NewByteArray (sReadDataLen); 294525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project e->SetByteArrayRegion (buf, 0, sReadDataLen, (jbyte*) sReadData); 295525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 296525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 297525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 298525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 299b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen ALOGD ("%s: create empty buffer", __FUNCTION__); 300525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sReadDataLen = 0; 301525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sReadData = (uint8_t*) malloc (1); 302525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project buf = e->NewByteArray (sReadDataLen); 303525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project e->SetByteArrayRegion (buf, 0, sReadDataLen, (jbyte*) sReadData); 304525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 305525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 306525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sReadData) 307525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 308525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project free (sReadData); 309525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sReadData = NULL; 310525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 311525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sReadDataLen = 0; 312525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 313525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit", __FUNCTION__); 314525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return buf; 315525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 316525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 317525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 318525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 319525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 320525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doWriteStatus 321525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 322525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Receive the completion status of write operation. Called 323525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** by NFA_WRITE_CPLT_EVT. 324525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** isWriteOk: Status of operation. 325525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 326525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 327525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 328525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 329525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_doWriteStatus (jboolean isWriteOk) 330525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 331525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sWriteWaitingForComplete != JNI_FALSE) 332525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 333525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sWriteWaitingForComplete = JNI_FALSE; 334525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sWriteOk = isWriteOk; 335525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sem_post (&sWriteSem); 336525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 337525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 338525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 339525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 340525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 341525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 342525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_formatStatus 343525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 344525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Receive the completion status of format operation. Called 345525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** by NFA_FORMAT_CPLT_EVT. 346525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** isOk: Status of operation. 347525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 348525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 349525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 350525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 351525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_formatStatus (bool isOk) 352525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 353525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sFormatOk = isOk; 354525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sem_post (&sFormatSem); 355525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 356525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 357525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 358525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 359525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 360525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doWrite 361525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 362525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Write a NDEF message to the tag. 363525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 364525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 365525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** buf: Contains a NDEF message. 366525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 367525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if ok. 368525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 369525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 3702534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nativeNfcTag_doWrite (JNIEnv* e, jobject, jbyteArray buf) 371525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 372525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project jboolean result = JNI_FALSE; 373525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_STATUS status = 0; 374525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project const int maxBufferSize = 1024; 375525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project UINT8 buffer[maxBufferSize] = { 0 }; 376525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project UINT32 curDataSize = 0; 377525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 3782534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedByteArrayRO bytes(e, buf); 3792534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes UINT8* p_data = const_cast<UINT8*>(reinterpret_cast<const UINT8*>(&bytes[0])); // TODO: const-ness API bug in NFA_RwWriteNDef! 380525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 3812534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ALOGD ("%s: enter; len = %zu", __FUNCTION__, bytes.size()); 382525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 383525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Create the write semaphore */ 384525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sem_init (&sWriteSem, 0, 0) == -1) 385525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 386525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: semaphore creation failed (errno=0x%08x)", __FUNCTION__, errno); 387525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return JNI_FALSE; 388525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 389525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 390525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sWriteWaitingForComplete = JNI_TRUE; 391525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sCheckNdefStatus == NFA_STATUS_FAILED) 392525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 393525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //if tag does not contain a NDEF message 394525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //and tag is capable of storing NDEF message 395525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sCheckNdefCapable) 396525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 397525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: try format", __FUNCTION__); 398525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sem_init (&sFormatSem, 0, 0); 399525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sFormatOk = false; 4008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE) 4018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 4028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao static uint8_t mfc_key1[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; 4038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao static uint8_t mfc_key2[6] = {0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7}; 4048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 4058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = EXTNS_MfcFormatTag (mfc_key1, sizeof(mfc_key1)); 4068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (status != NFA_STATUS_OK) 4078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 4088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ALOGE ("%s: can't format mifare classic tag", __FUNCTION__); 4098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao sem_destroy (&sFormatSem); 4108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao goto TheEnd; 4118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 4128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 4138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sFormatOk == false) //if format operation failed 4148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 4158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao sem_wait (&sFormatSem); 4168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao sem_destroy (&sFormatSem); 4178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao sem_init (&sFormatSem, 0, 0); 4188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = EXTNS_MfcFormatTag (mfc_key2, sizeof(mfc_key2)); 4198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (status != NFA_STATUS_OK) 4208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 4218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ALOGE ("%s: can't format mifare classic tag", __FUNCTION__); 4228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao sem_destroy (&sFormatSem); 4238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao goto TheEnd; 4248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 4258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 4268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 4278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao else 4288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 4298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = NFA_RwFormatTag (); 4308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 431525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sem_wait (&sFormatSem); 432525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sem_destroy (&sFormatSem); 433525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sFormatOk == false) //if format operation failed 434525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 435525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 436525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: try write", __FUNCTION__); 4372534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes status = NFA_RwWriteNDef (p_data, bytes.size()); 438525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 4392534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes else if (bytes.size() == 0) 440525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 441525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //if (NXP TagWriter wants to erase tag) then create and write an empty ndef message 442525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NDEF_MsgInit (buffer, maxBufferSize, &curDataSize); 443525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project status = NDEF_MsgAddRec (buffer, maxBufferSize, &curDataSize, NDEF_TNF_EMPTY, NULL, 0, NULL, 0, NULL, 0); 444525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: create empty ndef msg; status=%u; size=%lu", __FUNCTION__, status, curDataSize); 4458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE) 4468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 4478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = EXTNS_MfcWriteNDef (buffer, curDataSize); 4488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 4498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao else 4508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 4518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = NFA_RwWriteNDef (buffer, curDataSize); 4528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 453525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 454525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 455525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 456525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: NFA_RwWriteNDef", __FUNCTION__); 4578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE) 4588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 4598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = EXTNS_MfcWriteNDef (p_data, bytes.size()); 4608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 4618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao else 4628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 4638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = NFA_RwWriteNDef (p_data, bytes.size()); 4648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 465525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 466525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 467525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (status != NFA_STATUS_OK) 468525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 469525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: write/format error=%d", __FUNCTION__, status); 470525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 471525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 472525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 473525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Wait for write completion status */ 474525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sWriteOk = false; 475525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sem_wait (&sWriteSem)) 476525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 477525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: wait semaphore (errno=0x%08x)", __FUNCTION__, errno); 478525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 479525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 480525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 481525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project result = sWriteOk; 482525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 483525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd: 484525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Destroy semaphore */ 485525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sem_destroy (&sWriteSem)) 486525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 487525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: failed destroy semaphore (errno=0x%08x)", __FUNCTION__, errno); 488525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 489525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sWriteWaitingForComplete = JNI_FALSE; 490525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit; result=%d", __FUNCTION__, result); 491525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return result; 492525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 493525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 494525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 495525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 496525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 497525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doConnectStatus 498525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 499525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Receive the completion status of connect operation. 500525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** isConnectOk: Status of the operation. 501525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 502525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 503525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 504525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 505525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_doConnectStatus (jboolean isConnectOk) 506525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 5078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (EXTNS_GetConnectFlag () == TRUE) 5088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 5098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao EXTNS_MfcActivated (); 5108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao EXTNS_SetConnectFlag (FALSE); 5118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao return; 5128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 5138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 514525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sConnectWaitingForComplete != JNI_FALSE) 515525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 516525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sConnectWaitingForComplete = JNI_FALSE; 517525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sConnectOk = isConnectOk; 518525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard g (sReconnectEvent); 519525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sReconnectEvent.notifyOne (); 520525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 521525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 522525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 523525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 524525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 525525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 526525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doDeactivateStatus 527525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 528525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Receive the completion status of deactivate operation. 529525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 530525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 531525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 532525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 533525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_doDeactivateStatus (int status) 534525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 5358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (EXTNS_GetDeactivateFlag () == TRUE) 5368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 5378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao EXTNS_MfcDisconnect (); 5388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao EXTNS_SetDeactivateFlag (FALSE); 5398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao return; 5408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 5418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 542525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sGotDeactivate = (status == 0); 543525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 544525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard g (sReconnectEvent); 545525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sReconnectEvent.notifyOne (); 546525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 547525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 548525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 549525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 550525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 551525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doConnect 552525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 553525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Connect to the tag in RF field. 554525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 555525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 556525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** targetHandle: Handle of the tag. 557525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 558525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Must return NXP status code, which NFC service expects. 559525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 560525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 5612534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jint nativeNfcTag_doConnect (JNIEnv*, jobject, jint targetHandle) 562525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 563525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: targetHandle = %d", __FUNCTION__, targetHandle); 564525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project int i = targetHandle; 565525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcTag& natTag = NfcTag::getInstance (); 566525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project int retCode = NFCSTATUS_SUCCESS; 567525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 568525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (i >= NfcTag::MAX_NUM_TECHNOLOGY) 569525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 570525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: Handle not found", __FUNCTION__); 571525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project retCode = NFCSTATUS_FAILED; 572525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 573525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 574525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 575525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (natTag.getActivationState() != NfcTag::Active) 576525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 577525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: tag already deactivated", __FUNCTION__); 578525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project retCode = NFCSTATUS_FAILED; 579525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 580525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 581525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 582a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu sCurrentConnectedTargetType = natTag.mTechList[i]; 5838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao sCurrentConnectedTargetProtocol = natTag.mTechLibNfcTypes[i]; 5848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 5858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetProtocol != NFC_PROTOCOL_ISO_DEP) 586525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 5878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ALOGD ("%s() Nfc type = %d, do nothing for non ISO_DEP", __FUNCTION__, sCurrentConnectedTargetProtocol); 588525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project retCode = NFCSTATUS_SUCCESS; 589525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 590525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 591525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 5928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetType == TARGET_TYPE_ISO14443_3A || sCurrentConnectedTargetType == TARGET_TYPE_ISO14443_3B) 593525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 5948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ALOGD ("%s: switching to tech: %d need to switch rf intf to frame", __FUNCTION__, sCurrentConnectedTargetType); 595133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen retCode = switchRfInterface(NFA_INTERFACE_FRAME) ? NFA_STATUS_OK : NFA_STATUS_FAILED; 596525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 597525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 598525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 599133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen retCode = switchRfInterface(NFA_INTERFACE_ISO_DEP) ? NFA_STATUS_OK : NFA_STATUS_FAILED; 600525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 601525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 602525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd: 603525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit 0x%X", __FUNCTION__, retCode); 604525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return retCode; 605525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 606525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 6078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 608525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 609525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 610525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: reSelect 611525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 612525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Deactivates the tag and re-selects it with the specified 613525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** rf interface. 614525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 615525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: status code, 0 on success, 1 on failure, 616525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 146 (defined in service) on tag lost 617525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 618525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 619a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chustatic int reSelect (tNFA_INTF_TYPE rfInterface, bool fSwitchIfNeeded) 620525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 621a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD ("%s: enter; rf intf = %d, current intf = %d", __FUNCTION__, rfInterface, sCurrentRfInterface); 622a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 623a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu sRfInterfaceMutex.lock (); 624a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 625a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (fSwitchIfNeeded && (rfInterface == sCurrentRfInterface)) 626a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 627a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu // already in the requested interface 628a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu sRfInterfaceMutex.unlock (); 629a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu return 0; // success 630a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu } 631a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 632525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcTag& natTag = NfcTag::getInstance (); 633525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 634525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_STATUS status; 635525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project int rVal = 1; 636525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 637525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project do 638525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 639525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //if tag has shutdown, abort this method 640525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (NfcTag::getInstance ().isNdefDetectionTimedOut()) 641525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 642525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: ndef detection timeout; break", __FUNCTION__); 643525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project rVal = STATUS_CODE_TARGET_LOST; 644525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 645525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 646525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 647525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 648525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard g (sReconnectEvent); 649525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project gIsTagDeactivating = true; 650525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sGotDeactivate = false; 651525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: deactivate to sleep", __FUNCTION__); 652525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (NFA_STATUS_OK != (status = NFA_Deactivate (TRUE))) //deactivate to sleep state 653525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 654525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: deactivate failed, status = %d", __FUNCTION__, status); 655525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 656525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 657525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 658525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sReconnectEvent.wait (1000) == false) //if timeout occurred 659525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 660525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: timeout waiting for deactivate", __FUNCTION__); 661525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 662525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 663525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 664a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (!sGotDeactivate) 665a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 666a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu rVal = STATUS_CODE_TARGET_LOST; 667a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu break; 668a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu } 669a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 670525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (NfcTag::getInstance ().getActivationState () != NfcTag::Sleep) 671525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 672b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen ALOGE ("%s: tag is not in sleep", __FUNCTION__); 673525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project rVal = STATUS_CODE_TARGET_LOST; 674525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 675525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 676525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 677525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project gIsTagDeactivating = false; 678525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 679525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 680525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard g2 (sReconnectEvent); 681525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 682525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sConnectWaitingForComplete = JNI_TRUE; 683525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: select interface %u", __FUNCTION__, rfInterface); 684525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project gIsSelectingRfInterface = true; 685525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (NFA_STATUS_OK != (status = NFA_Select (natTag.mTechHandles[0], natTag.mTechLibNfcTypes[0], rfInterface))) 686525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 687525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: NFA_Select failed, status = %d", __FUNCTION__, status); 688525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 689525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 690525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 691525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sConnectOk = false; 692525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sReconnectEvent.wait (1000) == false) //if timeout occured 693525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 694525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: timeout waiting for select", __FUNCTION__); 695525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 696525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 697525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 698525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 699525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: select completed; sConnectOk=%d", __FUNCTION__, sConnectOk); 700525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (NfcTag::getInstance ().getActivationState () != NfcTag::Active) 701525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 702b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen ALOGE("%s: tag is not active", __FUNCTION__); 703525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project rVal = STATUS_CODE_TARGET_LOST; 704525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 705525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 706a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (sConnectOk) 707a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 708a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu rVal = 0; // success 709a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu sCurrentRfInterface = rfInterface; 710a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu } 711a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu else 712a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 713a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu rVal = 1; 714a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu } 715525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } while (0); 716525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 717525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sConnectWaitingForComplete = JNI_FALSE; 718525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project gIsTagDeactivating = false; 719525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project gIsSelectingRfInterface = false; 720a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu sRfInterfaceMutex.unlock (); 721525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit; status=%d", __FUNCTION__, rVal); 722525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return rVal; 723525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 724525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 725525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 726525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 727525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: switchRfInterface 728525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 729525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Switch controller's RF interface to frame, ISO-DEP, or NFC-DEP. 730525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** rfInterface: Type of RF interface. 731525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 732525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if ok. 733525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 734525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 735525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic bool switchRfInterface (tNFA_INTF_TYPE rfInterface) 736525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 737525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcTag& natTag = NfcTag::getInstance (); 738525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 7398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetProtocol != NFC_PROTOCOL_ISO_DEP) 740525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 741525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: protocol: %d not ISO_DEP, do nothing", __FUNCTION__, natTag.mTechLibNfcTypes[0]); 742525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return true; 743525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 744525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 745525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: new rf intf = %d, cur rf intf = %d", __FUNCTION__, rfInterface, sCurrentRfInterface); 746525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 747a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu return (0 == reSelect(rfInterface, true)); 748525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 749525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 750525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 751525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 752525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 753525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doReconnect 754525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 755525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Re-connect to the tag in RF field. 756525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 757525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 758525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 759525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Status code. 760525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 761525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 7622534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jint nativeNfcTag_doReconnect (JNIEnv*, jobject) 763525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 764525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter", __FUNCTION__); 765525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project int retCode = NFCSTATUS_SUCCESS; 766525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcTag& natTag = NfcTag::getInstance (); 767525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 768525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (natTag.getActivationState() != NfcTag::Active) 769525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 770525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: tag already deactivated", __FUNCTION__); 771525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project retCode = NFCSTATUS_FAILED; 772525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 773525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 774525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 775218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen // special case for Kovio 7768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetProtocol == TARGET_TYPE_KOVIO_BARCODE) 777218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen { 778218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen ALOGD ("%s: fake out reconnect for Kovio", __FUNCTION__); 779218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen goto TheEnd; 780218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen } 781218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen 782133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen // this is only supported for type 2 or 4 (ISO_DEP) tags 7838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_ISO_DEP) 7848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao retCode = reSelect (NFA_INTERFACE_ISO_DEP, false); 7858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao else if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_T2T) 7868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao retCode = reSelect (NFA_INTERFACE_FRAME, false); 7878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao else if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE) 7888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao retCode = reSelect (NFA_INTERFACE_MIFARE, false); 789525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 790525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd: 791525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit 0x%X", __FUNCTION__, retCode); 792525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return retCode; 793525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 794525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 795525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 796525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 797525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 798525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doHandleReconnect 799525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 800525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Re-connect to the tag in RF field. 801525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 802525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 803525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** targetHandle: Handle of the tag. 804525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 805525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Status code. 806525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 807525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 808525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jint nativeNfcTag_doHandleReconnect (JNIEnv *e, jobject o, jint targetHandle) 809525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 810525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: targetHandle = %d", __FUNCTION__, targetHandle); 811525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return nativeNfcTag_doConnect (e, o, targetHandle); 812525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 813525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 814525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 815525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 816525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 817525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doDisconnect 818525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 819525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Deactivate the RF field. 820525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 821525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 822525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 823525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if ok. 824525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 825525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 8262534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nativeNfcTag_doDisconnect (JNIEnv*, jobject) 827525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 828525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter", __FUNCTION__); 829525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_STATUS nfaStat = NFA_STATUS_OK; 830525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 831a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu NfcTag::getInstance().resetAllTransceiveTimeouts (); 832525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 833525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (NfcTag::getInstance ().getActivationState () != NfcTag::Active) 834525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 835525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: tag already deactivated", __FUNCTION__); 836525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 837525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 838525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 839525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project nfaStat = NFA_Deactivate (FALSE); 840525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (nfaStat != NFA_STATUS_OK) 841525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: deactivate failed; error=0x%X", __FUNCTION__, nfaStat); 842525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 843525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd: 844525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit", __FUNCTION__); 845525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return (nfaStat == NFA_STATUS_OK) ? JNI_TRUE : JNI_FALSE; 846525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 847525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 848525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 849525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 850525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 851525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doTransceiveStatus 852525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 853525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Receive the completion status of transceive operation. 854b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** status: operation status. 855525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** buf: Contains tag's response. 856525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** bufLen: Length of buffer. 857525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 858525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 859525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 860525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 861b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenenvoid nativeNfcTag_doTransceiveStatus (tNFA_STATUS status, uint8_t* buf, uint32_t bufLen) 862525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 863a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu SyncEventGuard g (sTransceiveEvent); 864b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen ALOGD ("%s: data len=%d", __FUNCTION__, bufLen); 8658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 8668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE) 8678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 8688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (EXTNS_GetCallBackFlag () == FALSE) 8698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 8708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao EXTNS_MfcCallBack (buf, bufLen); 8718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao return; 8728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 8738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 8748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 875525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (!sWaitingForTransceive) 876b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen { 877b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen ALOGE ("%s: drop data", __FUNCTION__); 878525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return; 879b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen } 880b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen sRxDataStatus = status; 881133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen if (sRxDataStatus == NFA_STATUS_OK || sRxDataStatus == NFA_STATUS_CONTINUE) 882133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen sRxDataBuffer.append (buf, bufLen); 883133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen 884133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen if (sRxDataStatus == NFA_STATUS_OK) 885b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen sTransceiveEvent.notifyOne (); 886525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 887525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 888525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 889a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuvoid nativeNfcTag_notifyRfTimeout () 890a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu{ 891a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu SyncEventGuard g (sTransceiveEvent); 892a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD ("%s: waiting for transceive: %d", __FUNCTION__, sWaitingForTransceive); 893a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (!sWaitingForTransceive) 894a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu return; 895a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 896a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu sTransceiveRfTimeout = true; 897a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 898a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu sTransceiveEvent.notifyOne (); 899a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu} 900b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 901b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 902525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 903525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 904525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doTransceive 905525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 906525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Send raw data to the tag; receive tag's response. 907525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 908525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 909525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** raw: Not used. 910525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** statusTargetLost: Whether tag responds or times out. 911525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 912525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Response from tag. 913525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 914525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 9158605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic jbyteArray nativeNfcTag_doTransceive (JNIEnv* e, jobject o, jbyteArray data, jboolean raw, jintArray statusTargetLost) 916525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 917b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen int timeout = NfcTag::getInstance ().getTransceiveTimeout (sCurrentConnectedTargetType); 918a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD ("%s: enter; raw=%u; timeout = %d", __FUNCTION__, raw, timeout); 9198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 920525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project bool waitOk = false; 921525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project bool isNack = false; 922525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project jint *targetLost = NULL; 9238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao tNFA_STATUS status; 924525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 925525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (NfcTag::getInstance ().getActivationState () != NfcTag::Active) 926525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 927525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (statusTargetLost) 928525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 929525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project targetLost = e->GetIntArrayElements (statusTargetLost, 0); 930525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (targetLost) 931525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *targetLost = 1; //causes NFC service to throw TagLostException 932525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project e->ReleaseIntArrayElements (statusTargetLost, targetLost, 0); 933525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 934525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: tag not active", __FUNCTION__); 935525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return NULL; 936525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 937525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 938525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NfcTag& natTag = NfcTag::getInstance (); 939525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 940525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // get input buffer and length from java call 9412534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedByteArrayRO bytes(e, data); 9422534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0])); // TODO: API bug; NFA_SendRawFrame should take const*! 9432534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes size_t bufLen = bytes.size(); 944525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 945525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (statusTargetLost) 946525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 947525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project targetLost = e->GetIntArrayElements (statusTargetLost, 0); 948525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (targetLost) 949525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *targetLost = 0; //success, tag is still present 950525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 951525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 952525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sSwitchBackTimer.kill (); 9532534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedLocalRef<jbyteArray> result(e, NULL); 954525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project do 955525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 956525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 957525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard g (sTransceiveEvent); 958a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu sTransceiveRfTimeout = false; 959a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu sWaitingForTransceive = true; 960b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen sRxDataStatus = NFA_STATUS_OK; 961b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen sRxDataBuffer.clear (); 9628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 9638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE) 9648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 9658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = EXTNS_MfcTransceive (buf, bufLen); 9668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 9678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao else 9688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 9698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = NFA_SendRawFrame (buf, bufLen, 9708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao NFA_DM_DEFAULT_PRESENCE_CHECK_START_DELAY); 9718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 9728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 973525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (status != NFA_STATUS_OK) 974525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 975525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: fail send; error=%d", __FUNCTION__, status); 976525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 977525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 978a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu waitOk = sTransceiveEvent.wait (timeout); 979525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 980525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 981a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (waitOk == false || sTransceiveRfTimeout) //if timeout occurred 982525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 983525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: wait response timeout", __FUNCTION__); 984525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (targetLost) 985525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *targetLost = 1; //causes NFC service to throw TagLostException 986525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 987525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 988525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 989525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (NfcTag::getInstance ().getActivationState () != NfcTag::Active) 990525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 991525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: already deactivated", __FUNCTION__); 992525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (targetLost) 993525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *targetLost = 1; //causes NFC service to throw TagLostException 994525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 995525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 996525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 9971a751c9459bf1c43aa4bdd3da4a2c9f35a1c8d4bAurimas Liutikas ALOGD ("%s: response %zu bytes", __FUNCTION__, sRxDataBuffer.size()); 998525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 999525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if ((natTag.getProtocol () == NFA_PROTOCOL_T2T) && 1000705ca580725b89b63aff0a14762024b0f2c73883Evan Chu natTag.isT2tNackResponse (sRxDataBuffer.data(), sRxDataBuffer.size())) 1001525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1002525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project isNack = true; 1003525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1004525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1005b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen if (sRxDataBuffer.size() > 0) 1006525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1007b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen if (isNack) 1008b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen { 1009b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen //Some Mifare Ultralight C tags enter the HALT state after it 1010b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen //responds with a NACK. Need to perform a "reconnect" operation 1011b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen //to wake it. 1012b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen ALOGD ("%s: try reconnect", __FUNCTION__); 1013b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen nativeNfcTag_doReconnect (NULL, NULL); 1014b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen ALOGD ("%s: reconnect finish", __FUNCTION__); 1015b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen } 10168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao else if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE) 10178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 10188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao uint32_t transDataLen = sRxDataBuffer.size (); 10198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao uint8_t *transData = (uint8_t *) sRxDataBuffer.data (); 10208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (EXTNS_CheckMfcResponse (&transData, &transDataLen) == NFCSTATUS_FAILED) 10218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 10228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao nativeNfcTag_doReconnect (e, o); 10238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 10248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao else 10258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 10268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (transDataLen != 0) 10278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 10288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao result.reset (e->NewByteArray (transDataLen)); 10298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 10308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (result.get () != NULL) 10318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 10328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao e->SetByteArrayRegion (result.get (), 0, transDataLen, (const jbyte *) transData); 10338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 10348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao else 10358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ALOGE ("%s: Failed to allocate java byte array", __FUNCTION__); 10368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 10378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 1038b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen else 1039b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen { 1040525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // marshall data to java for return 1041b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen result.reset(e->NewByteArray(sRxDataBuffer.size())); 1042b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen if (result.get() != NULL) 1043b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen { 1044705ca580725b89b63aff0a14762024b0f2c73883Evan Chu e->SetByteArrayRegion(result.get(), 0, sRxDataBuffer.size(), (const jbyte *) sRxDataBuffer.data()); 1045525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1046525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 1047525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: Failed to allocate java byte array", __FUNCTION__); 1048525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } // else a nack is treated as a transceive failure to the upper layers 1049525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1050b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen sRxDataBuffer.clear(); 1051525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1052525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } while (0); 1053525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1054525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sWaitingForTransceive = false; 1055525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (targetLost) 1056525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project e->ReleaseIntArrayElements (statusTargetLost, targetLost, 0); 1057525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1058525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit", __FUNCTION__); 10592534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes return result.release(); 1060525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1061525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1062525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1063525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1064525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1065525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doGetNdefType 1066525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1067525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Retrieve the type of tag. 1068525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1069525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1070525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** libnfcType: Type of tag represented by JNI. 1071525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** javaType: Not used. 1072525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1073525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Type of tag represented by NFC Service. 1074525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1075525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 10762534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jint nativeNfcTag_doGetNdefType (JNIEnv*, jobject, jint libnfcType, jint javaType) 1077525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1078525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter; libnfc type=%d; java type=%d", __FUNCTION__, libnfcType, javaType); 1079525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project jint ndefType = NDEF_UNKNOWN_TYPE; 1080525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1081525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // For NFA, libnfcType is mapped to the protocol value received 1082525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // in the NFA_ACTIVATED_EVT and NFA_DISC_RESULT_EVT event. 10838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (NFA_PROTOCOL_T1T == libnfcType) 10848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 1085525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ndefType = NDEF_TYPE1_TAG; 10868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 10878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao else if (NFA_PROTOCOL_T2T == libnfcType) 10888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 10898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ndefType = NDEF_TYPE2_TAG; 10908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 10918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao else if (NFA_PROTOCOL_T3T == libnfcType) 10928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 1093525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ndefType = NDEF_TYPE3_TAG; 10948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 10958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao else if (NFA_PROTOCOL_ISO_DEP == libnfcType) 10968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 1097525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ndefType = NDEF_TYPE4_TAG; 10988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 10998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao else if (NFA_PROTOCOL_MIFARE == libnfcType) 11008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 11018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ndefType = NDEF_MIFARE_CLASSIC_TAG; 11028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 11038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao else 11048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 11058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao /* NFA_PROTOCOL_ISO15693, NFA_PROTOCOL_INVALID and others */ 1106525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ndefType = NDEF_UNKNOWN_TYPE; 1107525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1108525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit; ndef type=%d", __FUNCTION__, ndefType); 1109525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return ndefType; 1110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1111525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1112525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1113525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doCheckNdefResult 1116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Receive the result of checking whether the tag contains a NDEF 1118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** message. Called by the NFA_NDEF_DETECT_EVT. 1119525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** status: Status of the operation. 1120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** maxSize: Maximum size of NDEF message. 1121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** currentSize: Current size of NDEF message. 1122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** flags: Indicate various states. 1123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 1125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_doCheckNdefResult (tNFA_STATUS status, uint32_t maxSize, uint32_t currentSize, uint8_t flags) 1128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //this function's flags parameter is defined using the following macros 1130525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //in nfc/include/rw_api.h; 1131525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //#define RW_NDEF_FL_READ_ONLY 0x01 /* Tag is read only */ 1132525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //#define RW_NDEF_FL_FORMATED 0x02 /* Tag formated for NDEF */ 1133525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //#define RW_NDEF_FL_SUPPORTED 0x04 /* NDEF supported by the tag */ 1134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //#define RW_NDEF_FL_UNKNOWN 0x08 /* Unable to find if tag is ndef capable/formated/read only */ 1135525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //#define RW_NDEF_FL_FORMATABLE 0x10 /* Tag supports format operation */ 1136525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1137525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (!sCheckNdefWaitingForComplete) 1138525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1139525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: not waiting", __FUNCTION__); 1140525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return; 1141525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1142525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (flags & RW_NDEF_FL_READ_ONLY) 1144525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: flag read-only", __FUNCTION__); 1145525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (flags & RW_NDEF_FL_FORMATED) 1146525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: flag formatted for ndef", __FUNCTION__); 1147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (flags & RW_NDEF_FL_SUPPORTED) 1148525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: flag ndef supported", __FUNCTION__); 1149525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (flags & RW_NDEF_FL_UNKNOWN) 1150525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: flag all unknown", __FUNCTION__); 1151525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (flags & RW_NDEF_FL_FORMATABLE) 1152525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: flag formattable", __FUNCTION__); 1153525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1154525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sCheckNdefWaitingForComplete = JNI_FALSE; 1155525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sCheckNdefStatus = status; 1156b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen if (sCheckNdefStatus != NFA_STATUS_OK && sCheckNdefStatus != NFA_STATUS_TIMEOUT) 1157b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen sCheckNdefStatus = NFA_STATUS_FAILED; 1158525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sCheckNdefCapable = false; //assume tag is NOT ndef capable 1159525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sCheckNdefStatus == NFA_STATUS_OK) 1160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1161525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //NDEF content is on the tag 1162525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sCheckNdefMaxSize = maxSize; 1163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sCheckNdefCurrentSize = currentSize; 1164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sCheckNdefCardReadOnly = flags & RW_NDEF_FL_READ_ONLY; 1165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sCheckNdefCapable = true; 1166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else if (sCheckNdefStatus == NFA_STATUS_FAILED) 1168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //no NDEF content on the tag 1170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sCheckNdefMaxSize = 0; 1171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sCheckNdefCurrentSize = 0; 1172525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sCheckNdefCardReadOnly = flags & RW_NDEF_FL_READ_ONLY; 1173525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if ((flags & RW_NDEF_FL_UNKNOWN) == 0) //if stack understands the tag 1174525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1175525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (flags & RW_NDEF_FL_SUPPORTED) //if tag is ndef capable 1176525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sCheckNdefCapable = true; 1177525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1178525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1179525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 1180525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1181525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: unknown status=0x%X", __FUNCTION__, status); 1182525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sCheckNdefMaxSize = 0; 1183525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sCheckNdefCurrentSize = 0; 1184525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sCheckNdefCardReadOnly = false; 1185525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1186525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sem_post (&sCheckNdefSem); 1187525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1188525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1189525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1190525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1191525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doCheckNdef 1193525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1194525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Does the tag contain a NDEF message? 1195525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1196525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1197525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** ndefInfo: NDEF info. 1198525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1199525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Status code; 0 is success. 1200525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1201525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 12028605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic jint nativeNfcTag_doCheckNdef (JNIEnv* e, jobject o, jintArray ndefInfo) 1203525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1204525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_STATUS status = NFA_STATUS_FAILED; 1205525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project jint* ndef = NULL; 1206525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1207525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter", __FUNCTION__); 1208525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 120997a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu // special case for Kovio 12108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetProtocol == TARGET_TYPE_KOVIO_BARCODE) 121197a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu { 121297a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu ALOGD ("%s: Kovio tag, no NDEF", __FUNCTION__); 121397a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu ndef = e->GetIntArrayElements (ndefInfo, 0); 121497a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu ndef[0] = 0; 121597a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu ndef[1] = NDEF_MODE_READ_ONLY; 121697a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu e->ReleaseIntArrayElements (ndefInfo, ndef, 0); 121797a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu return NFA_STATUS_FAILED; 121897a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu } 12198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao else if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE) 12208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 12218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao nativeNfcTag_doReconnect (e, o); 12228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 122397a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu 1224525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Create the write semaphore */ 1225525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sem_init (&sCheckNdefSem, 0, 0) == -1) 1226525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1227525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: Check NDEF semaphore creation failed (errno=0x%08x)", __FUNCTION__, errno); 1228525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return JNI_FALSE; 1229525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1230525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1231525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (NfcTag::getInstance ().getActivationState () != NfcTag::Active) 1232525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1233525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: tag already deactivated", __FUNCTION__); 1234525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 1235525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1236525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1237525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: try NFA_RwDetectNDef", __FUNCTION__); 1238525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sCheckNdefWaitingForComplete = JNI_TRUE; 12398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 12408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE) 12418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 12428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = EXTNS_MfcCheckNDef (); 12438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 12448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao else 12458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 12468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = NFA_RwDetectNDef (); 12478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 1248525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1249525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (status != NFA_STATUS_OK) 1250525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1251525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: NFA_RwDetectNDef failed, status = 0x%X", __FUNCTION__, status); 1252525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 1253525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Wait for check NDEF completion status */ 1256525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sem_wait (&sCheckNdefSem)) 1257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: Failed to wait for check NDEF semaphore (errno=0x%08x)", __FUNCTION__, errno); 1259525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 1260525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1261525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1262525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sCheckNdefStatus == NFA_STATUS_OK) 1263525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1264525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //stack found a NDEF message on the tag 1265525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ndef = e->GetIntArrayElements (ndefInfo, 0); 1266525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (NfcTag::getInstance ().getProtocol () == NFA_PROTOCOL_T1T) 1267525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ndef[0] = NfcTag::getInstance ().getT1tMaxMessageSize (); 1268525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 1269525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ndef[0] = sCheckNdefMaxSize; 1270525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sCheckNdefCardReadOnly) 1271525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ndef[1] = NDEF_MODE_READ_ONLY; 1272525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 1273525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ndef[1] = NDEF_MODE_READ_WRITE; 1274525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project e->ReleaseIntArrayElements (ndefInfo, ndef, 0); 1275525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project status = NFA_STATUS_OK; 1276525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1277525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else if (sCheckNdefStatus == NFA_STATUS_FAILED) 1278525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1279525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //stack did not find a NDEF message on the tag; 1280525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ndef = e->GetIntArrayElements (ndefInfo, 0); 1281525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (NfcTag::getInstance ().getProtocol () == NFA_PROTOCOL_T1T) 1282525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ndef[0] = NfcTag::getInstance ().getT1tMaxMessageSize (); 1283525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 1284525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ndef[0] = sCheckNdefMaxSize; 1285525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sCheckNdefCardReadOnly) 1286525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ndef[1] = NDEF_MODE_READ_ONLY; 1287525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 1288525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ndef[1] = NDEF_MODE_READ_WRITE; 1289525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project e->ReleaseIntArrayElements (ndefInfo, ndef, 0); 1290525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project status = NFA_STATUS_FAILED; 1291525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 12923c5b92be7ed8260754a447268c2c2fbfc780582aEvan Chu else if ((sCheckNdefStatus == NFA_STATUS_TIMEOUT) && (NfcTag::getInstance ().getProtocol() == NFC_PROTOCOL_ISO_DEP)) 1293525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1294525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project pn544InteropStopPolling (); 1295525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project status = sCheckNdefStatus; 1296525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1297525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 1298525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1299525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: unknown status 0x%X", __FUNCTION__, sCheckNdefStatus); 1300525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project status = sCheckNdefStatus; 1301525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1302525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 13038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao /* Reconnect Mifare Classic Tag for furture use */ 13048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE) 13058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 13068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao nativeNfcTag_doReconnect (e, o); 13078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 13088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 1309525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd: 1310525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Destroy semaphore */ 1311525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sem_destroy (&sCheckNdefSem)) 1312525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1313525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: Failed to destroy check NDEF semaphore (errno=0x%08x)", __FUNCTION__, errno); 1314525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1315525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sCheckNdefWaitingForComplete = JNI_FALSE; 1316525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit; status=0x%X", __FUNCTION__, status); 1317525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return status; 1318525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1319525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1320525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1321525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1322525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1323525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_resetPresenceCheck 1324525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1325525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Reset variables related to presence-check. 1326525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1327525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 1328525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1329525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1330525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_resetPresenceCheck () 1331525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1332a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu sIsTagPresent = true; 1333525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1334525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1335525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1336525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1337525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1338525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doPresenceCheckResult 1339525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1340525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Receive the result of presence-check. 1341525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** status: Result of presence-check. 1342525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1343525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 1344525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1345525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1346525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_doPresenceCheckResult (tNFA_STATUS status) 1347525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1348b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen SyncEventGuard guard (sPresenceCheckEvent); 1349a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu sIsTagPresent = status == NFA_STATUS_OK; 1350b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen sPresenceCheckEvent.notifyOne (); 1351525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1352525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1353525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1354525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1355525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1356525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doPresenceCheck 1357525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1358525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Check if the tag is in the RF field. 1359525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1360525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1361525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1362525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if tag is in RF field. 1363525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1364525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 13652534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesstatic jboolean nativeNfcTag_doPresenceCheck (JNIEnv*, jobject) 1366525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1367525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s", __FUNCTION__); 1368525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_STATUS status = NFA_STATUS_OK; 1369525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project jboolean isPresent = JNI_FALSE; 1370525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1371218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen // Special case for Kovio. The deactivation would have already occurred 1372218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen // but was ignored so that normal tag opertions could complete. Now we 1373218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen // want to process as if the deactivate just happened. 13748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetProtocol == TARGET_TYPE_KOVIO_BARCODE) 1375218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen { 1376218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen ALOGD ("%s: Kovio, force deactivate handling", __FUNCTION__); 1377218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen tNFA_DEACTIVATED deactivated = {NFA_DEACTIVATE_TYPE_IDLE}; 1378a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 1379a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu SyncEventGuard g (gDeactivatedEvent); 1380a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu gActivated = false; //guard this variable from multi-threaded access 1381a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu gDeactivatedEvent.notifyOne (); 1382a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu } 1383218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen 1384218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen NfcTag::getInstance().setDeactivationState (deactivated); 1385218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen nativeNfcTag_resetPresenceCheck(); 1386218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen NfcTag::getInstance().connectionEventHandler (NFA_DEACTIVATED_EVT, NULL); 1387218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen nativeNfcTag_abortWaits(); 1388218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen NfcTag::getInstance().abort (); 1389218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen 1390218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen return JNI_FALSE; 1391218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen } 1392218b2ef897289d3e6fd7818c6883809149f62f08Martijn Coenen 1393525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (nfcManager_isNfcActive() == false) 1394525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1395525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: NFC is no longer active.", __FUNCTION__); 1396525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return JNI_FALSE; 1397525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1398525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1399a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (!sRfInterfaceMutex.tryLock()) 1400a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 1401a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD ("%s: tag is being reSelected assume it is present", __FUNCTION__); 1402a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu return JNI_TRUE; 1403a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu } 1404a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 1405a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu sRfInterfaceMutex.unlock(); 1406a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 1407a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (NfcTag::getInstance ().isActivated () == false) 1408525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1409525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: tag already deactivated", __FUNCTION__); 1410525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return JNI_FALSE; 1411525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 14128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE) 14138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 14148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = EXTNS_MfcPresenceCheck (); 14158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (status == NFCSTATUS_SUCCESS) 14168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 14178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao return (NFCSTATUS_SUCCESS == EXTNS_GetPresenceCheckStatus ()) ? JNI_TRUE : JNI_FALSE; 14188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 14198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 1420525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1421525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1422b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen SyncEventGuard guard (sPresenceCheckEvent); 1423b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen status = NFA_RwPresenceCheck (NfcTag::getInstance().getPresenceCheckAlgorithm()); 1424b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen if (status == NFA_STATUS_OK) 1425525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1426b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen sPresenceCheckEvent.wait (); 1427a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu isPresent = sIsTagPresent ? JNI_TRUE : JNI_FALSE; 1428525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1429525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1430525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1431525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (isPresent == JNI_FALSE) 1432a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD ("%s: tag absent", __FUNCTION__); 1433525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return isPresent; 1434525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1435525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1436525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1437525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1438525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1439525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doIsNdefFormatable 1440525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1441525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Can tag be formatted to store NDEF message? 1442525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1443525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1444525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** libNfcType: Type of tag. 1445525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** uidBytes: Tag's unique ID. 1446525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** pollBytes: Data from activation. 1447525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** actBytes: Data from activation. 1448525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1449525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if formattable. 1450525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1451525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1452fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liaostatic jboolean nativeNfcTag_doIsNdefFormatable (JNIEnv* e, 1453fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao jobject o, jint /*libNfcType*/, jbyteArray, jbyteArray, 14542534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes jbyteArray) 1455525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1456525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project jboolean isFormattable = JNI_FALSE; 145726e1bc78a82d8a629a955d875c56a45ac625797aJizhou Liao tNFC_PROTOCOL protocol = NfcTag::getInstance().getProtocol(); 14588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (NFA_PROTOCOL_T1T == protocol || NFA_PROTOCOL_ISO15693 == protocol 14598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao || NFA_PROTOCOL_MIFARE == protocol) 1460525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1461525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project isFormattable = JNI_TRUE; 146226e1bc78a82d8a629a955d875c56a45ac625797aJizhou Liao } 146326e1bc78a82d8a629a955d875c56a45ac625797aJizhou Liao else if (NFA_PROTOCOL_T3T == protocol) 146426e1bc78a82d8a629a955d875c56a45ac625797aJizhou Liao { 1465b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen isFormattable = NfcTag::getInstance().isFelicaLite() ? JNI_TRUE : JNI_FALSE; 146626e1bc78a82d8a629a955d875c56a45ac625797aJizhou Liao } 146726e1bc78a82d8a629a955d875c56a45ac625797aJizhou Liao else if (NFA_PROTOCOL_T2T == protocol) 146826e1bc78a82d8a629a955d875c56a45ac625797aJizhou Liao { 1469b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen isFormattable = ( NfcTag::getInstance().isMifareUltralight() | 1470b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen NfcTag::getInstance().isInfineonMyDMove() | 1471b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen NfcTag::getInstance().isKovioType2Tag() ) 1472b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen ? JNI_TRUE : JNI_FALSE; 1473525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1474fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao else if (NFA_PROTOCOL_ISO_DEP == protocol) 1475fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao { 1476fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao /** 1477fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao * Determines whether this is a formatable IsoDep tag - currectly only NXP DESFire 1478fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao * is supported. 1479fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao */ 1480fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao uint8_t cmd[] = {0x90, 0x60, 0x00, 0x00, 0x00}; 1481fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao 1482fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao if (NfcTag::getInstance ().isMifareDESFire ()) 1483fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao { 1484fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao /* Identifies as DESfire, use get version cmd to be sure */ 1485fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao jbyteArray versionCmd = e->NewByteArray (5); 1486fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao e->SetByteArrayRegion (versionCmd, 0, 5, (jbyte*) cmd); 1487fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao jbyteArray respBytes = nativeNfcTag_doTransceive(e, o, versionCmd, JNI_TRUE, NULL); 1488fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao if (respBytes != NULL) 1489fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao { 1490fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao // Check whether the response matches a typical DESfire 1491fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao // response. 1492fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao // libNFC even does more advanced checking than we do 1493fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao // here, and will only format DESfire's with a certain 1494fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao // major/minor sw version and NXP as a manufacturer. 1495fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao // We don't want to do such checking here, to avoid 1496fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao // having to change code in multiple places. 1497fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao // A succesful (wrapped) DESFire getVersion command returns 1498fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao // 9 bytes, with byte 7 0x91 and byte 8 having status 1499fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao // code 0xAF (these values are fixed and well-known). 1500fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao int respLength = e->GetArrayLength (respBytes); 1501fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao uint8_t* resp = (uint8_t*) e->GetByteArrayElements (respBytes, NULL); 1502fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao if (respLength == 9 && resp[7] == 0x91 && resp[8] == 0xAF) 1503fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao { 1504fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao isFormattable = JNI_TRUE; 1505fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao } 1506fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao e->ReleaseByteArrayElements (respBytes, (jbyte *) resp, JNI_ABORT); 1507fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao } 1508fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao } 1509fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao } 151026e1bc78a82d8a629a955d875c56a45ac625797aJizhou Liao 1511525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD("%s: is formattable=%u", __FUNCTION__, isFormattable); 1512525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return isFormattable; 1513525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1514525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1515525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1516525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1517525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1518525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doIsIsoDepNdefFormatable 1519525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1520525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Is ISO-DEP tag formattable? 1521525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1522525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1523525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** pollBytes: Data from activation. 1524525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** actBytes: Data from activation. 1525525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1526525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if formattable. 1527525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1528525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1529525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic jboolean nativeNfcTag_doIsIsoDepNdefFormatable (JNIEnv *e, jobject o, jbyteArray pollBytes, jbyteArray actBytes) 1530525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1531525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project uint8_t uidFake[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; 1532525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s", __FUNCTION__); 1533525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project jbyteArray uidArray = e->NewByteArray (8); 1534525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project e->SetByteArrayRegion (uidArray, 0, 8, (jbyte*) uidFake); 1535525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return nativeNfcTag_doIsNdefFormatable (e, o, 0, uidArray, pollBytes, actBytes); 1536525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1537525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1538525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1539525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1540525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 15418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** Function: nativeNfcTag_makeMifareNdefFormat 15428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** 15438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** Description: Format a mifare classic tag so it can store NDEF message. 15448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** e: JVM environment. 15458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** o: Java object. 15468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** key: Key to acces tag. 15478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** keySize: size of Key. 15488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** 15498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** Returns: True if ok. 15508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** 15518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao*******************************************************************************/ 15528605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic jboolean nativeNfcTag_makeMifareNdefFormat (JNIEnv *e, jobject o, uint8_t *key, uint32_t keySize) 15538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{ 15548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ALOGD ("%s: enter", __FUNCTION__); 15558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao tNFA_STATUS status = NFA_STATUS_OK; 15568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 15578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = nativeNfcTag_doReconnect (e, o); 15588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (status != NFA_STATUS_OK) 15598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 15608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ALOGD ("%s: reconnect error, status=%u", __FUNCTION__, status); 15618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao return JNI_FALSE; 15628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 15638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 15648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao sem_init (&sFormatSem, 0, 0); 15658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao sFormatOk = false; 15668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 15678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = EXTNS_MfcFormatTag (key, keySize); 15688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 15698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (status == NFA_STATUS_OK) 15708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 15718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ALOGD ("%s: wait for completion", __FUNCTION__); 15728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao sem_wait (&sFormatSem); 15738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = sFormatOk ? NFA_STATUS_OK : NFA_STATUS_FAILED; 15748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 15758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao else 15768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 15778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ALOGE ("%s: error status=%u", __FUNCTION__, status); 15788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 15798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 15808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao sem_destroy (&sFormatSem); 15818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ALOGD ("%s: exit", __FUNCTION__); 15828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao return (status == NFA_STATUS_OK) ? JNI_TRUE : JNI_FALSE; 15838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao} 15848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 15858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 15868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************* 15878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** 1588525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doNdefFormat 1589525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1590525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Format a tag so it can store NDEF message. 1591525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1592525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1593525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** key: Not used. 1594525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1595525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if ok. 1596525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1597525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1598fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liaostatic jboolean nativeNfcTag_doNdefFormat (JNIEnv *e, jobject o, jbyteArray) 1599525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1600525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter", __FUNCTION__); 1601525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_STATUS status = NFA_STATUS_OK; 1602525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1603a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu // Do not try to format if tag is already deactivated. 1604a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (NfcTag::getInstance ().isActivated () == false) 1605a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 1606a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD ("%s: tag already deactivated(no need to format)", __FUNCTION__); 1607a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu return JNI_FALSE; 1608a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu } 1609a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 16108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE) 16118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 16128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao static uint8_t mfc_key1[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; 16138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao static uint8_t mfc_key2[6] = {0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7}; 16148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao jboolean result; 16158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 16168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao result = nativeNfcTag_makeMifareNdefFormat (e, o, mfc_key1, sizeof(mfc_key1)); 16178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (result == JNI_FALSE) 16188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 16198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao result = nativeNfcTag_makeMifareNdefFormat (e, o, mfc_key2, sizeof(mfc_key2)); 16208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 16218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao return result; 16228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 16238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 1624525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sem_init (&sFormatSem, 0, 0); 1625525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sFormatOk = false; 1626525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project status = NFA_RwFormatTag (); 1627525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (status == NFA_STATUS_OK) 1628525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1629525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: wait for completion", __FUNCTION__); 1630525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sem_wait (&sFormatSem); 1631525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project status = sFormatOk ? NFA_STATUS_OK : NFA_STATUS_FAILED; 1632525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1633525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 1634525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: error status=%u", __FUNCTION__, status); 1635525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sem_destroy (&sFormatSem); 1636525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 16378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_ISO_DEP) 1638fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao { 1639fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao int retCode = NFCSTATUS_SUCCESS; 1640fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao retCode = nativeNfcTag_doReconnect (e, o); 1641fbbf11310bf4899be18fa3779e86d70a9ccc0764Jizhou Liao } 1642525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit", __FUNCTION__); 1643525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return (status == NFA_STATUS_OK) ? JNI_TRUE : JNI_FALSE; 1644525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1645525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1646525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1647525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1648525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1649525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doMakeReadonlyResult 1650525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1651525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Receive the result of making a tag read-only. Called by the 1652525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** NFA_SET_TAG_RO_EVT. 1653525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** status: Status of the operation. 1654525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1655525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 1656525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1657525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1658525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_doMakeReadonlyResult (tNFA_STATUS status) 1659525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1660525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sMakeReadonlyWaitingForComplete != JNI_FALSE) 1661525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1662525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sMakeReadonlyWaitingForComplete = JNI_FALSE; 1663525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sMakeReadonlyStatus = status; 1664525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1665525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sem_post (&sMakeReadonlySem); 1666525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1667525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1668525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1669525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1670525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1671525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 16728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** Function: nativeNfcTag_makeMifareReadonly 16738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** 16748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** Description: Make the mifare classic tag read-only. 16758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** e: JVM environment. 16768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** o: Java object. 16778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** key: Key to access the tag. 16788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** keySize: size of Key. 16798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** 16808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** Returns: True if ok. 16818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** 16828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao*******************************************************************************/ 16838605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic jboolean nativeNfcTag_makeMifareReadonly (JNIEnv *e, jobject o, uint8_t *key, int32_t keySize) 16848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{ 16858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao jboolean result = JNI_FALSE; 16868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao tNFA_STATUS status = NFA_STATUS_OK; 16878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 16888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao sMakeReadonlyStatus = NFA_STATUS_FAILED; 16898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 16908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ALOGD ("%s", __FUNCTION__); 16918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 16928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao /* Create the make_readonly semaphore */ 16938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sem_init (&sMakeReadonlySem, 0, 0) == -1) 16948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 16958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ALOGE ("%s: Make readonly semaphore creation failed (errno=0x%08x)", __FUNCTION__, errno); 16968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao return JNI_FALSE; 16978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 16988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 16998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao sMakeReadonlyWaitingForComplete = JNI_TRUE; 17008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 17018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = nativeNfcTag_doReconnect (e, o); 17028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (status != NFA_STATUS_OK) 17038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 17048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao goto TheEnd; 17058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 17068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 17078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao status = EXTNS_MfcSetReadOnly (key, keySize); 17088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (status != NFA_STATUS_OK) 17098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 17108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao goto TheEnd; 17118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 17128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao sem_wait (&sMakeReadonlySem); 17138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 17148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sMakeReadonlyStatus == NFA_STATUS_OK) 17158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 17168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao result = JNI_TRUE; 17178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 17188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 17198605731e8f17d1fde003084811f13f52539eb20cJizhou LiaoTheEnd: 17208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao /* Destroy semaphore */ 17218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sem_destroy (&sMakeReadonlySem)) 17228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 17238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ALOGE ("%s: Failed to destroy read_only semaphore (errno=0x%08x)", __FUNCTION__, errno); 17248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 17258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao sMakeReadonlyWaitingForComplete = JNI_FALSE; 17268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao return result; 17278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao} 17288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 17298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 17308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************* 17318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao** 1732525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_doMakeReadonly 1733525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1734525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Make the tag read-only. 1735525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 1736525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** o: Java object. 1737525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** key: Key to access the tag. 1738525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1739525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if ok. 1740525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1741525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 17428605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic jboolean nativeNfcTag_doMakeReadonly (JNIEnv *e, jobject o, jbyteArray) 1743525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1744525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project jboolean result = JNI_FALSE; 1745525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_STATUS status; 1746525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1747525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s", __FUNCTION__); 1748525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 17498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (sCurrentConnectedTargetProtocol == NFA_PROTOCOL_MIFARE) 17508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 17518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao static uint8_t mfc_key1[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; 17528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao static uint8_t mfc_key2[6] = {0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7}; 17538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao result = nativeNfcTag_makeMifareReadonly (e, o, mfc_key1, sizeof(mfc_key1)); 17548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao if (result == JNI_FALSE) 17558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao { 17568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao result = nativeNfcTag_makeMifareReadonly (e, o, mfc_key2, sizeof(mfc_key2)); 17578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 17588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao return result; 17598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao } 17608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao 1761525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Create the make_readonly semaphore */ 1762525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sem_init (&sMakeReadonlySem, 0, 0) == -1) 1763525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1764525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: Make readonly semaphore creation failed (errno=0x%08x)", __FUNCTION__, errno); 1765525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return JNI_FALSE; 1766525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1767525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1768525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sMakeReadonlyWaitingForComplete = JNI_TRUE; 1769525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1770525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // Hard-lock the tag (cannot be reverted) 1771525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project status = NFA_RwSetTagReadOnly(TRUE); 1772a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (status == NFA_STATUS_REJECTED) 1773a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 1774a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu status = NFA_RwSetTagReadOnly (FALSE); //try soft lock 1775a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (status != NFA_STATUS_OK) 1776a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 1777a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGE ("%s: fail soft lock, status=%d", __FUNCTION__, status); 1778a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu goto TheEnd; 1779a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu } 1780a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu } 1781a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu else if (status != NFA_STATUS_OK) 1782525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1783a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGE ("%s: fail hard lock, status=%d", __FUNCTION__, status); 1784525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 1785525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1786525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1787525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Wait for check NDEF completion status */ 1788525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sem_wait (&sMakeReadonlySem)) 1789525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1790525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: Failed to wait for make_readonly semaphore (errno=0x%08x)", __FUNCTION__, errno); 1791525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 1792525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1793525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1794525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sMakeReadonlyStatus == NFA_STATUS_OK) 1795525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1796525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project result = JNI_TRUE; 1797525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1798525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1799525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd: 1800525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Destroy semaphore */ 1801525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sem_destroy (&sMakeReadonlySem)) 1802525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1803525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: Failed to destroy read_only semaphore (errno=0x%08x)", __FUNCTION__, errno); 1804525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1805525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sMakeReadonlyWaitingForComplete = JNI_FALSE; 1806525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return result; 1807525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1808525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1809525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1810525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1811525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1812525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_registerNdefTypeHandler 1813525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1814525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Register a callback to receive NDEF message from the tag 1815525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** from the NFA_NDEF_DATA_EVT. 1816525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1817525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 1818525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1819525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1820525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project//register a callback to receive NDEF message from the tag 1821525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project//from the NFA_NDEF_DATA_EVT; 1822525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_registerNdefTypeHandler () 1823525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1824525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s", __FUNCTION__); 1825525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sNdefTypeHandlerHandle = NFA_HANDLE_INVALID; 1826525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NFA_RegisterNDefTypeHandler (TRUE, NFA_TNF_DEFAULT, (UINT8 *) "", 0, ndefHandlerCallback); 18278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao EXTNS_MfcRegisterNDefTypeHandler (ndefHandlerCallback); 1828525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1829525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1830525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1831525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1832525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1833525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeNfcTag_deregisterNdefTypeHandler 1834525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1835525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: No longer need to receive NDEF message from the tag. 1836525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1837525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 1838525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1839525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1840525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid nativeNfcTag_deregisterNdefTypeHandler () 1841525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1842525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s", __FUNCTION__); 1843525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project NFA_DeregisterNDefTypeHandler (sNdefTypeHandlerHandle); 1844525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sNdefTypeHandlerHandle = NFA_HANDLE_INVALID; 1845525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1846525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1847525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1848525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/***************************************************************************** 1849525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1850525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** JNI functions for Android 4.0.3 1851525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1852525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/ 1853525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstatic JNINativeMethod gMethods[] = 1854525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1855525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doConnect", "(I)I", (void *)nativeNfcTag_doConnect}, 1856525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doDisconnect", "()Z", (void *)nativeNfcTag_doDisconnect}, 1857525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doReconnect", "()I", (void *)nativeNfcTag_doReconnect}, 1858525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doHandleReconnect", "(I)I", (void *)nativeNfcTag_doHandleReconnect}, 1859525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doTransceive", "([BZ[I)[B", (void *)nativeNfcTag_doTransceive}, 1860525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doGetNdefType", "(II)I", (void *)nativeNfcTag_doGetNdefType}, 1861525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doCheckNdef", "([I)I", (void *)nativeNfcTag_doCheckNdef}, 1862525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doRead", "()[B", (void *)nativeNfcTag_doRead}, 1863525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doWrite", "([B)Z", (void *)nativeNfcTag_doWrite}, 1864525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doPresenceCheck", "()Z", (void *)nativeNfcTag_doPresenceCheck}, 1865525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doIsIsoDepNdefFormatable", "([B[B)Z", (void *)nativeNfcTag_doIsIsoDepNdefFormatable}, 1866525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doNdefFormat", "([B)Z", (void *)nativeNfcTag_doNdefFormat}, 1867525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project {"doMakeReadonly", "([B)Z", (void *)nativeNfcTag_doMakeReadonly}, 1868525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}; 1869525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1870525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1871525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1872525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1873525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: register_com_android_nfc_NativeNfcTag 1874525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1875525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Regisgter JNI functions with Java Virtual Machine. 1876525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: Environment of JVM. 1877525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1878525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Status of registration. 1879525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1880525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1881525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectint register_com_android_nfc_NativeNfcTag (JNIEnv *e) 1882525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1883525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s", __FUNCTION__); 1884525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return jniRegisterNativeMethods (e, gNativeNfcTagClassName, gMethods, NELEM (gMethods)); 1885525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1886525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1887525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1888525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} /* namespace android */ 1889