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