1 /****************************************************************************** 2 * 3 * Copyright (C) 2010-2014 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19 /****************************************************************************** 20 * 21 * This file contains functions that interface with the NFC NCI transport. 22 * On the receive side, it routes events to the appropriate handler 23 * (callback). On the transmit side, it manages the command transmission. 24 * 25 ******************************************************************************/ 26 #include <string.h> 27 #include "bt_types.h" 28 #include "gki.h" 29 #include "nfc_target.h" 30 31 #include "ce_int.h" 32 #include "nci_hmsgs.h" 33 #include "nfc_api.h" 34 #include "nfc_hal_api.h" 35 #include "nfc_int.h" 36 #include "rw_int.h" 37 38 #if (NFC_RW_ONLY == FALSE) 39 #include "ce_api.h" 40 #include "ce_int.h" 41 #include "llcp_int.h" 42 43 /* NFC mandates support for at least one logical connection; 44 * Update max_conn to the NFCC capability on InitRsp */ 45 #define NFC_SET_MAX_CONN_DEFAULT() \ 46 { nfc_cb.max_conn = 1; } 47 48 #else /* NFC_RW_ONLY */ 49 #define ce_init() 50 #define llcp_init() 51 52 #define NFC_SET_MAX_CONN_DEFAULT() 53 54 #endif /* NFC_RW_ONLY */ 55 /**************************************************************************** 56 ** Declarations 57 ****************************************************************************/ 58 tNFC_CB nfc_cb; 59 60 #if (NFC_RW_ONLY == FALSE) 61 #define NFC_NUM_INTERFACE_MAP 2 62 #else 63 #define NFC_NUM_INTERFACE_MAP 1 64 #endif 65 66 static const tNCI_DISCOVER_MAPS nfc_interface_mapping[NFC_NUM_INTERFACE_MAP] = { 67 /* Protocols that use Frame Interface do not need to be included in the 68 interface mapping */ 69 {NCI_PROTOCOL_ISO_DEP, NCI_INTERFACE_MODE_POLL_N_LISTEN, 70 NCI_INTERFACE_ISO_DEP} 71 #if (NFC_RW_ONLY == FALSE) 72 , 73 /* this can not be set here due to 2079xB0 NFCC issues */ 74 {NCI_PROTOCOL_NFC_DEP, NCI_INTERFACE_MODE_POLL_N_LISTEN, 75 NCI_INTERFACE_NFC_DEP} 76 #endif 77 }; 78 79 #if (BT_TRACE_VERBOSE == TRUE) 80 /******************************************************************************* 81 ** 82 ** Function nfc_state_name 83 ** 84 ** Description This function returns the state name. 85 ** 86 ** NOTE conditionally compiled to save memory. 87 ** 88 ** Returns pointer to the name 89 ** 90 *******************************************************************************/ 91 static char* nfc_state_name(uint8_t state) { 92 switch (state) { 93 case NFC_STATE_NONE: 94 return ("NONE"); 95 case NFC_STATE_W4_HAL_OPEN: 96 return ("W4_HAL_OPEN"); 97 case NFC_STATE_CORE_INIT: 98 return ("CORE_INIT"); 99 case NFC_STATE_W4_POST_INIT_CPLT: 100 return ("W4_POST_INIT_CPLT"); 101 case NFC_STATE_IDLE: 102 return ("IDLE"); 103 case NFC_STATE_OPEN: 104 return ("OPEN"); 105 case NFC_STATE_CLOSING: 106 return ("CLOSING"); 107 case NFC_STATE_W4_HAL_CLOSE: 108 return ("W4_HAL_CLOSE"); 109 case NFC_STATE_NFCC_POWER_OFF_SLEEP: 110 return ("NFCC_POWER_OFF_SLEEP"); 111 default: 112 return ("???? UNKNOWN STATE"); 113 } 114 } 115 116 /******************************************************************************* 117 ** 118 ** Function nfc_hal_event_name 119 ** 120 ** Description This function returns the HAL event name. 121 ** 122 ** NOTE conditionally compiled to save memory. 123 ** 124 ** Returns pointer to the name 125 ** 126 *******************************************************************************/ 127 static char* nfc_hal_event_name(uint8_t event) { 128 switch (event) { 129 case HAL_NFC_OPEN_CPLT_EVT: 130 return ("HAL_NFC_OPEN_CPLT_EVT"); 131 132 case HAL_NFC_CLOSE_CPLT_EVT: 133 return ("HAL_NFC_CLOSE_CPLT_EVT"); 134 135 case HAL_NFC_POST_INIT_CPLT_EVT: 136 return ("HAL_NFC_POST_INIT_CPLT_EVT"); 137 138 case HAL_NFC_PRE_DISCOVER_CPLT_EVT: 139 return ("HAL_NFC_PRE_DISCOVER_CPLT_EVT"); 140 141 case HAL_NFC_REQUEST_CONTROL_EVT: 142 return ("HAL_NFC_REQUEST_CONTROL_EVT"); 143 144 case HAL_NFC_RELEASE_CONTROL_EVT: 145 return ("HAL_NFC_RELEASE_CONTROL_EVT"); 146 147 case HAL_NFC_ERROR_EVT: 148 return ("HAL_NFC_ERROR_EVT"); 149 150 default: 151 return ("???? UNKNOWN EVENT"); 152 } 153 } 154 #endif /* BT_TRACE_VERBOSE == TRUE */ 155 156 /******************************************************************************* 157 ** 158 ** Function nfc_main_notify_enable_status 159 ** 160 ** Description Notify status of Enable/PowerOffSleep/PowerCycle 161 ** 162 *******************************************************************************/ 163 static void nfc_main_notify_enable_status(tNFC_STATUS nfc_status) { 164 tNFC_RESPONSE evt_data; 165 166 evt_data.status = nfc_status; 167 168 if (nfc_cb.p_resp_cback) { 169 /* if getting out of PowerOffSleep mode or restarting NFCC */ 170 if (nfc_cb.flags & (NFC_FL_RESTARTING | NFC_FL_POWER_CYCLE_NFCC)) { 171 nfc_cb.flags &= ~(NFC_FL_RESTARTING | NFC_FL_POWER_CYCLE_NFCC); 172 if (nfc_status != NFC_STATUS_OK) { 173 nfc_cb.flags |= NFC_FL_POWER_OFF_SLEEP; 174 } 175 (*nfc_cb.p_resp_cback)(NFC_NFCC_RESTART_REVT, &evt_data); 176 } else { 177 (*nfc_cb.p_resp_cback)(NFC_ENABLE_REVT, &evt_data); 178 } 179 } 180 } 181 182 /******************************************************************************* 183 ** 184 ** Function nfc_enabled 185 ** 186 ** Description NFCC enabled, proceed with stack start up. 187 ** 188 ** Returns void 189 ** 190 *******************************************************************************/ 191 void nfc_enabled(tNFC_STATUS nfc_status, NFC_HDR* p_init_rsp_msg) { 192 tNFC_RESPONSE evt_data; 193 tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID]; 194 uint8_t* p; 195 uint8_t num_interfaces = 0, xx; 196 uint8_t num_interface_extensions = 0, zz; 197 uint8_t interface_type; 198 int yy = 0; 199 memset(&evt_data, 0, sizeof(tNFC_RESPONSE)); 200 201 if (nfc_status == NCI_STATUS_OK) { 202 nfc_set_state(NFC_STATE_IDLE); 203 204 p = (uint8_t*)(p_init_rsp_msg + 1) + p_init_rsp_msg->offset + 205 NCI_MSG_HDR_SIZE + 1; 206 /* we currently only support NCI of the same version. 207 * We may need to change this, when we support multiple version of NFCC */ 208 209 evt_data.enable.nci_version = nfc_cb.nci_version; 210 STREAM_TO_UINT32(evt_data.enable.nci_features, p); 211 if (nfc_cb.nci_version == NCI_VERSION_1_0) { 212 STREAM_TO_UINT8(num_interfaces, p); 213 evt_data.enable.nci_interfaces = 0; 214 for (xx = 0; xx < num_interfaces; xx++) { 215 if ((*p) <= NCI_INTERFACE_MAX) 216 evt_data.enable.nci_interfaces |= (1 << (*p)); 217 else if (((*p) >= NCI_INTERFACE_FIRST_VS) && 218 (yy < NFC_NFCC_MAX_NUM_VS_INTERFACE)) { 219 /* save the VS RF interface in control block, if there's still room */ 220 nfc_cb.vs_interface[yy++] = *p; 221 } 222 p++; 223 } 224 nfc_cb.nci_interfaces = evt_data.enable.nci_interfaces; 225 memcpy(evt_data.enable.vs_interface, nfc_cb.vs_interface, 226 NFC_NFCC_MAX_NUM_VS_INTERFACE); 227 } 228 evt_data.enable.max_conn = *p++; 229 STREAM_TO_UINT16(evt_data.enable.max_ce_table, p); 230 #if (NFC_RW_ONLY == FALSE) 231 nfc_cb.max_ce_table = evt_data.enable.max_ce_table; 232 nfc_cb.nci_features = evt_data.enable.nci_features; 233 nfc_cb.max_conn = evt_data.enable.max_conn; 234 #endif 235 nfc_cb.nci_ctrl_size = *p++; /* Max Control Packet Payload Length */ 236 p_cb->init_credits = p_cb->num_buff = 0; 237 nfc_set_conn_id(p_cb, NFC_RF_CONN_ID); 238 if (nfc_cb.nci_version == NCI_VERSION_2_0) { 239 evt_data.enable.hci_packet_size = *p++; 240 evt_data.enable.hci_conn_credits = *p++; 241 STREAM_TO_UINT16(evt_data.enable.max_nfc_v_size, p); 242 STREAM_TO_UINT8(num_interfaces, p); 243 #if (NFC_RW_ONLY == FALSE) 244 nfc_cb.hci_packet_size = evt_data.enable.hci_packet_size; 245 nfc_cb.hci_conn_credits = evt_data.enable.hci_conn_credits; 246 nfc_cb.nci_max_v_size = evt_data.enable.max_nfc_v_size; 247 #endif 248 evt_data.enable.nci_interfaces = 0; 249 250 for (xx = 0; xx < num_interfaces; xx++) { 251 if ((*p) <= NCI_INTERFACE_MAX) 252 evt_data.enable.nci_interfaces |= (1 << (*p)); 253 else if (((*p) >= NCI_INTERFACE_FIRST_VS) && 254 (yy < NFC_NFCC_MAX_NUM_VS_INTERFACE)) { 255 /* save the VS RF interface in control block, if there's still room */ 256 nfc_cb.vs_interface[yy++] = *p; 257 } 258 interface_type = *p++; 259 num_interface_extensions = *p++; 260 for (zz = 0; zz < num_interface_extensions; zz++) { 261 if (((*p) < NCI_INTERFACE_EXTENSION_MAX) && 262 (interface_type <= NCI_INTERFACE_MAX)) { 263 nfc_cb.nci_intf_extensions |= (1 << (*p)); 264 nfc_cb.nci_intf_extension_map[*p] = (1 << interface_type); 265 } 266 p++; 267 } 268 } 269 270 nfc_cb.nci_interfaces = evt_data.enable.nci_interfaces; 271 memcpy(evt_data.enable.vs_interface, nfc_cb.vs_interface, 272 NFC_NFCC_MAX_NUM_VS_INTERFACE); 273 } else { 274 STREAM_TO_UINT16(evt_data.enable.max_param_size, p); 275 evt_data.enable.manufacture_id = *p++; 276 STREAM_TO_ARRAY(evt_data.enable.nfcc_info, p, NFC_NFCC_INFO_LEN); 277 } 278 NFC_DiscoveryMap(nfc_cb.num_disc_maps, 279 (tNCI_DISCOVER_MAPS*)nfc_cb.p_disc_maps, NULL); 280 } 281 /* else not successful. the buffers will be freed in nfc_free_conn_cb () */ 282 else { 283 if (nfc_cb.flags & NFC_FL_RESTARTING) { 284 nfc_set_state(NFC_STATE_NFCC_POWER_OFF_SLEEP); 285 } else { 286 nfc_free_conn_cb(p_cb); 287 288 /* if NFCC didn't respond to CORE_RESET or CORE_INIT */ 289 if (nfc_cb.nfc_state == NFC_STATE_CORE_INIT) { 290 /* report status after closing HAL */ 291 nfc_cb.p_hal->close(); 292 return; 293 } else 294 nfc_set_state(NFC_STATE_NONE); 295 } 296 } 297 298 nfc_main_notify_enable_status(nfc_status); 299 } 300 301 /******************************************************************************* 302 ** 303 ** Function nfc_set_state 304 ** 305 ** Description Set the state of NFC stack 306 ** 307 ** Returns void 308 ** 309 *******************************************************************************/ 310 void nfc_set_state(tNFC_STATE nfc_state) { 311 #if (BT_TRACE_VERBOSE == TRUE) 312 NFC_TRACE_DEBUG4("nfc_set_state %d (%s)->%d (%s)", nfc_cb.nfc_state, 313 nfc_state_name(nfc_cb.nfc_state), nfc_state, 314 nfc_state_name(nfc_state)); 315 #else 316 NFC_TRACE_DEBUG2("nfc_set_state %d->%d", nfc_cb.nfc_state, nfc_state); 317 #endif 318 nfc_cb.nfc_state = nfc_state; 319 } 320 321 /******************************************************************************* 322 ** 323 ** Function nfc_gen_cleanup 324 ** 325 ** Description Clean up for both going into low power mode and disabling 326 ** NFC 327 ** 328 *******************************************************************************/ 329 void nfc_gen_cleanup(void) { 330 nfc_cb.flags &= ~NFC_FL_DEACTIVATING; 331 332 /* the HAL pre-discover is still active - clear the pending flag/free the 333 * buffer */ 334 if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING) { 335 nfc_cb.flags &= ~NFC_FL_DISCOVER_PENDING; 336 GKI_freebuf(nfc_cb.p_disc_pending); 337 nfc_cb.p_disc_pending = NULL; 338 } 339 340 nfc_cb.flags &= ~(NFC_FL_CONTROL_REQUESTED | NFC_FL_CONTROL_GRANTED | 341 NFC_FL_HAL_REQUESTED); 342 343 nfc_stop_timer(&nfc_cb.deactivate_timer); 344 345 /* Reset the connection control blocks */ 346 nfc_reset_all_conn_cbs(); 347 348 if (nfc_cb.p_nci_init_rsp) { 349 GKI_freebuf(nfc_cb.p_nci_init_rsp); 350 nfc_cb.p_nci_init_rsp = NULL; 351 } 352 353 /* clear any pending CMD/RSP */ 354 nfc_main_flush_cmd_queue(); 355 } 356 357 /******************************************************************************* 358 ** 359 ** Function nfc_main_handle_hal_evt 360 ** 361 ** Description Handle BT_EVT_TO_NFC_MSGS 362 ** 363 *******************************************************************************/ 364 void nfc_main_handle_hal_evt(tNFC_HAL_EVT_MSG* p_msg) { 365 uint8_t* ps; 366 367 NFC_TRACE_DEBUG1("nfc_main_handle_hal_evt(): HAL event=0x%x", p_msg->hal_evt); 368 369 switch (p_msg->hal_evt) { 370 case HAL_NFC_OPEN_CPLT_EVT: /* only for failure case */ 371 nfc_enabled(NFC_STATUS_FAILED, NULL); 372 break; 373 374 case HAL_NFC_CLOSE_CPLT_EVT: 375 if (nfc_cb.p_resp_cback) { 376 if (nfc_cb.nfc_state == NFC_STATE_W4_HAL_CLOSE) { 377 if (nfc_cb.flags & NFC_FL_POWER_OFF_SLEEP) { 378 nfc_cb.flags &= ~NFC_FL_POWER_OFF_SLEEP; 379 nfc_set_state(NFC_STATE_NFCC_POWER_OFF_SLEEP); 380 (*nfc_cb.p_resp_cback)(NFC_NFCC_POWER_OFF_REVT, NULL); 381 } else { 382 nfc_set_state(NFC_STATE_NONE); 383 (*nfc_cb.p_resp_cback)(NFC_DISABLE_REVT, NULL); 384 nfc_cb.p_resp_cback = NULL; 385 } 386 } else { 387 /* found error during initialization */ 388 nfc_set_state(NFC_STATE_NONE); 389 nfc_main_notify_enable_status(NFC_STATUS_FAILED); 390 } 391 } 392 break; 393 394 case HAL_NFC_POST_INIT_CPLT_EVT: 395 if (nfc_cb.p_nci_init_rsp) { 396 /* 397 ** if NFC_Disable() is called before receiving 398 ** HAL_NFC_POST_INIT_CPLT_EVT, then wait for HAL_NFC_CLOSE_CPLT_EVT. 399 */ 400 if (nfc_cb.nfc_state == NFC_STATE_W4_POST_INIT_CPLT) { 401 if (p_msg->status == HAL_NFC_STATUS_OK) { 402 nfc_enabled(NCI_STATUS_OK, nfc_cb.p_nci_init_rsp); 403 } else /* if post initailization failed */ 404 { 405 nfc_enabled(NCI_STATUS_FAILED, NULL); 406 } 407 } 408 409 GKI_freebuf(nfc_cb.p_nci_init_rsp); 410 nfc_cb.p_nci_init_rsp = NULL; 411 } 412 break; 413 414 case HAL_NFC_PRE_DISCOVER_CPLT_EVT: 415 /* restore the command window, no matter if the discover command is still 416 * pending */ 417 nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW; 418 nfc_cb.flags &= ~NFC_FL_CONTROL_GRANTED; 419 if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING) { 420 /* issue the discovery command now, if it is still pending */ 421 nfc_cb.flags &= ~NFC_FL_DISCOVER_PENDING; 422 ps = (uint8_t*)nfc_cb.p_disc_pending; 423 nci_snd_discover_cmd(*ps, (tNFC_DISCOVER_PARAMS*)(ps + 1)); 424 GKI_freebuf(nfc_cb.p_disc_pending); 425 nfc_cb.p_disc_pending = NULL; 426 } else { 427 /* check if there's other pending commands */ 428 nfc_ncif_check_cmd_queue(NULL); 429 } 430 431 if (p_msg->status == HAL_NFC_STATUS_ERR_CMD_TIMEOUT) 432 nfc_ncif_event_status(NFC_NFCC_TIMEOUT_REVT, NFC_STATUS_HW_TIMEOUT); 433 break; 434 435 case HAL_NFC_REQUEST_CONTROL_EVT: 436 nfc_cb.flags |= NFC_FL_CONTROL_REQUESTED; 437 nfc_cb.flags |= NFC_FL_HAL_REQUESTED; 438 nfc_ncif_check_cmd_queue(NULL); 439 break; 440 441 case HAL_NFC_RELEASE_CONTROL_EVT: 442 if (nfc_cb.flags & NFC_FL_CONTROL_GRANTED) { 443 nfc_cb.flags &= ~NFC_FL_CONTROL_GRANTED; 444 nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW; 445 nfc_ncif_check_cmd_queue(NULL); 446 447 if (p_msg->status == HAL_NFC_STATUS_ERR_CMD_TIMEOUT) 448 nfc_ncif_event_status(NFC_NFCC_TIMEOUT_REVT, NFC_STATUS_HW_TIMEOUT); 449 } 450 break; 451 452 case HAL_NFC_ERROR_EVT: 453 switch (p_msg->status) { 454 case HAL_NFC_STATUS_ERR_TRANSPORT: 455 /* Notify app of transport error */ 456 if (nfc_cb.p_resp_cback) { 457 (*nfc_cb.p_resp_cback)(NFC_NFCC_TRANSPORT_ERR_REVT, NULL); 458 459 /* if enabling NFC, notify upper layer of failure after closing HAL 460 */ 461 if (nfc_cb.nfc_state < NFC_STATE_IDLE) { 462 nfc_enabled(NFC_STATUS_FAILED, NULL); 463 } 464 } 465 break; 466 467 case HAL_NFC_STATUS_ERR_CMD_TIMEOUT: 468 nfc_ncif_event_status(NFC_NFCC_TIMEOUT_REVT, NFC_STATUS_HW_TIMEOUT); 469 470 /* if enabling NFC, notify upper layer of failure after closing HAL */ 471 if (nfc_cb.nfc_state < NFC_STATE_IDLE) { 472 nfc_enabled(NFC_STATUS_FAILED, NULL); 473 return; 474 } 475 break; 476 477 default: 478 break; 479 } 480 break; 481 482 default: 483 NFC_TRACE_ERROR1("nfc_main_handle_hal_evt (): unhandled event (0x%x).", 484 p_msg->hal_evt); 485 break; 486 } 487 } 488 489 /******************************************************************************* 490 ** 491 ** Function nfc_main_flush_cmd_queue 492 ** 493 ** Description This function is called when setting power off sleep state. 494 ** 495 ** Returns void 496 ** 497 *******************************************************************************/ 498 void nfc_main_flush_cmd_queue(void) { 499 NFC_HDR* p_msg; 500 501 NFC_TRACE_DEBUG0("nfc_main_flush_cmd_queue ()"); 502 503 /* initialize command window */ 504 nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW; 505 506 /* Stop command-pending timer */ 507 nfc_stop_timer(&nfc_cb.nci_wait_rsp_timer); 508 509 /* dequeue and free buffer */ 510 while ((p_msg = (NFC_HDR*)GKI_dequeue(&nfc_cb.nci_cmd_xmit_q)) != NULL) { 511 GKI_freebuf(p_msg); 512 } 513 } 514 515 /******************************************************************************* 516 ** 517 ** Function nfc_main_post_hal_evt 518 ** 519 ** Description This function posts HAL event to NFC_TASK 520 ** 521 ** Returns void 522 ** 523 *******************************************************************************/ 524 void nfc_main_post_hal_evt(uint8_t hal_evt, tHAL_NFC_STATUS status) { 525 tNFC_HAL_EVT_MSG* p_msg; 526 527 p_msg = (tNFC_HAL_EVT_MSG*)GKI_getbuf(sizeof(tNFC_HAL_EVT_MSG)); 528 if (p_msg != NULL) { 529 /* Initialize NFC_HDR */ 530 p_msg->hdr.len = 0; 531 p_msg->hdr.event = BT_EVT_TO_NFC_MSGS; 532 p_msg->hdr.offset = 0; 533 p_msg->hdr.layer_specific = 0; 534 p_msg->hal_evt = hal_evt; 535 p_msg->status = status; 536 GKI_send_msg(NFC_TASK, NFC_MBOX_ID, p_msg); 537 } else { 538 NFC_TRACE_ERROR0("nfc_main_post_hal_evt (): No buffer"); 539 } 540 } 541 542 /******************************************************************************* 543 ** 544 ** Function nfc_main_hal_cback 545 ** 546 ** Description HAL event handler 547 ** 548 ** Returns void 549 ** 550 *******************************************************************************/ 551 static void nfc_main_hal_cback(uint8_t event, tHAL_NFC_STATUS status) { 552 #if (BT_TRACE_VERBOSE == TRUE) 553 NFC_TRACE_DEBUG3("nfc_main_hal_cback event: %s(0x%x), status=%d", 554 nfc_hal_event_name(event), event, status); 555 #else 556 NFC_TRACE_DEBUG2("nfc_main_hal_cback event: 0x%x, status=%d", event, status); 557 #endif 558 559 switch (event) { 560 case HAL_NFC_OPEN_CPLT_EVT: 561 /* 562 ** if NFC_Disable() is called before receiving HAL_NFC_OPEN_CPLT_EVT, 563 ** then wait for HAL_NFC_CLOSE_CPLT_EVT. 564 */ 565 if (nfc_cb.nfc_state == NFC_STATE_W4_HAL_OPEN) { 566 if (status == HAL_NFC_STATUS_OK) { 567 /* Notify NFC_TASK that NCI tranport is initialized */ 568 GKI_send_event(NFC_TASK, NFC_TASK_EVT_TRANSPORT_READY); 569 } else { 570 nfc_main_post_hal_evt(event, status); 571 } 572 } 573 break; 574 575 case HAL_NFC_CLOSE_CPLT_EVT: 576 case HAL_NFC_POST_INIT_CPLT_EVT: 577 case HAL_NFC_PRE_DISCOVER_CPLT_EVT: 578 case HAL_NFC_REQUEST_CONTROL_EVT: 579 case HAL_NFC_RELEASE_CONTROL_EVT: 580 case HAL_NFC_ERROR_EVT: 581 nfc_main_post_hal_evt(event, status); 582 break; 583 584 default: 585 NFC_TRACE_DEBUG1("nfc_main_hal_cback unhandled event %x", event); 586 break; 587 } 588 } 589 590 /******************************************************************************* 591 ** 592 ** Function nfc_main_hal_data_cback 593 ** 594 ** Description HAL data event handler 595 ** 596 ** Returns void 597 ** 598 *******************************************************************************/ 599 static void nfc_main_hal_data_cback(uint16_t data_len, uint8_t* p_data) { 600 NFC_HDR* p_msg; 601 602 /* ignore all data while shutting down NFCC */ 603 if (nfc_cb.nfc_state == NFC_STATE_W4_HAL_CLOSE) { 604 return; 605 } 606 607 if (p_data) { 608 p_msg = (NFC_HDR*)GKI_getpoolbuf(NFC_NCI_POOL_ID); 609 if (p_msg != NULL) { 610 /* Initialize NFC_HDR */ 611 p_msg->len = data_len; 612 p_msg->event = BT_EVT_TO_NFC_NCI; 613 p_msg->offset = NFC_RECEIVE_MSGS_OFFSET; 614 615 /* no need to check length, it always less than pool size */ 616 memcpy((uint8_t*)(p_msg + 1) + p_msg->offset, p_data, p_msg->len); 617 618 GKI_send_msg(NFC_TASK, NFC_MBOX_ID, p_msg); 619 } else { 620 NFC_TRACE_ERROR0("nfc_main_hal_data_cback (): No buffer"); 621 } 622 } 623 } 624 625 /******************************************************************************* 626 ** 627 ** Function NFC_Enable 628 ** 629 ** Description This function enables NFC. Prior to calling NFC_Enable: 630 ** - the NFCC must be powered up, and ready to receive 631 ** commands. 632 ** - GKI must be enabled 633 ** - NFC_TASK must be started 634 ** - NCIT_TASK must be started (if using dedicated NCI 635 ** transport) 636 ** 637 ** This function opens the NCI transport (if applicable), 638 ** resets the NFC controller, and initializes the NFC 639 ** subsystems. 640 ** 641 ** When the NFC startup procedure is completed, an 642 ** NFC_ENABLE_REVT is returned to the application using the 643 ** tNFC_RESPONSE_CBACK. 644 ** 645 ** Returns tNFC_STATUS 646 ** 647 *******************************************************************************/ 648 tNFC_STATUS NFC_Enable(tNFC_RESPONSE_CBACK* p_cback) { 649 NFC_TRACE_API0("NFC_Enable ()"); 650 651 /* Validate callback */ 652 if (!p_cback) { 653 return (NFC_STATUS_INVALID_PARAM); 654 } 655 nfc_cb.p_resp_cback = p_cback; 656 657 /* Open HAL transport. */ 658 nfc_set_state(NFC_STATE_W4_HAL_OPEN); 659 nfc_cb.p_hal->open(nfc_main_hal_cback, nfc_main_hal_data_cback); 660 661 return (NFC_STATUS_OK); 662 } 663 664 /******************************************************************************* 665 ** 666 ** Function NFC_Disable 667 ** 668 ** Description This function performs clean up routines for shutting down 669 ** NFC and closes the NCI transport (if using dedicated NCI 670 ** transport). 671 ** 672 ** When the NFC shutdown procedure is completed, an 673 ** NFC_DISABLED_REVT is returned to the application using the 674 ** tNFC_RESPONSE_CBACK. 675 ** 676 ** Returns nothing 677 ** 678 *******************************************************************************/ 679 void NFC_Disable(void) { 680 NFC_TRACE_API1("NFC_Disable (): nfc_state = %d", nfc_cb.nfc_state); 681 682 if ((nfc_cb.nfc_state == NFC_STATE_NONE) || 683 (nfc_cb.nfc_state == NFC_STATE_NFCC_POWER_OFF_SLEEP)) { 684 nfc_set_state(NFC_STATE_NONE); 685 if (nfc_cb.p_resp_cback) { 686 (*nfc_cb.p_resp_cback)(NFC_DISABLE_REVT, NULL); 687 nfc_cb.p_resp_cback = NULL; 688 } 689 return; 690 } 691 692 /* Close transport and clean up */ 693 nfc_task_shutdown_nfcc(); 694 } 695 696 /******************************************************************************* 697 ** 698 ** Function NFC_Init 699 ** 700 ** Description This function initializes control block for NFC 701 ** 702 ** Returns nothing 703 ** 704 *******************************************************************************/ 705 void NFC_Init(tHAL_NFC_ENTRY* p_hal_entry_tbl) { 706 int xx; 707 708 /* Clear nfc control block */ 709 memset(&nfc_cb, 0, sizeof(tNFC_CB)); 710 711 /* Reset the nfc control block */ 712 for (xx = 0; xx < NCI_MAX_CONN_CBS; xx++) { 713 nfc_cb.conn_cb[xx].conn_id = NFC_ILLEGAL_CONN_ID; 714 } 715 716 /* NCI init */ 717 nfc_cb.p_hal = p_hal_entry_tbl; 718 nfc_cb.nfc_state = NFC_STATE_NONE; 719 nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW; 720 nfc_cb.nci_wait_rsp_tout = NFC_CMD_CMPL_TIMEOUT; 721 nfc_cb.p_disc_maps = nfc_interface_mapping; 722 nfc_cb.num_disc_maps = NFC_NUM_INTERFACE_MAP; 723 nfc_cb.trace_level = NFC_INITIAL_TRACE_LEVEL; 724 nfc_cb.nci_ctrl_size = NCI_CTRL_INIT_SIZE; 725 nfc_cb.reassembly = true; 726 nfc_cb.nci_version = NCI_VERSION_UNKNOWN; 727 rw_init(); 728 ce_init(); 729 llcp_init(); 730 NFC_SET_MAX_CONN_DEFAULT(); 731 } 732 733 /******************************************************************************* 734 ** 735 ** Function NFC_GetLmrtSize 736 ** 737 ** Description Called by application wto query the Listen Mode Routing 738 ** Table size supported by NFCC 739 ** 740 ** Returns Listen Mode Routing Table size 741 ** 742 *******************************************************************************/ 743 uint16_t NFC_GetLmrtSize(void) { 744 uint16_t size = 0; 745 #if (NFC_RW_ONLY == FALSE) 746 size = nfc_cb.max_ce_table; 747 #endif 748 return size; 749 } 750 751 /******************************************************************************* 752 ** 753 ** Function NFC_SetConfig 754 ** 755 ** Description This function is called to send the configuration parameter 756 ** TLV to NFCC. The response from NFCC is reported by 757 ** tNFC_RESPONSE_CBACK as NFC_SET_CONFIG_REVT. 758 ** 759 ** Parameters tlv_size - the length of p_param_tlvs. 760 ** p_param_tlvs - the parameter ID/Len/Value list 761 ** 762 ** Returns tNFC_STATUS 763 ** 764 *******************************************************************************/ 765 tNFC_STATUS NFC_SetConfig(uint8_t tlv_size, uint8_t* p_param_tlvs) { 766 return nci_snd_core_set_config(p_param_tlvs, tlv_size); 767 } 768 769 /******************************************************************************* 770 ** 771 ** Function NFC_GetConfig 772 ** 773 ** Description This function is called to retrieve the parameter TLV from 774 ** NFCC. The response from NFCC is reported by 775 ** tNFC_RESPONSE_CBACK as NFC_GET_CONFIG_REVT. 776 ** 777 ** Parameters num_ids - the number of parameter IDs 778 ** p_param_ids - the parameter ID list. 779 ** 780 ** Returns tNFC_STATUS 781 ** 782 *******************************************************************************/ 783 tNFC_STATUS NFC_GetConfig(uint8_t num_ids, uint8_t* p_param_ids) { 784 return nci_snd_core_get_config(p_param_ids, num_ids); 785 } 786 787 /******************************************************************************* 788 ** 789 ** Function NFC_DiscoveryMap 790 ** 791 ** Description This function is called to set the discovery interface 792 ** mapping. The response from NFCC is reported by 793 ** tNFC_DISCOVER_CBACK as NFC_MAP_DEVT. 794 ** 795 ** Parameters num - the number of items in p_params. 796 ** p_maps - the discovery interface mappings 797 ** p_cback - the discovery callback function 798 ** 799 ** Returns tNFC_STATUS 800 ** 801 *******************************************************************************/ 802 tNFC_STATUS NFC_DiscoveryMap(uint8_t num, tNFC_DISCOVER_MAPS* p_maps, 803 tNFC_DISCOVER_CBACK* p_cback) { 804 uint8_t num_disc_maps = num; 805 uint8_t xx, yy, num_intf, intf_mask; 806 tNFC_DISCOVER_MAPS 807 max_maps[NFC_NFCC_MAX_NUM_VS_INTERFACE + NCI_INTERFACE_MAX]; 808 bool is_supported; 809 810 nfc_cb.p_discv_cback = p_cback; 811 num_intf = 0; 812 NFC_TRACE_DEBUG1("nci_interfaces supported by NFCC: 0x%x", 813 nfc_cb.nci_interfaces); 814 815 for (xx = 0; xx < NFC_NFCC_MAX_NUM_VS_INTERFACE + NCI_INTERFACE_MAX; xx++) { 816 memset(&max_maps[xx], 0x00, sizeof(tNFC_DISCOVER_MAPS)); 817 } 818 819 for (xx = 0; xx < num_disc_maps; xx++) { 820 is_supported = false; 821 if (p_maps[xx].intf_type > NCI_INTERFACE_MAX) { 822 for (yy = 0; yy < NFC_NFCC_MAX_NUM_VS_INTERFACE; yy++) { 823 if (nfc_cb.vs_interface[yy] == p_maps[xx].intf_type) 824 is_supported = true; 825 } 826 NFC_TRACE_DEBUG3("[%d]: vs intf_type:0x%x is_supported:%d", xx, 827 p_maps[xx].intf_type, is_supported); 828 } else { 829 intf_mask = (1 << (p_maps[xx].intf_type)); 830 if (intf_mask & nfc_cb.nci_interfaces) { 831 is_supported = true; 832 } 833 NFC_TRACE_DEBUG4("[%d]: intf_type:%d intf_mask: 0x%x is_supported:%d", xx, 834 p_maps[xx].intf_type, intf_mask, is_supported); 835 } 836 if (is_supported) 837 memcpy(&max_maps[num_intf++], &p_maps[xx], sizeof(tNFC_DISCOVER_MAPS)); 838 else { 839 NFC_TRACE_WARNING1( 840 "NFC_DiscoveryMap interface=0x%x is not supported by NFCC", 841 p_maps[xx].intf_type); 842 } 843 } 844 845 return nci_snd_discover_map_cmd(num_intf, (tNCI_DISCOVER_MAPS*)max_maps); 846 } 847 848 /******************************************************************************* 849 ** 850 ** Function NFC_DiscoveryStart 851 ** 852 ** Description This function is called to start Polling and/or Listening. 853 ** The response from NFCC is reported by tNFC_DISCOVER_CBACK as 854 ** NFC_START_DEVT. The notification from NFCC is reported by 855 ** tNFC_DISCOVER_CBACK as NFC_RESULT_DEVT. 856 ** 857 ** Parameters num_params - the number of items in p_params. 858 ** p_params - the discovery parameters 859 ** p_cback - the discovery callback function 860 ** 861 ** Returns tNFC_STATUS 862 ** 863 *******************************************************************************/ 864 tNFC_STATUS NFC_DiscoveryStart(uint8_t num_params, 865 tNFC_DISCOVER_PARAMS* p_params, 866 tNFC_DISCOVER_CBACK* p_cback) { 867 uint8_t* p; 868 int params_size; 869 tNFC_STATUS status = NFC_STATUS_NO_BUFFERS; 870 871 NFC_TRACE_API0("NFC_DiscoveryStart"); 872 if (nfc_cb.p_disc_pending) { 873 NFC_TRACE_ERROR0("There's pending NFC_DiscoveryStart"); 874 status = NFC_STATUS_BUSY; 875 } else { 876 nfc_cb.p_discv_cback = p_cback; 877 nfc_cb.flags |= NFC_FL_DISCOVER_PENDING; 878 nfc_cb.flags |= NFC_FL_CONTROL_REQUESTED; 879 params_size = sizeof(tNFC_DISCOVER_PARAMS) * num_params; 880 nfc_cb.p_disc_pending = 881 GKI_getbuf((uint16_t)(NFC_HDR_SIZE + 1 + params_size)); 882 if (nfc_cb.p_disc_pending) { 883 p = (uint8_t*)nfc_cb.p_disc_pending; 884 *p++ = num_params; 885 memcpy(p, p_params, params_size); 886 status = NFC_STATUS_CMD_STARTED; 887 nfc_ncif_check_cmd_queue(NULL); 888 } 889 } 890 891 NFC_TRACE_API1("NFC_DiscoveryStart status: 0x%x", status); 892 return status; 893 } 894 895 /******************************************************************************* 896 ** 897 ** Function NFC_DiscoverySelect 898 ** 899 ** Description If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT, 900 ** the application needs to use this function to select the 901 ** the logical endpoint to continue. The response from NFCC is 902 ** reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT. 903 ** 904 ** Parameters rf_disc_id - The ID identifies the remote device. 905 ** protocol - the logical endpoint on the remote devide 906 ** rf_interface - the RF interface to communicate with NFCC 907 ** 908 ** Returns tNFC_STATUS 909 ** 910 *******************************************************************************/ 911 tNFC_STATUS NFC_DiscoverySelect(uint8_t rf_disc_id, uint8_t protocol, 912 uint8_t rf_interface) { 913 return nci_snd_discover_select_cmd(rf_disc_id, protocol, rf_interface); 914 } 915 916 /******************************************************************************* 917 ** 918 ** Function NFC_ConnCreate 919 ** 920 ** Description This function is called to create a logical connection with 921 ** NFCC for data exchange. 922 ** 923 ** Parameters dest_type - the destination type 924 ** id - the NFCEE ID or RF Discovery ID . 925 ** protocol - the protocol. 926 ** p_cback - the connection callback function 927 ** 928 ** Returns tNFC_STATUS 929 ** 930 *******************************************************************************/ 931 tNFC_STATUS NFC_ConnCreate(uint8_t dest_type, uint8_t id, uint8_t protocol, 932 tNFC_CONN_CBACK* p_cback) { 933 tNFC_STATUS status = NFC_STATUS_FAILED; 934 tNFC_CONN_CB* p_cb; 935 uint8_t num_tlv = 0, tlv_size = 0; 936 uint8_t param_tlvs[4], *pp; 937 938 p_cb = nfc_alloc_conn_cb(p_cback); 939 if (p_cb) { 940 p_cb->id = id; 941 pp = param_tlvs; 942 if (dest_type == NCI_DEST_TYPE_NFCEE) { 943 num_tlv = 1; 944 UINT8_TO_STREAM(pp, NCI_CON_CREATE_TAG_NFCEE_VAL); 945 UINT8_TO_STREAM(pp, 2); 946 UINT8_TO_STREAM(pp, id); 947 UINT8_TO_STREAM(pp, protocol); 948 tlv_size = 4; 949 } else if (dest_type == NCI_DEST_TYPE_REMOTE) { 950 num_tlv = 1; 951 UINT8_TO_STREAM(pp, NCI_CON_CREATE_TAG_RF_DISC_ID); 952 UINT8_TO_STREAM(pp, 1); 953 UINT8_TO_STREAM(pp, id); 954 tlv_size = 3; 955 } else if (dest_type == NCI_DEST_TYPE_NFCC) { 956 p_cb->id = NFC_TEST_ID; 957 } 958 /* Add handling of NCI_DEST_TYPE_REMOTE when more RF interface definitions 959 * are added */ 960 p_cb->act_protocol = protocol; 961 p_cb->p_cback = p_cback; 962 status = nci_snd_core_conn_create(dest_type, num_tlv, tlv_size, param_tlvs); 963 if (status == NFC_STATUS_FAILED) nfc_free_conn_cb(p_cb); 964 } 965 return status; 966 } 967 968 /******************************************************************************* 969 ** 970 ** Function NFC_ConnClose 971 ** 972 ** Description This function is called to close a logical connection with 973 ** NFCC. 974 ** 975 ** Parameters conn_id - the connection id. 976 ** 977 ** Returns tNFC_STATUS 978 ** 979 *******************************************************************************/ 980 tNFC_STATUS NFC_ConnClose(uint8_t conn_id) { 981 tNFC_CONN_CB* p_cb = nfc_find_conn_cb_by_conn_id(conn_id); 982 tNFC_STATUS status = NFC_STATUS_FAILED; 983 984 if (p_cb) { 985 status = nci_snd_core_conn_close(conn_id); 986 } 987 return status; 988 } 989 990 /******************************************************************************* 991 ** 992 ** Function NFC_SetStaticRfCback 993 ** 994 ** Description This function is called to update the data callback function 995 ** to receive the data for the given connection id. 996 ** 997 ** Parameters p_cback - the connection callback function 998 ** 999 ** Returns Nothing 1000 ** 1001 *******************************************************************************/ 1002 void NFC_SetStaticRfCback(tNFC_CONN_CBACK* p_cback) { 1003 tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID]; 1004 1005 p_cb->p_cback = p_cback; 1006 /* just in case DH has received NCI data before the data callback is set 1007 * check if there's any data event to report on this connection id */ 1008 nfc_data_event(p_cb); 1009 } 1010 1011 /******************************************************************************* 1012 ** 1013 ** Function NFC_SetReassemblyFlag 1014 ** 1015 ** Description This function is called to set if nfc will reassemble 1016 ** nci packet as much as its buffer can hold or it should not 1017 ** reassemble but forward the fragmented nci packet to layer 1018 ** above. If nci data pkt is fragmented, nfc may send multiple 1019 ** NFC_DATA_CEVT with status NFC_STATUS_CONTINUE before sending 1020 ** NFC_DATA_CEVT with status NFC_STATUS_OK based on reassembly 1021 ** configuration and reassembly buffer size 1022 ** 1023 ** Parameters reassembly - flag to indicate if nfc may reassemble or not 1024 ** 1025 ** Returns Nothing 1026 ** 1027 *******************************************************************************/ 1028 void NFC_SetReassemblyFlag(bool reassembly) { nfc_cb.reassembly = reassembly; } 1029 1030 /******************************************************************************* 1031 ** 1032 ** Function NFC_SendData 1033 ** 1034 ** Description This function is called to send the given data packet 1035 ** to the connection identified by the given connection id. 1036 ** 1037 ** Parameters conn_id - the connection id. 1038 ** p_data - the data packet. 1039 ** p_data->offset must be >= NCI_MSG_OFFSET_SIZE + 1040 ** NCI_DATA_HDR_SIZE 1041 ** The data payload starts at 1042 ** ((uint8_t *) (p_data + 1) + p_data->offset) 1043 ** 1044 ** Returns tNFC_STATUS 1045 ** 1046 *******************************************************************************/ 1047 tNFC_STATUS NFC_SendData(uint8_t conn_id, NFC_HDR* p_data) { 1048 tNFC_STATUS status = NFC_STATUS_FAILED; 1049 tNFC_CONN_CB* p_cb = nfc_find_conn_cb_by_conn_id(conn_id); 1050 1051 if (p_cb && p_data && 1052 p_data->offset >= NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE) { 1053 status = nfc_ncif_send_data(p_cb, p_data); 1054 } 1055 1056 if (status != NFC_STATUS_OK) GKI_freebuf(p_data); 1057 1058 return status; 1059 } 1060 1061 /******************************************************************************* 1062 ** 1063 ** Function NFC_FlushData 1064 ** 1065 ** Description This function is called to discard the tx data queue of 1066 ** the given connection id. 1067 ** 1068 ** Parameters conn_id - the connection id. 1069 ** 1070 ** Returns tNFC_STATUS 1071 ** 1072 *******************************************************************************/ 1073 tNFC_STATUS NFC_FlushData(uint8_t conn_id) { 1074 tNFC_STATUS status = NFC_STATUS_FAILED; 1075 tNFC_CONN_CB* p_cb = nfc_find_conn_cb_by_conn_id(conn_id); 1076 void* p_buf; 1077 1078 if (p_cb) { 1079 status = NFC_STATUS_OK; 1080 while ((p_buf = GKI_dequeue(&p_cb->tx_q)) != NULL) GKI_freebuf(p_buf); 1081 } 1082 1083 return status; 1084 } 1085 1086 /******************************************************************************* 1087 ** 1088 ** Function NFC_Deactivate 1089 ** 1090 ** Description This function is called to stop the discovery process or 1091 ** put the listen device in sleep mode or terminate the NFC 1092 ** link. 1093 ** 1094 ** The response from NFCC is reported by tNFC_DISCOVER_CBACK 1095 ** as NFC_DEACTIVATE_DEVT. 1096 ** 1097 ** Parameters deactivate_type - NFC_DEACTIVATE_TYPE_IDLE, to IDLE mode. 1098 ** NFC_DEACTIVATE_TYPE_SLEEP to SLEEP mode. 1099 ** NFC_DEACTIVATE_TYPE_SLEEP_AF to SLEEP_AF 1100 ** mode. 1101 ** 1102 ** Returns tNFC_STATUS 1103 ** 1104 *******************************************************************************/ 1105 tNFC_STATUS NFC_Deactivate(tNFC_DEACT_TYPE deactivate_type) { 1106 tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID]; 1107 tNFC_STATUS status = NFC_STATUS_OK; 1108 1109 #if (BT_TRACE_VERBOSE == TRUE) 1110 NFC_TRACE_API3("NFC_Deactivate %d (%s) deactivate_type:%d", nfc_cb.nfc_state, 1111 nfc_state_name(nfc_cb.nfc_state), deactivate_type); 1112 #else 1113 NFC_TRACE_API2("NFC_Deactivate %d deactivate_type:%d", nfc_cb.nfc_state, 1114 deactivate_type); 1115 #endif 1116 1117 if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING) { 1118 /* the HAL pre-discover is still active - clear the pending flag */ 1119 nfc_cb.flags &= ~NFC_FL_DISCOVER_PENDING; 1120 if (!(nfc_cb.flags & NFC_FL_HAL_REQUESTED)) { 1121 /* if HAL did not request for control, clear this bit now */ 1122 nfc_cb.flags &= ~NFC_FL_CONTROL_REQUESTED; 1123 } 1124 GKI_freebuf(nfc_cb.p_disc_pending); 1125 nfc_cb.p_disc_pending = NULL; 1126 return NFC_STATUS_OK; 1127 } 1128 1129 if (nfc_cb.nfc_state == NFC_STATE_OPEN) { 1130 nfc_set_state(NFC_STATE_CLOSING); 1131 NFC_TRACE_DEBUG3("act_protocol %d credits:%d/%d", p_cb->act_protocol, 1132 p_cb->init_credits, p_cb->num_buff); 1133 if ((p_cb->act_protocol == NCI_PROTOCOL_NFC_DEP) && 1134 (p_cb->init_credits != p_cb->num_buff)) { 1135 nfc_cb.flags |= NFC_FL_DEACTIVATING; 1136 nfc_cb.deactivate_timer.param = (uintptr_t)deactivate_type; 1137 nfc_start_timer(&nfc_cb.deactivate_timer, 1138 (uint16_t)(NFC_TTYPE_WAIT_2_DEACTIVATE), 1139 NFC_DEACTIVATE_TIMEOUT); 1140 return status; 1141 } 1142 } 1143 1144 status = nci_snd_deactivate_cmd(deactivate_type); 1145 return status; 1146 } 1147 /******************************************************************************* 1148 ** 1149 ** Function NFC_SetPowerSubState 1150 ** 1151 ** Description This function is called to send the power sub state (screen 1152 ** state) to NFCC. The response from NFCC is reported by 1153 ** tNFC_RESPONSE_CBACK as NFC_SET_POWER_STATE_REVT. 1154 ** 1155 ** Parameters scree_state 1156 ** 1157 ** Returns tNFC_STATUS 1158 ** 1159 *******************************************************************************/ 1160 tNFC_STATUS NFC_SetPowerSubState(uint8_t screen_state) { 1161 return nci_snd_core_set_power_sub_state(screen_state); 1162 } 1163 /******************************************************************************* 1164 ** 1165 ** Function NFC_UpdateRFCommParams 1166 ** 1167 ** Description This function is called to update RF Communication 1168 ** parameters once the Frame RF Interface has been activated. 1169 ** 1170 ** The response from NFCC is reported by tNFC_RESPONSE_CBACK 1171 ** as NFC_RF_COMM_PARAMS_UPDATE_REVT. 1172 ** 1173 ** Returns tNFC_STATUS 1174 ** 1175 *******************************************************************************/ 1176 tNFC_STATUS NFC_UpdateRFCommParams(tNFC_RF_COMM_PARAMS* p_params) { 1177 uint8_t tlvs[12]; 1178 uint8_t* p = tlvs; 1179 uint8_t data_exch_config; 1180 1181 /* RF Technology and Mode */ 1182 if (p_params->include_rf_tech_mode) { 1183 UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_TECH_N_MODE); 1184 UINT8_TO_STREAM(p, 1); 1185 UINT8_TO_STREAM(p, p_params->rf_tech_n_mode); 1186 } 1187 1188 /* Transmit Bit Rate */ 1189 if (p_params->include_tx_bit_rate) { 1190 UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_TX_BIT_RATE); 1191 UINT8_TO_STREAM(p, 1); 1192 UINT8_TO_STREAM(p, p_params->tx_bit_rate); 1193 } 1194 1195 /* Receive Bit Rate */ 1196 if (p_params->include_tx_bit_rate) { 1197 UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_RX_BIT_RATE); 1198 UINT8_TO_STREAM(p, 1); 1199 UINT8_TO_STREAM(p, p_params->rx_bit_rate); 1200 } 1201 1202 /* NFC-B Data Exchange Configuration */ 1203 if (p_params->include_nfc_b_config) { 1204 UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_B_DATA_EX_PARAM); 1205 UINT8_TO_STREAM(p, 1); 1206 1207 data_exch_config = (p_params->min_tr0 & 0x03) << 6; /* b7b6 : Mininum TR0 */ 1208 data_exch_config |= (p_params->min_tr1 & 0x03) 1209 << 4; /* b5b4 : Mininum TR1 */ 1210 data_exch_config |= (p_params->suppression_eos & 0x01) 1211 << 3; /* b3 : Suppression of EoS */ 1212 data_exch_config |= (p_params->suppression_sos & 0x01) 1213 << 2; /* b2 : Suppression of SoS */ 1214 data_exch_config |= (p_params->min_tr2 & 0x03); /* b1b0 : Mininum TR2 */ 1215 1216 UINT8_TO_STREAM(p, data_exch_config); 1217 } 1218 1219 return nci_snd_parameter_update_cmd(tlvs, (uint8_t)(p - tlvs)); 1220 } 1221 1222 /******************************************************************************* 1223 ** 1224 ** Function NFC_SetPowerOffSleep 1225 ** 1226 ** Description This function closes/opens transport and turns off/on NFCC. 1227 ** 1228 ** Returns tNFC_STATUS 1229 ** 1230 *******************************************************************************/ 1231 tNFC_STATUS NFC_SetPowerOffSleep(bool enable) { 1232 NFC_TRACE_API1("NFC_SetPowerOffSleep () enable = %d", enable); 1233 1234 if ((enable == false) && 1235 (nfc_cb.nfc_state == NFC_STATE_NFCC_POWER_OFF_SLEEP)) { 1236 nfc_cb.flags |= NFC_FL_RESTARTING; 1237 1238 /* open transport */ 1239 nfc_set_state(NFC_STATE_W4_HAL_OPEN); 1240 nfc_cb.p_hal->open(nfc_main_hal_cback, nfc_main_hal_data_cback); 1241 1242 return NFC_STATUS_OK; 1243 } else if ((enable == true) && (nfc_cb.nfc_state == NFC_STATE_IDLE)) { 1244 /* close transport to turn off NFCC and clean up */ 1245 nfc_cb.flags |= NFC_FL_POWER_OFF_SLEEP; 1246 nfc_task_shutdown_nfcc(); 1247 1248 return NFC_STATUS_OK; 1249 } 1250 1251 NFC_TRACE_ERROR1("NFC_SetPowerOffSleep () invalid state = %d", 1252 nfc_cb.nfc_state); 1253 return NFC_STATUS_FAILED; 1254 } 1255 1256 /******************************************************************************* 1257 ** 1258 ** Function NFC_PowerCycleNFCC 1259 ** 1260 ** Description This function turns off and then on NFCC. 1261 ** 1262 ** Returns tNFC_STATUS 1263 ** 1264 *******************************************************************************/ 1265 tNFC_STATUS NFC_PowerCycleNFCC(void) { 1266 NFC_TRACE_API0("NFC_PowerCycleNFCC ()"); 1267 1268 if (nfc_cb.nfc_state == NFC_STATE_IDLE) { 1269 /* power cycle NFCC */ 1270 nfc_cb.flags |= NFC_FL_POWER_CYCLE_NFCC; 1271 nfc_task_shutdown_nfcc(); 1272 1273 return NFC_STATUS_OK; 1274 } 1275 1276 NFC_TRACE_ERROR1("NFC_PowerCycleNFCC () invalid state = %d", 1277 nfc_cb.nfc_state); 1278 return NFC_STATUS_FAILED; 1279 } 1280 1281 /******************************************************************************* 1282 ** 1283 ** Function NFC_SetTraceLevel 1284 ** 1285 ** Description This function sets the trace level for NFC. If called with 1286 ** a value of 0xFF, it simply returns the current trace level. 1287 ** 1288 ** Returns The new or current trace level 1289 ** 1290 *******************************************************************************/ 1291 uint8_t NFC_SetTraceLevel(uint8_t new_level) { 1292 NFC_TRACE_API1("NFC_SetTraceLevel () new_level = %d", new_level); 1293 1294 if (new_level != 0xFF) nfc_cb.trace_level = new_level; 1295 1296 return (nfc_cb.trace_level); 1297 } 1298 1299 /******************************************************************************* 1300 ** 1301 ** Function NFC_GetNCIVersion 1302 ** 1303 ** Description Called by higher layer to get the current nci 1304 ** version of nfc. 1305 ** 1306 ** Returns NCI version NCI2.0 / NCI1.0 1307 ** 1308 *******************************************************************************/ 1309 uint8_t NFC_GetNCIVersion() { return nfc_cb.nci_version; } 1310 1311 /******************************************************************************* 1312 ** 1313 ** Function NFC_ISODEPNakPresCheck 1314 ** 1315 ** Description This function is called to send the ISO DEP nak presenc 1316 ** check cmd to check that the remote end point in RF field. 1317 ** 1318 ** The response from NFCC is reported by call back.The ntf 1319 ** indicates success if card is present in field or failed 1320 ** if card is lost. 1321 ** 1322 ** Returns tNFC_STATUS 1323 ** 1324 *******************************************************************************/ 1325 tNFC_STATUS NFC_ISODEPNakPresCheck() { 1326 return nci_snd_iso_dep_nak_presence_check_cmd(); 1327 } 1328 1329 #if (BT_TRACE_VERBOSE == TRUE) 1330 /******************************************************************************* 1331 ** 1332 ** Function NFC_GetStatusName 1333 ** 1334 ** Description This function returns the status name. 1335 ** 1336 ** NOTE conditionally compiled to save memory. 1337 ** 1338 ** Returns pointer to the name 1339 ** 1340 *******************************************************************************/ 1341 char* NFC_GetStatusName(tNFC_STATUS status) { 1342 switch (status) { 1343 case NFC_STATUS_OK: 1344 return "OK"; 1345 case NFC_STATUS_REJECTED: 1346 return "REJECTED"; 1347 case NFC_STATUS_MSG_CORRUPTED: 1348 return "CORRUPTED"; 1349 case NFC_STATUS_BUFFER_FULL: 1350 return "BUFFER_FULL"; 1351 case NFC_STATUS_FAILED: 1352 return "FAILED"; 1353 case NFC_STATUS_NOT_INITIALIZED: 1354 return "NOT_INITIALIZED"; 1355 case NFC_STATUS_SYNTAX_ERROR: 1356 return "SYNTAX_ERROR"; 1357 case NFC_STATUS_SEMANTIC_ERROR: 1358 return "SEMANTIC_ERROR"; 1359 case NFC_STATUS_UNKNOWN_GID: 1360 return "UNKNOWN_GID"; 1361 case NFC_STATUS_UNKNOWN_OID: 1362 return "UNKNOWN_OID"; 1363 case NFC_STATUS_INVALID_PARAM: 1364 return "INVALID_PARAM"; 1365 case NFC_STATUS_MSG_SIZE_TOO_BIG: 1366 return "MSG_SIZE_TOO_BIG"; 1367 case NFC_STATUS_ALREADY_STARTED: 1368 return "ALREADY_STARTED"; 1369 case NFC_STATUS_ACTIVATION_FAILED: 1370 return "ACTIVATION_FAILED"; 1371 case NFC_STATUS_TEAR_DOWN: 1372 return "TEAR_DOWN"; 1373 case NFC_STATUS_RF_TRANSMISSION_ERR: 1374 return "RF_TRANSMISSION_ERR"; 1375 case NFC_STATUS_RF_PROTOCOL_ERR: 1376 return "RF_PROTOCOL_ERR"; 1377 case NFC_STATUS_TIMEOUT: 1378 return "TIMEOUT"; 1379 case NFC_STATUS_EE_INTF_ACTIVE_FAIL: 1380 return "EE_INTF_ACTIVE_FAIL"; 1381 case NFC_STATUS_EE_TRANSMISSION_ERR: 1382 return "EE_TRANSMISSION_ERR"; 1383 case NFC_STATUS_EE_PROTOCOL_ERR: 1384 return "EE_PROTOCOL_ERR"; 1385 case NFC_STATUS_EE_TIMEOUT: 1386 return "EE_TIMEOUT"; 1387 case NFC_STATUS_CMD_STARTED: 1388 return "CMD_STARTED"; 1389 case NFC_STATUS_HW_TIMEOUT: 1390 return "HW_TIMEOUT"; 1391 case NFC_STATUS_CONTINUE: 1392 return "CONTINUE"; 1393 case NFC_STATUS_REFUSED: 1394 return "REFUSED"; 1395 case NFC_STATUS_BAD_RESP: 1396 return "BAD_RESP"; 1397 case NFC_STATUS_CMD_NOT_CMPLTD: 1398 return "CMD_NOT_CMPLTD"; 1399 case NFC_STATUS_NO_BUFFERS: 1400 return "NO_BUFFERS"; 1401 case NFC_STATUS_WRONG_PROTOCOL: 1402 return "WRONG_PROTOCOL"; 1403 case NFC_STATUS_BUSY: 1404 return "BUSY"; 1405 case NFC_STATUS_LINK_LOSS: 1406 return "LINK_LOSS"; 1407 case NFC_STATUS_BAD_LENGTH: 1408 return "BAD_LENGTH"; 1409 case NFC_STATUS_BAD_HANDLE: 1410 return "BAD_HANDLE"; 1411 case NFC_STATUS_CONGESTED: 1412 return "CONGESTED"; 1413 default: 1414 return "UNKNOWN"; 1415 } 1416 } 1417 #endif 1418