1 /****************************************************************************** 2 * 3 * Copyright (C) 2010-2014 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19 /****************************************************************************** 20 * 21 * This file contains the action functions for device manager state 22 * machine. 23 * 24 ******************************************************************************/ 25 #include <string.h> 26 27 #include <android-base/stringprintf.h> 28 #include <base/logging.h> 29 30 #include "nci_hmsgs.h" 31 #include "nfa_api.h" 32 #include "nfa_ce_int.h" 33 #include "nfa_p2p_int.h" 34 #include "nfa_rw_api.h" 35 #include "nfa_rw_int.h" 36 37 #if (NFC_NFCEE_INCLUDED == TRUE) 38 #include "nfa_ee_int.h" 39 40 #endif 41 42 #if (NFA_SNEP_INCLUDED == TRUE) 43 #include "nfa_snep_int.h" 44 #endif 45 46 using android::base::StringPrintf; 47 48 extern bool nfc_debug_enabled; 49 50 /* This is the timeout value to guarantee disable is performed within reasonable 51 * amount of time */ 52 #ifndef NFA_DM_DISABLE_TIMEOUT_VAL 53 #define NFA_DM_DISABLE_TIMEOUT_VAL 1000 54 #endif 55 56 static void nfa_dm_set_init_nci_params(void); 57 static tNFA_STATUS nfa_dm_start_polling(void); 58 static bool nfa_dm_deactivate_polling(void); 59 static void nfa_dm_excl_disc_cback(tNFA_DM_RF_DISC_EVT event, 60 tNFC_DISCOVER* p_data); 61 static void nfa_dm_poll_disc_cback(tNFA_DM_RF_DISC_EVT event, 62 tNFC_DISCOVER* p_data); 63 64 /******************************************************************************* 65 ** 66 ** Function nfa_dm_module_init_cback 67 ** 68 ** Description Processing initialization complete event from sub-modules 69 ** 70 ** Returns None 71 ** 72 *******************************************************************************/ 73 static void nfa_dm_module_init_cback(void) { 74 tNFA_DM_CBACK_DATA dm_cback_data; 75 76 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_ENABLE_EVT_PEND; 77 78 /* All subsystem are initialized */ 79 dm_cback_data.status = NFA_STATUS_OK; 80 (*nfa_dm_cb.p_dm_cback)(NFA_DM_ENABLE_EVT, &dm_cback_data); 81 } 82 83 /******************************************************************************* 84 ** 85 ** Function nfa_dm_nfcc_power_mode_proc_complete_cback 86 ** 87 ** Description Processing complete of processing NFCC power state change 88 ** from all sub-modules 89 ** 90 ** Returns None 91 ** 92 *******************************************************************************/ 93 static void nfa_dm_nfcc_power_mode_proc_complete_cback(void) { 94 tNFA_DM_PWR_MODE_CHANGE power_mode_change; 95 96 DLOG_IF(INFO, nfc_debug_enabled) 97 << StringPrintf("nfcc_pwr_mode = 0x%x", nfa_dm_cb.nfcc_pwr_mode); 98 99 /* if NFCC power state is change to full power */ 100 if (nfa_dm_cb.nfcc_pwr_mode != NFA_DM_PWR_MODE_OFF_SLEEP) { 101 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_NFCC_IS_RESTORING; 102 103 /* reconfigure BRCM NFCC */ 104 nfa_dm_disc_sm_execute(NFA_DM_RF_DISCOVER_CMD, NULL); 105 } 106 107 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_SETTING_PWR_MODE; 108 109 power_mode_change.status = NFA_STATUS_OK; 110 power_mode_change.power_mode = nfa_dm_cb.nfcc_pwr_mode; 111 tNFA_DM_CBACK_DATA nfa_dm_cback_data; 112 nfa_dm_cback_data.power_mode = power_mode_change; 113 (*nfa_dm_cb.p_dm_cback)(NFA_DM_PWR_MODE_CHANGE_EVT, &nfa_dm_cback_data); 114 } 115 /******************************************************************************* 116 ** 117 ** Function nfa_dm_sys_enable 118 ** 119 ** Description This function on enable 120 ** 121 ** Returns void 122 ** 123 *******************************************************************************/ 124 void nfa_dm_sys_enable(void) { nfa_dm_set_init_nci_params(); } 125 126 /******************************************************************************* 127 ** 128 ** Function nfa_dm_set_init_nci_params 129 ** 130 ** Description Set initial NCI configuration parameters 131 ** 132 ** Returns void 133 ** 134 *******************************************************************************/ 135 static void nfa_dm_set_init_nci_params(void) { 136 uint8_t xx; 137 138 /* set NCI default value if other than zero */ 139 140 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) { 141 /* Default Values: For each identifier 142 * Octet 0-1 = OxFF 143 * Octet 2 = Ox02 144 * Octet 3 = 0xFE 145 * Octet 4-9 = 0x00 146 * Octet 10-17 = 0xFF*/ 147 for (xx = 0; xx < NFA_CE_LISTEN_INFO_MAX; xx++) { 148 nfa_dm_cb.params.lf_t3t_id[xx][0] = 0xFF; 149 nfa_dm_cb.params.lf_t3t_id[xx][1] = 0xFF; 150 nfa_dm_cb.params.lf_t3t_id[xx][2] = 0x02; 151 nfa_dm_cb.params.lf_t3t_id[xx][3] = 0xFE; 152 } 153 154 /* LF_T3T_PMM value is added to LF_T3T_IDENTIFIERS_X in NCI2.0. */ 155 for (xx = 0; xx < NFA_CE_LISTEN_INFO_MAX; xx++) { 156 for (uint8_t yy = 10; yy < NCI_PARAM_LEN_LF_T3T_ID(NCI_VERSION_2_0); yy++) 157 nfa_dm_cb.params.lf_t3t_id[xx][yy] = 0xFF; 158 } 159 } else { 160 /* LF_T3T_IDENTIFIERS_1/2/.../16 */ 161 for (xx = 0; xx < NFA_CE_LISTEN_INFO_MAX; xx++) { 162 nfa_dm_cb.params.lf_t3t_id[xx][0] = 0xFF; 163 nfa_dm_cb.params.lf_t3t_id[xx][1] = 0xFF; 164 nfa_dm_cb.params.lf_t3t_id[xx][2] = 0x02; 165 nfa_dm_cb.params.lf_t3t_id[xx][3] = 0xFE; 166 } 167 168 /* LF_T3T_PMM */ 169 for (xx = 0; xx < NCI_PARAM_LEN_LF_T3T_PMM; xx++) { 170 nfa_dm_cb.params.lf_t3t_pmm[xx] = 0xFF; 171 } 172 } 173 174 /* LF_T3T_FLAGS: 175 ** DH needs to set this configuration, even if default value (not listening) 176 ** is used, to let NFCC know of intention (not listening) of DH. 177 */ 178 179 /* FWI */ 180 nfa_dm_cb.params.fwi[0] = 0x04; 181 182 /* WT */ 183 nfa_dm_cb.params.wt[0] = 14; 184 185 /* Set CE default configuration */ 186 if (p_nfa_dm_ce_cfg[0]) { 187 nfa_dm_check_set_config(p_nfa_dm_ce_cfg[0], &p_nfa_dm_ce_cfg[1], false); 188 } 189 190 /* Set optional general default configuration */ 191 if (p_nfa_dm_gen_cfg && p_nfa_dm_gen_cfg[0]) { 192 nfa_dm_check_set_config(p_nfa_dm_gen_cfg[0], &p_nfa_dm_gen_cfg[1], false); 193 } 194 195 if (p_nfa_dm_interface_mapping && nfa_dm_num_dm_interface_mapping) { 196 NFC_DiscoveryMap(nfa_dm_num_dm_interface_mapping, 197 p_nfa_dm_interface_mapping, NULL); 198 } 199 } 200 201 /******************************************************************************* 202 ** 203 ** Function nfa_dm_proc_nfcc_power_mode 204 ** 205 ** Description Processing NFCC power mode changes 206 ** 207 ** Returns None 208 ** 209 *******************************************************************************/ 210 void nfa_dm_proc_nfcc_power_mode(uint8_t nfcc_power_mode) { 211 DLOG_IF(INFO, nfc_debug_enabled) 212 << StringPrintf("nfcc_power_mode=%d", nfcc_power_mode); 213 214 /* if NFCC power mode is change to full power */ 215 if (nfcc_power_mode == NFA_DM_PWR_MODE_FULL) { 216 memset(&nfa_dm_cb.params, 0x00, sizeof(tNFA_DM_PARAMS)); 217 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 218 "setcfg_pending_mask=0x%x, setcfg_pending_num=%d", 219 nfa_dm_cb.setcfg_pending_mask, nfa_dm_cb.setcfg_pending_num); 220 nfa_dm_cb.setcfg_pending_mask = 0; 221 nfa_dm_cb.setcfg_pending_num = 0; 222 223 nfa_dm_set_init_nci_params(); 224 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_POWER_OFF_SLEEP; 225 } else if (nfcc_power_mode == NFA_DM_PWR_MODE_OFF_SLEEP) { 226 nfa_dm_cb.flags |= NFA_DM_FLAGS_POWER_OFF_SLEEP; 227 } 228 229 nfa_sys_cback_notify_nfcc_power_mode_proc_complete(NFA_ID_DM); 230 } 231 232 /******************************************************************************* 233 ** 234 ** Function nfa_dm_disable_event 235 ** 236 ** Description report disable event 237 ** 238 ** Returns void 239 ** 240 *******************************************************************************/ 241 static void nfa_dm_disable_event(void) { 242 /* Deregister DM from sys */ 243 nfa_sys_deregister(NFA_ID_DM); 244 245 /* Notify app */ 246 nfa_dm_cb.flags &= 247 ~(NFA_DM_FLAGS_DM_IS_ACTIVE | NFA_DM_FLAGS_DM_DISABLING_NFC | 248 NFA_DM_FLAGS_ENABLE_EVT_PEND); 249 (*nfa_dm_cb.p_dm_cback)(NFA_DM_DISABLE_EVT, NULL); 250 } 251 252 /******************************************************************************* 253 ** 254 ** Function nfa_dm_nfc_response_cback 255 ** 256 ** Description Call DM event hanlder with NFC response callback data 257 ** 258 ** Returns void 259 ** 260 *******************************************************************************/ 261 static void nfa_dm_nfc_response_cback(tNFC_RESPONSE_EVT event, 262 tNFC_RESPONSE* p_data) { 263 tNFA_DM_CBACK_DATA dm_cback_data; 264 tNFA_CONN_EVT_DATA conn_evt; 265 uint8_t dm_cback_evt; 266 uint8_t max_ee = 0; 267 268 DLOG_IF(INFO, nfc_debug_enabled) 269 << StringPrintf("%s(0x%x)", nfa_dm_nfc_revt_2_str(event).c_str(), event); 270 271 switch (event) { 272 case NFC_ENABLE_REVT: /* 0 Enable event */ 273 274 /* NFC stack enabled. Enable nfa sub-systems */ 275 if (p_data->enable.status == NFC_STATUS_OK) { 276 if (nfa_ee_max_ee_cfg != 0) { 277 if (nfa_dm_cb.get_max_ee) { 278 max_ee = nfa_dm_cb.get_max_ee(); 279 if (max_ee) { 280 nfa_ee_max_ee_cfg = max_ee; 281 } 282 } 283 } 284 /* Initialize NFA subsystems */ 285 nfa_sys_enable_subsystems(); 286 } else if (nfa_dm_cb.flags & NFA_DM_FLAGS_ENABLE_EVT_PEND) { 287 /* Notify app */ 288 nfa_dm_cb.flags &= 289 ~(NFA_DM_FLAGS_ENABLE_EVT_PEND | NFA_DM_FLAGS_DM_IS_ACTIVE); 290 dm_cback_data.status = p_data->enable.status; 291 (*nfa_dm_cb.p_dm_cback)(NFA_DM_ENABLE_EVT, &dm_cback_data); 292 } 293 break; 294 295 case NFC_DISABLE_REVT: /* 1 Disable event */ 296 nfa_dm_disable_event(); 297 break; 298 299 case NFC_SET_CONFIG_REVT: /* 2 Set Config Response */ 300 /* If this setconfig was due to NFA_SetConfig, then notify the app */ 301 /* lsb=whether last NCI_SET_CONFIG was due to NFA_SetConfig */ 302 if (nfa_dm_cb.setcfg_pending_mask & 1) { 303 dm_cback_data.set_config.status = p_data->set_config.status; 304 dm_cback_data.set_config.num_param_id = p_data->set_config.num_param_id; 305 memcpy(dm_cback_data.set_config.param_ids, p_data->set_config.param_ids, 306 p_data->set_config.num_param_id); 307 (*nfa_dm_cb.p_dm_cback)(NFA_DM_SET_CONFIG_EVT, &dm_cback_data); 308 } 309 310 /* Update the pending mask */ 311 if (nfa_dm_cb.setcfg_pending_num > 0) { 312 nfa_dm_cb.setcfg_pending_mask >>= 1; 313 nfa_dm_cb.setcfg_pending_num--; 314 } else { 315 /* This should not occur (means we got a SET_CONFIG_NTF that's 316 * unaccounted for */ 317 LOG(ERROR) << StringPrintf( 318 "NFA received unexpected NFC_SET_CONFIG_REVT"); 319 } 320 break; 321 322 case NFC_GET_CONFIG_REVT: /* 3 Get Config Response */ 323 if (p_data->get_config.status == NFC_STATUS_OK) { 324 tNFA_GET_CONFIG* p_nfa_get_confg = &dm_cback_data.get_config; 325 p_nfa_get_confg->status = NFA_STATUS_OK; 326 p_nfa_get_confg->tlv_size = p_data->get_config.tlv_size; 327 p_nfa_get_confg->param_tlvs = p_data->get_config.p_param_tlvs; 328 (*nfa_dm_cb.p_dm_cback)(NFA_DM_GET_CONFIG_EVT, &dm_cback_data); 329 return; 330 } 331 332 /* Return result of getconfig to the app */ 333 dm_cback_data.get_config.status = NFA_STATUS_FAILED; 334 (*nfa_dm_cb.p_dm_cback)(NFA_DM_GET_CONFIG_EVT, &dm_cback_data); 335 break; 336 337 #if (NFC_NFCEE_INCLUDED == TRUE) 338 case NFC_NFCEE_DISCOVER_REVT: /* NFCEE Discover response */ 339 case NFC_NFCEE_INFO_REVT: /* NFCEE Discover Notification */ 340 case NFC_EE_ACTION_REVT: /* EE Action notification */ 341 case NFC_NFCEE_MODE_SET_REVT: /* NFCEE Mode Set response */ 342 case NFC_NFCEE_STATUS_REVT: /* NFCEE Status notification*/ 343 case NFC_SET_ROUTING_REVT: /* Configure Routing response */ 344 nfa_ee_proc_evt(event, p_data); 345 break; 346 347 case NFC_EE_DISCOVER_REQ_REVT: /* EE Discover Req notification */ 348 if (nfa_dm_is_active() && 349 (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_DISCOVERY)) { 350 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE); 351 } 352 nfa_ee_proc_evt(event, p_data); 353 break; 354 355 case NFC_GET_ROUTING_REVT: /* Retrieve Routing response */ 356 break; 357 #endif 358 359 case NFC_SET_POWER_SUB_STATE_REVT: 360 dm_cback_data.power_sub_state.status = p_data->status; 361 dm_cback_data.power_sub_state.power_state = nfa_dm_cb.power_state; 362 (*nfa_dm_cb.p_dm_cback)(NFA_DM_SET_POWER_SUB_STATE_EVT, &dm_cback_data); 363 break; 364 365 case NFC_RF_FIELD_REVT: /* RF Field information */ 366 dm_cback_data.rf_field.status = NFA_STATUS_OK; 367 dm_cback_data.rf_field.rf_field_status = p_data->rf_field.rf_field; 368 (*nfa_dm_cb.p_dm_cback)(NFA_DM_RF_FIELD_EVT, &dm_cback_data); 369 break; 370 371 case NFC_GEN_ERROR_REVT: /* generic error command or notification */ 372 break; 373 374 case NFC_NFCC_RESTART_REVT: /* NFCC has been re-initialized */ 375 376 if (p_data->status == NFC_STATUS_OK) { 377 nfa_dm_cb.nfcc_pwr_mode = NFA_DM_PWR_MODE_FULL; 378 nfa_dm_cb.flags |= NFA_DM_FLAGS_NFCC_IS_RESTORING; 379 380 /* NFCC will start from IDLE when turned on again */ 381 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP; 382 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF; 383 nfa_dm_cb.disc_cb.disc_state = NFA_DM_RFST_IDLE; 384 } else { 385 nfa_dm_cb.nfcc_pwr_mode = NFA_DM_PWR_MODE_OFF_SLEEP; 386 } 387 /* Notify NFA submodules change of NFCC power mode */ 388 nfa_sys_cback_reg_nfcc_power_mode_proc_complete( 389 nfa_dm_nfcc_power_mode_proc_complete_cback); 390 nfa_sys_notify_nfcc_power_mode(nfa_dm_cb.nfcc_pwr_mode); 391 break; 392 393 case NFC_NFCC_TIMEOUT_REVT: 394 case NFC_NFCC_TRANSPORT_ERR_REVT: 395 DLOG_IF(INFO, nfc_debug_enabled) 396 << StringPrintf("flags:0x%08x", nfa_dm_cb.flags); 397 dm_cback_evt = (event == NFC_NFCC_TIMEOUT_REVT) 398 ? NFA_DM_NFCC_TIMEOUT_EVT 399 : NFA_DM_NFCC_TRANSPORT_ERR_EVT; 400 (*nfa_dm_cb.p_dm_cback)(dm_cback_evt, NULL); 401 break; 402 403 case NFC_NFCC_POWER_OFF_REVT: 404 nfa_dm_cb.nfcc_pwr_mode = NFA_DM_PWR_MODE_OFF_SLEEP; 405 406 /* Notify NFA submodules change of NFCC power mode */ 407 nfa_sys_cback_reg_nfcc_power_mode_proc_complete( 408 nfa_dm_nfcc_power_mode_proc_complete_cback); 409 nfa_sys_notify_nfcc_power_mode(NFA_DM_PWR_MODE_OFF_SLEEP); 410 break; 411 412 case NFC_RF_COMM_PARAMS_UPDATE_REVT: 413 conn_evt.status = p_data->status; 414 nfa_dm_conn_cback_event_notify(NFA_UPDATE_RF_PARAM_RESULT_EVT, &conn_evt); 415 break; 416 417 default: 418 break; 419 } 420 } 421 422 /******************************************************************************* 423 ** 424 ** Function nfa_dm_enable 425 ** 426 ** Description Initialises the NFC device manager 427 ** 428 ** Returns TRUE (message buffer to be freed by caller) 429 ** 430 *******************************************************************************/ 431 bool nfa_dm_enable(tNFA_DM_MSG* p_data) { 432 tNFA_DM_CBACK_DATA dm_cback_data; 433 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 434 435 /* Check if NFA is already enabled */ 436 if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_DM_IS_ACTIVE)) { 437 /* Initialize BRCM control block, it musb be called before setting any flags 438 */ 439 nfa_dm_cb.flags |= 440 (NFA_DM_FLAGS_DM_IS_ACTIVE | NFA_DM_FLAGS_ENABLE_EVT_PEND); 441 nfa_sys_cback_reg_enable_complete(nfa_dm_module_init_cback); 442 443 /* Store Enable parameters */ 444 nfa_dm_cb.p_dm_cback = p_data->enable.p_dm_cback; 445 nfa_dm_cb.p_conn_cback = p_data->enable.p_conn_cback; 446 447 /* Enable NFC stack */ 448 NFC_Enable(nfa_dm_nfc_response_cback); 449 } else { 450 LOG(ERROR) << StringPrintf("nfa_dm_enable: ERROR ALREADY ENABLED."); 451 dm_cback_data.status = NFA_STATUS_ALREADY_STARTED; 452 (*(p_data->enable.p_dm_cback))(NFA_DM_ENABLE_EVT, &dm_cback_data); 453 } 454 455 return true; 456 } 457 458 /******************************************************************************* 459 ** 460 ** Function nfa_dm_disable 461 ** 462 ** Description Disables the NFC device manager 463 ** 464 ** Returns TRUE (message buffer to be freed by caller) 465 ** 466 *******************************************************************************/ 467 bool nfa_dm_disable(tNFA_DM_MSG* p_data) { 468 DLOG_IF(INFO, nfc_debug_enabled) 469 << StringPrintf("graceful:%d", p_data->disable.graceful); 470 471 if (p_data->disable.graceful) { 472 /* if RF discovery is enabled */ 473 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_ENABLED) { 474 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_ENABLED; 475 476 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_IDLE) { 477 /* if waiting RSP in idle state */ 478 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) { 479 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_DISABLING; 480 } 481 } else { 482 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_DISABLING; 483 tNFA_DM_RF_DISC_DATA nfa_dm_rf_disc_data; 484 nfa_dm_rf_disc_data.deactivate_type = NFA_DEACTIVATE_TYPE_IDLE; 485 486 nfa_dm_disc_sm_execute(NFA_DM_RF_DEACTIVATE_CMD, &nfa_dm_rf_disc_data); 487 if ((nfa_dm_cb.disc_cb.disc_flags & 488 (NFA_DM_DISC_FLAGS_W4_RSP | NFA_DM_DISC_FLAGS_W4_NTF)) == 0) { 489 /* not waiting to deactivate, clear the flag now */ 490 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_DISABLING; 491 } 492 } 493 } 494 /* Start timeout for graceful shutdown. If timer expires, then force an 495 * ungraceful shutdown */ 496 nfa_sys_start_timer(&nfa_dm_cb.tle, NFA_DM_TIMEOUT_DISABLE_EVT, 497 NFA_DM_DISABLE_TIMEOUT_VAL); 498 } 499 500 /* Disable all subsystems other than DM (DM will be disabled after all */ 501 /* the other subsystem have been disabled) */ 502 nfa_sys_disable_subsystems(p_data->disable.graceful); 503 return true; 504 } 505 506 /******************************************************************************* 507 ** 508 ** Function nfa_dm_disable_complete 509 ** 510 ** Description Called when all NFA subsytems are disabled. 511 ** 512 ** NFC core stack can now be disabled. 513 ** 514 ** Returns void 515 ** 516 *******************************************************************************/ 517 void nfa_dm_disable_complete(void) { 518 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 519 520 if ((nfa_dm_cb.flags & NFA_DM_FLAGS_DM_DISABLING_NFC) == 0) { 521 DLOG_IF(INFO, nfc_debug_enabled) 522 << StringPrintf("proceeding with nfc core shutdown."); 523 524 nfa_dm_cb.flags |= NFA_DM_FLAGS_DM_DISABLING_NFC; 525 526 nfa_sys_stop_timer(&nfa_dm_cb.tle); 527 528 /* Free all buffers for NDEF handlers */ 529 nfa_dm_ndef_dereg_all(); 530 531 /* Disable nfc core stack */ 532 NFC_Disable(); 533 } 534 } 535 536 /******************************************************************************* 537 ** 538 ** Function nfa_dm_set_config 539 ** 540 ** Description Process set config command 541 ** 542 ** Returns TRUE (message buffer to be freed by caller) 543 ** 544 *******************************************************************************/ 545 bool nfa_dm_set_config(tNFA_DM_MSG* p_data) { 546 tNFC_STATUS status; 547 uint8_t buff[255]; 548 uint8_t* p = buff; 549 550 tNFA_DM_CBACK_DATA dm_cback_data; 551 552 if (p_data->setconfig.length + 2 > 255) { 553 /* Total length of TLV must be less than 256 (1 byte) */ 554 status = NFC_STATUS_FAILED; 555 } else { 556 UINT8_TO_STREAM(p, p_data->setconfig.param_id); 557 UINT8_TO_STREAM(p, p_data->setconfig.length); 558 ARRAY_TO_STREAM(p, p_data->setconfig.p_data, p_data->setconfig.length) 559 status = nfa_dm_check_set_config((uint8_t)(p_data->setconfig.length + 2), 560 buff, true); 561 } 562 563 if (status != NFC_STATUS_OK) { 564 dm_cback_data.set_config.status = NFA_STATUS_INVALID_PARAM; 565 (*nfa_dm_cb.p_dm_cback)(NFA_DM_SET_CONFIG_EVT, &dm_cback_data); 566 } 567 568 return true; 569 } 570 571 /******************************************************************************* 572 ** 573 ** Function nfa_dm_get_config 574 ** 575 ** Description Process get config command 576 ** 577 ** Returns TRUE (message buffer to be freed by caller) 578 ** 579 *******************************************************************************/ 580 bool nfa_dm_get_config(tNFA_DM_MSG* p_data) { 581 NFC_GetConfig(p_data->getconfig.num_ids, p_data->getconfig.p_pmids); 582 583 return true; 584 } 585 /******************************************************************************* 586 ** 587 ** Function nfa_dm_set_power_sub_state 588 ** 589 ** Description Process the power sub state command 590 ** 591 ** Returns TRUE (message buffer to be freed by caller) 592 ** 593 *******************************************************************************/ 594 bool nfa_dm_set_power_sub_state(tNFA_DM_MSG* p_data) { 595 tNFC_STATUS status; 596 tNFA_DM_CBACK_DATA dm_cback_data; 597 598 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 599 600 nfa_dm_cb.power_state = p_data->set_power_state.screen_state; 601 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_ACTIVE) { 602 DLOG_IF(INFO, nfc_debug_enabled) 603 << StringPrintf("NFA_DM_RFST_LISTEN_ACTIVE"); 604 /* NFCC will give semantic error for power sub state command in Rf listen 605 * active state */ 606 status = NFC_STATUS_SEMANTIC_ERROR; 607 } else { 608 status = NFC_SetPowerSubState(p_data->set_power_state.screen_state); 609 } 610 611 if (status != NFC_STATUS_OK) { 612 dm_cback_data.power_sub_state.status = NFC_STATUS_FAILED; 613 dm_cback_data.power_sub_state.power_state = nfa_dm_cb.power_state; 614 (*nfa_dm_cb.p_dm_cback)(NFA_DM_SET_POWER_SUB_STATE_EVT, &dm_cback_data); 615 } 616 return (true); 617 } 618 /******************************************************************************* 619 ** 620 ** Function nfa_dm_conn_cback_event_notify 621 ** 622 ** Description Notify application of CONN_CBACK event, using appropriate 623 ** callback 624 ** 625 ** Returns nothing 626 ** 627 *******************************************************************************/ 628 void nfa_dm_conn_cback_event_notify(uint8_t event, tNFA_CONN_EVT_DATA* p_data) { 629 if (nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE) { 630 /* Use exclusive RF mode callback */ 631 if (nfa_dm_cb.p_excl_conn_cback) 632 (*nfa_dm_cb.p_excl_conn_cback)(event, p_data); 633 } else { 634 (*nfa_dm_cb.p_conn_cback)(event, p_data); 635 } 636 } 637 638 /******************************************************************************* 639 ** 640 ** Function nfa_dm_rel_excl_rf_control_and_notify 641 ** 642 ** Description Stop exclusive RF control and notify app of 643 ** NFA_EXCLUSIVE_RF_CONTROL_STOPPED_EVT 644 ** 645 ** Returns void 646 ** 647 *******************************************************************************/ 648 void nfa_dm_rel_excl_rf_control_and_notify(void) { 649 tNFA_CONN_EVT_DATA conn_evt; 650 651 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 652 653 /* Exclusive RF control stopped. Notify app */ 654 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_EXCL_RF_ACTIVE; 655 656 /* Stop exclusive RF discovery for exclusive RF mode */ 657 nfa_dm_stop_excl_discovery(); 658 659 /* Notify app that exclusive RF control has stopped */ 660 conn_evt.status = NFA_STATUS_OK; 661 (*nfa_dm_cb.p_excl_conn_cback)(NFA_EXCLUSIVE_RF_CONTROL_STOPPED_EVT, 662 &conn_evt); 663 nfa_dm_cb.p_excl_conn_cback = NULL; 664 nfa_dm_cb.p_excl_ndef_cback = NULL; 665 } 666 667 /******************************************************************************* 668 ** 669 ** Function nfa_dm_act_request_excl_rf_ctrl 670 ** 671 ** Description Request exclusive RF control 672 ** 673 ** Returns TRUE (message buffer to be freed by caller) 674 ** 675 *******************************************************************************/ 676 bool nfa_dm_act_request_excl_rf_ctrl(tNFA_DM_MSG* p_data) { 677 tNFA_CONN_EVT_DATA conn_evt; 678 679 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 680 681 if (!nfa_dm_cb.p_excl_conn_cback) { 682 if (nfa_dm_cb.disc_cb.disc_state != NFA_DM_RFST_IDLE) { 683 conn_evt.status = NFA_STATUS_FAILED; 684 (*p_data->req_excl_rf_ctrl.p_conn_cback)( 685 NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT, &conn_evt); 686 return true; 687 } 688 689 /* Store callbacks */ 690 nfa_dm_cb.p_excl_conn_cback = p_data->req_excl_rf_ctrl.p_conn_cback; 691 nfa_dm_cb.p_excl_ndef_cback = p_data->req_excl_rf_ctrl.p_ndef_cback; 692 693 nfa_dm_cb.flags |= NFA_DM_FLAGS_EXCL_RF_ACTIVE; 694 695 /* start exclusive RF discovery */ 696 nfa_dm_start_excl_discovery(p_data->req_excl_rf_ctrl.poll_mask, 697 &p_data->req_excl_rf_ctrl.listen_cfg, 698 nfa_dm_excl_disc_cback); 699 } else { 700 LOG(ERROR) << StringPrintf("Exclusive rf control already requested"); 701 702 conn_evt.status = NFA_STATUS_FAILED; 703 (*p_data->req_excl_rf_ctrl.p_conn_cback)( 704 NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT, &conn_evt); 705 } 706 707 return true; 708 } 709 710 /******************************************************************************* 711 ** 712 ** Function nfa_dm_act_release_excl_rf_ctrl 713 ** 714 ** Description Release exclusive RF control 715 ** 716 ** Returns TRUE (message buffer to be freed by caller) 717 ** 718 *******************************************************************************/ 719 bool nfa_dm_act_release_excl_rf_ctrl(__attribute__((unused)) 720 tNFA_DM_MSG* p_data) { 721 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 722 723 /* nfa_dm_rel_excl_rf_control_and_notify() is called when discovery state goes 724 * IDLE */ 725 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_STOPPING; 726 727 /* if discover command has been sent in IDLE state and waiting for response 728 ** then just wait for responose. Otherwise initiate deactivating. 729 */ 730 if (!((nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_IDLE) && 731 (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))) { 732 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE); 733 } 734 735 if (nfa_dm_cb.disc_cb.kovio_tle.in_use) 736 nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.kovio_tle); 737 738 return true; 739 } 740 741 /******************************************************************************* 742 ** 743 ** Function nfa_dm_act_deactivate 744 ** 745 ** Description Process deactivate command 746 ** 747 ** Returns TRUE (message buffer to be freed by caller) 748 ** 749 *******************************************************************************/ 750 bool nfa_dm_act_deactivate(tNFA_DM_MSG* p_data) { 751 tNFA_CONN_EVT_DATA conn_evt; 752 tNFA_DEACTIVATE_TYPE deact_type; 753 754 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 755 756 /* Always allow deactivate to IDLE */ 757 /* Do not allow deactivate to SLEEP for T1T,NFCDEP, ISO15693 */ 758 if (p_data->deactivate.sleep_mode == false || 759 (nfa_dm_cb.disc_cb.activated_protocol != NFA_PROTOCOL_T1T && 760 (nfa_dm_cb.disc_cb.activated_protocol != NFA_PROTOCOL_NFC_DEP || 761 appl_dta_mode_flag) && 762 nfa_dm_cb.disc_cb.activated_protocol != NFA_PROTOCOL_T5T && 763 nfa_dm_cb.disc_cb.activated_protocol != NFC_PROTOCOL_KOVIO)) { 764 deact_type = NFA_DEACTIVATE_TYPE_DISCOVERY; 765 if (p_data->deactivate.sleep_mode) { 766 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_HOST_SELECT) { 767 /* Deactivate to sleep mode not allowed in this state. */ 768 deact_type = NFA_DEACTIVATE_TYPE_IDLE; 769 } else if (appl_dta_mode_flag == true && 770 (nfa_dm_cb.disc_cb.disc_state != NFA_DM_RFST_LISTEN_SLEEP || 771 nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE)) { 772 deact_type = NFA_DEACTIVATE_TYPE_SLEEP; 773 } else if (nfa_dm_cb.disc_cb.disc_state != NFA_DM_RFST_LISTEN_SLEEP) { 774 deact_type = NFA_DEACTIVATE_TYPE_SLEEP; 775 } 776 } 777 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_ALL_DISCOVERIES) { 778 /* Only deactivate to IDLE is allowed in this state. */ 779 deact_type = NFA_DEACTIVATE_TYPE_IDLE; 780 } 781 782 if ((nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_NFC_DEP) && 783 ((nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE) == 0x00) && 784 appl_dta_mode_flag != true) { 785 /* Exclusive RF control doesn't use NFA P2P */ 786 /* NFA P2P will deactivate NFC link after deactivating LLCP link */ 787 if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_P2P_PAUSED)) { 788 nfa_p2p_deactivate_llcp(); 789 } else { 790 nfa_dm_rf_deactivate(deact_type); 791 } 792 return true; 793 } else { 794 if (nfa_dm_rf_deactivate(deact_type) == NFA_STATUS_OK) { 795 if (nfa_dm_cb.disc_cb.kovio_tle.in_use) 796 nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.kovio_tle); 797 nfa_rw_stop_presence_check_timer(); 798 return true; 799 } 800 } 801 } 802 803 LOG(ERROR) << StringPrintf("invalid protocol, mode or state"); 804 805 /* Notify error to application */ 806 conn_evt.status = NFA_STATUS_FAILED; 807 nfa_dm_conn_cback_event_notify(NFA_DEACTIVATE_FAIL_EVT, &conn_evt); 808 809 return true; 810 } 811 812 /******************************************************************************* 813 ** 814 ** Function nfa_dm_act_power_off_sleep 815 ** 816 ** Description Process power off sleep mode request 817 ** 818 ** Returns TRUE (message buffer to be freed by caller) 819 ** 820 *******************************************************************************/ 821 bool nfa_dm_act_power_off_sleep(tNFA_DM_MSG* p_data) { 822 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 823 824 NFC_SetPowerOffSleep((bool)(p_data->hdr.layer_specific)); 825 826 return true; 827 } 828 829 /******************************************************************************* 830 ** 831 ** Function nfa_dm_act_reg_vsc 832 ** 833 ** Description Process registers VSC callback 834 ** 835 ** Returns TRUE (message buffer to be freed by caller) 836 ** 837 *******************************************************************************/ 838 bool nfa_dm_act_reg_vsc(tNFA_DM_MSG* p_data) { 839 if (NFC_RegVSCback(p_data->reg_vsc.is_register, p_data->reg_vsc.p_cback) != 840 NFC_STATUS_OK) { 841 LOG(ERROR) << StringPrintf("NFC_RegVSCback failed"); 842 } 843 return true; 844 } 845 846 /******************************************************************************* 847 ** 848 ** Function nfa_dm_act_send_vsc 849 ** 850 ** Description Send the NCI Vendor Specific command to the NCI command 851 ** queue 852 ** 853 ** Returns FALSE (message buffer is NOT freed by caller) 854 ** 855 *******************************************************************************/ 856 bool nfa_dm_act_send_vsc(tNFA_DM_MSG* p_data) { 857 NFC_HDR* p_cmd = (NFC_HDR*)p_data; 858 859 p_cmd->offset = sizeof(tNFA_DM_API_SEND_VSC) - NFC_HDR_SIZE; 860 p_cmd->len = p_data->send_vsc.cmd_params_len; 861 NFC_SendVsCommand(p_data->send_vsc.oid, p_cmd, p_data->send_vsc.p_cback); 862 863 /* Most dm action functions return TRUE, so nfa-sys frees the GKI buffer 864 * carrying the message, This action function re-use the GKI buffer to 865 * send the VSC, so the GKI buffer can not be freed by nfa-sys */ 866 867 return false; 868 } 869 870 /******************************************************************************* 871 ** 872 ** Function nfa_dm_act_send_raw_vs 873 ** 874 ** Description Send the raw vs command to the NCI command queue 875 ** 876 ** Returns FALSE (message buffer is NOT freed by caller) 877 ** 878 *******************************************************************************/ 879 bool nfa_dm_act_send_raw_vs(tNFA_DM_MSG* p_data) { 880 NFC_HDR* p_cmd = (NFC_HDR*)p_data; 881 882 p_cmd->offset = sizeof(tNFA_DM_API_SEND_VSC) - NFC_HDR_SIZE; 883 p_cmd->len = p_data->send_vsc.cmd_params_len; 884 NFC_SendRawVsCommand(p_cmd, p_data->send_vsc.p_cback); 885 886 /* Most dm action functions return TRUE, so nfa-sys frees the GKI buffer 887 * carrying the message, 888 * This action function re-use the GKI buffer to send the VSC, so the GKI 889 * buffer can not be freed by nfa-sys */ 890 return false; 891 } 892 893 /******************************************************************************* 894 ** 895 ** Function nfa_dm_start_polling 896 ** 897 ** Description Start polling 898 ** 899 ** Returns tNFA_STATUS 900 ** 901 *******************************************************************************/ 902 tNFA_STATUS nfa_dm_start_polling(void) { 903 tNFA_STATUS status; 904 tNFA_TECHNOLOGY_MASK poll_tech_mask; 905 tNFA_DM_DISC_TECH_PROTO_MASK poll_disc_mask = 0; 906 907 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 908 909 poll_tech_mask = nfa_dm_cb.poll_mask; 910 911 /* start RF discovery with discovery callback */ 912 if (nfa_dm_cb.poll_disc_handle == NFA_HANDLE_INVALID) { 913 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A) { 914 poll_disc_mask |= NFA_DM_DISC_MASK_PA_T1T; 915 poll_disc_mask |= NFA_DM_DISC_MASK_PA_T2T; 916 poll_disc_mask |= NFA_DM_DISC_MASK_PA_ISO_DEP; 917 poll_disc_mask |= NFA_DM_DISC_MASK_PA_NFC_DEP; 918 poll_disc_mask |= NFA_DM_DISC_MASK_P_LEGACY; 919 } 920 if (NFC_GetNCIVersion() == NCI_VERSION_2_0) { 921 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_ACTIVE) { 922 poll_disc_mask |= NFA_DM_DISC_MASK_PACM_NFC_DEP; 923 } 924 } else { 925 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A_ACTIVE) { 926 poll_disc_mask |= NFA_DM_DISC_MASK_PAA_NFC_DEP; 927 } 928 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_F_ACTIVE) { 929 poll_disc_mask |= NFA_DM_DISC_MASK_PFA_NFC_DEP; 930 } 931 } 932 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_B) { 933 poll_disc_mask |= NFA_DM_DISC_MASK_PB_ISO_DEP; 934 } 935 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_F) { 936 poll_disc_mask |= NFA_DM_DISC_MASK_PF_T3T; 937 poll_disc_mask |= NFA_DM_DISC_MASK_PF_NFC_DEP; 938 } 939 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_V) { 940 poll_disc_mask |= NFA_DM_DISC_MASK_P_T5T; 941 } 942 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_B_PRIME) { 943 poll_disc_mask |= NFA_DM_DISC_MASK_P_B_PRIME; 944 } 945 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_KOVIO) { 946 poll_disc_mask |= NFA_DM_DISC_MASK_P_KOVIO; 947 } 948 949 nfa_dm_cb.poll_disc_handle = nfa_dm_add_rf_discover( 950 poll_disc_mask, NFA_DM_DISC_HOST_ID_DH, nfa_dm_poll_disc_cback); 951 952 if (nfa_dm_cb.poll_disc_handle != NFA_HANDLE_INVALID) 953 status = NFA_STATUS_OK; 954 else 955 status = NFA_STATUS_FAILED; 956 } else { 957 status = NFA_STATUS_OK; 958 } 959 960 return (status); 961 } 962 963 /******************************************************************************* 964 ** 965 ** Function nfa_dm_act_enable_polling 966 ** 967 ** Description Process enable polling command 968 ** 969 ** Returns TRUE (message buffer to be freed by caller) 970 ** 971 *******************************************************************************/ 972 bool nfa_dm_act_enable_polling(tNFA_DM_MSG* p_data) { 973 tNFA_CONN_EVT_DATA evt_data; 974 975 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 976 977 if ((!(nfa_dm_cb.flags & NFA_DM_FLAGS_POLLING_ENABLED)) && 978 (!(nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE))) { 979 nfa_dm_cb.poll_mask = p_data->enable_poll.poll_mask; 980 981 if (nfa_dm_start_polling() == NFA_STATUS_OK) { 982 nfa_dm_cb.flags |= NFA_DM_FLAGS_POLLING_ENABLED; 983 984 evt_data.status = NFA_STATUS_OK; 985 nfa_dm_conn_cback_event_notify(NFA_POLL_ENABLED_EVT, &evt_data); 986 return true; 987 } 988 } else { 989 LOG(ERROR) << StringPrintf("already started"); 990 } 991 992 /* send NFA_POLL_ENABLED_EVT with NFA_STATUS_FAILED */ 993 evt_data.status = NFA_STATUS_FAILED; 994 nfa_dm_conn_cback_event_notify(NFA_POLL_ENABLED_EVT, &evt_data); 995 996 return true; 997 } 998 999 /******************************************************************************* 1000 ** 1001 ** Function nfa_dm_deactivate_polling 1002 ** 1003 ** Description Deactivate any polling state 1004 ** 1005 ** Returns TRUE if need to wait for deactivation 1006 ** 1007 *******************************************************************************/ 1008 static bool nfa_dm_deactivate_polling(void) { 1009 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 1010 1011 if ((nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_ALL_DISCOVERIES) || 1012 (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_HOST_SELECT)) { 1013 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE); 1014 return false; 1015 } else if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE) { 1016 if (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_NFC_DEP) { 1017 /* NFA P2P will deactivate NFC link after deactivating LLCP link */ 1018 nfa_p2p_deactivate_llcp(); 1019 } else { 1020 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE); 1021 } 1022 return true; 1023 } else { 1024 return false; 1025 } 1026 } 1027 1028 /******************************************************************************* 1029 ** 1030 ** Function nfa_dm_act_disable_polling 1031 ** 1032 ** Description Process disable polling command 1033 ** 1034 ** Returns TRUE (message buffer to be freed by caller) 1035 ** 1036 *******************************************************************************/ 1037 bool nfa_dm_act_disable_polling(__attribute__((unused)) tNFA_DM_MSG* p_data) { 1038 tNFA_CONN_EVT_DATA evt_data; 1039 1040 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 1041 1042 if (nfa_dm_cb.poll_disc_handle != NFA_HANDLE_INVALID) { 1043 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_POLLING_ENABLED; 1044 1045 if (nfa_dm_deactivate_polling() == false) { 1046 nfa_dm_delete_rf_discover(nfa_dm_cb.poll_disc_handle); 1047 nfa_dm_cb.poll_disc_handle = NFA_HANDLE_INVALID; 1048 1049 evt_data.status = NFA_STATUS_OK; 1050 nfa_dm_conn_cback_event_notify(NFA_POLL_DISABLED_EVT, &evt_data); 1051 } else { 1052 nfa_dm_cb.flags |= NFA_DM_FLAGS_SEND_POLL_STOP_EVT; 1053 } 1054 } else { 1055 evt_data.status = NFA_STATUS_FAILED; 1056 nfa_dm_conn_cback_event_notify(NFA_POLL_DISABLED_EVT, &evt_data); 1057 } 1058 1059 return true; 1060 } 1061 1062 /******************************************************************************* 1063 ** 1064 ** Function nfa_dm_act_enable_listening 1065 ** 1066 ** Description Process enable listening command 1067 ** 1068 ** Returns TRUE (message buffer to be freed by caller) 1069 ** 1070 *******************************************************************************/ 1071 bool nfa_dm_act_enable_listening(__attribute__((unused)) tNFA_DM_MSG* p_data) { 1072 tNFA_CONN_EVT_DATA evt_data; 1073 1074 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 1075 1076 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_LISTEN_DISABLED; 1077 evt_data.status = NFA_STATUS_OK; 1078 nfa_dm_conn_cback_event_notify(NFA_LISTEN_ENABLED_EVT, &evt_data); 1079 1080 return true; 1081 } 1082 1083 /******************************************************************************* 1084 ** 1085 ** Function nfa_dm_act_disable_listening 1086 ** 1087 ** Description Process disable listening command 1088 ** 1089 ** Returns TRUE (message buffer to be freed by caller) 1090 ** 1091 *******************************************************************************/ 1092 bool nfa_dm_act_disable_listening(__attribute__((unused)) tNFA_DM_MSG* p_data) { 1093 tNFA_CONN_EVT_DATA evt_data; 1094 1095 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 1096 1097 nfa_dm_cb.flags |= NFA_DM_FLAGS_LISTEN_DISABLED; 1098 evt_data.status = NFA_STATUS_OK; 1099 nfa_dm_conn_cback_event_notify(NFA_LISTEN_DISABLED_EVT, &evt_data); 1100 1101 return true; 1102 } 1103 1104 /******************************************************************************* 1105 ** 1106 ** Function nfa_dm_act_pause_p2p 1107 ** 1108 ** Description Process Pause P2P command 1109 ** 1110 ** Returns TRUE (message buffer to be freed by caller) 1111 ** 1112 *******************************************************************************/ 1113 bool nfa_dm_act_pause_p2p(__attribute__((unused)) tNFA_DM_MSG* p_data) { 1114 tNFA_CONN_EVT_DATA evt_data; 1115 1116 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 1117 1118 nfa_dm_cb.flags |= NFA_DM_FLAGS_P2P_PAUSED; 1119 evt_data.status = NFA_STATUS_OK; 1120 nfa_dm_conn_cback_event_notify(NFA_P2P_PAUSED_EVT, &evt_data); 1121 1122 return true; 1123 } 1124 1125 /******************************************************************************* 1126 ** 1127 ** Function nfa_dm_act_resume_p2p 1128 ** 1129 ** Description Process resume P2P command 1130 ** 1131 ** Returns TRUE (message buffer to be freed by caller) 1132 ** 1133 *******************************************************************************/ 1134 bool nfa_dm_act_resume_p2p(__attribute__((unused)) tNFA_DM_MSG* p_data) { 1135 tNFA_CONN_EVT_DATA evt_data; 1136 1137 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 1138 1139 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_P2P_PAUSED; 1140 evt_data.status = NFA_STATUS_OK; 1141 nfa_dm_conn_cback_event_notify(NFA_P2P_RESUMED_EVT, &evt_data); 1142 1143 return true; 1144 } 1145 1146 /******************************************************************************* 1147 ** 1148 ** Function nfa_dm_act_send_raw_frame 1149 ** 1150 ** Description Send an raw frame on RF link 1151 ** 1152 ** Returns TRUE (message buffer to be freed by caller) 1153 ** 1154 *******************************************************************************/ 1155 bool nfa_dm_act_send_raw_frame(tNFA_DM_MSG* p_data) { 1156 tNFC_STATUS status = NFC_STATUS_FAILED; 1157 1158 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 1159 1160 /* If NFC link is activated */ 1161 if ((nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE) || 1162 (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_ACTIVE)) { 1163 nfa_dm_cb.flags |= NFA_DM_FLAGS_RAW_FRAME; 1164 NFC_SetReassemblyFlag(false); 1165 /* If not in exclusive mode, and not activated for LISTEN, then forward raw 1166 * data to NFA_RW to send */ 1167 if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE) && 1168 !(nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_ACTIVE) && 1169 ((nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_T1T) || 1170 (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_T2T) || 1171 (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_T3T) || 1172 (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_ISO_DEP) || 1173 (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_T5T))) { 1174 /* if RW is checking presence then it will put into pending queue */ 1175 status = nfa_rw_send_raw_frame((NFC_HDR*)p_data); 1176 } else { 1177 status = NFC_SendData(NFC_RF_CONN_ID, (NFC_HDR*)p_data); 1178 if (status != NFC_STATUS_OK) { 1179 NFC_SetReassemblyFlag(true); 1180 } 1181 /* Already freed or NCI layer will free buffer */ 1182 return false; 1183 } 1184 } 1185 1186 if (status == NFC_STATUS_FAILED) { 1187 NFC_SetReassemblyFlag(true); 1188 /* free the buffer */ 1189 return true; 1190 } else { 1191 /* NCI layer will free buffer */ 1192 return false; 1193 } 1194 } 1195 1196 /******************************************************************************* 1197 ** 1198 ** Function nfa_dm_set_p2p_listen_tech 1199 ** 1200 ** Description Notify change of P2P listen technologies to NFA P2P 1201 ** 1202 ** Returns TRUE (message buffer to be freed by caller) 1203 ** 1204 *******************************************************************************/ 1205 bool nfa_dm_set_p2p_listen_tech(tNFA_DM_MSG* p_data) { 1206 DLOG_IF(INFO, nfc_debug_enabled) 1207 << StringPrintf("tech_mask = %d", p_data->set_p2p_listen_tech.tech_mask); 1208 1209 nfa_p2p_update_listen_tech(p_data->set_p2p_listen_tech.tech_mask); 1210 nfa_dm_conn_cback_event_notify(NFA_SET_P2P_LISTEN_TECH_EVT, NULL); 1211 1212 return true; 1213 } 1214 1215 /******************************************************************************* 1216 ** 1217 ** Function nfa_dm_act_start_rf_discovery 1218 ** 1219 ** Description Process start RF discovery command 1220 ** 1221 ** Returns TRUE (message buffer to be freed by caller) 1222 ** 1223 *******************************************************************************/ 1224 bool nfa_dm_act_start_rf_discovery(__attribute__((unused)) 1225 tNFA_DM_MSG* p_data) { 1226 tNFA_CONN_EVT_DATA evt_data; 1227 1228 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 1229 1230 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_ENABLED) { 1231 evt_data.status = NFA_STATUS_OK; 1232 nfa_dm_conn_cback_event_notify(NFA_RF_DISCOVERY_STARTED_EVT, &evt_data); 1233 } else if (nfa_dm_cb.disc_cb.disc_state != NFA_DM_RFST_IDLE) { 1234 evt_data.status = NFA_STATUS_SEMANTIC_ERROR; 1235 nfa_dm_conn_cback_event_notify(NFA_RF_DISCOVERY_STARTED_EVT, &evt_data); 1236 } else { 1237 nfa_dm_cb.disc_cb.disc_flags |= 1238 (NFA_DM_DISC_FLAGS_ENABLED | NFA_DM_DISC_FLAGS_NOTIFY); 1239 nfa_dm_start_rf_discover(); 1240 } 1241 1242 return true; 1243 } 1244 1245 /******************************************************************************* 1246 ** 1247 ** Function nfa_dm_act_stop_rf_discovery 1248 ** 1249 ** Description Process stop RF discovery command 1250 ** 1251 ** Returns TRUE (message buffer to be freed by caller) 1252 ** 1253 *******************************************************************************/ 1254 bool nfa_dm_act_stop_rf_discovery(__attribute__((unused)) tNFA_DM_MSG* p_data) { 1255 tNFA_CONN_EVT_DATA evt_data; 1256 1257 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 1258 1259 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_ENABLED) || 1260 (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_IDLE)) { 1261 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_ENABLED; 1262 1263 /* if discover command has been sent in IDLE state and waiting for response 1264 */ 1265 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) { 1266 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_STOPPING; 1267 } else { 1268 evt_data.status = NFA_STATUS_OK; 1269 nfa_dm_conn_cback_event_notify(NFA_RF_DISCOVERY_STOPPED_EVT, &evt_data); 1270 } 1271 } else { 1272 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_ENABLED; 1273 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_STOPPING; 1274 1275 if (nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE) == NFA_STATUS_OK) { 1276 if (nfa_dm_cb.disc_cb.kovio_tle.in_use) 1277 nfa_sys_stop_timer(&nfa_dm_cb.disc_cb.kovio_tle); 1278 nfa_rw_stop_presence_check_timer(); 1279 } 1280 } 1281 return true; 1282 } 1283 1284 /******************************************************************************* 1285 ** 1286 ** Function nfa_dm_act_set_rf_disc_duration 1287 ** 1288 ** Description Set duration for RF discovery 1289 ** 1290 ** Returns TRUE (message buffer to be freed by caller) 1291 ** 1292 *******************************************************************************/ 1293 bool nfa_dm_act_set_rf_disc_duration(tNFA_DM_MSG* p_data) { 1294 nfa_dm_cb.disc_cb.disc_duration = p_data->disc_duration.rf_disc_dur_ms; 1295 return true; 1296 } 1297 1298 /******************************************************************************* 1299 ** 1300 ** Function nfa_dm_act_get_rf_disc_duration 1301 ** 1302 ** Description Get duration for RF discovery 1303 ** 1304 ** Returns uint16_t 1305 ** 1306 *******************************************************************************/ 1307 uint16_t nfa_dm_act_get_rf_disc_duration() { 1308 return (nfa_dm_cb.disc_cb.disc_duration); 1309 } 1310 /******************************************************************************* 1311 ** 1312 ** Function nfa_dm_act_select 1313 ** 1314 ** Description Process RF select command 1315 ** 1316 ** Returns TRUE (message buffer to be freed by caller) 1317 ** 1318 *******************************************************************************/ 1319 bool nfa_dm_act_select(tNFA_DM_MSG* p_data) { 1320 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 1321 1322 nfa_dm_rf_discover_select(p_data->select.rf_disc_id, p_data->select.protocol, 1323 p_data->select.rf_interface); 1324 return true; 1325 } 1326 1327 /******************************************************************************* 1328 ** 1329 ** Function nfa_dm_act_update_rf_params 1330 ** 1331 ** Description Process update RF communication parameters command 1332 ** 1333 ** Returns TRUE (message buffer to be freed by caller) 1334 ** 1335 *******************************************************************************/ 1336 bool nfa_dm_act_update_rf_params(tNFA_DM_MSG* p_data) { 1337 tNFA_CONN_EVT_DATA conn_evt; 1338 1339 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 1340 1341 if (NFC_UpdateRFCommParams(&p_data->update_rf_params.params) != 1342 NFC_STATUS_OK) { 1343 conn_evt.status = NFA_STATUS_FAILED; 1344 nfa_dm_conn_cback_event_notify(NFA_UPDATE_RF_PARAM_RESULT_EVT, &conn_evt); 1345 } 1346 1347 return true; 1348 } 1349 1350 /******************************************************************************* 1351 ** 1352 ** Function nfa_dm_act_disable_timeout 1353 ** 1354 ** Description timeout on disable process. Shutdown immediately 1355 ** 1356 ** Returns TRUE (message buffer to be freed by caller) 1357 ** 1358 *******************************************************************************/ 1359 bool nfa_dm_act_disable_timeout(__attribute__((unused)) tNFA_DM_MSG* p_data) { 1360 tNFA_DM_MSG nfa_dm_msg; 1361 nfa_dm_msg.disable.graceful = false; 1362 nfa_dm_disable(&nfa_dm_msg); 1363 return true; 1364 } 1365 1366 /******************************************************************************* 1367 ** 1368 ** Function nfa_dm_act_conn_cback_notify 1369 ** 1370 ** Description Notify app of reader/writer/ndef events 1371 ** 1372 ** Returns nothing 1373 ** 1374 *******************************************************************************/ 1375 void nfa_dm_act_conn_cback_notify(uint8_t event, tNFA_CONN_EVT_DATA* p_data) { 1376 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event:0x%X", event); 1377 1378 /* Notify event using appropriate CONN_CBACK */ 1379 nfa_dm_conn_cback_event_notify(event, p_data); 1380 1381 /* If not in exclusive RF mode, then read NDEF message from tag (if automatic 1382 * reading is enabled) */ 1383 if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE)) { 1384 if ((event == NFA_NDEF_DETECT_EVT) && 1385 (nfa_dm_cb.flags & NFA_DM_FLAGS_AUTO_READING_NDEF)) { 1386 /* read NDEF message from tag */ 1387 if (p_data->ndef_detect.status == NFA_STATUS_OK) { 1388 NFA_RwReadNDef(); 1389 } else if (p_data->ndef_detect.status == NFA_STATUS_FAILED) { 1390 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_AUTO_READING_NDEF; 1391 } 1392 /* ignore NFA_STATUS_BUSY */ 1393 } else if ((event == NFA_READ_CPLT_EVT) && 1394 (nfa_dm_cb.flags & NFA_DM_FLAGS_AUTO_READING_NDEF)) { 1395 /* reading NDEF message is done */ 1396 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_AUTO_READING_NDEF; 1397 } 1398 } 1399 } 1400 1401 /******************************************************************************* 1402 ** 1403 ** Function nfa_dm_act_data_cback 1404 ** 1405 ** Description Processing data from RF link 1406 ** 1407 ** Returns None 1408 ** 1409 *******************************************************************************/ 1410 static void nfa_dm_act_data_cback(__attribute__((unused)) uint8_t conn_id, 1411 tNFC_CONN_EVT event, tNFC_CONN* p_data) { 1412 NFC_HDR* p_msg; 1413 tNFA_CONN_EVT_DATA evt_data; 1414 1415 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event = 0x%X", event); 1416 1417 if (event == NFC_DATA_CEVT) { 1418 p_msg = (NFC_HDR*)p_data->data.p_data; 1419 1420 if (p_msg) { 1421 evt_data.data.status = p_data->data.status; 1422 evt_data.data.p_data = (uint8_t*)(p_msg + 1) + p_msg->offset; 1423 evt_data.data.len = p_msg->len; 1424 1425 nfa_dm_conn_cback_event_notify(NFA_DATA_EVT, &evt_data); 1426 1427 GKI_freebuf(p_msg); 1428 } else { 1429 LOG(ERROR) << StringPrintf( 1430 "received NFC_DATA_CEVT with NULL data " 1431 "pointer"); 1432 } 1433 } else if (event == NFC_DEACTIVATE_CEVT) { 1434 NFC_SetStaticRfCback(NULL); 1435 } 1436 } 1437 1438 /******************************************************************************* 1439 ** 1440 ** Function nfa_dm_excl_disc_cback 1441 ** 1442 ** Description Processing event from discovery callback 1443 ** 1444 ** Returns None 1445 ** 1446 *******************************************************************************/ 1447 static void nfa_dm_excl_disc_cback(tNFA_DM_RF_DISC_EVT event, 1448 tNFC_DISCOVER* p_data) { 1449 tNFA_CONN_EVT_DATA evt_data; 1450 1451 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event:0x%02X", event); 1452 1453 switch (event) { 1454 case NFA_DM_RF_DISC_START_EVT: 1455 evt_data.status = NFA_STATUS_OK; 1456 nfa_dm_conn_cback_event_notify(NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT, 1457 &evt_data); 1458 break; 1459 1460 case NFA_DM_RF_DISC_ACTIVATED_EVT: 1461 if (nfa_dm_cb.disc_cb.activated_tech_mode == NFC_DISCOVERY_TYPE_POLL_A) { 1462 /* store SEL_RES response */ 1463 nfa_dm_cb.disc_cb.activated_sel_res = 1464 p_data->activate.rf_tech_param.param.pa.sel_rsp; 1465 } 1466 1467 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_ACTIVE) { 1468 /* Set data callback to receive raw frame */ 1469 NFC_SetStaticRfCback(nfa_dm_act_data_cback); 1470 1471 memset(&(evt_data.activated.params), 0x00, sizeof(tNFA_TAG_PARAMS)); 1472 memcpy(&(evt_data.activated.activate_ntf), &(p_data->activate), 1473 sizeof(tNFC_ACTIVATE_DEVT)); 1474 1475 nfa_dm_conn_cback_event_notify(NFA_ACTIVATED_EVT, &evt_data); 1476 } else { 1477 /* holding activation notification until sub-module is ready */ 1478 nfa_dm_cb.p_activate_ntf = 1479 (uint8_t*)GKI_getbuf(sizeof(tNFC_ACTIVATE_DEVT)); 1480 1481 if (nfa_dm_cb.p_activate_ntf) { 1482 memcpy(nfa_dm_cb.p_activate_ntf, &(p_data->activate), 1483 sizeof(tNFC_ACTIVATE_DEVT)); 1484 1485 if ((nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T1T) || 1486 (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T2T) || 1487 (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T3T) || 1488 (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_ISO_DEP) || 1489 (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_T5T) || 1490 (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO)) { 1491 /* Notify NFA tag sub-system */ 1492 nfa_rw_proc_disc_evt(NFA_DM_RF_DISC_ACTIVATED_EVT, p_data, false); 1493 } else /* if NFC-DEP, ISO-DEP with frame interface or others */ 1494 { 1495 /* Set data callback to receive raw frame */ 1496 NFC_SetStaticRfCback(nfa_dm_act_data_cback); 1497 nfa_dm_notify_activation_status(NFA_STATUS_OK, NULL); 1498 } 1499 } else { 1500 /* deactivate and restart RF discovery */ 1501 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_DISCOVERY); 1502 } 1503 } 1504 break; 1505 1506 case NFA_DM_RF_DISC_DEACTIVATED_EVT: 1507 1508 /* if deactivated to idle or discovery */ 1509 if ((p_data->deactivate.type == NFC_DEACTIVATE_TYPE_IDLE) || 1510 (p_data->deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY)) { 1511 /* clear stored NFCID/UID/KOVIO bar code */ 1512 nfa_dm_cb.activated_nfcid_len = 0; 1513 } 1514 1515 if (nfa_dm_cb.disc_cb.activated_protocol != NFC_PROTOCOL_NFC_DEP) { 1516 /* Notify NFA RW sub-systems */ 1517 nfa_rw_proc_disc_evt(NFA_DM_RF_DISC_DEACTIVATED_EVT, NULL, false); 1518 } 1519 1520 /* if deactivated as sleep mode */ 1521 if ((p_data->deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP) || 1522 (p_data->deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP_AF)) { 1523 evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_SLEEP; 1524 } else { 1525 evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE; 1526 } 1527 1528 /* notify deactivation to upper layer */ 1529 nfa_dm_conn_cback_event_notify(NFA_DEACTIVATED_EVT, &evt_data); 1530 1531 /* clean up SEL_RES response */ 1532 nfa_dm_cb.disc_cb.activated_sel_res = 0; 1533 break; 1534 1535 default: 1536 LOG(ERROR) << StringPrintf("Unexpected event"); 1537 break; 1538 } 1539 } 1540 1541 /******************************************************************************* 1542 ** 1543 ** Function nfa_dm_poll_disc_cback 1544 ** 1545 ** Description Processing event from discovery callback 1546 ** 1547 ** Returns None 1548 ** 1549 *******************************************************************************/ 1550 static void nfa_dm_poll_disc_cback(tNFA_DM_RF_DISC_EVT event, 1551 tNFC_DISCOVER* p_data) { 1552 tNFA_CONN_EVT_DATA evt_data; 1553 1554 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event:0x%02X", event); 1555 1556 switch (event) { 1557 case NFA_DM_RF_DISC_START_EVT: 1558 break; 1559 1560 case NFA_DM_RF_DISC_ACTIVATED_EVT: 1561 1562 if (nfa_dm_cb.disc_cb.activated_tech_mode == NFC_DISCOVERY_TYPE_POLL_A) { 1563 /* store SEL_RES response */ 1564 nfa_dm_cb.disc_cb.activated_sel_res = 1565 p_data->activate.rf_tech_param.param.pa.sel_rsp; 1566 } 1567 1568 /* holding activation notification until sub-module is ready */ 1569 nfa_dm_cb.p_activate_ntf = 1570 (uint8_t*)GKI_getbuf(sizeof(tNFC_ACTIVATE_DEVT)); 1571 1572 if (nfa_dm_cb.p_activate_ntf) { 1573 memcpy(nfa_dm_cb.p_activate_ntf, &(p_data->activate), 1574 sizeof(tNFC_ACTIVATE_DEVT)); 1575 if ((nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_NFC_DEP) && 1576 (nfa_dm_cb.disc_cb.activated_rf_interface == 1577 NFC_INTERFACE_NFC_DEP)) { 1578 /* For P2P mode(Default DTA mode) open Raw channel to bypass LLCP 1579 * layer. For LLCP DTA mode activate LLCP */ 1580 if ((appl_dta_mode_flag == 1) && 1581 ((nfa_dm_cb.eDtaMode & 0x0F) == NFA_DTA_DEFAULT_MODE)) { 1582 /* Open raw channel in case of p2p for DTA testing */ 1583 NFC_SetStaticRfCback(nfa_dm_act_data_cback); 1584 nfa_dm_notify_activation_status(NFA_STATUS_OK, NULL); 1585 } else { 1586 if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_P2P_PAUSED)) { 1587 /* activate LLCP */ 1588 nfa_p2p_activate_llcp(p_data); 1589 if (nfa_dm_cb.p_activate_ntf) { 1590 GKI_freebuf(nfa_dm_cb.p_activate_ntf); 1591 nfa_dm_cb.p_activate_ntf = NULL; 1592 } 1593 } else { 1594 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("P2P is paused"); 1595 nfa_dm_notify_activation_status(NFA_STATUS_OK, NULL); 1596 } 1597 } 1598 } else if ((nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T1T) || 1599 (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T2T) || 1600 (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T3T) || 1601 (nfa_dm_cb.disc_cb.activated_protocol == 1602 NFC_PROTOCOL_ISO_DEP) || 1603 (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T5T) || 1604 (nfa_dm_cb.disc_cb.activated_protocol == 1605 NFC_PROTOCOL_KOVIO) || 1606 (nfa_dm_cb.disc_cb.activated_protocol == 1607 NFC_PROTOCOL_MIFARE)) { 1608 /* Notify NFA tag sub-system */ 1609 nfa_rw_proc_disc_evt(NFA_DM_RF_DISC_ACTIVATED_EVT, p_data, true); 1610 } else /* if NFC-DEP/ISO-DEP with frame interface */ 1611 { 1612 /* Set data callback to receive raw frame */ 1613 NFC_SetStaticRfCback(nfa_dm_act_data_cback); 1614 nfa_dm_notify_activation_status(NFA_STATUS_OK, NULL); 1615 } 1616 } else { 1617 /* deactivate and restart RF discovery */ 1618 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_DISCOVERY); 1619 } 1620 break; 1621 1622 case NFA_DM_RF_DISC_DEACTIVATED_EVT: 1623 1624 /* if deactivated to idle or discovery */ 1625 if ((p_data->deactivate.type == NFC_DEACTIVATE_TYPE_IDLE) || 1626 (p_data->deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY)) { 1627 /* clear stored NFCID/UID/KOVIO bar code */ 1628 nfa_dm_cb.activated_nfcid_len = 0; 1629 } 1630 1631 if ((nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_NFC_DEP) && 1632 (nfa_dm_cb.disc_cb.activated_rf_interface == NFC_INTERFACE_NFC_DEP)) { 1633 /* 1634 ** If LLCP link is not deactivated yet, 1635 ** LLCP will receive deactivation ntf through data callback. 1636 ** NFA P2P will receive callback event from LLCP. 1637 */ 1638 } else { 1639 /* Notify NFA RW sub-systems */ 1640 nfa_rw_proc_disc_evt(NFA_DM_RF_DISC_DEACTIVATED_EVT, NULL, true); 1641 } 1642 1643 /* if NFA sent NFA_ACTIVATED_EVT earlier */ 1644 if (nfa_dm_cb.flags & NFA_DM_FLAGS_SEND_DEACTIVATED_EVT) { 1645 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_SEND_DEACTIVATED_EVT; 1646 1647 /* if deactivated as sleep mode */ 1648 if ((p_data->deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP) || 1649 (p_data->deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP_AF)) { 1650 evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_SLEEP; 1651 } else { 1652 evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE; 1653 } 1654 /* notify deactivation to application */ 1655 nfa_dm_conn_cback_event_notify(NFA_DEACTIVATED_EVT, &evt_data); 1656 } 1657 1658 /* clean up SEL_RES response */ 1659 nfa_dm_cb.disc_cb.activated_sel_res = 0; 1660 1661 if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_POLLING_ENABLED)) { 1662 /* deregister discovery callback from NFA DM Discovery */ 1663 nfa_dm_delete_rf_discover(nfa_dm_cb.poll_disc_handle); 1664 nfa_dm_cb.poll_disc_handle = NFA_HANDLE_INVALID; 1665 1666 /* this is for disable polling */ 1667 if (nfa_dm_cb.flags & NFA_DM_FLAGS_SEND_POLL_STOP_EVT) { 1668 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_SEND_POLL_STOP_EVT; 1669 1670 evt_data.status = NFA_STATUS_OK; 1671 nfa_dm_conn_cback_event_notify(NFA_POLL_DISABLED_EVT, &evt_data); 1672 } 1673 } 1674 break; 1675 } 1676 } 1677 1678 /******************************************************************************* 1679 ** Function nfa_dm_poll_disc_cback_dta_wrapper 1680 ** 1681 ** Description Accessing the nfa_dm_poll_disc_cback for DTA wrapper 1682 ** 1683 ** Returns None 1684 ** 1685 *******************************************************************************/ 1686 void nfa_dm_poll_disc_cback_dta_wrapper(tNFA_DM_RF_DISC_EVT event, 1687 tNFC_DISCOVER* p_data) { 1688 nfa_dm_poll_disc_cback(event, p_data); 1689 } 1690 1691 /******************************************************************************* 1692 ** 1693 ** Function nfa_dm_notify_activation_status 1694 ** 1695 ** Description Processing activation status from sub-modules 1696 ** 1697 ** Returns None 1698 ** 1699 *******************************************************************************/ 1700 void nfa_dm_notify_activation_status(tNFA_STATUS status, 1701 tNFA_TAG_PARAMS* p_params) { 1702 tNFA_CONN_EVT_DATA evt_data; 1703 tNFC_RF_TECH_PARAMS* p_tech_params; 1704 uint8_t *p_nfcid = NULL, nfcid_len; 1705 1706 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("status:0x%X", status); 1707 1708 if (!nfa_dm_cb.p_activate_ntf) { 1709 /* this is for NFA P2P listen */ 1710 return; 1711 } 1712 1713 if (status == NFA_STATUS_OK) { 1714 /* notify NFC link activation */ 1715 memcpy(&(evt_data.activated.activate_ntf), nfa_dm_cb.p_activate_ntf, 1716 sizeof(tNFC_ACTIVATE_DEVT)); 1717 1718 p_tech_params = &evt_data.activated.activate_ntf.rf_tech_param; 1719 1720 memset(&(evt_data.activated.params), 0x00, sizeof(tNFA_TAG_PARAMS)); 1721 if (p_params) { 1722 memcpy(&(evt_data.activated.params), p_params, sizeof(tNFA_TAG_PARAMS)); 1723 } 1724 1725 /* get length of NFCID and location */ 1726 if (p_tech_params->mode == NFC_DISCOVERY_TYPE_POLL_A) { 1727 if ((p_tech_params->param.pa.nfcid1_len == 0) && (p_params != NULL)) { 1728 nfcid_len = sizeof(p_params->t1t.uid); 1729 p_nfcid = p_params->t1t.uid; 1730 evt_data.activated.activate_ntf.rf_tech_param.param.pa.nfcid1_len = 1731 nfcid_len; 1732 memcpy(evt_data.activated.activate_ntf.rf_tech_param.param.pa.nfcid1, 1733 p_nfcid, nfcid_len); 1734 } else { 1735 nfcid_len = p_tech_params->param.pa.nfcid1_len; 1736 p_nfcid = p_tech_params->param.pa.nfcid1; 1737 } 1738 } else if (p_tech_params->mode == NFC_DISCOVERY_TYPE_POLL_B) { 1739 nfcid_len = NFC_NFCID0_MAX_LEN; 1740 p_nfcid = p_tech_params->param.pb.nfcid0; 1741 } else if (p_tech_params->mode == NFC_DISCOVERY_TYPE_POLL_F) { 1742 nfcid_len = NFC_NFCID2_LEN; 1743 p_nfcid = p_tech_params->param.pf.nfcid2; 1744 } else if (p_tech_params->mode == NFC_DISCOVERY_TYPE_POLL_V) { 1745 nfcid_len = NFC_ISO15693_UID_LEN; 1746 p_nfcid = p_tech_params->param.pi93.uid; 1747 } else if (p_tech_params->mode == NFC_DISCOVERY_TYPE_POLL_KOVIO) { 1748 nfcid_len = p_tech_params->param.pk.uid_len; 1749 p_nfcid = p_tech_params->param.pk.uid; 1750 } else { 1751 nfcid_len = 0; 1752 } 1753 1754 /* 1755 ** If not in exlusive RF mode, and 1756 ** P2P activation, then push default NDEF message through SNEP 1757 ** TAG activation, then read NDEF message 1758 */ 1759 if (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_NFC_DEP) { 1760 /* 1761 ** Default NDEF message will be put to NFC Forum defualt SNEP server 1762 ** after receiving NFA_LLCP_ACTIVATED_EVT. 1763 */ 1764 } else if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE)) { 1765 /* 1766 ** if the same tag is activated then do not perform auto NDEF 1767 ** detection. Application may put a tag into sleep mode and 1768 ** reactivate the same tag. 1769 */ 1770 1771 if ((p_tech_params->mode != nfa_dm_cb.activated_tech_mode) || 1772 (nfcid_len != nfa_dm_cb.activated_nfcid_len) || 1773 (memcmp(p_nfcid, nfa_dm_cb.activated_nfcid, nfcid_len))) { 1774 if ((nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T1T) || 1775 (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T2T) || 1776 (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_T3T) || 1777 ((nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_ISO_DEP) && 1778 (nfa_dm_cb.disc_cb.activated_rf_interface == 1779 NFC_INTERFACE_ISO_DEP)) || 1780 (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_T5T)) { 1781 if (p_nfa_dm_cfg->auto_detect_ndef) { 1782 if (p_nfa_dm_cfg->auto_read_ndef) { 1783 nfa_dm_cb.flags |= NFA_DM_FLAGS_AUTO_READING_NDEF; 1784 } 1785 NFA_RwDetectNDef(); 1786 } else if (p_nfa_dm_cfg->auto_read_ndef) { 1787 NFA_RwReadNDef(); 1788 } 1789 } 1790 } 1791 } 1792 1793 /* store activated tag information */ 1794 nfa_dm_cb.activated_tech_mode = p_tech_params->mode; 1795 nfa_dm_cb.activated_nfcid_len = nfcid_len; 1796 if (nfcid_len) memcpy(nfa_dm_cb.activated_nfcid, p_nfcid, nfcid_len); 1797 1798 nfa_dm_cb.flags |= NFA_DM_FLAGS_SEND_DEACTIVATED_EVT; 1799 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING)) 1800 nfa_dm_conn_cback_event_notify(NFA_ACTIVATED_EVT, &evt_data); 1801 } else { 1802 /* if NFC_DEP, NFA P2P will deactivate */ 1803 if (nfa_dm_cb.disc_cb.activated_protocol != NFC_PROTOCOL_NFC_DEP) { 1804 nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_DISCOVERY); 1805 } 1806 } 1807 1808 GKI_freebuf(nfa_dm_cb.p_activate_ntf); 1809 nfa_dm_cb.p_activate_ntf = NULL; 1810 } 1811 1812 /******************************************************************************* 1813 ** 1814 ** Function nfa_dm_nfc_revt_2_str 1815 ** 1816 ** Description convert nfc revt to string 1817 ** 1818 *******************************************************************************/ 1819 std::string nfa_dm_nfc_revt_2_str(tNFC_RESPONSE_EVT event) { 1820 switch (event) { 1821 case NFC_ENABLE_REVT: 1822 return "NFC_ENABLE_REVT"; 1823 case NFC_DISABLE_REVT: 1824 return "NFC_DISABLE_REVT"; 1825 case NFC_SET_CONFIG_REVT: 1826 return "NFC_SET_CONFIG_REVT"; 1827 case NFC_GET_CONFIG_REVT: 1828 return "NFC_GET_CONFIG_REVT"; 1829 case NFC_NFCEE_DISCOVER_REVT: 1830 return "NFC_NFCEE_DISCOVER_REVT"; 1831 case NFC_NFCEE_INFO_REVT: 1832 return "NFC_NFCEE_INFO_REVT"; 1833 case NFC_NFCEE_MODE_SET_REVT: 1834 return "NFC_NFCEE_MODE_SET_REVT"; 1835 case NFC_RF_FIELD_REVT: 1836 return "NFC_RF_FIELD_REVT"; 1837 case NFC_EE_ACTION_REVT: 1838 return "NFC_EE_ACTION_REVT"; 1839 case NFC_EE_DISCOVER_REQ_REVT: 1840 return "NFC_EE_DISCOVER_REQ_REVT"; 1841 case NFC_SET_ROUTING_REVT: 1842 return "NFC_SET_ROUTING_REVT"; 1843 case NFC_GET_ROUTING_REVT: 1844 return "NFC_GET_ROUTING_REVT"; 1845 case NFC_GEN_ERROR_REVT: 1846 return "NFC_GEN_ERROR_REVT"; 1847 case NFC_NFCC_RESTART_REVT: 1848 return "NFC_NFCC_RESTART_REVT"; 1849 case NFC_NFCC_TIMEOUT_REVT: 1850 return "NFC_NFCC_TIMEOUT_REVT"; 1851 case NFC_NFCC_TRANSPORT_ERR_REVT: 1852 return "NFC_NFCC_TRANSPORT_ERR_REVT"; 1853 case NFC_NFCC_POWER_OFF_REVT: 1854 return "NFC_NFCC_POWER_OFF_REVT"; 1855 case NFC_NFCEE_STATUS_REVT: 1856 return "NFC_NFCEE_STATUS_REVT"; 1857 default: 1858 return "unknown revt"; 1859 } 1860 } 1861