blob: b01e582b2d538d5ffaaa8799a4732e712e7c2945 [file] [log] [blame]
nxpandroid64fd68c2015-09-23 16:45:15 +05301/*
Gaurav Singhal54d485e2016-05-24 18:04:04 +05302 * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
Puneet Mishra472a75e2015-11-11 11:57:26 +00003 * Not a Contribution.
4 *
Karthik Poosad4d476a2020-04-29 15:44:32 +05305 * Copyright (C) 2018-2020 NXP Semiconductors
Puneet Mishra472a75e2015-11-11 11:57:26 +00006 * The original Work has been changed by NXP Semiconductors.
nxpandroid64fd68c2015-09-23 16:45:15 +05307 * Copyright (C) 2010 The Android Open Source Project
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 */
nxpandroid64fd68c2015-09-23 16:45:15 +053021package com.android.nfc.dhimpl;
22
nxpandroid64fd68c2015-09-23 16:45:15 +053023import android.content.Context;
nxpandroid64fd68c2015-09-23 16:45:15 +053024import android.nfc.ErrorCodes;
25import android.nfc.tech.Ndef;
26import android.nfc.tech.TagTechnology;
27import android.util.Log;
nxpandroid64fd68c2015-09-23 16:45:15 +053028
nxpandroid64fd68c2015-09-23 16:45:15 +053029import com.android.nfc.DeviceHost;
30import com.android.nfc.LlcpException;
31import com.android.nfc.NfcDiscoveryParameters;
Martijn Coenen9f8f6cf2013-04-30 09:34:26 -070032
nxf24591dc0bc2c2018-02-21 17:33:08 +053033import java.io.FileDescriptor;
nxpandroid34627bd2016-05-27 15:52:30 +053034import java.util.Arrays;
35import java.util.Iterator;
36import java.util.HashMap;
Bhuvan Varshney0d9021b2018-11-20 16:53:15 +053037import android.os.SystemProperties;
nxpandroid34627bd2016-05-27 15:52:30 +053038
Bhuvan Varshney29eaac62019-02-04 15:26:06 +053039import android.os.RemoteException;
40import java.util.NoSuchElementException;
Bhuvan Varshney88938c22020-01-29 13:57:04 +053041import vendor.nxp.hardware.nfc.V2_0.INqNfc;
nxpandroid64fd68c2015-09-23 16:45:15 +053042
43/**
44 * Native interface to the NFC Manager functions
45 */
46public class NativeNfcManager implements DeviceHost {
47 private static final String TAG = "NativeNfcManager";
nxpandroid64fd68c2015-09-23 16:45:15 +053048 static final String PREF = "NciDeviceHost";
49
50 static final int DEFAULT_LLCP_MIU = 1980;
51 static final int DEFAULT_LLCP_RWSIZE = 2;
Suraj Uday Kotharkarce445d82019-04-19 10:30:46 +053052 static final int MODE_DEDICATED = 1;
53 static final int MODE_NORMAL = 0;
nxpandroid64fd68c2015-09-23 16:45:15 +053054 static final String DRIVER_NAME = "android-nci";
Bhuvan Varshney29eaac62019-02-04 15:26:06 +053055
56 private static INqNfc mNqHal = null;
nxpandroid64fd68c2015-09-23 16:45:15 +053057
nxpandroid64fd68c2015-09-23 16:45:15 +053058 static {
Bhuvan Varshney29eaac62019-02-04 15:26:06 +053059 String chip_id, libraryToUse;
60
61 //Get Chip-ID
62 chip_id = getChipId();
63 if(null == chip_id) {
64 //Use SN1XX series library as default
65 libraryToUse = "sn100nfc_nci_jni";
66 } else {
67 //Get library on the basis of the NFC HW
68 libraryToUse = getLibraryName(chip_id);
69 }
70 Log.d(TAG, "Loading library: "+libraryToUse);
71 System.loadLibrary(libraryToUse);
nxpandroid64fd68c2015-09-23 16:45:15 +053072 }
73
nxpandroid64fd68c2015-09-23 16:45:15 +053074 /* Native structure */
75 private long mNative;
76
nxf24591dc0bc2c2018-02-21 17:33:08 +053077 private int mIsoDepMaxTransceiveLength;
nxpandroid64fd68c2015-09-23 16:45:15 +053078 private final DeviceHostListener mListener;
nxpandroidecca0112018-06-06 14:41:40 +053079 private final NativeNfcMposManager mMposMgr;
Suhas Sureshaf84e9e2019-07-30 22:07:03 +053080 private final NativeT4tNfceeManager mT4tNfceeMgr;
nxpandroid64fd68c2015-09-23 16:45:15 +053081 private final Context mContext;
nxf24591dc0bc2c2018-02-21 17:33:08 +053082
nxpandroid34627bd2016-05-27 15:52:30 +053083 private final Object mLock = new Object();
84 private final HashMap<Integer, byte[]> mT3tIdentifiers = new HashMap<Integer, byte[]>();
nxf24591dc0bc2c2018-02-21 17:33:08 +053085
nxpandroid64fd68c2015-09-23 16:45:15 +053086 public NativeNfcManager(Context context, DeviceHostListener listener) {
87 mListener = listener;
88 initializeNativeStructure();
89 mContext = context;
nxpandroidecca0112018-06-06 14:41:40 +053090 mMposMgr = new NativeNfcMposManager();
Suhas Sureshaf84e9e2019-07-30 22:07:03 +053091 mT4tNfceeMgr = new NativeT4tNfceeManager();
nxpandroid64fd68c2015-09-23 16:45:15 +053092 }
93
Bhuvan Varshney29eaac62019-02-04 15:26:06 +053094 //Static function to getChip-ID
95 private static String getChipId() {
96 String chipIdValue = null;
97 boolean isHalServiceSupported = false;
98
99 try {
100 if(mNqHal == null) {
Bhuvan Varshney88938c22020-01-29 13:57:04 +0530101 Log.d(TAG, "INqNfc 2.0 interface not initialized yet. Getting INqNfcV2_0 Service");
Bhuvan Varshney29eaac62019-02-04 15:26:06 +0530102 mNqHal = INqNfc.getService();
103 }
104 if(mNqHal != null) {
Bhuvan Varshney29eaac62019-02-04 15:26:06 +0530105 chipIdValue = mNqHal.getNfcChipId();
Tapas Deyb9785b62019-05-03 18:25:45 +0530106 isHalServiceSupported = true;
Bhuvan Varshney29eaac62019-02-04 15:26:06 +0530107 Log.d(TAG, "Chip-ID received from HAL interface: "+chipIdValue);
108 }
109 }
110 catch(RemoteException | NoSuchElementException e) {
Bhuvan Varshney88938c22020-01-29 13:57:04 +0530111 Log.e(TAG, "INqNfc 2.0 element not supported");
Bhuvan Varshney29eaac62019-02-04 15:26:06 +0530112 }
113
114 if(isHalServiceSupported == false) {
115 Log.d(TAG, "Reading system property for chip-id.");
Tapas Deyb9785b62019-05-03 18:25:45 +0530116 chipIdValue = SystemProperties.get("vendor.qti.nfc.chipid", "0x51");
Bhuvan Varshney29eaac62019-02-04 15:26:06 +0530117 Log.d(TAG, "Chip-ID received from system property: "+chipIdValue);
118 }
119
120 return chipIdValue;
121 }
122
123 private static String getLibraryName(String chip_id) {
124 String libraryName;
125
126 switch(chip_id) {
127 case "0xa3":
128 case "0xa4":
129 libraryName = "sn100nfc_nci_jni";
130 break;
131 case "0x51":
Tapas Dey5f94a0a2019-10-16 15:51:10 +0530132 case "0x41":
133 case "0x58":
michaellin44692bd2020-11-17 14:29:49 +0800134 case "0x40":
Bhuvan Varshney29eaac62019-02-04 15:26:06 +0530135 libraryName = "nqnfc_nci_jni";
136 break;
137 default:
138 /*
139 * While doing code integration, please make sure the library name
140 * matches with the LOCAL_MODULE name mentioned in the Makefile.
141 * Makefile path: nci/SN100x/jni/Android.mk
142 */
143 libraryName = "sn100nfc_nci_jni";
144 break;
145 }
146 return libraryName;
147 }
148
nxpandroid64fd68c2015-09-23 16:45:15 +0530149 public native boolean initializeNativeStructure();
150
151 private native boolean doDownload();
nxpandroid64fd68c2015-09-23 16:45:15 +0530152
153 public native int doGetLastError();
154
155 @Override
nxf500518f4f4b22019-04-03 13:54:33 +0530156 public boolean checkFirmware() {
157 return doDownload();
nxpandroid64fd68c2015-09-23 16:45:15 +0530158 }
Suraj Uday Kotharkarce445d82019-04-19 10:30:46 +0530159 public native boolean doPartialInitForEseCosUpdate();
160 public native boolean doPartialDeinitForEseCosUpdate();
Ayush4cb815e2018-08-06 18:51:39 +0530161
162 @Override
Suraj Uday Kotharkarce445d82019-04-19 10:30:46 +0530163 public boolean accessControlForCOSU (int mode) {
164 boolean stat = false;
165 if(mode == MODE_DEDICATED) {
166 stat = doPartialInitForEseCosUpdate();
167 }
168 else if(mode == MODE_NORMAL) {
169 stat = doPartialDeinitForEseCosUpdate();
170 }
171 return stat;
Ayush4cb815e2018-08-06 18:51:39 +0530172 }
nxpandroid64fd68c2015-09-23 16:45:15 +0530173
174 private native boolean doInitialize();
175
nxf24591dc0bc2c2018-02-21 17:33:08 +0530176 private native int getIsoDepMaxTransceiveLength();
177
nxpandroid64fd68c2015-09-23 16:45:15 +0530178 @Override
179 public boolean initialize() {
nxf24591dc0bc2c2018-02-21 17:33:08 +0530180 boolean ret = doInitialize();
181 mIsoDepMaxTransceiveLength = getIsoDepMaxTransceiveLength();
182 return ret;
nxpandroid64fd68c2015-09-23 16:45:15 +0530183 }
184
185 private native void doEnableDtaMode();
186
187 @Override
188 public void enableDtaMode() {
nxpandroid64fd68c2015-09-23 16:45:15 +0530189 doEnableDtaMode();
190 }
191
192 private native void doDisableDtaMode();
193
194 @Override
195 public void disableDtaMode() {
196 Log.d(TAG,"disableDtaMode : entry");
197 doDisableDtaMode();
198 }
199
nxf24591dc0bc2c2018-02-21 17:33:08 +0530200 private native void doFactoryReset();
201
Gaurav Singhal54d485e2016-05-24 18:04:04 +0530202 @Override
nxf24591dc0bc2c2018-02-21 17:33:08 +0530203 public void factoryReset() {
204 doFactoryReset();
205 }
206
207 private native void doShutdown();
208
209 @Override
210 public void shutdown() {
211 doShutdown();
212 }
Gaurav Singhal54d485e2016-05-24 18:04:04 +0530213
nxpandroid64fd68c2015-09-23 16:45:15 +0530214 private native boolean doDeinitialize();
215
216 @Override
217 public boolean deinitialize() {
nxpandroid64fd68c2015-09-23 16:45:15 +0530218 return doDeinitialize();
219 }
220
221 @Override
222 public String getName() {
223 return DRIVER_NAME;
224 }
225
226 @Override
227 public native boolean sendRawFrame(byte[] data);
228
Arjun Thottingal Jayarajand41f3ec2018-08-07 05:35:27 +0530229 public native boolean doClearRoutingEntry(int type );
230
231 @Override
232 public boolean clearRoutingEntry( int type ) {
233 return(doClearRoutingEntry( type ));
234 }
235
236 public native boolean doSetRoutingEntry(int type, int value, int route, int power);
237 @Override
238 public boolean setRoutingEntry(int type, int value, int route, int power) {
239 return(doSetRoutingEntry(type, value, route, power));
240 }
Tapas Deyf0a7b1a2019-06-20 13:21:50 +0530241
nxpandroid64fd68c2015-09-23 16:45:15 +0530242 @Override
nxf24591dc0bc2c2018-02-21 17:33:08 +0530243 public native boolean routeAid(byte[] aid, int route, int aidInfo, int powerState);
nxpandroid64fd68c2015-09-23 16:45:15 +0530244
Arjun Thottingal Jayarajand41f3ec2018-08-07 05:35:27 +0530245
nxpandroid64fd68c2015-09-23 16:45:15 +0530246 @Override
nxf24591dc0bc2c2018-02-21 17:33:08 +0530247 public native boolean unrouteAid(byte[] aid);
nxpandroid64fd68c2015-09-23 16:45:15 +0530248
249 @Override
250 public native int getAidTableSize();
251
252 @Override
253 public native int getDefaultAidRoute();
254
255 @Override
256 public native int getDefaultDesfireRoute();
257
258 @Override
Himanshu Singh09645202020-01-16 11:53:49 +0530259 public native int getT4TNfceePowerState();
260
261 @Override
nxpandroid64fd68c2015-09-23 16:45:15 +0530262 public native int getDefaultMifareCLTRoute();
263
264 @Override
Ayush113c4a22018-08-08 19:31:48 +0530265 public native int getDefaultFelicaCLTRoute();
266
267 @Override
nxpandroida9a68ba2016-01-14 21:12:17 +0530268 public native int getDefaultAidPowerState();
269
270 @Override
271 public native int getDefaultDesfirePowerState();
272
273 @Override
274 public native int getDefaultMifareCLTPowerState();
275
276 @Override
Ayush113c4a22018-08-08 19:31:48 +0530277 public native int getDefaultFelicaCLTPowerState();
278
279 @Override
suraj9a775d52018-12-05 18:44:38 +0530280 public native int getGsmaPwrState();
281
282 @Override
nxf24591dc0bc2c2018-02-21 17:33:08 +0530283 public native boolean commitRouting();
nxpandroide00bc1a2017-07-12 21:39:16 +0530284
285 @Override
Ayusha9eb5862018-07-30 14:19:33 +0530286 public native void doChangeDiscoveryTech(int pollTech, int listenTech);
Suraj Uday Kotharkar3bcfda12018-07-20 23:24:32 +0530287
288 @Override
Suraj Uday Kotharkara0fa65e2018-08-24 18:34:12 +0530289 public native void setEmptyAidRoute(int deafultAidroute);
Arjun Thottingal Jayarajand41f3ec2018-08-07 05:35:27 +0530290
291 @Override
Ayush73d68912018-04-04 21:36:26 +0530292 public native int[] doGetActiveSecureElementList();
Ayush73d68912018-04-04 21:36:26 +0530293
Ayush73d68912018-04-04 21:36:26 +0530294 @Override
hariprasad nalacheruvu38148652019-06-25 15:39:17 +0530295 public native int doSetFieldDetectMode(boolean mode);
296
297 @Override
298 public native boolean isFieldDetectEnabled();
Ayush73d68912018-04-04 21:36:26 +0530299
nxf24591dc0bc2c2018-02-21 17:33:08 +0530300 public native int doRegisterT3tIdentifier(byte[] t3tIdentifier);
301
302 @Override
Ganesh Deva77d14be2019-08-01 15:44:25 +0530303 public native int doNfcSelfTest(int type);
304
305 @Override
nxf24591dc0bc2c2018-02-21 17:33:08 +0530306 public void registerT3tIdentifier(byte[] t3tIdentifier) {
307 synchronized (mLock) {
308 int handle = doRegisterT3tIdentifier(t3tIdentifier);
309 if (handle != 0xffff) {
310 mT3tIdentifiers.put(Integer.valueOf(handle), t3tIdentifier);
311 }
312 }
313 }
314
315 public native void doDeregisterT3tIdentifier(int handle);
316
317 @Override
318 public void deregisterT3tIdentifier(byte[] t3tIdentifier) {
319 synchronized (mLock) {
320 Iterator<Integer> it = mT3tIdentifiers.keySet().iterator();
321 while (it.hasNext()) {
322 int handle = it.next().intValue();
323 byte[] value = mT3tIdentifiers.get(handle);
324 if (Arrays.equals(value, t3tIdentifier)) {
325 doDeregisterT3tIdentifier(handle);
326 mT3tIdentifiers.remove(handle);
327 break;
328 }
329 }
330 }
331 }
332
333 @Override
334 public void clearT3tIdentifiersCache() {
335 synchronized (mLock) {
336 mT3tIdentifiers.clear();
337 }
338 }
339
340 @Override
341 public native int getLfT3tMax();
nxpandroid64fd68c2015-09-23 16:45:15 +0530342
343 @Override
nxpandroide66eb092017-07-12 21:36:08 +0530344 public native void doSetScreenState(int screen_state_mask);
nxpandroid64fd68c2015-09-23 16:45:15 +0530345
nxpandroid1153eb32015-11-06 18:46:58 +0530346 @Override
Ganesh Deva8f328ca2019-08-14 13:19:28 +0530347 public native void doResonantFrequency(boolean isResonantFreq);
Suraj Uday Kotharkar190ba2e2019-04-19 11:15:41 +0530348
Ganesh Deva8f328ca2019-08-14 13:19:28 +0530349 @Override
nxpandroide66eb092017-07-12 21:36:08 +0530350 public native int getNciVersion();
nxpandroid64fd68c2015-09-23 16:45:15 +0530351
352 private native void doEnableDiscovery(int techMask,
353 boolean enableLowPowerPolling,
354 boolean enableReaderMode,
nxf24591dc0bc2c2018-02-21 17:33:08 +0530355 boolean enableHostRouting,
nxpandroid64fd68c2015-09-23 16:45:15 +0530356 boolean enableP2p,
357 boolean restart);
nxpandroid64fd68c2015-09-23 16:45:15 +0530358 @Override
359 public void enableDiscovery(NfcDiscoveryParameters params, boolean restart) {
360 doEnableDiscovery(params.getTechMask(), params.shouldEnableLowPowerDiscovery(),
nxf24591dc0bc2c2018-02-21 17:33:08 +0530361 params.shouldEnableReaderMode(), params.shouldEnableHostRouting(),
362 params.shouldEnableP2p(), restart);
nxpandroid64fd68c2015-09-23 16:45:15 +0530363 }
nxpandroidecca0112018-06-06 14:41:40 +0530364 @Override
365 public void stopPoll(int mode) {
366 mMposMgr.doStopPoll(mode);
367 }
368
369 @Override
370 public void startPoll() {
371 mMposMgr.doStartPoll();
372 }
nxf2417803e59612019-08-05 23:30:57 +0530373 @Override
374 public native void disableDiscovery();
nxpandroidecca0112018-06-06 14:41:40 +0530375
376 @Override
377 public int mposSetReaderMode(boolean on) {
378 return mMposMgr.doMposSetReaderMode(on);
379 }
380
381 @Override
Nanjesh7a1bf932020-04-24 23:24:11 +0530382 public int configureSecureReaderMode(boolean on, String readerType) {
383 return mMposMgr.doConfigureSecureReaderMode(on, readerType);
384 }
385
386 @Override
nxpandroidecca0112018-06-06 14:41:40 +0530387 public boolean mposGetReaderMode() {
388 return mMposMgr.doMposGetReaderMode();
389 }
390
Suhas Sureshaf84e9e2019-07-30 22:07:03 +0530391 @Override
392 public int doWriteT4tData(byte[] fileId, byte[] data, int length) {
393 return mT4tNfceeMgr.doWriteT4tData(fileId, data, length);
394 }
395
396 @Override
397 public byte[] doReadT4tData(byte[] fileId) {
398 return mT4tNfceeMgr.doReadT4tData(fileId);
399 }
Ayush Raj05337802019-08-22 16:24:27 +0530400 @Override
401 public boolean doLockT4tData(boolean lock) {
402 return mT4tNfceeMgr.doLockT4tData(lock);
403 }
Suhas Sureshaf84e9e2019-07-30 22:07:03 +0530404
Ayush Raj05337802019-08-22 16:24:27 +0530405 @Override
406 public boolean isLockedT4tData() {
407 return mT4tNfceeMgr.isLockedT4tData();
408 }
Ayush Rajae453842019-09-28 18:10:16 +0530409
410 @Override
411 public boolean doClearNdefT4tData() {
412 return mT4tNfceeMgr.doClearNdefT4tData();
413 }
nxpandroid64fd68c2015-09-23 16:45:15 +0530414
nxpandroid64fd68c2015-09-23 16:45:15 +0530415 private native NativeLlcpConnectionlessSocket doCreateLlcpConnectionlessSocket(int nSap,
416 String sn);
417
418 @Override
419 public LlcpConnectionlessSocket createLlcpConnectionlessSocket(int nSap, String sn)
420 throws LlcpException {
421 LlcpConnectionlessSocket socket = doCreateLlcpConnectionlessSocket(nSap, sn);
422 if (socket != null) {
423 return socket;
424 } else {
425 /* Get Error Status */
426 int error = doGetLastError();
427
428 Log.d(TAG, "failed to create llcp socket: " + ErrorCodes.asString(error));
429
430 switch (error) {
431 case ErrorCodes.ERROR_BUFFER_TO_SMALL:
432 case ErrorCodes.ERROR_INSUFFICIENT_RESOURCES:
433 throw new LlcpException(error);
434 default:
435 throw new LlcpException(ErrorCodes.ERROR_SOCKET_CREATION);
436 }
437 }
438 }
439
440 private native NativeLlcpServiceSocket doCreateLlcpServiceSocket(int nSap, String sn, int miu,
441 int rw, int linearBufferLength);
442 @Override
443 public LlcpServerSocket createLlcpServerSocket(int nSap, String sn, int miu,
444 int rw, int linearBufferLength) throws LlcpException {
445 LlcpServerSocket socket = doCreateLlcpServiceSocket(nSap, sn, miu, rw, linearBufferLength);
446 if (socket != null) {
447 return socket;
448 } else {
449 /* Get Error Status */
450 int error = doGetLastError();
451
452 Log.d(TAG, "failed to create llcp socket: " + ErrorCodes.asString(error));
453
454 switch (error) {
455 case ErrorCodes.ERROR_BUFFER_TO_SMALL:
456 case ErrorCodes.ERROR_INSUFFICIENT_RESOURCES:
457 throw new LlcpException(error);
458 default:
459 throw new LlcpException(ErrorCodes.ERROR_SOCKET_CREATION);
460 }
461 }
462 }
463
464 private native NativeLlcpSocket doCreateLlcpSocket(int sap, int miu, int rw,
465 int linearBufferLength);
466 @Override
467 public LlcpSocket createLlcpSocket(int sap, int miu, int rw,
468 int linearBufferLength) throws LlcpException {
469 LlcpSocket socket = doCreateLlcpSocket(sap, miu, rw, linearBufferLength);
470 if (socket != null) {
471 return socket;
472 } else {
473 /* Get Error Status */
474 int error = doGetLastError();
475
476 Log.d(TAG, "failed to create llcp socket: " + ErrorCodes.asString(error));
477
478 switch (error) {
479 case ErrorCodes.ERROR_BUFFER_TO_SMALL:
480 case ErrorCodes.ERROR_INSUFFICIENT_RESOURCES:
481 throw new LlcpException(error);
482 default:
483 throw new LlcpException(ErrorCodes.ERROR_SOCKET_CREATION);
484 }
485 }
486 }
487
488 @Override
489 public native boolean doCheckLlcp();
490
491 @Override
nxpandroid64fd68c2015-09-23 16:45:15 +0530492 public native boolean doActivateLlcp();
493
494 private native void doResetTimeouts();
495
496 @Override
497 public void resetTimeouts() {
498 doResetTimeouts();
499 }
500
501 @Override
nxpandroid6fd9cdb2017-07-12 18:25:41 +0530502 public native void doAbort(String msg);
nxpandroid64fd68c2015-09-23 16:45:15 +0530503
504 private native boolean doSetTimeout(int tech, int timeout);
505 @Override
506 public boolean setTimeout(int tech, int timeout) {
507 return doSetTimeout(tech, timeout);
508 }
509
510 private native int doGetTimeout(int tech);
511 @Override
512 public int getTimeout(int tech) {
513 return doGetTimeout(tech);
514 }
515
516
517 @Override
518 public boolean canMakeReadOnly(int ndefType) {
nxf24591dc0bc2c2018-02-21 17:33:08 +0530519 return (ndefType == Ndef.TYPE_1 || ndefType == Ndef.TYPE_2);
nxpandroid64fd68c2015-09-23 16:45:15 +0530520 }
521
522 @Override
523 public int getMaxTransceiveLength(int technology) {
524 switch (technology) {
525 case (TagTechnology.NFC_A):
526 case (TagTechnology.MIFARE_CLASSIC):
527 case (TagTechnology.MIFARE_ULTRALIGHT):
528 return 253; // PN544 RF buffer = 255 bytes, subtract two for CRC
529 case (TagTechnology.NFC_B):
530 /////////////////////////////////////////////////////////////////
531 // Broadcom: Since BCM2079x supports this, set NfcB max size.
532 //return 0; // PN544 does not support transceive of raw NfcB
533 return 253; // PN544 does not support transceive of raw NfcB
534 case (TagTechnology.NFC_V):
535 return 253; // PN544 RF buffer = 255 bytes, subtract two for CRC
536 case (TagTechnology.ISO_DEP):
nxf24591dc0bc2c2018-02-21 17:33:08 +0530537 return mIsoDepMaxTransceiveLength;
nxpandroid64fd68c2015-09-23 16:45:15 +0530538 case (TagTechnology.NFC_F):
Suraj Uday Kotharkar4d88a252018-05-16 14:32:10 +0530539 return 255;
nxpandroid64fd68c2015-09-23 16:45:15 +0530540 default:
541 return 0;
542 }
543
544 }
545
nxpandroid64fd68c2015-09-23 16:45:15 +0530546 private native void doSetP2pInitiatorModes(int modes);
547 @Override
548 public void setP2pInitiatorModes(int modes) {
549 doSetP2pInitiatorModes(modes);
550 }
551
552 private native void doSetP2pTargetModes(int modes);
553 @Override
554 public void setP2pTargetModes(int modes) {
555 doSetP2pTargetModes(modes);
556 }
557
558 @Override
559 public boolean getExtendedLengthApdusSupported() {
nxf24591dc0bc2c2018-02-21 17:33:08 +0530560 /* 261 is the default size if extended length frames aren't supported */
561 if (getMaxTransceiveLength(TagTechnology.ISO_DEP) > 261)
562 return true;
563 return false;
nxpandroid64fd68c2015-09-23 16:45:15 +0530564 }
565
566 @Override
567 public int getDefaultLlcpMiu() {
568 return DEFAULT_LLCP_MIU;
569 }
570
571 @Override
572 public int getDefaultLlcpRwSize() {
573 return DEFAULT_LLCP_RWSIZE;
574 }
575
nxf24591dc0bc2c2018-02-21 17:33:08 +0530576 private native void doDump(FileDescriptor fd);
nxpandroid64fd68c2015-09-23 16:45:15 +0530577 @Override
nxf24591dc0bc2c2018-02-21 17:33:08 +0530578 public void dump(FileDescriptor fd) {
579 doDump(fd);
nxpandroid64fd68c2015-09-23 16:45:15 +0530580 }
581
582 private native void doEnableScreenOffSuspend();
583 @Override
584 public boolean enableScreenOffSuspend() {
585 doEnableScreenOffSuspend();
586 return true;
587 }
588
589 private native void doDisableScreenOffSuspend();
590 @Override
591 public boolean disableScreenOffSuspend() {
592 doDisableScreenOffSuspend();
593 return true;
594 }
595
nxp72559e5e33072019-03-18 18:15:29 +0530596 private native boolean doSetNfcSecure(boolean enable);
597 @Override
598 public boolean setNfcSecure(boolean enable) {
599 return doSetNfcSecure(enable);
600 }
601
nxpandroid64fd68c2015-09-23 16:45:15 +0530602 /**
603 * Notifies Ndef Message (TODO: rename into notifyTargetDiscovered)
604 */
605 private void notifyNdefMessageListeners(NativeNfcTag tag) {
606 mListener.onRemoteEndpointDiscovered(tag);
607 }
Suraj Uday Kotharkar2a0ee9c2018-04-27 03:48:23 +0530608 private void notifySeListenActivated() {
609 mListener.onSeListenActivated();
610 }
nxpandroid64fd68c2015-09-23 16:45:15 +0530611
Suraj Uday Kotharkar2a0ee9c2018-04-27 03:48:23 +0530612 private void notifySeListenDeactivated() {
613 mListener.onSeListenDeactivated();
614 }
Suraj Uday Kotharkar9e250fb2018-06-08 21:06:52 +0530615
616 private void notifySeInitialized() {
617 mListener.onSeInitialized();
618 }
nxpandroid64fd68c2015-09-23 16:45:15 +0530619 /**
nxpandroid64fd68c2015-09-23 16:45:15 +0530620 * Notifies P2P Device detected, to activate LLCP link
621 */
622 private void notifyLlcpLinkActivation(NativeP2pDevice device) {
623 mListener.onLlcpLinkActivated(device);
624 }
625
626 /**
627 * Notifies P2P Device detected, to activate LLCP link
628 */
629 private void notifyLlcpLinkDeactivated(NativeP2pDevice device) {
630 mListener.onLlcpLinkDeactivated(device);
631 }
632
633 /**
634 * Notifies first packet received from remote LLCP
635 */
636 private void notifyLlcpLinkFirstPacketReceived(NativeP2pDevice device) {
637 mListener.onLlcpFirstPacketReceived(device);
638 }
639
nxf24178c6842882019-08-26 11:39:16 +0530640 /* Reader over SWP/SCR listeners*/
641 private void notifyonMposManagerEvents(int event) {
642 mListener.onScrNotifyEvents(event);
nxpandroidecca0112018-06-06 14:41:40 +0530643 }
644
nxpandroid34627bd2016-05-27 15:52:30 +0530645 private void notifyHostEmuActivated(int technology) {
646 mListener.onHostCardEmulationActivated(technology);
nxpandroid64fd68c2015-09-23 16:45:15 +0530647 }
648
nxpandroid34627bd2016-05-27 15:52:30 +0530649 private void notifyHostEmuData(int technology, byte[] data) {
650 mListener.onHostCardEmulationData(technology, data);
nxpandroid64fd68c2015-09-23 16:45:15 +0530651 }
652
nxpandroid34627bd2016-05-27 15:52:30 +0530653 private void notifyHostEmuDeactivated(int technology) {
654 mListener.onHostCardEmulationDeactivated(technology);
nxpandroid64fd68c2015-09-23 16:45:15 +0530655 }
656
nxpandroid64fd68c2015-09-23 16:45:15 +0530657 private void notifyRfFieldActivated() {
658 mListener.onRemoteFieldActivated();
659 }
660
661 private void notifyRfFieldDeactivated() {
662 mListener.onRemoteFieldDeactivated();
663 }
664
Suraj Uday Kotharkar9de7ec02018-05-15 13:02:36 +0530665 private void notifyTransactionListeners(byte[] aid, byte[] data, String evtSrc) {
666 mListener.onNfcTransactionEvent(aid, data, evtSrc);
667 }
nxf24591dc0bc2c2018-02-21 17:33:08 +0530668/* NXP extension are here */
669 @Override
Ravishinde1177c1d2018-08-05 15:47:09 +0530670 public native int getFWVersion();
671 @Override
672 public native byte[] readerPassThruMode(byte status, byte modulationTyp);
673 @Override
674 public native byte[] transceiveAppData(byte[] data);
675 @Override
676 public native boolean isNfccBusy();
677 @Override
678 public native int setTransitConfig(String configs);
679 @Override
680 public native int getRemainingAidTableSize();
681 @Override
682 public native int doselectUicc(int uiccSlot);
683 @Override
684 public native int doGetSelectedUicc();
685 @Override
686 public native int setPreferredSimSlot(int uiccSlot);
nxpandroid64fd68c2015-09-23 16:45:15 +0530687}