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 * 22 * This file contains the action functions for device manager discovery 23 * function. 24 * 25 ******************************************************************************/ 26 #include <string.h> 27 #include "nfa_sys.h" 28 #include "nfa_api.h" 29 #include "nfa_dm_int.h" 30 #include "nfa_p2p_int.h" 31 #include "nfa_sys_int.h" 32 #if (NFC_NFCEE_INCLUDED == TRUE) 33 #include "nfa_ee_api.h" 34 #include "nfa_ee_int.h" 35 #endif 36 #include "nfa_rw_int.h" 37 38 /* 39 ** static functions 40 */ 41 42 static UINT8 nfa_dm_get_rf_discover_config (tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask, 43 tNFC_DISCOVER_PARAMS disc_params[], 44 UINT8 max_params); 45 static tNFA_STATUS nfa_dm_set_rf_listen_mode_config (tNFA_DM_DISC_TECH_PROTO_MASK tech_proto_mask); 46 static void nfa_dm_set_rf_listen_mode_raw_config (tNFA_DM_DISC_TECH_PROTO_MASK *p_disc_mask); 47 static tNFA_DM_DISC_TECH_PROTO_MASK nfa_dm_disc_get_disc_mask (tNFC_RF_TECH_N_MODE tech_n_mode, 48 tNFC_PROTOCOL protocol); 49 static void nfa_dm_notify_discovery (tNFA_DM_RF_DISC_DATA *p_data); 50 static tNFA_STATUS nfa_dm_disc_notify_activation (tNFC_DISCOVER *p_data); 51 static void nfa_dm_disc_notify_deactivation (tNFA_DM_RF_DISC_SM_EVENT sm_event, tNFC_DISCOVER *p_data); 52 static void nfa_dm_disc_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data); 53 static void nfa_dm_disc_kovio_timeout_cback (TIMER_LIST_ENT *p_tle); 54 static void nfa_dm_disc_report_kovio_presence_check (tNFC_STATUS status); 55 56 #if (BT_TRACE_VERBOSE == TRUE) 57 static char *nfa_dm_disc_state_2_str (UINT8 state); 58 static char *nfa_dm_disc_event_2_str (UINT8 event); 59 #endif 60 61 62 /******************************************************************************* 63 ** 64 ** Function nfa_dm_get_rf_discover_config 65 ** 66 ** Description Build RF discovery configurations from tNFA_DM_DISC_TECH_PROTO_MASK 67 ** 68 ** Returns number of RF discovery configurations 69 ** 70 *******************************************************************************/ 71 static UINT8 nfa_dm_get_rf_discover_config (tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask, 72 tNFC_DISCOVER_PARAMS disc_params[], 73 UINT8 max_params) 74 { 75 UINT8 num_params = 0; 76 77 if (nfa_dm_cb.flags & NFA_DM_FLAGS_LISTEN_DISABLED) 78 { 79 NFA_TRACE_DEBUG1 ("nfa_dm_get_rf_discover_config () listen disabled, rm listen from 0x%x", dm_disc_mask); 80 dm_disc_mask &= NFA_DM_DISC_MASK_POLL; 81 } 82 if (nfa_dm_is_p2p_paused ()) 83 { 84 dm_disc_mask &= ~NFA_DM_DISC_MASK_NFC_DEP; 85 } 86 87 /* Check polling A */ 88 if (dm_disc_mask & ( NFA_DM_DISC_MASK_PA_T1T 89 |NFA_DM_DISC_MASK_PA_T2T 90 |NFA_DM_DISC_MASK_PA_ISO_DEP 91 |NFA_DM_DISC_MASK_PA_NFC_DEP 92 |NFA_DM_DISC_MASK_P_LEGACY) ) 93 { 94 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_A; 95 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pa; 96 num_params++; 97 98 if (num_params >= max_params) 99 return num_params; 100 } 101 102 /* Check polling B */ 103 if (dm_disc_mask & NFA_DM_DISC_MASK_PB_ISO_DEP) 104 { 105 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_B; 106 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pb; 107 num_params++; 108 109 if (num_params >= max_params) 110 return num_params; 111 } 112 113 /* Check polling F */ 114 if (dm_disc_mask & ( NFA_DM_DISC_MASK_PF_T3T 115 |NFA_DM_DISC_MASK_PF_NFC_DEP) ) 116 { 117 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_F; 118 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pf; 119 num_params++; 120 121 if (num_params >= max_params) 122 return num_params; 123 } 124 125 /* Check polling A Active mode */ 126 if (dm_disc_mask & NFA_DM_DISC_MASK_PAA_NFC_DEP) 127 { 128 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_A_ACTIVE; 129 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->paa; 130 num_params++; 131 132 if (num_params >= max_params) 133 return num_params; 134 } 135 136 /* Check polling F Active mode */ 137 if (dm_disc_mask & NFA_DM_DISC_MASK_PFA_NFC_DEP) 138 { 139 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_F_ACTIVE; 140 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pfa; 141 num_params++; 142 143 if (num_params >= max_params) 144 return num_params; 145 } 146 147 /* Check listening A */ 148 if (dm_disc_mask & ( NFA_DM_DISC_MASK_LA_T1T 149 |NFA_DM_DISC_MASK_LA_T2T 150 |NFA_DM_DISC_MASK_LA_ISO_DEP 151 |NFA_DM_DISC_MASK_LA_NFC_DEP) ) 152 { 153 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_A; 154 disc_params[num_params].frequency = 1; 155 num_params++; 156 157 if (num_params >= max_params) 158 return num_params; 159 } 160 161 /* Check listening B */ 162 if (dm_disc_mask & NFA_DM_DISC_MASK_LB_ISO_DEP) 163 { 164 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_B; 165 disc_params[num_params].frequency = 1; 166 num_params++; 167 168 if (num_params >= max_params) 169 return num_params; 170 } 171 172 /* Check listening F */ 173 if (dm_disc_mask & ( NFA_DM_DISC_MASK_LF_T3T 174 |NFA_DM_DISC_MASK_LF_NFC_DEP) ) 175 { 176 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_F; 177 disc_params[num_params].frequency = 1; 178 num_params++; 179 180 if (num_params >= max_params) 181 return num_params; 182 } 183 184 /* Check listening A Active mode */ 185 if (dm_disc_mask & NFA_DM_DISC_MASK_LAA_NFC_DEP) 186 { 187 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE; 188 disc_params[num_params].frequency = 1; 189 num_params++; 190 191 if (num_params >= max_params) 192 return num_params; 193 } 194 195 /* Check listening F Active mode */ 196 if (dm_disc_mask & NFA_DM_DISC_MASK_LFA_NFC_DEP) 197 { 198 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE; 199 disc_params[num_params].frequency = 1; 200 num_params++; 201 202 if (num_params >= max_params) 203 return num_params; 204 } 205 206 /* Check polling ISO 15693 */ 207 if (dm_disc_mask & NFA_DM_DISC_MASK_P_ISO15693) 208 { 209 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_ISO15693; 210 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pi93; 211 num_params++; 212 213 if (num_params >= max_params) 214 return num_params; 215 } 216 217 /* Check polling B' */ 218 if (dm_disc_mask & NFA_DM_DISC_MASK_P_B_PRIME) 219 { 220 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_B_PRIME; 221 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pbp; 222 num_params++; 223 224 if (num_params >= max_params) 225 return num_params; 226 } 227 228 /* Check polling KOVIO */ 229 if (dm_disc_mask & NFA_DM_DISC_MASK_P_KOVIO) 230 { 231 disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_KOVIO; 232 disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pk; 233 num_params++; 234 235 if (num_params >= max_params) 236 return num_params; 237 } 238 239 /* Check listening ISO 15693 */ 240 if (dm_disc_mask & NFA_DM_DISC_MASK_L_ISO15693) 241 { 242 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_ISO15693; 243 disc_params[num_params].frequency = 1; 244 num_params++; 245 246 if (num_params >= max_params) 247 return num_params; 248 } 249 250 /* Check listening B' */ 251 if (dm_disc_mask & NFA_DM_DISC_MASK_L_B_PRIME) 252 { 253 disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_B_PRIME; 254 disc_params[num_params].frequency = 1; 255 num_params++; 256 257 if (num_params >= max_params) 258 return num_params; 259 } 260 261 return num_params; 262 } 263 264 /******************************************************************************* 265 ** 266 ** Function nfa_dm_set_rf_listen_mode_config 267 ** 268 ** Description Update listening protocol to NFCC 269 ** 270 ** Returns NFA_STATUS_OK if success 271 ** 272 *******************************************************************************/ 273 static tNFA_STATUS nfa_dm_set_rf_listen_mode_config (tNFA_DM_DISC_TECH_PROTO_MASK tech_proto_mask) 274 { 275 UINT8 params[40], *p; 276 UINT8 platform = 0; 277 UINT8 sens_info = 0; 278 279 NFA_TRACE_DEBUG1 ("nfa_dm_set_rf_listen_mode_config () tech_proto_mask = 0x%08X", 280 tech_proto_mask); 281 282 /* 283 ** T1T listen LA_PROT 0x80, LA_SENS_RES byte1:0x00 byte2:0x0C 284 ** T2T listen LA_PROT 0x00 285 ** T3T listen No bit for T3T in LF_PROT (CE T3T set listen parameters, system code, NFCID2, etc.) 286 ** ISO-DEP listen LA_PROT 0x01, LB_PROT 0x01 287 ** NFC-DEP listen LA_PROT 0x02, LF_PROT 0x02 288 */ 289 290 if (tech_proto_mask & NFA_DM_DISC_MASK_LA_T1T) 291 { 292 platform = NCI_PARAM_PLATFORM_T1T; 293 } 294 else if (tech_proto_mask & NFA_DM_DISC_MASK_LA_T2T) 295 { 296 /* platform = 0 and sens_info = 0 */ 297 } 298 else 299 { 300 if (tech_proto_mask & NFA_DM_DISC_MASK_LA_ISO_DEP) 301 { 302 sens_info |= NCI_PARAM_SEL_INFO_ISODEP; 303 } 304 305 if (tech_proto_mask & NFA_DM_DISC_MASK_LA_NFC_DEP) 306 { 307 sens_info |= NCI_PARAM_SEL_INFO_NFCDEP; 308 } 309 } 310 311 p = params; 312 313 /* 314 ** for Listen A 315 ** 316 ** Set ATQA 0x0C00 for T1T listen 317 ** If the ATQA values are 0x0000, then the FW will use 0x0400 318 ** which works for ISODEP, T2T and NFCDEP. 319 */ 320 if (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A] == NFA_DM_DISC_HOST_ID_DH) 321 { 322 UINT8_TO_STREAM (p, NFC_PMID_LA_BIT_FRAME_SDD); 323 UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_BIT_FRAME_SDD); 324 UINT8_TO_STREAM (p, 0x04); 325 UINT8_TO_STREAM (p, NFC_PMID_LA_PLATFORM_CONFIG); 326 UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_PLATFORM_CONFIG); 327 UINT8_TO_STREAM (p, platform); 328 UINT8_TO_STREAM (p, NFC_PMID_LA_SEL_INFO); 329 UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_SEL_INFO); 330 UINT8_TO_STREAM (p, sens_info); 331 } 332 else /* Let NFCC use UICC configuration by configuring with length = 0 */ 333 { 334 UINT8_TO_STREAM (p, NFC_PMID_LA_BIT_FRAME_SDD); 335 UINT8_TO_STREAM (p, 0); 336 UINT8_TO_STREAM (p, NFC_PMID_LA_PLATFORM_CONFIG); 337 UINT8_TO_STREAM (p, 0); 338 UINT8_TO_STREAM (p, NFC_PMID_LA_SEL_INFO); 339 UINT8_TO_STREAM (p, 0); 340 UINT8_TO_STREAM (p, NFC_PMID_LA_NFCID1); 341 UINT8_TO_STREAM (p, 0); 342 UINT8_TO_STREAM (p, NFC_PMID_LA_HIST_BY); 343 UINT8_TO_STREAM (p, 0); 344 } 345 346 /* for Listen B */ 347 if (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_B] == NFA_DM_DISC_HOST_ID_DH) 348 { 349 UINT8_TO_STREAM (p, NFC_PMID_LB_SENSB_INFO); 350 UINT8_TO_STREAM (p, NCI_PARAM_LEN_LB_SENSB_INFO); 351 if (tech_proto_mask & NFA_DM_DISC_MASK_LB_ISO_DEP) 352 { 353 UINT8_TO_STREAM (p, NCI_LISTEN_PROTOCOL_ISO_DEP); 354 } 355 else 356 { 357 UINT8_TO_STREAM (p, 0x00); 358 } 359 } 360 else /* Let NFCC use UICC configuration by configuring with length = 0 */ 361 { 362 UINT8_TO_STREAM (p, NFC_PMID_LB_SENSB_INFO); 363 UINT8_TO_STREAM (p, 0); 364 UINT8_TO_STREAM (p, NFC_PMID_LB_NFCID0); 365 UINT8_TO_STREAM (p, 0); 366 UINT8_TO_STREAM (p, NFC_PMID_LB_APPDATA); 367 UINT8_TO_STREAM (p, 0); 368 UINT8_TO_STREAM (p, NFC_PMID_LB_ADC_FO); 369 UINT8_TO_STREAM (p, 0); 370 UINT8_TO_STREAM (p, NFC_PMID_LB_H_INFO); 371 UINT8_TO_STREAM (p, 0); 372 } 373 374 /* for Listen F */ 375 /* NFCC can support NFC-DEP and T3T listening based on NFCID routing regardless of NFC-F tech routing */ 376 UINT8_TO_STREAM (p, NFC_PMID_LF_PROTOCOL); 377 UINT8_TO_STREAM (p, NCI_PARAM_LEN_LF_PROTOCOL); 378 if ((tech_proto_mask & NFA_DM_DISC_MASK_LF_NFC_DEP) && 379 !nfa_dm_is_p2p_paused() ) 380 { 381 UINT8_TO_STREAM (p, NCI_LISTEN_PROTOCOL_NFC_DEP); 382 } 383 else 384 { 385 UINT8_TO_STREAM (p, 0x00); 386 } 387 388 if (p > params) 389 { 390 nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE); 391 } 392 393 return NFA_STATUS_OK; 394 } 395 396 /******************************************************************************* 397 ** 398 ** Function nfa_dm_set_total_duration 399 ** 400 ** Description Update total duration to NFCC 401 ** 402 ** Returns void 403 ** 404 *******************************************************************************/ 405 static void nfa_dm_set_total_duration (void) 406 { 407 UINT8 params[10], *p; 408 409 NFA_TRACE_DEBUG0 ("nfa_dm_set_total_duration ()"); 410 411 p = params; 412 413 /* for total duration */ 414 UINT8_TO_STREAM (p, NFC_PMID_TOTAL_DURATION); 415 UINT8_TO_STREAM (p, NCI_PARAM_LEN_TOTAL_DURATION); 416 UINT16_TO_STREAM (p, nfa_dm_cb.disc_cb.disc_duration); 417 418 if (p > params) 419 { 420 nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE); 421 } 422 } 423 424 /******************************************************************************* 425 ** 426 ** Function nfa_dm_set_rf_listen_mode_raw_config 427 ** 428 ** Description Set raw listen parameters 429 ** 430 ** Returns void 431 ** 432 *******************************************************************************/ 433 static void nfa_dm_set_rf_listen_mode_raw_config (tNFA_DM_DISC_TECH_PROTO_MASK *p_disc_mask) 434 { 435 tNFA_DM_DISC_TECH_PROTO_MASK disc_mask = 0; 436 tNFA_LISTEN_CFG *p_cfg = &nfa_dm_cb.disc_cb.excl_listen_config; 437 UINT8 params[250], *p, xx; 438 439 NFA_TRACE_DEBUG0 ("nfa_dm_set_rf_listen_mode_raw_config ()"); 440 441 /* 442 ** Discovery Configuration Parameters for Listen A 443 */ 444 if ( (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A] == NFA_DM_DISC_HOST_ID_DH) 445 &&(p_cfg->la_enable) ) 446 { 447 p = params; 448 449 UINT8_TO_STREAM (p, NFC_PMID_LA_BIT_FRAME_SDD); 450 UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_BIT_FRAME_SDD); 451 UINT8_TO_STREAM (p, p_cfg->la_bit_frame_sdd); 452 453 UINT8_TO_STREAM (p, NFC_PMID_LA_PLATFORM_CONFIG); 454 UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_PLATFORM_CONFIG); 455 UINT8_TO_STREAM (p, p_cfg->la_platform_config); 456 457 UINT8_TO_STREAM (p, NFC_PMID_LA_SEL_INFO); 458 UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_SEL_INFO); 459 UINT8_TO_STREAM (p, p_cfg->la_sel_info); 460 461 if (p_cfg->la_platform_config == NCI_PARAM_PLATFORM_T1T) 462 { 463 disc_mask |= NFA_DM_DISC_MASK_LA_T1T; 464 } 465 else 466 { 467 /* If T4T or NFCDEP */ 468 if (p_cfg->la_sel_info & NCI_PARAM_SEL_INFO_ISODEP) 469 { 470 disc_mask |= NFA_DM_DISC_MASK_LA_ISO_DEP; 471 } 472 473 if (p_cfg->la_sel_info & NCI_PARAM_SEL_INFO_NFCDEP) 474 { 475 disc_mask |= NFA_DM_DISC_MASK_LA_NFC_DEP; 476 } 477 478 /* If neither, T4T nor NFCDEP, then its T2T */ 479 if (disc_mask == 0) 480 { 481 disc_mask |= NFA_DM_DISC_MASK_LA_T2T; 482 } 483 } 484 485 UINT8_TO_STREAM (p, NFC_PMID_LA_NFCID1); 486 UINT8_TO_STREAM (p, p_cfg->la_nfcid1_len); 487 ARRAY_TO_STREAM (p, p_cfg->la_nfcid1, p_cfg->la_nfcid1_len); 488 489 nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE); 490 } 491 492 /* 493 ** Discovery Configuration Parameters for Listen B 494 */ 495 if ( (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_B] == NFA_DM_DISC_HOST_ID_DH) 496 &&(p_cfg->lb_enable) ) 497 { 498 p = params; 499 500 UINT8_TO_STREAM (p, NFC_PMID_LB_SENSB_INFO); 501 UINT8_TO_STREAM (p, NCI_PARAM_LEN_LB_SENSB_INFO); 502 UINT8_TO_STREAM (p, p_cfg->lb_sensb_info); 503 504 UINT8_TO_STREAM (p, NFC_PMID_LB_NFCID0); 505 UINT8_TO_STREAM (p, p_cfg->lb_nfcid0_len); 506 ARRAY_TO_STREAM (p, p_cfg->lb_nfcid0, p_cfg->lb_nfcid0_len); 507 508 UINT8_TO_STREAM (p, NFC_PMID_LB_APPDATA); 509 UINT8_TO_STREAM (p, NCI_PARAM_LEN_LB_APPDATA); 510 ARRAY_TO_STREAM (p, p_cfg->lb_app_data, NCI_PARAM_LEN_LB_APPDATA); 511 512 UINT8_TO_STREAM (p, NFC_PMID_LB_SFGI); 513 UINT8_TO_STREAM (p, 1); 514 UINT8_TO_STREAM (p, p_cfg->lb_adc_fo); 515 516 UINT8_TO_STREAM (p, NFC_PMID_LB_ADC_FO); 517 UINT8_TO_STREAM (p, NCI_PARAM_LEN_LB_ADC_FO); 518 UINT8_TO_STREAM (p, p_cfg->lb_adc_fo); 519 520 nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE); 521 522 if (p_cfg->lb_sensb_info & NCI_LISTEN_PROTOCOL_ISO_DEP) 523 { 524 disc_mask |= NFA_DM_DISC_MASK_LB_ISO_DEP; 525 } 526 } 527 528 /* 529 ** Discovery Configuration Parameters for Listen F 530 */ 531 if ( (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_F] == NFA_DM_DISC_HOST_ID_DH) 532 &&(p_cfg->lf_enable) ) 533 { 534 p = params; 535 536 UINT8_TO_STREAM (p, NFC_PMID_LF_CON_BITR_F); 537 UINT8_TO_STREAM (p, 1); 538 UINT8_TO_STREAM (p, p_cfg->lf_con_bitr_f); 539 540 UINT8_TO_STREAM (p, NFC_PMID_LF_PROTOCOL); 541 UINT8_TO_STREAM (p, NCI_PARAM_LEN_LF_PROTOCOL); 542 UINT8_TO_STREAM (p, p_cfg->lf_protocol_type); 543 544 UINT8_TO_STREAM (p, NFC_PMID_LF_T3T_FLAGS2); 545 UINT8_TO_STREAM (p, NCI_PARAM_LEN_LF_T3T_FLAGS2); 546 UINT16_TO_STREAM(p, p_cfg->lf_t3t_flags); 547 548 /* if the bit at position X is set to 0, SC/NFCID2 with index X shall be ignored */ 549 for (xx = 0; xx < NFA_LF_MAX_SC_NFCID2; xx++) 550 { 551 if ((p_cfg->lf_t3t_flags & (0x0001 << xx)) != 0x0000) 552 { 553 UINT8_TO_STREAM (p, NFC_PMID_LF_T3T_ID1 + xx); 554 UINT8_TO_STREAM (p, NCI_SYSTEMCODE_LEN + NCI_NFCID2_LEN); 555 ARRAY_TO_STREAM (p, p_cfg->lf_t3t_identifier[xx], NCI_SYSTEMCODE_LEN + NCI_NFCID2_LEN); 556 } 557 } 558 559 UINT8_TO_STREAM (p, NFC_PMID_LF_T3T_PMM); 560 UINT8_TO_STREAM (p, NCI_PARAM_LEN_LF_T3T_PMM); 561 ARRAY_TO_STREAM (p, p_cfg->lf_t3t_pmm, NCI_PARAM_LEN_LF_T3T_PMM); 562 563 nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE); 564 565 if (p_cfg->lf_t3t_flags != NCI_LF_T3T_FLAGS2_ALL_DISABLED) 566 { 567 disc_mask |= NFA_DM_DISC_MASK_LF_T3T; 568 } 569 if (p_cfg->lf_protocol_type & NCI_LISTEN_PROTOCOL_NFC_DEP) 570 { 571 disc_mask |= NFA_DM_DISC_MASK_LF_NFC_DEP; 572 } 573 } 574 575 /* 576 ** Discovery Configuration Parameters for Listen ISO-DEP 577 */ 578 if ((disc_mask & (NFA_DM_DISC_MASK_LA_ISO_DEP|NFA_DM_DISC_MASK_LB_ISO_DEP)) 579 &&(p_cfg->li_enable)) 580 { 581 p = params; 582 583 UINT8_TO_STREAM (p, NFC_PMID_FWI); 584 UINT8_TO_STREAM (p, NCI_PARAM_LEN_FWI); 585 UINT8_TO_STREAM (p, p_cfg->li_fwi); 586 587 if (disc_mask & NFA_DM_DISC_MASK_LA_ISO_DEP) 588 { 589 UINT8_TO_STREAM (p, NFC_PMID_LA_HIST_BY); 590 UINT8_TO_STREAM (p, p_cfg->la_hist_bytes_len); 591 ARRAY_TO_STREAM (p, p_cfg->la_hist_bytes, p_cfg->la_hist_bytes_len); 592 } 593 594 if (disc_mask & NFA_DM_DISC_MASK_LB_ISO_DEP) 595 { 596 UINT8_TO_STREAM (p, NFC_PMID_LB_H_INFO); 597 UINT8_TO_STREAM (p, p_cfg->lb_h_info_resp_len); 598 ARRAY_TO_STREAM (p, p_cfg->lb_h_info_resp, p_cfg->lb_h_info_resp_len); 599 } 600 601 nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE); 602 } 603 604 /* 605 ** Discovery Configuration Parameters for Listen NFC-DEP 606 */ 607 if ( (disc_mask & (NFA_DM_DISC_MASK_LA_NFC_DEP|NFA_DM_DISC_MASK_LF_NFC_DEP)) 608 &&(p_cfg->ln_enable)) 609 { 610 p = params; 611 612 UINT8_TO_STREAM (p, NFC_PMID_WT); 613 UINT8_TO_STREAM (p, NCI_PARAM_LEN_WT); 614 UINT8_TO_STREAM (p, p_cfg->ln_wt); 615 616 UINT8_TO_STREAM (p, NFC_PMID_ATR_RES_GEN_BYTES); 617 UINT8_TO_STREAM (p, p_cfg->ln_atr_res_gen_bytes_len); 618 ARRAY_TO_STREAM (p, p_cfg->ln_atr_res_gen_bytes, p_cfg->ln_atr_res_gen_bytes_len); 619 620 UINT8_TO_STREAM (p, NFC_PMID_ATR_RSP_CONFIG); 621 UINT8_TO_STREAM (p, 1); 622 UINT8_TO_STREAM (p, p_cfg->ln_atr_res_config); 623 624 nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE); 625 } 626 627 *p_disc_mask = disc_mask; 628 629 NFA_TRACE_DEBUG1 ("nfa_dm_set_rf_listen_mode_raw_config () disc_mask = 0x%x", disc_mask); 630 } 631 632 /******************************************************************************* 633 ** 634 ** Function nfa_dm_disc_get_disc_mask 635 ** 636 ** Description Convert RF technology, mode and protocol to bit mask 637 ** 638 ** Returns tNFA_DM_DISC_TECH_PROTO_MASK 639 ** 640 *******************************************************************************/ 641 static tNFA_DM_DISC_TECH_PROTO_MASK nfa_dm_disc_get_disc_mask (tNFC_RF_TECH_N_MODE tech_n_mode, 642 tNFC_PROTOCOL protocol) 643 { 644 /* Set initial disc_mask to legacy poll or listen */ 645 tNFA_DM_DISC_TECH_PROTO_MASK disc_mask = ((tech_n_mode & 0x80) ? NFA_DM_DISC_MASK_L_LEGACY : NFA_DM_DISC_MASK_P_LEGACY); 646 647 switch (tech_n_mode) 648 { 649 case NFC_DISCOVERY_TYPE_POLL_A: 650 switch (protocol) 651 { 652 case NFC_PROTOCOL_T1T: 653 disc_mask = NFA_DM_DISC_MASK_PA_T1T; 654 break; 655 case NFC_PROTOCOL_T2T: 656 disc_mask = NFA_DM_DISC_MASK_PA_T2T; 657 break; 658 case NFC_PROTOCOL_ISO_DEP: 659 disc_mask = NFA_DM_DISC_MASK_PA_ISO_DEP; 660 break; 661 case NFC_PROTOCOL_NFC_DEP: 662 disc_mask = NFA_DM_DISC_MASK_PA_NFC_DEP; 663 break; 664 } 665 break; 666 case NFC_DISCOVERY_TYPE_POLL_B: 667 if (protocol == NFC_PROTOCOL_ISO_DEP) 668 disc_mask = NFA_DM_DISC_MASK_PB_ISO_DEP; 669 break; 670 case NFC_DISCOVERY_TYPE_POLL_F: 671 if (protocol == NFC_PROTOCOL_T3T) 672 disc_mask = NFA_DM_DISC_MASK_PF_T3T; 673 else if (protocol == NFC_PROTOCOL_NFC_DEP) 674 disc_mask = NFA_DM_DISC_MASK_PF_NFC_DEP; 675 break; 676 case NFC_DISCOVERY_TYPE_POLL_ISO15693: 677 disc_mask = NFA_DM_DISC_MASK_P_ISO15693; 678 break; 679 case NFC_DISCOVERY_TYPE_POLL_B_PRIME: 680 disc_mask = NFA_DM_DISC_MASK_P_B_PRIME; 681 break; 682 case NFC_DISCOVERY_TYPE_POLL_KOVIO: 683 disc_mask = NFA_DM_DISC_MASK_P_KOVIO; 684 break; 685 case NFC_DISCOVERY_TYPE_POLL_A_ACTIVE: 686 disc_mask = NFA_DM_DISC_MASK_PAA_NFC_DEP; 687 break; 688 case NFC_DISCOVERY_TYPE_POLL_F_ACTIVE: 689 disc_mask = NFA_DM_DISC_MASK_PFA_NFC_DEP; 690 break; 691 692 case NFC_DISCOVERY_TYPE_LISTEN_A: 693 switch (protocol) 694 { 695 case NFC_PROTOCOL_T1T: 696 disc_mask = NFA_DM_DISC_MASK_LA_T1T; 697 break; 698 case NFC_PROTOCOL_T2T: 699 disc_mask = NFA_DM_DISC_MASK_LA_T2T; 700 break; 701 case NFC_PROTOCOL_ISO_DEP: 702 disc_mask = NFA_DM_DISC_MASK_LA_ISO_DEP; 703 break; 704 case NFC_PROTOCOL_NFC_DEP: 705 disc_mask = NFA_DM_DISC_MASK_LA_NFC_DEP; 706 break; 707 } 708 break; 709 case NFC_DISCOVERY_TYPE_LISTEN_B: 710 if (protocol == NFC_PROTOCOL_ISO_DEP) 711 disc_mask = NFA_DM_DISC_MASK_LB_ISO_DEP; 712 break; 713 case NFC_DISCOVERY_TYPE_LISTEN_F: 714 if (protocol == NFC_PROTOCOL_T3T) 715 disc_mask = NFA_DM_DISC_MASK_LF_T3T; 716 else if (protocol == NFC_PROTOCOL_NFC_DEP) 717 disc_mask = NFA_DM_DISC_MASK_LF_NFC_DEP; 718 break; 719 case NFC_DISCOVERY_TYPE_LISTEN_ISO15693: 720 disc_mask = NFA_DM_DISC_MASK_L_ISO15693; 721 break; 722 case NFC_DISCOVERY_TYPE_LISTEN_B_PRIME: 723 disc_mask = NFA_DM_DISC_MASK_L_B_PRIME; 724 break; 725 case NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE: 726 disc_mask = NFA_DM_DISC_MASK_LAA_NFC_DEP; 727 break; 728 case NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE: 729 disc_mask = NFA_DM_DISC_MASK_LFA_NFC_DEP; 730 break; 731 } 732 733 NFA_TRACE_DEBUG3 ("nfa_dm_disc_get_disc_mask (): tech_n_mode:0x%X, protocol:0x%X, disc_mask:0x%X", 734 tech_n_mode, protocol, disc_mask); 735 return (disc_mask); 736 } 737 738 /******************************************************************************* 739 ** 740 ** Function nfa_dm_disc_discovery_cback 741 ** 742 ** Description Discovery callback event from NFC 743 ** 744 ** Returns void 745 ** 746 *******************************************************************************/ 747 static void nfa_dm_disc_discovery_cback (tNFC_DISCOVER_EVT event, tNFC_DISCOVER *p_data) 748 { 749 tNFA_DM_RF_DISC_SM_EVENT dm_disc_event = NFA_DM_DISC_SM_MAX_EVENT; 750 751 NFA_TRACE_DEBUG1 ("nfa_dm_disc_discovery_cback (): event:0x%X", event); 752 753 switch (event) 754 { 755 case NFC_START_DEVT: 756 dm_disc_event = NFA_DM_RF_DISCOVER_RSP; 757 break; 758 case NFC_RESULT_DEVT: 759 dm_disc_event = NFA_DM_RF_DISCOVER_NTF; 760 break; 761 case NFC_SELECT_DEVT: 762 dm_disc_event = NFA_DM_RF_DISCOVER_SELECT_RSP; 763 break; 764 case NFC_ACTIVATE_DEVT: 765 dm_disc_event = NFA_DM_RF_INTF_ACTIVATED_NTF; 766 break; 767 case NFC_DEACTIVATE_DEVT: 768 if (p_data->deactivate.is_ntf) 769 { 770 dm_disc_event = NFA_DM_RF_DEACTIVATE_NTF; 771 if ((p_data->deactivate.type == NFC_DEACTIVATE_TYPE_IDLE) || (p_data->deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY)) 772 { 773 NFC_SetReassemblyFlag (TRUE); 774 nfa_dm_cb.flags &= ~NFA_DM_FLAGS_RAW_FRAME; 775 } 776 } 777 else 778 dm_disc_event = NFA_DM_RF_DEACTIVATE_RSP; 779 break; 780 default: 781 NFA_TRACE_ERROR0 ("Unexpected event"); 782 return; 783 } 784 785 nfa_dm_disc_sm_execute (dm_disc_event, (tNFA_DM_RF_DISC_DATA *) p_data); 786 } 787 788 /******************************************************************************* 789 ** 790 ** Function nfa_dm_disc_notify_started 791 ** 792 ** Description Report NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT or 793 ** NFA_RF_DISCOVERY_STARTED_EVT, if needed 794 ** 795 ** Returns void 796 ** 797 *******************************************************************************/ 798 static void nfa_dm_disc_notify_started (tNFA_STATUS status) 799 { 800 tNFA_CONN_EVT_DATA evt_data; 801 802 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_NOTIFY) 803 { 804 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY; 805 806 evt_data.status = status; 807 808 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) 809 nfa_dm_conn_cback_event_notify (NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT, &evt_data); 810 else 811 nfa_dm_conn_cback_event_notify (NFA_RF_DISCOVERY_STARTED_EVT, &evt_data); 812 } 813 } 814 815 /******************************************************************************* 816 ** 817 ** Function nfa_dm_disc_conn_event_notify 818 ** 819 ** Description Notify application of CONN_CBACK event, using appropriate 820 ** callback 821 ** 822 ** Returns nothing 823 ** 824 *******************************************************************************/ 825 void nfa_dm_disc_conn_event_notify (UINT8 event, tNFA_STATUS status) 826 { 827 tNFA_CONN_EVT_DATA evt_data; 828 829 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_NOTIFY) 830 { 831 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY; 832 evt_data.status = status; 833 834 if (nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE) 835 { 836 /* Use exclusive RF mode callback */ 837 if (nfa_dm_cb.p_excl_conn_cback) 838 (*nfa_dm_cb.p_excl_conn_cback) (event, &evt_data); 839 } 840 else 841 { 842 (*nfa_dm_cb.p_conn_cback) (event, &evt_data); 843 } 844 } 845 } 846 847 /******************************************************************************* 848 ** 849 ** Function nfa_dm_disc_force_to_idle 850 ** 851 ** Description Force NFCC to idle state while waiting for deactivation NTF 852 ** 853 ** Returns tNFC_STATUS 854 ** 855 *******************************************************************************/ 856 static tNFC_STATUS nfa_dm_disc_force_to_idle (void) 857 { 858 tNFC_STATUS status = NFC_STATUS_SEMANTIC_ERROR; 859 860 NFA_TRACE_DEBUG1 ("nfa_dm_disc_force_to_idle() disc_flags = 0x%x", nfa_dm_cb.disc_cb.disc_flags); 861 862 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF) /* do not execute more than one */ 863 { 864 nfa_dm_cb.disc_cb.disc_flags &= ~(NFA_DM_DISC_FLAGS_W4_NTF); 865 nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_W4_RSP); 866 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 867 status = NFC_Deactivate (NFC_DEACTIVATE_TYPE_IDLE); 868 } 869 870 return (status); 871 } 872 873 /******************************************************************************* 874 ** 875 ** Function nfa_dm_disc_deact_ntf_timeout_cback 876 ** 877 ** Description Timeout while waiting for deactivation NTF 878 ** 879 ** Returns void 880 ** 881 *******************************************************************************/ 882 static void nfa_dm_disc_deact_ntf_timeout_cback (TIMER_LIST_ENT *p_tle) 883 { 884 NFA_TRACE_ERROR0 ("nfa_dm_disc_deact_ntf_timeout_cback()"); 885 886 nfa_dm_disc_force_to_idle(); 887 } 888 889 /******************************************************************************* 890 ** 891 ** Function nfa_dm_send_deactivate_cmd 892 ** 893 ** Description Send deactivate command to NFCC, if needed. 894 ** 895 ** Returns NFC_STATUS_OK - deactivate cmd is sent 896 ** NCI_STATUS_FAILED - no buffers 897 ** NFC_STATUS_SEMANTIC_ERROR - this function does not attempt 898 ** to send deactivate cmd 899 ** 900 *******************************************************************************/ 901 static tNFC_STATUS nfa_dm_send_deactivate_cmd (tNFC_DEACT_TYPE deactivate_type) 902 { 903 tNFC_STATUS status = NFC_STATUS_SEMANTIC_ERROR; 904 tNFA_DM_DISC_FLAGS w4_flags = nfa_dm_cb.disc_cb.disc_flags & (NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF); 905 906 if (!w4_flags) 907 { 908 /* if deactivate CMD was not sent to NFCC */ 909 nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF); 910 911 status = NFC_Deactivate (deactivate_type); 912 913 if (!nfa_dm_cb.disc_cb.tle.in_use) 914 { 915 nfa_dm_cb.disc_cb.tle.p_cback = (TIMER_CBACK *)nfa_dm_disc_deact_ntf_timeout_cback; 916 nfa_sys_start_timer (&nfa_dm_cb.disc_cb.tle, 0, NFA_DM_DISC_TIMEOUT_W4_DEACT_NTF); 917 } 918 } 919 else 920 { 921 if (deactivate_type == NFC_DEACTIVATE_TYPE_SLEEP) 922 { 923 status = NFC_STATUS_SEMANTIC_ERROR; 924 } 925 else if (nfa_dm_cb.disc_cb.tle.in_use) 926 { 927 status = NFC_STATUS_OK; 928 } 929 else 930 { 931 status = nfa_dm_disc_force_to_idle (); 932 } 933 } 934 935 return status; 936 } 937 938 /******************************************************************************* 939 ** 940 ** Function nfa_dm_start_rf_discover 941 ** 942 ** Description Start RF discovery 943 ** 944 ** Returns void 945 ** 946 *******************************************************************************/ 947 void nfa_dm_start_rf_discover (void) 948 { 949 tNFC_DISCOVER_PARAMS disc_params[NFA_DM_MAX_DISC_PARAMS]; 950 tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask = 0, poll_mask, listen_mask; 951 UINT8 num_params, xx; 952 953 NFA_TRACE_DEBUG0 ("nfa_dm_start_rf_discover ()"); 954 /* Make sure that RF discovery was enabled, or some app has exclusive control */ 955 if ( (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_ENABLED)) 956 &&(nfa_dm_cb.disc_cb.excl_disc_entry.in_use == FALSE) ) 957 { 958 return; 959 } 960 961 /* get listen mode routing table for technology */ 962 nfa_ee_get_tech_route (NFA_EE_PWR_STATE_ON, nfa_dm_cb.disc_cb.listen_RT); 963 964 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) 965 { 966 nfa_dm_set_rf_listen_mode_raw_config (&dm_disc_mask); 967 dm_disc_mask |= (nfa_dm_cb.disc_cb.excl_disc_entry.requested_disc_mask & NFA_DM_DISC_MASK_POLL); 968 nfa_dm_cb.disc_cb.excl_disc_entry.selected_disc_mask = dm_disc_mask; 969 } 970 else 971 { 972 /* Collect RF discovery request from sub-modules */ 973 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) 974 { 975 if (nfa_dm_cb.disc_cb.entry[xx].in_use) 976 { 977 poll_mask = (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask & NFA_DM_DISC_MASK_POLL); 978 979 /* clear poll mode technolgies and protocols which are already used by others */ 980 poll_mask &= ~(dm_disc_mask & NFA_DM_DISC_MASK_POLL); 981 982 listen_mask = 0; 983 984 /* 985 ** add listen mode technolgies and protocols if host ID is matched to listen mode routing table 986 */ 987 988 /* NFC-A */ 989 if (nfa_dm_cb.disc_cb.entry[xx].host_id == nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A]) 990 { 991 listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask 992 & ( NFA_DM_DISC_MASK_LA_T1T 993 |NFA_DM_DISC_MASK_LA_T2T 994 |NFA_DM_DISC_MASK_LA_ISO_DEP 995 |NFA_DM_DISC_MASK_LA_NFC_DEP 996 |NFA_DM_DISC_MASK_LAA_NFC_DEP ); 997 } 998 else 999 { 1000 /* host can listen ISO-DEP based on AID routing */ 1001 listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask & NFA_DM_DISC_MASK_LA_ISO_DEP); 1002 1003 /* host can listen NFC-DEP based on protocol routing */ 1004 listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask & NFA_DM_DISC_MASK_LA_NFC_DEP); 1005 listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask & NFA_DM_DISC_MASK_LAA_NFC_DEP); 1006 } 1007 1008 /* NFC-B */ 1009 /* multiple hosts can listen ISO-DEP based on AID routing */ 1010 listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask 1011 & NFA_DM_DISC_MASK_LB_ISO_DEP; 1012 1013 /* NFC-F */ 1014 /* NFCC can support NFC-DEP and T3T listening based on NFCID routing regardless of NFC-F tech routing */ 1015 listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask 1016 & ( NFA_DM_DISC_MASK_LF_T3T 1017 |NFA_DM_DISC_MASK_LF_NFC_DEP 1018 |NFA_DM_DISC_MASK_LFA_NFC_DEP ); 1019 1020 /* NFC-B Prime */ 1021 if (nfa_dm_cb.disc_cb.entry[xx].host_id == nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_BP]) 1022 { 1023 listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask 1024 & NFA_DM_DISC_MASK_L_B_PRIME; 1025 } 1026 1027 /* 1028 ** clear listen mode technolgies and protocols which are already used by others 1029 */ 1030 1031 /* Check if other modules are listening T1T or T2T */ 1032 if (dm_disc_mask & (NFA_DM_DISC_MASK_LA_T1T|NFA_DM_DISC_MASK_LA_T2T)) 1033 { 1034 listen_mask &= ~( NFA_DM_DISC_MASK_LA_T1T 1035 |NFA_DM_DISC_MASK_LA_T2T 1036 |NFA_DM_DISC_MASK_LA_ISO_DEP 1037 |NFA_DM_DISC_MASK_LA_NFC_DEP ); 1038 } 1039 1040 /* T1T/T2T has priority on NFC-A */ 1041 if ( (dm_disc_mask & (NFA_DM_DISC_MASK_LA_ISO_DEP|NFA_DM_DISC_MASK_LA_NFC_DEP)) 1042 &&(listen_mask & (NFA_DM_DISC_MASK_LA_T1T|NFA_DM_DISC_MASK_LA_T2T))) 1043 { 1044 dm_disc_mask &= ~( NFA_DM_DISC_MASK_LA_ISO_DEP 1045 |NFA_DM_DISC_MASK_LA_NFC_DEP ); 1046 } 1047 1048 /* Don't remove ISO-DEP because multiple hosts can listen ISO-DEP based on AID routing */ 1049 1050 /* Check if other modules are listening NFC-DEP */ 1051 if (dm_disc_mask & (NFA_DM_DISC_MASK_LA_NFC_DEP | NFA_DM_DISC_MASK_LAA_NFC_DEP)) 1052 { 1053 listen_mask &= ~( NFA_DM_DISC_MASK_LA_NFC_DEP 1054 |NFA_DM_DISC_MASK_LAA_NFC_DEP ); 1055 } 1056 1057 nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask = poll_mask | listen_mask; 1058 1059 NFA_TRACE_DEBUG2 ("nfa_dm_cb.disc_cb.entry[%d].selected_disc_mask = 0x%x", 1060 xx, nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask); 1061 1062 dm_disc_mask |= nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask; 1063 } 1064 } 1065 1066 /* Let P2P set GEN bytes for LLCP to NFCC */ 1067 if (dm_disc_mask & NFA_DM_DISC_MASK_NFC_DEP) 1068 { 1069 nfa_p2p_set_config (dm_disc_mask); 1070 } 1071 } 1072 1073 NFA_TRACE_DEBUG1 ("dm_disc_mask = 0x%x", dm_disc_mask); 1074 1075 /* Get Discovery Technology parameters */ 1076 num_params = nfa_dm_get_rf_discover_config (dm_disc_mask, disc_params, NFA_DM_MAX_DISC_PARAMS); 1077 1078 if (num_params) 1079 { 1080 /* 1081 ** NFCC will abort programming personality slots if not available. 1082 ** NFCC programs the personality slots in the following order of RF technologies: 1083 ** NFC-A, NFC-B, NFC-BP, NFC-I93 1084 */ 1085 1086 /* if this is not for exclusive control */ 1087 if (!nfa_dm_cb.disc_cb.excl_disc_entry.in_use) 1088 { 1089 /* update listening protocols in each NFC technology */ 1090 nfa_dm_set_rf_listen_mode_config (dm_disc_mask); 1091 } 1092 1093 /* Set polling duty cycle */ 1094 nfa_dm_set_total_duration (); 1095 nfa_dm_cb.disc_cb.dm_disc_mask = dm_disc_mask; 1096 1097 NFC_DiscoveryStart (num_params, disc_params, nfa_dm_disc_discovery_cback); 1098 /* set flag about waiting for response in IDLE state */ 1099 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP; 1100 1101 /* register callback to get interface error NTF */ 1102 NFC_SetStaticRfCback (nfa_dm_disc_data_cback); 1103 } 1104 else 1105 { 1106 /* RF discovery is started but there is no valid technology or protocol to discover */ 1107 nfa_dm_disc_notify_started (NFA_STATUS_OK); 1108 } 1109 1110 /* if Kovio presence check timer is running, timeout callback will reset the activation information */ 1111 if ( (nfa_dm_cb.disc_cb.activated_protocol != NFC_PROTOCOL_KOVIO) 1112 ||(!nfa_dm_cb.disc_cb.kovio_tle.in_use) ) 1113 { 1114 /* reset protocol and hanlde of activated sub-module */ 1115 nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_INVALID; 1116 nfa_dm_cb.disc_cb.activated_handle = NFA_HANDLE_INVALID; 1117 } 1118 } 1119 1120 /******************************************************************************* 1121 ** 1122 ** Function nfa_dm_notify_discovery 1123 ** 1124 ** Description Send RF discovery notification to upper layer 1125 ** 1126 ** Returns void 1127 ** 1128 *******************************************************************************/ 1129 static void nfa_dm_notify_discovery (tNFA_DM_RF_DISC_DATA *p_data) 1130 { 1131 tNFA_CONN_EVT_DATA conn_evt; 1132 1133 /* let application select a device */ 1134 conn_evt.disc_result.status = NFA_STATUS_OK; 1135 memcpy (&(conn_evt.disc_result.discovery_ntf), 1136 &(p_data->nfc_discover.result), 1137 sizeof (tNFC_RESULT_DEVT)); 1138 1139 nfa_dm_conn_cback_event_notify (NFA_DISC_RESULT_EVT, &conn_evt); 1140 } 1141 1142 1143 /******************************************************************************* 1144 ** 1145 ** Function nfa_dm_disc_handle_kovio_activation 1146 ** 1147 ** Description Handle Kovio activation; whether it's new or repeated activation 1148 ** 1149 ** Returns TRUE if repeated activation. No need to notify activated event to upper layer 1150 ** 1151 *******************************************************************************/ 1152 BOOLEAN nfa_dm_disc_handle_kovio_activation (tNFC_DISCOVER *p_data, tNFA_DISCOVER_CBACK *p_disc_cback) 1153 { 1154 tNFC_DISCOVER disc_data; 1155 1156 if (nfa_dm_cb.disc_cb.kovio_tle.in_use) 1157 { 1158 /* if this is new Kovio bar code tag */ 1159 if ( (nfa_dm_cb.activated_nfcid_len != p_data->activate.rf_tech_param.param.pk.uid_len) 1160 ||(memcmp (p_data->activate.rf_tech_param.param.pk.uid, 1161 nfa_dm_cb.activated_nfcid, nfa_dm_cb.activated_nfcid_len))) 1162 { 1163 NFA_TRACE_DEBUG0 ("new Kovio tag is detected"); 1164 1165 /* notify presence check failure for previous tag, if presence check is pending */ 1166 nfa_dm_disc_report_kovio_presence_check (NFA_STATUS_FAILED); 1167 1168 /* notify deactivation of previous activation before notifying new activation */ 1169 if (p_disc_cback) 1170 { 1171 disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE; 1172 (*(p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, &disc_data); 1173 } 1174 1175 /* restart timer */ 1176 nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK); 1177 } 1178 else 1179 { 1180 /* notify presence check ok, if presence check is pending */ 1181 nfa_dm_disc_report_kovio_presence_check (NFC_STATUS_OK); 1182 1183 /* restart timer and do not notify upper layer */ 1184 nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK); 1185 return (TRUE); 1186 } 1187 } 1188 else 1189 { 1190 /* this is the first activation, so start timer and notify upper layer */ 1191 nfa_dm_cb.disc_cb.kovio_tle.p_cback = (TIMER_CBACK *)nfa_dm_disc_kovio_timeout_cback; 1192 nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK); 1193 } 1194 1195 return (FALSE); 1196 } 1197 1198 /******************************************************************************* 1199 ** 1200 ** Function nfa_dm_disc_notify_activation 1201 ** 1202 ** Description Send RF activation notification to sub-module 1203 ** 1204 ** Returns NFA_STATUS_OK if success 1205 ** 1206 *******************************************************************************/ 1207 static tNFA_STATUS nfa_dm_disc_notify_activation (tNFC_DISCOVER *p_data) 1208 { 1209 UINT8 xx, host_id_in_LRT; 1210 UINT8 iso_dep_t3t__listen = NFA_DM_DISC_NUM_ENTRIES; 1211 1212 tNFC_RF_TECH_N_MODE tech_n_mode = p_data->activate.rf_tech_param.mode; 1213 tNFC_PROTOCOL protocol = p_data->activate.protocol; 1214 1215 tNFA_DM_DISC_TECH_PROTO_MASK activated_disc_mask; 1216 1217 NFA_TRACE_DEBUG2 ("nfa_dm_disc_notify_activation (): tech_n_mode:0x%X, proto:0x%X", 1218 tech_n_mode, protocol); 1219 1220 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) 1221 { 1222 nfa_dm_cb.disc_cb.activated_tech_mode = tech_n_mode; 1223 nfa_dm_cb.disc_cb.activated_rf_disc_id = p_data->activate.rf_disc_id; 1224 nfa_dm_cb.disc_cb.activated_rf_interface = p_data->activate.intf_param.type; 1225 nfa_dm_cb.disc_cb.activated_protocol = protocol; 1226 nfa_dm_cb.disc_cb.activated_handle = NFA_HANDLE_INVALID; 1227 1228 if (protocol == NFC_PROTOCOL_KOVIO) 1229 { 1230 /* check whether it's new or repeated activation */ 1231 if (nfa_dm_disc_handle_kovio_activation (p_data, nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) 1232 { 1233 /* do not notify activation of Kovio to upper layer */ 1234 return (NFA_STATUS_OK); 1235 } 1236 } 1237 1238 if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback) 1239 (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_ACTIVATED_EVT, p_data); 1240 1241 return (NFA_STATUS_OK); 1242 } 1243 1244 /* if this is NFCEE direct RF interface, notify activation to whoever listening UICC */ 1245 if (p_data->activate.intf_param.type == NFC_INTERFACE_EE_DIRECT_RF) 1246 { 1247 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) 1248 { 1249 if ( (nfa_dm_cb.disc_cb.entry[xx].in_use) 1250 &&(nfa_dm_cb.disc_cb.entry[xx].host_id != NFA_DM_DISC_HOST_ID_DH)) 1251 { 1252 nfa_dm_cb.disc_cb.activated_rf_disc_id = p_data->activate.rf_disc_id; 1253 nfa_dm_cb.disc_cb.activated_rf_interface = p_data->activate.intf_param.type; 1254 nfa_dm_cb.disc_cb.activated_protocol = NFC_PROTOCOL_UNKNOWN; 1255 nfa_dm_cb.disc_cb.activated_handle = xx; 1256 1257 NFA_TRACE_DEBUG2 ("activated_rf_interface:0x%x, activated_handle: 0x%x", 1258 nfa_dm_cb.disc_cb.activated_rf_interface, 1259 nfa_dm_cb.disc_cb.activated_handle); 1260 1261 if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback) 1262 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_ACTIVATED_EVT, p_data); 1263 1264 return (NFA_STATUS_OK); 1265 } 1266 } 1267 return (NFA_STATUS_FAILED); 1268 } 1269 1270 /* get bit mask of technolgies/mode and protocol */ 1271 activated_disc_mask = nfa_dm_disc_get_disc_mask (tech_n_mode, protocol); 1272 1273 /* get host ID of technology from listen mode routing table */ 1274 if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A) 1275 { 1276 host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A]; 1277 } 1278 else if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_B) 1279 { 1280 host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_B]; 1281 } 1282 else if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_F) 1283 { 1284 host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_F]; 1285 } 1286 else if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_B_PRIME) 1287 { 1288 host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_BP]; 1289 } 1290 else /* DH only */ 1291 { 1292 host_id_in_LRT = NFA_DM_DISC_HOST_ID_DH; 1293 } 1294 1295 if (protocol == NFC_PROTOCOL_NFC_DEP) 1296 { 1297 /* Force NFC-DEP to the host */ 1298 host_id_in_LRT = NFA_DM_DISC_HOST_ID_DH; 1299 } 1300 1301 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) 1302 { 1303 /* if any matching NFC technology and protocol */ 1304 if (nfa_dm_cb.disc_cb.entry[xx].in_use) 1305 { 1306 if (nfa_dm_cb.disc_cb.entry[xx].host_id == host_id_in_LRT) 1307 { 1308 if (nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & activated_disc_mask) 1309 break; 1310 } 1311 else 1312 { 1313 /* check ISO-DEP listening even if host in LRT is not matched */ 1314 if (protocol == NFC_PROTOCOL_ISO_DEP) 1315 { 1316 if ( (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A) 1317 &&(nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & NFA_DM_DISC_MASK_LA_ISO_DEP)) 1318 { 1319 iso_dep_t3t__listen = xx; 1320 } 1321 else if ( (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_B) 1322 &&(nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & NFA_DM_DISC_MASK_LB_ISO_DEP)) 1323 { 1324 iso_dep_t3t__listen = xx; 1325 } 1326 } 1327 /* check T3T listening even if host in LRT is not matched */ 1328 else if (protocol == NFC_PROTOCOL_T3T) 1329 { 1330 if ( (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_F) 1331 &&(nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & NFA_DM_DISC_MASK_LF_T3T)) 1332 { 1333 iso_dep_t3t__listen = xx; 1334 } 1335 } 1336 } 1337 } 1338 } 1339 1340 if (xx >= NFA_DM_DISC_NUM_ENTRIES) 1341 { 1342 /* if any ISO-DEP or T3T listening even if host in LRT is not matched */ 1343 xx = iso_dep_t3t__listen; 1344 } 1345 1346 if (xx < NFA_DM_DISC_NUM_ENTRIES) 1347 { 1348 nfa_dm_cb.disc_cb.activated_tech_mode = tech_n_mode; 1349 nfa_dm_cb.disc_cb.activated_rf_disc_id = p_data->activate.rf_disc_id; 1350 nfa_dm_cb.disc_cb.activated_rf_interface = p_data->activate.intf_param.type; 1351 nfa_dm_cb.disc_cb.activated_protocol = protocol; 1352 nfa_dm_cb.disc_cb.activated_handle = xx; 1353 1354 NFA_TRACE_DEBUG2 ("activated_protocol:0x%x, activated_handle: 0x%x", 1355 nfa_dm_cb.disc_cb.activated_protocol, 1356 nfa_dm_cb.disc_cb.activated_handle); 1357 1358 if (protocol == NFC_PROTOCOL_KOVIO) 1359 { 1360 /* check whether it's new or repeated activation */ 1361 if (nfa_dm_disc_handle_kovio_activation (p_data, nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) 1362 { 1363 /* do not notify activation of Kovio to upper layer */ 1364 return (NFA_STATUS_OK); 1365 } 1366 } 1367 1368 if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback) 1369 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_ACTIVATED_EVT, p_data); 1370 1371 return (NFA_STATUS_OK); 1372 } 1373 else 1374 { 1375 nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_INVALID; 1376 nfa_dm_cb.disc_cb.activated_handle = NFA_HANDLE_INVALID; 1377 return (NFA_STATUS_FAILED); 1378 } 1379 } 1380 1381 /******************************************************************************* 1382 ** 1383 ** Function nfa_dm_disc_notify_deactivation 1384 ** 1385 ** Description Send deactivation notification to sub-module 1386 ** 1387 ** Returns None 1388 ** 1389 *******************************************************************************/ 1390 static void nfa_dm_disc_notify_deactivation (tNFA_DM_RF_DISC_SM_EVENT sm_event, 1391 tNFC_DISCOVER *p_data) 1392 { 1393 tNFA_HANDLE xx; 1394 tNFA_CONN_EVT_DATA evt_data; 1395 tNFC_DISCOVER disc_data; 1396 1397 NFA_TRACE_DEBUG1 ("nfa_dm_disc_notify_deactivation (): activated_handle=%d", 1398 nfa_dm_cb.disc_cb.activated_handle); 1399 1400 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING) 1401 { 1402 NFA_TRACE_DEBUG0 ("nfa_dm_disc_notify_deactivation (): for sleep wakeup"); 1403 return; 1404 } 1405 1406 if (sm_event == NFA_DM_RF_DEACTIVATE_RSP) 1407 { 1408 /* 1409 ** Activation has been aborted by upper layer in NFA_DM_RFST_W4_ALL_DISCOVERIES or NFA_DM_RFST_W4_HOST_SELECT 1410 ** Deactivation by upper layer or RF link loss in NFA_DM_RFST_LISTEN_SLEEP 1411 ** No sub-module is activated at this state. 1412 */ 1413 1414 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_SLEEP) 1415 { 1416 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) 1417 { 1418 if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback) 1419 { 1420 disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE; 1421 (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, &disc_data); 1422 } 1423 } 1424 else 1425 { 1426 /* let each sub-module handle deactivation */ 1427 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) 1428 { 1429 if ( (nfa_dm_cb.disc_cb.entry[xx].in_use) 1430 &&(nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & NFA_DM_DISC_MASK_LISTEN) ) 1431 { 1432 disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE; 1433 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, &disc_data); 1434 } 1435 } 1436 } 1437 } 1438 else if ( (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING)) 1439 ||(nfa_dm_cb.disc_cb.deact_notify_pending) ) 1440 { 1441 xx = nfa_dm_cb.disc_cb.activated_handle; 1442 1443 /* notify event to activated module if failed while reactivation */ 1444 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) 1445 { 1446 if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback) 1447 { 1448 disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE; 1449 (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data); 1450 } 1451 } 1452 else if ( (xx < NFA_DM_DISC_NUM_ENTRIES) 1453 &&(nfa_dm_cb.disc_cb.entry[xx].in_use) 1454 &&(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback) ) 1455 { 1456 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data); 1457 } 1458 else 1459 { 1460 /* notify deactivation to application if there is no activated module */ 1461 evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE; 1462 nfa_dm_conn_cback_event_notify (NFA_DEACTIVATED_EVT, &evt_data); 1463 } 1464 } 1465 } 1466 else 1467 { 1468 if (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO) 1469 { 1470 if (nfa_dm_cb.disc_cb.kovio_tle.in_use) 1471 { 1472 /* restart timer and do not notify upper layer */ 1473 nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK); 1474 return; 1475 } 1476 /* Otherwise, upper layer initiated deactivation. */ 1477 } 1478 1479 /* notify event to activated module */ 1480 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) 1481 { 1482 if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback) 1483 { 1484 disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE; 1485 (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data); 1486 } 1487 } 1488 else 1489 { 1490 xx = nfa_dm_cb.disc_cb.activated_handle; 1491 1492 if ((xx < NFA_DM_DISC_NUM_ENTRIES) && (nfa_dm_cb.disc_cb.entry[xx].in_use)) 1493 { 1494 if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback) 1495 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data); 1496 } 1497 } 1498 } 1499 1500 /* clear activated information */ 1501 nfa_dm_cb.disc_cb.activated_tech_mode = 0; 1502 nfa_dm_cb.disc_cb.activated_rf_disc_id = 0; 1503 nfa_dm_cb.disc_cb.activated_rf_interface = 0; 1504 nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_INVALID; 1505 nfa_dm_cb.disc_cb.activated_handle = NFA_HANDLE_INVALID; 1506 nfa_dm_cb.disc_cb.deact_notify_pending = FALSE; 1507 } 1508 1509 /******************************************************************************* 1510 ** 1511 ** Function nfa_dm_disc_sleep_wakeup 1512 ** 1513 ** Description Put tag to sleep, then wake it up. Can be used Perform 1514 ** legacy presence check or to wake up tag that went to HALT 1515 ** state 1516 ** 1517 ** Returns TRUE if operation started 1518 ** 1519 *******************************************************************************/ 1520 tNFC_STATUS nfa_dm_disc_sleep_wakeup (void) 1521 { 1522 tNFC_STATUS status = NFC_STATUS_FAILED; 1523 1524 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE) 1525 { 1526 /* Deactivate to sleep mode */ 1527 status = nfa_dm_send_deactivate_cmd(NFC_DEACTIVATE_TYPE_SLEEP); 1528 if (status == NFC_STATUS_OK) 1529 { 1530 /* deactivate to sleep is sent on behalf of sleep wakeup. 1531 * set the sleep wakeup information in control block */ 1532 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_CHECKING; 1533 nfa_dm_cb.disc_cb.deact_pending = FALSE; 1534 } 1535 } 1536 1537 return (status); 1538 } 1539 1540 /******************************************************************************* 1541 ** 1542 ** Function nfa_dm_is_raw_frame_session 1543 ** 1544 ** Description If NFA_SendRawFrame is called since RF activation, 1545 ** this function returns TRUE. 1546 ** 1547 ** Returns TRUE if NFA_SendRawFrame is called 1548 ** 1549 *******************************************************************************/ 1550 BOOLEAN nfa_dm_is_raw_frame_session (void) 1551 { 1552 return ((nfa_dm_cb.flags & NFA_DM_FLAGS_RAW_FRAME) ? TRUE : FALSE); 1553 } 1554 1555 /******************************************************************************* 1556 ** 1557 ** Function nfa_dm_is_p2p_paused 1558 ** 1559 ** Description If NFA_PauseP2p is called sand still effective, 1560 ** this function returns TRUE. 1561 ** 1562 ** Returns TRUE if NFA_SendRawFrame is called 1563 ** 1564 *******************************************************************************/ 1565 BOOLEAN nfa_dm_is_p2p_paused (void) 1566 { 1567 return ((nfa_dm_cb.flags & NFA_DM_FLAGS_P2P_PAUSED) ? TRUE : FALSE); 1568 } 1569 1570 /******************************************************************************* 1571 ** 1572 ** Function nfa_dm_disc_end_sleep_wakeup 1573 ** 1574 ** Description Sleep Wakeup is complete 1575 ** 1576 ** Returns None 1577 ** 1578 *******************************************************************************/ 1579 static void nfa_dm_disc_end_sleep_wakeup (tNFC_STATUS status) 1580 { 1581 if ( (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO) 1582 &&(nfa_dm_cb.disc_cb.kovio_tle.in_use) ) 1583 { 1584 /* ignore it while doing Kovio presence check */ 1585 return; 1586 } 1587 1588 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING) 1589 { 1590 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_CHECKING; 1591 1592 /* notify RW module that sleep wakeup is finished */ 1593 nfa_rw_handle_sleep_wakeup_rsp (status); 1594 1595 if (nfa_dm_cb.disc_cb.deact_pending) 1596 { 1597 nfa_dm_cb.disc_cb.deact_pending = FALSE; 1598 /* Perform pending deactivate command and on response notfiy deactivation */ 1599 nfa_dm_cb.disc_cb.deact_notify_pending = TRUE; 1600 nfa_dm_disc_sm_execute (NFA_DM_RF_DEACTIVATE_CMD, 1601 (tNFA_DM_RF_DISC_DATA *) &nfa_dm_cb.disc_cb.pending_deact_type); 1602 } 1603 } 1604 } 1605 1606 /******************************************************************************* 1607 ** 1608 ** Function nfa_dm_disc_kovio_timeout_cback 1609 ** 1610 ** Description Timeout for Kovio bar code tag presence check 1611 ** 1612 ** Returns void 1613 ** 1614 *******************************************************************************/ 1615 static void nfa_dm_disc_kovio_timeout_cback (TIMER_LIST_ENT *p_tle) 1616 { 1617 tNFC_DEACTIVATE_DEVT deact; 1618 1619 NFA_TRACE_DEBUG0 ("nfa_dm_disc_kovio_timeout_cback()"); 1620 1621 /* notify presence check failure, if presence check is pending */ 1622 nfa_dm_disc_report_kovio_presence_check (NFC_STATUS_FAILED); 1623 1624 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE) 1625 { 1626 /* restart timer in case that upper layer's presence check interval is too long */ 1627 nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK); 1628 } 1629 else 1630 { 1631 /* notify upper layer deactivated event */ 1632 deact.status = NFC_STATUS_OK; 1633 deact.type = NFC_DEACTIVATE_TYPE_DISCOVERY; 1634 deact.is_ntf = TRUE; 1635 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, (tNFC_DISCOVER*)&deact); 1636 } 1637 } 1638 1639 /******************************************************************************* 1640 ** 1641 ** Function nfa_dm_disc_start_kovio_presence_check 1642 ** 1643 ** Description Deactivate to discovery mode and wait for activation 1644 ** 1645 ** Returns TRUE if operation started 1646 ** 1647 *******************************************************************************/ 1648 tNFC_STATUS nfa_dm_disc_start_kovio_presence_check (void) 1649 { 1650 tNFC_STATUS status = NFC_STATUS_FAILED; 1651 1652 NFA_TRACE_DEBUG0 ("nfa_dm_disc_start_kovio_presence_check ()"); 1653 1654 if ( (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO) 1655 &&(nfa_dm_cb.disc_cb.kovio_tle.in_use) ) 1656 { 1657 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE) 1658 { 1659 /* restart timer */ 1660 nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK); 1661 1662 /* Deactivate to discovery mode */ 1663 status = nfa_dm_send_deactivate_cmd (NFC_DEACTIVATE_TYPE_DISCOVERY); 1664 1665 if (status == NFC_STATUS_OK) 1666 { 1667 /* deactivate to sleep is sent on behalf of sleep wakeup. 1668 * set the sleep wakeup information in control block */ 1669 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_CHECKING; 1670 nfa_dm_cb.disc_cb.deact_pending = FALSE; 1671 } 1672 } 1673 else 1674 { 1675 /* wait for next activation */ 1676 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_CHECKING; 1677 nfa_dm_cb.disc_cb.deact_pending = FALSE; 1678 status = NFC_STATUS_OK; 1679 } 1680 } 1681 1682 return (status); 1683 } 1684 1685 /******************************************************************************* 1686 ** 1687 ** Function nfa_dm_disc_report_kovio_presence_check 1688 ** 1689 ** Description Report Kovio presence check status 1690 ** 1691 ** Returns None 1692 ** 1693 *******************************************************************************/ 1694 static void nfa_dm_disc_report_kovio_presence_check (tNFC_STATUS status) 1695 { 1696 NFA_TRACE_DEBUG0 ("nfa_dm_disc_report_kovio_presence_check ()"); 1697 1698 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING) 1699 { 1700 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_CHECKING; 1701 1702 /* notify RW module that sleep wakeup is finished */ 1703 nfa_rw_handle_presence_check_rsp (status); 1704 1705 if (nfa_dm_cb.disc_cb.deact_pending) 1706 { 1707 nfa_dm_cb.disc_cb.deact_pending = FALSE; 1708 nfa_dm_disc_sm_execute (NFA_DM_RF_DEACTIVATE_CMD, 1709 (tNFA_DM_RF_DISC_DATA *) &nfa_dm_cb.disc_cb.pending_deact_type); 1710 } 1711 } 1712 } 1713 1714 /******************************************************************************* 1715 ** 1716 ** Function nfa_dm_disc_data_cback 1717 ** 1718 ** Description Monitoring interface error through data callback 1719 ** 1720 ** Returns void 1721 ** 1722 *******************************************************************************/ 1723 static void nfa_dm_disc_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data) 1724 { 1725 NFA_TRACE_DEBUG0 ("nfa_dm_disc_data_cback ()"); 1726 1727 /* if selection failed */ 1728 if (event == NFC_ERROR_CEVT) 1729 { 1730 nfa_dm_disc_sm_execute (NFA_DM_CORE_INTF_ERROR_NTF, NULL); 1731 } 1732 else if (event == NFC_DATA_CEVT) 1733 { 1734 GKI_freebuf (p_data->data.p_data); 1735 } 1736 } 1737 1738 /******************************************************************************* 1739 ** 1740 ** Function nfa_dm_disc_new_state 1741 ** 1742 ** Description Processing discovery events in NFA_DM_RFST_IDLE state 1743 ** 1744 ** Returns void 1745 ** 1746 *******************************************************************************/ 1747 void nfa_dm_disc_new_state (tNFA_DM_RF_DISC_STATE new_state) 1748 { 1749 tNFA_CONN_EVT_DATA evt_data; 1750 tNFA_DM_RF_DISC_STATE old_state = nfa_dm_cb.disc_cb.disc_state; 1751 1752 #if (BT_TRACE_VERBOSE == TRUE) 1753 NFA_TRACE_DEBUG5 ("nfa_dm_disc_new_state (): old_state: %s (%d), new_state: %s (%d) disc_flags: 0x%x", 1754 nfa_dm_disc_state_2_str (nfa_dm_cb.disc_cb.disc_state), nfa_dm_cb.disc_cb.disc_state, 1755 nfa_dm_disc_state_2_str (new_state), new_state, nfa_dm_cb.disc_cb.disc_flags); 1756 #else 1757 NFA_TRACE_DEBUG3 ("nfa_dm_disc_new_state(): old_state: %d, new_state: %d disc_flags: 0x%x", 1758 nfa_dm_cb.disc_cb.disc_state, new_state, nfa_dm_cb.disc_cb.disc_flags); 1759 #endif 1760 1761 nfa_dm_cb.disc_cb.disc_state = new_state; 1762 1763 if ( (new_state == NFA_DM_RFST_IDLE) 1764 &&(!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) ) /* not error recovering */ 1765 { 1766 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING) 1767 { 1768 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_STOPPING; 1769 1770 /* if exclusive RF control is stopping */ 1771 if (nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE) 1772 { 1773 if (old_state > NFA_DM_RFST_DISCOVERY) 1774 { 1775 /* notify deactivation to application */ 1776 evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE; 1777 nfa_dm_conn_cback_event_notify (NFA_DEACTIVATED_EVT, &evt_data); 1778 } 1779 1780 nfa_dm_rel_excl_rf_control_and_notify (); 1781 } 1782 else 1783 { 1784 evt_data.status = NFA_STATUS_OK; 1785 nfa_dm_conn_cback_event_notify (NFA_RF_DISCOVERY_STOPPED_EVT, &evt_data); 1786 } 1787 } 1788 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_DISABLING) 1789 { 1790 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_DISABLING; 1791 nfa_sys_check_disabled (); 1792 } 1793 } 1794 } 1795 1796 /******************************************************************************* 1797 ** 1798 ** Function nfa_dm_disc_sm_idle 1799 ** 1800 ** Description Processing discovery events in NFA_DM_RFST_IDLE state 1801 ** 1802 ** Returns void 1803 ** 1804 *******************************************************************************/ 1805 static void nfa_dm_disc_sm_idle (tNFA_DM_RF_DISC_SM_EVENT event, 1806 tNFA_DM_RF_DISC_DATA *p_data) 1807 { 1808 UINT8 xx; 1809 1810 switch (event) 1811 { 1812 case NFA_DM_RF_DISCOVER_CMD: 1813 nfa_dm_start_rf_discover (); 1814 break; 1815 1816 case NFA_DM_RF_DISCOVER_RSP: 1817 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP; 1818 1819 if (p_data->nfc_discover.status == NFC_STATUS_OK) 1820 { 1821 nfa_dm_disc_new_state (NFA_DM_RFST_DISCOVERY); 1822 1823 /* if RF discovery was stopped while waiting for response */ 1824 if (nfa_dm_cb.disc_cb.disc_flags & (NFA_DM_DISC_FLAGS_STOPPING|NFA_DM_DISC_FLAGS_DISABLING)) 1825 { 1826 /* stop discovery */ 1827 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP; 1828 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 1829 break; 1830 } 1831 1832 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) 1833 { 1834 if (nfa_dm_cb.disc_cb.excl_disc_entry.disc_flags & NFA_DM_DISC_FLAGS_NOTIFY) 1835 { 1836 nfa_dm_cb.disc_cb.excl_disc_entry.disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY; 1837 1838 if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback) 1839 (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_START_EVT, (tNFC_DISCOVER*) p_data); 1840 } 1841 } 1842 else 1843 { 1844 /* notify event to each module which is waiting for start */ 1845 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) 1846 { 1847 /* if registered module is waiting for starting discovery */ 1848 if ( (nfa_dm_cb.disc_cb.entry[xx].in_use) 1849 &&(nfa_dm_cb.disc_cb.dm_disc_mask & nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask) 1850 &&(nfa_dm_cb.disc_cb.entry[xx].disc_flags & NFA_DM_DISC_FLAGS_NOTIFY) ) 1851 { 1852 nfa_dm_cb.disc_cb.entry[xx].disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY; 1853 1854 if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback) 1855 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_START_EVT, (tNFC_DISCOVER*) p_data); 1856 } 1857 } 1858 1859 } 1860 nfa_dm_disc_notify_started (p_data->nfc_discover.status); 1861 } 1862 else 1863 { 1864 /* in rare case that the discovery states of NFCC and DH mismatch and NFCC rejects Discover Cmd 1865 * deactivate idle and then start disvocery when got deactivate rsp */ 1866 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP; 1867 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 1868 } 1869 break; 1870 1871 case NFA_DM_RF_DEACTIVATE_RSP: 1872 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP; 1873 1874 /* if NFCC goes to idle successfully */ 1875 if (p_data->nfc_discover.status == NFC_STATUS_OK) 1876 { 1877 /* if DH forced to go idle while waiting for deactivation NTF */ 1878 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) 1879 { 1880 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover)); 1881 1882 /* check any pending flags like NFA_DM_DISC_FLAGS_STOPPING or NFA_DM_DISC_FLAGS_DISABLING */ 1883 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 1884 /* check if need to restart discovery after resync discovery state with NFCC */ 1885 nfa_dm_start_rf_discover (); 1886 } 1887 /* Otherwise, deactivating when getting unexpected activation */ 1888 } 1889 /* Otherwise, wait for deactivation NTF */ 1890 break; 1891 1892 case NFA_DM_RF_DEACTIVATE_NTF: 1893 /* if NFCC sent this after NFCC had rejected deactivate CMD to idle while deactivating */ 1894 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) 1895 { 1896 if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY) 1897 { 1898 /* stop discovery */ 1899 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP; 1900 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 1901 } 1902 else 1903 { 1904 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover)); 1905 /* check any pending flags like NFA_DM_DISC_FLAGS_STOPPING or NFA_DM_DISC_FLAGS_DISABLING */ 1906 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 1907 /* check if need to restart discovery after resync discovery state with NFCC */ 1908 nfa_dm_start_rf_discover (); 1909 } 1910 } 1911 /* Otherwise, deactivated when received unexpected activation in idle state */ 1912 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF; 1913 break; 1914 1915 case NFA_DM_RF_INTF_ACTIVATED_NTF: 1916 /* unexpected activation, deactivate to idle */ 1917 nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF); 1918 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 1919 break; 1920 1921 case NFA_DM_LP_LISTEN_CMD: 1922 nfa_dm_disc_new_state (NFA_DM_RFST_LP_LISTEN); 1923 break; 1924 1925 default: 1926 NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_idle (): Unexpected discovery event"); 1927 break; 1928 } 1929 } 1930 1931 /******************************************************************************* 1932 ** 1933 ** Function nfa_dm_disc_sm_discovery 1934 ** 1935 ** Description Processing discovery events in NFA_DM_RFST_DISCOVERY state 1936 ** 1937 ** Returns void 1938 ** 1939 *******************************************************************************/ 1940 static void nfa_dm_disc_sm_discovery (tNFA_DM_RF_DISC_SM_EVENT event, 1941 tNFA_DM_RF_DISC_DATA *p_data) 1942 { 1943 switch (event) 1944 { 1945 case NFA_DM_RF_DEACTIVATE_CMD: 1946 /* if deactivate CMD was not sent to NFCC */ 1947 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) 1948 { 1949 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP; 1950 NFC_Deactivate (p_data->deactivate_type); 1951 } 1952 break; 1953 case NFA_DM_RF_DEACTIVATE_RSP: 1954 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP; 1955 1956 /* if it's not race condition between deactivate CMD and activate NTF */ 1957 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) 1958 { 1959 /* do not notify deactivated to idle in RF discovery state 1960 ** because it is internal or stopping RF discovery 1961 */ 1962 1963 /* there was no activation while waiting for deactivation RSP */ 1964 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 1965 nfa_dm_start_rf_discover (); 1966 } 1967 break; 1968 case NFA_DM_RF_DISCOVER_NTF: 1969 nfa_dm_disc_new_state (NFA_DM_RFST_W4_ALL_DISCOVERIES); 1970 nfa_dm_notify_discovery (p_data); 1971 break; 1972 case NFA_DM_RF_INTF_ACTIVATED_NTF: 1973 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) 1974 { 1975 NFA_TRACE_DEBUG0 ("RF Activated while waiting for deactivation RSP"); 1976 /* it's race condition. DH has to wait for deactivation NTF */ 1977 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_NTF; 1978 } 1979 else 1980 { 1981 if (p_data->nfc_discover.activate.intf_param.type == NFC_INTERFACE_EE_DIRECT_RF) 1982 { 1983 nfa_dm_disc_new_state (NFA_DM_RFST_LISTEN_ACTIVE); 1984 } 1985 else if (p_data->nfc_discover.activate.rf_tech_param.mode & 0x80) 1986 { 1987 /* Listen mode */ 1988 nfa_dm_disc_new_state (NFA_DM_RFST_LISTEN_ACTIVE); 1989 } 1990 else 1991 { 1992 /* Poll mode */ 1993 nfa_dm_disc_new_state (NFA_DM_RFST_POLL_ACTIVE); 1994 } 1995 1996 if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED) 1997 { 1998 NFA_TRACE_DEBUG0 ("Not matched, restart discovery after receiving deactivate ntf"); 1999 2000 /* after receiving deactivate event, restart discovery */ 2001 nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF); 2002 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 2003 } 2004 } 2005 break; 2006 2007 case NFA_DM_RF_DEACTIVATE_NTF: 2008 /* if there was race condition between deactivate CMD and activate NTF */ 2009 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF) 2010 { 2011 /* race condition is resolved */ 2012 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF; 2013 2014 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) 2015 { 2016 /* do not notify deactivated to idle in RF discovery state 2017 ** because it is internal or stopping RF discovery 2018 */ 2019 2020 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2021 nfa_dm_start_rf_discover (); 2022 } 2023 } 2024 break; 2025 case NFA_DM_LP_LISTEN_CMD: 2026 break; 2027 case NFA_DM_CORE_INTF_ERROR_NTF: 2028 break; 2029 default: 2030 NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_discovery (): Unexpected discovery event"); 2031 break; 2032 } 2033 } 2034 2035 /******************************************************************************* 2036 ** 2037 ** Function nfa_dm_disc_sm_w4_all_discoveries 2038 ** 2039 ** Description Processing discovery events in NFA_DM_RFST_W4_ALL_DISCOVERIES state 2040 ** 2041 ** Returns void 2042 ** 2043 *******************************************************************************/ 2044 static void nfa_dm_disc_sm_w4_all_discoveries (tNFA_DM_RF_DISC_SM_EVENT event, 2045 tNFA_DM_RF_DISC_DATA *p_data) 2046 { 2047 switch (event) 2048 { 2049 case NFA_DM_RF_DEACTIVATE_CMD: 2050 /* if deactivate CMD was not sent to NFCC */ 2051 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) 2052 { 2053 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP; 2054 /* only IDLE mode is allowed */ 2055 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 2056 } 2057 break; 2058 case NFA_DM_RF_DEACTIVATE_RSP: 2059 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP; 2060 /* notify exiting from w4 all discoverie state */ 2061 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_RSP, &(p_data->nfc_discover)); 2062 2063 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2064 nfa_dm_start_rf_discover (); 2065 break; 2066 case NFA_DM_RF_DISCOVER_NTF: 2067 /* if deactivate CMD is already sent then ignore discover NTF */ 2068 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) 2069 { 2070 /* Notification Type = NCI_DISCOVER_NTF_LAST or NCI_DISCOVER_NTF_LAST_ABORT */ 2071 if (p_data->nfc_discover.result.more != NCI_DISCOVER_NTF_MORE) 2072 { 2073 nfa_dm_disc_new_state (NFA_DM_RFST_W4_HOST_SELECT); 2074 } 2075 nfa_dm_notify_discovery (p_data); 2076 } 2077 break; 2078 case NFA_DM_RF_INTF_ACTIVATED_NTF: 2079 /* 2080 ** This is only for ISO15693. 2081 ** FW sends activation NTF when all responses are received from tags without host selecting. 2082 */ 2083 nfa_dm_disc_new_state (NFA_DM_RFST_POLL_ACTIVE); 2084 2085 if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED) 2086 { 2087 NFA_TRACE_DEBUG0 ("Not matched, restart discovery after receiving deactivate ntf"); 2088 2089 /* after receiving deactivate event, restart discovery */ 2090 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 2091 } 2092 break; 2093 default: 2094 NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_w4_all_discoveries (): Unexpected discovery event"); 2095 break; 2096 } 2097 } 2098 2099 /******************************************************************************* 2100 ** 2101 ** Function nfa_dm_disc_sm_w4_host_select 2102 ** 2103 ** Description Processing discovery events in NFA_DM_RFST_W4_HOST_SELECT state 2104 ** 2105 ** Returns void 2106 ** 2107 *******************************************************************************/ 2108 static void nfa_dm_disc_sm_w4_host_select (tNFA_DM_RF_DISC_SM_EVENT event, 2109 tNFA_DM_RF_DISC_DATA *p_data) 2110 { 2111 tNFA_CONN_EVT_DATA conn_evt; 2112 tNFA_DM_DISC_FLAGS old_sleep_wakeup_flag = (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING); 2113 BOOLEAN sleep_wakeup_event = FALSE; 2114 BOOLEAN sleep_wakeup_event_processed = FALSE; 2115 tNFA_STATUS status; 2116 2117 switch (event) 2118 { 2119 case NFA_DM_RF_DISCOVER_SELECT_CMD: 2120 /* if not waiting to deactivate */ 2121 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) 2122 { 2123 NFC_DiscoverySelect (p_data->select.rf_disc_id, 2124 p_data->select.protocol, 2125 p_data->select.rf_interface); 2126 } 2127 else 2128 { 2129 nfa_dm_disc_conn_event_notify (NFA_SELECT_RESULT_EVT, NFA_STATUS_FAILED); 2130 } 2131 break; 2132 2133 case NFA_DM_RF_DISCOVER_SELECT_RSP: 2134 sleep_wakeup_event = TRUE; 2135 /* notify application status of selection */ 2136 if (p_data->nfc_discover.status == NFC_STATUS_OK) 2137 { 2138 sleep_wakeup_event_processed = TRUE; 2139 conn_evt.status = NFA_STATUS_OK; 2140 /* register callback to get interface error NTF */ 2141 NFC_SetStaticRfCback (nfa_dm_disc_data_cback); 2142 } 2143 else 2144 conn_evt.status = NFA_STATUS_FAILED; 2145 2146 if (!old_sleep_wakeup_flag) 2147 { 2148 nfa_dm_disc_conn_event_notify (NFA_SELECT_RESULT_EVT, p_data->nfc_discover.status); 2149 } 2150 break; 2151 case NFA_DM_RF_INTF_ACTIVATED_NTF: 2152 nfa_dm_disc_new_state (NFA_DM_RFST_POLL_ACTIVE); 2153 /* always call nfa_dm_disc_notify_activation to update protocol/interface information in NFA control blocks */ 2154 status = nfa_dm_disc_notify_activation (&(p_data->nfc_discover)); 2155 if (old_sleep_wakeup_flag) 2156 { 2157 /* Handle sleep wakeup success: notify RW module of sleep wakeup of tag; if deactivation is pending then deactivate */ 2158 nfa_dm_disc_end_sleep_wakeup (NFC_STATUS_OK); 2159 } 2160 else if (status == NFA_STATUS_FAILED) 2161 { 2162 NFA_TRACE_DEBUG0 ("Not matched, restart discovery after receiving deactivate ntf"); 2163 2164 /* after receiving deactivate event, restart discovery */ 2165 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 2166 } 2167 break; 2168 case NFA_DM_RF_DEACTIVATE_CMD: 2169 if (old_sleep_wakeup_flag) 2170 { 2171 nfa_dm_cb.disc_cb.deact_pending = TRUE; 2172 nfa_dm_cb.disc_cb.pending_deact_type = p_data->deactivate_type; 2173 } 2174 /* if deactivate CMD was not sent to NFCC */ 2175 else if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) 2176 { 2177 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP; 2178 /* only IDLE mode is allowed */ 2179 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 2180 } 2181 break; 2182 case NFA_DM_RF_DEACTIVATE_RSP: 2183 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP; 2184 /* notify exiting from host select state */ 2185 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_RSP, &(p_data->nfc_discover)); 2186 2187 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2188 nfa_dm_start_rf_discover (); 2189 break; 2190 2191 case NFA_DM_CORE_INTF_ERROR_NTF: 2192 sleep_wakeup_event = TRUE; 2193 if (!old_sleep_wakeup_flag) 2194 { 2195 /* target activation failed, upper layer may deactivate or select again */ 2196 conn_evt.status = NFA_STATUS_FAILED; 2197 nfa_dm_conn_cback_event_notify (NFA_SELECT_RESULT_EVT, &conn_evt); 2198 } 2199 break; 2200 default: 2201 NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_w4_host_select (): Unexpected discovery event"); 2202 break; 2203 } 2204 2205 if (old_sleep_wakeup_flag && sleep_wakeup_event && !sleep_wakeup_event_processed) 2206 { 2207 /* performing sleep wakeup and exception conditions happened 2208 * clear sleep wakeup information and report failure */ 2209 nfa_dm_disc_end_sleep_wakeup (NFC_STATUS_FAILED); 2210 } 2211 } 2212 2213 /******************************************************************************* 2214 ** 2215 ** Function nfa_dm_disc_sm_poll_active 2216 ** 2217 ** Description Processing discovery events in NFA_DM_RFST_POLL_ACTIVE state 2218 ** 2219 ** Returns void 2220 ** 2221 *******************************************************************************/ 2222 static void nfa_dm_disc_sm_poll_active (tNFA_DM_RF_DISC_SM_EVENT event, 2223 tNFA_DM_RF_DISC_DATA *p_data) 2224 { 2225 tNFC_STATUS status; 2226 tNFA_DM_DISC_FLAGS old_sleep_wakeup_flag = (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING); 2227 BOOLEAN sleep_wakeup_event = FALSE; 2228 BOOLEAN sleep_wakeup_event_processed = FALSE; 2229 tNFC_DEACTIVATE_DEVT deact; 2230 2231 switch (event) 2232 { 2233 case NFA_DM_RF_DEACTIVATE_CMD: 2234 if (old_sleep_wakeup_flag) 2235 { 2236 /* sleep wakeup is already enabled when deactivate cmd is requested, 2237 * keep the information in control block to issue it later */ 2238 nfa_dm_cb.disc_cb.deact_pending = TRUE; 2239 nfa_dm_cb.disc_cb.pending_deact_type = p_data->deactivate_type; 2240 } 2241 else 2242 { 2243 status = nfa_dm_send_deactivate_cmd(p_data->deactivate_type); 2244 } 2245 2246 break; 2247 case NFA_DM_RF_DEACTIVATE_RSP: 2248 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP; 2249 /* register callback to get interface error NTF */ 2250 NFC_SetStaticRfCback (nfa_dm_disc_data_cback); 2251 2252 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) 2253 { 2254 /* it's race condition. received deactivate NTF before receiving RSP */ 2255 2256 deact.status = NFC_STATUS_OK; 2257 deact.type = NFC_DEACTIVATE_TYPE_IDLE; 2258 deact.is_ntf = TRUE; 2259 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, (tNFC_DISCOVER*)&deact); 2260 2261 /* NFCC is in IDLE state */ 2262 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2263 nfa_dm_start_rf_discover (); 2264 } 2265 break; 2266 case NFA_DM_RF_DEACTIVATE_NTF: 2267 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF; 2268 2269 nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.tle); 2270 2271 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) 2272 { 2273 /* it's race condition. received deactivate NTF before receiving RSP */ 2274 /* notify deactivation after receiving deactivate RSP */ 2275 NFA_TRACE_DEBUG0 ("Rx deactivate NTF while waiting for deactivate RSP"); 2276 break; 2277 } 2278 2279 sleep_wakeup_event = TRUE; 2280 2281 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover)); 2282 2283 if ( (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP) 2284 ||(p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP_AF) ) 2285 { 2286 nfa_dm_disc_new_state (NFA_DM_RFST_W4_HOST_SELECT); 2287 if (old_sleep_wakeup_flag) 2288 { 2289 sleep_wakeup_event_processed = TRUE; 2290 /* process pending deactivate request */ 2291 if (nfa_dm_cb.disc_cb.deact_pending) 2292 { 2293 /* notify RW module that sleep wakeup is finished */ 2294 /* if deactivation is pending then deactivate */ 2295 nfa_dm_disc_end_sleep_wakeup (NFC_STATUS_OK); 2296 2297 /* Notify NFA RW sub-systems because NFA_DM_RF_DEACTIVATE_RSP will not call this function */ 2298 nfa_rw_proc_disc_evt (NFA_DM_RF_DISC_DEACTIVATED_EVT, NULL, TRUE); 2299 } 2300 else 2301 { 2302 /* Successfully went to sleep mode for sleep wakeup */ 2303 /* Now wake up the tag to complete the operation */ 2304 NFC_DiscoverySelect (nfa_dm_cb.disc_cb.activated_rf_disc_id, 2305 nfa_dm_cb.disc_cb.activated_protocol, 2306 nfa_dm_cb.disc_cb.activated_rf_interface); 2307 } 2308 2309 } 2310 } 2311 else if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_IDLE) 2312 { 2313 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2314 nfa_dm_start_rf_discover (); 2315 } 2316 else if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY) 2317 { 2318 nfa_dm_disc_new_state (NFA_DM_RFST_DISCOVERY); 2319 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING) 2320 { 2321 /* stop discovery */ 2322 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 2323 } 2324 } 2325 break; 2326 2327 case NFA_DM_CORE_INTF_ERROR_NTF: 2328 sleep_wakeup_event = TRUE; 2329 if ( (!old_sleep_wakeup_flag) 2330 ||(!nfa_dm_cb.disc_cb.deact_pending) ) 2331 { 2332 nfa_dm_send_deactivate_cmd (NFA_DEACTIVATE_TYPE_DISCOVERY); 2333 } 2334 break; 2335 2336 default: 2337 NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_poll_active (): Unexpected discovery event"); 2338 break; 2339 } 2340 2341 if (old_sleep_wakeup_flag && sleep_wakeup_event && !sleep_wakeup_event_processed) 2342 { 2343 /* performing sleep wakeup and exception conditions happened 2344 * clear sleep wakeup information and report failure */ 2345 nfa_dm_disc_end_sleep_wakeup (NFC_STATUS_FAILED); 2346 } 2347 } 2348 2349 /******************************************************************************* 2350 ** 2351 ** Function nfa_dm_disc_sm_listen_active 2352 ** 2353 ** Description Processing discovery events in NFA_DM_RFST_LISTEN_ACTIVE state 2354 ** 2355 ** Returns void 2356 ** 2357 *******************************************************************************/ 2358 static void nfa_dm_disc_sm_listen_active (tNFA_DM_RF_DISC_SM_EVENT event, 2359 tNFA_DM_RF_DISC_DATA *p_data) 2360 { 2361 tNFC_DEACTIVATE_DEVT deact; 2362 2363 switch (event) 2364 { 2365 case NFA_DM_RF_DEACTIVATE_CMD: 2366 nfa_dm_send_deactivate_cmd(p_data->deactivate_type); 2367 break; 2368 case NFA_DM_RF_DEACTIVATE_RSP: 2369 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP; 2370 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) 2371 { 2372 /* it's race condition. received deactivate NTF before receiving RSP */ 2373 2374 deact.status = NFC_STATUS_OK; 2375 deact.type = NFC_DEACTIVATE_TYPE_IDLE; 2376 deact.is_ntf = TRUE; 2377 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, (tNFC_DISCOVER*)&deact); 2378 2379 /* NFCC is in IDLE state */ 2380 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2381 nfa_dm_start_rf_discover (); 2382 } 2383 break; 2384 case NFA_DM_RF_DEACTIVATE_NTF: 2385 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF; 2386 2387 nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.tle); 2388 2389 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) 2390 { 2391 /* it's race condition. received deactivate NTF before receiving RSP */ 2392 /* notify deactivation after receiving deactivate RSP */ 2393 NFA_TRACE_DEBUG0 ("Rx deactivate NTF while waiting for deactivate RSP"); 2394 } 2395 else 2396 { 2397 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover)); 2398 2399 if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_IDLE) 2400 { 2401 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2402 nfa_dm_start_rf_discover (); 2403 } 2404 else if ( (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP) 2405 ||(p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP_AF) ) 2406 { 2407 nfa_dm_disc_new_state (NFA_DM_RFST_LISTEN_SLEEP); 2408 } 2409 else if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY) 2410 { 2411 /* Discovery */ 2412 nfa_dm_disc_new_state (NFA_DM_RFST_DISCOVERY); 2413 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING) 2414 { 2415 /* stop discovery */ 2416 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 2417 } 2418 } 2419 } 2420 break; 2421 2422 case NFA_DM_CORE_INTF_ERROR_NTF: 2423 break; 2424 default: 2425 NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_listen_active (): Unexpected discovery event"); 2426 break; 2427 } 2428 } 2429 2430 /******************************************************************************* 2431 ** 2432 ** Function nfa_dm_disc_sm_listen_sleep 2433 ** 2434 ** Description Processing discovery events in NFA_DM_RFST_LISTEN_SLEEP state 2435 ** 2436 ** Returns void 2437 ** 2438 *******************************************************************************/ 2439 static void nfa_dm_disc_sm_listen_sleep (tNFA_DM_RF_DISC_SM_EVENT event, 2440 tNFA_DM_RF_DISC_DATA *p_data) 2441 { 2442 switch (event) 2443 { 2444 case NFA_DM_RF_DEACTIVATE_CMD: 2445 nfa_dm_send_deactivate_cmd (p_data->deactivate_type); 2446 2447 /* if deactivate type is not discovery then NFCC will not sent deactivation NTF */ 2448 if (p_data->deactivate_type != NFA_DEACTIVATE_TYPE_DISCOVERY) 2449 { 2450 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF; 2451 nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.tle); 2452 } 2453 break; 2454 case NFA_DM_RF_DEACTIVATE_RSP: 2455 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP; 2456 /* if deactivate type in CMD was IDLE */ 2457 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) 2458 { 2459 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_RSP, &(p_data->nfc_discover)); 2460 2461 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2462 nfa_dm_start_rf_discover (); 2463 } 2464 break; 2465 case NFA_DM_RF_DEACTIVATE_NTF: 2466 /* clear both W4_RSP and W4_NTF because of race condition between deactivat CMD and link loss */ 2467 nfa_dm_cb.disc_cb.disc_flags &= ~(NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF); 2468 nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.tle); 2469 2470 /* there is no active protocol in this state, so broadcast to all by using NFA_DM_RF_DEACTIVATE_RSP */ 2471 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_RSP, &(p_data->nfc_discover)); 2472 2473 if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_IDLE) 2474 { 2475 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2476 nfa_dm_start_rf_discover (); 2477 } 2478 else if (p_data->nfc_discover.deactivate.type == NFA_DEACTIVATE_TYPE_DISCOVERY) 2479 { 2480 nfa_dm_disc_new_state (NFA_DM_RFST_DISCOVERY); 2481 } 2482 else 2483 { 2484 NFA_TRACE_ERROR0 ("Unexpected deactivation type"); 2485 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2486 nfa_dm_start_rf_discover (); 2487 } 2488 break; 2489 case NFA_DM_RF_INTF_ACTIVATED_NTF: 2490 nfa_dm_disc_new_state (NFA_DM_RFST_LISTEN_ACTIVE); 2491 if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED) 2492 { 2493 NFA_TRACE_DEBUG0 ("Not matched, restart discovery after receiving deactivate ntf"); 2494 2495 /* after receiving deactivate event, restart discovery */ 2496 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 2497 } 2498 break; 2499 default: 2500 NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_listen_sleep (): Unexpected discovery event"); 2501 break; 2502 } 2503 } 2504 2505 /******************************************************************************* 2506 ** 2507 ** Function nfa_dm_disc_sm_lp_listen 2508 ** 2509 ** Description Processing discovery events in NFA_DM_RFST_LP_LISTEN state 2510 ** 2511 ** Returns void 2512 ** 2513 *******************************************************************************/ 2514 static void nfa_dm_disc_sm_lp_listen (tNFA_DM_RF_DISC_SM_EVENT event, 2515 tNFA_DM_RF_DISC_DATA *p_data) 2516 { 2517 switch (event) 2518 { 2519 case NFA_DM_RF_INTF_ACTIVATED_NTF: 2520 nfa_dm_disc_new_state (NFA_DM_RFST_LP_ACTIVE); 2521 nfa_dm_disc_notify_activation (&(p_data->nfc_discover)); 2522 if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED) 2523 { 2524 NFA_TRACE_DEBUG0 ("Not matched, unexpected activation"); 2525 } 2526 break; 2527 2528 default: 2529 NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_lp_listen (): Unexpected discovery event"); 2530 break; 2531 } 2532 } 2533 2534 /******************************************************************************* 2535 ** 2536 ** Function nfa_dm_disc_sm_lp_active 2537 ** 2538 ** Description Processing discovery events in NFA_DM_RFST_LP_ACTIVE state 2539 ** 2540 ** Returns void 2541 ** 2542 *******************************************************************************/ 2543 static void nfa_dm_disc_sm_lp_active (tNFA_DM_RF_DISC_SM_EVENT event, 2544 tNFA_DM_RF_DISC_DATA *p_data) 2545 { 2546 switch (event) 2547 { 2548 case NFA_DM_RF_DEACTIVATE_NTF: 2549 nfa_dm_disc_new_state (NFA_DM_RFST_LP_LISTEN); 2550 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover)); 2551 break; 2552 default: 2553 NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_lp_active (): Unexpected discovery event"); 2554 break; 2555 } 2556 } 2557 2558 /******************************************************************************* 2559 ** 2560 ** Function nfa_dm_disc_sm_execute 2561 ** 2562 ** Description Processing discovery related events 2563 ** 2564 ** Returns void 2565 ** 2566 *******************************************************************************/ 2567 void nfa_dm_disc_sm_execute (tNFA_DM_RF_DISC_SM_EVENT event, tNFA_DM_RF_DISC_DATA *p_data) 2568 { 2569 #if (BT_TRACE_VERBOSE == TRUE) 2570 NFA_TRACE_DEBUG5 ("nfa_dm_disc_sm_execute (): state: %s (%d), event: %s(%d) disc_flags: 0x%x", 2571 nfa_dm_disc_state_2_str (nfa_dm_cb.disc_cb.disc_state), nfa_dm_cb.disc_cb.disc_state, 2572 nfa_dm_disc_event_2_str (event), event, nfa_dm_cb.disc_cb.disc_flags); 2573 #else 2574 NFA_TRACE_DEBUG3 ("nfa_dm_disc_sm_execute(): state: %d, event:%d disc_flags: 0x%x", 2575 nfa_dm_cb.disc_cb.disc_state, event, nfa_dm_cb.disc_cb.disc_flags); 2576 #endif 2577 2578 switch (nfa_dm_cb.disc_cb.disc_state) 2579 { 2580 /* RF Discovery State - Idle */ 2581 case NFA_DM_RFST_IDLE: 2582 nfa_dm_disc_sm_idle (event, p_data); 2583 break; 2584 2585 /* RF Discovery State - Discovery */ 2586 case NFA_DM_RFST_DISCOVERY: 2587 nfa_dm_disc_sm_discovery (event, p_data); 2588 break; 2589 2590 /*RF Discovery State - Wait for all discoveries */ 2591 case NFA_DM_RFST_W4_ALL_DISCOVERIES: 2592 nfa_dm_disc_sm_w4_all_discoveries (event, p_data); 2593 break; 2594 2595 /* RF Discovery State - Wait for host selection */ 2596 case NFA_DM_RFST_W4_HOST_SELECT: 2597 nfa_dm_disc_sm_w4_host_select (event, p_data); 2598 break; 2599 2600 /* RF Discovery State - Poll mode activated */ 2601 case NFA_DM_RFST_POLL_ACTIVE: 2602 nfa_dm_disc_sm_poll_active (event, p_data); 2603 break; 2604 2605 /* RF Discovery State - listen mode activated */ 2606 case NFA_DM_RFST_LISTEN_ACTIVE: 2607 nfa_dm_disc_sm_listen_active (event, p_data); 2608 break; 2609 2610 /* RF Discovery State - listen mode sleep */ 2611 case NFA_DM_RFST_LISTEN_SLEEP: 2612 nfa_dm_disc_sm_listen_sleep (event, p_data); 2613 break; 2614 2615 /* Listening in Low Power mode */ 2616 case NFA_DM_RFST_LP_LISTEN: 2617 nfa_dm_disc_sm_lp_listen (event, p_data); 2618 break; 2619 2620 /* Activated in Low Power mode */ 2621 case NFA_DM_RFST_LP_ACTIVE: 2622 nfa_dm_disc_sm_lp_active (event, p_data); 2623 break; 2624 } 2625 #if (BT_TRACE_VERBOSE == TRUE) 2626 NFA_TRACE_DEBUG3 ("nfa_dm_disc_sm_execute (): new state: %s (%d), disc_flags: 0x%x", 2627 nfa_dm_disc_state_2_str (nfa_dm_cb.disc_cb.disc_state), nfa_dm_cb.disc_cb.disc_state, 2628 nfa_dm_cb.disc_cb.disc_flags); 2629 #else 2630 NFA_TRACE_DEBUG2 ("nfa_dm_disc_sm_execute(): new state: %d, disc_flags: 0x%x", 2631 nfa_dm_cb.disc_cb.disc_state, nfa_dm_cb.disc_cb.disc_flags); 2632 #endif 2633 } 2634 2635 /******************************************************************************* 2636 ** 2637 ** Function nfa_dm_add_rf_discover 2638 ** 2639 ** Description Add discovery configuration and callback function 2640 ** 2641 ** Returns valid handle if success 2642 ** 2643 *******************************************************************************/ 2644 tNFA_HANDLE nfa_dm_add_rf_discover (tNFA_DM_DISC_TECH_PROTO_MASK disc_mask, 2645 tNFA_DM_DISC_HOST_ID host_id, 2646 tNFA_DISCOVER_CBACK *p_disc_cback) 2647 { 2648 UINT8 xx; 2649 2650 NFA_TRACE_DEBUG1 ("nfa_dm_add_rf_discover () disc_mask=0x%x", disc_mask); 2651 2652 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) 2653 { 2654 if (!nfa_dm_cb.disc_cb.entry[xx].in_use) 2655 { 2656 nfa_dm_cb.disc_cb.entry[xx].in_use = TRUE; 2657 nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask = disc_mask; 2658 nfa_dm_cb.disc_cb.entry[xx].host_id = host_id; 2659 nfa_dm_cb.disc_cb.entry[xx].p_disc_cback = p_disc_cback; 2660 nfa_dm_cb.disc_cb.entry[xx].disc_flags = NFA_DM_DISC_FLAGS_NOTIFY; 2661 return xx; 2662 } 2663 } 2664 2665 return NFA_HANDLE_INVALID; 2666 } 2667 2668 /******************************************************************************* 2669 ** 2670 ** Function nfa_dm_start_excl_discovery 2671 ** 2672 ** Description Start exclusive RF discovery 2673 ** 2674 ** Returns void 2675 ** 2676 *******************************************************************************/ 2677 void nfa_dm_start_excl_discovery (tNFA_TECHNOLOGY_MASK poll_tech_mask, 2678 tNFA_LISTEN_CFG *p_listen_cfg, 2679 tNFA_DISCOVER_CBACK *p_disc_cback) 2680 { 2681 tNFA_DM_DISC_TECH_PROTO_MASK poll_disc_mask = 0; 2682 2683 NFA_TRACE_DEBUG0 ("nfa_dm_start_excl_discovery ()"); 2684 2685 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A) 2686 { 2687 poll_disc_mask |= NFA_DM_DISC_MASK_PA_T1T; 2688 poll_disc_mask |= NFA_DM_DISC_MASK_PA_T2T; 2689 poll_disc_mask |= NFA_DM_DISC_MASK_PA_ISO_DEP; 2690 poll_disc_mask |= NFA_DM_DISC_MASK_PA_NFC_DEP; 2691 poll_disc_mask |= NFA_DM_DISC_MASK_P_LEGACY; 2692 } 2693 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A_ACTIVE) 2694 { 2695 poll_disc_mask |= NFA_DM_DISC_MASK_PAA_NFC_DEP; 2696 } 2697 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_B) 2698 { 2699 poll_disc_mask |= NFA_DM_DISC_MASK_PB_ISO_DEP; 2700 } 2701 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_F) 2702 { 2703 poll_disc_mask |= NFA_DM_DISC_MASK_PF_T3T; 2704 poll_disc_mask |= NFA_DM_DISC_MASK_PF_NFC_DEP; 2705 } 2706 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_F_ACTIVE) 2707 { 2708 poll_disc_mask |= NFA_DM_DISC_MASK_PFA_NFC_DEP; 2709 } 2710 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_ISO15693) 2711 { 2712 poll_disc_mask |= NFA_DM_DISC_MASK_P_ISO15693; 2713 } 2714 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_B_PRIME) 2715 { 2716 poll_disc_mask |= NFA_DM_DISC_MASK_P_B_PRIME; 2717 } 2718 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_KOVIO) 2719 { 2720 poll_disc_mask |= NFA_DM_DISC_MASK_P_KOVIO; 2721 } 2722 2723 nfa_dm_cb.disc_cb.excl_disc_entry.in_use = TRUE; 2724 nfa_dm_cb.disc_cb.excl_disc_entry.requested_disc_mask = poll_disc_mask; 2725 nfa_dm_cb.disc_cb.excl_disc_entry.host_id = NFA_DM_DISC_HOST_ID_DH; 2726 nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback = p_disc_cback; 2727 nfa_dm_cb.disc_cb.excl_disc_entry.disc_flags = NFA_DM_DISC_FLAGS_NOTIFY; 2728 2729 memcpy (&nfa_dm_cb.disc_cb.excl_listen_config, p_listen_cfg, sizeof (tNFA_LISTEN_CFG)); 2730 2731 nfa_dm_disc_sm_execute (NFA_DM_RF_DISCOVER_CMD, NULL); 2732 } 2733 2734 /******************************************************************************* 2735 ** 2736 ** Function nfa_dm_stop_excl_discovery 2737 ** 2738 ** Description Stop exclusive RF discovery 2739 ** 2740 ** Returns void 2741 ** 2742 *******************************************************************************/ 2743 void nfa_dm_stop_excl_discovery (void) 2744 { 2745 NFA_TRACE_DEBUG0 ("nfa_dm_stop_excl_discovery ()"); 2746 2747 nfa_dm_cb.disc_cb.excl_disc_entry.in_use = FALSE; 2748 nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback = NULL; 2749 } 2750 2751 /******************************************************************************* 2752 ** 2753 ** Function nfa_dm_delete_rf_discover 2754 ** 2755 ** Description Remove discovery configuration and callback function 2756 ** 2757 ** Returns void 2758 ** 2759 *******************************************************************************/ 2760 void nfa_dm_delete_rf_discover (tNFA_HANDLE handle) 2761 { 2762 NFA_TRACE_DEBUG1 ("nfa_dm_delete_rf_discover () handle=0x%x", handle); 2763 2764 if (handle < NFA_DM_DISC_NUM_ENTRIES) 2765 { 2766 nfa_dm_cb.disc_cb.entry[handle].in_use = FALSE; 2767 } 2768 else 2769 { 2770 NFA_TRACE_ERROR0 ("Invalid discovery handle"); 2771 } 2772 } 2773 2774 /******************************************************************************* 2775 ** 2776 ** Function nfa_dm_rf_discover_select 2777 ** 2778 ** Description Select target, protocol and RF interface 2779 ** 2780 ** Returns void 2781 ** 2782 *******************************************************************************/ 2783 void nfa_dm_rf_discover_select (UINT8 rf_disc_id, 2784 tNFA_NFC_PROTOCOL protocol, 2785 tNFA_INTF_TYPE rf_interface) 2786 { 2787 tNFA_DM_DISC_SELECT_PARAMS select_params; 2788 tNFA_CONN_EVT_DATA conn_evt; 2789 2790 NFA_TRACE_DEBUG3 ("nfa_dm_disc_select () rf_disc_id:0x%X, protocol:0x%X, rf_interface:0x%X", 2791 rf_disc_id, protocol, rf_interface); 2792 2793 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_HOST_SELECT) 2794 { 2795 /* state is OK: notify the status when the response is received from NFCC */ 2796 select_params.rf_disc_id = rf_disc_id; 2797 select_params.protocol = protocol; 2798 select_params.rf_interface = rf_interface; 2799 2800 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_NOTIFY; 2801 nfa_dm_disc_sm_execute (NFA_DM_RF_DISCOVER_SELECT_CMD, (tNFA_DM_RF_DISC_DATA *) &select_params); 2802 } 2803 else 2804 { 2805 /* Wrong state: notify failed status right away */ 2806 conn_evt.status = NFA_STATUS_FAILED; 2807 nfa_dm_conn_cback_event_notify (NFA_SELECT_RESULT_EVT, &conn_evt); 2808 } 2809 } 2810 2811 /******************************************************************************* 2812 ** 2813 ** Function nfa_dm_rf_deactivate 2814 ** 2815 ** Description Deactivate NFC link 2816 ** 2817 ** Returns NFA_STATUS_OK if success 2818 ** 2819 *******************************************************************************/ 2820 tNFA_STATUS nfa_dm_rf_deactivate (tNFA_DEACTIVATE_TYPE deactivate_type) 2821 { 2822 NFA_TRACE_DEBUG1 ("nfa_dm_rf_deactivate () deactivate_type:0x%X", deactivate_type); 2823 2824 if (deactivate_type == NFA_DEACTIVATE_TYPE_SLEEP) 2825 { 2826 if (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_NFC_DEP) 2827 deactivate_type = NFC_DEACTIVATE_TYPE_SLEEP_AF; 2828 else 2829 deactivate_type = NFC_DEACTIVATE_TYPE_SLEEP; 2830 } 2831 2832 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_IDLE) 2833 { 2834 return NFA_STATUS_FAILED; 2835 } 2836 else if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_DISCOVERY) 2837 { 2838 if (deactivate_type == NFA_DEACTIVATE_TYPE_DISCOVERY) 2839 { 2840 if (nfa_dm_cb.disc_cb.kovio_tle.in_use) 2841 { 2842 nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.kovio_tle); 2843 nfa_dm_disc_kovio_timeout_cback (&nfa_dm_cb.disc_cb.kovio_tle); 2844 return NFA_STATUS_OK; 2845 } 2846 else 2847 { 2848 /* it could be race condition. */ 2849 NFA_TRACE_DEBUG0 ("nfa_dm_rf_deactivate (): already in discovery state"); 2850 return NFA_STATUS_FAILED; 2851 } 2852 } 2853 else if (deactivate_type == NFA_DEACTIVATE_TYPE_IDLE) 2854 { 2855 if (nfa_dm_cb.disc_cb.kovio_tle.in_use) 2856 { 2857 nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.kovio_tle); 2858 nfa_dm_disc_kovio_timeout_cback (&nfa_dm_cb.disc_cb.kovio_tle); 2859 } 2860 nfa_dm_disc_sm_execute (NFA_DM_RF_DEACTIVATE_CMD, (tNFA_DM_RF_DISC_DATA *) &deactivate_type); 2861 return NFA_STATUS_OK; 2862 } 2863 else 2864 { 2865 return NFA_STATUS_FAILED; 2866 } 2867 } 2868 else 2869 { 2870 nfa_dm_disc_sm_execute (NFA_DM_RF_DEACTIVATE_CMD, (tNFA_DM_RF_DISC_DATA *) &deactivate_type); 2871 return NFA_STATUS_OK; 2872 } 2873 } 2874 2875 #if (BT_TRACE_VERBOSE == TRUE) 2876 /******************************************************************************* 2877 ** 2878 ** Function nfa_dm_disc_state_2_str 2879 ** 2880 ** Description convert nfc discovery state to string 2881 ** 2882 *******************************************************************************/ 2883 static char *nfa_dm_disc_state_2_str (UINT8 state) 2884 { 2885 switch (state) 2886 { 2887 case NFA_DM_RFST_IDLE: 2888 return "IDLE"; 2889 2890 case NFA_DM_RFST_DISCOVERY: 2891 return "DISCOVERY"; 2892 2893 case NFA_DM_RFST_W4_ALL_DISCOVERIES: 2894 return "W4_ALL_DISCOVERIES"; 2895 2896 case NFA_DM_RFST_W4_HOST_SELECT: 2897 return "W4_HOST_SELECT"; 2898 2899 case NFA_DM_RFST_POLL_ACTIVE: 2900 return "POLL_ACTIVE"; 2901 2902 case NFA_DM_RFST_LISTEN_ACTIVE: 2903 return "LISTEN_ACTIVE"; 2904 2905 case NFA_DM_RFST_LISTEN_SLEEP: 2906 return "LISTEN_SLEEP"; 2907 2908 case NFA_DM_RFST_LP_LISTEN: 2909 return "LP_LISTEN"; 2910 2911 case NFA_DM_RFST_LP_ACTIVE: 2912 return "LP_ACTIVE"; 2913 } 2914 return "Unknown"; 2915 } 2916 2917 /******************************************************************************* 2918 ** 2919 ** Function nfa_dm_disc_event_2_str 2920 ** 2921 ** Description convert nfc discovery RSP/NTF to string 2922 ** 2923 *******************************************************************************/ 2924 static char *nfa_dm_disc_event_2_str (UINT8 event) 2925 { 2926 switch (event) 2927 { 2928 case NFA_DM_RF_DISCOVER_CMD: 2929 return "DISCOVER_CMD"; 2930 2931 case NFA_DM_RF_DISCOVER_RSP: 2932 return "DISCOVER_RSP"; 2933 2934 case NFA_DM_RF_DISCOVER_NTF: 2935 return "DISCOVER_NTF"; 2936 2937 case NFA_DM_RF_DISCOVER_SELECT_CMD: 2938 return "SELECT_CMD"; 2939 2940 case NFA_DM_RF_DISCOVER_SELECT_RSP: 2941 return "SELECT_RSP"; 2942 2943 case NFA_DM_RF_INTF_ACTIVATED_NTF: 2944 return "ACTIVATED_NTF"; 2945 2946 case NFA_DM_RF_DEACTIVATE_CMD: 2947 return "DEACTIVATE_CMD"; 2948 2949 case NFA_DM_RF_DEACTIVATE_RSP: 2950 return "DEACTIVATE_RSP"; 2951 2952 case NFA_DM_RF_DEACTIVATE_NTF: 2953 return "DEACTIVATE_NTF"; 2954 2955 case NFA_DM_LP_LISTEN_CMD: 2956 return "NFA_DM_LP_LISTEN_CMD"; 2957 2958 case NFA_DM_CORE_INTF_ERROR_NTF: 2959 return "INTF_ERROR_NTF"; 2960 2961 } 2962 return "Unknown"; 2963 } 2964 #endif /* BT_TRACE_VERBOSE */ 2965