1525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/* 2525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Copyright (C) 2010 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 Projectpackage com.android.nfc.dhimpl; 18525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 19525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectimport android.content.Context; 20525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectimport android.nfc.ErrorCodes; 21525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectimport android.nfc.tech.Ndef; 22525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectimport android.nfc.tech.TagTechnology; 23525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectimport android.util.Log; 24525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 259f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenenimport com.android.nfc.DeviceHost; 269f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenenimport com.android.nfc.LlcpException; 270799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Moralesimport com.android.nfc.NfcDiscoveryParameters; 289f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 29525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/** 30525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Native interface to the NFC Manager functions 31525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */ 32525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectpublic class NativeNfcManager implements DeviceHost { 33525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project private static final String TAG = "NativeNfcManager"; 34525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static final String PREF = "NciDeviceHost"; 35525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 36525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static final int DEFAULT_LLCP_MIU = 1980; 37525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static final int DEFAULT_LLCP_RWSIZE = 2; 38525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 39525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static final String DRIVER_NAME = "android-nci"; 40525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 41525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static { 42525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project System.loadLibrary("nfc_nci_jni"); 43525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 44525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 45d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales 46525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Native structure */ 47fb18ffb259fe8f40e81516842497735a7c0b6a8cAndres Morales private long mNative; 48525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 49525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project private final DeviceHostListener mListener; 50525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project private final Context mContext; 51525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 52d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales 53525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public NativeNfcManager(Context context, DeviceHostListener listener) { 54525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mListener = listener; 55525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project initializeNativeStructure(); 56525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mContext = context; 57525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 58525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 59525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public native boolean initializeNativeStructure(); 60525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 61525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project private native boolean doDownload(); 62525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 63525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public native int doGetLastError(); 64525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 65525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 66525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public void checkFirmware() { 67a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu doDownload(); 68525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 69525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 70304a6342ee7e5620d3b50d988755c035f1686dc2Martijn Coenen private native boolean doInitialize(); 71525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 72525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 73304a6342ee7e5620d3b50d988755c035f1686dc2Martijn Coenen public boolean initialize() { 74304a6342ee7e5620d3b50d988755c035f1686dc2Martijn Coenen return doInitialize(); 75525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 76525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 77525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project private native boolean doDeinitialize(); 78525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 79525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 80525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public boolean deinitialize() { 81525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return doDeinitialize(); 82525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 83525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 84525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 85525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public String getName() { 86525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return DRIVER_NAME; 87525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 88525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 89525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 909f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen public native boolean sendRawFrame(byte[] data); 919f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 929f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen @Override 939f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen public native boolean routeAid(byte[] aid, int route); 949f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 959f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen @Override 969f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen public native boolean unrouteAid(byte[] aid); 979f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 98f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen @Override 99f5c979220fadb2c3ac0bca09e16d0d281ed20eb2Martijn Coenen public native boolean commitRouting(); 100525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 1010799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales private native void doEnableDiscovery(int techMask, 1020799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales boolean enableLowPowerPolling, 1030799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales boolean enableReaderMode, 1040799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales boolean enableHostRouting, 1050799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales boolean restart); 106525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 1070799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales public void enableDiscovery(NfcDiscoveryParameters params, boolean restart) { 1080799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales doEnableDiscovery(params.getTechMask(), params.shouldEnableLowPowerDiscovery(), 1090799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales params.shouldEnableReaderMode(), params.shouldEnableHostRouting(), restart); 1100799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales } 1119f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 1129f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen @Override 1130799bcbe2469aa6a88c6cbdf0cdee5b50e1994f0Andres Morales public native void disableDiscovery(); 1149f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project private native NativeLlcpConnectionlessSocket doCreateLlcpConnectionlessSocket(int nSap, 116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project String sn); 117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 119525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public LlcpConnectionlessSocket createLlcpConnectionlessSocket(int nSap, String sn) 120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project throws LlcpException { 121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project LlcpConnectionlessSocket socket = doCreateLlcpConnectionlessSocket(nSap, sn); 122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (socket != null) { 123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return socket; 124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } else { 125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Get Error Status */ 126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project int error = doGetLastError(); 127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project Log.d(TAG, "failed to create llcp socket: " + ErrorCodes.asString(error)); 129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 130525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (error) { 131525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case ErrorCodes.ERROR_BUFFER_TO_SMALL: 132525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case ErrorCodes.ERROR_INSUFFICIENT_RESOURCES: 133525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project throw new LlcpException(error); 134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project default: 135525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project throw new LlcpException(ErrorCodes.ERROR_SOCKET_CREATION); 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 private native NativeLlcpServiceSocket doCreateLlcpServiceSocket(int nSap, String sn, int miu, 141525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project int rw, int linearBufferLength); 142525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public LlcpServerSocket createLlcpServerSocket(int nSap, String sn, int miu, 144525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project int rw, int linearBufferLength) throws LlcpException { 145525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project LlcpServerSocket socket = doCreateLlcpServiceSocket(nSap, sn, miu, rw, linearBufferLength); 146525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (socket != null) { 147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return socket; 148525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } else { 149525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Get Error Status */ 150525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project int error = doGetLastError(); 151525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 152525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project Log.d(TAG, "failed to create llcp socket: " + ErrorCodes.asString(error)); 153525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 154525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (error) { 155525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case ErrorCodes.ERROR_BUFFER_TO_SMALL: 156525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case ErrorCodes.ERROR_INSUFFICIENT_RESOURCES: 157525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project throw new LlcpException(error); 158525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project default: 159525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project throw new LlcpException(ErrorCodes.ERROR_SOCKET_CREATION); 160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 161525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 162525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project private native NativeLlcpSocket doCreateLlcpSocket(int sap, int miu, int rw, 165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project int linearBufferLength); 166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public LlcpSocket createLlcpSocket(int sap, int miu, int rw, 168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project int linearBufferLength) throws LlcpException { 169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project LlcpSocket socket = doCreateLlcpSocket(sap, miu, rw, linearBufferLength); 170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (socket != null) { 171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return socket; 172525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } else { 173525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* Get Error Status */ 174525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project int error = doGetLastError(); 175525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 176525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project Log.d(TAG, "failed to create llcp socket: " + ErrorCodes.asString(error)); 177525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 178525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (error) { 179525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case ErrorCodes.ERROR_BUFFER_TO_SMALL: 180525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case ErrorCodes.ERROR_INSUFFICIENT_RESOURCES: 181525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project throw new LlcpException(error); 182525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project default: 183525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project throw new LlcpException(ErrorCodes.ERROR_SOCKET_CREATION); 184525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 185525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 186525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 187525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 188525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 189525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public native boolean doCheckLlcp(); 190525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 191525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public native boolean doActivateLlcp(); 193525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 194525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project private native void doResetTimeouts(); 195525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 196525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 197525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public void resetTimeouts() { 198525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project doResetTimeouts(); 199525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 200525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 201525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 202525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public native void doAbort(); 203525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 204525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project private native boolean doSetTimeout(int tech, int timeout); 205525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 206525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public boolean setTimeout(int tech, int timeout) { 207525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return doSetTimeout(tech, timeout); 208525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 209525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 210525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project private native int doGetTimeout(int tech); 211525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 212525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public int getTimeout(int tech) { 213525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return doGetTimeout(tech); 214525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 215525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 216525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 217525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 218525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public boolean canMakeReadOnly(int ndefType) { 219525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return (ndefType == Ndef.TYPE_1 || ndefType == Ndef.TYPE_2); 220525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 221525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 222525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 223525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public int getMaxTransceiveLength(int technology) { 224525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (technology) { 225525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case (TagTechnology.NFC_A): 226525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case (TagTechnology.MIFARE_CLASSIC): 227525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case (TagTechnology.MIFARE_ULTRALIGHT): 228525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return 253; // PN544 RF buffer = 255 bytes, subtract two for CRC 229525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case (TagTechnology.NFC_B): 230525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ///////////////////////////////////////////////////////////////// 231525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // Broadcom: Since BCM2079x supports this, set NfcB max size. 232525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //return 0; // PN544 does not support transceive of raw NfcB 233525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return 253; // PN544 does not support transceive of raw NfcB 234525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case (TagTechnology.NFC_V): 235525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return 253; // PN544 RF buffer = 255 bytes, subtract two for CRC 236525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case (TagTechnology.ISO_DEP): 237525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /* The maximum length of a normal IsoDep frame consists of: 238525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * CLA, INS, P1, P2, LC, LE + 255 payload bytes = 261 bytes 239525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * such a frame is supported. Extended length frames however 240525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * are not supported. 241525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */ 242525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return 261; // Will be automatically split in two frames on the RF layer 243525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case (TagTechnology.NFC_F): 244525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return 252; // PN544 RF buffer = 255 bytes, subtract one for SoD, two for CRC 245525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project default: 246525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return 0; 247525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 248525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 249525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 250525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 251525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project private native void doSetP2pInitiatorModes(int modes); 252525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 253525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public void setP2pInitiatorModes(int modes) { 254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project doSetP2pInitiatorModes(modes); 255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 256525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project private native void doSetP2pTargetModes(int modes); 258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 259525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public void setP2pTargetModes(int modes) { 260525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project doSetP2pTargetModes(modes); 261525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 262c4e4277a71c70e96198cb760676ad3b40f9e0e3dMartijn Coenen 263525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 264525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public boolean getExtendedLengthApdusSupported() { 265525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project // TODO check BCM support 266525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return false; 267525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 268525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 269525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 270525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public int getDefaultLlcpMiu() { 271525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return DEFAULT_LLCP_MIU; 272525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 273525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 274525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 275525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public int getDefaultLlcpRwSize() { 276525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return DEFAULT_LLCP_RWSIZE; 277525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 278525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 279525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project private native String doDump(); 280525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project @Override 281525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project public String dump() { 282525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return doDump(); 283525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 284525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 285d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales private native void doEnableScreenOffSuspend(); 286d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales @Override 287d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales public boolean enableScreenOffSuspend() { 288d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales doEnableScreenOffSuspend(); 289d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales return true; 290d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales } 291d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales 292d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales private native void doDisableScreenOffSuspend(); 293d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales @Override 294d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales public boolean disableScreenOffSuspend() { 295d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales doDisableScreenOffSuspend(); 296d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales return true; 297d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales } 298d2604c0544f7bc26e5b2407f0215cccfffedae2cAndres Morales 299525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /** 300525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Notifies Ndef Message (TODO: rename into notifyTargetDiscovered) 301525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */ 302525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project private void notifyNdefMessageListeners(NativeNfcTag tag) { 303525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mListener.onRemoteEndpointDiscovered(tag); 304525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 305525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 306525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /** 307525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Notifies P2P Device detected, to activate LLCP link 308525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */ 309525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project private void notifyLlcpLinkActivation(NativeP2pDevice device) { 310525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mListener.onLlcpLinkActivated(device); 311525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 312525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 313525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project /** 314525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Notifies P2P Device detected, to activate LLCP link 315525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */ 316525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project private void notifyLlcpLinkDeactivated(NativeP2pDevice device) { 317525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mListener.onLlcpLinkDeactivated(device); 318525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 319525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 32057a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen /** 32157a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen * Notifies first packet received from remote LLCP 32257a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen */ 32357a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen private void notifyLlcpLinkFirstPacketReceived(NativeP2pDevice device) { 32457a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen mListener.onLlcpFirstPacketReceived(device); 32557a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen } 32657a44d07a3de327e8cdbbcd622118aa517313dbeMartijn Coenen 3279f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen private void notifyHostEmuActivated() { 3289f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen mListener.onHostCardEmulationActivated(); 3299f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen } 3309f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 3319f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen private void notifyHostEmuData(byte[] data) { 3329f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen mListener.onHostCardEmulationData(data); 3339f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen } 3349f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen 3359f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen private void notifyHostEmuDeactivated() { 3369f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen mListener.onHostCardEmulationDeactivated(); 3379f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenen } 338c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen 339c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen private void notifyRfFieldActivated() { 340c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen mListener.onRemoteFieldActivated(); 341c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen } 342c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen 343c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen private void notifyRfFieldDeactivated() { 344c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen mListener.onRemoteFieldDeactivated(); 345c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen } 346c19c065b6d0e1a088780c4dca27a1404d5926765Martijn Coenen 347525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 348