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(), ©[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(©[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