diff options
Diffstat (limited to 'nxp/jni/com_android_nfc.h')
-rw-r--r-- | nxp/jni/com_android_nfc.h | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/nxp/jni/com_android_nfc.h b/nxp/jni/com_android_nfc.h new file mode 100644 index 00000000..b876dadf --- /dev/null +++ b/nxp/jni/com_android_nfc.h @@ -0,0 +1,261 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __COM_ANDROID_NFC_JNI_H__ +#define __COM_ANDROID_NFC_JNI_H__ + +#define LOG_TAG "NFCJNI" + +#include <JNIHelp.h> +#include <jni.h> + +#include <pthread.h> +#include <sys/queue.h> + +extern "C" { +#include <phNfcStatus.h> +#include <phNfcTypes.h> +#include <phNfcIoctlCode.h> +#include <phLibNfc.h> +#include <phDal4Nfc_messageQueueLib.h> +#include <phFriNfc_NdefMap.h> +#include <cutils/log.h> +#include <com_android_nfc_list.h> +#include <semaphore.h> + +} +#include <cutils/properties.h> // for property_get + + +/* Discovery modes -- keep in sync with NFCManager.DISCOVERY_MODE_* */ +#define DISCOVERY_MODE_TAG_READER 0 +#define DISCOVERY_MODE_NFCIP1 1 +#define DISCOVERY_MODE_CARD_EMULATION 2 + +#define DISCOVERY_MODE_TABLE_SIZE 3 + +#define DISCOVERY_MODE_DISABLED 0 +#define DISCOVERY_MODE_ENABLED 1 + +#define MODE_P2P_TARGET 0 +#define MODE_P2P_INITIATOR 1 + +/* Properties values */ +#define PROPERTY_LLCP_LTO 0 +#define PROPERTY_LLCP_MIU 1 +#define PROPERTY_LLCP_WKS 2 +#define PROPERTY_LLCP_OPT 3 +#define PROPERTY_NFC_DISCOVERY_A 4 +#define PROPERTY_NFC_DISCOVERY_B 5 +#define PROPERTY_NFC_DISCOVERY_F 6 +#define PROPERTY_NFC_DISCOVERY_15693 7 +#define PROPERTY_NFC_DISCOVERY_NCFIP 8 + +/* Error codes */ +#define ERROR_BUFFER_TOO_SMALL -12 +#define ERROR_INSUFFICIENT_RESOURCES -9 + +/* Pre-defined card read/write state values. These must match the values in + * Ndef.java in the framework. + */ + +#define NDEF_UNKNOWN_TYPE -1 +#define NDEF_TYPE1_TAG 1 +#define NDEF_TYPE2_TAG 2 +#define NDEF_TYPE3_TAG 3 +#define NDEF_TYPE4_TAG 4 +#define NDEF_MIFARE_CLASSIC_TAG 101 +#define NDEF_ICODE_SLI_TAG 102 + +/* Pre-defined tag type values. These must match the values in + * Ndef.java in the framework. + */ + +#define NDEF_MODE_READ_ONLY 1 +#define NDEF_MODE_READ_WRITE 2 +#define NDEF_MODE_UNKNOWN 3 + + +/* Name strings for target types. These *must* match the values in TagTechnology.java */ +#define TARGET_TYPE_UNKNOWN -1 +#define TARGET_TYPE_ISO14443_3A 1 +#define TARGET_TYPE_ISO14443_3B 2 +#define TARGET_TYPE_ISO14443_4 3 +#define TARGET_TYPE_FELICA 4 +#define TARGET_TYPE_ISO15693 5 +#define TARGET_TYPE_NDEF 6 +#define TARGET_TYPE_NDEF_FORMATABLE 7 +#define TARGET_TYPE_MIFARE_CLASSIC 8 +#define TARGET_TYPE_MIFARE_UL 9 + +#define SMX_SECURE_ELEMENT_ID 11259375 + +/* Maximum byte length of an AID. */ +#define AID_MAXLEN 16 + +/* Utility macros for logging */ +#define GET_LEVEL(status) ((status)==NFCSTATUS_SUCCESS)?ANDROID_LOG_DEBUG:ANDROID_LOG_WARN + +#if 0 + #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)); + #define TRACE(...) ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__) + #define TRACE_ENABLED 1 +#else + #define LOG_CALLBACK(...) + #define TRACE(...) + #define TRACE_ENABLED 0 +#endif + +struct nfc_jni_native_data +{ + /* Thread handle */ + pthread_t thread; + int running; + + /* Our VM */ + JavaVM *vm; + int env_version; + + /* Reference to the NFCManager instance */ + jobject manager; + + /* Cached objects */ + jobject cached_NfcTag; + jobject cached_P2pDevice; + + /* Target discovery configuration */ + int discovery_modes_state[DISCOVERY_MODE_TABLE_SIZE]; + phLibNfc_sADD_Cfg_t discovery_cfg; + phLibNfc_Registry_Info_t registry_info; + + /* Secure Element selected */ + int seId; + + /* LLCP params */ + int lto; + int miu; + int wks; + int opt; + + /* Tag detected */ + jobject tag; + + /* Lib Status */ + NFCSTATUS status; + + /* p2p modes */ + int p2p_initiator_modes; + int p2p_target_modes; + +}; + +typedef struct nfc_jni_native_monitor +{ + /* Mutex protecting native library against reentrance */ + pthread_mutex_t reentrance_mutex; + + /* Mutex protecting native library against concurrency */ + pthread_mutex_t concurrency_mutex; + + /* List used to track pending semaphores waiting for callback */ + struct listHead sem_list; + + /* List used to track incoming socket requests (and associated sync variables) */ + LIST_HEAD(, nfc_jni_listen_data) incoming_socket_head; + pthread_mutex_t incoming_socket_mutex; + pthread_cond_t incoming_socket_cond; + +} nfc_jni_native_monitor_t; + +typedef struct nfc_jni_callback_data +{ + /* Semaphore used to wait for callback */ + sem_t sem; + + /* Used to store the status sent by the callback */ + NFCSTATUS status; + + /* Used to provide a local context to the callback */ + void* pContext; + +} nfc_jni_callback_data_t; + +typedef struct nfc_jni_listen_data +{ + /* LLCP server socket receiving the connection request */ + phLibNfc_Handle pServerSocket; + + /* LLCP socket created from the connection request */ + phLibNfc_Handle pIncomingSocket; + + /* List entries */ + LIST_ENTRY(nfc_jni_listen_data) entries; + +} nfc_jni_listen_data_t; + +/* TODO: treat errors and add traces */ +#define REENTRANCE_LOCK() pthread_mutex_lock(&nfc_jni_get_monitor()->reentrance_mutex) +#define REENTRANCE_UNLOCK() pthread_mutex_unlock(&nfc_jni_get_monitor()->reentrance_mutex) +#define CONCURRENCY_LOCK() pthread_mutex_lock(&nfc_jni_get_monitor()->concurrency_mutex) +#define CONCURRENCY_UNLOCK() pthread_mutex_unlock(&nfc_jni_get_monitor()->concurrency_mutex) + +namespace android { + +extern JavaVM *vm; + +JNIEnv *nfc_get_env(); + +bool nfc_cb_data_init(nfc_jni_callback_data* pCallbackData, void* pContext); +void nfc_cb_data_deinit(nfc_jni_callback_data* pCallbackData); +void nfc_cb_data_releaseAll(); + +const char* nfc_jni_get_status_name(NFCSTATUS status); +int nfc_jni_cache_object(JNIEnv *e, const char *clsname, + jobject *cached_obj); +struct nfc_jni_native_data* nfc_jni_get_nat(JNIEnv *e, jobject o); +struct nfc_jni_native_data* nfc_jni_get_nat_ext(JNIEnv *e); +nfc_jni_native_monitor_t* nfc_jni_init_monitor(void); +nfc_jni_native_monitor_t* nfc_jni_get_monitor(void); + +int get_technology_type(phNfc_eRemDevType_t type, uint8_t sak); +void nfc_jni_get_technology_tree(JNIEnv* e, phLibNfc_RemoteDevList_t* devList, + uint8_t count, jintArray* techList, jintArray* handleList, + jintArray* typeList); + +/* P2P */ +phLibNfc_Handle nfc_jni_get_p2p_device_handle(JNIEnv *e, jobject o); +jshort nfc_jni_get_p2p_device_mode(JNIEnv *e, jobject o); + +/* TAG */ +jint nfc_jni_get_connected_technology(JNIEnv *e, jobject o); +jint nfc_jni_get_connected_technology_libnfc_type(JNIEnv *e, jobject o); +phLibNfc_Handle nfc_jni_get_connected_handle(JNIEnv *e, jobject o); +jintArray nfc_jni_get_nfc_tag_type(JNIEnv *e, jobject o); + +/* LLCP */ +phLibNfc_Handle nfc_jni_get_nfc_socket_handle(JNIEnv *e, jobject o); + +int register_com_android_nfc_NativeNfcManager(JNIEnv *e); +int register_com_android_nfc_NativeNfcTag(JNIEnv *e); +int register_com_android_nfc_NativeP2pDevice(JNIEnv *e); +int register_com_android_nfc_NativeLlcpConnectionlessSocket(JNIEnv *e); +int register_com_android_nfc_NativeLlcpServiceSocket(JNIEnv *e); +int register_com_android_nfc_NativeLlcpSocket(JNIEnv *e); +int register_com_android_nfc_NativeNfcSecureElement(JNIEnv *e); + +} // namespace android + +#endif |