1*7eba2f3bSAndroid Build Coastguard Worker /******************************************************************************
2*7eba2f3bSAndroid Build Coastguard Worker *
3*7eba2f3bSAndroid Build Coastguard Worker * Copyright (C) 1999-2012 Broadcom Corporation
4*7eba2f3bSAndroid Build Coastguard Worker *
5*7eba2f3bSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*7eba2f3bSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*7eba2f3bSAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*7eba2f3bSAndroid Build Coastguard Worker *
9*7eba2f3bSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*7eba2f3bSAndroid Build Coastguard Worker *
11*7eba2f3bSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*7eba2f3bSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*7eba2f3bSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*7eba2f3bSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*7eba2f3bSAndroid Build Coastguard Worker * limitations under the License.
16*7eba2f3bSAndroid Build Coastguard Worker *
17*7eba2f3bSAndroid Build Coastguard Worker ******************************************************************************/
18*7eba2f3bSAndroid Build Coastguard Worker #include "NfcAdaptation.h"
19*7eba2f3bSAndroid Build Coastguard Worker
20*7eba2f3bSAndroid Build Coastguard Worker #include <aidl/android/hardware/nfc/BnNfc.h>
21*7eba2f3bSAndroid Build Coastguard Worker #include <aidl/android/hardware/nfc/BnNfcClientCallback.h>
22*7eba2f3bSAndroid Build Coastguard Worker #include <aidl/android/hardware/nfc/INfc.h>
23*7eba2f3bSAndroid Build Coastguard Worker #include <android-base/logging.h>
24*7eba2f3bSAndroid Build Coastguard Worker #include <android-base/properties.h>
25*7eba2f3bSAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
26*7eba2f3bSAndroid Build Coastguard Worker #include <android/binder_ibinder.h>
27*7eba2f3bSAndroid Build Coastguard Worker #include <android/binder_manager.h>
28*7eba2f3bSAndroid Build Coastguard Worker #include <android/binder_process.h>
29*7eba2f3bSAndroid Build Coastguard Worker #include <android/hardware/nfc/1.1/INfc.h>
30*7eba2f3bSAndroid Build Coastguard Worker #include <android/hardware/nfc/1.2/INfc.h>
31*7eba2f3bSAndroid Build Coastguard Worker #include <cutils/properties.h>
32*7eba2f3bSAndroid Build Coastguard Worker #include <hwbinder/ProcessState.h>
33*7eba2f3bSAndroid Build Coastguard Worker
34*7eba2f3bSAndroid Build Coastguard Worker #include "debug_nfcsnoop.h"
35*7eba2f3bSAndroid Build Coastguard Worker #include "nfa_api.h"
36*7eba2f3bSAndroid Build Coastguard Worker #include "nfa_rw_api.h"
37*7eba2f3bSAndroid Build Coastguard Worker #include "nfc_config.h"
38*7eba2f3bSAndroid Build Coastguard Worker #include "nfc_int.h"
39*7eba2f3bSAndroid Build Coastguard Worker
40*7eba2f3bSAndroid Build Coastguard Worker using ::android::wp;
41*7eba2f3bSAndroid Build Coastguard Worker using ::android::hardware::hidl_death_recipient;
42*7eba2f3bSAndroid Build Coastguard Worker using ::android::hidl::base::V1_0::IBase;
43*7eba2f3bSAndroid Build Coastguard Worker
44*7eba2f3bSAndroid Build Coastguard Worker using android::OK;
45*7eba2f3bSAndroid Build Coastguard Worker using android::sp;
46*7eba2f3bSAndroid Build Coastguard Worker using android::status_t;
47*7eba2f3bSAndroid Build Coastguard Worker
48*7eba2f3bSAndroid Build Coastguard Worker using android::base::StringPrintf;
49*7eba2f3bSAndroid Build Coastguard Worker using android::hardware::ProcessState;
50*7eba2f3bSAndroid Build Coastguard Worker using android::hardware::Return;
51*7eba2f3bSAndroid Build Coastguard Worker using android::hardware::Void;
52*7eba2f3bSAndroid Build Coastguard Worker using android::hardware::nfc::V1_0::INfc;
53*7eba2f3bSAndroid Build Coastguard Worker using android::hardware::nfc::V1_1::PresenceCheckAlgorithm;
54*7eba2f3bSAndroid Build Coastguard Worker using INfcV1_1 = android::hardware::nfc::V1_1::INfc;
55*7eba2f3bSAndroid Build Coastguard Worker using INfcV1_2 = android::hardware::nfc::V1_2::INfc;
56*7eba2f3bSAndroid Build Coastguard Worker using NfcVendorConfigV1_1 = android::hardware::nfc::V1_1::NfcConfig;
57*7eba2f3bSAndroid Build Coastguard Worker using NfcVendorConfigV1_2 = android::hardware::nfc::V1_2::NfcConfig;
58*7eba2f3bSAndroid Build Coastguard Worker using android::hardware::nfc::V1_1::INfcClientCallback;
59*7eba2f3bSAndroid Build Coastguard Worker using android::hardware::hidl_vec;
60*7eba2f3bSAndroid Build Coastguard Worker using INfcAidl = ::aidl::android::hardware::nfc::INfc;
61*7eba2f3bSAndroid Build Coastguard Worker using NfcAidlConfig = ::aidl::android::hardware::nfc::NfcConfig;
62*7eba2f3bSAndroid Build Coastguard Worker using AidlPresenceCheckAlgorithm =
63*7eba2f3bSAndroid Build Coastguard Worker ::aidl::android::hardware::nfc::PresenceCheckAlgorithm;
64*7eba2f3bSAndroid Build Coastguard Worker using INfcAidlClientCallback =
65*7eba2f3bSAndroid Build Coastguard Worker ::aidl::android::hardware::nfc::INfcClientCallback;
66*7eba2f3bSAndroid Build Coastguard Worker using NfcAidlEvent = ::aidl::android::hardware::nfc::NfcEvent;
67*7eba2f3bSAndroid Build Coastguard Worker using NfcAidlStatus = ::aidl::android::hardware::nfc::NfcStatus;
68*7eba2f3bSAndroid Build Coastguard Worker using ::aidl::android::hardware::nfc::NfcCloseType;
69*7eba2f3bSAndroid Build Coastguard Worker using Status = ::ndk::ScopedAStatus;
70*7eba2f3bSAndroid Build Coastguard Worker
71*7eba2f3bSAndroid Build Coastguard Worker #define VERBOSE_VENDOR_LOG_PROPERTY "persist.nfc.vendor_debug_enabled"
72*7eba2f3bSAndroid Build Coastguard Worker
73*7eba2f3bSAndroid Build Coastguard Worker std::string NFC_AIDL_HAL_SERVICE_NAME = "android.hardware.nfc.INfc/default";
74*7eba2f3bSAndroid Build Coastguard Worker
75*7eba2f3bSAndroid Build Coastguard Worker extern void GKI_shutdown();
76*7eba2f3bSAndroid Build Coastguard Worker extern void verify_stack_non_volatile_store();
77*7eba2f3bSAndroid Build Coastguard Worker extern void delete_stack_non_volatile_store(bool forceDelete);
78*7eba2f3bSAndroid Build Coastguard Worker
79*7eba2f3bSAndroid Build Coastguard Worker NfcAdaptation* NfcAdaptation::mpInstance = nullptr;
80*7eba2f3bSAndroid Build Coastguard Worker ThreadMutex NfcAdaptation::sLock;
81*7eba2f3bSAndroid Build Coastguard Worker ThreadCondVar NfcAdaptation::mHalOpenCompletedEvent;
82*7eba2f3bSAndroid Build Coastguard Worker ThreadCondVar NfcAdaptation::mHalCloseCompletedEvent;
83*7eba2f3bSAndroid Build Coastguard Worker sp<INfc> NfcAdaptation::mHal;
84*7eba2f3bSAndroid Build Coastguard Worker sp<INfcV1_1> NfcAdaptation::mHal_1_1;
85*7eba2f3bSAndroid Build Coastguard Worker sp<INfcV1_2> NfcAdaptation::mHal_1_2;
86*7eba2f3bSAndroid Build Coastguard Worker INfcClientCallback* NfcAdaptation::mCallback;
87*7eba2f3bSAndroid Build Coastguard Worker std::shared_ptr<INfcAidlClientCallback> mAidlCallback;
88*7eba2f3bSAndroid Build Coastguard Worker ::ndk::ScopedAIBinder_DeathRecipient mDeathRecipient;
89*7eba2f3bSAndroid Build Coastguard Worker std::shared_ptr<INfcAidl> mAidlHal;
90*7eba2f3bSAndroid Build Coastguard Worker int32_t mAidlHalVer;
91*7eba2f3bSAndroid Build Coastguard Worker
92*7eba2f3bSAndroid Build Coastguard Worker bool nfc_nci_reset_keep_cfg_enabled = false;
93*7eba2f3bSAndroid Build Coastguard Worker uint8_t nfc_nci_reset_type = 0x00;
94*7eba2f3bSAndroid Build Coastguard Worker std::string nfc_storage_path;
95*7eba2f3bSAndroid Build Coastguard Worker uint8_t appl_dta_mode_flag = 0x00;
96*7eba2f3bSAndroid Build Coastguard Worker bool isDownloadFirmwareCompleted = false;
97*7eba2f3bSAndroid Build Coastguard Worker bool use_aidl = false;
98*7eba2f3bSAndroid Build Coastguard Worker uint8_t mute_tech_route_option = 0x00;
99*7eba2f3bSAndroid Build Coastguard Worker unsigned int t5t_mute_legacy = 0;
100*7eba2f3bSAndroid Build Coastguard Worker
101*7eba2f3bSAndroid Build Coastguard Worker extern tNFA_DM_CFG nfa_dm_cfg;
102*7eba2f3bSAndroid Build Coastguard Worker extern tNFA_PROPRIETARY_CFG nfa_proprietary_cfg;
103*7eba2f3bSAndroid Build Coastguard Worker extern tNFA_HCI_CFG nfa_hci_cfg;
104*7eba2f3bSAndroid Build Coastguard Worker extern uint8_t nfa_ee_max_ee_cfg;
105*7eba2f3bSAndroid Build Coastguard Worker extern bool nfa_poll_bail_out_mode;
106*7eba2f3bSAndroid Build Coastguard Worker
107*7eba2f3bSAndroid Build Coastguard Worker // Whitelist for hosts allowed to create a pipe
108*7eba2f3bSAndroid Build Coastguard Worker // See ADM_CREATE_PIPE command in the ETSI test specification
109*7eba2f3bSAndroid Build Coastguard Worker // ETSI TS 102 622, section 6.1.3.1
110*7eba2f3bSAndroid Build Coastguard Worker static std::vector<uint8_t> host_allowlist;
111*7eba2f3bSAndroid Build Coastguard Worker
112*7eba2f3bSAndroid Build Coastguard Worker namespace {
initializeGlobalDebugEnabledFlag()113*7eba2f3bSAndroid Build Coastguard Worker void initializeGlobalDebugEnabledFlag() {
114*7eba2f3bSAndroid Build Coastguard Worker bool nfc_debug_enabled =
115*7eba2f3bSAndroid Build Coastguard Worker (NfcConfig::getUnsigned(NAME_NFC_DEBUG_ENABLED, 0) != 0) ||
116*7eba2f3bSAndroid Build Coastguard Worker property_get_bool("persist.nfc.debug_enabled", true);
117*7eba2f3bSAndroid Build Coastguard Worker
118*7eba2f3bSAndroid Build Coastguard Worker android::base::SetMinimumLogSeverity(nfc_debug_enabled ? android::base::DEBUG
119*7eba2f3bSAndroid Build Coastguard Worker : android::base::INFO);
120*7eba2f3bSAndroid Build Coastguard Worker
121*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: level=%u", __func__, nfc_debug_enabled);
122*7eba2f3bSAndroid Build Coastguard Worker }
123*7eba2f3bSAndroid Build Coastguard Worker
124*7eba2f3bSAndroid Build Coastguard Worker // initialize NciResetType Flag
125*7eba2f3bSAndroid Build Coastguard Worker // NCI_RESET_TYPE
126*7eba2f3bSAndroid Build Coastguard Worker // 0x00 default, reset configurations every time.
127*7eba2f3bSAndroid Build Coastguard Worker // 0x01, reset configurations only once every boot.
128*7eba2f3bSAndroid Build Coastguard Worker // 0x02, keep configurations.
initializeNciResetTypeFlag()129*7eba2f3bSAndroid Build Coastguard Worker void initializeNciResetTypeFlag() {
130*7eba2f3bSAndroid Build Coastguard Worker nfc_nci_reset_type = NfcConfig::getUnsigned(NAME_NCI_RESET_TYPE, 0);
131*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: nfc_nci_reset_type=%u", __func__,
132*7eba2f3bSAndroid Build Coastguard Worker nfc_nci_reset_type);
133*7eba2f3bSAndroid Build Coastguard Worker }
134*7eba2f3bSAndroid Build Coastguard Worker
135*7eba2f3bSAndroid Build Coastguard Worker // initialize MuteTechRouteOption Flag
136*7eba2f3bSAndroid Build Coastguard Worker // MUTE_TECH_ROUTE_OPTION
137*7eba2f3bSAndroid Build Coastguard Worker // 0x00: Default. Route mute techs to DH, enable block bit and set power state
138*7eba2f3bSAndroid Build Coastguard Worker // to 0x00 0x01: Remove mute techs from rf discover cmd
initializeNfcMuteTechRouteOptionFlag()139*7eba2f3bSAndroid Build Coastguard Worker void initializeNfcMuteTechRouteOptionFlag() {
140*7eba2f3bSAndroid Build Coastguard Worker mute_tech_route_option =
141*7eba2f3bSAndroid Build Coastguard Worker NfcConfig::getUnsigned(NAME_MUTE_TECH_ROUTE_OPTION, 0);
142*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: mute_tech_route_option=%u", __func__,
143*7eba2f3bSAndroid Build Coastguard Worker mute_tech_route_option);
144*7eba2f3bSAndroid Build Coastguard Worker }
145*7eba2f3bSAndroid Build Coastguard Worker
146*7eba2f3bSAndroid Build Coastguard Worker // Abort nfc service when AIDL process died.
HalAidlBinderDied(void *)147*7eba2f3bSAndroid Build Coastguard Worker void HalAidlBinderDied(void* /* cookie */) {
148*7eba2f3bSAndroid Build Coastguard Worker LOG(ERROR) << __func__ << "INfc aidl hal died, exiting procces to restart";
149*7eba2f3bSAndroid Build Coastguard Worker exit(0);
150*7eba2f3bSAndroid Build Coastguard Worker }
151*7eba2f3bSAndroid Build Coastguard Worker
152*7eba2f3bSAndroid Build Coastguard Worker } // namespace
153*7eba2f3bSAndroid Build Coastguard Worker
154*7eba2f3bSAndroid Build Coastguard Worker class NfcClientCallback : public INfcClientCallback {
155*7eba2f3bSAndroid Build Coastguard Worker public:
NfcClientCallback(tHAL_NFC_CBACK * eventCallback,tHAL_NFC_DATA_CBACK dataCallback)156*7eba2f3bSAndroid Build Coastguard Worker NfcClientCallback(tHAL_NFC_CBACK* eventCallback,
157*7eba2f3bSAndroid Build Coastguard Worker tHAL_NFC_DATA_CBACK dataCallback) {
158*7eba2f3bSAndroid Build Coastguard Worker mEventCallback = eventCallback;
159*7eba2f3bSAndroid Build Coastguard Worker mDataCallback = dataCallback;
160*7eba2f3bSAndroid Build Coastguard Worker };
161*7eba2f3bSAndroid Build Coastguard Worker virtual ~NfcClientCallback() = default;
sendEvent_1_1(::android::hardware::nfc::V1_1::NfcEvent event,::android::hardware::nfc::V1_0::NfcStatus event_status)162*7eba2f3bSAndroid Build Coastguard Worker Return<void> sendEvent_1_1(
163*7eba2f3bSAndroid Build Coastguard Worker ::android::hardware::nfc::V1_1::NfcEvent event,
164*7eba2f3bSAndroid Build Coastguard Worker ::android::hardware::nfc::V1_0::NfcStatus event_status) override {
165*7eba2f3bSAndroid Build Coastguard Worker mEventCallback((uint8_t)event, (tHAL_NFC_STATUS)event_status);
166*7eba2f3bSAndroid Build Coastguard Worker return Void();
167*7eba2f3bSAndroid Build Coastguard Worker };
sendEvent(::android::hardware::nfc::V1_0::NfcEvent event,::android::hardware::nfc::V1_0::NfcStatus event_status)168*7eba2f3bSAndroid Build Coastguard Worker Return<void> sendEvent(
169*7eba2f3bSAndroid Build Coastguard Worker ::android::hardware::nfc::V1_0::NfcEvent event,
170*7eba2f3bSAndroid Build Coastguard Worker ::android::hardware::nfc::V1_0::NfcStatus event_status) override {
171*7eba2f3bSAndroid Build Coastguard Worker mEventCallback((uint8_t)event, (tHAL_NFC_STATUS)event_status);
172*7eba2f3bSAndroid Build Coastguard Worker return Void();
173*7eba2f3bSAndroid Build Coastguard Worker };
sendData(const::android::hardware::nfc::V1_0::NfcData & data)174*7eba2f3bSAndroid Build Coastguard Worker Return<void> sendData(
175*7eba2f3bSAndroid Build Coastguard Worker const ::android::hardware::nfc::V1_0::NfcData& data) override {
176*7eba2f3bSAndroid Build Coastguard Worker ::android::hardware::nfc::V1_0::NfcData copy = data;
177*7eba2f3bSAndroid Build Coastguard Worker mDataCallback(copy.size(), ©[0]);
178*7eba2f3bSAndroid Build Coastguard Worker return Void();
179*7eba2f3bSAndroid Build Coastguard Worker };
180*7eba2f3bSAndroid Build Coastguard Worker
181*7eba2f3bSAndroid Build Coastguard Worker private:
182*7eba2f3bSAndroid Build Coastguard Worker tHAL_NFC_CBACK* mEventCallback;
183*7eba2f3bSAndroid Build Coastguard Worker tHAL_NFC_DATA_CBACK* mDataCallback;
184*7eba2f3bSAndroid Build Coastguard Worker };
185*7eba2f3bSAndroid Build Coastguard Worker
186*7eba2f3bSAndroid Build Coastguard Worker class NfcHalDeathRecipient : public hidl_death_recipient {
187*7eba2f3bSAndroid Build Coastguard Worker public:
188*7eba2f3bSAndroid Build Coastguard Worker android::sp<android::hardware::nfc::V1_0::INfc> mNfcDeathHal;
NfcHalDeathRecipient(android::sp<android::hardware::nfc::V1_0::INfc> & mHal)189*7eba2f3bSAndroid Build Coastguard Worker NfcHalDeathRecipient(android::sp<android::hardware::nfc::V1_0::INfc>& mHal) {
190*7eba2f3bSAndroid Build Coastguard Worker mNfcDeathHal = mHal;
191*7eba2f3bSAndroid Build Coastguard Worker }
192*7eba2f3bSAndroid Build Coastguard Worker
serviceDied(uint64_t,const wp<::android::hidl::base::V1_0::IBase> &)193*7eba2f3bSAndroid Build Coastguard Worker virtual void serviceDied(
194*7eba2f3bSAndroid Build Coastguard Worker uint64_t /* cookie */,
195*7eba2f3bSAndroid Build Coastguard Worker const wp<::android::hidl::base::V1_0::IBase>& /* who */) {
196*7eba2f3bSAndroid Build Coastguard Worker ALOGE(
197*7eba2f3bSAndroid Build Coastguard Worker "NfcHalDeathRecipient::serviceDied - Nfc-Hal service died. Killing "
198*7eba2f3bSAndroid Build Coastguard Worker "NfcService");
199*7eba2f3bSAndroid Build Coastguard Worker if (mNfcDeathHal) {
200*7eba2f3bSAndroid Build Coastguard Worker mNfcDeathHal->unlinkToDeath(this);
201*7eba2f3bSAndroid Build Coastguard Worker }
202*7eba2f3bSAndroid Build Coastguard Worker mNfcDeathHal = NULL;
203*7eba2f3bSAndroid Build Coastguard Worker exit(0);
204*7eba2f3bSAndroid Build Coastguard Worker }
finalize()205*7eba2f3bSAndroid Build Coastguard Worker void finalize() {
206*7eba2f3bSAndroid Build Coastguard Worker if (mNfcDeathHal) {
207*7eba2f3bSAndroid Build Coastguard Worker mNfcDeathHal->unlinkToDeath(this);
208*7eba2f3bSAndroid Build Coastguard Worker } else {
209*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: mNfcDeathHal is not set", __func__);
210*7eba2f3bSAndroid Build Coastguard Worker }
211*7eba2f3bSAndroid Build Coastguard Worker
212*7eba2f3bSAndroid Build Coastguard Worker ALOGI("NfcHalDeathRecipient::destructor - NfcService");
213*7eba2f3bSAndroid Build Coastguard Worker mNfcDeathHal = NULL;
214*7eba2f3bSAndroid Build Coastguard Worker }
215*7eba2f3bSAndroid Build Coastguard Worker };
216*7eba2f3bSAndroid Build Coastguard Worker
217*7eba2f3bSAndroid Build Coastguard Worker class NfcAidlClientCallback
218*7eba2f3bSAndroid Build Coastguard Worker : public ::aidl::android::hardware::nfc::BnNfcClientCallback {
219*7eba2f3bSAndroid Build Coastguard Worker public:
NfcAidlClientCallback(tHAL_NFC_CBACK * eventCallback,tHAL_NFC_DATA_CBACK dataCallback)220*7eba2f3bSAndroid Build Coastguard Worker NfcAidlClientCallback(tHAL_NFC_CBACK* eventCallback,
221*7eba2f3bSAndroid Build Coastguard Worker tHAL_NFC_DATA_CBACK dataCallback) {
222*7eba2f3bSAndroid Build Coastguard Worker mEventCallback = eventCallback;
223*7eba2f3bSAndroid Build Coastguard Worker mDataCallback = dataCallback;
224*7eba2f3bSAndroid Build Coastguard Worker };
225*7eba2f3bSAndroid Build Coastguard Worker virtual ~NfcAidlClientCallback() = default;
226*7eba2f3bSAndroid Build Coastguard Worker
sendEvent(NfcAidlEvent event,NfcAidlStatus event_status)227*7eba2f3bSAndroid Build Coastguard Worker ::ndk::ScopedAStatus sendEvent(NfcAidlEvent event,
228*7eba2f3bSAndroid Build Coastguard Worker NfcAidlStatus event_status) override {
229*7eba2f3bSAndroid Build Coastguard Worker uint8_t e_num;
230*7eba2f3bSAndroid Build Coastguard Worker uint8_t s_num;
231*7eba2f3bSAndroid Build Coastguard Worker switch (event) {
232*7eba2f3bSAndroid Build Coastguard Worker case NfcAidlEvent::OPEN_CPLT:
233*7eba2f3bSAndroid Build Coastguard Worker e_num = HAL_NFC_OPEN_CPLT_EVT;
234*7eba2f3bSAndroid Build Coastguard Worker break;
235*7eba2f3bSAndroid Build Coastguard Worker case NfcAidlEvent::CLOSE_CPLT:
236*7eba2f3bSAndroid Build Coastguard Worker e_num = HAL_NFC_CLOSE_CPLT_EVT;
237*7eba2f3bSAndroid Build Coastguard Worker break;
238*7eba2f3bSAndroid Build Coastguard Worker case NfcAidlEvent::POST_INIT_CPLT:
239*7eba2f3bSAndroid Build Coastguard Worker e_num = HAL_NFC_POST_INIT_CPLT_EVT;
240*7eba2f3bSAndroid Build Coastguard Worker break;
241*7eba2f3bSAndroid Build Coastguard Worker case NfcAidlEvent::PRE_DISCOVER_CPLT:
242*7eba2f3bSAndroid Build Coastguard Worker e_num = HAL_NFC_PRE_DISCOVER_CPLT_EVT;
243*7eba2f3bSAndroid Build Coastguard Worker break;
244*7eba2f3bSAndroid Build Coastguard Worker case NfcAidlEvent::HCI_NETWORK_RESET:
245*7eba2f3bSAndroid Build Coastguard Worker e_num = HAL_HCI_NETWORK_RESET;
246*7eba2f3bSAndroid Build Coastguard Worker break;
247*7eba2f3bSAndroid Build Coastguard Worker case NfcAidlEvent::REQUEST_CONTROL:
248*7eba2f3bSAndroid Build Coastguard Worker e_num = HAL_NFC_REQUEST_CONTROL_EVT;
249*7eba2f3bSAndroid Build Coastguard Worker break;
250*7eba2f3bSAndroid Build Coastguard Worker case NfcAidlEvent::RELEASE_CONTROL:
251*7eba2f3bSAndroid Build Coastguard Worker e_num = HAL_NFC_RELEASE_CONTROL_EVT;
252*7eba2f3bSAndroid Build Coastguard Worker break;
253*7eba2f3bSAndroid Build Coastguard Worker case NfcAidlEvent::ERROR:
254*7eba2f3bSAndroid Build Coastguard Worker default:
255*7eba2f3bSAndroid Build Coastguard Worker e_num = HAL_NFC_ERROR_EVT;
256*7eba2f3bSAndroid Build Coastguard Worker }
257*7eba2f3bSAndroid Build Coastguard Worker switch (event_status) {
258*7eba2f3bSAndroid Build Coastguard Worker case NfcAidlStatus::OK:
259*7eba2f3bSAndroid Build Coastguard Worker s_num = HAL_NFC_STATUS_OK;
260*7eba2f3bSAndroid Build Coastguard Worker break;
261*7eba2f3bSAndroid Build Coastguard Worker case NfcAidlStatus::FAILED:
262*7eba2f3bSAndroid Build Coastguard Worker s_num = HAL_NFC_STATUS_FAILED;
263*7eba2f3bSAndroid Build Coastguard Worker break;
264*7eba2f3bSAndroid Build Coastguard Worker case NfcAidlStatus::ERR_TRANSPORT:
265*7eba2f3bSAndroid Build Coastguard Worker s_num = HAL_NFC_STATUS_ERR_TRANSPORT;
266*7eba2f3bSAndroid Build Coastguard Worker break;
267*7eba2f3bSAndroid Build Coastguard Worker case NfcAidlStatus::ERR_CMD_TIMEOUT:
268*7eba2f3bSAndroid Build Coastguard Worker s_num = HAL_NFC_STATUS_ERR_CMD_TIMEOUT;
269*7eba2f3bSAndroid Build Coastguard Worker break;
270*7eba2f3bSAndroid Build Coastguard Worker case NfcAidlStatus::REFUSED:
271*7eba2f3bSAndroid Build Coastguard Worker s_num = HAL_NFC_STATUS_REFUSED;
272*7eba2f3bSAndroid Build Coastguard Worker break;
273*7eba2f3bSAndroid Build Coastguard Worker default:
274*7eba2f3bSAndroid Build Coastguard Worker s_num = HAL_NFC_STATUS_FAILED;
275*7eba2f3bSAndroid Build Coastguard Worker }
276*7eba2f3bSAndroid Build Coastguard Worker mEventCallback(e_num, (tHAL_NFC_STATUS)s_num);
277*7eba2f3bSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
278*7eba2f3bSAndroid Build Coastguard Worker };
sendData(const std::vector<uint8_t> & data)279*7eba2f3bSAndroid Build Coastguard Worker ::ndk::ScopedAStatus sendData(const std::vector<uint8_t>& data) override {
280*7eba2f3bSAndroid Build Coastguard Worker std::vector<uint8_t> copy = data;
281*7eba2f3bSAndroid Build Coastguard Worker mDataCallback(copy.size(), ©[0]);
282*7eba2f3bSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
283*7eba2f3bSAndroid Build Coastguard Worker };
284*7eba2f3bSAndroid Build Coastguard Worker
285*7eba2f3bSAndroid Build Coastguard Worker private:
286*7eba2f3bSAndroid Build Coastguard Worker tHAL_NFC_CBACK* mEventCallback;
287*7eba2f3bSAndroid Build Coastguard Worker tHAL_NFC_DATA_CBACK* mDataCallback;
288*7eba2f3bSAndroid Build Coastguard Worker };
289*7eba2f3bSAndroid Build Coastguard Worker
290*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
291*7eba2f3bSAndroid Build Coastguard Worker **
292*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::NfcAdaptation()
293*7eba2f3bSAndroid Build Coastguard Worker **
294*7eba2f3bSAndroid Build Coastguard Worker ** Description: class constructor
295*7eba2f3bSAndroid Build Coastguard Worker **
296*7eba2f3bSAndroid Build Coastguard Worker ** Returns: none
297*7eba2f3bSAndroid Build Coastguard Worker **
298*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
NfcAdaptation()299*7eba2f3bSAndroid Build Coastguard Worker NfcAdaptation::NfcAdaptation() {
300*7eba2f3bSAndroid Build Coastguard Worker memset(&mHalEntryFuncs, 0, sizeof(mHalEntryFuncs));
301*7eba2f3bSAndroid Build Coastguard Worker mDeathRecipient = ::ndk::ScopedAIBinder_DeathRecipient(
302*7eba2f3bSAndroid Build Coastguard Worker AIBinder_DeathRecipient_new(HalAidlBinderDied));
303*7eba2f3bSAndroid Build Coastguard Worker }
304*7eba2f3bSAndroid Build Coastguard Worker
305*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
306*7eba2f3bSAndroid Build Coastguard Worker **
307*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::~NfcAdaptation()
308*7eba2f3bSAndroid Build Coastguard Worker **
309*7eba2f3bSAndroid Build Coastguard Worker ** Description: class destructor
310*7eba2f3bSAndroid Build Coastguard Worker **
311*7eba2f3bSAndroid Build Coastguard Worker ** Returns: none
312*7eba2f3bSAndroid Build Coastguard Worker **
313*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
~NfcAdaptation()314*7eba2f3bSAndroid Build Coastguard Worker NfcAdaptation::~NfcAdaptation() { mpInstance = nullptr; }
315*7eba2f3bSAndroid Build Coastguard Worker
316*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
317*7eba2f3bSAndroid Build Coastguard Worker **
318*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::GetInstance()
319*7eba2f3bSAndroid Build Coastguard Worker **
320*7eba2f3bSAndroid Build Coastguard Worker ** Description: access class singleton
321*7eba2f3bSAndroid Build Coastguard Worker **
322*7eba2f3bSAndroid Build Coastguard Worker ** Returns: pointer to the singleton object
323*7eba2f3bSAndroid Build Coastguard Worker **
324*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GetInstance()325*7eba2f3bSAndroid Build Coastguard Worker NfcAdaptation& NfcAdaptation::GetInstance() {
326*7eba2f3bSAndroid Build Coastguard Worker AutoThreadMutex a(sLock);
327*7eba2f3bSAndroid Build Coastguard Worker
328*7eba2f3bSAndroid Build Coastguard Worker if (!mpInstance) {
329*7eba2f3bSAndroid Build Coastguard Worker mpInstance = new NfcAdaptation;
330*7eba2f3bSAndroid Build Coastguard Worker mpInstance->InitializeHalDeviceContext();
331*7eba2f3bSAndroid Build Coastguard Worker }
332*7eba2f3bSAndroid Build Coastguard Worker return *mpInstance;
333*7eba2f3bSAndroid Build Coastguard Worker }
334*7eba2f3bSAndroid Build Coastguard Worker
GetVendorConfigs(std::map<std::string,ConfigValue> & configMap)335*7eba2f3bSAndroid Build Coastguard Worker void NfcAdaptation::GetVendorConfigs(
336*7eba2f3bSAndroid Build Coastguard Worker std::map<std::string, ConfigValue>& configMap) {
337*7eba2f3bSAndroid Build Coastguard Worker NfcVendorConfigV1_2 configValue;
338*7eba2f3bSAndroid Build Coastguard Worker NfcAidlConfig aidlConfigValue;
339*7eba2f3bSAndroid Build Coastguard Worker if (mAidlHal) {
340*7eba2f3bSAndroid Build Coastguard Worker mAidlHal->getConfig(&aidlConfigValue);
341*7eba2f3bSAndroid Build Coastguard Worker } else if (mHal_1_2) {
342*7eba2f3bSAndroid Build Coastguard Worker mHal_1_2->getConfig_1_2(
343*7eba2f3bSAndroid Build Coastguard Worker [&configValue](NfcVendorConfigV1_2 config) { configValue = config; });
344*7eba2f3bSAndroid Build Coastguard Worker } else if (mHal_1_1) {
345*7eba2f3bSAndroid Build Coastguard Worker mHal_1_1->getConfig([&configValue](NfcVendorConfigV1_1 config) {
346*7eba2f3bSAndroid Build Coastguard Worker configValue.v1_1 = config;
347*7eba2f3bSAndroid Build Coastguard Worker configValue.defaultIsoDepRoute = 0x00;
348*7eba2f3bSAndroid Build Coastguard Worker });
349*7eba2f3bSAndroid Build Coastguard Worker }
350*7eba2f3bSAndroid Build Coastguard Worker
351*7eba2f3bSAndroid Build Coastguard Worker if (mAidlHal) {
352*7eba2f3bSAndroid Build Coastguard Worker std::vector<int8_t> nfaPropCfg = {
353*7eba2f3bSAndroid Build Coastguard Worker aidlConfigValue.nfaProprietaryCfg.protocol18092Active,
354*7eba2f3bSAndroid Build Coastguard Worker aidlConfigValue.nfaProprietaryCfg.protocolBPrime,
355*7eba2f3bSAndroid Build Coastguard Worker aidlConfigValue.nfaProprietaryCfg.protocolDual,
356*7eba2f3bSAndroid Build Coastguard Worker aidlConfigValue.nfaProprietaryCfg.protocol15693,
357*7eba2f3bSAndroid Build Coastguard Worker aidlConfigValue.nfaProprietaryCfg.protocolKovio,
358*7eba2f3bSAndroid Build Coastguard Worker aidlConfigValue.nfaProprietaryCfg.protocolMifare,
359*7eba2f3bSAndroid Build Coastguard Worker aidlConfigValue.nfaProprietaryCfg.discoveryPollKovio,
360*7eba2f3bSAndroid Build Coastguard Worker aidlConfigValue.nfaProprietaryCfg.discoveryPollBPrime,
361*7eba2f3bSAndroid Build Coastguard Worker aidlConfigValue.nfaProprietaryCfg.discoveryListenBPrime,
362*7eba2f3bSAndroid Build Coastguard Worker aidlConfigValue.nfaProprietaryCfg.protocolChineseId};
363*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_NFA_PROPRIETARY_CFG, ConfigValue(nfaPropCfg));
364*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_NFA_POLL_BAIL_OUT_MODE,
365*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(aidlConfigValue.nfaPollBailOutMode ? 1 : 0));
366*7eba2f3bSAndroid Build Coastguard Worker if (aidlConfigValue.offHostRouteUicc.size() != 0) {
367*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_OFFHOST_ROUTE_UICC,
368*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(aidlConfigValue.offHostRouteUicc));
369*7eba2f3bSAndroid Build Coastguard Worker }
370*7eba2f3bSAndroid Build Coastguard Worker if (aidlConfigValue.offHostRouteEse.size() != 0) {
371*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_OFFHOST_ROUTE_ESE,
372*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(aidlConfigValue.offHostRouteEse));
373*7eba2f3bSAndroid Build Coastguard Worker }
374*7eba2f3bSAndroid Build Coastguard Worker // AIDL byte would be int8_t in C++.
375*7eba2f3bSAndroid Build Coastguard Worker // Here we force cast int8_t to uint8_t for ConfigValue
376*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(
377*7eba2f3bSAndroid Build Coastguard Worker NAME_DEFAULT_OFFHOST_ROUTE,
378*7eba2f3bSAndroid Build Coastguard Worker ConfigValue((uint8_t)aidlConfigValue.defaultOffHostRoute));
379*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_DEFAULT_ROUTE,
380*7eba2f3bSAndroid Build Coastguard Worker ConfigValue((uint8_t)aidlConfigValue.defaultRoute));
381*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(
382*7eba2f3bSAndroid Build Coastguard Worker NAME_DEFAULT_NFCF_ROUTE,
383*7eba2f3bSAndroid Build Coastguard Worker ConfigValue((uint8_t)aidlConfigValue.defaultOffHostRouteFelica));
384*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_DEFAULT_ISODEP_ROUTE,
385*7eba2f3bSAndroid Build Coastguard Worker ConfigValue((uint8_t)aidlConfigValue.defaultIsoDepRoute));
386*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(
387*7eba2f3bSAndroid Build Coastguard Worker NAME_DEFAULT_SYS_CODE_ROUTE,
388*7eba2f3bSAndroid Build Coastguard Worker ConfigValue((uint8_t)aidlConfigValue.defaultSystemCodeRoute));
389*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(
390*7eba2f3bSAndroid Build Coastguard Worker NAME_DEFAULT_SYS_CODE_PWR_STATE,
391*7eba2f3bSAndroid Build Coastguard Worker ConfigValue((uint8_t)aidlConfigValue.defaultSystemCodePowerState));
392*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_OFF_HOST_SIM_PIPE_ID,
393*7eba2f3bSAndroid Build Coastguard Worker ConfigValue((uint8_t)aidlConfigValue.offHostSIMPipeId));
394*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_OFF_HOST_ESE_PIPE_ID,
395*7eba2f3bSAndroid Build Coastguard Worker ConfigValue((uint8_t)aidlConfigValue.offHostESEPipeId));
396*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_T4T_NFCEE_ENABLE,
397*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(aidlConfigValue.t4tNfceeEnable ? 1 : 0));
398*7eba2f3bSAndroid Build Coastguard Worker
399*7eba2f3bSAndroid Build Coastguard Worker if (aidlConfigValue.offHostSimPipeIds.size() != 0) {
400*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_OFF_HOST_SIM_PIPE_IDS,
401*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(aidlConfigValue.offHostSimPipeIds));
402*7eba2f3bSAndroid Build Coastguard Worker }
403*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_ISO_DEP_MAX_TRANSCEIVE,
404*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(aidlConfigValue.maxIsoDepTransceiveLength));
405*7eba2f3bSAndroid Build Coastguard Worker if (aidlConfigValue.hostAllowlist.size() != 0) {
406*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_DEVICE_HOST_ALLOW_LIST,
407*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(aidlConfigValue.hostAllowlist));
408*7eba2f3bSAndroid Build Coastguard Worker }
409*7eba2f3bSAndroid Build Coastguard Worker /* For Backwards compatibility */
410*7eba2f3bSAndroid Build Coastguard Worker if (aidlConfigValue.presenceCheckAlgorithm ==
411*7eba2f3bSAndroid Build Coastguard Worker AidlPresenceCheckAlgorithm::ISO_DEP_NAK) {
412*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_PRESENCE_CHECK_ALGORITHM,
413*7eba2f3bSAndroid Build Coastguard Worker ConfigValue((uint32_t)NFA_RW_PRES_CHK_ISO_DEP_NAK));
414*7eba2f3bSAndroid Build Coastguard Worker } else {
415*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(
416*7eba2f3bSAndroid Build Coastguard Worker NAME_PRESENCE_CHECK_ALGORITHM,
417*7eba2f3bSAndroid Build Coastguard Worker ConfigValue((uint32_t)aidlConfigValue.presenceCheckAlgorithm));
418*7eba2f3bSAndroid Build Coastguard Worker }
419*7eba2f3bSAndroid Build Coastguard Worker } else if (mHal_1_1 || mHal_1_2) {
420*7eba2f3bSAndroid Build Coastguard Worker std::vector<uint8_t> nfaPropCfg = {
421*7eba2f3bSAndroid Build Coastguard Worker configValue.v1_1.nfaProprietaryCfg.protocol18092Active,
422*7eba2f3bSAndroid Build Coastguard Worker configValue.v1_1.nfaProprietaryCfg.protocolBPrime,
423*7eba2f3bSAndroid Build Coastguard Worker configValue.v1_1.nfaProprietaryCfg.protocolDual,
424*7eba2f3bSAndroid Build Coastguard Worker configValue.v1_1.nfaProprietaryCfg.protocol15693,
425*7eba2f3bSAndroid Build Coastguard Worker configValue.v1_1.nfaProprietaryCfg.protocolKovio,
426*7eba2f3bSAndroid Build Coastguard Worker configValue.v1_1.nfaProprietaryCfg.protocolMifare,
427*7eba2f3bSAndroid Build Coastguard Worker configValue.v1_1.nfaProprietaryCfg.discoveryPollKovio,
428*7eba2f3bSAndroid Build Coastguard Worker configValue.v1_1.nfaProprietaryCfg.discoveryPollBPrime,
429*7eba2f3bSAndroid Build Coastguard Worker configValue.v1_1.nfaProprietaryCfg.discoveryListenBPrime};
430*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_NFA_PROPRIETARY_CFG, ConfigValue(nfaPropCfg));
431*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_NFA_POLL_BAIL_OUT_MODE,
432*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(configValue.v1_1.nfaPollBailOutMode ? 1 : 0));
433*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_DEFAULT_OFFHOST_ROUTE,
434*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(configValue.v1_1.defaultOffHostRoute));
435*7eba2f3bSAndroid Build Coastguard Worker if (configValue.offHostRouteUicc.size() != 0) {
436*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_OFFHOST_ROUTE_UICC,
437*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(configValue.offHostRouteUicc));
438*7eba2f3bSAndroid Build Coastguard Worker }
439*7eba2f3bSAndroid Build Coastguard Worker if (configValue.offHostRouteEse.size() != 0) {
440*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_OFFHOST_ROUTE_ESE,
441*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(configValue.offHostRouteEse));
442*7eba2f3bSAndroid Build Coastguard Worker }
443*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_DEFAULT_ROUTE,
444*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(configValue.v1_1.defaultRoute));
445*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_DEFAULT_NFCF_ROUTE,
446*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(configValue.v1_1.defaultOffHostRouteFelica));
447*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_DEFAULT_ISODEP_ROUTE,
448*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(configValue.defaultIsoDepRoute));
449*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_DEFAULT_SYS_CODE_ROUTE,
450*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(configValue.v1_1.defaultSystemCodeRoute));
451*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(
452*7eba2f3bSAndroid Build Coastguard Worker NAME_DEFAULT_SYS_CODE_PWR_STATE,
453*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(configValue.v1_1.defaultSystemCodePowerState));
454*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_OFF_HOST_SIM_PIPE_ID,
455*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(configValue.v1_1.offHostSIMPipeId));
456*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_OFF_HOST_ESE_PIPE_ID,
457*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(configValue.v1_1.offHostESEPipeId));
458*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_ISO_DEP_MAX_TRANSCEIVE,
459*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(configValue.v1_1.maxIsoDepTransceiveLength));
460*7eba2f3bSAndroid Build Coastguard Worker if (configValue.v1_1.hostWhitelist.size() != 0) {
461*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_DEVICE_HOST_ALLOW_LIST,
462*7eba2f3bSAndroid Build Coastguard Worker ConfigValue(configValue.v1_1.hostWhitelist));
463*7eba2f3bSAndroid Build Coastguard Worker }
464*7eba2f3bSAndroid Build Coastguard Worker /* For Backwards compatibility */
465*7eba2f3bSAndroid Build Coastguard Worker if (configValue.v1_1.presenceCheckAlgorithm ==
466*7eba2f3bSAndroid Build Coastguard Worker PresenceCheckAlgorithm::ISO_DEP_NAK) {
467*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(NAME_PRESENCE_CHECK_ALGORITHM,
468*7eba2f3bSAndroid Build Coastguard Worker ConfigValue((uint32_t)NFA_RW_PRES_CHK_ISO_DEP_NAK));
469*7eba2f3bSAndroid Build Coastguard Worker } else {
470*7eba2f3bSAndroid Build Coastguard Worker configMap.emplace(
471*7eba2f3bSAndroid Build Coastguard Worker NAME_PRESENCE_CHECK_ALGORITHM,
472*7eba2f3bSAndroid Build Coastguard Worker ConfigValue((uint32_t)configValue.v1_1.presenceCheckAlgorithm));
473*7eba2f3bSAndroid Build Coastguard Worker }
474*7eba2f3bSAndroid Build Coastguard Worker }
475*7eba2f3bSAndroid Build Coastguard Worker }
476*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
477*7eba2f3bSAndroid Build Coastguard Worker **
478*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::Initialize()
479*7eba2f3bSAndroid Build Coastguard Worker **
480*7eba2f3bSAndroid Build Coastguard Worker ** Description: class initializer
481*7eba2f3bSAndroid Build Coastguard Worker **
482*7eba2f3bSAndroid Build Coastguard Worker ** Returns: none
483*7eba2f3bSAndroid Build Coastguard Worker **
484*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
Initialize()485*7eba2f3bSAndroid Build Coastguard Worker void NfcAdaptation::Initialize() {
486*7eba2f3bSAndroid Build Coastguard Worker const char* func = "NfcAdaptation::Initialize";
487*7eba2f3bSAndroid Build Coastguard Worker // Init log tag
488*7eba2f3bSAndroid Build Coastguard Worker android::base::InitLogging(nullptr);
489*7eba2f3bSAndroid Build Coastguard Worker android::base::SetDefaultTag("libnfc_nci");
490*7eba2f3bSAndroid Build Coastguard Worker
491*7eba2f3bSAndroid Build Coastguard Worker initializeGlobalDebugEnabledFlag();
492*7eba2f3bSAndroid Build Coastguard Worker initializeNciResetTypeFlag();
493*7eba2f3bSAndroid Build Coastguard Worker initializeNfcMuteTechRouteOptionFlag();
494*7eba2f3bSAndroid Build Coastguard Worker
495*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: enter", func);
496*7eba2f3bSAndroid Build Coastguard Worker
497*7eba2f3bSAndroid Build Coastguard Worker nfc_storage_path = NfcConfig::getString(NAME_NFA_STORAGE, "/data/nfc");
498*7eba2f3bSAndroid Build Coastguard Worker
499*7eba2f3bSAndroid Build Coastguard Worker if (NfcConfig::hasKey(NAME_NFA_DM_CFG)) {
500*7eba2f3bSAndroid Build Coastguard Worker std::vector<uint8_t> dm_config = NfcConfig::getBytes(NAME_NFA_DM_CFG);
501*7eba2f3bSAndroid Build Coastguard Worker if (dm_config.size() > 0) nfa_dm_cfg.auto_detect_ndef = dm_config[0];
502*7eba2f3bSAndroid Build Coastguard Worker if (dm_config.size() > 1) nfa_dm_cfg.auto_read_ndef = dm_config[1];
503*7eba2f3bSAndroid Build Coastguard Worker if (dm_config.size() > 2) nfa_dm_cfg.auto_presence_check = dm_config[2];
504*7eba2f3bSAndroid Build Coastguard Worker if (dm_config.size() > 3) nfa_dm_cfg.presence_check_option = dm_config[3];
505*7eba2f3bSAndroid Build Coastguard Worker // NOTE: The timeout value is not configurable here because the endianness
506*7eba2f3bSAndroid Build Coastguard Worker // of a byte array is ambiguous and needlessly difficult to configure.
507*7eba2f3bSAndroid Build Coastguard Worker // If this value needs to be configurable, a numeric config option should
508*7eba2f3bSAndroid Build Coastguard Worker // be used.
509*7eba2f3bSAndroid Build Coastguard Worker }
510*7eba2f3bSAndroid Build Coastguard Worker
511*7eba2f3bSAndroid Build Coastguard Worker if (NfcConfig::hasKey(NAME_NFA_MAX_EE_SUPPORTED)) {
512*7eba2f3bSAndroid Build Coastguard Worker nfa_ee_max_ee_cfg = NfcConfig::getUnsigned(NAME_NFA_MAX_EE_SUPPORTED);
513*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf(
514*7eba2f3bSAndroid Build Coastguard Worker "%s: Overriding NFA_EE_MAX_EE_SUPPORTED to use %d", func,
515*7eba2f3bSAndroid Build Coastguard Worker nfa_ee_max_ee_cfg);
516*7eba2f3bSAndroid Build Coastguard Worker }
517*7eba2f3bSAndroid Build Coastguard Worker
518*7eba2f3bSAndroid Build Coastguard Worker if (NfcConfig::hasKey(NAME_NFA_POLL_BAIL_OUT_MODE)) {
519*7eba2f3bSAndroid Build Coastguard Worker nfa_poll_bail_out_mode =
520*7eba2f3bSAndroid Build Coastguard Worker NfcConfig::getUnsigned(NAME_NFA_POLL_BAIL_OUT_MODE);
521*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf(
522*7eba2f3bSAndroid Build Coastguard Worker "%s: Overriding NFA_POLL_BAIL_OUT_MODE to use %d", func,
523*7eba2f3bSAndroid Build Coastguard Worker nfa_poll_bail_out_mode);
524*7eba2f3bSAndroid Build Coastguard Worker }
525*7eba2f3bSAndroid Build Coastguard Worker
526*7eba2f3bSAndroid Build Coastguard Worker if (NfcConfig::hasKey(NAME_NFA_PROPRIETARY_CFG)) {
527*7eba2f3bSAndroid Build Coastguard Worker std::vector<uint8_t> p_config =
528*7eba2f3bSAndroid Build Coastguard Worker NfcConfig::getBytes(NAME_NFA_PROPRIETARY_CFG);
529*7eba2f3bSAndroid Build Coastguard Worker if (p_config.size() > 0)
530*7eba2f3bSAndroid Build Coastguard Worker nfa_proprietary_cfg.pro_protocol_18092_active = p_config[0];
531*7eba2f3bSAndroid Build Coastguard Worker if (p_config.size() > 1)
532*7eba2f3bSAndroid Build Coastguard Worker nfa_proprietary_cfg.pro_protocol_b_prime = p_config[1];
533*7eba2f3bSAndroid Build Coastguard Worker if (p_config.size() > 2)
534*7eba2f3bSAndroid Build Coastguard Worker nfa_proprietary_cfg.pro_protocol_dual = p_config[2];
535*7eba2f3bSAndroid Build Coastguard Worker if (p_config.size() > 3)
536*7eba2f3bSAndroid Build Coastguard Worker nfa_proprietary_cfg.pro_protocol_15693 = p_config[3];
537*7eba2f3bSAndroid Build Coastguard Worker if (p_config.size() > 4)
538*7eba2f3bSAndroid Build Coastguard Worker nfa_proprietary_cfg.pro_protocol_kovio = p_config[4];
539*7eba2f3bSAndroid Build Coastguard Worker if (p_config.size() > 5) nfa_proprietary_cfg.pro_protocol_mfc = p_config[5];
540*7eba2f3bSAndroid Build Coastguard Worker if (p_config.size() > 6)
541*7eba2f3bSAndroid Build Coastguard Worker nfa_proprietary_cfg.pro_discovery_kovio_poll = p_config[6];
542*7eba2f3bSAndroid Build Coastguard Worker if (p_config.size() > 7)
543*7eba2f3bSAndroid Build Coastguard Worker nfa_proprietary_cfg.pro_discovery_b_prime_poll = p_config[7];
544*7eba2f3bSAndroid Build Coastguard Worker if (p_config.size() > 8)
545*7eba2f3bSAndroid Build Coastguard Worker nfa_proprietary_cfg.pro_discovery_b_prime_listen = p_config[8];
546*7eba2f3bSAndroid Build Coastguard Worker if (p_config.size() > 9)
547*7eba2f3bSAndroid Build Coastguard Worker nfa_proprietary_cfg.pro_protocol_chinese_id = p_config[9];
548*7eba2f3bSAndroid Build Coastguard Worker }
549*7eba2f3bSAndroid Build Coastguard Worker
550*7eba2f3bSAndroid Build Coastguard Worker // Configure allowlist of HCI host ID's
551*7eba2f3bSAndroid Build Coastguard Worker // See specification: ETSI TS 102 622, section 6.1.3.1
552*7eba2f3bSAndroid Build Coastguard Worker if (NfcConfig::hasKey(NAME_DEVICE_HOST_ALLOW_LIST)) {
553*7eba2f3bSAndroid Build Coastguard Worker host_allowlist = NfcConfig::getBytes(NAME_DEVICE_HOST_ALLOW_LIST);
554*7eba2f3bSAndroid Build Coastguard Worker nfa_hci_cfg.num_allowlist_host = host_allowlist.size();
555*7eba2f3bSAndroid Build Coastguard Worker nfa_hci_cfg.p_allowlist = &host_allowlist[0];
556*7eba2f3bSAndroid Build Coastguard Worker }
557*7eba2f3bSAndroid Build Coastguard Worker
558*7eba2f3bSAndroid Build Coastguard Worker if (NfcConfig::hasKey(NAME_ISO15693_SKIP_GET_SYS_INFO_CMD)) {
559*7eba2f3bSAndroid Build Coastguard Worker t5t_mute_legacy =
560*7eba2f3bSAndroid Build Coastguard Worker NfcConfig::getUnsigned(NAME_ISO15693_SKIP_GET_SYS_INFO_CMD);
561*7eba2f3bSAndroid Build Coastguard Worker }
562*7eba2f3bSAndroid Build Coastguard Worker
563*7eba2f3bSAndroid Build Coastguard Worker if (NfcConfig::hasKey(NAME_NFA_DM_LISTEN_ACTIVE_DEACT_NTF_TIMEOUT)) {
564*7eba2f3bSAndroid Build Coastguard Worker unsigned int value =
565*7eba2f3bSAndroid Build Coastguard Worker NfcConfig::getUnsigned(NAME_NFA_DM_LISTEN_ACTIVE_DEACT_NTF_TIMEOUT);
566*7eba2f3bSAndroid Build Coastguard Worker if (value > 0) {
567*7eba2f3bSAndroid Build Coastguard Worker nfa_dm_cfg.deact_ntf_listen_active_timeout = value * 1000;
568*7eba2f3bSAndroid Build Coastguard Worker }
569*7eba2f3bSAndroid Build Coastguard Worker }
570*7eba2f3bSAndroid Build Coastguard Worker
571*7eba2f3bSAndroid Build Coastguard Worker verify_stack_non_volatile_store();
572*7eba2f3bSAndroid Build Coastguard Worker if (NfcConfig::hasKey(NAME_PRESERVE_STORAGE) &&
573*7eba2f3bSAndroid Build Coastguard Worker NfcConfig::getUnsigned(NAME_PRESERVE_STORAGE) == 1) {
574*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: preserve stack NV store", __func__);
575*7eba2f3bSAndroid Build Coastguard Worker } else {
576*7eba2f3bSAndroid Build Coastguard Worker delete_stack_non_volatile_store(FALSE);
577*7eba2f3bSAndroid Build Coastguard Worker }
578*7eba2f3bSAndroid Build Coastguard Worker
579*7eba2f3bSAndroid Build Coastguard Worker GKI_init();
580*7eba2f3bSAndroid Build Coastguard Worker GKI_enable();
581*7eba2f3bSAndroid Build Coastguard Worker GKI_create_task((TASKPTR)NFCA_TASK, BTU_TASK, (int8_t*)"NFCA_TASK", nullptr, 0,
582*7eba2f3bSAndroid Build Coastguard Worker (pthread_cond_t*)nullptr, nullptr);
583*7eba2f3bSAndroid Build Coastguard Worker {
584*7eba2f3bSAndroid Build Coastguard Worker AutoThreadMutex guard(mCondVar);
585*7eba2f3bSAndroid Build Coastguard Worker GKI_create_task((TASKPTR)Thread, MMI_TASK, (int8_t*)"NFCA_THREAD", nullptr, 0,
586*7eba2f3bSAndroid Build Coastguard Worker (pthread_cond_t*)nullptr, nullptr);
587*7eba2f3bSAndroid Build Coastguard Worker mCondVar.wait();
588*7eba2f3bSAndroid Build Coastguard Worker }
589*7eba2f3bSAndroid Build Coastguard Worker
590*7eba2f3bSAndroid Build Coastguard Worker debug_nfcsnoop_init();
591*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: exit", func);
592*7eba2f3bSAndroid Build Coastguard Worker }
593*7eba2f3bSAndroid Build Coastguard Worker
594*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
595*7eba2f3bSAndroid Build Coastguard Worker **
596*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::Finalize()
597*7eba2f3bSAndroid Build Coastguard Worker **
598*7eba2f3bSAndroid Build Coastguard Worker ** Description: class finalizer
599*7eba2f3bSAndroid Build Coastguard Worker **
600*7eba2f3bSAndroid Build Coastguard Worker ** Returns: none
601*7eba2f3bSAndroid Build Coastguard Worker **
602*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
Finalize()603*7eba2f3bSAndroid Build Coastguard Worker void NfcAdaptation::Finalize() {
604*7eba2f3bSAndroid Build Coastguard Worker const char* func = "NfcAdaptation::Finalize";
605*7eba2f3bSAndroid Build Coastguard Worker AutoThreadMutex a(sLock);
606*7eba2f3bSAndroid Build Coastguard Worker
607*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: enter", func);
608*7eba2f3bSAndroid Build Coastguard Worker GKI_shutdown();
609*7eba2f3bSAndroid Build Coastguard Worker
610*7eba2f3bSAndroid Build Coastguard Worker NfcConfig::clear();
611*7eba2f3bSAndroid Build Coastguard Worker
612*7eba2f3bSAndroid Build Coastguard Worker if (mAidlHal != nullptr) {
613*7eba2f3bSAndroid Build Coastguard Worker AIBinder_unlinkToDeath(mAidlHal->asBinder().get(), mDeathRecipient.get(),
614*7eba2f3bSAndroid Build Coastguard Worker nullptr);
615*7eba2f3bSAndroid Build Coastguard Worker } else if (mHal != nullptr) {
616*7eba2f3bSAndroid Build Coastguard Worker mNfcHalDeathRecipient->finalize();
617*7eba2f3bSAndroid Build Coastguard Worker }
618*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: exit", func);
619*7eba2f3bSAndroid Build Coastguard Worker delete this;
620*7eba2f3bSAndroid Build Coastguard Worker }
621*7eba2f3bSAndroid Build Coastguard Worker
FactoryReset()622*7eba2f3bSAndroid Build Coastguard Worker void NfcAdaptation::FactoryReset() {
623*7eba2f3bSAndroid Build Coastguard Worker if (mAidlHal != nullptr) {
624*7eba2f3bSAndroid Build Coastguard Worker mAidlHal->factoryReset();
625*7eba2f3bSAndroid Build Coastguard Worker } else if (mHal_1_2 != nullptr) {
626*7eba2f3bSAndroid Build Coastguard Worker mHal_1_2->factoryReset();
627*7eba2f3bSAndroid Build Coastguard Worker } else if (mHal_1_1 != nullptr) {
628*7eba2f3bSAndroid Build Coastguard Worker mHal_1_1->factoryReset();
629*7eba2f3bSAndroid Build Coastguard Worker }
630*7eba2f3bSAndroid Build Coastguard Worker }
631*7eba2f3bSAndroid Build Coastguard Worker
DeviceShutdown()632*7eba2f3bSAndroid Build Coastguard Worker void NfcAdaptation::DeviceShutdown() {
633*7eba2f3bSAndroid Build Coastguard Worker if (mAidlHal != nullptr) {
634*7eba2f3bSAndroid Build Coastguard Worker mAidlHal->close(NfcCloseType::HOST_SWITCHED_OFF);
635*7eba2f3bSAndroid Build Coastguard Worker AIBinder_unlinkToDeath(mAidlHal->asBinder().get(), mDeathRecipient.get(),
636*7eba2f3bSAndroid Build Coastguard Worker nullptr);
637*7eba2f3bSAndroid Build Coastguard Worker mAidlHal = nullptr;
638*7eba2f3bSAndroid Build Coastguard Worker } else {
639*7eba2f3bSAndroid Build Coastguard Worker if (mHal_1_2 != nullptr) {
640*7eba2f3bSAndroid Build Coastguard Worker mHal_1_2->closeForPowerOffCase();
641*7eba2f3bSAndroid Build Coastguard Worker } else if (mHal_1_1 != nullptr) {
642*7eba2f3bSAndroid Build Coastguard Worker mHal_1_1->closeForPowerOffCase();
643*7eba2f3bSAndroid Build Coastguard Worker }
644*7eba2f3bSAndroid Build Coastguard Worker if (mHal != nullptr) {
645*7eba2f3bSAndroid Build Coastguard Worker mHal->unlinkToDeath(mNfcHalDeathRecipient);
646*7eba2f3bSAndroid Build Coastguard Worker }
647*7eba2f3bSAndroid Build Coastguard Worker }
648*7eba2f3bSAndroid Build Coastguard Worker }
649*7eba2f3bSAndroid Build Coastguard Worker
650*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
651*7eba2f3bSAndroid Build Coastguard Worker **
652*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::Dump
653*7eba2f3bSAndroid Build Coastguard Worker **
654*7eba2f3bSAndroid Build Coastguard Worker ** Description: Native support for dumpsys function.
655*7eba2f3bSAndroid Build Coastguard Worker **
656*7eba2f3bSAndroid Build Coastguard Worker ** Returns: None.
657*7eba2f3bSAndroid Build Coastguard Worker **
658*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
Dump(int fd)659*7eba2f3bSAndroid Build Coastguard Worker void NfcAdaptation::Dump(int fd) { debug_nfcsnoop_dump(fd); }
660*7eba2f3bSAndroid Build Coastguard Worker
661*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
662*7eba2f3bSAndroid Build Coastguard Worker **
663*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::signal()
664*7eba2f3bSAndroid Build Coastguard Worker **
665*7eba2f3bSAndroid Build Coastguard Worker ** Description: signal the CondVar to release the thread that is waiting
666*7eba2f3bSAndroid Build Coastguard Worker **
667*7eba2f3bSAndroid Build Coastguard Worker ** Returns: none
668*7eba2f3bSAndroid Build Coastguard Worker **
669*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
signal()670*7eba2f3bSAndroid Build Coastguard Worker void NfcAdaptation::signal() { mCondVar.signal(); }
671*7eba2f3bSAndroid Build Coastguard Worker
672*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
673*7eba2f3bSAndroid Build Coastguard Worker **
674*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::NFCA_TASK()
675*7eba2f3bSAndroid Build Coastguard Worker **
676*7eba2f3bSAndroid Build Coastguard Worker ** Description: NFCA_TASK runs the GKI main task
677*7eba2f3bSAndroid Build Coastguard Worker **
678*7eba2f3bSAndroid Build Coastguard Worker ** Returns: none
679*7eba2f3bSAndroid Build Coastguard Worker **
680*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
NFCA_TASK(uint32_t arg)681*7eba2f3bSAndroid Build Coastguard Worker uint32_t NfcAdaptation::NFCA_TASK(__attribute__((unused)) uint32_t arg) {
682*7eba2f3bSAndroid Build Coastguard Worker const char* func = "NfcAdaptation::NFCA_TASK";
683*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: enter", func);
684*7eba2f3bSAndroid Build Coastguard Worker GKI_run(nullptr);
685*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: exit", func);
686*7eba2f3bSAndroid Build Coastguard Worker return 0;
687*7eba2f3bSAndroid Build Coastguard Worker }
688*7eba2f3bSAndroid Build Coastguard Worker
689*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
690*7eba2f3bSAndroid Build Coastguard Worker **
691*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::Thread()
692*7eba2f3bSAndroid Build Coastguard Worker **
693*7eba2f3bSAndroid Build Coastguard Worker ** Description: Creates work threads
694*7eba2f3bSAndroid Build Coastguard Worker **
695*7eba2f3bSAndroid Build Coastguard Worker ** Returns: none
696*7eba2f3bSAndroid Build Coastguard Worker **
697*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
Thread(uint32_t arg)698*7eba2f3bSAndroid Build Coastguard Worker uint32_t NfcAdaptation::Thread(__attribute__((unused)) uint32_t arg) {
699*7eba2f3bSAndroid Build Coastguard Worker const char* func = "NfcAdaptation::Thread";
700*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: enter", func);
701*7eba2f3bSAndroid Build Coastguard Worker
702*7eba2f3bSAndroid Build Coastguard Worker {
703*7eba2f3bSAndroid Build Coastguard Worker ThreadCondVar CondVar;
704*7eba2f3bSAndroid Build Coastguard Worker AutoThreadMutex guard(CondVar);
705*7eba2f3bSAndroid Build Coastguard Worker GKI_create_task((TASKPTR)nfc_task, NFC_TASK, (int8_t*)"NFC_TASK", nullptr, 0,
706*7eba2f3bSAndroid Build Coastguard Worker (pthread_cond_t*)CondVar, (pthread_mutex_t*)CondVar);
707*7eba2f3bSAndroid Build Coastguard Worker CondVar.wait();
708*7eba2f3bSAndroid Build Coastguard Worker }
709*7eba2f3bSAndroid Build Coastguard Worker
710*7eba2f3bSAndroid Build Coastguard Worker NfcAdaptation::GetInstance().signal();
711*7eba2f3bSAndroid Build Coastguard Worker
712*7eba2f3bSAndroid Build Coastguard Worker GKI_exit_task(GKI_get_taskid());
713*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: exit", func);
714*7eba2f3bSAndroid Build Coastguard Worker return 0;
715*7eba2f3bSAndroid Build Coastguard Worker }
716*7eba2f3bSAndroid Build Coastguard Worker
717*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
718*7eba2f3bSAndroid Build Coastguard Worker **
719*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::GetHalEntryFuncs()
720*7eba2f3bSAndroid Build Coastguard Worker **
721*7eba2f3bSAndroid Build Coastguard Worker ** Description: Get the set of HAL entry points.
722*7eba2f3bSAndroid Build Coastguard Worker **
723*7eba2f3bSAndroid Build Coastguard Worker ** Returns: Functions pointers for HAL entry points.
724*7eba2f3bSAndroid Build Coastguard Worker **
725*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GetHalEntryFuncs()726*7eba2f3bSAndroid Build Coastguard Worker tHAL_NFC_ENTRY* NfcAdaptation::GetHalEntryFuncs() { return &mHalEntryFuncs; }
727*7eba2f3bSAndroid Build Coastguard Worker
728*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
729*7eba2f3bSAndroid Build Coastguard Worker **
730*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::InitializeHalDeviceContext
731*7eba2f3bSAndroid Build Coastguard Worker **
732*7eba2f3bSAndroid Build Coastguard Worker ** Description: Check validity of current handle to the nfc HAL service
733*7eba2f3bSAndroid Build Coastguard Worker **
734*7eba2f3bSAndroid Build Coastguard Worker ** Returns: None.
735*7eba2f3bSAndroid Build Coastguard Worker **
736*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
InitializeHalDeviceContext()737*7eba2f3bSAndroid Build Coastguard Worker void NfcAdaptation::InitializeHalDeviceContext() {
738*7eba2f3bSAndroid Build Coastguard Worker const char* func = "NfcAdaptation::InitializeHalDeviceContext";
739*7eba2f3bSAndroid Build Coastguard Worker
740*7eba2f3bSAndroid Build Coastguard Worker mHalEntryFuncs.initialize = HalInitialize;
741*7eba2f3bSAndroid Build Coastguard Worker mHalEntryFuncs.terminate = HalTerminate;
742*7eba2f3bSAndroid Build Coastguard Worker mHalEntryFuncs.open = HalOpen;
743*7eba2f3bSAndroid Build Coastguard Worker mHalEntryFuncs.close = HalClose;
744*7eba2f3bSAndroid Build Coastguard Worker mHalEntryFuncs.core_initialized = HalCoreInitialized;
745*7eba2f3bSAndroid Build Coastguard Worker mHalEntryFuncs.write = HalWrite;
746*7eba2f3bSAndroid Build Coastguard Worker mHalEntryFuncs.prediscover = HalPrediscover;
747*7eba2f3bSAndroid Build Coastguard Worker mHalEntryFuncs.control_granted = HalControlGranted;
748*7eba2f3bSAndroid Build Coastguard Worker mHalEntryFuncs.power_cycle = HalPowerCycle;
749*7eba2f3bSAndroid Build Coastguard Worker mHalEntryFuncs.get_max_ee = HalGetMaxNfcee;
750*7eba2f3bSAndroid Build Coastguard Worker LOG(INFO) << StringPrintf("%s: INfc::getService()", func);
751*7eba2f3bSAndroid Build Coastguard Worker mAidlHal = nullptr;
752*7eba2f3bSAndroid Build Coastguard Worker mHal = mHal_1_1 = mHal_1_2 = nullptr;
753*7eba2f3bSAndroid Build Coastguard Worker if (!use_aidl) {
754*7eba2f3bSAndroid Build Coastguard Worker mHal = mHal_1_1 = mHal_1_2 = INfcV1_2::getService();
755*7eba2f3bSAndroid Build Coastguard Worker }
756*7eba2f3bSAndroid Build Coastguard Worker if (!use_aidl && mHal_1_2 == nullptr) {
757*7eba2f3bSAndroid Build Coastguard Worker mHal = mHal_1_1 = INfcV1_1::getService();
758*7eba2f3bSAndroid Build Coastguard Worker if (mHal_1_1 == nullptr) {
759*7eba2f3bSAndroid Build Coastguard Worker mHal = INfc::getService();
760*7eba2f3bSAndroid Build Coastguard Worker }
761*7eba2f3bSAndroid Build Coastguard Worker }
762*7eba2f3bSAndroid Build Coastguard Worker if (mHal == nullptr) {
763*7eba2f3bSAndroid Build Coastguard Worker // Try get AIDL
764*7eba2f3bSAndroid Build Coastguard Worker ::ndk::SpAIBinder binder(
765*7eba2f3bSAndroid Build Coastguard Worker AServiceManager_waitForService(NFC_AIDL_HAL_SERVICE_NAME.c_str()));
766*7eba2f3bSAndroid Build Coastguard Worker mAidlHal = INfcAidl::fromBinder(binder);
767*7eba2f3bSAndroid Build Coastguard Worker if (mAidlHal != nullptr) {
768*7eba2f3bSAndroid Build Coastguard Worker use_aidl = true;
769*7eba2f3bSAndroid Build Coastguard Worker AIBinder_linkToDeath(mAidlHal->asBinder().get(), mDeathRecipient.get(),
770*7eba2f3bSAndroid Build Coastguard Worker nullptr /* cookie */);
771*7eba2f3bSAndroid Build Coastguard Worker mHal = mHal_1_1 = mHal_1_2 = nullptr;
772*7eba2f3bSAndroid Build Coastguard Worker mAidlHal->getInterfaceVersion(&mAidlHalVer);
773*7eba2f3bSAndroid Build Coastguard Worker LOG(INFO) << StringPrintf("%s: INfcAidl::fromBinder returned ver(%d)",
774*7eba2f3bSAndroid Build Coastguard Worker func, mAidlHalVer);
775*7eba2f3bSAndroid Build Coastguard Worker }
776*7eba2f3bSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL_IF(mAidlHal == nullptr,
777*7eba2f3bSAndroid Build Coastguard Worker "Failed to retrieve the NFC AIDL!");
778*7eba2f3bSAndroid Build Coastguard Worker } else {
779*7eba2f3bSAndroid Build Coastguard Worker LOG(INFO) << StringPrintf("%s: INfc::getService() returned %p (%s)", func,
780*7eba2f3bSAndroid Build Coastguard Worker mHal.get(),
781*7eba2f3bSAndroid Build Coastguard Worker (mHal->isRemote() ? "remote" : "local"));
782*7eba2f3bSAndroid Build Coastguard Worker mNfcHalDeathRecipient = new NfcHalDeathRecipient(mHal);
783*7eba2f3bSAndroid Build Coastguard Worker mHal->linkToDeath(mNfcHalDeathRecipient, 0);
784*7eba2f3bSAndroid Build Coastguard Worker }
785*7eba2f3bSAndroid Build Coastguard Worker }
786*7eba2f3bSAndroid Build Coastguard Worker
787*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
788*7eba2f3bSAndroid Build Coastguard Worker **
789*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::HalInitialize
790*7eba2f3bSAndroid Build Coastguard Worker **
791*7eba2f3bSAndroid Build Coastguard Worker ** Description: Not implemented because this function is only needed
792*7eba2f3bSAndroid Build Coastguard Worker ** within the HAL.
793*7eba2f3bSAndroid Build Coastguard Worker **
794*7eba2f3bSAndroid Build Coastguard Worker ** Returns: None.
795*7eba2f3bSAndroid Build Coastguard Worker **
796*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
HalInitialize()797*7eba2f3bSAndroid Build Coastguard Worker void NfcAdaptation::HalInitialize() {
798*7eba2f3bSAndroid Build Coastguard Worker const char* func = "NfcAdaptation::HalInitialize";
799*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s", func);
800*7eba2f3bSAndroid Build Coastguard Worker }
801*7eba2f3bSAndroid Build Coastguard Worker
802*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
803*7eba2f3bSAndroid Build Coastguard Worker **
804*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::HalTerminate
805*7eba2f3bSAndroid Build Coastguard Worker **
806*7eba2f3bSAndroid Build Coastguard Worker ** Description: Not implemented because this function is only needed
807*7eba2f3bSAndroid Build Coastguard Worker ** within the HAL.
808*7eba2f3bSAndroid Build Coastguard Worker **
809*7eba2f3bSAndroid Build Coastguard Worker ** Returns: None.
810*7eba2f3bSAndroid Build Coastguard Worker **
811*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
HalTerminate()812*7eba2f3bSAndroid Build Coastguard Worker void NfcAdaptation::HalTerminate() {
813*7eba2f3bSAndroid Build Coastguard Worker const char* func = "NfcAdaptation::HalTerminate";
814*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s", func);
815*7eba2f3bSAndroid Build Coastguard Worker }
816*7eba2f3bSAndroid Build Coastguard Worker
817*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
818*7eba2f3bSAndroid Build Coastguard Worker **
819*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::HalOpen
820*7eba2f3bSAndroid Build Coastguard Worker **
821*7eba2f3bSAndroid Build Coastguard Worker ** Description: Turn on controller, download firmware.
822*7eba2f3bSAndroid Build Coastguard Worker **
823*7eba2f3bSAndroid Build Coastguard Worker ** Returns: None.
824*7eba2f3bSAndroid Build Coastguard Worker **
825*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
HalOpen(tHAL_NFC_CBACK * p_hal_cback,tHAL_NFC_DATA_CBACK * p_data_cback)826*7eba2f3bSAndroid Build Coastguard Worker void NfcAdaptation::HalOpen(tHAL_NFC_CBACK* p_hal_cback,
827*7eba2f3bSAndroid Build Coastguard Worker tHAL_NFC_DATA_CBACK* p_data_cback) {
828*7eba2f3bSAndroid Build Coastguard Worker const char* func = "NfcAdaptation::HalOpen";
829*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s", func);
830*7eba2f3bSAndroid Build Coastguard Worker
831*7eba2f3bSAndroid Build Coastguard Worker if (mAidlHal != nullptr) {
832*7eba2f3bSAndroid Build Coastguard Worker mAidlCallback = ::ndk::SharedRefBase::make<NfcAidlClientCallback>(
833*7eba2f3bSAndroid Build Coastguard Worker p_hal_cback, p_data_cback);
834*7eba2f3bSAndroid Build Coastguard Worker Status status = mAidlHal->open(mAidlCallback);
835*7eba2f3bSAndroid Build Coastguard Worker if (!status.isOk()) {
836*7eba2f3bSAndroid Build Coastguard Worker LOG(ERROR) << "Open Error: "
837*7eba2f3bSAndroid Build Coastguard Worker << ::aidl::android::hardware::nfc::toString(
838*7eba2f3bSAndroid Build Coastguard Worker static_cast<NfcAidlStatus>(
839*7eba2f3bSAndroid Build Coastguard Worker status.getServiceSpecificError()));
840*7eba2f3bSAndroid Build Coastguard Worker } else {
841*7eba2f3bSAndroid Build Coastguard Worker bool verbose_vendor_log =
842*7eba2f3bSAndroid Build Coastguard Worker android::base::GetBoolProperty(VERBOSE_VENDOR_LOG_PROPERTY, false);
843*7eba2f3bSAndroid Build Coastguard Worker mAidlHal->setEnableVerboseLogging(verbose_vendor_log);
844*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: verbose_vendor_log=%u", __func__,
845*7eba2f3bSAndroid Build Coastguard Worker verbose_vendor_log);
846*7eba2f3bSAndroid Build Coastguard Worker }
847*7eba2f3bSAndroid Build Coastguard Worker } else if (mHal_1_1 != nullptr) {
848*7eba2f3bSAndroid Build Coastguard Worker mCallback = new NfcClientCallback(p_hal_cback, p_data_cback);
849*7eba2f3bSAndroid Build Coastguard Worker mHal_1_1->open_1_1(mCallback);
850*7eba2f3bSAndroid Build Coastguard Worker } else if (mHal != nullptr) {
851*7eba2f3bSAndroid Build Coastguard Worker mCallback = new NfcClientCallback(p_hal_cback, p_data_cback);
852*7eba2f3bSAndroid Build Coastguard Worker mHal->open(mCallback);
853*7eba2f3bSAndroid Build Coastguard Worker }
854*7eba2f3bSAndroid Build Coastguard Worker }
855*7eba2f3bSAndroid Build Coastguard Worker
856*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
857*7eba2f3bSAndroid Build Coastguard Worker **
858*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::HalClose
859*7eba2f3bSAndroid Build Coastguard Worker **
860*7eba2f3bSAndroid Build Coastguard Worker ** Description: Turn off controller.
861*7eba2f3bSAndroid Build Coastguard Worker **
862*7eba2f3bSAndroid Build Coastguard Worker ** Returns: None.
863*7eba2f3bSAndroid Build Coastguard Worker **
864*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
HalClose()865*7eba2f3bSAndroid Build Coastguard Worker void NfcAdaptation::HalClose() {
866*7eba2f3bSAndroid Build Coastguard Worker const char* func = "NfcAdaptation::HalClose";
867*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s", func);
868*7eba2f3bSAndroid Build Coastguard Worker if (mAidlHal != nullptr) {
869*7eba2f3bSAndroid Build Coastguard Worker mAidlHal->close(NfcCloseType::DISABLE);
870*7eba2f3bSAndroid Build Coastguard Worker } else if (mHal != nullptr) {
871*7eba2f3bSAndroid Build Coastguard Worker mHal->close();
872*7eba2f3bSAndroid Build Coastguard Worker }
873*7eba2f3bSAndroid Build Coastguard Worker }
874*7eba2f3bSAndroid Build Coastguard Worker
875*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
876*7eba2f3bSAndroid Build Coastguard Worker **
877*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::HalWrite
878*7eba2f3bSAndroid Build Coastguard Worker **
879*7eba2f3bSAndroid Build Coastguard Worker ** Description: Write NCI message to the controller.
880*7eba2f3bSAndroid Build Coastguard Worker **
881*7eba2f3bSAndroid Build Coastguard Worker ** Returns: None.
882*7eba2f3bSAndroid Build Coastguard Worker **
883*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
HalWrite(uint16_t data_len,uint8_t * p_data)884*7eba2f3bSAndroid Build Coastguard Worker void NfcAdaptation::HalWrite(uint16_t data_len, uint8_t* p_data) {
885*7eba2f3bSAndroid Build Coastguard Worker const char* func = "NfcAdaptation::HalWrite";
886*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s", func);
887*7eba2f3bSAndroid Build Coastguard Worker
888*7eba2f3bSAndroid Build Coastguard Worker if (mAidlHal != nullptr) {
889*7eba2f3bSAndroid Build Coastguard Worker int ret;
890*7eba2f3bSAndroid Build Coastguard Worker std::vector<uint8_t> aidl_data(p_data, p_data + data_len);
891*7eba2f3bSAndroid Build Coastguard Worker mAidlHal->write(aidl_data, &ret);
892*7eba2f3bSAndroid Build Coastguard Worker } else if (mHal != nullptr) {
893*7eba2f3bSAndroid Build Coastguard Worker ::android::hardware::nfc::V1_0::NfcData data;
894*7eba2f3bSAndroid Build Coastguard Worker data.setToExternal(p_data, data_len);
895*7eba2f3bSAndroid Build Coastguard Worker mHal->write(data);
896*7eba2f3bSAndroid Build Coastguard Worker }
897*7eba2f3bSAndroid Build Coastguard Worker }
898*7eba2f3bSAndroid Build Coastguard Worker
899*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
900*7eba2f3bSAndroid Build Coastguard Worker **
901*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::HalCoreInitialized
902*7eba2f3bSAndroid Build Coastguard Worker **
903*7eba2f3bSAndroid Build Coastguard Worker ** Description: Adjust the configurable parameters in the controller.
904*7eba2f3bSAndroid Build Coastguard Worker **
905*7eba2f3bSAndroid Build Coastguard Worker ** Returns: None.
906*7eba2f3bSAndroid Build Coastguard Worker **
907*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
HalCoreInitialized(uint16_t data_len,uint8_t * p_core_init_rsp_params)908*7eba2f3bSAndroid Build Coastguard Worker void NfcAdaptation::HalCoreInitialized(uint16_t data_len,
909*7eba2f3bSAndroid Build Coastguard Worker uint8_t* p_core_init_rsp_params) {
910*7eba2f3bSAndroid Build Coastguard Worker const char* func = "NfcAdaptation::HalCoreInitialized";
911*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s", func);
912*7eba2f3bSAndroid Build Coastguard Worker if (mAidlHal != nullptr) {
913*7eba2f3bSAndroid Build Coastguard Worker // AIDL coreInitialized doesn't send data to HAL.
914*7eba2f3bSAndroid Build Coastguard Worker mAidlHal->coreInitialized();
915*7eba2f3bSAndroid Build Coastguard Worker } else if (mHal != nullptr) {
916*7eba2f3bSAndroid Build Coastguard Worker hidl_vec<uint8_t> data;
917*7eba2f3bSAndroid Build Coastguard Worker data.setToExternal(p_core_init_rsp_params, data_len);
918*7eba2f3bSAndroid Build Coastguard Worker mHal->coreInitialized(data);
919*7eba2f3bSAndroid Build Coastguard Worker }
920*7eba2f3bSAndroid Build Coastguard Worker }
921*7eba2f3bSAndroid Build Coastguard Worker
922*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
923*7eba2f3bSAndroid Build Coastguard Worker **
924*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::HalPrediscover
925*7eba2f3bSAndroid Build Coastguard Worker **
926*7eba2f3bSAndroid Build Coastguard Worker ** Description: Perform any vendor-specific pre-discovery actions (if
927*7eba2f3bSAndroid Build Coastguard Worker ** needed) If any actions were performed TRUE will be returned,
928*7eba2f3bSAndroid Build Coastguard Worker ** and HAL_PRE_DISCOVER_CPLT_EVT will notify when actions are
929*7eba2f3bSAndroid Build Coastguard Worker ** completed.
930*7eba2f3bSAndroid Build Coastguard Worker **
931*7eba2f3bSAndroid Build Coastguard Worker ** Returns: TRUE if vendor-specific pre-discovery actions initialized
932*7eba2f3bSAndroid Build Coastguard Worker ** FALSE if no vendor-specific pre-discovery actions are
933*7eba2f3bSAndroid Build Coastguard Worker ** needed.
934*7eba2f3bSAndroid Build Coastguard Worker **
935*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
HalPrediscover()936*7eba2f3bSAndroid Build Coastguard Worker bool NfcAdaptation::HalPrediscover() {
937*7eba2f3bSAndroid Build Coastguard Worker const char* func = "NfcAdaptation::HalPrediscover";
938*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s", func);
939*7eba2f3bSAndroid Build Coastguard Worker if (mAidlHal != nullptr) {
940*7eba2f3bSAndroid Build Coastguard Worker Status status = mAidlHal->preDiscover();
941*7eba2f3bSAndroid Build Coastguard Worker if (status.isOk()) {
942*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s wait for NFC_PRE_DISCOVER_CPLT_EVT", func);
943*7eba2f3bSAndroid Build Coastguard Worker return true;
944*7eba2f3bSAndroid Build Coastguard Worker }
945*7eba2f3bSAndroid Build Coastguard Worker } else if (mHal != nullptr) {
946*7eba2f3bSAndroid Build Coastguard Worker mHal->prediscover();
947*7eba2f3bSAndroid Build Coastguard Worker }
948*7eba2f3bSAndroid Build Coastguard Worker
949*7eba2f3bSAndroid Build Coastguard Worker return false;
950*7eba2f3bSAndroid Build Coastguard Worker }
951*7eba2f3bSAndroid Build Coastguard Worker
952*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
953*7eba2f3bSAndroid Build Coastguard Worker **
954*7eba2f3bSAndroid Build Coastguard Worker ** Function: HAL_NfcControlGranted
955*7eba2f3bSAndroid Build Coastguard Worker **
956*7eba2f3bSAndroid Build Coastguard Worker ** Description: Grant control to HAL control for sending NCI commands.
957*7eba2f3bSAndroid Build Coastguard Worker ** Call in response to HAL_REQUEST_CONTROL_EVT.
958*7eba2f3bSAndroid Build Coastguard Worker ** Must only be called when there are no NCI commands pending.
959*7eba2f3bSAndroid Build Coastguard Worker ** HAL_RELEASE_CONTROL_EVT will notify when HAL no longer
960*7eba2f3bSAndroid Build Coastguard Worker ** needs control of NCI.
961*7eba2f3bSAndroid Build Coastguard Worker **
962*7eba2f3bSAndroid Build Coastguard Worker ** Returns: void
963*7eba2f3bSAndroid Build Coastguard Worker **
964*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
HalControlGranted()965*7eba2f3bSAndroid Build Coastguard Worker void NfcAdaptation::HalControlGranted() {
966*7eba2f3bSAndroid Build Coastguard Worker const char* func = "NfcAdaptation::HalControlGranted";
967*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s", func);
968*7eba2f3bSAndroid Build Coastguard Worker if (mAidlHal != nullptr) {
969*7eba2f3bSAndroid Build Coastguard Worker if (mAidlHalVer > 1) {
970*7eba2f3bSAndroid Build Coastguard Worker NfcAidlStatus aidl_status;
971*7eba2f3bSAndroid Build Coastguard Worker mAidlHal->controlGranted(&aidl_status);
972*7eba2f3bSAndroid Build Coastguard Worker } else {
973*7eba2f3bSAndroid Build Coastguard Worker LOG(ERROR) << StringPrintf("Unsupported function %s", func);
974*7eba2f3bSAndroid Build Coastguard Worker }
975*7eba2f3bSAndroid Build Coastguard Worker } else if (mHal != nullptr) {
976*7eba2f3bSAndroid Build Coastguard Worker mHal->controlGranted();
977*7eba2f3bSAndroid Build Coastguard Worker }
978*7eba2f3bSAndroid Build Coastguard Worker }
979*7eba2f3bSAndroid Build Coastguard Worker
980*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
981*7eba2f3bSAndroid Build Coastguard Worker **
982*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::HalPowerCycle
983*7eba2f3bSAndroid Build Coastguard Worker **
984*7eba2f3bSAndroid Build Coastguard Worker ** Description: Turn off and turn on the controller.
985*7eba2f3bSAndroid Build Coastguard Worker **
986*7eba2f3bSAndroid Build Coastguard Worker ** Returns: None.
987*7eba2f3bSAndroid Build Coastguard Worker **
988*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
HalPowerCycle()989*7eba2f3bSAndroid Build Coastguard Worker void NfcAdaptation::HalPowerCycle() {
990*7eba2f3bSAndroid Build Coastguard Worker const char* func = "NfcAdaptation::HalPowerCycle";
991*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s", func);
992*7eba2f3bSAndroid Build Coastguard Worker if (mAidlHal != nullptr) {
993*7eba2f3bSAndroid Build Coastguard Worker mAidlHal->powerCycle();
994*7eba2f3bSAndroid Build Coastguard Worker } else if (mHal != nullptr) {
995*7eba2f3bSAndroid Build Coastguard Worker mHal->powerCycle();
996*7eba2f3bSAndroid Build Coastguard Worker }
997*7eba2f3bSAndroid Build Coastguard Worker }
998*7eba2f3bSAndroid Build Coastguard Worker
999*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1000*7eba2f3bSAndroid Build Coastguard Worker **
1001*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::HalGetMaxNfcee
1002*7eba2f3bSAndroid Build Coastguard Worker **
1003*7eba2f3bSAndroid Build Coastguard Worker ** Description: Turn off and turn on the controller.
1004*7eba2f3bSAndroid Build Coastguard Worker **
1005*7eba2f3bSAndroid Build Coastguard Worker ** Returns: None.
1006*7eba2f3bSAndroid Build Coastguard Worker **
1007*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
HalGetMaxNfcee()1008*7eba2f3bSAndroid Build Coastguard Worker uint8_t NfcAdaptation::HalGetMaxNfcee() {
1009*7eba2f3bSAndroid Build Coastguard Worker const char* func = "NfcAdaptation::HalGetMaxNfcee";
1010*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s", func);
1011*7eba2f3bSAndroid Build Coastguard Worker
1012*7eba2f3bSAndroid Build Coastguard Worker return nfa_ee_max_ee_cfg;
1013*7eba2f3bSAndroid Build Coastguard Worker }
1014*7eba2f3bSAndroid Build Coastguard Worker
1015*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1016*7eba2f3bSAndroid Build Coastguard Worker **
1017*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::DownloadFirmware
1018*7eba2f3bSAndroid Build Coastguard Worker **
1019*7eba2f3bSAndroid Build Coastguard Worker ** Description: Download firmware patch files.
1020*7eba2f3bSAndroid Build Coastguard Worker **
1021*7eba2f3bSAndroid Build Coastguard Worker ** Returns: None.
1022*7eba2f3bSAndroid Build Coastguard Worker **
1023*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
DownloadFirmware()1024*7eba2f3bSAndroid Build Coastguard Worker bool NfcAdaptation::DownloadFirmware() {
1025*7eba2f3bSAndroid Build Coastguard Worker const char* func = "NfcAdaptation::DownloadFirmware";
1026*7eba2f3bSAndroid Build Coastguard Worker isDownloadFirmwareCompleted = false;
1027*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: enter", func);
1028*7eba2f3bSAndroid Build Coastguard Worker HalInitialize();
1029*7eba2f3bSAndroid Build Coastguard Worker
1030*7eba2f3bSAndroid Build Coastguard Worker mHalOpenCompletedEvent.lock();
1031*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: try open HAL", func);
1032*7eba2f3bSAndroid Build Coastguard Worker HalOpen(HalDownloadFirmwareCallback, HalDownloadFirmwareDataCallback);
1033*7eba2f3bSAndroid Build Coastguard Worker mHalOpenCompletedEvent.wait();
1034*7eba2f3bSAndroid Build Coastguard Worker
1035*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: try close HAL", func);
1036*7eba2f3bSAndroid Build Coastguard Worker HalClose();
1037*7eba2f3bSAndroid Build Coastguard Worker
1038*7eba2f3bSAndroid Build Coastguard Worker HalTerminate();
1039*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: exit", func);
1040*7eba2f3bSAndroid Build Coastguard Worker
1041*7eba2f3bSAndroid Build Coastguard Worker return isDownloadFirmwareCompleted;
1042*7eba2f3bSAndroid Build Coastguard Worker }
1043*7eba2f3bSAndroid Build Coastguard Worker
1044*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1045*7eba2f3bSAndroid Build Coastguard Worker **
1046*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::HalDownloadFirmwareCallback
1047*7eba2f3bSAndroid Build Coastguard Worker **
1048*7eba2f3bSAndroid Build Coastguard Worker ** Description: Receive events from the HAL.
1049*7eba2f3bSAndroid Build Coastguard Worker **
1050*7eba2f3bSAndroid Build Coastguard Worker ** Returns: None.
1051*7eba2f3bSAndroid Build Coastguard Worker **
1052*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
HalDownloadFirmwareCallback(nfc_event_t event,nfc_status_t event_status)1053*7eba2f3bSAndroid Build Coastguard Worker void NfcAdaptation::HalDownloadFirmwareCallback(nfc_event_t event,
1054*7eba2f3bSAndroid Build Coastguard Worker __attribute__((unused))
1055*7eba2f3bSAndroid Build Coastguard Worker nfc_status_t event_status) {
1056*7eba2f3bSAndroid Build Coastguard Worker const char* func = "NfcAdaptation::HalDownloadFirmwareCallback";
1057*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: event=0x%X", func, event);
1058*7eba2f3bSAndroid Build Coastguard Worker switch (event) {
1059*7eba2f3bSAndroid Build Coastguard Worker case HAL_NFC_OPEN_CPLT_EVT: {
1060*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: HAL_NFC_OPEN_CPLT_EVT", func);
1061*7eba2f3bSAndroid Build Coastguard Worker if (event_status == HAL_NFC_STATUS_OK) isDownloadFirmwareCompleted = true;
1062*7eba2f3bSAndroid Build Coastguard Worker mHalOpenCompletedEvent.signal();
1063*7eba2f3bSAndroid Build Coastguard Worker break;
1064*7eba2f3bSAndroid Build Coastguard Worker }
1065*7eba2f3bSAndroid Build Coastguard Worker case HAL_NFC_CLOSE_CPLT_EVT: {
1066*7eba2f3bSAndroid Build Coastguard Worker LOG(VERBOSE) << StringPrintf("%s: HAL_NFC_CLOSE_CPLT_EVT", func);
1067*7eba2f3bSAndroid Build Coastguard Worker break;
1068*7eba2f3bSAndroid Build Coastguard Worker }
1069*7eba2f3bSAndroid Build Coastguard Worker }
1070*7eba2f3bSAndroid Build Coastguard Worker }
1071*7eba2f3bSAndroid Build Coastguard Worker
1072*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1073*7eba2f3bSAndroid Build Coastguard Worker **
1074*7eba2f3bSAndroid Build Coastguard Worker ** Function: NfcAdaptation::HalDownloadFirmwareDataCallback
1075*7eba2f3bSAndroid Build Coastguard Worker **
1076*7eba2f3bSAndroid Build Coastguard Worker ** Description: Receive data events from the HAL.
1077*7eba2f3bSAndroid Build Coastguard Worker **
1078*7eba2f3bSAndroid Build Coastguard Worker ** Returns: None.
1079*7eba2f3bSAndroid Build Coastguard Worker **
1080*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
HalDownloadFirmwareDataCallback(uint16_t data_len,uint8_t * p_data)1081*7eba2f3bSAndroid Build Coastguard Worker void NfcAdaptation::HalDownloadFirmwareDataCallback(__attribute__((unused))
1082*7eba2f3bSAndroid Build Coastguard Worker uint16_t data_len,
1083*7eba2f3bSAndroid Build Coastguard Worker __attribute__((unused))
1084*7eba2f3bSAndroid Build Coastguard Worker uint8_t* p_data) {}
1085*7eba2f3bSAndroid Build Coastguard Worker
1086*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1087*7eba2f3bSAndroid Build Coastguard Worker **
1088*7eba2f3bSAndroid Build Coastguard Worker ** Function: ThreadMutex::ThreadMutex()
1089*7eba2f3bSAndroid Build Coastguard Worker **
1090*7eba2f3bSAndroid Build Coastguard Worker ** Description: class constructor
1091*7eba2f3bSAndroid Build Coastguard Worker **
1092*7eba2f3bSAndroid Build Coastguard Worker ** Returns: none
1093*7eba2f3bSAndroid Build Coastguard Worker **
1094*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
ThreadMutex()1095*7eba2f3bSAndroid Build Coastguard Worker ThreadMutex::ThreadMutex() {
1096*7eba2f3bSAndroid Build Coastguard Worker pthread_mutexattr_t mutexAttr;
1097*7eba2f3bSAndroid Build Coastguard Worker
1098*7eba2f3bSAndroid Build Coastguard Worker pthread_mutexattr_init(&mutexAttr);
1099*7eba2f3bSAndroid Build Coastguard Worker pthread_mutex_init(&mMutex, &mutexAttr);
1100*7eba2f3bSAndroid Build Coastguard Worker pthread_mutexattr_destroy(&mutexAttr);
1101*7eba2f3bSAndroid Build Coastguard Worker }
1102*7eba2f3bSAndroid Build Coastguard Worker
1103*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1104*7eba2f3bSAndroid Build Coastguard Worker **
1105*7eba2f3bSAndroid Build Coastguard Worker ** Function: ThreadMutex::~ThreadMutex()
1106*7eba2f3bSAndroid Build Coastguard Worker **
1107*7eba2f3bSAndroid Build Coastguard Worker ** Description: class destructor
1108*7eba2f3bSAndroid Build Coastguard Worker **
1109*7eba2f3bSAndroid Build Coastguard Worker ** Returns: none
1110*7eba2f3bSAndroid Build Coastguard Worker **
1111*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
~ThreadMutex()1112*7eba2f3bSAndroid Build Coastguard Worker ThreadMutex::~ThreadMutex() { pthread_mutex_destroy(&mMutex); }
1113*7eba2f3bSAndroid Build Coastguard Worker
1114*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1115*7eba2f3bSAndroid Build Coastguard Worker **
1116*7eba2f3bSAndroid Build Coastguard Worker ** Function: ThreadMutex::lock()
1117*7eba2f3bSAndroid Build Coastguard Worker **
1118*7eba2f3bSAndroid Build Coastguard Worker ** Description: lock kthe mutex
1119*7eba2f3bSAndroid Build Coastguard Worker **
1120*7eba2f3bSAndroid Build Coastguard Worker ** Returns: none
1121*7eba2f3bSAndroid Build Coastguard Worker **
1122*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
lock()1123*7eba2f3bSAndroid Build Coastguard Worker void ThreadMutex::lock() { pthread_mutex_lock(&mMutex); }
1124*7eba2f3bSAndroid Build Coastguard Worker
1125*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1126*7eba2f3bSAndroid Build Coastguard Worker **
1127*7eba2f3bSAndroid Build Coastguard Worker ** Function: ThreadMutex::unblock()
1128*7eba2f3bSAndroid Build Coastguard Worker **
1129*7eba2f3bSAndroid Build Coastguard Worker ** Description: unlock the mutex
1130*7eba2f3bSAndroid Build Coastguard Worker **
1131*7eba2f3bSAndroid Build Coastguard Worker ** Returns: none
1132*7eba2f3bSAndroid Build Coastguard Worker **
1133*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
unlock()1134*7eba2f3bSAndroid Build Coastguard Worker void ThreadMutex::unlock() { pthread_mutex_unlock(&mMutex); }
1135*7eba2f3bSAndroid Build Coastguard Worker
1136*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1137*7eba2f3bSAndroid Build Coastguard Worker **
1138*7eba2f3bSAndroid Build Coastguard Worker ** Function: ThreadCondVar::ThreadCondVar()
1139*7eba2f3bSAndroid Build Coastguard Worker **
1140*7eba2f3bSAndroid Build Coastguard Worker ** Description: class constructor
1141*7eba2f3bSAndroid Build Coastguard Worker **
1142*7eba2f3bSAndroid Build Coastguard Worker ** Returns: none
1143*7eba2f3bSAndroid Build Coastguard Worker **
1144*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
ThreadCondVar()1145*7eba2f3bSAndroid Build Coastguard Worker ThreadCondVar::ThreadCondVar() {
1146*7eba2f3bSAndroid Build Coastguard Worker pthread_condattr_t CondAttr;
1147*7eba2f3bSAndroid Build Coastguard Worker
1148*7eba2f3bSAndroid Build Coastguard Worker pthread_condattr_init(&CondAttr);
1149*7eba2f3bSAndroid Build Coastguard Worker pthread_cond_init(&mCondVar, &CondAttr);
1150*7eba2f3bSAndroid Build Coastguard Worker
1151*7eba2f3bSAndroid Build Coastguard Worker pthread_condattr_destroy(&CondAttr);
1152*7eba2f3bSAndroid Build Coastguard Worker }
1153*7eba2f3bSAndroid Build Coastguard Worker
1154*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1155*7eba2f3bSAndroid Build Coastguard Worker **
1156*7eba2f3bSAndroid Build Coastguard Worker ** Function: ThreadCondVar::~ThreadCondVar()
1157*7eba2f3bSAndroid Build Coastguard Worker **
1158*7eba2f3bSAndroid Build Coastguard Worker ** Description: class destructor
1159*7eba2f3bSAndroid Build Coastguard Worker **
1160*7eba2f3bSAndroid Build Coastguard Worker ** Returns: none
1161*7eba2f3bSAndroid Build Coastguard Worker **
1162*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
~ThreadCondVar()1163*7eba2f3bSAndroid Build Coastguard Worker ThreadCondVar::~ThreadCondVar() { pthread_cond_destroy(&mCondVar); }
1164*7eba2f3bSAndroid Build Coastguard Worker
1165*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1166*7eba2f3bSAndroid Build Coastguard Worker **
1167*7eba2f3bSAndroid Build Coastguard Worker ** Function: ThreadCondVar::wait()
1168*7eba2f3bSAndroid Build Coastguard Worker **
1169*7eba2f3bSAndroid Build Coastguard Worker ** Description: wait on the mCondVar
1170*7eba2f3bSAndroid Build Coastguard Worker **
1171*7eba2f3bSAndroid Build Coastguard Worker ** Returns: none
1172*7eba2f3bSAndroid Build Coastguard Worker **
1173*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
wait()1174*7eba2f3bSAndroid Build Coastguard Worker void ThreadCondVar::wait() {
1175*7eba2f3bSAndroid Build Coastguard Worker pthread_cond_wait(&mCondVar, *this);
1176*7eba2f3bSAndroid Build Coastguard Worker pthread_mutex_unlock(*this);
1177*7eba2f3bSAndroid Build Coastguard Worker }
1178*7eba2f3bSAndroid Build Coastguard Worker
1179*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1180*7eba2f3bSAndroid Build Coastguard Worker **
1181*7eba2f3bSAndroid Build Coastguard Worker ** Function: ThreadCondVar::signal()
1182*7eba2f3bSAndroid Build Coastguard Worker **
1183*7eba2f3bSAndroid Build Coastguard Worker ** Description: signal the mCondVar
1184*7eba2f3bSAndroid Build Coastguard Worker **
1185*7eba2f3bSAndroid Build Coastguard Worker ** Returns: none
1186*7eba2f3bSAndroid Build Coastguard Worker **
1187*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
signal()1188*7eba2f3bSAndroid Build Coastguard Worker void ThreadCondVar::signal() {
1189*7eba2f3bSAndroid Build Coastguard Worker AutoThreadMutex a(*this);
1190*7eba2f3bSAndroid Build Coastguard Worker pthread_cond_signal(&mCondVar);
1191*7eba2f3bSAndroid Build Coastguard Worker }
1192*7eba2f3bSAndroid Build Coastguard Worker
1193*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1194*7eba2f3bSAndroid Build Coastguard Worker **
1195*7eba2f3bSAndroid Build Coastguard Worker ** Function: AutoThreadMutex::AutoThreadMutex()
1196*7eba2f3bSAndroid Build Coastguard Worker **
1197*7eba2f3bSAndroid Build Coastguard Worker ** Description: class constructor, automatically lock the mutex
1198*7eba2f3bSAndroid Build Coastguard Worker **
1199*7eba2f3bSAndroid Build Coastguard Worker ** Returns: none
1200*7eba2f3bSAndroid Build Coastguard Worker **
1201*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
AutoThreadMutex(ThreadMutex & m)1202*7eba2f3bSAndroid Build Coastguard Worker AutoThreadMutex::AutoThreadMutex(ThreadMutex& m) : mm(m) { mm.lock(); }
1203*7eba2f3bSAndroid Build Coastguard Worker
1204*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1205*7eba2f3bSAndroid Build Coastguard Worker **
1206*7eba2f3bSAndroid Build Coastguard Worker ** Function: AutoThreadMutex::~AutoThreadMutex()
1207*7eba2f3bSAndroid Build Coastguard Worker **
1208*7eba2f3bSAndroid Build Coastguard Worker ** Description: class destructor, automatically unlock the mutex
1209*7eba2f3bSAndroid Build Coastguard Worker **
1210*7eba2f3bSAndroid Build Coastguard Worker ** Returns: none
1211*7eba2f3bSAndroid Build Coastguard Worker **
1212*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
~AutoThreadMutex()1213*7eba2f3bSAndroid Build Coastguard Worker AutoThreadMutex::~AutoThreadMutex() { mm.unlock(); }
1214