diff options
author | Martijn Coenen <maco@google.com> | 2016-09-29 07:41:33 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2016-09-29 07:41:34 +0000 |
commit | f97ec6035305315cbaabaf1382e4cd20057e79c0 (patch) | |
tree | ff17fa1a427f423075687c91e58f73ebeb6ddec5 | |
parent | e1da65f1575fc3536b54d985e3350e2b956ee15a (diff) | |
parent | e9e48e5c716096c2303b9b3f3b9ff44fd37caeec (diff) | |
download | libnfc-nci-f97ec6035305315cbaabaf1382e4cd20057e79c0.tar.gz |
Merge "Switch to using the NFC HIDL HAL."
-rw-r--r-- | Android.mk | 11 | ||||
-rw-r--r-- | halimpl/bcm2079x/adaptation/HalAdaptation.cpp | 2 | ||||
-rw-r--r-- | halimpl/bcm2079x/hal/hal/nfc_hal_api.c | 2 | ||||
-rw-r--r-- | halimpl/pn54x/Android.mk | 19 | ||||
-rw-r--r-- | src/adaptation/NfcAdaptation.cpp | 122 | ||||
-rw-r--r-- | src/hal/include/nfc_hal_api.h | 4 | ||||
-rw-r--r-- | src/include/NfcAdaptation.h | 15 | ||||
-rw-r--r-- | src/nfc/nfc/nfc_ncif.c | 2 |
8 files changed, 108 insertions, 69 deletions
@@ -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(), ©.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 { |