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 #include "nfcc_nci_adapter.h"
16 #include "nfcc_host.h"
17 #include "loghelper.h"
18 #include "nfc_config.h"
19 #include "nfc_sdk_common.h"
20 #include "nci_adaptations.h"
21 #include "routing_manager.h"
22 #include "tag_nci_adapter.h"
23
24 using namespace OHOS::NFC;
25 namespace OHOS {
26 namespace NFC {
27 namespace NCI {
28 static const int ISO_DEP_MAX_TRANSEIVE_LENGTH = 0xFEFF;
29
30 OHOS::NFC::SynchronizeEvent NfccNciAdapter::nfcEnableEvent_;
31 OHOS::NFC::SynchronizeEvent NfccNciAdapter::nfcDisableEvent_;
32 OHOS::NFC::SynchronizeEvent NfccNciAdapter::nfcStartStopPollingEvent_;
33
34 bool NfccNciAdapter::isNfcEnabled_ = false;
35 bool NfccNciAdapter::isRoutingInited_ = false;
36 bool NfccNciAdapter::rfEnabled_ = false;
37 bool NfccNciAdapter::discoveryEnabled_ = false; // is polling or listening
38 bool NfccNciAdapter::pollingEnabled_ = false; // is polling for tag
39 bool NfccNciAdapter::isDisabling_ = false;
40 bool NfccNciAdapter::readerModeEnabled_ = false;
41 unsigned long NfccNciAdapter::discoveryDuration_;
42 bool NfccNciAdapter::isTagActive_ = false;
43 unsigned char NfccNciAdapter::curScreenState_ = NFA_SCREEN_STATE_OFF_LOCKED;
44 std::shared_ptr<INfcNci> NfccNciAdapter::nciAdaptation_ = std::make_shared<NciAdaptations>();
45
46 NfccNciAdapter::NfccNciAdapter() = default;
47
48 NfccNciAdapter::~NfccNciAdapter() = default;
49
GetInstance()50 NfccNciAdapter& NfccNciAdapter::GetInstance()
51 {
52 static NfccNciAdapter nfccNciAdapter;
53 return nfccNciAdapter;
54 }
55
IsNfcActive()56 bool NfccNciAdapter::IsNfcActive()
57 {
58 bool isActive = (isNfcEnabled_ && !isDisabling_);
59 return isActive;
60 }
61
IsTagActive() const62 bool NfccNciAdapter::IsTagActive() const
63 {
64 return isTagActive_;
65 }
66
SetNciAdaptation(std::shared_ptr<INfcNci> nciAdaptation)67 void NfccNciAdapter::SetNciAdaptation(std::shared_ptr<INfcNci> nciAdaptation)
68 {
69 if (nciAdaptation == nullptr) {
70 WarnLog("SetNciAdaptation, invalid arg.");
71 return;
72 }
73 nciAdaptation_ = nciAdaptation;
74 }
75
StartRfDiscovery(bool isStart) const76 void NfccNciAdapter::StartRfDiscovery(bool isStart) const
77 {
78 DebugLog("NfccNciAdapter::StartRfDiscovery: isStart= %{public}d", isStart);
79 tNFA_STATUS status = NFA_STATUS_FAILED;
80 if (isStart) {
81 status = nciAdaptation_->NfaStartRfDiscovery();
82 } else {
83 status = nciAdaptation_->NfaStopRfDiscovery();
84 }
85 if (status == NFA_STATUS_OK) {
86 rfEnabled_ = isStart;
87 // wait for NFA_RF_DISCOVERY_STARTED_EVT or NFA_RF_DISCOVERY_STOPPED_EVT
88 nfcStartStopPollingEvent_.Wait();
89 } else {
90 DebugLog("NfccNciAdapter::StartRfDiscovery: Failed to start/stop RF discovery; error=0x%{public}X", status);
91 }
92 }
93
StartPolling(tNFA_TECHNOLOGY_MASK techMask) const94 tNFA_STATUS NfccNciAdapter::StartPolling(tNFA_TECHNOLOGY_MASK techMask) const
95 {
96 DebugLog("NfccNciAdapter::StartPolling, techMask = 0x%{public}02X", techMask);
97 tNFA_STATUS status = nciAdaptation_->NfaEnablePolling(techMask);
98 if (status == NFA_STATUS_OK) {
99 DebugLog("StartPolling: wait for enable event");
100 pollingEnabled_ = true;
101 // wait for NFA_POLL_ENABLED_EVT
102 nfcStartStopPollingEvent_.Wait();
103 } else {
104 DebugLog("NfccNciAdapter::StartPolling: fail enable polling; error = 0x%{public}X", status);
105 }
106 return status;
107 }
108
StopPolling() const109 tNFA_STATUS NfccNciAdapter::StopPolling() const
110 {
111 DebugLog("NfccNciAdapter::StopPolling");
112 tNFA_STATUS status = nciAdaptation_->NfaDisablePolling();
113 if (status == NFA_STATUS_OK) {
114 pollingEnabled_ = false;
115 // wait for NFA_POLL_DISABLED_EVT
116 nfcStartStopPollingEvent_.Wait();
117 } else {
118 DebugLog("NfccNciAdapter::StopPolling: fail disable polling; error = 0x%{public}X", status);
119 }
120 return status;
121 }
122
DoNfaActivatedEvt(tNFA_CONN_EVT_DATA * eventData)123 void NfccNciAdapter::DoNfaActivatedEvt(tNFA_CONN_EVT_DATA* eventData)
124 {
125 if (eventData == nullptr) {
126 WarnLog("DoNfaActivatedEvt, invalid arg.");
127 return;
128 }
129 if (isDisabling_) {
130 return;
131 }
132 if (eventData->activated.activate_ntf.protocol == NCI_PROTOCOL_NFC_DEP) {
133 WarnLog("Is peer to peer");
134 return;
135 }
136
137 if (eventData->activated.activate_ntf.rf_tech_param.mode < NCI_DISCOVERY_TYPE_LISTEN_A &&
138 eventData->activated.activate_ntf.intf_param.type != NFC_INTERFACE_EE_DIRECT_RF) {
139 isTagActive_ = true;
140 /* Is polling and is not ee direct rf */
141 if (TagNciAdapter::GetInstance().IsReconnecting()) {
142 DebugLog("isReconnect, %{public}d", TagNciAdapter::GetInstance().IsReconnecting());
143 TagNciAdapter::GetInstance().HandleActivatedResult();
144 return;
145 }
146 TagNciAdapter::GetInstance().ResetTagFieldOnFlag();
147 TagNciAdapter::GetInstance().BuildTagInfo(eventData);
148 }
149 if (TagNciAdapter::GetInstance().GetDiscRstEvtNum() > 0) {
150 NFA_Deactivate(true);
151 }
152 }
153
DoNfaDeactivatedEvt(tNFA_CONN_EVT_DATA * eventData)154 void NfccNciAdapter::DoNfaDeactivatedEvt(tNFA_CONN_EVT_DATA* eventData)
155 {
156 TagNciAdapter::GetInstance().SelectTheNextTag();
157 if (eventData->deactivated.type == NFA_DEACTIVATE_TYPE_SLEEP) {
158 DebugLog("Enter sleep mode");
159 return;
160 }
161 TagNciAdapter::GetInstance().HandleDeactivatedResult();
162 isTagActive_ = false;
163 }
164
DoNfaDiscResultEvt(tNFA_CONN_EVT_DATA * eventData)165 void NfccNciAdapter::DoNfaDiscResultEvt(tNFA_CONN_EVT_DATA* eventData)
166 {
167 static tNFA_STATUS status = eventData->disc_result.status;
168 DebugLog("DoNfaDiscResultEvt: status = 0x%{public}X", status);
169 if (status != NFA_STATUS_OK) {
170 TagNciAdapter::GetInstance().SetDiscRstEvtNum(0);
171 } else {
172 TagNciAdapter::GetInstance().GetMultiTagTechsFromData(eventData->disc_result);
173 TagNciAdapter::GetInstance().SetDiscRstEvtNum(TagNciAdapter::GetInstance().GetDiscRstEvtNum() + 1);
174 if (eventData->disc_result.discovery_ntf.more == NCI_DISCOVER_NTF_MORE) {
175 return;
176 }
177 if (TagNciAdapter::GetInstance().GetDiscRstEvtNum() > 1) {
178 TagNciAdapter::GetInstance().SetIsMultiTag(true);
179 }
180 TagNciAdapter::GetInstance().SetDiscRstEvtNum(TagNciAdapter::GetInstance().GetDiscRstEvtNum() - 1);
181 // select the first tag of multiple tags that discovered
182 TagNciAdapter::GetInstance().SelectTheFirstTag();
183 }
184 }
185
DoNfaPresenceEvt(tNFA_CONN_EVT_DATA * eventData)186 void NfccNciAdapter::DoNfaPresenceEvt(tNFA_CONN_EVT_DATA* eventData)
187 {
188 static tNFA_STATUS curStatus = NFA_STATUS_FAILED;
189 if (eventData->status != curStatus) {
190 curStatus = eventData->status;
191 }
192 TagNciAdapter::GetInstance().HandleFieldCheckResult(curStatus);
193 }
194
NfcConnectionCallback(uint8_t connEvent,tNFA_CONN_EVT_DATA * eventData)195 void NfccNciAdapter::NfcConnectionCallback(uint8_t connEvent, tNFA_CONN_EVT_DATA* eventData)
196 {
197 switch (connEvent) {
198 /* whether polling successfully started */
199 case NFA_POLL_ENABLED_EVT: {
200 DebugLog("NfaConnectionCallback: NFA_POLL_ENABLED_EVT: status = %{public}u", eventData->status);
201 DoNfaPollEnabledDisabledEvt();
202 break;
203 }
204 /* Listening/Polling stopped */
205 case NFA_POLL_DISABLED_EVT: {
206 DebugLog("NfaConnectionCallback: NFA_POLL_DISABLED_EVT: status = %{public}u", eventData->status);
207 DoNfaPollEnabledDisabledEvt();
208 break;
209 }
210 /* RF Discovery started event */
211 case NFA_RF_DISCOVERY_STARTED_EVT: {
212 DebugLog("NfaConnectionCallback: NFA_RF_DISCOVERY_STARTED_EVT: status = %{public}u", eventData->status);
213 DoNfaPollEnabledDisabledEvt();
214 break;
215 }
216 /* RF Discovery stopped event */
217 case NFA_RF_DISCOVERY_STOPPED_EVT: {
218 DebugLog("NfaConnectionCallback: NFA_RF_DISCOVERY_STOPPED_EVT: status = %{public}u", eventData->status);
219 DoNfaPollEnabledDisabledEvt();
220 break;
221 }
222 /* NFC link/protocol activated */
223 case NFA_ACTIVATED_EVT: {
224 DebugLog("NfaConnectionCallback: NFA_ACTIVATED_EVT");
225 DoNfaActivatedEvt(eventData);
226 break;
227 }
228 /* NFC link/protocol deactivated */
229 case NFA_DEACTIVATED_EVT: {
230 DebugLog("NfaConnectionCallback: NFA_DEACTIVATED_EVT");
231 DoNfaDeactivatedEvt(eventData);
232 break;
233 }
234 case NFA_DISC_RESULT_EVT: {
235 DebugLog("NfaConnectionCallback: NFA_DISC_RESULT_EVT");
236 DoNfaDiscResultEvt(eventData);
237 break;
238 }
239 case NFA_SELECT_RESULT_EVT: {
240 DebugLog("NfaConnectionCallback: NFA_SELECT_RESULT_EVT: status = 0x%{public}X", eventData->status);
241 TagNciAdapter::GetInstance().HandleSelectResult();
242 break;
243 }
244 /* Data message received (for non-NDEF reads) */
245 case NFA_DATA_EVT: {
246 DebugLog("NfaConnectionCallback: NFA_DATA_EVT: status = 0x%{public}X, len = %{public}d",
247 eventData->status, eventData->data.len);
248 TagNciAdapter::GetInstance().HandleTranceiveData(eventData->status, eventData->data.p_data,
249 eventData->data.len);
250 break;
251 }
252 case NFA_PRESENCE_CHECK_EVT: {
253 DoNfaPresenceEvt(eventData);
254 break;
255 }
256 case NFA_READ_CPLT_EVT: {
257 DebugLog("NfaConnectionCallback: NFA_READ_CPLT_EVT: status = 0x%{public}X", eventData->status);
258 TagNciAdapter::GetInstance().HandleReadComplete(eventData->status);
259 break;
260 }
261 case NFA_WRITE_CPLT_EVT: {
262 DebugLog("NfaConnectionCallback: NFA_WRITE_CPLT_EVT: status = 0x%{public}X", eventData->status);
263 TagNciAdapter::GetInstance().HandleWriteComplete(eventData->status);
264 break;
265 }
266 case NFA_FORMAT_CPLT_EVT: {
267 DebugLog("NfaConnectionCallback: NFA_FORMAT_CPLT_EVT: status = 0x%{public}X", eventData->status);
268 TagNciAdapter::GetInstance().HandleFormatComplete(eventData->status);
269 break;
270 }
271 case NFA_NDEF_DETECT_EVT: {
272 DebugLog("NfaConnectionCallback: NFA_NDEF_DETECT_EVT: status = 0x%{public}X, protocol = 0x%{public}X,"
273 " max_size = %{public}u, cur_size = %{public}u, flags = 0x%{public}X",
274 eventData->ndef_detect.status, eventData->ndef_detect.protocol,
275 static_cast<unsigned int>(eventData->ndef_detect.max_size),
276 static_cast<unsigned int>(eventData->ndef_detect.cur_size), eventData->ndef_detect.flags);
277 TagNciAdapter::GetInstance().HandleNdefCheckResult(eventData->ndef_detect.status,
278 eventData->ndef_detect.cur_size,
279 eventData->ndef_detect.flags,
280 eventData->ndef_detect.max_size);
281 break;
282 }
283 default: {
284 DebugLog("NfaConnectionCallback: unknown event %{public}u", connEvent);
285 break;
286 }
287 }
288 }
289
DoNfaPollEnabledDisabledEvt()290 void NfccNciAdapter::DoNfaPollEnabledDisabledEvt()
291 {
292 SynchronizeGuard guard(nfcStartStopPollingEvent_);
293 nfcStartStopPollingEvent_.NotifyOne();
294 }
295
DoNfaDmEnableEvt(tNFA_DM_CBACK_DATA * eventData)296 void NfccNciAdapter::DoNfaDmEnableEvt(tNFA_DM_CBACK_DATA* eventData)
297 {
298 SynchronizeGuard guard(nfcEnableEvent_);
299 isNfcEnabled_ = (eventData->status == NFA_STATUS_OK);
300 isDisabling_ = false;
301 nfcEnableEvent_.NotifyOne();
302 }
303
DoNfaDmDisableEvt(tNFA_DM_CBACK_DATA * eventData)304 void NfccNciAdapter::DoNfaDmDisableEvt(tNFA_DM_CBACK_DATA* eventData)
305 {
306 isNfcEnabled_ = false;
307 isDisabling_ = false;
308 }
309
DoNfaDmRfFieldEvt(tNFA_DM_CBACK_DATA * eventData)310 void NfccNciAdapter::DoNfaDmRfFieldEvt(tNFA_DM_CBACK_DATA* eventData)
311 {
312 if (eventData->rf_field.status == NFA_STATUS_OK) {
313 if (eventData->rf_field.rf_field_status == NFA_DM_RF_FIELD_ON) {
314 NfccHost::RemoteFieldActivated();
315 } else {
316 NfccHost::RemoteFieldDeactivated();
317 }
318 }
319 }
320
DoNfaDmNfccTimeoutEvt(tNFA_DM_CBACK_DATA * eventData)321 void NfccNciAdapter::DoNfaDmNfccTimeoutEvt(tNFA_DM_CBACK_DATA* eventData)
322 {
323 discoveryEnabled_ = false;
324 pollingEnabled_ = false;
325
326 if (IsNfcActive()) {
327 nciAdaptation_->NfaDisable(FALSE);
328 isDisabling_ = true;
329 } else {
330 isNfcEnabled_ = false;
331 isDisabling_ = false;
332 }
333 }
334
NfcDeviceManagementCallback(uint8_t dmEvent,tNFA_DM_CBACK_DATA * eventData)335 void NfccNciAdapter::NfcDeviceManagementCallback(uint8_t dmEvent, tNFA_DM_CBACK_DATA* eventData)
336 {
337 DebugLog("NfaDeviceManagementCallback: event= %{public}u", dmEvent);
338
339 switch (dmEvent) {
340 /* Result of NFA_Enable */
341 case NFA_DM_ENABLE_EVT: {
342 DebugLog("NfaDeviceManagementCallback: NFA_DM_ENABLE_EVT; status = 0x%{public}X", eventData->status);
343 DoNfaDmEnableEvt(eventData);
344 break;
345 }
346 /* Result of NFA_Disable */
347 case NFA_DM_DISABLE_EVT: {
348 DebugLog("NfaDeviceManagementCallback: NFA_DM_DISABLE_EVT");
349 DoNfaDmDisableEvt(eventData);
350 break;
351 }
352
353 case NFA_DM_RF_FIELD_EVT: {
354 DebugLog("NfaDeviceManagementCallback: NFA_DM_RF_FIELD_EVT; status = 0x%{public}X; field status = "
355 "%{public}u", eventData->rf_field.status, eventData->rf_field.rf_field_status);
356 DoNfaDmRfFieldEvt(eventData);
357 break;
358 }
359
360 case NFA_DM_NFCC_TRANSPORT_ERR_EVT:
361 case NFA_DM_NFCC_TIMEOUT_EVT: {
362 DoNfaDmNfccTimeoutEvt(eventData);
363 break;
364 }
365
366 case NFA_DM_SET_CONFIG_EVT: {
367 DebugLog("NfaDeviceManagementCallback: NFA_DM_SET_CONFIG_EVT");
368 break;
369 }
370
371 case NFA_DM_SET_POWER_SUB_STATE_EVT: {
372 DebugLog("NfaDeviceManagementCallback: NFA_DM_SET_POWER_SUB_STATE_EVT; status=0x%{public}X",
373 eventData->power_mode.status);
374 break;
375 }
376
377 default: {
378 DebugLog("NfaDeviceManagementCallback: unknown event %{public}d", dmEvent);
379 break;
380 }
381 }
382 }
383
Initialize()384 bool NfccNciAdapter::Initialize()
385 {
386 DebugLog("NfccNciAdapter::Initialize");
387 tNFA_STATUS status = NFA_STATUS_FAILED;
388 if (isNfcEnabled_) {
389 DebugLog("NfccNciAdapter::Initialize: already enabled");
390 return isNfcEnabled_;
391 }
392
393 nciAdaptation_->NfcAdaptationInitialize(); // start GKI, NCI task, NFC task
394 {
395 SynchronizeGuard guard(nfcEnableEvent_);
396 tHAL_NFC_ENTRY* halFuncEntries = nciAdaptation_->NfcAdaptationGetHalEntryFuncs();
397
398 nciAdaptation_->NfaInit(halFuncEntries);
399 status = nciAdaptation_->NfaEnable(NfcDeviceManagementCallback, NfcConnectionCallback);
400 if (status == NFA_STATUS_OK) {
401 nfcEnableEvent_.Wait();
402 }
403 }
404
405 if (status == NFA_STATUS_OK) {
406 // sIsNfaEnabled indicates whether stack started successfully
407 if (isNfcEnabled_) {
408 #ifdef _NFC_SERVICE_HCE_
409 NciBalCe::GetInstance().InitializeCe();
410 HciManager::GetInstance().Initialize();
411 #endif
412 isRoutingInited_ = RoutingManager::GetInstance().Initialize();
413 TagNciAdapter::GetInstance().RegisterNdefHandler();
414 discoveryDuration_ = DEFAULT_DISCOVERY_DURATION;
415 nciAdaptation_->NfaSetRfDiscoveryDuration((uint16_t)discoveryDuration_);
416 DebugLog("NfccNciAdapter::Initialize: nfc enabled = %{public}d", isNfcEnabled_);
417 return isNfcEnabled_;
418 }
419 }
420 ErrorLog("NfccNciAdapter::Initialize: fail nfa enable; error = %{public}d", status);
421 if (isNfcEnabled_) {
422 /* ungraceful */
423 status = nciAdaptation_->NfaDisable(false);
424 DebugLog("NfccNciAdapter::Initialize: status = %{public}d", status);
425 }
426 nciAdaptation_->NfcAdaptationFinalize();
427 DebugLog("NfccNciAdapter::Initialize: nfc enabled = %{public}d", isNfcEnabled_);
428 return isNfcEnabled_;
429 }
430
Deinitialize()431 bool NfccNciAdapter::Deinitialize()
432 {
433 DebugLog("NfccNciAdapter::Deinitialize");
434 if (!IsNfcActive()) {
435 DebugLog("NfccNciAdapter::Deinitialize: Nfc not initialized");
436 return NFA_STATUS_OK;
437 }
438
439 tNFA_STATUS status = NFA_STATUS_OK;
440 isDisabling_ = true;
441
442 #ifdef _NFC_SERVICE_HCE_
443 NciBalCe::GetInstance().Deinitialize();
444 #endif
445 RoutingManager::GetInstance().Deinitialize();
446
447 if (isNfcEnabled_) {
448 /* graceful */
449 status = nciAdaptation_->NfaDisable(true);
450 if (status == NFA_STATUS_OK) {
451 DebugLog("NfccNciAdapter::Deinitialize: wait for completion");
452 } else {
453 ErrorLog("NfccNciAdapter::Deinitialize: fail disable; error = 0x%{public}X", status);
454 }
455 }
456 isNfcEnabled_ = false;
457 isRoutingInited_ = false;
458 discoveryEnabled_ = false;
459 isDisabling_ = false;
460 pollingEnabled_ = false;
461
462 nciAdaptation_->NfcAdaptationFinalize();
463 DebugLog("NfccNciAdapter::Deinitialize: exit");
464 return (status == NFA_STATUS_OK);
465 }
466
EnableDiscovery(uint16_t techMask,bool enableReaderMode,bool enableHostRouting,bool restart)467 void NfccNciAdapter::EnableDiscovery(uint16_t techMask, bool enableReaderMode, bool enableHostRouting, bool restart)
468 {
469 DebugLog("NfccNciAdapter::EnableDiscovery");
470 if (!IsNfcActive()) {
471 ErrorLog("NfccNciAdapter::EnableDiscovery: Nfc not initialized.");
472 return;
473 }
474
475 if (discoveryEnabled_ && !restart) {
476 DebugLog("NfccNciAdapter::EnableDiscovery: already discovering");
477 return;
478 }
479
480 if (rfEnabled_) {
481 // Stop RF discovery to reconfigure
482 StartRfDiscovery(false);
483 }
484
485 tNFA_TECHNOLOGY_MASK technologyMask = DEFAULT_TECH_MASK;
486 technologyMask = techMask & DEFAULT_TECH_MASK;
487
488 if (technologyMask != 0) {
489 StopPolling();
490 StartPolling(technologyMask);
491 if (pollingEnabled_) {
492 if (enableReaderMode && !readerModeEnabled_) {
493 readerModeEnabled_ = true;
494 nciAdaptation_->NfaDisableListening();
495 nciAdaptation_->NfaSetRfDiscoveryDuration(DISCOVERY_DURATION);
496 } else if (!enableReaderMode && readerModeEnabled_) {
497 readerModeEnabled_ = false;
498 nciAdaptation_->NfaEnableListening();
499 nciAdaptation_->NfaSetRfDiscoveryDuration(DISCOVERY_DURATION);
500 }
501 }
502 } else {
503 StopPolling();
504 }
505 #ifdef _NFC_SERVICE_HCE_
506 NciBalCe::GetInstance().EnableHostRouting(enableHostRouting);
507 NciBalCe::GetInstance().CommitRouting();
508 #endif
509
510 StartRfDiscovery(true);
511 discoveryEnabled_ = true;
512 DebugLog("NfccNciAdapter::EnableDiscovery: exit");
513 }
514
DisableDiscovery()515 void NfccNciAdapter::DisableDiscovery()
516 {
517 DebugLog("NfccNciAdapter::DisableDiscovery");
518 if (!IsNfcActive()) {
519 ErrorLog("NfccNciAdapter::DisableDiscovery: Nfc not initialized.");
520 return;
521 }
522 if (!discoveryEnabled_) {
523 DebugLog("NfccNciAdapter::DisableDiscovery: already disabled");
524 return;
525 }
526 // Stop RF Discovery.
527 StartRfDiscovery(false);
528 if (pollingEnabled_) {
529 StopPolling();
530 }
531 discoveryEnabled_ = false;
532 readerModeEnabled_ = false;
533 DebugLog("NfccNciAdapter::DisableDiscovery: exit");
534 }
535
SendRawFrame(std::string & rawData)536 bool NfccNciAdapter::SendRawFrame(std::string& rawData)
537 {
538 if (nciAdaptation_ == nullptr) {
539 ErrorLog("NfccNciAdapter::SendRawFrame invalid state.");
540 return false;
541 }
542 uint16_t length = KITS::NfcSdkCommon::GetHexStrBytesLen(rawData);
543 uint8_t data[length];
544 for (uint32_t i = 0; i < length; i++) {
545 data[i] = KITS::NfcSdkCommon::GetByteFromHexStr(rawData, i);
546 }
547 tNFA_STATUS status = nciAdaptation_->NfaSendRawFrame(data, length, 0);
548 InfoLog("SendRawFrame status = %{public}d", status);
549 return status == NFA_STATUS_OK;
550 }
551
GetDiscovryParam(unsigned char screenState,unsigned char screenStateMask)552 uint8_t NfccNciAdapter::GetDiscovryParam(unsigned char screenState, unsigned char screenStateMask)
553 {
554 // discocery parameters for SCREEN OFF_LOCKED or OFF_UNLOCKED
555 if (screenState == NFA_SCREEN_STATE_OFF_LOCKED || screenState == NFA_SCREEN_STATE_OFF_UNLOCKED) {
556 return (NCI_POLLING_DH_DISABLE_MASK | NCI_LISTEN_DH_NFCEE_DISABLE_MASK);
557 }
558
559 // discocery parameters for SCREEN ON_LOCKED
560 if (screenState == NFA_SCREEN_STATE_ON_LOCKED) {
561 return (screenStateMask & NFA_SCREEN_POLLING_TAG_MASK)
562 ? (NCI_POLLING_DH_ENABLE_MASK | NCI_LISTEN_DH_NFCEE_ENABLE_MASK)
563 : (NCI_POLLING_DH_DISABLE_MASK | NCI_LISTEN_DH_NFCEE_ENABLE_MASK);
564 }
565
566 // discocery parameters for SCREEN ON_UNLOCKED
567 if (screenState == NFA_SCREEN_STATE_ON_UNLOCKED) {
568 return (NCI_POLLING_DH_ENABLE_MASK | NCI_LISTEN_DH_NFCEE_ENABLE_MASK);
569 }
570
571 // default discocery parameters
572 return (NCI_POLLING_DH_ENABLE_MASK | NCI_LISTEN_DH_NFCEE_ENABLE_MASK);
573 }
574
SetScreenStatus(unsigned char screenStateMask) const575 void NfccNciAdapter::SetScreenStatus(unsigned char screenStateMask) const
576 {
577 DebugLog("NfccNciAdapter::SetScreenStatus");
578 if (!IsNfcActive()) {
579 DebugLog("Do not handle Screen state change when NFC is not active");
580 return;
581 }
582 unsigned char screenState = screenStateMask & NFA_SCREEN_STATE_MASK;
583 if (curScreenState_ == screenState) {
584 DebugLog("Screen state not changed");
585 return;
586 }
587 if (GetNciVersion() != NCI_VERSION_2_0) {
588 DebugLog("only update curScreenState when NCI version under 2.0");
589 curScreenState_ = screenState;
590 return;
591 }
592
593 // set power state for screen state.
594 tNFA_STATUS status = NFA_STATUS_FAILED;
595 if (curScreenState_ == NFA_SCREEN_STATE_OFF_LOCKED || curScreenState_ == NFA_SCREEN_STATE_OFF_UNLOCKED ||
596 curScreenState_ == NFA_SCREEN_STATE_ON_LOCKED || curScreenState_ == NFA_SCREEN_STATE_UNKNOWN) {
597 status = nciAdaptation_->NfcSetPowerSubStateForScreenState(screenState);
598 if (status != NFA_STATUS_OK) {
599 ErrorLog("NFA_SetPowerSubStateForScreenState fail, error=0x%{public}X", status);
600 return;
601 }
602 }
603
604 uint8_t discParam = GetDiscovryParam(screenState, screenStateMask);
605 status = nciAdaptation_->NfcSetConfig(NCI_PARAM_ID_CON_DISCOVERY_PARAM,
606 NCI_PARAM_LEN_CON_DISCOVERY_PARAM, &discParam);
607 if (status != NFA_STATUS_OK) {
608 ErrorLog("NFA_SetConfig fail, error=0x%{public}X", status);
609 return;
610 }
611
612 if (curScreenState_ == NFA_SCREEN_STATE_ON_UNLOCKED) {
613 status = nciAdaptation_->NfcSetPowerSubStateForScreenState(screenState);
614 if (status != NFA_STATUS_OK) {
615 ErrorLog("NFA_SetPowerSubStateForScreenState fail, error=0x%{public}X", status);
616 return;
617 }
618 }
619 curScreenState_ = screenState;
620 return;
621 }
622
GetNciVersion() const623 int NfccNciAdapter::GetNciVersion() const
624 {
625 DebugLog("NfccNciAdapter::GetNciVersion");
626 unsigned char version = nciAdaptation_->NfcGetNciVersion();
627 return version;
628 }
629
GetIsoDepMaxTransceiveLength()630 int NfccNciAdapter::GetIsoDepMaxTransceiveLength()
631 {
632 DebugLog("NfccNciAdapter::GetIsoDepMaxTransceiveLength");
633 if (NfcConfig::hasKey(NAME_ISO_DEP_MAX_TRANSCEIVE)) {
634 return NfcConfig::getUnsigned(NAME_ISO_DEP_MAX_TRANSCEIVE);
635 } else {
636 return ISO_DEP_MAX_TRANSEIVE_LENGTH;
637 }
638 }
639
RegisterT3tIdentifier(const std::string & t3tIdentifier) const640 bool NfccNciAdapter::RegisterT3tIdentifier(const std::string& t3tIdentifier) const
641 {
642 DebugLog("NfccNciAdapter::RegisterT3tIdentifier");
643 return true;
644 }
645
DeregisterT3tIdentifier(int handle) const646 void NfccNciAdapter::DeregisterT3tIdentifier(int handle) const
647 {
648 DebugLog("NfccNciAdapter::DeregisterT3tIdentifier");
649 }
650
ClearT3tIdentifiersCache()651 void NfccNciAdapter::ClearT3tIdentifiersCache()
652 {
653 DebugLog("NfccNciAdapter::ClearT3tIdentifiersCache");
654 }
655
GetLfT3tMax()656 int NfccNciAdapter::GetLfT3tMax()
657 {
658 DebugLog("NfccNciAdapter::GetLfT3tMax");
659 return 0;
660 }
661
GetLastError()662 int NfccNciAdapter::GetLastError()
663 {
664 DebugLog("NfccNciAdapter::GetLastError");
665 return 0;
666 }
667
Abort()668 void NfccNciAdapter::Abort()
669 {
670 DebugLog("NfccNciAdapter::Abort");
671 }
672
CheckFirmware()673 bool NfccNciAdapter::CheckFirmware()
674 {
675 DebugLog("NfccNciAdapter::CheckFirmware");
676 nciAdaptation_->NfcAdaptationInitialize();
677 nciAdaptation_->NfcAdaptationDownloadFirmware();
678 nciAdaptation_->NfcAdaptationFinalize();
679 return true;
680 }
681
Dump(int fd) const682 void NfccNciAdapter::Dump(int fd) const
683 {
684 DebugLog("NfccNciAdapter::Dump, fd=%{public}d", fd);
685 nciAdaptation_->NfcAdaptationDump(fd);
686 }
687
FactoryReset() const688 void NfccNciAdapter::FactoryReset() const
689 {
690 DebugLog("NfccNciAdapter::FactoryReset");
691 nciAdaptation_->NfcAdaptationFactoryReset();
692 }
693
Shutdown() const694 void NfccNciAdapter::Shutdown() const
695 {
696 DebugLog("NfccNciAdapter::Shutdown");
697 nciAdaptation_->NfcAdaptationDeviceShutdown();
698 }
699
IsRfEbabled()700 bool NfccNciAdapter::IsRfEbabled()
701 {
702 return rfEnabled_;
703 }
704
CommitRouting()705 bool NfccNciAdapter::CommitRouting()
706 {
707 return RoutingManager::GetInstance().CommitRouting();
708 }
709
ComputeRoutingParams()710 bool NfccNciAdapter::ComputeRoutingParams()
711 {
712 return RoutingManager::GetInstance().ComputeRoutingParams();
713 }
714 } // namespace NCI
715 } // namespace NFC
716 } // namespace OHOS
717