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