1d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************
2d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *
3d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  Copyright 2018 NXP
4d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *
5d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  Licensed under the Apache License, Version 2.0 (the "License");
6d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  you may not use this file except in compliance with the License.
7d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  You may obtain a copy of the License at
8d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *
9d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  http://www.apache.org/licenses/LICENSE-2.0
10d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *
11d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  Unless required by applicable law or agreed to in writing, software
12d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  distributed under the License is distributed on an "AS IS" BASIS,
13d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  See the License for the specific language governing permissions and
15d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  limitations under the License.
16d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *
17d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ******************************************************************************/
18d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
19d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#define LOG_TAG "android.hardware.nfc@1.1-impl"
20d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#include <log/log.h>
21d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#include "Nfc.h"
22d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#include "halimpl/inc/phNxpNciHal_Adaptation.h"
23d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#include "phNfcStatus.h"
24d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
25d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#define CHK_STATUS(x) ((x) == NFCSTATUS_SUCCESS) \
26d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna      ? (V1_0::NfcStatus::OK) : (V1_0::NfcStatus::FAILED)
27d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
28d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannaextern bool nfc_debug_enabled;
29d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
30d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannanamespace android {
31d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannanamespace hardware {
32d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannanamespace nfc {
33d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannanamespace V1_1 {
34d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannanamespace implementation {
35d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
36d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannasp<V1_1::INfcClientCallback> Nfc::mCallbackV1_1 = nullptr;
37d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannasp<V1_0::INfcClientCallback> Nfc::mCallbackV1_0 = nullptr;
38d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
39d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaReturn<V1_0::NfcStatus> Nfc::open_1_1(
40d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    const sp<V1_1::INfcClientCallback>& clientCallback) {
41d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  if (clientCallback == nullptr) {
42d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    ALOGD_IF(nfc_debug_enabled, "Nfc::open null callback");
43d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    return V1_0::NfcStatus::FAILED;
44d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  } else {
45d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    mCallbackV1_1 = clientCallback;
46d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    mCallbackV1_1->linkToDeath(this, 0 /*cookie*/);
47d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  }
48d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  return open(clientCallback);
49d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
50d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
51d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna// Methods from ::android::hardware::nfc::V1_0::INfc follow.
52d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaReturn<V1_0::NfcStatus> Nfc::open(
53d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    const sp<V1_0::INfcClientCallback>& clientCallback) {
54d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  ALOGD_IF(nfc_debug_enabled, "Nfc::open Enter");
55d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  if (clientCallback == nullptr) {
56d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    ALOGD_IF(nfc_debug_enabled, "Nfc::open null callback");
57d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    return V1_0::NfcStatus::FAILED;
58d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  } else {
59d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    mCallbackV1_0 = clientCallback;
60d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    mCallbackV1_0->linkToDeath(this, 0 /*cookie*/);
61d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  }
62d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
63d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  NFCSTATUS status = phNxpNciHal_open(eventCallback, dataCallback);
64d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  ALOGD_IF(nfc_debug_enabled, "Nfc::open Exit");
65d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  return CHK_STATUS(status);
66d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
67d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
68d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaReturn<uint32_t> Nfc::write(const hidl_vec<uint8_t>& data) {
69d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  hidl_vec<uint8_t> copy = data;
70d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  return phNxpNciHal_write(copy.size(), &copy[0]);
71d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
72d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
73d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaReturn<V1_0::NfcStatus> Nfc::coreInitialized(const hidl_vec<uint8_t>& data) {
74d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  hidl_vec<uint8_t> copy = data;
75d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  NFCSTATUS status = phNxpNciHal_core_initialized(&copy[0]);
76d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  return CHK_STATUS(status);
77d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
78d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
79d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaReturn<V1_0::NfcStatus> Nfc::prediscover() {
80d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  NFCSTATUS status = phNxpNciHal_pre_discover();
81d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  return CHK_STATUS(status);
82d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
83d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
84d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaReturn<V1_0::NfcStatus> Nfc::close() {
85d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  if (mCallbackV1_1 == nullptr && mCallbackV1_0 == nullptr) {
86d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    return V1_0::NfcStatus::FAILED;
87d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  }
88d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  NFCSTATUS status = phNxpNciHal_close(false);
89d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
90d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  if (mCallbackV1_1 != nullptr) {
91d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    mCallbackV1_1->unlinkToDeath(this);
92d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    mCallbackV1_1 = nullptr;
93d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  }
94d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  if (mCallbackV1_0 != nullptr) {
95d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    mCallbackV1_0->unlinkToDeath(this);
96d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    mCallbackV1_0 = nullptr;
97d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  }
98d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  return CHK_STATUS(status);
99d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
100d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
101d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaReturn<V1_0::NfcStatus> Nfc::controlGranted() {
102d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  NFCSTATUS status = phNxpNciHal_control_granted();
103d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  return CHK_STATUS(status);
104d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
105d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
106d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaReturn<V1_0::NfcStatus> Nfc::powerCycle() {
107d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  NFCSTATUS status = phNxpNciHal_power_cycle();
108d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  return CHK_STATUS(status);
109d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
110d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
111d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna// Methods from ::android::hardware::nfc::V1_1::INfc follow.
112d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaReturn<void> Nfc::factoryReset() {
113d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  phNxpNciHal_do_factory_reset();
114d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  return Void();
115d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
116d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
117d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaReturn<V1_0::NfcStatus> Nfc::closeForPowerOffCase() {
118d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  if (mCallbackV1_1 == nullptr && mCallbackV1_0 == nullptr) {
119d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    return V1_0::NfcStatus::FAILED;
120d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  }
121d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  NFCSTATUS status = phNxpNciHal_configDiscShutdown();
122d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
123d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  if (mCallbackV1_1 != nullptr) {
124d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    mCallbackV1_1->unlinkToDeath(this);
125d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    mCallbackV1_1 = nullptr;
126d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  }
127d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  if (mCallbackV1_0 != nullptr) {
128d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    mCallbackV1_0->unlinkToDeath(this);
129d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    mCallbackV1_0 = nullptr;
130d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  }
131d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  return CHK_STATUS(status);
132d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
133d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
1343d445ae8732eaaa334c1231b3439462e9a621978Love KhannaReturn<void> Nfc::getConfig(getConfig_cb hidl_cb) {
1353d445ae8732eaaa334c1231b3439462e9a621978Love Khanna  NfcConfig nfcVendorConfig;
1363d445ae8732eaaa334c1231b3439462e9a621978Love Khanna  phNxpNciHal_getVendorConfig(nfcVendorConfig);
1373d445ae8732eaaa334c1231b3439462e9a621978Love Khanna  hidl_cb(nfcVendorConfig);
1383d445ae8732eaaa334c1231b3439462e9a621978Love Khanna  return Void();
1393d445ae8732eaaa334c1231b3439462e9a621978Love Khanna}
1403d445ae8732eaaa334c1231b3439462e9a621978Love Khanna
141d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}  // namespace implementation
142d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}  // namespace V1_1
143d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}  // namespace nfc
144d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}  // namespace hardware
145d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}  // namespace android
146