1 /*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "nfcc_nci_adapter.h"
17
18 #include <unistd.h>
19
20 #include "loghelper.h"
21 #include "nfc_config.h"
22 #include "nfc_sdk_common.h"
23 #include "routing_manager.h"
24 #include "securec.h"
25 #include "tag_nci_adapter_ntf.h"
26 #include "tag_nci_adapter_common.h"
27
28 using namespace OHOS::NFC;
29 namespace OHOS {
30 namespace NFC {
31 namespace NCI {
32 // values for SAK28 issue
33 static unsigned int g_isoMifareBitMap = 0;
34 static bool g_isIsoMifareFlag = false;
35 static uint8_t isoMifareUid[NCI_NFCID1_MAX_LEN] = { 0 };
36 const uint8_t NCI_RF_DISCOVER_NTF_FIRST_ID = 0x01;
37 const uint8_t NCI_RF_DISCOVER_NTF_SECOND_ID = 0x02;
38 const unsigned int FLAG_MULTI_TAG_ISO_DEP = 0x01;
39 const unsigned int FLAG_MULTI_TAG_MIFARE = 0x02;
40 // wait nci event 2000 ms
41 const unsigned int NCI_EVT_WAIT_TIMEOUT = 2000;
42 const uint16_t RAWDATA_MAX_LEN = 1000;
43
44 NfccNciAdapter::NfccNciAdapter() = default;
45 NfccNciAdapter::~NfccNciAdapter() = default;
46
GetInstance()47 NfccNciAdapter& NfccNciAdapter::GetInstance()
48 {
49 static NfccNciAdapter nfccNciAdapter;
50 return nfccNciAdapter;
51 }
52
53 /**
54 * @brief whether nfc is enabled or disabled.
55 * @return true/false - nfc is enabled/disabled.
56 */
IsNfcActive()57 bool NfccNciAdapter::IsNfcActive()
58 {
59 bool isActive = (isNfcEnabled_ && !isDisabling_);
60 return isActive;
61 }
62
63 /**
64 * @brief whether tag is active.
65 * @return True/false tag is active/deactive.
66 */
IsTagActive() const67 bool NfccNciAdapter::IsTagActive() const
68 {
69 return isTagActive_;
70 }
71
72 /**
73 * @brief Set card emulation listener to receive field on/off event.
74 * @param listener The listener to receive field on/off event.
75 */
SetCeHostListener(std::weak_ptr<INciCeInterface::ICeHostListener> listener)76 void NfccNciAdapter::SetCeHostListener(std::weak_ptr<INciCeInterface::ICeHostListener> listener)
77 {
78 cardEmulationListener_ = listener;
79 }
80
81 /**
82 * @brief Start or stop rf discovery.
83 * @param isStart True/false start/stop rf discovery.
84 */
StartRfDiscovery(bool isStart)85 void NfccNciAdapter::StartRfDiscovery(bool isStart)
86 {
87 DebugLog("NfccNciAdapter::StartRfDiscovery: isStart= %{public}d", isStart);
88 tNFA_STATUS status = NFA_STATUS_FAILED;
89 if (isStart) {
90 status = NFA_StartRfDiscovery();
91 } else {
92 status = NFA_StopRfDiscovery();
93 }
94 if (status == NFA_STATUS_OK) {
95 if (nfcStartStopPollingEvent_.Wait(NCI_EVT_WAIT_TIMEOUT) == false) {
96 ErrorLog("NfccNciAdapter::StartRfDiscovery timeout. isStart = %{public}d", isStart);
97 return;
98 }
99 rfEnabled_ = isStart;
100 } else {
101 ErrorLog("NfccNciAdapter::StartRfDiscovery: Failed to start/stop RF discovery; error=0x%{public}X", status);
102 }
103 }
104
StartPolling(tNFA_TECHNOLOGY_MASK techMask)105 tNFA_STATUS NfccNciAdapter::StartPolling(tNFA_TECHNOLOGY_MASK techMask)
106 {
107 DebugLog("NfccNciAdapter::StartPolling, techMask = 0x%{public}02X", techMask);
108 tNFA_STATUS status = NFA_EnablePolling(techMask);
109 if (status == NFA_STATUS_OK) {
110 DebugLog("StartPolling: wait for enable event");
111 // wait for NFA_POLL_ENABLED_EVT
112 if (nfcStartStopPollingEvent_.Wait(NCI_EVT_WAIT_TIMEOUT) == false) {
113 ErrorLog("NfccNciAdapter::StartPolling timeout.");
114 return status;
115 }
116 pollingEnabled_ = true;
117 } else {
118 ErrorLog("NfccNciAdapter::StartPolling: fail enable polling; error = 0x%{public}X", status);
119 }
120 return status;
121 }
122
StopPolling()123 tNFA_STATUS NfccNciAdapter::StopPolling()
124 {
125 DebugLog("NfccNciAdapter::StopPolling");
126 tNFA_STATUS status = NFA_DisablePolling();
127 if (status == NFA_STATUS_OK) {
128 pollingEnabled_ = false;
129 // wait for NFA_POLL_DISABLED_EVT
130 if (nfcStartStopPollingEvent_.Wait(NCI_EVT_WAIT_TIMEOUT) == false) {
131 ErrorLog("NfccNciAdapter::StopPolling timeout.");
132 }
133 } else {
134 ErrorLog("NfccNciAdapter::StopPolling: fail disable polling; error = 0x%{public}X", status);
135 }
136 return status;
137 }
138
IsDiscTypeListen(tNFC_ACTIVATE_DEVT & actNtf)139 bool NfccNciAdapter::IsDiscTypeListen(tNFC_ACTIVATE_DEVT& actNtf)
140 {
141 return ((actNtf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_A) ||
142 (actNtf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_B) ||
143 (actNtf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_F) ||
144 (actNtf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE) ||
145 (actNtf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE) ||
146 (actNtf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_ISO15693) ||
147 (actNtf.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_B_PRIME) ||
148 (actNtf.intf_param.type == NFC_INTERFACE_EE_DIRECT_RF));
149 }
150
DoNfaActivatedEvt(tNFA_CONN_EVT_DATA * eventData)151 void NfccNciAdapter::DoNfaActivatedEvt(tNFA_CONN_EVT_DATA* eventData)
152 {
153 uint8_t actProto = (tNFA_INTF_TYPE)eventData->activated.activate_ntf.protocol;
154 if (actProto == NFC_PROTOCOL_T5T && TagNciAdapterNtf::GetInstance().GetDiscRstEvtNum()) {
155 // protocol T5T only support single protocol detection
156 InfoLog("DoNfaActivatedEvt, NFC_PROTOCOL_T5T not support multi tag.");
157 TagNciAdapterNtf::GetInstance().SetDiscRstEvtNum(0);
158 }
159 #if (NXP_EXTNS == TRUE)
160 TagNciAdapterCommon::GetInstance().isIsoDepDhReqFailed_ = false;
161 #endif
162 // logic for SAK28 issue
163 if (g_isIsoMifareFlag) {
164 InfoLog("DoNfaActivatedEvt(SAK28) - ISOMIFARE data cleanup");
165 g_isIsoMifareFlag = false;
166 g_isoMifareBitMap = 0;
167 (void)memset_s(isoMifareUid, sizeof(isoMifareUid), 0, sizeof(isoMifareUid));
168 }
169
170 // sync activated iface and proto
171 if ((actProto != NFA_PROTOCOL_NFC_DEP) && !IsDiscTypeListen(eventData->activated.activate_ntf)) {
172 TagNciAdapterNtf::GetInstance().SetCurrRfInterface(
173 (tNFA_INTF_TYPE)eventData->activated.activate_ntf.intf_param.type);
174 TagNciAdapterNtf::GetInstance().SetCurrRfProtocol(actProto);
175 #if (NXP_EXTNS == TRUE)
176 uint8_t mode = eventData->activated.activate_ntf.rf_tech_param.mode;
177 TagNciAdapterNtf::GetInstance().SetCurrRfMode(mode);
178 if (mode == NFC_DISCOVERY_TYPE_POLL_B || mode == NFC_DISCOVERY_TYPE_POLL_B_PRIME) {
179 TagNciAdapterNtf::GetInstance().SetNfcID0ForTypeB(
180 eventData->activated.activate_ntf.rf_tech_param.param.pb.nfcid0);
181 }
182 #endif
183 }
184
185 #if (NXP_EXTNS == TRUE)
186 //clear MulitProto Mifare Tag state on single proto tag activation
187 if (!TagNciAdapterNtf::GetInstance().GetIsMultiTag() &&
188 TagNciAdapterNtf::GetInstance().IsMultiMFCTag()) {
189 TagNciAdapterNtf::GetInstance().ClearMultiMFCTagState();
190 }
191 #endif
192
193 // handle ActivatedResult for Mifare tag
194 if (Extns::GetInstance().EXTNS_GetConnectFlag() == true) {
195 TagNciAdapterNtf::GetInstance().SetTagActivated();
196 TagNciAdapterNtf::GetInstance().SetConnectStatus(true);
197 return;
198 }
199
200 // handle ActivationResult for normal tags
201 if (isDisabling_ || !isNfcEnabled_) {
202 return;
203 }
204 isTagActive_ = true;
205 if (TagNciAdapterNtf::GetInstance().IsSwitchingRfIface()) {
206 #if (NXP_EXTNS == TRUE)
207 if (TagNciAdapterNtf::GetInstance().IsExpectedActRfProtocol(actProto)) {
208 TagNciAdapterNtf::GetInstance().SetTagActivated();
209 }
210 #else
211 TagNciAdapterNtf::GetInstance().SetTagActivated();
212 #endif
213 TagNciAdapterNtf::GetInstance().SetConnectStatus(true);
214 return;
215 }
216 TagNciAdapterNtf::GetInstance().SetTagActivated();
217 TagNciAdapterNtf::GetInstance().ResetTagFieldOnFlag();
218
219 if (actProto == NFA_PROTOCOL_NFC_DEP) {
220 // we do not support peer to peer
221 } else {
222 TagNciAdapterNtf::GetInstance().HandleActivatedResult(eventData);
223 if (TagNciAdapterNtf::GetInstance().GetDiscRstEvtNum()) {
224 // do deactivate to sleep and wait for reselect for multi tag
225 NFA_Deactivate(true);
226 }
227 // skipped notify secureelement
228 }
229 }
230
DoNfaDeactivatedEvt(tNFA_CONN_EVT_DATA * eventData)231 void NfccNciAdapter::DoNfaDeactivatedEvt(tNFA_CONN_EVT_DATA* eventData)
232 {
233 tNFA_DEACTIVATE_TYPE type = eventData->deactivated.type;
234 TagNciAdapterNtf::GetInstance().SetTagDeactivated((type == NFA_DEACTIVATE_TYPE_SLEEP));
235 TagNciAdapterNtf::GetInstance().SelectTheNextTag();
236 if (eventData->deactivated.type != NFA_DEACTIVATE_TYPE_SLEEP) {
237 isTagActive_ = false;
238 #if (NXP_EXTNS == TRUE)
239 TagNciAdapterNtf::GetInstance().SetDiscRstEvtNum(0);
240 #endif
241 TagNciAdapterNtf::GetInstance().ResetTagFieldOnFlag();
242 #if (NXP_EXTNS == TRUE)
243 if (!TagNciAdapterNtf::GetInstance().IsSwitchingRfIface()) {
244 TagNciAdapterNtf::GetInstance().HandleDeactivatedResult(type);
245 TagNciAdapterNtf::GetInstance().AbortWait();
246 }
247 #else
248 TagNciAdapterNtf::GetInstance().HandleDeactivatedResult(type);
249 TagNciAdapterNtf::GetInstance().AbortWait();
250 #endif
251 TagNciAdapterNtf::GetInstance().SetIsMultiTag(false);
252 } else if (TagNciAdapterNtf::GetInstance().IsTagDeactivating() ||
253 Extns::GetInstance().EXTNS_GetDeactivateFlag()) {
254 TagNciAdapterNtf::GetInstance().SetDeactivatedStatus();
255 }
256 // skipped special process for Secure Element transaction
257 }
258
DoNfaDiscResultEvt(tNFA_CONN_EVT_DATA * eventData)259 void NfccNciAdapter::DoNfaDiscResultEvt(tNFA_CONN_EVT_DATA* eventData)
260 {
261 static tNFA_STATUS status = eventData->disc_result.status;
262 DebugLog("DoNfaDiscResultEvt: status = 0x%{public}X", status);
263 #if (NXP_EXTNS == TRUE)
264 static uint8_t prevMoreVal = 0x00;
265 uint8_t curMoreVal = eventData->disc_result.discovery_ntf.more;
266 bool isMoreValid = true;
267 // 01 means the last notification due to nfcc reaching resource limit
268 // 02 means more notification
269 if ((curMoreVal == 0x01) && (prevMoreVal != 0x02)) {
270 ErrorLog("DoNfaDiscResultEvt: invalid more value");
271 isMoreValid = false;
272 } else {
273 DebugLog("DoNfaDiscResultEvt: valid more value");
274 isMoreValid = true;
275 prevMoreVal = curMoreVal;
276 }
277 #endif
278 if (!isMoreValid) {
279 TagNciAdapterNtf::GetInstance().SetDiscRstEvtNum(0);
280 } else {
281 TagNciAdapterNtf::GetInstance().HandleDiscResult(eventData);
282 HandleDiscNtf(&eventData->disc_result.discovery_ntf);
283 }
284 }
285
HandleDiscNtf(tNFC_RESULT_DEVT * discNtf)286 void NfccNciAdapter::HandleDiscNtf(tNFC_RESULT_DEVT* discNtf)
287 {
288 // logic for SAK28 issue
289 if (discNtf->rf_disc_id == NCI_RF_DISCOVER_NTF_FIRST_ID) {
290 (void)memset_s(isoMifareUid, sizeof(isoMifareUid), 0, sizeof(isoMifareUid));
291 g_isoMifareBitMap = 0;
292 errno_t err = EOK;
293 if (discNtf->rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_A) {
294 err = memcpy_s(isoMifareUid, sizeof(isoMifareUid),
295 discNtf->rf_tech_param.param.pa.nfcid1,
296 discNtf->rf_tech_param.param.pa.nfcid1_len);
297 if (err != EOK) {
298 ErrorLog("HandleDiscNtf:(SAK28) memcpy_s first uid failed, err = %{public}d", err);
299 }
300 if (discNtf->protocol == NFC_PROTOCOL_ISO_DEP) {
301 g_isoMifareBitMap |= FLAG_MULTI_TAG_ISO_DEP;
302 } else if (discNtf->protocol == NFC_PROTOCOL_MIFARE) {
303 g_isoMifareBitMap |= FLAG_MULTI_TAG_MIFARE;
304 }
305 }
306 } else if (discNtf->rf_disc_id == NCI_RF_DISCOVER_NTF_SECOND_ID) {
307 if (discNtf->rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_A) {
308 if (memcmp(isoMifareUid, discNtf->rf_tech_param.param.pa.nfcid1,
309 discNtf->rf_tech_param.param.pa.nfcid1_len) == 0) {
310 InfoLog("HandleDiscNtf:(SAK28) multicard with same uid");
311 if (discNtf->protocol == NFC_PROTOCOL_ISO_DEP) {
312 g_isoMifareBitMap |= FLAG_MULTI_TAG_ISO_DEP;
313 } else if (discNtf->protocol == NFC_PROTOCOL_MIFARE) {
314 g_isoMifareBitMap |= FLAG_MULTI_TAG_MIFARE;
315 }
316 }
317 }
318 }
319 InfoLog("HandleDiscNtf:(SAK28) g_isoMifareBitMap = 0x%{public}02X, g_isIsoMifareFlag = %{public}d",
320 g_isoMifareBitMap, g_isIsoMifareFlag);
321 if ((g_isoMifareBitMap & FLAG_MULTI_TAG_ISO_DEP) && (g_isoMifareBitMap & FLAG_MULTI_TAG_MIFARE) &&
322 g_isIsoMifareFlag && readerModeEnabled_ == false) {
323 InfoLog("HandleDiscNtf:(SAK28) same tag discovered twice, skip Mifare detection");
324 g_isoMifareBitMap = 0;
325 TagNciAdapterNtf::GetInstance().SetSkipMifareInterface();
326 }
327
328 // logic for normal tag
329 if (discNtf->more == NCI_DISCOVER_NTF_MORE) {
330 // there is more discovery notification coming
331 TagNciAdapterNtf::GetInstance().SetDiscRstEvtNum(TagNciAdapterNtf::GetInstance().GetDiscRstEvtNum() + 1);
332 return;
333 }
334 if (TagNciAdapterNtf::GetInstance().GetDiscRstEvtNum() > 0) {
335 TagNciAdapterNtf::GetInstance().SetIsMultiTag(true);
336 }
337 // select the first tag of multiple tags that is discovered
338 TagNciAdapterNtf::GetInstance().SelectTheFirstTag();
339 }
340
DoNfaSelectResultEvt(uint8_t status)341 void NfccNciAdapter::DoNfaSelectResultEvt(uint8_t status)
342 {
343 TagNciAdapterNtf::GetInstance().HandleSelectResult(status);
344 }
345
DoNfaPresenceEvt(tNFA_CONN_EVT_DATA * eventData)346 void NfccNciAdapter::DoNfaPresenceEvt(tNFA_CONN_EVT_DATA* eventData)
347 {
348 static tNFA_STATUS curStatus = NFA_STATUS_FAILED;
349 if (eventData->status != curStatus) {
350 curStatus = eventData->status;
351 }
352 TagNciAdapterNtf::GetInstance().HandleFieldCheckResult(curStatus);
353
354 // logic for SAK28 issue
355 if (curStatus != NFA_STATUS_OK) {
356 if ((g_isoMifareBitMap & FLAG_MULTI_TAG_ISO_DEP) && (g_isoMifareBitMap & FLAG_MULTI_TAG_MIFARE)) {
357 InfoLog("DoNfaPresenceEvt:(SAK28) set g_isIsoMifareFlag");
358 g_isIsoMifareFlag = true;
359 }
360 g_isoMifareBitMap = 0;
361 }
362 }
363
NfcConnectionCallback(uint8_t connEvent,tNFA_CONN_EVT_DATA * eventData)364 void NfccNciAdapter::NfcConnectionCallback(uint8_t connEvent, tNFA_CONN_EVT_DATA* eventData)
365 {
366 if (eventData == nullptr) {
367 ErrorLog("NfcConnectionCallback, eventData is null. connEvent = %{public}X", connEvent);
368 return;
369 }
370 switch (connEvent) {
371 /* whether polling successfully started */
372 case NFA_POLL_ENABLED_EVT: {
373 DebugLog("NfaConnectionCallback: NFA_POLL_ENABLED_EVT: status = %{public}u", eventData->status);
374 NfccNciAdapter::GetInstance().DoNfaPollEnabledDisabledEvt();
375 break;
376 }
377 /* Listening/Polling stopped */
378 case NFA_POLL_DISABLED_EVT: {
379 DebugLog("NfaConnectionCallback: NFA_POLL_DISABLED_EVT: status = %{public}u", eventData->status);
380 NfccNciAdapter::GetInstance().DoNfaPollEnabledDisabledEvt();
381 break;
382 }
383 /* RF Discovery started event */
384 case NFA_RF_DISCOVERY_STARTED_EVT: {
385 DebugLog("NfaConnectionCallback: NFA_RF_DISCOVERY_STARTED_EVT: status = %{public}u", eventData->status);
386 NfccNciAdapter::GetInstance().DoNfaPollEnabledDisabledEvt();
387 break;
388 }
389 /* RF Discovery stopped event */
390 case NFA_RF_DISCOVERY_STOPPED_EVT: {
391 DebugLog("NfaConnectionCallback: NFA_RF_DISCOVERY_STOPPED_EVT: status = %{public}u", eventData->status);
392 NfccNciAdapter::GetInstance().DoNfaPollEnabledDisabledEvt();
393 break;
394 }
395 /* NFC deactivate failed event */
396 case NFA_DEACTIVATE_FAIL_EVT: {
397 DebugLog("NfaConnectionCallback: NFA_DEACTIVATE_FAIL_EVT: status = %{public}u", eventData->status);
398 #if (NXP_EXTNS == TRUE)
399 if (eventData->status == NFC_DEACTIVATE_REASON_DH_REQ_FAILED) {
400 TagNciAdapterCommon::GetInstance().isIsoDepDhReqFailed_ = true;
401 }
402 #endif
403 break;
404 }
405 /* NFC link/protocol activated */
406 case NFA_ACTIVATED_EVT: {
407 DebugLog("NfaConnectionCallback: NFA_ACTIVATED_EVT");
408 NfccNciAdapter::GetInstance().DoNfaActivatedEvt(eventData);
409 break;
410 }
411 /* NFC link/protocol deactivated */
412 case NFA_DEACTIVATED_EVT: {
413 DebugLog("NfaConnectionCallback: NFA_DEACTIVATED_EVT");
414 NfccNciAdapter::GetInstance().DoNfaDeactivatedEvt(eventData);
415 break;
416 }
417 case NFA_DISC_RESULT_EVT: {
418 DebugLog("NfaConnectionCallback: NFA_DISC_RESULT_EVT");
419 NfccNciAdapter::GetInstance().DoNfaDiscResultEvt(eventData);
420 break;
421 }
422 case NFA_SELECT_RESULT_EVT: {
423 DebugLog("NfaConnectionCallback: NFA_SELECT_RESULT_EVT: status = 0x%{public}X", eventData->status);
424 NfccNciAdapter::GetInstance().DoNfaSelectResultEvt(eventData->status);
425 break;
426 }
427 /* Data message received (for non-NDEF reads) */
428 case NFA_DATA_EVT: {
429 DebugLog("NfaConnectionCallback: NFA_DATA_EVT: status = 0x%{public}X, len = %{public}d",
430 eventData->status, eventData->data.len);
431 TagNciAdapterNtf::GetInstance().HandleTranceiveData(eventData->status, eventData->data.p_data,
432 eventData->data.len);
433 break;
434 }
435 case NFA_PRESENCE_CHECK_EVT: {
436 NfccNciAdapter::GetInstance().DoNfaPresenceEvt(eventData);
437 break;
438 }
439 case NFA_READ_CPLT_EVT: {
440 DebugLog("NfaConnectionCallback: NFA_READ_CPLT_EVT: status = 0x%{public}X", eventData->status);
441 TagNciAdapterNtf::GetInstance().HandleReadComplete(eventData->status);
442 break;
443 }
444 case NFA_WRITE_CPLT_EVT: {
445 DebugLog("NfaConnectionCallback: NFA_WRITE_CPLT_EVT: status = 0x%{public}X", eventData->status);
446 TagNciAdapterNtf::GetInstance().HandleWriteComplete(eventData->status);
447 break;
448 }
449 case NFA_FORMAT_CPLT_EVT: {
450 DebugLog("NfaConnectionCallback: NFA_FORMAT_CPLT_EVT: status = 0x%{public}X", eventData->status);
451 TagNciAdapterNtf::GetInstance().HandleFormatComplete(eventData->status);
452 break;
453 }
454 case NFA_NDEF_DETECT_EVT: {
455 DebugLog("NfaConnectionCallback: NFA_NDEF_DETECT_EVT: status = 0x%{public}X, protocol = 0x%{public}X,"
456 " max_size = %{public}u, cur_size = %{public}u, flags = 0x%{public}X",
457 eventData->ndef_detect.status, eventData->ndef_detect.protocol,
458 static_cast<uint32_t>(eventData->ndef_detect.max_size),
459 static_cast<uint32_t>(eventData->ndef_detect.cur_size), eventData->ndef_detect.flags);
460 TagNciAdapterNtf::GetInstance().HandleNdefCheckResult(eventData->ndef_detect.status,
461 eventData->ndef_detect.cur_size, eventData->ndef_detect.flags, eventData->ndef_detect.max_size);
462 break;
463 }
464 case NFA_SET_TAG_RO_EVT: {
465 DebugLog("NfaDeviceManagementCallback: NFA_SET_TAG_RO_EVT; status = 0x%{public}X", eventData->status);
466 TagNciAdapterNtf::GetInstance().HandleSetReadOnlyResult(eventData->status);
467 break;
468 }
469 default: {
470 DebugLog("NfaConnectionCallback: unknown event %{public}u", connEvent);
471 break;
472 }
473 }
474 }
475
476 /* method for SAK28 issue */
SendActEvtForSak28Tag(uint8_t connEvent,tNFA_CONN_EVT_DATA * eventData)477 void NfccNciAdapter::SendActEvtForSak28Tag(uint8_t connEvent, tNFA_CONN_EVT_DATA* eventData)
478 {
479 NfcConnectionCallback(connEvent, eventData);
480 }
481
DoNfaPollEnabledDisabledEvt()482 void NfccNciAdapter::DoNfaPollEnabledDisabledEvt()
483 {
484 SynchronizeGuard guard(nfcStartStopPollingEvent_);
485 nfcStartStopPollingEvent_.NotifyOne();
486 }
487
DoNfaDmEnableEvt(tNFA_DM_CBACK_DATA * eventData)488 void NfccNciAdapter::DoNfaDmEnableEvt(tNFA_DM_CBACK_DATA* eventData)
489 {
490 SynchronizeGuard guard(nfcEnableEvent_);
491 isNfcEnabled_ = (eventData->status == NFA_STATUS_OK);
492 isDisabling_ = false;
493 nfcEnableEvent_.NotifyOne();
494 }
495
DoNfaDmDisableEvt(tNFA_DM_CBACK_DATA * eventData)496 void NfccNciAdapter::DoNfaDmDisableEvt(tNFA_DM_CBACK_DATA* eventData)
497 {
498 SynchronizeGuard guard(nfcDisableEvent_);
499 isNfcEnabled_ = false;
500 isDisabling_ = false;
501 nfcDisableEvent_.NotifyOne();
502 }
503
504 /**
505 * @brief Whether rf field is on or off.
506 * @return True/false to be field on/off.
507 */
isRfFieldOn()508 bool NfccNciAdapter::isRfFieldOn()
509 {
510 if (isRfFieldOn_) {
511 return true;
512 }
513 uint64_t currTime = KITS::NfcSdkCommon::GetCurrentTime();
514 // If it is less than 50ms before fieldoff, then it is considered field on;
515 if ((currTime - lastRfFieldTime) < 50) {
516 return true;
517 }
518 return false;
519 }
520
DoNfaDmRfFieldEvt(tNFA_DM_CBACK_DATA * eventData)521 void NfccNciAdapter::DoNfaDmRfFieldEvt(tNFA_DM_CBACK_DATA* eventData)
522 {
523 lastRfFieldTime = 0;
524 isRfFieldOn_ = false;
525 if (cardEmulationListener_.expired()) {
526 ErrorLog("DoNfaDmRfFieldEvt: cardEmulationListener_ is null");
527 return;
528 }
529 if (eventData->rf_field.status == NFA_STATUS_OK) {
530 lastRfFieldTime = KITS::NfcSdkCommon::GetCurrentTime();
531 // notify field on/off event to nfc service.
532 if (eventData->rf_field.rf_field_status == NFA_DM_RF_FIELD_ON) {
533 isRfFieldOn_ = true;
534 cardEmulationListener_.lock()->FieldActivated();
535 } else {
536 isRfFieldOn_ = false;
537 cardEmulationListener_.lock()->FieldDeactivated();
538 }
539 }
540 }
541
DoNfaDmSetConfig()542 void NfccNciAdapter::DoNfaDmSetConfig()
543 {
544 SynchronizeGuard guard(nfcSetConfigEvent_);
545 DebugLog("NfaDeviceManagementCallback: NFA_DM_SET_CONFIG_EVT");
546 nfcSetConfigEvent_.NotifyOne();
547 }
DoNfaSetPowerSubState()548 void NfccNciAdapter::DoNfaSetPowerSubState()
549 {
550 SynchronizeGuard guard(nfcSetPowerSubStateEvent_);
551 nfcSetPowerSubStateEvent_.NotifyOne();
552 }
553
DoNfaDmNfccTimeoutEvt(tNFA_DM_CBACK_DATA * eventData)554 void NfccNciAdapter::DoNfaDmNfccTimeoutEvt(tNFA_DM_CBACK_DATA* eventData)
555 {
556 {
557 SynchronizeGuard guard(nfcEnableEvent_);
558 nfcEnableEvent_.NotifyOne();
559 }
560 {
561 SynchronizeGuard guard(nfcDisableEvent_);
562 nfcDisableEvent_.NotifyOne();
563 }
564 {
565 SynchronizeGuard guard(nfcStartStopPollingEvent_);
566 nfcStartStopPollingEvent_.NotifyOne();
567 }
568 discoveryEnabled_ = false;
569 pollingEnabled_ = false;
570
571 if (IsNfcActive()) {
572 NFA_Disable(FALSE);
573 isDisabling_ = true;
574 } else {
575 isNfcEnabled_ = false;
576 isDisabling_ = false;
577 }
578 }
579
NfcDeviceManagementCallback(uint8_t dmEvent,tNFA_DM_CBACK_DATA * eventData)580 void NfccNciAdapter::NfcDeviceManagementCallback(uint8_t dmEvent, tNFA_DM_CBACK_DATA* eventData)
581 {
582 if (eventData == nullptr) {
583 ErrorLog("NfcDeviceManagementCallback, eventData is null. dmEvent = %{public}X", dmEvent);
584 return;
585 }
586 DebugLog("NfaDeviceManagementCallback: event= %{public}u", dmEvent);
587
588 switch (dmEvent) {
589 /* Result of NFA_Enable */
590 case NFA_DM_ENABLE_EVT: {
591 DebugLog("NfaDeviceManagementCallback: NFA_DM_ENABLE_EVT; status = 0x%{public}X", eventData->status);
592 NfccNciAdapter::GetInstance().DoNfaDmEnableEvt(eventData);
593 break;
594 }
595 /* Result of NFA_Disable */
596 case NFA_DM_DISABLE_EVT: {
597 DebugLog("NfaDeviceManagementCallback: NFA_DM_DISABLE_EVT");
598 NfccNciAdapter::GetInstance().DoNfaDmDisableEvt(eventData);
599 break;
600 }
601
602 case NFA_DM_RF_FIELD_EVT: {
603 DebugLog("NfaDeviceManagementCallback: NFA_DM_RF_FIELD_EVT; status = 0x%{public}X; field status = "
604 "%{public}u", eventData->rf_field.status, eventData->rf_field.rf_field_status);
605 NfccNciAdapter::GetInstance().DoNfaDmRfFieldEvt(eventData);
606 break;
607 }
608
609 case NFA_DM_NFCC_TRANSPORT_ERR_EVT:
610 case NFA_DM_NFCC_TIMEOUT_EVT: {
611 NfccNciAdapter::GetInstance().DoNfaDmNfccTimeoutEvt(eventData);
612 break;
613 }
614
615 case NFA_DM_SET_CONFIG_EVT: {
616 NfccNciAdapter::GetInstance().DoNfaDmSetConfig();
617 break;
618 }
619
620 case NFA_DM_SET_POWER_SUB_STATE_EVT: {
621 DebugLog("NfaDeviceManagementCallback: NFA_DM_SET_POWER_SUB_STATE_EVT; status=0x%{public}X",
622 eventData->power_mode.status);
623 NfccNciAdapter::GetInstance().DoNfaSetPowerSubState();
624 break;
625 }
626
627 case NFA_SET_TAG_RO_EVT: {
628 DebugLog("NfaDeviceManagementCallback: NFA_SET_TAG_RO_EVT; status = 0x%{public}X", eventData->status);
629 TagNciAdapterNtf::GetInstance().HandleSetReadOnlyResult(eventData->status);
630 break;
631 }
632 default: {
633 ErrorLog("NfaDeviceManagementCallback: unknown event %{public}d", dmEvent);
634 break;
635 }
636 }
637 }
638
NfaRegVSCback(bool isRegster,tNFA_VSC_CBACK * vscCback)639 tNFA_STATUS NfccNciAdapter::NfaRegVSCback(bool isRegster, tNFA_VSC_CBACK* vscCback)
640 {
641 return NFA_STATUS_OK;
642 }
643
PrivateNciCallback(uint8_t event,uint16_t paramLen,uint8_t * param)644 void NfccNciAdapter::PrivateNciCallback(uint8_t event, uint16_t paramLen, uint8_t *param)
645 {
646 }
647
648 /**
649 * @brief Initialize nfc.
650 * @return true/false - initialize is successful or not successful.
651 */
Initialize()652 bool NfccNciAdapter::Initialize()
653 {
654 DebugLog("NfccNciAdapter::Initialize");
655 tNFA_STATUS status = NFA_STATUS_FAILED;
656 if (isNfcEnabled_) {
657 WarnLog("NfccNciAdapter::Initialize: already enabled");
658 return isNfcEnabled_;
659 }
660
661 NfcAdaptation::GetInstance().Initialize(); // start GKI, NCI task, NFC task
662 SynchronizeGuard guard(nfcEnableEvent_);
663 tHAL_NFC_ENTRY* halFuncEntries = NfcAdaptation::GetInstance().GetHalEntryFuncs();
664
665 NFA_Init(halFuncEntries);
666 status = NFA_Enable(NfcDeviceManagementCallback, NfcConnectionCallback);
667 if (status == NFA_STATUS_OK) {
668 if (nfcEnableEvent_.Wait(NCI_EVT_WAIT_TIMEOUT) == false) {
669 ErrorLog("NfccNciAdapter::Initialize : Enable nfc timeout");
670 }
671 }
672 Extns::GetInstance().EXTNS_Init(NfcDeviceManagementCallback, NfcConnectionCallback);
673 NfaRegVSCback(true, PrivateNciCallback);
674
675 if (status == NFA_STATUS_OK) {
676 // sIsNfaEnabled indicates whether stack started successfully
677 if (isNfcEnabled_) {
678 #ifdef _NFC_SERVICE_HCE_
679 NciBalCe::GetInstance().InitializeCe();
680 HciManager::GetInstance().Initialize();
681 #endif
682 isRoutingInited_ = RoutingManager::GetInstance().Initialize();
683 TagNciAdapterNtf::GetInstance().RegisterNdefHandler();
684 discoveryDuration_ = DEFAULT_DISCOVERY_DURATION;
685 NFA_SetRfDiscoveryDuration(static_cast<uint16_t>(discoveryDuration_));
686 DebugLog("NfccNciAdapter::Initialize: nfc enabled = %{public}d", isNfcEnabled_);
687 return isNfcEnabled_;
688 }
689 }
690 ErrorLog("NfccNciAdapter::Initialize: fail nfa enable; error = %{public}d", status);
691 if (isNfcEnabled_) {
692 Extns::GetInstance().EXTNS_Close();
693 status = NFA_Disable(false);
694 DebugLog("NfccNciAdapter::Initialize: status = %{public}d", status);
695 }
696 NfcAdaptation::GetInstance().Finalize();
697 DebugLog("NfccNciAdapter::Initialize: nfc enabled = %{public}d", isNfcEnabled_);
698 return isNfcEnabled_;
699 }
700
701 /**
702 * @brief Deinitialize nfc.
703 * @return true/false - deinitialize is successful or not successful.
704 */
Deinitialize()705 bool NfccNciAdapter::Deinitialize()
706 {
707 DebugLog("NfccNciAdapter::Deinitialize");
708 if (!IsNfcActive()) {
709 WarnLog("NfccNciAdapter::Deinitialize: Nfc not initialized");
710 return NFA_STATUS_OK;
711 }
712
713 tNFA_STATUS status = NFA_STATUS_OK;
714 isDisabling_ = true;
715
716 #ifdef _NFC_SERVICE_HCE_
717 NciBalCe::GetInstance().Deinitialize();
718 #endif
719 RoutingManager::GetInstance().Deinitialize();
720
721 if (isNfcEnabled_) {
722 SynchronizeGuard guard(nfcDisableEvent_);
723 Extns::GetInstance().EXTNS_Close();
724 status = NFA_Disable(true);
725 if (status == NFA_STATUS_OK) {
726 if (nfcDisableEvent_.Wait(NCI_EVT_WAIT_TIMEOUT) == false) {
727 ErrorLog("NfccNciAdapter::Deinitialize : disable nfc timeout");
728 } else {
729 DebugLog("NfccNciAdapter::Deinitialize: wait for completion");
730 }
731 } else {
732 ErrorLog("NfccNciAdapter::Deinitialize: fail disable; error = 0x%{public}X", status);
733 }
734 }
735 isNfcEnabled_ = false;
736 isRoutingInited_ = false;
737 discoveryEnabled_ = false;
738 isDisabling_ = false;
739 pollingEnabled_ = false;
740
741 NfcAdaptation::GetInstance().Finalize();
742 NfaRegVSCback(false, PrivateNciCallback);
743 DebugLog("NfccNciAdapter::Deinitialize: exit");
744 return (status == NFA_STATUS_OK);
745 }
746
747 /**
748 * @brief whether to enable discovery for nfc.
749 * @param techMask Supported rf technology for nfc.
750 * @param enableReaderMode True/false to enable/disable reader mode
751 * @param enableHostRouting True/false to enable/disable host routing
752 * @param restart True/false to restart or not restart
753 */
EnableDiscovery(uint16_t techMask,bool enableReaderMode,bool enableHostRouting,bool restart)754 void NfccNciAdapter::EnableDiscovery(uint16_t techMask, bool enableReaderMode, bool enableHostRouting, bool restart)
755 {
756 DebugLog("NfccNciAdapter::EnableDiscovery");
757 if (!IsNfcActive()) {
758 ErrorLog("NfccNciAdapter::EnableDiscovery: Nfc not initialized.");
759 return;
760 }
761
762 if (discoveryEnabled_ && !restart) {
763 WarnLog("NfccNciAdapter::EnableDiscovery: already discovering");
764 return;
765 }
766
767 if (rfEnabled_) {
768 // Stop RF discovery to reconfigure
769 StartRfDiscovery(false);
770 }
771
772 tNFA_TECHNOLOGY_MASK technologyMask = techMask & DEFAULT_TECH_MASK;
773 if (technologyMask != 0) {
774 StopPolling();
775 StartPolling(technologyMask);
776 if (pollingEnabled_) {
777 if (enableReaderMode && !readerModeEnabled_) {
778 readerModeEnabled_ = true;
779 NFA_DisableListening();
780 NFA_SetRfDiscoveryDuration(DISCOVERY_DURATION);
781 } else if (!enableReaderMode && readerModeEnabled_) {
782 readerModeEnabled_ = false;
783 NFA_EnableListening();
784 NFA_SetRfDiscoveryDuration(DISCOVERY_DURATION);
785 }
786 }
787 } else {
788 StopPolling();
789 }
790 #ifdef _NFC_SERVICE_HCE_
791 NciBalCe::GetInstance().EnableHostRouting(enableHostRouting);
792 NciBalCe::GetInstance().CommitRouting();
793 #endif
794
795 StartRfDiscovery(true);
796 discoveryEnabled_ = true;
797 DebugLog("NfccNciAdapter::EnableDiscovery: exit");
798 }
799
800 /**
801 * @brief Disable discovery for nfc.
802 */
DisableDiscovery()803 void NfccNciAdapter::DisableDiscovery()
804 {
805 DebugLog("NfccNciAdapter::DisableDiscovery");
806 if (!IsNfcActive()) {
807 ErrorLog("NfccNciAdapter::DisableDiscovery: Nfc not initialized.");
808 return;
809 }
810 if (!discoveryEnabled_) {
811 WarnLog("NfccNciAdapter::DisableDiscovery: already disabled");
812 return;
813 }
814 // Stop RF Discovery.
815 StartRfDiscovery(false);
816 if (pollingEnabled_) {
817 StopPolling();
818 }
819 discoveryEnabled_ = false;
820 readerModeEnabled_ = false;
821 DebugLog("NfccNciAdapter::DisableDiscovery: exit");
822 }
823
824 /**
825 * @brief Send raw data.
826 * @param rawData Data needed to send
827 * @return True/false to successful/failed to send
828 */
SendRawFrame(std::string & rawData)829 bool NfccNciAdapter::SendRawFrame(std::string& rawData)
830 {
831 uint16_t length = KITS::NfcSdkCommon::GetHexStrBytesLen(rawData);
832 if (length > RAWDATA_MAX_LEN) {
833 ErrorLog("NfccNciAdapter::SendRawFrame rawdatalen invalid. length = %{public}d", length);
834 return false;
835 }
836 uint8_t data[length];
837 for (uint16_t i = 0; i < length; i++) {
838 data[i] = KITS::NfcSdkCommon::GetByteFromHexStr(rawData, i);
839 }
840 tNFA_STATUS status = NFA_SendRawFrame(data, length, 0);
841 InfoLog("SendRawFrame status = %{public}d", status);
842 if (status != NFA_STATUS_OK) {
843 ErrorLog("NfccNciAdapter::SendRawFrame failed. status = %{public}X", status);
844 }
845 return status == NFA_STATUS_OK;
846 }
847
GetDiscovryParam(unsigned char screenState,unsigned char screenStateMask)848 uint8_t NfccNciAdapter::GetDiscovryParam(unsigned char screenState, unsigned char screenStateMask)
849 {
850 // discocery parameters for SCREEN OFF_LOCKED or OFF_UNLOCKED
851 if (screenState == NFA_SCREEN_STATE_OFF_LOCKED || screenState == NFA_SCREEN_STATE_OFF_UNLOCKED) {
852 return (NCI_POLLING_DH_DISABLE_MASK | NCI_LISTEN_DH_NFCEE_DISABLE_MASK);
853 }
854
855 // discocery parameters for SCREEN ON_LOCKED
856 if (screenState == NFA_SCREEN_STATE_ON_LOCKED) {
857 return (screenStateMask & NFA_SCREEN_POLLING_TAG_MASK)
858 ? (NCI_POLLING_DH_ENABLE_MASK | NCI_LISTEN_DH_NFCEE_ENABLE_MASK)
859 : (NCI_POLLING_DH_DISABLE_MASK | NCI_LISTEN_DH_NFCEE_ENABLE_MASK);
860 }
861
862 // discocery parameters for SCREEN ON_UNLOCKED
863 if (screenState == NFA_SCREEN_STATE_ON_UNLOCKED) {
864 return (NCI_POLLING_DH_ENABLE_MASK | NCI_LISTEN_DH_NFCEE_ENABLE_MASK);
865 }
866
867 // default discocery parameters
868 return (NCI_POLLING_DH_ENABLE_MASK | NCI_LISTEN_DH_NFCEE_ENABLE_MASK);
869 }
870
871 /**
872 * @brief Send the status of screen.
873 * @param screenStateMask The state of screen
874 */
SetScreenStatus(unsigned char screenStateMask)875 void NfccNciAdapter::SetScreenStatus(unsigned char screenStateMask)
876 {
877 DebugLog("NfccNciAdapter::SetScreenStatus");
878 if (!IsNfcActive()) {
879 DebugLog("Do not handle Screen state change when NFC is not active");
880 return;
881 }
882 unsigned char screenState = screenStateMask & NFA_SCREEN_STATE_MASK;
883 if (curScreenState_ == screenState) {
884 WarnLog("Screen state not changed");
885 return;
886 }
887 if (GetNciVersion() != NCI_VERSION_2_0) {
888 WarnLog("only update curScreenState when NCI version under 2.0");
889 curScreenState_ = screenState;
890 return;
891 }
892
893 // set power state for screen state.
894 tNFA_STATUS status = NFA_STATUS_FAILED;
895 unsigned char curScreenState = NFA_SCREEN_STATE_OFF_LOCKED | NFA_SCREEN_STATE_OFF_UNLOCKED |
896 NFA_SCREEN_STATE_ON_LOCKED | NFA_SCREEN_STATE_UNKNOWN;
897 if ((curScreenState_ & curScreenState) != 0) {
898 SynchronizeGuard guard(nfcSetPowerSubStateEvent_);
899 status = NFA_SetPowerSubStateForScreenState(screenState);
900 if (status != NFA_STATUS_OK) {
901 ErrorLog("NFA_SetPowerSubStateForScreenState fail, error=0x%{public}X, screenState = %{public}X,\
902 curScreenState_ = %{public}X", status, screenState, curScreenState_);
903 return;
904 }
905 if (nfcSetPowerSubStateEvent_.Wait(NCI_EVT_WAIT_TIMEOUT) == false) {
906 ErrorLog("NfccNciAdapter::SetScreenStatus : SetScreenStatus nfc timeout");
907 }
908 }
909
910 uint8_t discParam = GetDiscovryParam(screenState, screenStateMask);
911 SynchronizeGuard guard(nfcSetConfigEvent_);
912 status = NFA_SetConfig(NCI_PARAM_ID_CON_DISCOVERY_PARAM,
913 NCI_PARAM_LEN_CON_DISCOVERY_PARAM, &discParam);
914 if (status != NFA_STATUS_OK) {
915 ErrorLog("NFA_SetConfig fail, error=0x%{public}X", status);
916 return;
917 }
918 if (nfcSetConfigEvent_.Wait(NCI_EVT_WAIT_TIMEOUT) == false) {
919 ErrorLog("NfccNciAdapter::SetScreenStatus : nfcSetConfigEvent_ nfc timeout");
920 }
921
922 if (curScreenState_ == NFA_SCREEN_STATE_ON_UNLOCKED) {
923 SynchronizeGuard guard(nfcSetPowerSubStateEvent_);
924 status = NFA_SetPowerSubStateForScreenState(screenState);
925 if (status != NFA_STATUS_OK) {
926 ErrorLog("NFA_SetPowerSubStateForScreenState fail, error=0x%{public}X", status);
927 return;
928 }
929 if (nfcSetPowerSubStateEvent_.Wait(NCI_EVT_WAIT_TIMEOUT) == false) {
930 ErrorLog("NfccNciAdapter::SetScreenStatus : SetScreenStatus nfc timeout");
931 }
932 }
933 curScreenState_ = screenState;
934 return;
935 }
936
937 /**
938 * @brief Get nci version.
939 * @return Nci version
940 */
GetNciVersion() const941 uint32_t NfccNciAdapter::GetNciVersion() const
942 {
943 DebugLog("NfccNciAdapter::GetNciVersion");
944 uint8_t version = NFC_GetNCIVersion();
945 return version;
946 }
947
RegisterT3tIdentifier(const std::string & t3tIdentifier) const948 bool NfccNciAdapter::RegisterT3tIdentifier(const std::string& t3tIdentifier) const
949 {
950 DebugLog("NfccNciAdapter::RegisterT3tIdentifier");
951 return true;
952 }
953
DeregisterT3tIdentifier(uint32_t handle) const954 void NfccNciAdapter::DeregisterT3tIdentifier(uint32_t handle) const
955 {
956 DebugLog("NfccNciAdapter::DeregisterT3tIdentifier");
957 }
958
ClearT3tIdentifiersCache()959 void NfccNciAdapter::ClearT3tIdentifiersCache()
960 {
961 DebugLog("NfccNciAdapter::ClearT3tIdentifiersCache");
962 }
963
GetLfT3tMax()964 uint32_t NfccNciAdapter::GetLfT3tMax()
965 {
966 DebugLog("NfccNciAdapter::GetLfT3tMax");
967 return 0;
968 }
969
GetLastError()970 uint32_t NfccNciAdapter::GetLastError()
971 {
972 DebugLog("NfccNciAdapter::GetLastError");
973 return 0;
974 }
975
Abort()976 void NfccNciAdapter::Abort()
977 {
978 InfoLog("NfccNciAdapter::Abort");
979 _exit(0);
980 }
981
982 /**
983 * @brief Check whether to load firmware.
984 * @return True/false to success/fail to load firmware.
985 */
CheckFirmware()986 bool NfccNciAdapter::CheckFirmware()
987 {
988 DebugLog("NfccNciAdapter::CheckFirmware");
989 NfcAdaptation::GetInstance().Initialize();
990 NfcAdaptation::GetInstance().DownloadFirmware(nullptr, true);
991 NfcAdaptation::GetInstance().Finalize();
992 return true;
993 }
994
995 /**
996 * @brief Dump debug info for nfc.
997 * @param fd File descriptor to store debug info.
998 */
Dump(uint32_t fd) const999 void NfccNciAdapter::Dump(uint32_t fd) const
1000 {
1001 DebugLog("NfccNciAdapter::Dump, fd=%{public}d", fd);
1002 NfcAdaptation::GetInstance().Dump(fd);
1003 }
1004
1005 /**
1006 * @brief Reset nfc chip.
1007 */
FactoryReset() const1008 void NfccNciAdapter::FactoryReset() const
1009 {
1010 DebugLog("NfccNciAdapter::FactoryReset");
1011 NfcAdaptation::GetInstance().FactoryReset();
1012 }
1013
1014 /**
1015 * @brief Close nfc.
1016 */
Shutdown() const1017 void NfccNciAdapter::Shutdown() const
1018 {
1019 DebugLog("NfccNciAdapter::Shutdown");
1020 NfcAdaptation::GetInstance().DeviceShutdown();
1021 }
1022
1023 /**
1024 * @brief Query whether to start rf discovery.
1025 * @return True/false to start/stop rf discovery.
1026 */
IsRfEbabled()1027 bool NfccNciAdapter::IsRfEbabled()
1028 {
1029 return rfEnabled_;
1030 }
1031
1032 /**
1033 * @brief Config commit routing table for nfc.
1034 * @return True/false to be successful/failed to config routing table.
1035 */
CommitRouting()1036 bool NfccNciAdapter::CommitRouting()
1037 {
1038 return RoutingManager::GetInstance().CommitRouting();
1039 }
1040
1041 /**
1042 * @brief Computer routing params.
1043 * @return True/false to be successful/failed to computer params.
1044 */
ComputeRoutingParams(int defaultPaymentType)1045 bool NfccNciAdapter::ComputeRoutingParams(int defaultPaymentType)
1046 {
1047 return RoutingManager::GetInstance().ComputeRoutingParams(defaultPaymentType);
1048 }
1049
OnCardEmulationData(const std::vector<uint8_t> & data)1050 void NfccNciAdapter::OnCardEmulationData(const std::vector<uint8_t> &data)
1051 {
1052 DebugLog("NfccNciAdapter::OnCardEmulationData");
1053 if (cardEmulationListener_.expired()) {
1054 ErrorLog("cardEmulationListener_ is null");
1055 return;
1056 }
1057 cardEmulationListener_.lock()->OnCardEmulationData(data);
1058 }
1059
OnCardEmulationActivated()1060 void NfccNciAdapter::OnCardEmulationActivated()
1061 {
1062 DebugLog("NfccNciAdapter::OnCardEmulationActivated");
1063 if (cardEmulationListener_.expired()) {
1064 ErrorLog("cardEmulationListener_ is null");
1065 return;
1066 }
1067 cardEmulationListener_.lock()->OnCardEmulationActivated();
1068 }
OnCardEmulationDeactivated()1069 void NfccNciAdapter::OnCardEmulationDeactivated()
1070 {
1071 DebugLog("NfccNciAdapter::OnCardEmulationDeactivated");
1072 if (cardEmulationListener_.expired()) {
1073 ErrorLog("cardEmulationListener_ is null");
1074 return;
1075 }
1076 cardEmulationListener_.lock()->OnCardEmulationDeactivated();
1077 }
1078 } // namespace NCI
1079 } // namespace NFC
1080 } // namespace OHOS
1081