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