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