com_android_nfc.h revision b74200f40f9d4f536b8782974d444f1f9178076f
1f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/*
2f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * Copyright (C) 2010 The Android Open Source Project
3f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly *
4f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * Licensed under the Apache License, Version 2.0 (the "License");
5f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * you may not use this file except in compliance with the License.
6f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * You may obtain a copy of the License at
7f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly *
8f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly *      http://www.apache.org/licenses/LICENSE-2.0
9f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly *
10f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * Unless required by applicable law or agreed to in writing, software
11f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * distributed under the License is distributed on an "AS IS" BASIS,
12f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * See the License for the specific language governing permissions and
14f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * limitations under the License.
15f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly */
16f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
17c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly#ifndef __COM_ANDROID_NFC_JNI_H__
18c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly#define __COM_ANDROID_NFC_JNI_H__
19f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
20c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly#define LOG_TAG "NFC JNI"
21f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
22f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#include <JNIHelp.h>
23f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#include <jni.h>
24f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
25f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#include <pthread.h>
26f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
27f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pellyextern "C" {
28f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#include <phNfcStatus.h>
29f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#include <phNfcTypes.h>
30f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#include <phNfcIoctlCode.h>
31f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#include <phLibNfc.h>
32f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#include <phDal4Nfc_messageQueueLib.h>
33ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton#include <cutils/log.h>
34f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly}
35f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#include <cutils/properties.h> // for property_get
36f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
37ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton
38f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/* Discovery modes -- keep in sync with NFCManager.DISCOVERY_MODE_* */
39f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define DISCOVERY_MODE_TAG_READER         0
40f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define DISCOVERY_MODE_NFCIP1             1
41f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define DISCOVERY_MODE_CARD_EMULATION     2
42f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
43f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define DISCOVERY_MODE_TABLE_SIZE         3
44f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
45f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define DISCOVERY_MODE_DISABLED           0
46f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define DISCOVERY_MODE_ENABLED            1
47f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
48f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define MODE_P2P_TARGET                   0
49f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define MODE_P2P_INITIATOR                1
50f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
51f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/* Properties values */
52f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define PROPERTY_LLCP_LTO                 0
53f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define PROPERTY_LLCP_MIU                 1
54f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define PROPERTY_LLCP_WKS                 2
55f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define PROPERTY_LLCP_OPT                 3
56f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define PROPERTY_NFC_DISCOVERY_A          4
57f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define PROPERTY_NFC_DISCOVERY_B          5
58f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define PROPERTY_NFC_DISCOVERY_F          6
59f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define PROPERTY_NFC_DISCOVERY_15693      7
60f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define PROPERTY_NFC_DISCOVERY_NCFIP      8
61f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
62f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/* Error codes */
63f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define ERROR_BUFFER_TOO_SMALL            -12
64f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define ERROR_INSUFFICIENT_RESOURCES      -9
65f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
66b74200f40f9d4f536b8782974d444f1f9178076fJeff Hamilton/* Name strings for target types. These *must* match the values in TagTechnology.java */
67b74200f40f9d4f536b8782974d444f1f9178076fJeff Hamilton#define TARGET_TYPE_UNKNOWN               -1
68b74200f40f9d4f536b8782974d444f1f9178076fJeff Hamilton#define TARGET_TYPE_ISO14443_3A           1
69b74200f40f9d4f536b8782974d444f1f9178076fJeff Hamilton#define TARGET_TYPE_ISO14443_3B           2
70b74200f40f9d4f536b8782974d444f1f9178076fJeff Hamilton#define TARGET_TYPE_ISO14443_4            3
71b74200f40f9d4f536b8782974d444f1f9178076fJeff Hamilton#define TARGET_TYPE_ISO15693              21
72b74200f40f9d4f536b8782974d444f1f9178076fJeff Hamilton#define TARGET_TYPE_MIFARE_CLASSIC        200
73b74200f40f9d4f536b8782974d444f1f9178076fJeff Hamilton#define TARGET_TYPE_MIFARE_UL             202
74b74200f40f9d4f536b8782974d444f1f9178076fJeff Hamilton#define TARGET_TYPE_MIFARE_DESFIRE        203
75b74200f40f9d4f536b8782974d444f1f9178076fJeff Hamilton#define TARGET_TYPE_FELICA                11
76b74200f40f9d4f536b8782974d444f1f9178076fJeff Hamilton#define TARGET_TYPE_JEWEL                 101
77f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
78f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/* Utility macros for logging */
79f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#define GET_LEVEL(status) ((status)==NFCSTATUS_SUCCESS)?ANDROID_LOG_DEBUG:ANDROID_LOG_WARN
80ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton
81ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton#if 0
82ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton  #define LOG_CALLBACK(funcName, status)  LOG_PRI(GET_LEVEL(status), LOG_TAG, "Callback: %s() - status=0x%04x[%s]", funcName, status, nfc_jni_get_status_name(status));
83ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton  #define TRACE(...) LOG(LOG_DEBUG, "NdefMessage", __VA_ARGS__)
84ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton#else
85ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton  #define LOG_CALLBACK(...)
86ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton  #define TRACE(...)
87ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton#endif
88ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton
89f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
90c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellystruct nfc_jni_native_data
91f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{
92f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   /* Thread handle */
93f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   pthread_t thread;
94f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   int running;
95f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
96f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   /* Our VM */
97f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   JavaVM *vm;
98f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   int env_version;
99f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
100f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   /* Reference to the NFCManager instance */
101f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   jobject manager;
102f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
103f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   /* Cached objects */
104f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   jobject cached_NfcTag;
105f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   jobject cached_P2pDevice;
106f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
107f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   /* Target discovery configuration */
108f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   int discovery_modes_state[DISCOVERY_MODE_TABLE_SIZE];
109f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   phLibNfc_sADD_Cfg_t discovery_cfg;
110f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   phLibNfc_Registry_Info_t registry_info;
111f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
112f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   /* Secure Element selected */
113f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   int seId;
114f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
115f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   /* LLCP params */
116f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   int lto;
117f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   int miu;
118f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   int wks;
119f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   int opt;
120f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
121f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   /* Tag detected */
122f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   jobject tag;
123f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
124f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   /* Lib Status */
125f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   NFCSTATUS status;
126f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
127f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly};
128f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
129c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellytypedef struct nfc_jni_native_monitor
130f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{
131f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   /* Mutex protecting native library against reentrance */
132f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   pthread_mutex_t reentrance_mutex;
133f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
134f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   /* Mutex protecting native library against concurrency */
135f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   pthread_mutex_t concurrency_mutex;
136f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
137c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly} nfc_jni_native_monitor_t;
138f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
139f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/* TODO: treat errors and add traces */
140c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly#define REENTRANCE_LOCK()        pthread_mutex_lock(&nfc_jni_get_monitor()->reentrance_mutex)
141c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly#define REENTRANCE_UNLOCK()      pthread_mutex_unlock(&nfc_jni_get_monitor()->reentrance_mutex)
142c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly#define CONCURRENCY_LOCK()       pthread_mutex_lock(&nfc_jni_get_monitor()->concurrency_mutex)
143c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly#define CONCURRENCY_UNLOCK()     pthread_mutex_unlock(&nfc_jni_get_monitor()->concurrency_mutex)
144f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
145f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pellynamespace android {
146f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
147c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellyconst char* nfc_jni_get_status_name(NFCSTATUS status);
148c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellyint nfc_jni_cache_object(JNIEnv *e, const char *clsname,
149f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly   jobject *cached_obj);
150c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellystruct nfc_jni_native_data* nfc_jni_get_nat(JNIEnv *e, jobject o);
151c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellystruct nfc_jni_native_data* nfc_jni_get_nat_ext(JNIEnv *e);
152c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellynfc_jni_native_monitor_t* nfc_jni_init_monitor(void);
153c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellynfc_jni_native_monitor_t* nfc_jni_get_monitor(void);
154f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
15513d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pelly/* P2P */
156c2fdb614879c601b5162d5d93d705b05c7b1e072Nick PellyphLibNfc_Handle nfc_jni_get_p2p_device_handle(JNIEnv *e, jobject o);
157c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellyjshort nfc_jni_get_p2p_device_mode(JNIEnv *e, jobject o);
158f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
159f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/* TAG */
160c2fdb614879c601b5162d5d93d705b05c7b1e072Nick PellyphLibNfc_Handle nfc_jni_get_nfc_tag_handle(JNIEnv *e, jobject o);
161c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellyjstring nfc_jni_get_nfc_tag_type(JNIEnv *e, jobject o);
162f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
163f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/* LLCP */
164c2fdb614879c601b5162d5d93d705b05c7b1e072Nick PellyphLibNfc_Handle nfc_jni_get_nfc_socket_handle(JNIEnv *e, jobject o);
165f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
16613d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pellyint register_com_android_nfc_NativeNfcManager(JNIEnv *e);
16713d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pellyint register_com_android_nfc_NativeNfcTag(JNIEnv *e);
16813d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pellyint register_com_android_nfc_NativeP2pDevice(JNIEnv *e);
16913d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pellyint register_com_android_nfc_NativeLlcpConnectionlessSocket(JNIEnv *e);
17013d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pellyint register_com_android_nfc_NativeLlcpServiceSocket(JNIEnv *e);
17113d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pellyint register_com_android_nfc_NativeLlcpSocket(JNIEnv *e);
172f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
173f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} // namespace android
174f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly
175f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#endif
176