1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18#undef LOG_TAG
19#define LOG_TAG "BrcmNfcJni"
20#include <jni.h>
21#include <pthread.h>
22#include <sys/queue.h>
23#include <semaphore.h>
24
25
26/* Discovery modes -- keep in sync with NFCManager.DISCOVERY_MODE_* */
27#define DISCOVERY_MODE_TAG_READER         0
28#define DISCOVERY_MODE_NFCIP1             1
29#define DISCOVERY_MODE_CARD_EMULATION     2
30#define DISCOVERY_MODE_TABLE_SIZE         3
31
32#define DISCOVERY_MODE_DISABLED           0
33#define DISCOVERY_MODE_ENABLED            1
34
35#define MODE_P2P_TARGET                   0
36#define MODE_P2P_INITIATOR                1
37
38
39/* Properties values */
40#define PROPERTY_LLCP_LTO                 0
41#define PROPERTY_LLCP_MIU                 1
42#define PROPERTY_LLCP_WKS                 2
43#define PROPERTY_LLCP_OPT                 3
44#define PROPERTY_NFC_DISCOVERY_A          4
45#define PROPERTY_NFC_DISCOVERY_B          5
46#define PROPERTY_NFC_DISCOVERY_F          6
47#define PROPERTY_NFC_DISCOVERY_15693      7
48#define PROPERTY_NFC_DISCOVERY_NCFIP      8
49
50
51/* Error codes */
52#define ERROR_BUFFER_TOO_SMALL            -12
53#define ERROR_INSUFFICIENT_RESOURCES      -9
54
55
56/* Pre-defined tag type values. These must match the values in
57 * Ndef.java in the framework.
58 */
59#define NDEF_UNKNOWN_TYPE                -1
60#define NDEF_TYPE1_TAG                   1
61#define NDEF_TYPE2_TAG                   2
62#define NDEF_TYPE3_TAG                   3
63#define NDEF_TYPE4_TAG                   4
64#define NDEF_MIFARE_CLASSIC_TAG          101
65
66
67/* Pre-defined card read/write state values. These must match the values in
68 * Ndef.java in the framework.
69 */
70#define NDEF_MODE_READ_ONLY              1
71#define NDEF_MODE_READ_WRITE             2
72#define NDEF_MODE_UNKNOWN                3
73
74
75/* Name strings for target types. These *must* match the values in TagTechnology.java */
76#define TARGET_TYPE_UNKNOWN               -1
77#define TARGET_TYPE_ISO14443_3A           1
78#define TARGET_TYPE_ISO14443_3B           2
79#define TARGET_TYPE_ISO14443_4            3
80#define TARGET_TYPE_FELICA                4
81#define TARGET_TYPE_ISO15693              5
82#define TARGET_TYPE_NDEF                  6
83#define TARGET_TYPE_NDEF_FORMATABLE       7
84#define TARGET_TYPE_MIFARE_CLASSIC        8
85#define TARGET_TYPE_MIFARE_UL             9
86#define TARGET_TYPE_KOVIO_BARCODE         10
87
88
89//define a few NXP error codes that NFC service expects;
90//see external/libnfc-nxp/src/phLibNfcStatus.h;
91//see external/libnfc-nxp/inc/phNfcStatus.h
92#define NFCSTATUS_SUCCESS (0x0000)
93#define NFCSTATUS_FAILED (0x00FF)
94
95struct nfc_jni_native_data
96{
97   /* Thread handle */
98   pthread_t thread;
99   int running;
100
101   /* Our VM */
102   JavaVM *vm;
103   int env_version;
104
105   /* Reference to the NFCManager instance */
106   jobject manager;
107
108   /* Cached objects */
109   jobject cached_NfcTag;
110   jobject cached_P2pDevice;
111
112   /* Secure Element selected */
113   int seId;
114
115   /* LLCP params */
116   int lto;
117   int miu;
118   int wks;
119   int opt;
120
121   int tech_mask;
122   int discovery_duration;
123
124   /* Tag detected */
125   jobject tag;
126
127   int tHandle;
128   int tProtocols[16];
129   int handles[16];
130};
131
132
133class ScopedAttach
134{
135public:
136    ScopedAttach(JavaVM* vm, JNIEnv** env) : vm_(vm)
137    {
138        vm_->AttachCurrentThread(env, NULL);
139    }
140
141    ~ScopedAttach()
142    {
143        vm_->DetachCurrentThread();
144    }
145
146private:
147        JavaVM* vm_;
148};
149
150
151extern "C"
152{
153    jint JNI_OnLoad(JavaVM *jvm, void *reserved);
154}
155
156
157namespace android
158{
159    int nfc_jni_cache_object (JNIEnv *e, const char *clsname, jobject *cached_obj);
160    int nfc_jni_get_nfc_socket_handle (JNIEnv *e, jobject o);
161    struct nfc_jni_native_data* nfc_jni_get_nat (JNIEnv *e, jobject o);
162    int register_com_android_nfc_NativeNfcManager (JNIEnv *e);
163    int register_com_android_nfc_NativeNfcTag (JNIEnv *e);
164    int register_com_android_nfc_NativeP2pDevice (JNIEnv *e);
165    int register_com_android_nfc_NativeLlcpConnectionlessSocket (JNIEnv *e);
166    int register_com_android_nfc_NativeLlcpServiceSocket (JNIEnv *e);
167    int register_com_android_nfc_NativeLlcpSocket (JNIEnv *e);
168    int register_com_android_nfc_NativeNfcSecureElement (JNIEnv *e);
169} // namespace android
170