Implementation of NFC HAL 1.2
Change-Id: I56996aa173afb1760c01fc3e6a34b27163f114bd
diff --git a/1.2/Nfc.cpp b/1.2/Nfc.cpp
new file mode 100644
index 0000000..c197255
--- /dev/null
+++ b/1.2/Nfc.cpp
@@ -0,0 +1,157 @@
+/******************************************************************************
+ *
+ * Copyright 2018 NXP
+ * Copyright 2019 ST Microelectronics S.A.
+ *
+ * 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.
+ *
+ ******************************************************************************/
+
+#define LOG_TAG "android.hardware.nfc@1.2-impl"
+#include <log/log.h>
+#include "Nfc.h"
+#include "StNfc_hal_api.h"
+
+
+
+#define CHK_STATUS(x) ((x) == NFCSTATUS_SUCCESS) \
+ ? (V1_0::NfcStatus::OK) : (V1_0::NfcStatus::FAILED)
+
+bool nfc_debug_enabled = true;
+
+namespace android {
+namespace hardware {
+namespace nfc {
+namespace V1_2 {
+namespace implementation {
+
+sp<V1_1::INfcClientCallback> Nfc::mCallbackV1_1 = nullptr;
+sp<V1_0::INfcClientCallback> Nfc::mCallbackV1_0 = nullptr;
+
+Return<V1_0::NfcStatus> Nfc::open_1_1(
+ const sp<V1_1::INfcClientCallback>& clientCallback) {
+ if (clientCallback == nullptr) {
+ ALOGD_IF(nfc_debug_enabled,"Nfc::open null callback");
+ return V1_0::NfcStatus::FAILED;
+ } else {
+ mCallbackV1_1 = clientCallback;
+ mCallbackV1_1->linkToDeath(this, 0 /*cookie*/);
+ }
+ return open(clientCallback);
+}
+
+// Methods from ::android::hardware::nfc::V1_0::INfc follow.
+Return<V1_0::NfcStatus> Nfc::open(
+ const sp<V1_0::INfcClientCallback>& clientCallback) {
+ ALOGD_IF(nfc_debug_enabled, "Nfc::open Enter");
+ if (clientCallback == nullptr) {
+ ALOGD_IF(nfc_debug_enabled, "Nfc::open null callback");
+ return V1_0::NfcStatus::FAILED;
+ } else {
+ mCallbackV1_0 = clientCallback;
+ mCallbackV1_0->linkToDeath(this, 0 /*cookie*/);
+ }
+
+ int ret = StNfc_hal_open(eventCallback, dataCallback);
+ ALOGD_IF(nfc_debug_enabled, "Nfc::open Exit");
+ return ret == 0 ? V1_0::NfcStatus::OK : V1_0::NfcStatus::FAILED;
+}
+
+Return<uint32_t> Nfc::write(const hidl_vec<uint8_t>& data) {
+ hidl_vec<uint8_t> copy = data;
+
+ return StNfc_hal_write(data.size(), &data[0]);
+}
+
+Return<V1_0::NfcStatus> Nfc::coreInitialized(const hidl_vec<uint8_t>& data) {
+ hidl_vec<uint8_t> copy = data;
+
+ int ret = StNfc_hal_core_initialized(©[0]);
+ return ret == 0 ? V1_0::NfcStatus::OK : V1_0::NfcStatus::FAILED;
+}
+
+Return<V1_0::NfcStatus> Nfc::prediscover() {
+ return StNfc_hal_pre_discover() ? V1_0::NfcStatus::FAILED
+ : V1_0::NfcStatus::OK;
+}
+
+Return<V1_0::NfcStatus> Nfc::close() {
+ if (mCallbackV1_1 == nullptr && mCallbackV1_0 == nullptr) {
+ return V1_0::NfcStatus::FAILED;
+ }
+ int ret = StNfc_hal_close(NFC_MODE_OFF);
+
+ if (mCallbackV1_1 != nullptr) {
+ mCallbackV1_1->unlinkToDeath(this);
+ mCallbackV1_1 = nullptr;
+ }
+ if (mCallbackV1_0 != nullptr) {
+ mCallbackV1_0->unlinkToDeath(this);
+ mCallbackV1_0 = nullptr;
+ }
+ return ret == 0 ? V1_0::NfcStatus::OK : V1_0::NfcStatus::FAILED;
+}
+
+Return<V1_0::NfcStatus> Nfc::controlGranted() {
+ return StNfc_hal_control_granted() ? V1_0::NfcStatus::FAILED
+ : V1_0::NfcStatus::OK;
+}
+
+Return<V1_0::NfcStatus> Nfc::powerCycle() {
+ return StNfc_hal_power_cycle() ? V1_0::NfcStatus::FAILED
+ : V1_0::NfcStatus::OK;
+}
+
+// Methods from ::android::hardware::nfc::V1_1::INfc follow.
+Return<void> Nfc::factoryReset() {
+ StNfc_hal_factoryReset();
+ return Void();
+}
+
+Return<V1_0::NfcStatus> Nfc::closeForPowerOffCase() {
+ if (mCallbackV1_1 == nullptr && mCallbackV1_0 == nullptr) {
+ return V1_0::NfcStatus::FAILED;
+ }
+
+ int ret = StNfc_hal_closeForPowerOffCase();
+
+ if (mCallbackV1_1 != nullptr) {
+ mCallbackV1_1->unlinkToDeath(this);
+ mCallbackV1_1 = nullptr;
+ }
+ if (mCallbackV1_0 != nullptr) {
+ mCallbackV1_0->unlinkToDeath(this);
+ mCallbackV1_0 = nullptr;
+ }
+ return ret == 0 ? V1_0::NfcStatus::OK : V1_0::NfcStatus::FAILED;
+}
+
+Return<void> Nfc::getConfig(getConfig_cb hidl_cb) {
+ android::hardware::nfc::V1_1::NfcConfig nfcVendorConfig;
+ StNfc_hal_getConfig(nfcVendorConfig);
+ hidl_cb(nfcVendorConfig);
+ return Void();
+}
+
+Return<void> Nfc::getConfig_1_2(getConfig_1_2_cb hidl_cb) {
+ NfcConfig nfcVendorConfig;
+ StNfc_hal_getConfig_1_2(nfcVendorConfig);
+ hidl_cb(nfcVendorConfig);
+ return Void();
+}
+
+} // namespace implementation
+} // namespace V1_2
+} // namespace nfc
+} // namespace hardware
+} // namespace android
diff --git a/1.2/Nfc.h b/1.2/Nfc.h
new file mode 100644
index 0000000..77657d8
--- /dev/null
+++ b/1.2/Nfc.h
@@ -0,0 +1,114 @@
+/******************************************************************************
+ *
+ * Copyright 2018 NXP
+ *
+ * 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 ANDROID_HARDWARE_NFC_V1_2_NFC_H
+#define ANDROID_HARDWARE_NFC_V1_2_NFC_H
+
+#include <android/hardware/nfc/1.2/INfc.h>
+#include <android/hardware/nfc/1.2/types.h>
+#include <hidl/MQDescriptor.h>
+#include <hidl/Status.h>
+#include <log/log.h>
+
+namespace android {
+namespace hardware {
+namespace nfc {
+namespace V1_2 {
+namespace implementation {
+
+using ::android::hidl::base::V1_0::IBase;
+using ::android::hardware::nfc::V1_2::INfc;
+using ::android::hardware::hidl_array;
+using ::android::hardware::hidl_memory;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::sp;
+struct Nfc : public V1_2::INfc, public hidl_death_recipient {
+ public:
+ // Methods from ::android::hardware::nfc::V1_0::INfc follow.
+ Return<V1_0::NfcStatus> open(
+ const sp<V1_0::INfcClientCallback>& clientCallback) override;
+ Return<V1_0::NfcStatus> open_1_1(
+ const sp<V1_1::INfcClientCallback>& clientCallback) override;
+ Return<uint32_t> write(const hidl_vec<uint8_t>& data) override;
+ Return<V1_0::NfcStatus> coreInitialized(
+ const hidl_vec<uint8_t>& data) override;
+ Return<V1_0::NfcStatus> prediscover() override;
+ Return<V1_0::NfcStatus> close() override;
+ Return<V1_0::NfcStatus> controlGranted() override;
+ Return<V1_0::NfcStatus> powerCycle() override;
+
+ // Methods from ::android::hardware::nfc::V1_1::INfc follow.
+ Return<void> factoryReset();
+ Return<V1_0::NfcStatus> closeForPowerOffCase();
+ Return<void> getConfig(getConfig_cb config);
+
+ Return<void> getConfig_1_2(getConfig_1_2_cb config);
+
+ // Methods from ::android::hidl::base::V1_0::IBase follow.
+
+ static void eventCallback(uint8_t event, uint8_t status) {
+ if (mCallbackV1_1 != nullptr) {
+ auto ret = mCallbackV1_1->sendEvent_1_1((V1_1::NfcEvent)event,
+ (V1_0::NfcStatus)status);
+ if (!ret.isOk()) {
+ ALOGW("failed to send event!!!");
+ }
+ } else if (mCallbackV1_0 != nullptr) {
+ auto ret = mCallbackV1_0->sendEvent((V1_0::NfcEvent)event,
+ (V1_0::NfcStatus)status);
+ if (!ret.isOk()) {
+ ALOGE("failed to send event!!!");
+ }
+ }
+ }
+
+ static void dataCallback(uint16_t data_len, uint8_t* p_data) {
+ hidl_vec<uint8_t> data;
+ data.setToExternal(p_data, data_len);
+ if (mCallbackV1_1 != nullptr) {
+ auto ret = mCallbackV1_1->sendData(data);
+ if (!ret.isOk()) {
+ ALOGW("failed to send data!!!");
+ }
+ } else if (mCallbackV1_0 != nullptr) {
+ auto ret = mCallbackV1_0->sendData(data);
+ if (!ret.isOk()) {
+ ALOGE("failed to send data!!!");
+ }
+ }
+ }
+
+ virtual void serviceDied(uint64_t /*cookie*/, const wp<IBase>& /*who*/) {
+ close();
+ }
+
+ private:
+ static sp<V1_1::INfcClientCallback> mCallbackV1_1;
+ static sp<V1_0::INfcClientCallback> mCallbackV1_0;
+};
+
+} // namespace implementation
+} // namespace V1_2
+} // namespace nfc
+} // namespace hardware
+} // namespace android
+
+#endif // ANDROID_HARDWARE_NFC_V1_2_NFC_H
diff --git a/1.2/StNfcService.cpp b/1.2/StNfcService.cpp
new file mode 100644
index 0000000..abc675f
--- /dev/null
+++ b/1.2/StNfcService.cpp
@@ -0,0 +1,51 @@
+/******************************************************************************
+ *
+ * Copyright 2018 NXP
+ * Copyright 2018 ST Microelectronics
+ *
+ * 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.
+ *
+ ******************************************************************************/
+
+#define LOG_TAG "stnfc@1.0-service.st"
+#include <android/hardware/nfc/1.1/INfc.h>
+
+
+#include <hidl/LegacySupport.h>
+#include "Nfc.h"
+
+
+// Generated HIDL files
+using android::hardware::nfc::V1_2::INfc;
+using android::hardware::nfc::V1_2::implementation::Nfc;
+using android::hardware::configureRpcThreadpool;
+using android::hardware::joinRpcThreadpool;
+using android::sp;
+using android::status_t;
+using android::OK;
+
+
+int main() {
+ ALOGD(" ST NFC HAL Service 1.2 is starting.");
+ sp<INfc> nfc_service = new Nfc();
+
+ configureRpcThreadpool(1, true /*callerWillJoin*/);
+ status_t status = nfc_service->registerAsService();
+ if (status != OK) {
+ LOG_ALWAYS_FATAL("Could not register service for NFC HAL Iface (%d).", status);
+ return -1;
+ }
+ ALOGD(" ST NFC service is ready");
+ joinRpcThreadpool();
+ return 1;
+}
diff --git a/1.2/android.hardware.nfc@1.2-service.st.rc b/1.2/android.hardware.nfc@1.2-service.st.rc
new file mode 100644
index 0000000..cf31b3e
--- /dev/null
+++ b/1.2/android.hardware.nfc@1.2-service.st.rc
@@ -0,0 +1,4 @@
+service nfc_hal_service /vendor/bin/hw/android.hardware.nfc@1.2-service.st
+ class hal
+ user nfc
+ group nfc
diff --git a/Android.bp b/Android.bp
index 82e47bc..7cd2c80 100644
--- a/Android.bp
+++ b/Android.bp
@@ -47,6 +47,7 @@
shared_libs: [
"android.hardware.nfc@1.0",
"android.hardware.nfc@1.1",
+ "android.hardware.nfc@1.2",
"libbase",
"libcutils",
"libhardware",
@@ -59,14 +60,14 @@
}
cc_binary {
- name: "android.hardware.nfc@1.1-service.st",
+ name: "android.hardware.nfc@1.2-service.st",
defaults: ["hidl_defaults"],
proprietary: true,
- init_rc: ["1.1/android.hardware.nfc@1.1-service.st.rc"],
+ init_rc: ["1.2/android.hardware.nfc@1.2-service.st.rc"],
relative_install_path: "hw",
srcs: [
- "1.1/StNfcService.cpp",
- "1.1/Nfc.cpp",
+ "1.2/StNfcService.cpp",
+ "1.2/Nfc.cpp",
],
shared_libs: [
@@ -78,6 +79,7 @@
"libutils",
"android.hardware.nfc@1.0",
"android.hardware.nfc@1.1",
+ "android.hardware.nfc@1.2",
"libhidlbase",
"libhidltransport",
"libhwbinder",
diff --git a/st21nfc/hal_st21nfc.cc b/st21nfc/hal_st21nfc.cc
index 3bd7bc6..b6fd45a 100644
--- a/st21nfc/hal_st21nfc.cc
+++ b/st21nfc/hal_st21nfc.cc
@@ -53,6 +53,7 @@
int nfc_mode = 0;
using namespace android::hardware::nfc::V1_1;
+using namespace android::hardware::nfc::V1_2;
using android::hardware::nfc::V1_1::NfcEvent;
/*
@@ -416,7 +417,7 @@
return StNfc_hal_close(nfc_mode);
}
-void StNfc_hal_getConfig(NfcConfig& config) {
+void StNfc_hal_getConfig(android::hardware::nfc::V1_1::NfcConfig& config) {
STLOG_HAL_D("HAL st21nfc: %s", __func__);
unsigned long num = 0;
std::array<uint8_t, 10> buffer;
@@ -424,7 +425,7 @@
buffer.fill(0);
long retlen = 0;
- memset(&config, 0x00, sizeof(NfcConfig));
+ memset(&config, 0x00, sizeof(android::hardware::nfc::V1_1::NfcConfig));
if (GetNumValue(NAME_CE_ON_SWITCH_OFF_STATE, &num, sizeof(num))) {
if (num == 0x1) {
@@ -487,3 +488,37 @@
config.presenceCheckAlgorithm = (PresenceCheckAlgorithm)num;
}
}
+
+void StNfc_hal_getConfig_1_2(android::hardware::nfc::V1_2::NfcConfig& config) {
+ STLOG_HAL_D("HAL st21nfc: %s", __func__);
+ unsigned long num = 0;
+ std::array<uint8_t, 10> buffer;
+
+ buffer.fill(0);
+ long retlen = 0;
+
+ memset(&config, 0x00, sizeof(android::hardware::nfc::V1_2::NfcConfig));
+
+ StNfc_hal_getConfig(config.v1_1);
+
+ if (GetByteArrayValue(NAME_OFFHOST_ROUTE_UICC, (char*) buffer.data(),
+ buffer.size(), &retlen)) {
+ config.offHostRouteUicc.resize(retlen);
+ for (int i = 0; i < retlen; i++) {
+ config.offHostRouteUicc[i] = buffer[i];
+ }
+ }
+
+ if (GetByteArrayValue(NAME_OFFHOST_ROUTE_ESE, (char*) buffer.data(),
+ buffer.size(), &retlen)) {
+ config.offHostRouteEse.resize(retlen);
+ for (int i = 0; i < retlen; i++) {
+ config.offHostRouteEse[i] = buffer[i];
+ }
+ }
+
+ if (GetNumValue(NAME_DEFAULT_ISODEP_ROUTE, &num, sizeof(num))) {
+ config.defaultIsoDepRoute = num;
+
+ }
+}
diff --git a/st21nfc/include/StNfc_hal_api.h b/st21nfc/include/StNfc_hal_api.h
index 8881401..4ac52d8 100644
--- a/st21nfc/include/StNfc_hal_api.h
+++ b/st21nfc/include/StNfc_hal_api.h
@@ -20,11 +20,12 @@
#ifndef _STNFC_HAL_API_H_
#define _STNFC_HAL_API_H_
-#include <android/hardware/nfc/1.1/INfc.h>
-#include <android/hardware/nfc/1.1/types.h>
#include <hardware/nfc.h>
+#include <android/hardware/nfc/1.2/INfc.h>
+#include <android/hardware/nfc/1.2/types.h>
-using ::android::hardware::nfc::V1_1::NfcConfig;
+//using ::android::hardware::nfc::V1_1::NfcConfig;
+using ::android::hardware::nfc::V1_2::NfcConfig;
#define NFC_MODE_OFF 0
#define NFC_MODE_QuickBoot 2
@@ -47,6 +48,7 @@
int StNfc_hal_closeForPowerOffCase();
-void StNfc_hal_getConfig(NfcConfig& config);
+void StNfc_hal_getConfig(android::hardware::nfc::V1_1::NfcConfig& config);
+void StNfc_hal_getConfig_1_2(NfcConfig& config);
#endif /* _STNFC_HAL_API_H_ */
diff --git a/st21nfc/include/hal_config.h b/st21nfc/include/hal_config.h
index fbddb08..190a9d9 100644
--- a/st21nfc/include/hal_config.h
+++ b/st21nfc/include/hal_config.h
@@ -37,5 +37,8 @@
#define NAME_NFA_PROPRIETARY_CFG "NFA_PROPRIETARY_CFG"
#define NAME_PRESENCE_CHECK_ALGORITHM "PRESENCE_CHECK_ALGORITHM"
#define NAME_CE_ON_SWITCH_OFF_STATE "CE_ON_SWITCH_OFF_STATE"
+#define NAME_OFFHOST_ROUTE_ESE "OFFHOST_ROUTE_ESE"
+#define NAME_OFFHOST_ROUTE_UICC "OFFHOST_ROUTE_UICC"
+#define NAME_DEFAULT_ISODEP_ROUTE "DEFAULT_ISODEP_ROUTE"
#endif