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/* 18525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Tag-reading, tag-writing operations. 19525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */ 20525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "OverrideLog.h" 21525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "NfcTag.h" 22525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "JavaClassConstants.h" 23b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen#include "config.h" 242534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes#include <ScopedLocalRef.h> 252534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes#include <ScopedPrimitiveArray.h> 262534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes 27525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectextern "C" 28525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 29525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project #include "rw_int.h" 30525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 31525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 32525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 33525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 34525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 35525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: NfcTag 36525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 37525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Initialize member variables. 38525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 39525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 40525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 41525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 42525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectNfcTag::NfcTag () 43a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu: mNumTechList (0), 44a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mTechnologyTimeoutsTable (MAX_NUM_TECHNOLOGY), 45a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mNativeData (NULL), 46a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mIsActivated (false), 47525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mActivationState (Idle), 48525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mProtocol(NFC_PROTOCOL_UNKNOWN), 49525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mtT1tMaxMessageSize (0), 50525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mReadCompletedStatus (NFA_STATUS_OK), 51525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mLastKovioUidLen (0), 52b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen mNdefDetectionTimedOut (false), 53b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen mIsDynamicTagId (false), 54b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen mPresenceCheckAlgorithm (NFA_RW_PRES_CHK_DEFAULT), 55b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen mIsFelicaLite(false) 56525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 57525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memset (mTechList, 0, sizeof(mTechList)); 58525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memset (mTechHandles, 0, sizeof(mTechHandles)); 59525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memset (mTechLibNfcTypes, 0, sizeof(mTechLibNfcTypes)); 60525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memset (mTechParams, 0, sizeof(mTechParams)); 61525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memset(mLastKovioUid, 0, NFC_KOVIO_MAX_LEN); 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** Function: getInstance 68525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 69525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Get a reference to the singleton NfcTag object. 70525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 71525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Reference to NfcTag object. 72525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 73525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 74525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectNfcTag& NfcTag::getInstance () 75525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 76525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static NfcTag tag; 77525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return tag; 78525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 79525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 80525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 81525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 82525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 83525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: initialize 84525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 85525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Reset member variables. 86525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** native: Native data. 87525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 88525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 89525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 90525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 91525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::initialize (nfc_jni_native_data* native) 92525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 93b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen long num = 0; 94b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 95525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mNativeData = native; 96a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mIsActivated = false; 97525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mActivationState = Idle; 98525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mProtocol = NFC_PROTOCOL_UNKNOWN; 99525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mNumTechList = 0; 100525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mtT1tMaxMessageSize = 0; 101525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mReadCompletedStatus = NFA_STATUS_OK; 102525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project resetTechnologies (); 103b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen if (GetNumValue(NAME_PRESENCE_CHECK_ALGORITHM, &num, sizeof(num))) 104b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen mPresenceCheckAlgorithm = num; 105525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 106525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 107525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 108525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 109525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: abort 111525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 112525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Unblock all operations. 113525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::abort () 118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 119525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard g (mReadCompleteEvent); 120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mReadCompleteEvent.notifyOne (); 121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: getActivationState 127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: What is the current state: Idle, Sleep, or Activated. 129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 130525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Idle, Sleep, or Activated. 131525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 132525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 133525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectNfcTag::ActivationState NfcTag::getActivationState () 134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 135525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return mActivationState; 136525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 137525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 138525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 139525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 140525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 141525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: setDeactivationState 142525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Set the current state: Idle or Sleep. 144525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** deactivated: state of deactivation. 145525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 146525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None. 147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 148525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 149525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::setDeactivationState (tNFA_DEACTIVATED& deactivated) 150525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 151525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::setDeactivationState"; 152525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mActivationState = Idle; 153525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mNdefDetectionTimedOut = false; 154525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (deactivated.type == NFA_DEACTIVATE_TYPE_SLEEP) 155525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mActivationState = Sleep; 156525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: state=%u", fn, mActivationState); 157525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 158525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 159525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 161525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 162525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: setActivationState 163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Set the current state to Active. 165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None. 167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::setActivationState () 170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::setActivationState"; 172525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mNdefDetectionTimedOut = false; 173525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mActivationState = Active; 174525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: state=%u", fn, mActivationState); 175525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 176525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 177a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu/******************************************************************************* 178a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 179a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Function: isActivated 180a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 181a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Description: Is tag activated? 182a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 183a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Returns: True if tag is activated. 184a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 185a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu*******************************************************************************/ 186a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chubool NfcTag::isActivated () 187a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu{ 188a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu return mIsActivated; 189a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu} 190a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 191525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 193525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 194525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: getProtocol 195525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 196525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Get the protocol of the current tag. 197525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 198525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Protocol number. 199525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 200525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 201525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjecttNFC_PROTOCOL NfcTag::getProtocol() 202525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 203525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return mProtocol; 204525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 205525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 206525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 207525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 208525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function TimeDiff 209525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 210525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description Computes time difference in milliseconds. 211525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 212525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns Time difference in milliseconds 213525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 214525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 215525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectUINT32 TimeDiff(timespec start, timespec end) 216525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 217525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project timespec temp; 218525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if ((end.tv_nsec-start.tv_nsec)<0) 219525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 220525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project temp.tv_sec = end.tv_sec-start.tv_sec-1; 221525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec; 222525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 223525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 224525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 225525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project temp.tv_sec = end.tv_sec-start.tv_sec; 226525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project temp.tv_nsec = end.tv_nsec-start.tv_nsec; 227525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 228525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 229525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return (temp.tv_sec * 1000) + (temp.tv_nsec / 1000000); 230525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 231525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 232525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 233525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 234525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: IsSameKovio 235525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 236525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Checks if tag activate is the same (UID) Kovio tag previously 237525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** activated. This is needed due to a problem with some Kovio 238525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** tags re-activating multiple times. 239525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** activationData: data from activation. 240525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 241525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: true if the activation is from the same tag previously 242525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** activated, false otherwise 243525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 244525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 245525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool NfcTag::IsSameKovio(tNFA_ACTIVATED& activationData) 246525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 247525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::IsSameKovio"; 248525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter", fn); 249525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFC_ACTIVATE_DEVT& rfDetail = activationData.activate_ntf; 250525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 251525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (rfDetail.protocol != NFC_PROTOCOL_KOVIO) 252525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return false; 253525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memcpy (&(mTechParams[0]), &(rfDetail.rf_tech_param), sizeof(rfDetail.rf_tech_param)); 255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (mTechParams [0].mode != NFC_DISCOVERY_TYPE_POLL_KOVIO) 256525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return false; 257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project struct timespec now; 259525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project clock_gettime(CLOCK_REALTIME, &now); 260525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 261525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project bool rVal = false; 262525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (mTechParams[0].param.pk.uid_len == mLastKovioUidLen) 263525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 264525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (memcmp(mLastKovioUid, &mTechParams [0].param.pk.uid, mTechParams[0].param.pk.uid_len) == 0) 265525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 266525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //same tag 267525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (TimeDiff(mLastKovioTime, now) < 500) 268525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 269525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // same tag within 500 ms, ignore activation 270525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project rVal = true; 271525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 272525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 273525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 274525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 275525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // save Kovio tag info 276525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (!rVal) 277525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 278525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if ((mLastKovioUidLen = mTechParams[0].param.pk.uid_len) > NFC_KOVIO_MAX_LEN) 279525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mLastKovioUidLen = NFC_KOVIO_MAX_LEN; 280525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memcpy(mLastKovioUid, mTechParams[0].param.pk.uid, mLastKovioUidLen); 281525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 282525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mLastKovioTime = now; 283525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit, is same Kovio=%d", fn, rVal); 284525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return rVal; 285525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 286525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 287525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 288525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 289525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: discoverTechnologies 290525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 291525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Discover the technologies that NFC service needs by interpreting 292a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** the data structures from the stack. 293525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** activationData: data from activation. 294525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 295525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 296525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 297525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 298525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::discoverTechnologies (tNFA_ACTIVATED& activationData) 299525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 300525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::discoverTechnologies (activation)"; 301525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter", fn); 302525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFC_ACTIVATE_DEVT& rfDetail = activationData.activate_ntf; 303525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 304525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mNumTechList = 0; 305525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechHandles [mNumTechList] = rfDetail.rf_disc_id; 306525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechLibNfcTypes [mNumTechList] = rfDetail.protocol; 307525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 308525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //save the stack's data structure for interpretation later 309525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memcpy (&(mTechParams[mNumTechList]), &(rfDetail.rf_tech_param), sizeof(rfDetail.rf_tech_param)); 310525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 311525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (rfDetail.protocol) 312525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 313525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_PROTOCOL_T1T: 314525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechList [mNumTechList] = TARGET_TYPE_ISO14443_3A; //is TagTechnology.NFC_A by Java API 315525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 316525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 317525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_PROTOCOL_T2T: 318525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechList [mNumTechList] = TARGET_TYPE_ISO14443_3A; //is TagTechnology.NFC_A by Java API 319525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // could be MifFare UL or Classic or Kovio 320525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 321b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen // need to look at first byte of uid to find Manufacture Byte 322525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFC_RF_TECH_PARAMS tech_params; 323525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memcpy (&tech_params, &(rfDetail.rf_tech_param), sizeof(rfDetail.rf_tech_param)); 324525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 325525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if ((tech_params.param.pa.nfcid1[0] == 0x04 && rfDetail.rf_tech_param.param.pa.sel_rsp == 0) || 326525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project rfDetail.rf_tech_param.param.pa.sel_rsp == 0x18 || 327525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project rfDetail.rf_tech_param.param.pa.sel_rsp == 0x08) 328525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 329525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (rfDetail.rf_tech_param.param.pa.sel_rsp == 0) 330525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 331525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mNumTechList++; 332525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechHandles [mNumTechList] = rfDetail.rf_disc_id; 333525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechLibNfcTypes [mNumTechList] = rfDetail.protocol; 334525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //save the stack's data structure for interpretation later 335525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memcpy (&(mTechParams[mNumTechList]), &(rfDetail.rf_tech_param), sizeof(rfDetail.rf_tech_param)); 336525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechList [mNumTechList] = TARGET_TYPE_MIFARE_UL; //is TagTechnology.MIFARE_ULTRALIGHT by Java API 337525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 338525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 339525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 340525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 341525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 342525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_PROTOCOL_T3T: 343b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen { 344b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen UINT8 xx = 0; 345b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 346b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen mTechList [mNumTechList] = TARGET_TYPE_FELICA; 347b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 348b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen //see if it is Felica Lite. 349b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen while (xx < activationData.params.t3t.num_system_codes) 350b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen { 351b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen if (activationData.params.t3t.p_system_codes[xx++] == T3T_SYSTEM_CODE_FELICA_LITE) 352b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen { 353b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen mIsFelicaLite = true; 354b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen break; 355b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen } 356b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen } 357b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen } 358525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 359525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 360525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_PROTOCOL_ISO_DEP: //type-4 tag uses technology ISO-DEP and technology A or B 361525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechList [mNumTechList] = TARGET_TYPE_ISO14443_4; //is TagTechnology.ISO_DEP by Java API 362525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if ( (rfDetail.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_A) || 363525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (rfDetail.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_A_ACTIVE) || 364525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (rfDetail.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_A) || 365525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (rfDetail.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE) ) 366525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 367525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mNumTechList++; 368525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechHandles [mNumTechList] = rfDetail.rf_disc_id; 369525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechLibNfcTypes [mNumTechList] = rfDetail.protocol; 370525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechList [mNumTechList] = TARGET_TYPE_ISO14443_3A; //is TagTechnology.NFC_A by Java API 371525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //save the stack's data structure for interpretation later 372525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memcpy (&(mTechParams[mNumTechList]), &(rfDetail.rf_tech_param), sizeof(rfDetail.rf_tech_param)); 373525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 374525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else if ( (rfDetail.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_B) || 375525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (rfDetail.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_B_PRIME) || 376525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (rfDetail.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_B) || 377525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (rfDetail.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_B_PRIME) ) 378525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 379525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mNumTechList++; 380525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechHandles [mNumTechList] = rfDetail.rf_disc_id; 381525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechLibNfcTypes [mNumTechList] = rfDetail.protocol; 382525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechList [mNumTechList] = TARGET_TYPE_ISO14443_3B; //is TagTechnology.NFC_B by Java API 383525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //save the stack's data structure for interpretation later 384525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memcpy (&(mTechParams[mNumTechList]), &(rfDetail.rf_tech_param), sizeof(rfDetail.rf_tech_param)); 385525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 386525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 387525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 388525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_PROTOCOL_15693: //is TagTechnology.NFC_V by Java API 389525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechList [mNumTechList] = TARGET_TYPE_ISO15693; 390525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 391525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 392525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_PROTOCOL_KOVIO: 39397a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu ALOGD ("%s: Kovio", fn); 39497a71fe90493efd5947bb6f18c7b58a7e795c1ddEvan Chu mTechList [mNumTechList] = TARGET_TYPE_KOVIO_BARCODE; 395525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 396b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 397525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project default: 398525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: unknown protocol ????", fn); 399525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechList [mNumTechList] = TARGET_TYPE_UNKNOWN; 400525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 401525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 402525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 403525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mNumTechList++; 404525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project for (int i=0; i < mNumTechList; i++) 405525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 406525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: index=%d; tech=%d; handle=%d; nfc type=%d", fn, 407525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project i, mTechList[i], mTechHandles[i], mTechLibNfcTypes[i]); 408525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 409525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit", fn); 410525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 411525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 412525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 413525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 414525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 415525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: discoverTechnologies 416525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 417525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Discover the technologies that NFC service needs by interpreting 418a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** the data structures from the stack. 419525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** discoveryData: data from discovery events(s). 420525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 421525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 422525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 423525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 424525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::discoverTechnologies (tNFA_DISC_RESULT& discoveryData) 425525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 426525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::discoverTechnologies (discovery)"; 427525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFC_RESULT_DEVT& discovery_ntf = discoveryData.discovery_ntf; 428525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 429525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter: rf disc. id=%u; protocol=%u, mNumTechList=%u", fn, discovery_ntf.rf_disc_id, discovery_ntf.protocol, mNumTechList); 430525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (mNumTechList >= MAX_NUM_TECHNOLOGY) 431525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 432525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: exceed max=%d", fn, MAX_NUM_TECHNOLOGY); 433525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 434525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 435525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechHandles [mNumTechList] = discovery_ntf.rf_disc_id; 436525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechLibNfcTypes [mNumTechList] = discovery_ntf.protocol; 437525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 438525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //save the stack's data structure for interpretation later 439525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memcpy (&(mTechParams[mNumTechList]), &(discovery_ntf.rf_tech_param), sizeof(discovery_ntf.rf_tech_param)); 440525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 441525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (discovery_ntf.protocol) 442525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 443525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_PROTOCOL_T1T: 444525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechList [mNumTechList] = TARGET_TYPE_ISO14443_3A; //is TagTechnology.NFC_A by Java API 445525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 446525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 447525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_PROTOCOL_T2T: 448525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechList [mNumTechList] = TARGET_TYPE_ISO14443_3A; //is TagTechnology.NFC_A by Java API 449b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen //type-2 tags are identical to Mifare Ultralight, so Ultralight is also discovered 450a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if ((discovery_ntf.rf_tech_param.param.pa.sel_rsp == 0) && 451a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu (mNumTechList < (MAX_NUM_TECHNOLOGY-1))) 452525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 453b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen // Mifare Ultralight 454525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mNumTechList++; 455525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechHandles [mNumTechList] = discovery_ntf.rf_disc_id; 456525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechLibNfcTypes [mNumTechList] = discovery_ntf.protocol; 457525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechList [mNumTechList] = TARGET_TYPE_MIFARE_UL; //is TagTechnology.MIFARE_ULTRALIGHT by Java API 458525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 459525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 460525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //save the stack's data structure for interpretation later 461525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memcpy (&(mTechParams[mNumTechList]), &(discovery_ntf.rf_tech_param), sizeof(discovery_ntf.rf_tech_param)); 462525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 463525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 464525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_PROTOCOL_T3T: 465525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechList [mNumTechList] = TARGET_TYPE_FELICA; 466525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 467525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 468525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_PROTOCOL_ISO_DEP: //type-4 tag uses technology ISO-DEP and technology A or B 469525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechList [mNumTechList] = TARGET_TYPE_ISO14443_4; //is TagTechnology.ISO_DEP by Java API 470525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if ( (discovery_ntf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_A) || 471525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (discovery_ntf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_A_ACTIVE) || 472525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (discovery_ntf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_A) || 473525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (discovery_ntf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE) ) 474525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 475a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (mNumTechList < (MAX_NUM_TECHNOLOGY-1)) 476a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 477a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mNumTechList++; 478a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mTechHandles [mNumTechList] = discovery_ntf.rf_disc_id; 479a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mTechLibNfcTypes [mNumTechList] = discovery_ntf.protocol; 480a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mTechList [mNumTechList] = TARGET_TYPE_ISO14443_3A; //is TagTechnology.NFC_A by Java API 481a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu //save the stack's data structure for interpretation later 482a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu memcpy (&(mTechParams[mNumTechList]), &(discovery_ntf.rf_tech_param), sizeof(discovery_ntf.rf_tech_param)); 483a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu } 484525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 485525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else if ( (discovery_ntf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_B) || 486525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (discovery_ntf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_B_PRIME) || 487525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (discovery_ntf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_B) || 488525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (discovery_ntf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_B_PRIME) ) 489525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 490a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (mNumTechList < (MAX_NUM_TECHNOLOGY-1)) 491a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 492a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mNumTechList++; 493a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mTechHandles [mNumTechList] = discovery_ntf.rf_disc_id; 494a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mTechLibNfcTypes [mNumTechList] = discovery_ntf.protocol; 495a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mTechList [mNumTechList] = TARGET_TYPE_ISO14443_3B; //is TagTechnology.NFC_B by Java API 496a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu //save the stack's data structure for interpretation later 497a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu memcpy (&(mTechParams[mNumTechList]), &(discovery_ntf.rf_tech_param), sizeof(discovery_ntf.rf_tech_param)); 498a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu } 499525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 500525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 501525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 502525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_PROTOCOL_15693: //is TagTechnology.NFC_V by Java API 503525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechList [mNumTechList] = TARGET_TYPE_ISO15693; 504525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 505b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 506525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project default: 507525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: unknown protocol ????", fn); 508525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mTechList [mNumTechList] = TARGET_TYPE_UNKNOWN; 509525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 510525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 511525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 512525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mNumTechList++; 513525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (discovery_ntf.more == FALSE) 514525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 515525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project for (int i=0; i < mNumTechList; i++) 516525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 517525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: index=%d; tech=%d; handle=%d; nfc type=%d", fn, 518525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project i, mTechList[i], mTechHandles[i], mTechLibNfcTypes[i]); 519525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 520525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 521525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 522525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd: 523525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit", fn); 524525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 525525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 526525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 527525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 528525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 529525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: createNativeNfcTag 530525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 531525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Create a brand new Java NativeNfcTag object; 532525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** fill the objects's member variables with data; 533525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** notify NFC service; 534525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** activationData: data from activation. 535525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 536525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 537525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 538525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 539525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::createNativeNfcTag (tNFA_ACTIVATED& activationData) 540525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 541525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::createNativeNfcTag"; 542525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter", fn); 543525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 5442534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes JNIEnv* e = NULL; 5452534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedAttach attach(mNativeData->vm, &e); 546a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (e == NULL) 547a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 548525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE("%s: jni env is null", fn); 5492534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes return; 550525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 551525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 5522534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedLocalRef<jclass> tag_cls(e, e->GetObjectClass(mNativeData->cached_NfcTag)); 553a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (e->ExceptionCheck()) 554a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 555525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project e->ExceptionClear(); 556525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE("%s: failed to get class", fn); 5572534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes return; 558525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 559525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 560525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //create a new Java NativeNfcTag object 5612534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes jmethodID ctor = e->GetMethodID(tag_cls.get(), "<init>", "()V"); 5622534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedLocalRef<jobject> tag(e, e->NewObject(tag_cls.get(), ctor)); 563525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 564525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //fill NativeNfcTag's mProtocols, mTechList, mTechHandles, mTechLibNfcTypes 5652534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes fillNativeNfcTagMembers1(e, tag_cls.get(), tag.get()); 566525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 567525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //fill NativeNfcTag's members: mHandle, mConnectedTechnology 5682534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes fillNativeNfcTagMembers2(e, tag_cls.get(), tag.get(), activationData); 569525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 570525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //fill NativeNfcTag's members: mTechPollBytes 5712534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes fillNativeNfcTagMembers3(e, tag_cls.get(), tag.get(), activationData); 572525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 573525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //fill NativeNfcTag's members: mTechActBytes 5742534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes fillNativeNfcTagMembers4(e, tag_cls.get(), tag.get(), activationData); 575525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 576525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //fill NativeNfcTag's members: mUid 5772534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes fillNativeNfcTagMembers5(e, tag_cls.get(), tag.get(), activationData); 578525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 579a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (mNativeData->tag != NULL) 580a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 5812534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->DeleteGlobalRef(mNativeData->tag); 582525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 5832534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes mNativeData->tag = e->NewGlobalRef(tag.get()); 584525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 585525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //notify NFC service about this new tag 586525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: try notify nfc service", fn); 5872534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->CallVoidMethod(mNativeData->manager, android::gCachedNfcManagerNotifyNdefMessageListeners, tag.get()); 588a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (e->ExceptionCheck()) 589a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 590525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project e->ExceptionClear(); 591525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: fail notify nfc service", fn); 592525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 593525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 594525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit", fn); 595525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 596525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 597525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 598525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 599525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 600525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: fillNativeNfcTagMembers1 601525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 602525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Fill NativeNfcTag's members: mProtocols, mTechList, mTechHandles, mTechLibNfcTypes. 603525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 604525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** tag_cls: Java NativeNfcTag class. 605525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** tag: Java NativeNfcTag object. 606525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 607525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 608525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 609525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 610525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::fillNativeNfcTagMembers1 (JNIEnv* e, jclass tag_cls, jobject tag) 611525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 612525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::fillNativeNfcTagMembers1"; 613525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s", fn); 614525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 615525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //create objects that represent NativeNfcTag's member variables 6162534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedLocalRef<jintArray> techList(e, e->NewIntArray(mNumTechList)); 6172534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedLocalRef<jintArray> handleList(e, e->NewIntArray(mNumTechList)); 6182534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedLocalRef<jintArray> typeList(e, e->NewIntArray(mNumTechList)); 619525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 620525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 6212534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedIntArrayRW technologies(e, techList.get()); 6222534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedIntArrayRW handles(e, handleList.get()); 6232534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedIntArrayRW types(e, typeList.get()); 6242534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes for (int i = 0; i < mNumTechList; i++) { 6252534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes mNativeData->tProtocols [i] = mTechLibNfcTypes [i]; 6262534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes mNativeData->handles [i] = mTechHandles [i]; 6272534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes technologies [i] = mTechList [i]; 6282534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes handles [i] = mTechHandles [i]; 6292534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes types [i] = mTechLibNfcTypes [i]; 6302534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes } 631525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 632525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 6332534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes jfieldID f = NULL; 6342534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes 6352534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes f = e->GetFieldID(tag_cls, "mTechList", "[I"); 6362534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetObjectField(tag, f, techList.get()); 637525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 6382534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes f = e->GetFieldID(tag_cls, "mTechHandles", "[I"); 6392534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetObjectField(tag, f, handleList.get()); 640525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 6412534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes f = e->GetFieldID(tag_cls, "mTechLibNfcTypes", "[I"); 6422534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetObjectField(tag, f, typeList.get()); 643525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 644525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 645525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 646525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 647525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 648525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: fillNativeNfcTagMembers2 649525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 650525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Fill NativeNfcTag's members: mConnectedTechIndex or mConnectedTechnology. 651525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** The original Google's implementation is in set_target_pollBytes( 652525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** in com_android_nfc_NativeNfcTag.cpp; 653525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 654525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** tag_cls: Java NativeNfcTag class. 655525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** tag: Java NativeNfcTag object. 656525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** activationData: data from activation. 657525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 658525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 659525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 660525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 6612534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesvoid NfcTag::fillNativeNfcTagMembers2 (JNIEnv* e, jclass tag_cls, jobject tag, tNFA_ACTIVATED& /*activationData*/) 662525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 663525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::fillNativeNfcTagMembers2"; 664525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s", fn); 6652534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes jfieldID f = e->GetFieldID(tag_cls, "mConnectedTechIndex", "I"); 6662534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetIntField(tag, f, (jint) 0); 667525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 668525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 669525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 670525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 671525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 672525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: fillNativeNfcTagMembers3 673525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 674525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Fill NativeNfcTag's members: mTechPollBytes. 675525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** The original Google's implementation is in set_target_pollBytes( 676525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** in com_android_nfc_NativeNfcTag.cpp; 677525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 678525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** tag_cls: Java NativeNfcTag class. 679525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** tag: Java NativeNfcTag object. 680525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** activationData: data from activation. 681525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 682525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 683525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 684525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 685525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::fillNativeNfcTagMembers3 (JNIEnv* e, jclass tag_cls, jobject tag, tNFA_ACTIVATED& activationData) 686525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 687525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::fillNativeNfcTagMembers3"; 6882534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedLocalRef<jbyteArray> pollBytes(e, e->NewByteArray(0)); 6892534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedLocalRef<jclass> byteArrayClass(e, e->GetObjectClass(pollBytes.get())); 6902534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedLocalRef<jobjectArray> techPollBytes(e, e->NewObjectArray(mNumTechList, byteArrayClass.get(), 0)); 691525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project int len = 0; 692525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 693525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project for (int i = 0; i < mNumTechList; i++) 694525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 695525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: index=%d; rf tech params mode=%u", fn, i, mTechParams [i].mode); 696525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (mTechParams [i].mode) 697525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 698525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_POLL_A: 699525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_POLL_A_ACTIVE: 700525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_LISTEN_A: 701525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE: 702525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: tech A", fn); 7032534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes pollBytes.reset(e->NewByteArray(2)); 7042534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetByteArrayRegion(pollBytes.get(), 0, 2, (jbyte*) mTechParams [i].param.pa.sens_res); 705525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 706525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 707525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_POLL_B: 708525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_POLL_B_PRIME: 709525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_LISTEN_B: 710525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_LISTEN_B_PRIME: 711525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (mTechList [i] == TARGET_TYPE_ISO14443_3B) //is TagTechnology.NFC_B by Java API 712525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 713525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /***************** 714525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project see NFC Forum Digital Protocol specification; section 5.6.2; 715525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project in SENSB_RES response, byte 6 through 9 is Application Data, byte 10-12 or 13 is Protocol Info; 716525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project used by public API: NfcB.getApplicationData(), NfcB.getProtocolInfo(); 717525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *****************/ 718525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: tech B; TARGET_TYPE_ISO14443_3B", fn); 719525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project len = mTechParams [i].param.pb.sensb_res_len; 720525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project len = len - 4; //subtract 4 bytes for NFCID0 at byte 2 through 5 7212534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes pollBytes.reset(e->NewByteArray(len)); 7222534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetByteArrayRegion(pollBytes.get(), 0, len, (jbyte*) (mTechParams [i].param.pb.sensb_res+4)); 723a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu } 724a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu else 725a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 7262534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes pollBytes.reset(e->NewByteArray(0)); 727525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 728525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 729525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 730525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_POLL_F: 731525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_POLL_F_ACTIVE: 732525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_LISTEN_F: 733525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE: 734525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 735525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /**************** 736525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project see NFC Forum Type 3 Tag Operation Specification; sections 2.3.2, 2.3.1.2; 737525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project see NFC Forum Digital Protocol Specification; sections 6.6.2; 738525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PMm: manufacture parameter; 8 bytes; 739525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project System Code: 2 bytes; 740525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ****************/ 741525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: tech F", fn); 742525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project UINT8 result [10]; //return result to NFC service 743525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memset (result, 0, sizeof(result)); 744525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project len = 10; 745525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 746525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /**** 747525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project for (int ii = 0; ii < mTechParams [i].param.pf.sensf_res_len; ii++) 748525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 749525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: tech F, sendf_res[%d]=%d (0x%x)", 750525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project fn, ii, mTechParams [i].param.pf.sensf_res[ii],mTechParams [i].param.pf.sensf_res[ii]); 751525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 752525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ***/ 753525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memcpy (result, mTechParams [i].param.pf.sensf_res + 8, 8); //copy PMm 754525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (activationData.params.t3t.num_system_codes > 0) //copy the first System Code 755525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 756525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project UINT16 systemCode = *(activationData.params.t3t.p_system_codes); 757525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project result [8] = (UINT8) (systemCode >> 8); 758525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project result [9] = (UINT8) systemCode; 759525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: tech F; sys code=0x%X 0x%X", fn, result [8], result [9]); 760525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 7612534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes pollBytes.reset(e->NewByteArray(len)); 7622534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetByteArrayRegion(pollBytes.get(), 0, len, (jbyte*) result); 7632534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes } 764525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 765525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 766525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_POLL_ISO15693: 767525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_LISTEN_ISO15693: 768525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 769525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: tech iso 15693", fn); 770525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //iso 15693 response flags: 1 octet 771525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //iso 15693 Data Structure Format Identifier (DSF ID): 1 octet 772525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //used by public API: NfcV.getDsfId(), NfcV.getResponseFlags(); 773525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project uint8_t data [2]= {activationData.params.i93.afi, activationData.params.i93.dsfid}; 7742534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes pollBytes.reset(e->NewByteArray(2)); 7752534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetByteArrayRegion(pollBytes.get(), 0, 2, (jbyte *) data); 776525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 777525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 778525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 779525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project default: 780525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: tech unknown ????", fn); 7812534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes pollBytes.reset(e->NewByteArray(0)); 782525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 783525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } //switch: every type of technology 7842534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetObjectArrayElement(techPollBytes.get(), i, pollBytes.get()); 785525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } //for: every technology in the array 7862534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes jfieldID f = e->GetFieldID(tag_cls, "mTechPollBytes", "[[B"); 7872534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetObjectField(tag, f, techPollBytes.get()); 788525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 789525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 790525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 791525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 792525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 793525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: fillNativeNfcTagMembers4 794525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 795525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Fill NativeNfcTag's members: mTechActBytes. 796525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** The original Google's implementation is in set_target_activationBytes() 797525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** in com_android_nfc_NativeNfcTag.cpp; 798525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 799525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** tag_cls: Java NativeNfcTag class. 800525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** tag: Java NativeNfcTag object. 801525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** activationData: data from activation. 802525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 803525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 804525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 805525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 806525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::fillNativeNfcTagMembers4 (JNIEnv* e, jclass tag_cls, jobject tag, tNFA_ACTIVATED& activationData) 807525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 808525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::fillNativeNfcTagMembers4"; 8092534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedLocalRef<jbyteArray> actBytes(e, e->NewByteArray(0)); 8102534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedLocalRef<jclass> byteArrayClass(e, e->GetObjectClass(actBytes.get())); 8112534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedLocalRef<jobjectArray> techActBytes(e, e->NewObjectArray(mNumTechList, byteArrayClass.get(), 0)); 812525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 813525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project for (int i = 0; i < mNumTechList; i++) 814525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 815525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: index=%d", fn, i); 816525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (mTechLibNfcTypes[i]) 817525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 818525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_PROTOCOL_T1T: 819a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu case NFC_PROTOCOL_T2T: 820525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 821a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (mTechLibNfcTypes[i] == NFC_PROTOCOL_T1T) 822a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD ("%s: T1T; tech A", fn); 823a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu else if (mTechLibNfcTypes[i] == NFC_PROTOCOL_T2T) 824a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD ("%s: T2T; tech A", fn); 8252534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes actBytes.reset(e->NewByteArray(1)); 8262534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetByteArrayRegion(actBytes.get(), 0, 1, (jbyte*) &mTechParams [i].param.pa.sel_rsp); 827525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 828525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 829525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 830525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_PROTOCOL_T3T: //felica 831525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 832525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: T3T; felica; tech F", fn); 833525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //really, there is no data 8342534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes actBytes.reset(e->NewByteArray(0)); 835525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 836525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 837525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 838525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_PROTOCOL_ISO_DEP: //t4t 839525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 840525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (mTechList [i] == TARGET_TYPE_ISO14443_4) //is TagTechnology.ISO_DEP by Java API 841525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 842525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if ( (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_A) || 843525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_A_ACTIVE) || 844525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (mTechParams[i].mode == NFC_DISCOVERY_TYPE_LISTEN_A) || 845525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (mTechParams[i].mode == NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE) ) 846525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 847525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //see NFC Forum Digital Protocol specification, section 11.6.2, "RATS Response"; search for "historical bytes"; 848525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //copy historical bytes into Java object; 849525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //the public API, IsoDep.getHistoricalBytes(), returns this data; 850525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (activationData.activate_ntf.intf_param.type == NFC_INTERFACE_ISO_DEP) 851525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 852525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFC_INTF_PA_ISO_DEP& pa_iso = activationData.activate_ntf.intf_param.intf_param.pa_iso; 853525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: T4T; ISO_DEP for tech A; copy historical bytes; len=%u", fn, pa_iso.his_byte_len); 8542534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes actBytes.reset(e->NewByteArray(pa_iso.his_byte_len)); 855525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (pa_iso.his_byte_len > 0) 8562534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetByteArrayRegion(actBytes.get(), 0, pa_iso.his_byte_len, (jbyte*) (pa_iso.his_byte)); 857525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 858525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 859525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 860525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: T4T; ISO_DEP for tech A; wrong interface=%u", fn, activationData.activate_ntf.intf_param.type); 8612534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes actBytes.reset(e->NewByteArray(0)); 862525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 863525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 864525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else if ( (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_B) || 865525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_B_PRIME) || 866525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (mTechParams[i].mode == NFC_DISCOVERY_TYPE_LISTEN_B) || 867525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (mTechParams[i].mode == NFC_DISCOVERY_TYPE_LISTEN_B_PRIME) ) 868525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 869525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //see NFC Forum Digital Protocol specification, section 12.6.2, "ATTRIB Response"; 870525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //copy higher-layer response bytes into Java object; 871525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //the public API, IsoDep.getHiLayerResponse(), returns this data; 872525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (activationData.activate_ntf.intf_param.type == NFC_INTERFACE_ISO_DEP) 873525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 874525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFC_INTF_PB_ISO_DEP& pb_iso = activationData.activate_ntf.intf_param.intf_param.pb_iso; 875525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: T4T; ISO_DEP for tech B; copy response bytes; len=%u", fn, pb_iso.hi_info_len); 8762534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes actBytes.reset(e->NewByteArray(pb_iso.hi_info_len)); 877525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (pb_iso.hi_info_len > 0) 8782534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetByteArrayRegion(actBytes.get(), 0, pb_iso.hi_info_len, (jbyte*) (pb_iso.hi_info)); 879525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 880525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 881525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 882525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: T4T; ISO_DEP for tech B; wrong interface=%u", fn, activationData.activate_ntf.intf_param.type); 8832534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes actBytes.reset(e->NewByteArray(0)); 884525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 885525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 886525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 887525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else if (mTechList [i] == TARGET_TYPE_ISO14443_3A) //is TagTechnology.NFC_A by Java API 888525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 889525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: T4T; tech A", fn); 8902534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes actBytes.reset(e->NewByteArray(1)); 8912534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetByteArrayRegion(actBytes.get(), 0, 1, (jbyte*) &mTechParams [i].param.pa.sel_rsp); 892525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 893525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 894525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 8952534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes actBytes.reset(e->NewByteArray(0)); 896525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 897525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } //case NFC_PROTOCOL_ISO_DEP: //t4t 898525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 899525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 900525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_PROTOCOL_15693: 901525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 902525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: tech iso 15693", fn); 903525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //iso 15693 response flags: 1 octet 904525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //iso 15693 Data Structure Format Identifier (DSF ID): 1 octet 905525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //used by public API: NfcV.getDsfId(), NfcV.getResponseFlags(); 906525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project uint8_t data [2]= {activationData.params.i93.afi, activationData.params.i93.dsfid}; 9072534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes actBytes.reset(e->NewByteArray(2)); 9082534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetByteArrayRegion(actBytes.get(), 0, 2, (jbyte *) data); 909525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 910525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 911525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 912525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project default: 913525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: tech unknown ????", fn); 9142534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes actBytes.reset(e->NewByteArray(0)); 915525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 916525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project }//switch 9172534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetObjectArrayElement(techActBytes.get(), i, actBytes.get()); 918525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } //for: every technology in the array 9192534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes jfieldID f = e->GetFieldID (tag_cls, "mTechActBytes", "[[B"); 9202534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetObjectField(tag, f, techActBytes.get()); 921525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 922525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 923525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 924525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 925525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 926525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: fillNativeNfcTagMembers5 927525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 928525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Fill NativeNfcTag's members: mUid. 929525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** The original Google's implementation is in nfc_jni_Discovery_notification_callback() 930525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** in com_android_nfc_NativeNfcManager.cpp; 931525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** e: JVM environment. 932525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** tag_cls: Java NativeNfcTag class. 933525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** tag: Java NativeNfcTag object. 934525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** activationData: data from activation. 935525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 936525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 937525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 938525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 939525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::fillNativeNfcTagMembers5 (JNIEnv* e, jclass tag_cls, jobject tag, tNFA_ACTIVATED& activationData) 940525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 941525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::fillNativeNfcTagMembers5"; 942525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project int len = 0; 9432534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes ScopedLocalRef<jbyteArray> uid(e, NULL); 944525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 945525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (mTechParams [0].mode) 946525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 947525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_POLL_KOVIO: 948525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: Kovio", fn); 949525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project len = mTechParams [0].param.pk.uid_len; 9502534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes uid.reset(e->NewByteArray(len)); 9512534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetByteArrayRegion(uid.get(), 0, len, 952525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (jbyte*) &mTechParams [0].param.pk.uid); 953525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 954525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 955525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_POLL_A: 956525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_POLL_A_ACTIVE: 957525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_LISTEN_A: 958525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE: 959525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: tech A", fn); 960525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project len = mTechParams [0].param.pa.nfcid1_len; 9612534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes uid.reset(e->NewByteArray(len)); 9622534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetByteArrayRegion(uid.get(), 0, len, 963525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (jbyte*) &mTechParams [0].param.pa.nfcid1); 964b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen //a tag's NFCID1 can change dynamically at each activation; 965b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen //only the first byte (0x08) is constant; a dynamic NFCID1's length 966b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen //must be 4 bytes (see NFC Digitial Protocol, 967b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen //section 4.7.2 SDD_RES Response, Requirements 20). 968b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen mIsDynamicTagId = (mTechParams [0].param.pa.nfcid1_len == 4) && 969b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen (mTechParams [0].param.pa.nfcid1 [0] == 0x08); 970525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 971525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 972525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_POLL_B: 973525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_POLL_B_PRIME: 974525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_LISTEN_B: 975525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_LISTEN_B_PRIME: 976525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: tech B", fn); 9772534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes uid.reset(e->NewByteArray(NFC_NFCID0_MAX_LEN)); 9782534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetByteArrayRegion(uid.get(), 0, NFC_NFCID0_MAX_LEN, 979525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (jbyte*) &mTechParams [0].param.pb.nfcid0); 980525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 981525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 982525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_POLL_F: 983525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_POLL_F_ACTIVE: 984525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_LISTEN_F: 985525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE: 9862534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes uid.reset(e->NewByteArray(NFC_NFCID2_LEN)); 9872534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetByteArrayRegion(uid.get(), 0, NFC_NFCID2_LEN, 988525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (jbyte*) &mTechParams [0].param.pf.nfcid2); 989a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD ("%s: tech F", fn); 990525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 991525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 992525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_POLL_ISO15693: 993525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFC_DISCOVERY_TYPE_LISTEN_ISO15693: 994525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 995525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: tech iso 15693", fn); 996525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project jbyte data [I93_UID_BYTE_LEN]; //8 bytes 997525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project for (int i=0; i<I93_UID_BYTE_LEN; ++i) //reverse the ID 998525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project data[i] = activationData.params.i93.uid [I93_UID_BYTE_LEN - i - 1]; 9992534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes uid.reset(e->NewByteArray(I93_UID_BYTE_LEN)); 10002534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetByteArrayRegion(uid.get(), 0, I93_UID_BYTE_LEN, data); 1001525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1002525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 1003525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1004525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project default: 1005525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: tech unknown ????", fn); 10062534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes uid.reset(e->NewByteArray(0)); 1007525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 10082534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes } 10092534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes jfieldID f = e->GetFieldID(tag_cls, "mUid", "[B"); 10102534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes e->SetObjectField(tag, f, uid.get()); 1011525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1012525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1013525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1014525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1015525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1016525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: isP2pDiscovered 1017525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1018525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Does the peer support P2P? 1019525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1020525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if the peer supports P2P. 1021525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1022525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1023525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool NfcTag::isP2pDiscovered () 1024525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1025525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::isP2pDiscovered"; 1026525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project bool retval = false; 1027525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1028525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project for (int i = 0; i < mNumTechList; i++) 1029525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1030525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (mTechLibNfcTypes[i] == NFA_PROTOCOL_NFC_DEP) 1031525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1032525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //if remote device supports P2P 1033525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: discovered P2P", fn); 1034525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project retval = true; 1035525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 1036525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1037525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1038525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: return=%u", fn, retval); 1039525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return retval; 1040525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1041525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1042525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1043525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1044525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1045525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: selectP2p 1046525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1047525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Select the preferred P2P technology if there is a choice. 1048525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1049525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 1050525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1051525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1052525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::selectP2p() 1053525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1054525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::selectP2p"; 1055525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project UINT8 rfDiscoveryId = 0; 1056525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1057525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project for (int i = 0; i < mNumTechList; i++) 1058525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1059525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //if remote device does not support P2P, just skip it 1060525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (mTechLibNfcTypes[i] != NFA_PROTOCOL_NFC_DEP) 1061525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project continue; 1062525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1063525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //if remote device supports tech F; 1064525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //tech F is preferred because it is faster than tech A 1065525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if ( (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_F) || 1066525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_F_ACTIVE) ) 1067525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1068525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project rfDiscoveryId = mTechHandles[i]; 1069525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; //no need to search further 1070525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1071525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else if ( (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_A) || 1072525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_A_ACTIVE) ) 1073525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1074525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //only choose tech A if tech F is unavailable 1075525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (rfDiscoveryId == 0) 1076525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project rfDiscoveryId = mTechHandles[i]; 1077525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1078525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1079525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1080525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (rfDiscoveryId > 0) 1081525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1082525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: select P2P; target rf discov id=0x%X", fn, rfDiscoveryId); 1083525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_STATUS stat = NFA_Select (rfDiscoveryId, NFA_PROTOCOL_NFC_DEP, NFA_INTERFACE_NFC_DEP); 1084525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (stat != NFA_STATUS_OK) 1085525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: fail select P2P; error=0x%X", fn, stat); 1086525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1087525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 1088525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: cannot find P2P", fn); 1089525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project resetTechnologies (); 1090525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1091525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1092525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1093525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1094525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1095525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: resetTechnologies 1096525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1097525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Clear all data related to the technology, protocol of the tag. 1098525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1099525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 1100525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1101525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1102525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::resetTechnologies () 1103525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1104525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::resetTechnologies"; 1105525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s", fn); 1106525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mNumTechList = 0; 1107525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memset (mTechList, 0, sizeof(mTechList)); 1108525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memset (mTechHandles, 0, sizeof(mTechHandles)); 1109525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memset (mTechLibNfcTypes, 0, sizeof(mTechLibNfcTypes)); 1110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memset (mTechParams, 0, sizeof(mTechParams)); 1111b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen mIsDynamicTagId = false; 1112b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen mIsFelicaLite = false; 1113a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu resetAllTransceiveTimeouts (); 1114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1119525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: selectFirstTag 1120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: When multiple tags are discovered, just select the first one to activate. 1122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 1124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::selectFirstTag () 1127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::selectFirstTag"; 1129c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen int foundIdx = -1; 1130c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen tNFA_INTF_TYPE rf_intf = NFA_INTERFACE_FRAME; 1131c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen 1132c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen for (int i = 0; i < mNumTechList; i++) 1133c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen { 1134c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen ALOGD ("%s: nfa target idx=%d h=0x%X; protocol=0x%X", 1135c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen fn, i, mTechHandles [i], mTechLibNfcTypes [i]); 1136c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen if (mTechLibNfcTypes[i] != NFA_PROTOCOL_NFC_DEP) 1137c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen { 1138c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen foundIdx = i; 1139c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen break; 1140c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen } 1141c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen } 1142c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen 1143c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen if (foundIdx != -1) 1144c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen { 1145c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen if (mTechLibNfcTypes [foundIdx] == NFA_PROTOCOL_ISO_DEP) 1146c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen { 1147c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen rf_intf = NFA_INTERFACE_ISO_DEP; 1148c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen } 1149c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen else 1150c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen rf_intf = NFA_INTERFACE_FRAME; 1151c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen 1152c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen tNFA_STATUS stat = NFA_Select (mTechHandles [foundIdx], mTechLibNfcTypes [foundIdx], rf_intf); 1153c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen if (stat != NFA_STATUS_OK) 1154c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen ALOGE ("%s: fail select; error=0x%X", fn, stat); 1155c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen } 1156c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen else 1157c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen ALOGE ("%s: only found NFC-DEP technology.", fn); 1158525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1159525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1161525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1162525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: getT1tMaxMessageSize 1164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Get the maximum size (octet) that a T1T can store. 1166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Maximum size in octets. 1168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectint NfcTag::getT1tMaxMessageSize () 1171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1172525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::getT1tMaxMessageSize"; 1173525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1174525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (mProtocol != NFC_PROTOCOL_T1T) 1175525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1176525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: wrong protocol %u", fn, mProtocol); 1177525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return 0; 1178525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1179525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return mtT1tMaxMessageSize; 1180525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1181525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1182525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1183525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1184525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1185525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: calculateT1tMaxMessageSize 1186525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1187525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Calculate type-1 tag's max message size based on header ROM bytes. 1188525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** activate: reference to activation data. 1189525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1190525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 1191525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1193525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::calculateT1tMaxMessageSize (tNFA_ACTIVATED& activate) 1194525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1195525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::calculateT1tMaxMessageSize"; 1196525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1197525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //make sure the tag is type-1 1198525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (activate.activate_ntf.protocol != NFC_PROTOCOL_T1T) 1199525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1200525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mtT1tMaxMessageSize = 0; 1201525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return; 1202525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1203525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1204525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //examine the first byte of header ROM bytes 1205525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (activate.params.t1t.hr[0]) 1206525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1207525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case RW_T1T_IS_TOPAZ96: 1208525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mtT1tMaxMessageSize = 90; 1209525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 1210525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case RW_T1T_IS_TOPAZ512: 1211525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mtT1tMaxMessageSize = 462; 1212525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 1213525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project default: 1214525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: unknown T1T HR0=%u", fn, activate.params.t1t.hr[0]); 1215525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mtT1tMaxMessageSize = 0; 1216525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 1217525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1218525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1219525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1220525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1221525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1222525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1223525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: isMifareUltralight 1224525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1225525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Whether the currently activated tag is Mifare Ultralight. 1226525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1227525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if tag is Mifare Ultralight. 1228525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1229525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1230525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool NfcTag::isMifareUltralight () 1231525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1232525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::isMifareUltralight"; 1233525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project bool retval = false; 1234525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1235525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project for (int i =0; i < mNumTechList; i++) 1236525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1237b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen if (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_A) 1238525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1239525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //see NFC Digital Protocol, section 4.6.3 (SENS_RES); section 4.8.2 (SEL_RES). 1240b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen //see "MF0ICU1 Functional specification MIFARE Ultralight", Rev. 3.4 - 4 February 2008, 1241b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen //section 6.7. 1242525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if ( (mTechParams[i].param.pa.sens_res[0] == 0x44) && 1243b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen (mTechParams[i].param.pa.sens_res[1] == 0) && 1244b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen ( (mTechParams[i].param.pa.sel_rsp == 0) || (mTechParams[i].param.pa.sel_rsp == 0x04) ) && 1245b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen (mTechParams[i].param.pa.nfcid1[0] == 0x04) ) 1246525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1247525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project retval = true; 1248525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1249525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 1250525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1251525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1252525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: return=%u", fn, retval); 1253525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return retval; 1254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1256525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1259b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Function: isFelicaLite 1260b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1261b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Description: Whether the currently activated tag is Felica Lite. 1262b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1263b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Returns: True if tag is Felica Lite. 1264b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1265b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen*******************************************************************************/ 1266b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 1267b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenenbool NfcTag::isFelicaLite () 1268b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen{ 1269b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen return mIsFelicaLite; 1270b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen} 1271b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 1272b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 1273b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen/******************************************************************************* 1274b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1275525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: isT2tNackResponse 1276525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1277525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Whether the response is a T2T NACK response. 1278525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** See NFC Digital Protocol Technical Specification (2010-11-17). 1279525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Chapter 9 (Type 2 Tag Platform), section 9.6 (READ). 1280525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** response: buffer contains T2T response. 1281525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** responseLen: length of the response. 1282525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1283525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if the response is NACK 1284525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1285525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1286525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool NfcTag::isT2tNackResponse (const UINT8* response, UINT32 responseLen) 1287525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1288525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::isT2tNackResponse"; 1289525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project bool isNack = false; 1290525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1291525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (responseLen == 1) 1292525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1293525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (response[0] == 0xA) 1294525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project isNack = false; //an ACK response, so definitely not a NACK 1295525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 1296525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project isNack = true; //assume every value is a NACK 1297525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1298525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: return %u", fn, isNack); 1299525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return isNack; 1300525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1301525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1302525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1303525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1304525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1305525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: isNdefDetectionTimedOut 1306525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1307525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Whether NDEF-detection algorithm timed out. 1308525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1309525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if NDEF-detection algorithm timed out. 1310525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1311525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1312525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool NfcTag::isNdefDetectionTimedOut () 1313525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1314525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return mNdefDetectionTimedOut; 1315525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1316525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1317525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1318525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 1319525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1320525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: connectionEventHandler 1321525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1322525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Handle connection-related events. 1323525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** event: event code. 1324525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** data: pointer to event data. 1325525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1326525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 1327525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 1328525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 1329525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid NfcTag::connectionEventHandler (UINT8 event, tNFA_CONN_EVT_DATA* data) 1330525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 1331525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "NfcTag::connectionEventHandler"; 1332525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1333525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (event) 1334525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1335525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_DISC_RESULT_EVT: 1336525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1337525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_DISC_RESULT& disc_result = data->disc_result; 1338525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (disc_result.status == NFA_STATUS_OK) 1339525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1340525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project discoverTechnologies (disc_result); 1341525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1342525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1343525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 1344525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1345525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_ACTIVATED_EVT: 1346525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // Only do tag detection if we are polling and it is not 'EE Direct RF' activation 1347525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // (which may happen when we are activated as a tag). 1348525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (data->activated.activate_ntf.rf_tech_param.mode < NCI_DISCOVERY_TYPE_LISTEN_A 1349525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project && data->activated.activate_ntf.intf_param.type != NFC_INTERFACE_EE_DIRECT_RF) 1350525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1351525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_ACTIVATED& activated = data->activated; 1352525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (IsSameKovio(activated)) 1353525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 1354a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mIsActivated = true; 1355525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mProtocol = activated.activate_ntf.protocol; 1356525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project calculateT1tMaxMessageSize (activated); 1357525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project discoverTechnologies (activated); 1358525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project createNativeNfcTag (activated); 1359525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1360525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 1361525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1362525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_DEACTIVATED_EVT: 1363a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mIsActivated = false; 1364525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mProtocol = NFC_PROTOCOL_UNKNOWN; 1365525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project resetTechnologies (); 1366525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 1367525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1368525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_READ_CPLT_EVT: 1369525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1370525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard g (mReadCompleteEvent); 1371525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mReadCompletedStatus = data->status; 1372525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mReadCompleteEvent.notifyOne (); 1373525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1374525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 1375525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1376525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_NDEF_DETECT_EVT: 1377525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 1378525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_NDEF_DETECT& ndef_detect = data->ndef_detect; 1379525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mNdefDetectionTimedOut = ndef_detect.status == NFA_STATUS_TIMEOUT; 1380525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (mNdefDetectionTimedOut) 1381525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: NDEF detection timed out", fn); 1382525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1383525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 1384525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 1385a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 1386b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 1387a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu/******************************************************************************* 1388a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 1389a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Function setActive 1390a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 1391a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Description Sets the active state for the object 1392a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 1393a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Returns None. 1394a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 1395a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu*******************************************************************************/ 1396a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuvoid NfcTag::setActive(bool active) 1397a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu{ 1398a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mIsActivated = active; 1399a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu} 1400a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 1401a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 1402a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu/******************************************************************************* 1403a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 1404b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Function: isDynamicTagId 1405b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1406b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Description: Whether a tag has a dynamic tag ID. 1407b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1408b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Returns: True if ID is dynamic. 1409b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1410b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen*******************************************************************************/ 1411b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenenbool NfcTag::isDynamicTagId () 1412b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen{ 1413b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen return mIsDynamicTagId && 1414b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen (mTechList [0] == TARGET_TYPE_ISO14443_4) && //type-4 tag 1415b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen (mTechList [1] == TARGET_TYPE_ISO14443_3A); //tech A 1416b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen} 1417b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 1418b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 1419b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen/******************************************************************************* 1420b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1421a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Function: resetAllTransceiveTimeouts 1422a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 1423a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Description: Reset all timeouts for all technologies to default values. 1424a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 1425a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Returns: none 1426a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 1427a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu*******************************************************************************/ 1428a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuvoid NfcTag::resetAllTransceiveTimeouts () 1429a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu{ 1430133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen mTechnologyTimeoutsTable [TARGET_TYPE_ISO14443_3A] = 618; //NfcA 1431133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen mTechnologyTimeoutsTable [TARGET_TYPE_ISO14443_3B] = 1000; //NfcB 1432133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen mTechnologyTimeoutsTable [TARGET_TYPE_ISO14443_4] = 309; //ISO-DEP 1433133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen mTechnologyTimeoutsTable [TARGET_TYPE_FELICA] = 255; //Felica 1434133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen mTechnologyTimeoutsTable [TARGET_TYPE_ISO15693] = 1000;//NfcV 1435133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen mTechnologyTimeoutsTable [TARGET_TYPE_NDEF] = 1000; 1436133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen mTechnologyTimeoutsTable [TARGET_TYPE_NDEF_FORMATABLE] = 1000; 1437133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen mTechnologyTimeoutsTable [TARGET_TYPE_MIFARE_CLASSIC] = 618; //MifareClassic 1438133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen mTechnologyTimeoutsTable [TARGET_TYPE_MIFARE_UL] = 618; //MifareUltralight 1439133f3b8b4e88a2ab66840c67e26e167bc4cd14d5Martijn Coenen mTechnologyTimeoutsTable [TARGET_TYPE_KOVIO_BARCODE] = 1000; //NfcBarcode 1440b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen} 1441b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 1442b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen/******************************************************************************* 1443b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1444a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Function: getTransceiveTimeout 1445a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 1446a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Description: Get the timeout value for one technology. 1447a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** techId: one of the values in TARGET_TYPE_* defined in NfcJniUtil.h 1448a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 1449a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Returns: Timeout value in millisecond. 1450a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 1451a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu*******************************************************************************/ 1452a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuint NfcTag::getTransceiveTimeout (int techId) 1453a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu{ 1454a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu static const char fn [] = "NfcTag::getTransceiveTimeout"; 1455a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu int retval = 1000; 1456b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen if ((techId > 0) && (techId < (int) mTechnologyTimeoutsTable.size())) 1457a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu retval = mTechnologyTimeoutsTable [techId]; 1458a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu else 1459a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGE ("%s: invalid tech=%d", fn, techId); 1460a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu return retval; 1461a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu} 1462a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 1463a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 1464a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu/******************************************************************************* 1465a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 1466a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Function: setTransceiveTimeout 1467a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 1468a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Description: Set the timeout value for one technology. 1469a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** techId: one of the values in TARGET_TYPE_* defined in NfcJniUtil.h 1470a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** timeout: timeout value in millisecond. 1471a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 1472a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** Returns: Timeout value. 1473a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu** 1474a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu*******************************************************************************/ 1475a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuvoid NfcTag::setTransceiveTimeout (int techId, int timeout) 1476a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu{ 1477a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu static const char fn [] = "NfcTag::setTransceiveTimeout"; 1478a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if ((techId >= 0) && (techId < (int) mTechnologyTimeoutsTable.size())) 1479a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mTechnologyTimeoutsTable [techId] = timeout; 1480a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu else 1481a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGE ("%s: invalid tech=%d", fn, techId); 1482a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu} 1483b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 1484b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 1485b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen/******************************************************************************* 1486b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1487b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Function: getPresenceCheckAlgorithm 1488b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1489b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Description: Get presence-check algorithm from .conf file. 1490b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1491b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Returns: Presence-check algorithm. 1492b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1493b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen*******************************************************************************/ 1494b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn CoenentNFA_RW_PRES_CHK_OPTION NfcTag::getPresenceCheckAlgorithm () 1495b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen{ 1496b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen return mPresenceCheckAlgorithm; 1497b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen} 1498b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 1499b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 1500b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen/******************************************************************************* 1501b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1502b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Function: isInfineonMyDMove 1503b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1504b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Description: Whether the currently activated tag is Infineon My-D Move. 1505b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1506b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Returns: True if tag is Infineon My-D Move. 1507b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1508b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen*******************************************************************************/ 1509b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenenbool NfcTag::isInfineonMyDMove () 1510b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen{ 1511b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen static const char fn [] = "NfcTag::isInfineonMyDMove"; 1512b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen bool retval = false; 1513b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 1514b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen for (int i =0; i < mNumTechList; i++) 1515b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen { 1516b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen if (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_A) 1517b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen { 1518b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen //see Infineon my-d move, my-d move NFC, SLE 66R01P, SLE 66R01PN, 1519b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen //Short Product Information, 2011-11-24, section 3.5 1520b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen if (mTechParams[i].param.pa.nfcid1[0] == 0x05) 1521b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen { 1522b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen UINT8 highNibble = mTechParams[i].param.pa.nfcid1[1] & 0xF0; 1523b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen if (highNibble == 0x30) 1524b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen retval = true; 1525b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen } 1526b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen break; 1527b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen } 1528b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen } 1529b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen ALOGD ("%s: return=%u", fn, retval); 1530b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen return retval; 1531b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen} 1532b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 1533b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 1534b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen/******************************************************************************* 1535b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1536b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Function: isKovioType2Tag 1537b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1538b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Description: Whether the currently activated tag is Kovio Type-2 tag. 1539b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1540b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** Returns: True if tag is Kovio Type-2 tag. 1541b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen** 1542b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen*******************************************************************************/ 1543b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenenbool NfcTag::isKovioType2Tag () 1544b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen{ 1545b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen static const char fn [] = "NfcTag::isKovioType2Tag"; 1546b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen bool retval = false; 1547b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen 1548b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen for (int i =0; i < mNumTechList; i++) 1549b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen { 1550b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen if (mTechParams[i].mode == NFC_DISCOVERY_TYPE_POLL_A) 1551b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen { 1552b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen //Kovio 2Kb RFID Tag, Functional Specification, 1553b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen //March 2, 2012, v2.0, section 8.3. 1554b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen if (mTechParams[i].param.pa.nfcid1[0] == 0x37) 1555b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen retval = true; 1556b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen break; 1557b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen } 1558b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen } 1559b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen ALOGD ("%s: return=%u", fn, retval); 1560b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen return retval; 1561b5a6c9615433734869c7a73a06c1b3799ebe0c9fMartijn Coenen} 1562