summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartijn Coenen <maco@google.com>2016-09-29 07:41:33 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2016-09-29 07:41:34 +0000
commitf97ec6035305315cbaabaf1382e4cd20057e79c0 (patch)
treeff17fa1a427f423075687c91e58f73ebeb6ddec5
parente1da65f1575fc3536b54d985e3350e2b956ee15a (diff)
parente9e48e5c716096c2303b9b3f3b9ff44fd37caeec (diff)
downloadlibnfc-nci-f97ec6035305315cbaabaf1382e4cd20057e79c0.tar.gz
Merge "Switch to using the NFC HIDL HAL."
-rw-r--r--Android.mk11
-rw-r--r--halimpl/bcm2079x/adaptation/HalAdaptation.cpp2
-rw-r--r--halimpl/bcm2079x/hal/hal/nfc_hal_api.c2
-rw-r--r--halimpl/pn54x/Android.mk19
-rw-r--r--src/adaptation/NfcAdaptation.cpp122
-rw-r--r--src/hal/include/nfc_hal_api.h4
-rw-r--r--src/include/NfcAdaptation.h15
-rw-r--r--src/nfc/nfc/nfc_ncif.c2
8 files changed, 108 insertions, 69 deletions
diff --git a/Android.mk b/Android.mk
index 2478427..7d7fcb4 100644
--- a/Android.mk
+++ b/Android.mk
@@ -28,7 +28,11 @@ LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/$(NFC)/int \
$(LOCAL_PATH)/src/hal/include \
$(LOCAL_PATH)/src/hal/int \
- $(LOCAL_PATH)/$(HALIMPL)/include
+ $(LOCAL_PATH)/$(HALIMPL)/include \
+ system/libhwbinder/include
+
+# Treble configuration
+LOCAL_SHARED_LIBRARIES += libhidl libhwbinder libutils android.hardware.nfc@1.0
LOCAL_SRC_FILES := \
$(call all-c-files-under, $(NFA)/ce $(NFA)/dm $(NFA)/ee) \
$(call all-c-files-under, $(NFA)/hci $(NFA)/int $(NFA)/p2p $(NFA)/rw $(NFA)/sys) \
@@ -40,7 +44,6 @@ LOCAL_SRC_FILES := \
src/nfca_version.c
include $(BUILD_SHARED_LIBRARY)
-
######################################
# Build shared library system/lib/hw/nfc_nci.*.so for Hardware Abstraction Layer.
# Android's generic HAL (libhardware.so) dynamically loads this shared library.
@@ -51,8 +54,8 @@ LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_SRC_FILES := $(call all-c-files-under, $(HALIMPL)) \
$(call all-cpp-files-under, $(HALIMPL)) \
src/adaptation/CrcChecksum.cpp \
- src//nfca_version.c
-LOCAL_SHARED_LIBRARIES := liblog libcutils libhardware_legacy
+ src/nfca_version.c
+LOCAL_SHARED_LIBRARIES := liblog libcutils libhardware_legacy libhwbinder libbase libcutils libutils
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/$(HALIMPL)/include \
$(LOCAL_PATH)/$(HALIMPL)/gki/ulinux \
diff --git a/halimpl/bcm2079x/adaptation/HalAdaptation.cpp b/halimpl/bcm2079x/adaptation/HalAdaptation.cpp
index c39bd1e..92e86b8 100644
--- a/halimpl/bcm2079x/adaptation/HalAdaptation.cpp
+++ b/halimpl/bcm2079x/adaptation/HalAdaptation.cpp
@@ -336,7 +336,7 @@ int HaiCoreInitialized (const bcm2079x_dev_t* device, uint8_t* coreInitResponseP
int retval = EACCES;
SyncEventGuard guard (gPostInitCompletedEvent);
- HAL_NfcCoreInitialized (coreInitResponseParams);
+ HAL_NfcCoreInitialized (0, coreInitResponseParams);
gPostInitCompletedEvent.wait ();
retval = 0;
ALOGD ("%s: exit %d", __FUNCTION__, retval);
diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_api.c b/halimpl/bcm2079x/hal/hal/nfc_hal_api.c
index e47fabf..a2faa94 100644
--- a/halimpl/bcm2079x/hal/hal/nfc_hal_api.c
+++ b/halimpl/bcm2079x/hal/hal/nfc_hal_api.c
@@ -151,7 +151,7 @@ void HAL_NfcClose (void)
** Returns void
**
*******************************************************************************/
-void HAL_NfcCoreInitialized (UINT8 *p_core_init_rsp_params)
+void HAL_NfcCoreInitialized (UINT16 data_len, UINT8 *p_core_init_rsp_params)
{
NFC_HDR *p_msg;
UINT16 size;
diff --git a/halimpl/pn54x/Android.mk b/halimpl/pn54x/Android.mk
index 8acf98f..051fffa 100644
--- a/halimpl/pn54x/Android.mk
+++ b/halimpl/pn54x/Android.mk
@@ -41,11 +41,22 @@ D_CFLAGS += -DNFC_NXP_CHIP_TYPE=PN551
else
D_CFLAGS += -DNFC_NXP_CHIP_TYPE=PN551
endif
+
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := nfc_nci.$(TARGET_DEVICE)
LOCAL_MODULE_RELATIVE_PATH := hw
-LOCAL_SRC_FILES := $(call all-subdir-c-files) $(call all-subdir-cpp-files)
+LOCAL_SRC_FILES := \
+ $(call all-c-files-under, common) \
+ $(call all-c-files-under, dnld) \
+ $(call all-c-files-under, hal) \
+ $(call all-c-files-under, log) \
+ $(call all-c-files-under, self-test) \
+ $(call all-c-files-under, tml) \
+ $(call all-c-files-under, utils) \
+ $(call all-cpp-files-under, utils) \
+ nfc_nci.c
+
LOCAL_SHARED_LIBRARIES := liblog libcutils libhardware_legacy libdl libhardware
LOCAL_CFLAGS := $(D_CFLAGS)
@@ -57,11 +68,15 @@ LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/hal \
$(LOCAL_PATH)/log \
$(LOCAL_PATH)/tml \
- $(LOCAL_PATH)/self-test
+ $(LOCAL_PATH)/self-test \
LOCAL_CFLAGS += -DANDROID \
-DNXP_UICC_ENABLE -DNXP_HW_SELF_TEST
LOCAL_CFLAGS += -DNFC_NXP_HFO_SETTINGS=FALSE
#LOCAL_CFLAGS += -DFELICA_CLT_ENABLE
+
+#
+# nfc_nci.$(TARGET_DEVICE)
+#
include $(BUILD_SHARED_LIBRARY)
diff --git a/src/adaptation/NfcAdaptation.cpp b/src/adaptation/NfcAdaptation.cpp
index 371e31b..d13a151 100644
--- a/src/adaptation/NfcAdaptation.cpp
+++ b/src/adaptation/NfcAdaptation.cpp
@@ -15,6 +15,10 @@
* limitations under the License.
*
******************************************************************************/
+#include <android/hardware/nfc/1.0/INfc.h>
+#include <android/hardware/nfc/1.0/INfcClientCallback.h>
+#include <hwbinder/ProcessState.h>
+#include <pthread.h>
#include "OverrideLog.h"
#include "NfcAdaptation.h"
extern "C"
@@ -30,6 +34,17 @@ extern "C"
#undef LOG_TAG
#define LOG_TAG "NfcAdaptation"
+using android::OK;
+using android::sp;
+using android::status_t;
+
+using android::hardware::ProcessState;
+using android::hardware::Return;
+using android::hardware::Void;
+using android::hardware::nfc::V1_0::INfc;
+using android::hardware::nfc::V1_0::INfcClientCallback;
+using android::hardware::hidl_vec;
+
extern "C" void GKI_shutdown();
extern void resetConfig();
extern "C" void verify_stack_non_volatile_store ();
@@ -37,11 +52,12 @@ extern "C" void delete_stack_non_volatile_store (BOOLEAN forceDelete);
NfcAdaptation* NfcAdaptation::mpInstance = NULL;
ThreadMutex NfcAdaptation::sLock;
-nfc_nci_device_t* NfcAdaptation::mHalDeviceContext = NULL;
tHAL_NFC_CBACK* NfcAdaptation::mHalCallback = NULL;
tHAL_NFC_DATA_CBACK* NfcAdaptation::mHalDataCallback = NULL;
ThreadCondVar NfcAdaptation::mHalOpenCompletedEvent;
ThreadCondVar NfcAdaptation::mHalCloseCompletedEvent;
+sp<INfc> NfcAdaptation::mHal;
+INfcClientCallback* NfcAdaptation::mCallback;
UINT32 ScrProtocolTraceFlag = SCR_PROTO_TRACE_ALL; //0x017F00;
UINT8 appl_trace_level = 0xff;
@@ -60,6 +76,29 @@ static tNFA_HCI_CFG jni_nfa_hci_cfg;
extern tNFA_HCI_CFG *p_nfa_hci_cfg;
extern BOOLEAN nfa_poll_bail_out_mode;
+class NfcClientCallback : public INfcClientCallback {
+ public:
+ NfcClientCallback(tHAL_NFC_CBACK* eventCallback, tHAL_NFC_DATA_CBACK dataCallback) {
+ mEventCallback = eventCallback;
+ mDataCallback = dataCallback;
+ };
+ virtual ~NfcClientCallback() = default;
+ Return<void> sendEvent(
+ ::android::hardware::nfc::V1_0::nfc_event_t event,
+ ::android::hardware::nfc::V1_0::nfc_status_t event_status) override {
+ mEventCallback ((UINT8)event, (tHAL_NFC_STATUS) event_status);
+ return Void();
+ };
+ Return<void> sendData(const ::android::hardware::nfc::V1_0::nfc_data_t &data ) override {
+ ::android::hardware::nfc::V1_0::nfc_data_t copy = data;
+ mDataCallback(copy.data.size(), &copy.data[0]);
+ return Void();
+ };
+ private:
+ tHAL_NFC_CBACK* mEventCallback;
+ tHAL_NFC_DATA_CBACK* mDataCallback;
+};
+
/*******************************************************************************
**
** Function: NfcAdaptation::NfcAdaptation()
@@ -188,7 +227,6 @@ void NfcAdaptation::Initialize ()
mCondVar.wait();
}
- mHalDeviceContext = NULL;
mHalCallback = NULL;
memset (&mHalEntryFuncs, 0, sizeof(mHalEntryFuncs));
InitializeHalDeviceContext ();
@@ -214,9 +252,7 @@ void NfcAdaptation::Finalize()
resetConfig();
- nfc_nci_close(mHalDeviceContext); //close the HAL's device context
- mHalDeviceContext = NULL;
- mHalCallback = NULL;
+ mCallback = NULL;
memset (&mHalEntryFuncs, 0, sizeof(mHalEntryFuncs));
ALOGD ("%s: exit", func);
@@ -316,7 +352,6 @@ void NfcAdaptation::InitializeHalDeviceContext ()
ALOGE("No HAL module specified in config, falling back to BCM2079x");
strlcpy (nci_hal_module, "nfc_nci.bcm2079x", sizeof(nci_hal_module));
}
- const hw_module_t* hw_module = NULL;
mHalEntryFuncs.initialize = HalInitialize;
mHalEntryFuncs.terminate = HalTerminate;
@@ -328,16 +363,18 @@ void NfcAdaptation::InitializeHalDeviceContext ()
mHalEntryFuncs.control_granted = HalControlGranted;
mHalEntryFuncs.power_cycle = HalPowerCycle;
mHalEntryFuncs.get_max_ee = HalGetMaxNfcee;
-
- ret = hw_get_module (nci_hal_module, &hw_module);
- if (ret == 0)
- {
- ret = nfc_nci_open (hw_module, &mHalDeviceContext);
- if (ret != 0)
- ALOGE ("%s: nfc_nci_open fail", func);
+ ALOGI("%s: INfc::getService(%s)", func, nci_hal_module);
+ mHal = INfc::getService(nci_hal_module);
+ LOG_FATAL_IF(mHal == nullptr, "Failed to retrieve the NFC HAL!");
+ ALOGI("%s: INfc::getService(%s) returned %p (%s)", func, nci_hal_module,
+ mHal.get(), (mHal->isRemote() ? "remote" : "local"));
+ // TODO(b/31748996) A client must be completely unaware of the
+ // implementation details of its HAL: whether the HAL is passthrough, or
+ // whether it uses HWbinder or some other transport.
+ if (mHal->isRemote()) {
+ ProcessState::self()->setThreadPoolMaxThreadCount(1);
+ ProcessState::self()->startThreadPool();
}
- else
- ALOGE ("%s: fail hw_get_module %s", func, nci_hal_module);
ALOGD ("%s: exit", func);
}
@@ -386,12 +423,8 @@ void NfcAdaptation::HalOpen (tHAL_NFC_CBACK *p_hal_cback, tHAL_NFC_DATA_CBACK* p
{
const char* func = "NfcAdaptation::HalOpen";
ALOGD ("%s", func);
- if (mHalDeviceContext)
- {
- mHalCallback = p_hal_cback;
- mHalDataCallback = p_data_cback;
- mHalDeviceContext->open (mHalDeviceContext, HalDeviceContextCallback, HalDeviceContextDataCallback);
- }
+ mCallback = new NfcClientCallback(p_hal_cback, p_data_cback);
+ mHal->open(mCallback);
}
/*******************************************************************************
@@ -407,10 +440,7 @@ void NfcAdaptation::HalClose ()
{
const char* func = "NfcAdaptation::HalClose";
ALOGD ("%s", func);
- if (mHalDeviceContext)
- {
- mHalDeviceContext->close (mHalDeviceContext);
- }
+ mHal->close();
}
/*******************************************************************************
@@ -462,10 +492,9 @@ void NfcAdaptation::HalWrite (UINT16 data_len, UINT8* p_data)
{
const char* func = "NfcAdaptation::HalWrite";
ALOGD ("%s", func);
- if (mHalDeviceContext)
- {
- mHalDeviceContext->write (mHalDeviceContext, data_len, p_data);
- }
+ ::android::hardware::nfc::V1_0::nfc_data_t data;
+ data.data.setToExternal(p_data, data_len);
+ mHal->write(data);
}
/*******************************************************************************
@@ -477,14 +506,14 @@ void NfcAdaptation::HalWrite (UINT16 data_len, UINT8* p_data)
** Returns: None.
**
*******************************************************************************/
-void NfcAdaptation::HalCoreInitialized (UINT8* p_core_init_rsp_params)
+void NfcAdaptation::HalCoreInitialized (UINT16 data_len, UINT8* p_core_init_rsp_params)
{
const char* func = "NfcAdaptation::HalCoreInitialized";
ALOGD ("%s", func);
- if (mHalDeviceContext)
- {
- mHalDeviceContext->core_initialized (mHalDeviceContext, p_core_init_rsp_params);
- }
+ hidl_vec<uint8_t> data;
+ data.setToExternal(p_core_init_rsp_params, data_len);
+
+ mHal->core_initialized(data);
}
/*******************************************************************************
@@ -505,11 +534,7 @@ BOOLEAN NfcAdaptation::HalPrediscover ()
const char* func = "NfcAdaptation::HalPrediscover";
ALOGD ("%s", func);
BOOLEAN retval = FALSE;
-
- if (mHalDeviceContext)
- {
- retval = mHalDeviceContext->pre_discover (mHalDeviceContext);
- }
+ mHal->pre_discover();
return retval;
}
@@ -530,10 +555,7 @@ void NfcAdaptation::HalControlGranted ()
{
const char* func = "NfcAdaptation::HalControlGranted";
ALOGD ("%s", func);
- if (mHalDeviceContext)
- {
- mHalDeviceContext->control_granted (mHalDeviceContext);
- }
+ mHal->control_granted();
}
/*******************************************************************************
@@ -549,10 +571,7 @@ void NfcAdaptation::HalPowerCycle ()
{
const char* func = "NfcAdaptation::HalPowerCycle";
ALOGD ("%s", func);
- if (mHalDeviceContext)
- {
- mHalDeviceContext->power_cycle (mHalDeviceContext);
- }
+ mHal->power_cycle();
}
/*******************************************************************************
@@ -569,15 +588,8 @@ UINT8 NfcAdaptation::HalGetMaxNfcee()
const char* func = "NfcAdaptation::HalPowerCycle";
UINT8 maxNfcee = 0;
ALOGD ("%s", func);
- if (mHalDeviceContext)
- {
- // TODO maco call into HAL when we figure out binary compatibility.
- return nfa_ee_max_ee_cfg;
-
- //mHalDeviceContext->get_max_ee (mHalDeviceContext, &maxNfcee);
- }
- return maxNfcee;
+ return nfa_ee_max_ee_cfg;
}
diff --git a/src/hal/include/nfc_hal_api.h b/src/hal/include/nfc_hal_api.h
index ebd385d..de26f0c 100644
--- a/src/hal/include/nfc_hal_api.h
+++ b/src/hal/include/nfc_hal_api.h
@@ -84,7 +84,7 @@ typedef void (tHAL_API_INITIALIZE) (void);
typedef void (tHAL_API_TERMINATE) (void);
typedef void (tHAL_API_OPEN) (tHAL_NFC_CBACK *p_hal_cback, tHAL_NFC_DATA_CBACK *p_data_cback);
typedef void (tHAL_API_CLOSE) (void);
-typedef void (tHAL_API_CORE_INITIALIZED) (UINT8 *p_core_init_rsp_params);
+typedef void (tHAL_API_CORE_INITIALIZED) (UINT16 data_len, UINT8 *p_core_init_rsp_params);
typedef void (tHAL_API_WRITE) (UINT16 data_len, UINT8 *p_data);
typedef BOOLEAN (tHAL_API_PREDISCOVER) (void);
typedef void (tHAL_API_CONTROL_GRANTED) (void);
@@ -205,7 +205,7 @@ EXPORT_HAL_API void HAL_NfcClose (void);
** Returns void
**
*******************************************************************************/
-EXPORT_HAL_API void HAL_NfcCoreInitialized (UINT8 *p_core_init_rsp_params);
+EXPORT_HAL_API void HAL_NfcCoreInitialized (UINT16 data_len, UINT8 *p_core_init_rsp_params);
/*******************************************************************************
**
diff --git a/src/include/NfcAdaptation.h b/src/include/NfcAdaptation.h
index bd9afcc..b1dd2fc 100644
--- a/src/include/NfcAdaptation.h
+++ b/src/include/NfcAdaptation.h
@@ -22,8 +22,16 @@ typedef unsigned long UINT32;
#endif
#include "nfc_target.h"
#include "nfc_hal_api.h"
-#include <hardware/nfc.h>
+#include <utils/RefBase.h>
+
+namespace android {
+namespace hardware {
+namespace nfc {
+namespace V1_0 {
+ struct INfc;
+ struct INfcClientCallback;
+} } } }
class ThreadMutex
{
@@ -79,6 +87,8 @@ private:
ThreadCondVar mCondVar;
tHAL_NFC_ENTRY mHalEntryFuncs; // function pointers for HAL entry points
static nfc_nci_device_t* mHalDeviceContext;
+ static android::sp<android::hardware::nfc::V1_0::INfc> mHal;
+ static android::hardware::nfc::V1_0::INfcClientCallback* mCallback;
static tHAL_NFC_CBACK* mHalCallback;
static tHAL_NFC_DATA_CBACK* mHalDataCallback;
static ThreadCondVar mHalOpenCompletedEvent;
@@ -94,7 +104,7 @@ private:
static void HalTerminate ();
static void HalOpen (tHAL_NFC_CBACK* p_hal_cback, tHAL_NFC_DATA_CBACK* p_data_cback);
static void HalClose ();
- static void HalCoreInitialized (UINT8* p_core_init_rsp_params);
+ static void HalCoreInitialized (UINT16 data_len, UINT8* p_core_init_rsp_params);
static void HalWrite (UINT16 data_len, UINT8* p_data);
static BOOLEAN HalPrediscover ();
static void HalControlGranted ();
@@ -103,4 +113,3 @@ private:
static void HalDownloadFirmwareCallback (nfc_event_t event, nfc_status_t event_status);
static void HalDownloadFirmwareDataCallback (uint16_t data_len, uint8_t* p_data);
};
-
diff --git a/src/nfc/nfc/nfc_ncif.c b/src/nfc/nfc/nfc_ncif.c
index 99ad256..06c12bb 100644
--- a/src/nfc/nfc/nfc_ncif.c
+++ b/src/nfc/nfc/nfc_ncif.c
@@ -1335,7 +1335,7 @@ void nfc_ncif_proc_init_rsp (BT_HDR *p_msg)
nfc_set_state (NFC_STATE_W4_POST_INIT_CPLT);
nfc_cb.p_nci_init_rsp = p_msg;
- nfc_cb.p_hal->core_initialized (p);
+ nfc_cb.p_hal->core_initialized (p_msg->len - p_msg->offset, p);
}
else
{