xref: /aosp_15_r20/system/nfc/src/adaptation/NfcAdaptation.cc (revision 7eba2f3b06c51ae21384f6a4f14577b668a869b3)
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(), &copy[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(), &copy[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