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 * NFA interface for device management 22 * 23 ******************************************************************************/ 24 #include <string.h> 25 26 #include <android-base/stringprintf.h> 27 #include <base/logging.h> 28 29 #include "ndef_utils.h" 30 #include "nfa_api.h" 31 #include "nfa_ce_int.h" 32 33 using android::base::StringPrintf; 34 35 extern bool nfc_debug_enabled; 36 37 /***************************************************************************** 38 ** Constants 39 *****************************************************************************/ 40 41 /***************************************************************************** 42 ** APIs 43 *****************************************************************************/ 44 /******************************************************************************* 45 ** 46 ** Function NFA_Init 47 ** 48 ** Description This function initializes control blocks for NFA 49 ** 50 ** p_hal_entry_tbl points to a table of HAL entry points 51 ** 52 ** NOTE: the buffer that p_hal_entry_tbl points must be 53 ** persistent until NFA is disabled. 54 ** 55 ** Returns none 56 ** 57 *******************************************************************************/ 58 void NFA_Init(tHAL_NFC_ENTRY* p_hal_entry_tbl) { 59 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 60 nfa_sys_init(); 61 nfa_dm_init(); 62 nfa_p2p_init(); 63 nfa_snep_init(false); 64 nfa_rw_init(); 65 nfa_ce_init(); 66 nfa_ee_init(); 67 if (nfa_ee_max_ee_cfg != 0) { 68 nfa_dm_cb.get_max_ee = p_hal_entry_tbl->get_max_ee; 69 nfa_hci_init(); 70 } 71 72 /* Initialize NFC module */ 73 NFC_Init(p_hal_entry_tbl); 74 } 75 76 /******************************************************************************* 77 ** 78 ** Function NFA_Enable 79 ** 80 ** Description This function enables NFC. Prior to calling NFA_Enable, 81 ** the NFCC must be powered up, and ready to receive commands. 82 ** This function enables the tasks needed by NFC, opens the NCI 83 ** transport, resets the NFC controller, downloads patches to 84 ** the NFCC (if necessary), and initializes the NFC subsystems. 85 ** 86 ** This function should only be called once - typically when 87 ** NFC is enabled during boot-up, or when NFC is enabled from a 88 ** settings UI. Subsequent calls to NFA_Enable while NFA is 89 ** enabling or enabled will be ignored. When the NFC startup 90 ** procedure is completed, an NFA_DM_ENABLE_EVT is returned to 91 ** the application using the tNFA_DM_CBACK. 92 ** 93 ** Returns NFA_STATUS_OK if successfully initiated 94 ** NFA_STATUS_FAILED otherwise 95 ** 96 *******************************************************************************/ 97 tNFA_STATUS NFA_Enable(tNFA_DM_CBACK* p_dm_cback, 98 tNFA_CONN_CBACK* p_conn_cback) { 99 tNFA_DM_API_ENABLE* p_msg; 100 101 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 102 103 /* Validate parameters */ 104 if ((!p_dm_cback) || (!p_conn_cback)) { 105 LOG(ERROR) << StringPrintf("error null callback"); 106 return (NFA_STATUS_FAILED); 107 } 108 109 p_msg = (tNFA_DM_API_ENABLE*)GKI_getbuf(sizeof(tNFA_DM_API_ENABLE)); 110 if (p_msg != NULL) { 111 p_msg->hdr.event = NFA_DM_API_ENABLE_EVT; 112 p_msg->p_dm_cback = p_dm_cback; 113 p_msg->p_conn_cback = p_conn_cback; 114 115 nfa_sys_sendmsg(p_msg); 116 117 return (NFA_STATUS_OK); 118 } 119 120 return (NFA_STATUS_FAILED); 121 } 122 123 /******************************************************************************* 124 ** 125 ** Function NFA_Disable 126 ** 127 ** Description This function is called to shutdown NFC. The tasks for NFC 128 ** are terminated, and clean up routines are performed. This 129 ** function is typically called during platform shut-down, or 130 ** when NFC is disabled from a settings UI. When the NFC 131 ** shutdown procedure is completed, an NFA_DM_DISABLE_EVT is 132 ** returned to the application using the tNFA_DM_CBACK. 133 ** 134 ** The platform should wait until the NFC_DISABLE_REVT is 135 ** received before powering down the NFC chip and NCI 136 ** transport. This is required to so that NFA can gracefully 137 ** shut down any open connections. 138 ** 139 ** Returns NFA_STATUS_OK if successfully initiated 140 ** NFA_STATUS_FAILED otherwise 141 ** 142 *******************************************************************************/ 143 tNFA_STATUS NFA_Disable(bool graceful) { 144 tNFA_DM_API_DISABLE* p_msg; 145 146 DLOG_IF(INFO, nfc_debug_enabled) 147 << StringPrintf("NFA_Disable (graceful=%i)", graceful); 148 149 p_msg = (tNFA_DM_API_DISABLE*)GKI_getbuf(sizeof(tNFA_DM_API_DISABLE)); 150 if (p_msg != NULL) { 151 p_msg->hdr.event = NFA_DM_API_DISABLE_EVT; 152 p_msg->graceful = graceful; 153 154 nfa_sys_sendmsg(p_msg); 155 156 return (NFA_STATUS_OK); 157 } 158 159 return (NFA_STATUS_FAILED); 160 } 161 162 /******************************************************************************* 163 ** 164 ** Function NFA_GetNCIVersion 165 ** 166 ** Description Returns the NCI version of the NFCC to upper layer 167 ** 168 ** 169 ** Returns NCI version NCI2.0 / NCI1.0 170 ** 171 *******************************************************************************/ 172 uint8_t NFA_GetNCIVersion() { return NFC_GetNCIVersion(); } 173 174 /******************************************************************************* 175 ** 176 ** Function NFA_SetPowerSubStateForScreenState 177 ** 178 ** Description Update the power sub-state as per current screen state to 179 ** NFCC. 180 ** 181 ** Returns NFA_STATUS_OK if successfully initiated 182 ** NFA_STATUS_FAILED otherwise 183 ** 184 *******************************************************************************/ 185 tNFA_STATUS NFA_SetPowerSubStateForScreenState(uint8_t screenState) { 186 DLOG_IF(INFO, nfc_debug_enabled) 187 << StringPrintf("%s: state:0x%X", __func__, screenState); 188 189 uint8_t nci_scren_state = 0xFF; 190 uint16_t buf_size = sizeof(tNFA_DM_API_SET_POWER_SUB_STATE); 191 tNFA_DM_API_SET_POWER_SUB_STATE* p_msg = 192 (tNFA_DM_API_SET_POWER_SUB_STATE*)GKI_getbuf(buf_size); 193 194 if (p_msg != NULL) { 195 p_msg->hdr.event = NFA_DM_API_SET_POWER_SUB_STATE_EVT; 196 switch (screenState) { 197 case NFA_SCREEN_STATE_ON_UNLOCKED: 198 nci_scren_state = SCREEN_STATE_ON_UNLOCKED; 199 break; 200 case NFA_SCREEN_STATE_OFF_UNLOCKED: 201 nci_scren_state = SCREEN_STATE_OFF_UNLOCKED; 202 break; 203 case NFA_SCREEN_STATE_ON_LOCKED: 204 nci_scren_state = SCREEN_STATE_ON_LOCKED; 205 break; 206 case NFA_SCREEN_STATE_OFF_LOCKED: 207 nci_scren_state = SCREEN_STATE_OFF_LOCKED; 208 break; 209 210 default: 211 DLOG_IF(INFO, nfc_debug_enabled) 212 << StringPrintf("%s, unknown screen state", __func__); 213 break; 214 } 215 216 p_msg->screen_state = nci_scren_state; 217 218 nfa_sys_sendmsg(p_msg); 219 return (NFA_STATUS_OK); 220 } 221 return (NFA_STATUS_FAILED); 222 } 223 /******************************************************************************* 224 ** 225 ** Function NFA_SetConfig 226 ** 227 ** Description Set the configuration parameters to NFCC. The result is 228 ** reported with an NFA_DM_SET_CONFIG_EVT in the tNFA_DM_CBACK 229 ** callback. 230 ** 231 ** Note: If RF discovery is started, 232 ** NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should 233 ** happen before calling this function. Most Configuration 234 ** parameters are related to RF discovery. 235 ** 236 ** Returns NFA_STATUS_OK if successfully initiated 237 ** NFA_STATUS_BUSY if previous setting is on-going 238 ** NFA_STATUS_FAILED otherwise 239 ** 240 *******************************************************************************/ 241 tNFA_STATUS NFA_SetConfig(tNFA_PMID param_id, uint8_t length, uint8_t* p_data) { 242 tNFA_DM_API_SET_CONFIG* p_msg; 243 244 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("param_id:0x%X", param_id); 245 246 p_msg = (tNFA_DM_API_SET_CONFIG*)GKI_getbuf( 247 (uint16_t)(sizeof(tNFA_DM_API_SET_CONFIG) + length)); 248 if (p_msg != NULL) { 249 p_msg->hdr.event = NFA_DM_API_SET_CONFIG_EVT; 250 251 p_msg->param_id = param_id; 252 p_msg->length = length; 253 p_msg->p_data = (uint8_t*)(p_msg + 1); 254 255 /* Copy parameter data */ 256 memcpy(p_msg->p_data, p_data, length); 257 258 nfa_sys_sendmsg(p_msg); 259 260 return (NFA_STATUS_OK); 261 } 262 263 return (NFA_STATUS_FAILED); 264 } 265 266 /******************************************************************************* 267 ** 268 ** Function NFA_GetConfig 269 ** 270 ** Description Get the configuration parameters from NFCC. The result is 271 ** reported with an NFA_DM_GET_CONFIG_EVT in the tNFA_DM_CBACK 272 ** callback. 273 ** 274 ** Returns NFA_STATUS_OK if successfully initiated 275 ** NFA_STATUS_FAILED otherwise 276 ** 277 *******************************************************************************/ 278 tNFA_STATUS NFA_GetConfig(uint8_t num_ids, tNFA_PMID* p_param_ids) { 279 tNFA_DM_API_GET_CONFIG* p_msg; 280 281 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("num_ids: %i", num_ids); 282 283 p_msg = (tNFA_DM_API_GET_CONFIG*)GKI_getbuf( 284 (uint16_t)(sizeof(tNFA_DM_API_GET_CONFIG) + num_ids)); 285 if (p_msg != NULL) { 286 p_msg->hdr.event = NFA_DM_API_GET_CONFIG_EVT; 287 288 p_msg->num_ids = num_ids; 289 p_msg->p_pmids = (tNFA_PMID*)(p_msg + 1); 290 291 /* Copy the param IDs */ 292 memcpy(p_msg->p_pmids, p_param_ids, num_ids); 293 294 nfa_sys_sendmsg(p_msg); 295 296 return (NFA_STATUS_OK); 297 } 298 299 return (NFA_STATUS_FAILED); 300 } 301 302 /******************************************************************************* 303 ** 304 ** Function NFA_RequestExclusiveRfControl 305 ** 306 ** Description Request exclusive control of NFC. 307 ** - Previous behavior (polling/tag reading, DH card emulation) 308 ** will be suspended . 309 ** - Polling and listening will be done based on the specified 310 ** params 311 ** 312 ** The NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT event of 313 ** tNFA_CONN_CBACK indicates the status of the operation. 314 ** 315 ** NFA_ACTIVATED_EVT and NFA_DEACTIVATED_EVT indicates link 316 ** activation/deactivation. 317 ** 318 ** NFA_SendRawFrame is used to send data to the peer. 319 ** NFA_DATA_EVT indicates data from the peer. 320 ** 321 ** If a tag is activated, then the NFA_RW APIs may be used to 322 ** send commands to the tag. Incoming NDEF messages are sent to 323 ** the NDEF callback. 324 ** 325 ** Once exclusive RF control has started, NFA will not activate 326 ** LLCP internally. The application has exclusive control of 327 ** the link. 328 ** 329 ** Note: If RF discovery is started, 330 ** NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should 331 ** happen before calling this function 332 ** 333 ** Returns NFA_STATUS_OK if successfully initiated 334 ** NFA_STATUS_FAILED otherwise 335 ** 336 *******************************************************************************/ 337 tNFA_STATUS NFA_RequestExclusiveRfControl(tNFA_TECHNOLOGY_MASK poll_mask, 338 tNFA_LISTEN_CFG* p_listen_cfg, 339 tNFA_CONN_CBACK* p_conn_cback, 340 tNFA_NDEF_CBACK* p_ndef_cback) { 341 tNFA_DM_API_REQ_EXCL_RF_CTRL* p_msg; 342 343 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("poll_mask=0x%x", poll_mask); 344 345 if (!p_conn_cback) { 346 LOG(ERROR) << StringPrintf("error null callback"); 347 return (NFA_STATUS_FAILED); 348 } 349 350 p_msg = (tNFA_DM_API_REQ_EXCL_RF_CTRL*)GKI_getbuf( 351 sizeof(tNFA_DM_API_REQ_EXCL_RF_CTRL)); 352 if (p_msg != NULL) { 353 p_msg->hdr.event = NFA_DM_API_REQUEST_EXCL_RF_CTRL_EVT; 354 p_msg->poll_mask = poll_mask; 355 p_msg->p_conn_cback = p_conn_cback; 356 p_msg->p_ndef_cback = p_ndef_cback; 357 358 if (p_listen_cfg) 359 memcpy(&p_msg->listen_cfg, p_listen_cfg, sizeof(tNFA_LISTEN_CFG)); 360 else 361 memset(&p_msg->listen_cfg, 0x00, sizeof(tNFA_LISTEN_CFG)); 362 363 nfa_sys_sendmsg(p_msg); 364 365 return (NFA_STATUS_OK); 366 } 367 368 return (NFA_STATUS_FAILED); 369 } 370 371 /******************************************************************************* 372 ** 373 ** Function NFA_ReleaseExclusiveRfControl 374 ** 375 ** Description Release exclusive control of NFC. Once released, behavior 376 ** prior to obtaining exclusive RF control will resume. 377 ** 378 ** Returns NFA_STATUS_OK if successfully initiated 379 ** NFA_STATUS_FAILED otherwise 380 ** 381 *******************************************************************************/ 382 tNFA_STATUS NFA_ReleaseExclusiveRfControl(void) { 383 NFC_HDR* p_msg; 384 385 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 386 387 if (!nfa_dm_cb.p_excl_conn_cback) { 388 LOG(ERROR) << StringPrintf( 389 "Exclusive rf control is not in " 390 "progress"); 391 return (NFA_STATUS_FAILED); 392 } 393 394 p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR)); 395 if (p_msg != NULL) { 396 p_msg->event = NFA_DM_API_RELEASE_EXCL_RF_CTRL_EVT; 397 nfa_sys_sendmsg(p_msg); 398 return (NFA_STATUS_OK); 399 } 400 401 return (NFA_STATUS_FAILED); 402 } 403 404 /******************************************************************************* 405 ** 406 ** Function NFA_EnablePolling 407 ** 408 ** Description Enable polling for technologies specified by poll_mask. 409 ** 410 ** The following events (notified using the connection 411 ** callback registered with NFA_Enable) are generated during 412 ** polling: 413 ** 414 ** - NFA_POLL_ENABLED_EVT indicates whether or not polling 415 ** successfully enabled. 416 ** - NFA_DISC_RESULT_EVT indicates there are more than one 417 ** devices, so application must select one of tags by calling 418 ** NFA_Select(). 419 ** - NFA_SELECT_RESULT_EVT indicates whether previous selection 420 ** was successful or not. If it was failed then application 421 ** must select again or deactivate by calling 422 ** NFA_Deactivate(). 423 ** - NFA_ACTIVATED_EVT is generated when an NFC link is 424 ** activated. 425 ** - NFA_NDEF_DETECT_EVT is generated if tag is activated 426 ** - NFA_LLCP_ACTIVATED_EVT/NFA_LLCP_DEACTIVATED_EVT is 427 ** generated if NFC-DEP is activated 428 ** - NFA_DEACTIVATED_EVT will be returned after deactivating 429 ** NFC link. 430 ** 431 ** Note: If RF discovery is started, 432 ** NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should 433 ** happen before calling this function 434 ** 435 ** Returns NFA_STATUS_OK if successfully initiated 436 ** NFA_STATUS_FAILED otherwise 437 ** 438 *******************************************************************************/ 439 tNFA_STATUS NFA_EnablePolling(tNFA_TECHNOLOGY_MASK poll_mask) { 440 tNFA_DM_API_ENABLE_POLL* p_msg; 441 442 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("0x%X", poll_mask); 443 444 p_msg = (tNFA_DM_API_ENABLE_POLL*)GKI_getbuf(sizeof(tNFA_DM_API_ENABLE_POLL)); 445 if (p_msg != NULL) { 446 p_msg->hdr.event = NFA_DM_API_ENABLE_POLLING_EVT; 447 p_msg->poll_mask = poll_mask; 448 449 nfa_sys_sendmsg(p_msg); 450 451 return (NFA_STATUS_OK); 452 } 453 454 return (NFA_STATUS_FAILED); 455 } 456 457 /******************************************************************************* 458 ** 459 ** Function NFA_DisablePolling 460 ** 461 ** Description Disable polling 462 ** NFA_POLL_DISABLED_EVT will be returned after stopping 463 ** polling. 464 ** 465 ** Note: If RF discovery is started, 466 ** NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should 467 ** happen before calling this function 468 ** 469 ** Returns NFA_STATUS_OK if successfully initiated 470 ** NFA_STATUS_FAILED otherwise 471 ** 472 *******************************************************************************/ 473 tNFA_STATUS NFA_DisablePolling(void) { 474 NFC_HDR* p_msg; 475 476 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 477 478 p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR)); 479 if (p_msg != NULL) { 480 p_msg->event = NFA_DM_API_DISABLE_POLLING_EVT; 481 482 nfa_sys_sendmsg(p_msg); 483 484 return (NFA_STATUS_OK); 485 } 486 487 return (NFA_STATUS_FAILED); 488 } 489 490 /******************************************************************************* 491 ** 492 ** Function NFA_EnableListening 493 ** 494 ** Description Enable listening. 495 ** NFA_LISTEN_ENABLED_EVT will be returned after listening is 496 ** allowed. 497 ** 498 ** The actual listening technologies are specified by other NFA 499 ** API functions. Such functions include (but not limited to) 500 ** NFA_CeConfigureUiccListenTech. 501 ** If NFA_DisableListening () is called to ignore the listening 502 ** technologies, NFA_EnableListening () is called to restore 503 ** the listening technologies set by these functions. 504 ** 505 ** Note: If RF discovery is started, 506 ** NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should 507 ** happen before calling this function 508 ** 509 ** Returns NFA_STATUS_OK if successfully initiated 510 ** NFA_STATUS_FAILED otherwise 511 ** 512 *******************************************************************************/ 513 tNFA_STATUS NFA_EnableListening(void) { 514 NFC_HDR* p_msg; 515 516 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 517 518 p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR)); 519 if (p_msg != NULL) { 520 p_msg->event = NFA_DM_API_ENABLE_LISTENING_EVT; 521 522 nfa_sys_sendmsg(p_msg); 523 524 return (NFA_STATUS_OK); 525 } 526 527 return (NFA_STATUS_FAILED); 528 } 529 530 /******************************************************************************* 531 ** 532 ** Function NFA_DisableListening 533 ** 534 ** Description Disable listening 535 ** NFA_LISTEN_DISABLED_EVT will be returned after stopping 536 ** listening. This function is called to exclude listen at RF 537 ** discovery. 538 ** 539 ** Note: If RF discovery is started, 540 ** NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should 541 ** happen before calling this function 542 ** 543 ** Returns NFA_STATUS_OK if successfully initiated 544 ** NFA_STATUS_FAILED otherwise 545 ** 546 *******************************************************************************/ 547 tNFA_STATUS NFA_DisableListening(void) { 548 NFC_HDR* p_msg; 549 550 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 551 552 p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR)); 553 if (p_msg != NULL) { 554 p_msg->event = NFA_DM_API_DISABLE_LISTENING_EVT; 555 556 nfa_sys_sendmsg(p_msg); 557 558 return (NFA_STATUS_OK); 559 } 560 561 return (NFA_STATUS_FAILED); 562 } 563 564 /******************************************************************************* 565 ** 566 ** Function NFA_PauseP2p 567 ** 568 ** Description Pause P2P services. 569 ** NFA_P2P_PAUSED_EVT will be returned after P2P services are 570 ** disabled. 571 ** 572 ** The P2P services enabled by NFA_P2p* API functions are not 573 ** available. NFA_ResumeP2p() is called to resume the P2P 574 ** services. 575 ** 576 ** Note: If RF discovery is started, 577 ** NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should 578 ** happen before calling this function 579 ** 580 ** Returns NFA_STATUS_OK if successfully initiated 581 ** NFA_STATUS_FAILED otherwise 582 ** 583 *******************************************************************************/ 584 tNFA_STATUS NFA_PauseP2p(void) { 585 NFC_HDR* p_msg; 586 587 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 588 589 p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR)); 590 if (p_msg != NULL) { 591 p_msg->event = NFA_DM_API_PAUSE_P2P_EVT; 592 593 nfa_sys_sendmsg(p_msg); 594 595 return (NFA_STATUS_OK); 596 } 597 598 return (NFA_STATUS_FAILED); 599 } 600 601 /******************************************************************************* 602 ** 603 ** Function NFA_ResumeP2p 604 ** 605 ** Description Resume P2P services. 606 ** NFA_P2P_RESUMED_EVT will be returned after P2P services are. 607 ** enables again. 608 ** 609 ** Note: If RF discovery is started, 610 ** NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should 611 ** happen before calling this function 612 ** 613 ** Returns NFA_STATUS_OK if successfully initiated 614 ** NFA_STATUS_FAILED otherwise 615 ** 616 *******************************************************************************/ 617 tNFA_STATUS NFA_ResumeP2p(void) { 618 NFC_HDR* p_msg; 619 620 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 621 622 p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR)); 623 if (p_msg != NULL) { 624 p_msg->event = NFA_DM_API_RESUME_P2P_EVT; 625 626 nfa_sys_sendmsg(p_msg); 627 628 return (NFA_STATUS_OK); 629 } 630 631 return (NFA_STATUS_FAILED); 632 } 633 634 /******************************************************************************* 635 ** 636 ** Function NFA_SetP2pListenTech 637 ** 638 ** Description This function is called to set listen technology for 639 ** NFC-DEP. This funtion may be called before or after starting 640 ** any server on NFA P2P/CHO/SNEP. 641 ** If there is no technology for NFC-DEP, P2P listening will be 642 ** stopped. 643 ** 644 ** NFA_SET_P2P_LISTEN_TECH_EVT without data will be returned. 645 ** 646 ** Note: If RF discovery is started, 647 ** NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should 648 ** happen before calling this function 649 ** 650 ** Returns NFA_STATUS_OK if successfully initiated 651 ** NFA_STATUS_FAILED otherwise 652 ** 653 *******************************************************************************/ 654 tNFA_STATUS NFA_SetP2pListenTech(tNFA_TECHNOLOGY_MASK tech_mask) { 655 tNFA_DM_API_SET_P2P_LISTEN_TECH* p_msg; 656 657 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("tech_mask:0x%X", tech_mask); 658 659 p_msg = (tNFA_DM_API_SET_P2P_LISTEN_TECH*)GKI_getbuf( 660 sizeof(tNFA_DM_API_SET_P2P_LISTEN_TECH)); 661 if (p_msg != NULL) { 662 p_msg->hdr.event = NFA_DM_API_SET_P2P_LISTEN_TECH_EVT; 663 p_msg->tech_mask = tech_mask; 664 665 nfa_sys_sendmsg(p_msg); 666 667 return (NFA_STATUS_OK); 668 } 669 670 return (NFA_STATUS_FAILED); 671 } 672 673 /******************************************************************************* 674 ** 675 ** Function NFA_StartRfDiscovery 676 ** 677 ** Description Start RF discovery 678 ** RF discovery parameters shall be set by other APIs. 679 ** 680 ** An NFA_RF_DISCOVERY_STARTED_EVT indicates whether starting 681 ** was successful or not. 682 ** 683 ** Returns NFA_STATUS_OK if successfully initiated 684 ** NFA_STATUS_FAILED otherwise 685 ** 686 *******************************************************************************/ 687 tNFA_STATUS NFA_StartRfDiscovery(void) { 688 NFC_HDR* p_msg; 689 690 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 691 692 p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR)); 693 if (p_msg != NULL) { 694 p_msg->event = NFA_DM_API_START_RF_DISCOVERY_EVT; 695 696 nfa_sys_sendmsg(p_msg); 697 698 return (NFA_STATUS_OK); 699 } 700 701 return (NFA_STATUS_FAILED); 702 } 703 704 /******************************************************************************* 705 ** 706 ** Function NFA_StopRfDiscovery 707 ** 708 ** Description Stop RF discovery 709 ** 710 ** An NFA_RF_DISCOVERY_STOPPED_EVT indicates whether stopping 711 ** was successful or not. 712 ** 713 ** Returns NFA_STATUS_OK if successfully initiated 714 ** NFA_STATUS_FAILED otherwise 715 ** 716 *******************************************************************************/ 717 tNFA_STATUS NFA_StopRfDiscovery(void) { 718 NFC_HDR* p_msg; 719 720 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 721 722 p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR)); 723 if (p_msg != NULL) { 724 p_msg->event = NFA_DM_API_STOP_RF_DISCOVERY_EVT; 725 726 nfa_sys_sendmsg(p_msg); 727 728 return (NFA_STATUS_OK); 729 } 730 731 return (NFA_STATUS_FAILED); 732 } 733 734 /******************************************************************************* 735 ** 736 ** Function NFA_SetRfDiscoveryDuration 737 ** 738 ** Description Set the duration of the single discovery period in [ms]. 739 ** Allowable range: 0 ms to 0xFFFF ms. 740 ** 741 ** If discovery is already started, the application should 742 ** call NFA_StopRfDiscovery prior to calling 743 ** NFA_SetRfDiscoveryDuration, and then call 744 ** NFA_StartRfDiscovery afterwards to restart discovery using 745 ** the new duration. 746 ** 747 ** Note: If RF discovery is started, 748 ** NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT should 749 ** happen before calling this function 750 ** 751 ** Returns: 752 ** NFA_STATUS_OK, if command accepted 753 ** NFA_STATUS_FAILED: otherwise 754 ** 755 *******************************************************************************/ 756 tNFA_STATUS NFA_SetRfDiscoveryDuration(uint16_t discovery_period_ms) { 757 tNFA_DM_API_SET_RF_DISC_DUR* p_msg; 758 759 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 760 761 /* Post the API message */ 762 p_msg = (tNFA_DM_API_SET_RF_DISC_DUR*)GKI_getbuf(sizeof(NFC_HDR)); 763 if (p_msg != NULL) { 764 p_msg->hdr.event = NFA_DM_API_SET_RF_DISC_DURATION_EVT; 765 766 /* Set discovery duration */ 767 p_msg->rf_disc_dur_ms = discovery_period_ms; 768 769 nfa_sys_sendmsg(p_msg); 770 771 return (NFA_STATUS_OK); 772 } 773 774 return (NFA_STATUS_FAILED); 775 } 776 777 /******************************************************************************* 778 ** 779 ** Function NFA_Select 780 ** 781 ** Description Select one from detected devices during discovery 782 ** (from NFA_DISC_RESULT_EVTs). The application should wait for 783 ** the final NFA_DISC_RESULT_EVT before selecting. 784 ** 785 ** An NFA_SELECT_RESULT_EVT indicates whether selection was 786 ** successful or not. If failed then application must select 787 ** again or deactivate by NFA_Deactivate(). 788 ** 789 ** Returns NFA_STATUS_OK if successfully initiated 790 ** NFA_STATUS_INVALID_PARAM if RF interface is not matched 791 ** protocol 792 ** NFA_STATUS_FAILED otherwise 793 ** 794 *******************************************************************************/ 795 tNFA_STATUS NFA_Select(uint8_t rf_disc_id, tNFA_NFC_PROTOCOL protocol, 796 tNFA_INTF_TYPE rf_interface) { 797 tNFA_DM_API_SELECT* p_msg; 798 799 DLOG_IF(INFO, nfc_debug_enabled) 800 << StringPrintf("rf_disc_id:0x%X, protocol:0x%X, rf_interface:0x%X", 801 rf_disc_id, protocol, rf_interface); 802 803 if (((rf_interface == NFA_INTERFACE_ISO_DEP) && 804 (protocol != NFA_PROTOCOL_ISO_DEP)) || 805 ((rf_interface == NFA_INTERFACE_NFC_DEP) && 806 (protocol != NFA_PROTOCOL_NFC_DEP))) { 807 LOG(ERROR) << StringPrintf("RF interface is not matched protocol"); 808 return (NFA_STATUS_INVALID_PARAM); 809 } 810 811 p_msg = 812 (tNFA_DM_API_SELECT*)GKI_getbuf((uint16_t)(sizeof(tNFA_DM_API_SELECT))); 813 if (p_msg != NULL) { 814 p_msg->hdr.event = NFA_DM_API_SELECT_EVT; 815 p_msg->rf_disc_id = rf_disc_id; 816 p_msg->protocol = protocol; 817 p_msg->rf_interface = rf_interface; 818 819 nfa_sys_sendmsg(p_msg); 820 821 return (NFA_STATUS_OK); 822 } 823 824 return (NFA_STATUS_FAILED); 825 } 826 827 /******************************************************************************* 828 ** 829 ** Function NFA_UpdateRFCommParams 830 ** 831 ** Description This function is called to update RF Communication 832 ** parameters once the Frame RF Interface has been activated. 833 ** 834 ** An NFA_UPDATE_RF_PARAM_RESULT_EVT indicates whether updating 835 ** was successful or not. 836 ** 837 ** Returns NFA_STATUS_OK if successfully initiated 838 ** NFA_STATUS_FAILED otherwise 839 ** 840 *******************************************************************************/ 841 tNFA_STATUS NFA_UpdateRFCommParams(tNFA_RF_COMM_PARAMS* p_params) { 842 tNFA_DM_API_UPDATE_RF_PARAMS* p_msg; 843 844 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 845 846 p_msg = (tNFA_DM_API_UPDATE_RF_PARAMS*)GKI_getbuf( 847 (uint16_t)(sizeof(tNFA_DM_API_UPDATE_RF_PARAMS))); 848 if (p_msg != NULL) { 849 p_msg->hdr.event = NFA_DM_API_UPDATE_RF_PARAMS_EVT; 850 memcpy(&p_msg->params, p_params, sizeof(tNFA_RF_COMM_PARAMS)); 851 852 nfa_sys_sendmsg(p_msg); 853 854 return (NFA_STATUS_OK); 855 } 856 857 return (NFA_STATUS_FAILED); 858 } 859 860 /******************************************************************************* 861 ** 862 ** Function NFA_Deactivate 863 ** 864 ** Description 865 ** If sleep_mode=TRUE: 866 ** Deselect the activated device by deactivating into sleep 867 ** mode. 868 ** 869 ** An NFA_DEACTIVATE_FAIL_EVT indicates that selection was 870 ** not successful. Application can select another 871 ** discovered device or deactivate by NFA_Deactivate() 872 ** after receiving NFA_DEACTIVATED_EVT. 873 ** 874 ** Deactivating to sleep mode is not allowed when NFCC is 875 ** in wait-for-host-select mode, or in listen-sleep states; 876 ** NFA will deactivate to idle or discovery state for these 877 ** cases respectively. 878 ** 879 ** 880 ** If sleep_mode=FALSE: 881 ** Deactivate the connection (e.g. as a result of presence 882 ** check failure) NFA_DEACTIVATED_EVT will indicate that 883 ** link is deactivated. Polling/listening will resume 884 ** (unless the nfcc is in wait_for-all-discoveries state) 885 ** 886 ** 887 ** Returns NFA_STATUS_OK if successfully initiated 888 ** NFA_STATUS_FAILED otherwise 889 ** 890 *******************************************************************************/ 891 extern tNFA_STATUS NFA_Deactivate(bool sleep_mode) { 892 tNFA_DM_API_DEACTIVATE* p_msg; 893 894 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("sleep_mode:%i", sleep_mode); 895 896 p_msg = (tNFA_DM_API_DEACTIVATE*)GKI_getbuf( 897 (uint16_t)(sizeof(tNFA_DM_API_DEACTIVATE))); 898 if (p_msg != NULL) { 899 p_msg->hdr.event = NFA_DM_API_DEACTIVATE_EVT; 900 p_msg->sleep_mode = sleep_mode; 901 902 nfa_sys_sendmsg(p_msg); 903 904 return (NFA_STATUS_OK); 905 } 906 907 return (NFA_STATUS_FAILED); 908 } 909 910 /******************************************************************************* 911 ** 912 ** Function NFA_SendRawFrame 913 ** 914 ** Description Send a raw frame over the activated interface with the NFCC. 915 ** This function can only be called after NFC link is 916 ** activated. 917 ** 918 ** If the activated interface is a tag and auto-presence check 919 ** is enabled then presence_check_start_delay can be used to 920 ** indicate the delay in msec after which the next auto 921 ** presence check command can be sent. 922 ** NFA_DM_DEFAULT_PRESENCE_CHECK_START_DELAY can be used as the 923 ** default value for the delay. 924 ** 925 ** Returns NFA_STATUS_OK if successfully initiated 926 ** NFA_STATUS_FAILED otherwise 927 ** 928 *******************************************************************************/ 929 tNFA_STATUS NFA_SendRawFrame(uint8_t* p_raw_data, uint16_t data_len, 930 uint16_t presence_check_start_delay) { 931 NFC_HDR* p_msg; 932 uint16_t size; 933 uint8_t* p; 934 935 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("data_len:%d", data_len); 936 937 /* Validate parameters */ 938 if ((data_len == 0) || (p_raw_data == NULL)) 939 return (NFA_STATUS_INVALID_PARAM); 940 941 size = NFC_HDR_SIZE + NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE + data_len; 942 p_msg = (NFC_HDR*)GKI_getbuf(size); 943 if (p_msg != NULL) { 944 p_msg->event = NFA_DM_API_RAW_FRAME_EVT; 945 p_msg->layer_specific = presence_check_start_delay; 946 p_msg->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 947 p_msg->len = data_len; 948 949 p = (uint8_t*)(p_msg + 1) + p_msg->offset; 950 memcpy(p, p_raw_data, data_len); 951 952 nfa_sys_sendmsg(p_msg); 953 954 return (NFA_STATUS_OK); 955 } 956 957 return (NFA_STATUS_FAILED); 958 } 959 960 /******************************************************************************* 961 ** NDEF Handler APIs 962 *******************************************************************************/ 963 964 /******************************************************************************* 965 ** 966 ** Function NFA_RegisterNDefTypeHandler 967 ** 968 ** Description This function allows the applications to register for 969 ** specific types of NDEF records. When NDEF records are 970 ** received, NFA will parse the record-type field, and pass 971 ** the record to the registered tNFA_NDEF_CBACK. 972 ** 973 ** For records types which were not registered, the record will 974 ** be sent to the default handler. A default type-handler may 975 ** be registered by calling this NFA_RegisterNDefTypeHandler 976 ** with tnf=NFA_TNF_DEFAULT. In this case, all un-registered 977 ** record types will be sent to the callback. Only one default 978 ** handler may be registered at a time. 979 ** 980 ** An NFA_NDEF_REGISTER_EVT will be sent to the tNFA_NDEF_CBACK 981 ** to indicate that registration was successful, and provide a 982 ** handle for this record type. 983 ** 984 ** Returns NFA_STATUS_OK if successfully initiated 985 ** NFA_STATUS_FAILED otherwise 986 ** 987 *******************************************************************************/ 988 tNFA_STATUS NFA_RegisterNDefTypeHandler(bool handle_whole_message, tNFA_TNF tnf, 989 uint8_t* p_type_name, 990 uint8_t type_name_len, 991 tNFA_NDEF_CBACK* p_ndef_cback) { 992 tNFA_DM_API_REG_NDEF_HDLR* p_msg; 993 994 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 995 "handle whole ndef message: %i, " 996 "tnf=0x%02x", 997 handle_whole_message, tnf); 998 999 /* Check for NULL callback */ 1000 if (!p_ndef_cback) { 1001 LOG(ERROR) << StringPrintf("error - null callback"); 1002 return (NFA_STATUS_INVALID_PARAM); 1003 } 1004 1005 p_msg = (tNFA_DM_API_REG_NDEF_HDLR*)GKI_getbuf( 1006 (uint16_t)(sizeof(tNFA_DM_API_REG_NDEF_HDLR) + type_name_len)); 1007 if (p_msg != NULL) { 1008 p_msg->hdr.event = NFA_DM_API_REG_NDEF_HDLR_EVT; 1009 1010 p_msg->flags = 1011 (handle_whole_message ? NFA_NDEF_FLAGS_HANDLE_WHOLE_MESSAGE : 0); 1012 p_msg->tnf = tnf; 1013 p_msg->name_len = type_name_len; 1014 p_msg->p_ndef_cback = p_ndef_cback; 1015 memcpy(p_msg->name, p_type_name, type_name_len); 1016 1017 nfa_sys_sendmsg(p_msg); 1018 1019 return (NFA_STATUS_OK); 1020 } 1021 1022 return (NFA_STATUS_FAILED); 1023 } 1024 1025 /******************************************************************************* 1026 ** 1027 ** Function NFA_RegisterNDefUriHandler 1028 ** 1029 ** Description This API is a special-case of NFA_RegisterNDefTypeHandler 1030 ** with TNF=NFA_TNF_WKT, and type_name='U' (URI record); and 1031 ** allows registering for specific URI types (e.g. 'tel:' or 1032 ** 'mailto:'). 1033 ** 1034 ** An NFA_NDEF_REGISTER_EVT will be sent to the tNFA_NDEF_CBACK 1035 ** to indicate that registration was successful, and provide a 1036 ** handle for this registration. 1037 ** 1038 ** If uri_id=NFA_NDEF_URI_ID_ABSOLUTE, then p_abs_uri contains 1039 ** the unabridged URI. For all other uri_id values, 1040 ** the p_abs_uri parameter is ignored (i.e the URI prefix is 1041 ** implied by uri_id). See [NFC RTD URI] for more information. 1042 ** 1043 ** Returns NFA_STATUS_OK if successfully initiated 1044 ** NFA_STATUS_FAILED otherwise 1045 ** 1046 *******************************************************************************/ 1047 extern tNFA_STATUS NFA_RegisterNDefUriHandler(bool handle_whole_message, 1048 tNFA_NDEF_URI_ID uri_id, 1049 uint8_t* p_abs_uri, 1050 uint8_t uri_id_len, 1051 tNFA_NDEF_CBACK* p_ndef_cback) { 1052 tNFA_DM_API_REG_NDEF_HDLR* p_msg; 1053 1054 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 1055 "handle whole ndef message: %i, " 1056 "uri_id=0x%02x", 1057 handle_whole_message, uri_id); 1058 1059 /* Check for NULL callback */ 1060 if (!p_ndef_cback) { 1061 LOG(ERROR) << StringPrintf("error - null callback"); 1062 return (NFA_STATUS_INVALID_PARAM); 1063 } 1064 1065 p_msg = (tNFA_DM_API_REG_NDEF_HDLR*)GKI_getbuf( 1066 (uint16_t)(sizeof(tNFA_DM_API_REG_NDEF_HDLR) + uri_id_len)); 1067 if (p_msg != NULL) { 1068 p_msg->hdr.event = NFA_DM_API_REG_NDEF_HDLR_EVT; 1069 1070 p_msg->flags = NFA_NDEF_FLAGS_WKT_URI; 1071 1072 if (handle_whole_message) { 1073 p_msg->flags |= NFA_NDEF_FLAGS_HANDLE_WHOLE_MESSAGE; 1074 } 1075 1076 /* abs_uri is only valid fir uri_id=NFA_NDEF_URI_ID_ABSOLUTE */ 1077 if (uri_id != NFA_NDEF_URI_ID_ABSOLUTE) { 1078 uri_id_len = 0; 1079 } 1080 1081 p_msg->tnf = NFA_TNF_WKT; 1082 p_msg->uri_id = uri_id; 1083 p_msg->name_len = uri_id_len; 1084 p_msg->p_ndef_cback = p_ndef_cback; 1085 memcpy(p_msg->name, p_abs_uri, uri_id_len); 1086 1087 nfa_sys_sendmsg(p_msg); 1088 1089 return (NFA_STATUS_OK); 1090 } 1091 1092 return (NFA_STATUS_FAILED); 1093 } 1094 1095 /******************************************************************************* 1096 ** 1097 ** Function NFA_DeregisterNDefTypeHandler 1098 ** 1099 ** Description Deregister NDEF record type handler. 1100 ** 1101 ** Returns NFA_STATUS_OK if successfully initiated 1102 ** NFA_STATUS_FAILED otherwise 1103 ** 1104 *******************************************************************************/ 1105 extern tNFA_STATUS NFA_DeregisterNDefTypeHandler(tNFA_HANDLE ndef_type_handle) { 1106 tNFA_DM_API_DEREG_NDEF_HDLR* p_msg; 1107 1108 DLOG_IF(INFO, nfc_debug_enabled) 1109 << StringPrintf("handle 0x%08x", ndef_type_handle); 1110 1111 p_msg = (tNFA_DM_API_DEREG_NDEF_HDLR*)GKI_getbuf( 1112 (uint16_t)(sizeof(tNFA_DM_API_DEREG_NDEF_HDLR))); 1113 if (p_msg != NULL) { 1114 p_msg->hdr.event = NFA_DM_API_DEREG_NDEF_HDLR_EVT; 1115 p_msg->ndef_type_handle = ndef_type_handle; 1116 1117 nfa_sys_sendmsg(p_msg); 1118 1119 return (NFA_STATUS_OK); 1120 } 1121 1122 return (NFA_STATUS_FAILED); 1123 } 1124 1125 /******************************************************************************* 1126 ** 1127 ** Function NFA_PowerOffSleepMode 1128 ** 1129 ** Description This function is called to enter or leave NFCC Power Off 1130 ** Sleep mode NFA_DM_PWR_MODE_CHANGE_EVT will be sent to 1131 ** indicate status. 1132 ** 1133 ** start_stop : TRUE if entering Power Off Sleep mode 1134 ** FALSE if leaving Power Off Sleep mode 1135 ** 1136 ** Returns NFA_STATUS_OK if successfully initiated 1137 ** NFA_STATUS_FAILED otherwise 1138 ** 1139 *******************************************************************************/ 1140 tNFA_STATUS NFA_PowerOffSleepMode(bool start_stop) { 1141 NFC_HDR* p_msg; 1142 1143 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("start_stop=%d", start_stop); 1144 1145 if (nfa_dm_cb.flags & NFA_DM_FLAGS_SETTING_PWR_MODE) { 1146 LOG(ERROR) << StringPrintf("NFA DM is busy to update power mode"); 1147 return (NFA_STATUS_FAILED); 1148 } else { 1149 nfa_dm_cb.flags |= NFA_DM_FLAGS_SETTING_PWR_MODE; 1150 } 1151 1152 p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR)); 1153 if (p_msg != NULL) { 1154 p_msg->event = NFA_DM_API_POWER_OFF_SLEEP_EVT; 1155 p_msg->layer_specific = start_stop; 1156 1157 nfa_sys_sendmsg(p_msg); 1158 1159 return (NFA_STATUS_OK); 1160 } 1161 1162 return (NFA_STATUS_FAILED); 1163 } 1164 1165 /******************************************************************************* 1166 ** 1167 ** Function NFA_RegVSCback 1168 ** 1169 ** Description This function is called to register or de-register a 1170 ** callback function to receive Proprietary NCI response and 1171 ** notification events. The maximum number of callback 1172 ** functions allowed is NFC_NUM_VS_CBACKS 1173 ** 1174 ** Returns tNFC_STATUS 1175 ** 1176 *******************************************************************************/ 1177 tNFC_STATUS NFA_RegVSCback(bool is_register, tNFA_VSC_CBACK* p_cback) { 1178 tNFA_DM_API_REG_VSC* p_msg; 1179 1180 DLOG_IF(INFO, nfc_debug_enabled) 1181 << StringPrintf("is_register=%d", is_register); 1182 1183 if (p_cback == NULL) { 1184 LOG(ERROR) << StringPrintf("requires a valid callback function"); 1185 return (NFA_STATUS_FAILED); 1186 } 1187 1188 p_msg = (tNFA_DM_API_REG_VSC*)GKI_getbuf(sizeof(tNFA_DM_API_REG_VSC)); 1189 if (p_msg != NULL) { 1190 p_msg->hdr.event = NFA_DM_API_REG_VSC_EVT; 1191 p_msg->is_register = is_register; 1192 p_msg->p_cback = p_cback; 1193 1194 nfa_sys_sendmsg(p_msg); 1195 1196 return (NFA_STATUS_OK); 1197 } 1198 1199 return (NFA_STATUS_FAILED); 1200 } 1201 1202 /******************************************************************************* 1203 ** 1204 ** Function NFA_SendVsCommand 1205 ** 1206 ** Description This function is called to send an NCI Vendor Specific 1207 ** command to NFCC. 1208 ** 1209 ** oid - The opcode of the VS command. 1210 ** cmd_params_len - The command parameter len 1211 ** p_cmd_params - The command parameter 1212 ** p_cback - The callback function to receive the 1213 ** command status 1214 ** 1215 ** Returns NFA_STATUS_OK if successfully initiated 1216 ** NFA_STATUS_FAILED otherwise 1217 ** 1218 *******************************************************************************/ 1219 tNFA_STATUS NFA_SendVsCommand(uint8_t oid, uint8_t cmd_params_len, 1220 uint8_t* p_cmd_params, tNFA_VSC_CBACK* p_cback) { 1221 tNFA_DM_API_SEND_VSC* p_msg; 1222 uint16_t size = sizeof(tNFA_DM_API_SEND_VSC) + cmd_params_len; 1223 1224 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("oid=0x%x", oid); 1225 1226 p_msg = (tNFA_DM_API_SEND_VSC*)GKI_getbuf(size); 1227 if (p_msg != NULL) { 1228 p_msg->hdr.event = NFA_DM_API_SEND_VSC_EVT; 1229 p_msg->oid = oid; 1230 p_msg->p_cback = p_cback; 1231 if (cmd_params_len && p_cmd_params) { 1232 p_msg->cmd_params_len = cmd_params_len; 1233 p_msg->p_cmd_params = (uint8_t*)(p_msg + 1); 1234 memcpy(p_msg->p_cmd_params, p_cmd_params, cmd_params_len); 1235 } else { 1236 p_msg->cmd_params_len = 0; 1237 p_msg->p_cmd_params = NULL; 1238 } 1239 1240 nfa_sys_sendmsg(p_msg); 1241 1242 return (NFA_STATUS_OK); 1243 } 1244 1245 return (NFA_STATUS_FAILED); 1246 } 1247 1248 /******************************************************************************* 1249 ** 1250 ** Function NFA_SendRawVsCommand 1251 ** 1252 ** Description This function is called to send raw Vendor Specific 1253 ** command to NFCC. 1254 ** 1255 ** cmd_params_len - The command parameter len 1256 ** p_cmd_params - The command parameter 1257 ** p_cback - The callback function to receive the 1258 ** command 1259 ** 1260 ** Returns NFA_STATUS_OK if successfully initiated 1261 ** NFA_STATUS_FAILED otherwise 1262 ** 1263 *******************************************************************************/ 1264 tNFA_STATUS NFA_SendRawVsCommand(uint8_t cmd_params_len, uint8_t* p_cmd_params, 1265 tNFA_VSC_CBACK* p_cback) { 1266 if (cmd_params_len == 0x00 || p_cmd_params == NULL || p_cback == NULL) { 1267 return NFA_STATUS_INVALID_PARAM; 1268 } 1269 uint16_t size = sizeof(tNFA_DM_API_SEND_VSC) + cmd_params_len; 1270 tNFA_DM_API_SEND_VSC* p_msg = (tNFA_DM_API_SEND_VSC*)GKI_getbuf(size); 1271 1272 if (p_msg != NULL) { 1273 p_msg->hdr.event = NFA_DM_API_SEND_RAW_VS_EVT; 1274 p_msg->p_cback = p_cback; 1275 if (cmd_params_len && p_cmd_params) { 1276 p_msg->cmd_params_len = cmd_params_len; 1277 p_msg->p_cmd_params = (uint8_t*)(p_msg + 1); 1278 memcpy(p_msg->p_cmd_params, p_cmd_params, cmd_params_len); 1279 } else { 1280 p_msg->cmd_params_len = 0; 1281 p_msg->p_cmd_params = NULL; 1282 } 1283 1284 nfa_sys_sendmsg(p_msg); 1285 1286 return NFA_STATUS_OK; 1287 } 1288 1289 return NFA_STATUS_FAILED; 1290 } 1291 1292 /******************************************************************************* 1293 ** 1294 ** Function: NFA_EnableDtamode 1295 ** 1296 ** Description: Enable DTA Mode 1297 ** 1298 ** Returns: none: 1299 ** 1300 *******************************************************************************/ 1301 void NFA_EnableDtamode(tNFA_eDtaModes eDtaMode) { 1302 DLOG_IF(INFO, nfc_debug_enabled) 1303 << StringPrintf("%s: 0x%x ", __func__, eDtaMode); 1304 appl_dta_mode_flag = 0x01; 1305 nfa_dm_cb.eDtaMode = eDtaMode; 1306 } 1307