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