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#pragma once
18525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include <jni.h>
19525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include <pthread.h>
20525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include <semaphore.h>
21441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#include <sys/queue.h>
22525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
23525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/* Discovery modes -- keep in sync with NFCManager.DISCOVERY_MODE_* */
24441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define DISCOVERY_MODE_TAG_READER 0
25441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define DISCOVERY_MODE_NFCIP1 1
26441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define DISCOVERY_MODE_CARD_EMULATION 2
27441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define DISCOVERY_MODE_TABLE_SIZE 3
28525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
29441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define DISCOVERY_MODE_DISABLED 0
30441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define DISCOVERY_MODE_ENABLED 1
31525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
32441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define MODE_P2P_TARGET 0
33441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define MODE_P2P_INITIATOR 1
34525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
35525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/* Properties values */
36441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define PROPERTY_LLCP_LTO 0
37441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define PROPERTY_LLCP_MIU 1
38441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define PROPERTY_LLCP_WKS 2
39441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define PROPERTY_LLCP_OPT 3
40441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define PROPERTY_NFC_DISCOVERY_A 4
41441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define PROPERTY_NFC_DISCOVERY_B 5
42441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define PROPERTY_NFC_DISCOVERY_F 6
43441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define PROPERTY_NFC_DISCOVERY_15693 7
44441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define PROPERTY_NFC_DISCOVERY_NCFIP 8
45525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
46525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/* Error codes */
47441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define ERROR_BUFFER_TOO_SMALL (-12)
48441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define ERROR_INSUFFICIENT_RESOURCES (-9)
49525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
50525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/* Pre-defined tag type values. These must match the values in
51525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Ndef.java in the framework.
52525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */
53441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define NDEF_UNKNOWN_TYPE (-1)
54441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define NDEF_TYPE1_TAG 1
55441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define NDEF_TYPE2_TAG 2
56441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define NDEF_TYPE3_TAG 3
57441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define NDEF_TYPE4_TAG 4
58441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define NDEF_MIFARE_CLASSIC_TAG 101
59525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
60525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/* Pre-defined card read/write state values. These must match the values in
61525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Ndef.java in the framework.
62525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */
63441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define NDEF_MODE_READ_ONLY 1
64441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define NDEF_MODE_READ_WRITE 2
65441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define NDEF_MODE_UNKNOWN 3
66441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi
67441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi/* Name strings for target types. These *must* match the values in
68441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi * TagTechnology.java */
69441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define TARGET_TYPE_UNKNOWN (-1)
70441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define TARGET_TYPE_ISO14443_3A 1
71441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define TARGET_TYPE_ISO14443_3B 2
72441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define TARGET_TYPE_ISO14443_4 3
73441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define TARGET_TYPE_FELICA 4
74441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define TARGET_TYPE_V 5
75441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define TARGET_TYPE_NDEF 6
76441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define TARGET_TYPE_NDEF_FORMATABLE 7
77441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define TARGET_TYPE_MIFARE_CLASSIC 8
78441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define TARGET_TYPE_MIFARE_UL 9
79441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi#define TARGET_TYPE_KOVIO_BARCODE 10
80441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi
81441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi// define a few NXP error codes that NFC service expects;
82441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi// see external/libnfc-nxp/src/phLibNfcStatus.h;
83441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi// see external/libnfc-nxp/inc/phNfcStatus.h
84525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define NFCSTATUS_SUCCESS (0x0000)
85525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#define NFCSTATUS_FAILED (0x00FF)
86525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
87441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoistruct nfc_jni_native_data {
88441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  /* Thread handle */
89441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  pthread_t thread;
90441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  int running;
91525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
92441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  /* Our VM */
933f999f25917b2bc50ab78c7e073da18f6fa69d6bRuchi Kandoi  JavaVM* vm;
94441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  int env_version;
95525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
96441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  /* Reference to the NFCManager instance */
97441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  jobject manager;
98525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
99441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  /* Cached objects */
100441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  jobject cached_NfcTag;
101441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  jobject cached_P2pDevice;
102525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
103441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  /* Secure Element selected */
104441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  int seId;
105525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
106441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  /* LLCP params */
107441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  int lto;
108441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  int miu;
109441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  int wks;
110441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  int opt;
111525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
112441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  int tech_mask;
113441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  int discovery_duration;
114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
115441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  /* Tag detected */
116441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  jobject tag;
117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
118441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  int tHandle;
119441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  int tProtocols[16];
120441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  int handles[16];
121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project};
122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
123441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoiclass ScopedAttach {
1243f999f25917b2bc50ab78c7e073da18f6fa69d6bRuchi Kandoi public:
1253f999f25917b2bc50ab78c7e073da18f6fa69d6bRuchi Kandoi  ScopedAttach(JavaVM* vm, JNIEnv** env) : vm_(vm) {
126441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi    vm_->AttachCurrentThread(env, NULL);
127441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  }
128a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
129441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoi  ~ScopedAttach() { vm_->DetachCurrentThread(); }
130a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu
1313f999f25917b2bc50ab78c7e073da18f6fa69d6bRuchi Kandoi private:
1323f999f25917b2bc50ab78c7e073da18f6fa69d6bRuchi Kandoi  JavaVM* vm_;
1332534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes};
1342534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes
1353f999f25917b2bc50ab78c7e073da18f6fa69d6bRuchi Kandoijint JNI_OnLoad(JavaVM* jvm, void* reserved);
136525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
137441bcfc994dcd92a23a9fa7eb3d249660488429cRuchi Kandoinamespace android {
1383f999f25917b2bc50ab78c7e073da18f6fa69d6bRuchi Kandoiint nfc_jni_cache_object(JNIEnv* e, const char* clsname, jobject* cached_obj);
1393f999f25917b2bc50ab78c7e073da18f6fa69d6bRuchi Kandoiint nfc_jni_cache_object_local(JNIEnv* e, const char* className,
1403f999f25917b2bc50ab78c7e073da18f6fa69d6bRuchi Kandoi                               jobject* cachedObj);
1413f999f25917b2bc50ab78c7e073da18f6fa69d6bRuchi Kandoiint nfc_jni_get_nfc_socket_handle(JNIEnv* e, jobject o);
1423f999f25917b2bc50ab78c7e073da18f6fa69d6bRuchi Kandoistruct nfc_jni_native_data* nfc_jni_get_nat(JNIEnv* e, jobject o);
1433f999f25917b2bc50ab78c7e073da18f6fa69d6bRuchi Kandoiint register_com_android_nfc_NativeNfcManager(JNIEnv* e);
1443f999f25917b2bc50ab78c7e073da18f6fa69d6bRuchi Kandoiint register_com_android_nfc_NativeNfcTag(JNIEnv* e);
1453f999f25917b2bc50ab78c7e073da18f6fa69d6bRuchi Kandoiint register_com_android_nfc_NativeP2pDevice(JNIEnv* e);
1463f999f25917b2bc50ab78c7e073da18f6fa69d6bRuchi Kandoiint register_com_android_nfc_NativeLlcpConnectionlessSocket(JNIEnv* e);
1473f999f25917b2bc50ab78c7e073da18f6fa69d6bRuchi Kandoiint register_com_android_nfc_NativeLlcpServiceSocket(JNIEnv* e);
1483f999f25917b2bc50ab78c7e073da18f6fa69d6bRuchi Kandoiint register_com_android_nfc_NativeLlcpSocket(JNIEnv* e);
1493f999f25917b2bc50ab78c7e073da18f6fa69d6bRuchi Kandoi}  // namespace android
150