• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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