1 /****************************************************************************** 2 * 3 * Copyright (C) 2010-2014 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19 20 /****************************************************************************** 21 * 22 * This file contains function of the NCI unit to format and send NCI 23 * commands (for DH). 24 * 25 ******************************************************************************/ 26 #include <string.h> 27 #include "nfc_target.h" 28 29 #if NFC_INCLUDED == TRUE 30 #include "nci_defs.h" 31 #include "nci_hmsgs.h" 32 #include "nfc_api.h" 33 #include "nfc_int.h" 34 35 /******************************************************************************* 36 ** 37 ** Function nci_snd_core_reset 38 ** 39 ** Description compose and send CORE RESET command to command queue 40 ** 41 ** Returns status 42 ** 43 *******************************************************************************/ 44 UINT8 nci_snd_core_reset (UINT8 reset_type) 45 { 46 BT_HDR *p; 47 UINT8 *pp; 48 49 if ((p = NCI_GET_CMD_BUF (NCI_CORE_PARAM_SIZE_RESET)) == NULL) 50 return (NCI_STATUS_FAILED); 51 52 p->event = BT_EVT_TO_NFC_NCI; 53 p->len = NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_RESET; 54 p->offset = NCI_MSG_OFFSET_SIZE; 55 p->layer_specific = 0; 56 pp = (UINT8 *) (p + 1) + p->offset; 57 58 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE); 59 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_RESET); 60 UINT8_TO_STREAM (pp, NCI_CORE_PARAM_SIZE_RESET); 61 UINT8_TO_STREAM (pp, reset_type); 62 63 nfc_ncif_send_cmd (p); 64 return (NCI_STATUS_OK); 65 } 66 67 /******************************************************************************* 68 ** 69 ** Function nci_snd_core_init 70 ** 71 ** Description compose and send CORE INIT command to command queue 72 ** 73 ** Returns status 74 ** 75 *******************************************************************************/ 76 UINT8 nci_snd_core_init (void) 77 { 78 BT_HDR *p; 79 UINT8 *pp; 80 81 if ((p = NCI_GET_CMD_BUF (NCI_CORE_PARAM_SIZE_INIT)) == NULL) 82 return (NCI_STATUS_FAILED); 83 84 p->event = BT_EVT_TO_NFC_NCI; 85 p->len = NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_INIT; 86 p->offset = NCI_MSG_OFFSET_SIZE; 87 p->layer_specific = 0; 88 pp = (UINT8 *) (p + 1) + p->offset; 89 90 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE); 91 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_INIT); 92 UINT8_TO_STREAM (pp, NCI_CORE_PARAM_SIZE_INIT); 93 94 nfc_ncif_send_cmd (p); 95 return (NCI_STATUS_OK); 96 } 97 98 /******************************************************************************* 99 ** 100 ** Function nci_snd_core_get_config 101 ** 102 ** Description compose and send CORE GET_CONFIG command to command queue 103 ** 104 ** Returns status 105 ** 106 *******************************************************************************/ 107 UINT8 nci_snd_core_get_config (UINT8 *param_ids, UINT8 num_ids) 108 { 109 BT_HDR *p; 110 UINT8 *pp; 111 112 if ((p = NCI_GET_CMD_BUF (num_ids)) == NULL) 113 return (NCI_STATUS_FAILED); 114 115 p->event = BT_EVT_TO_NFC_NCI; 116 p->len = NCI_MSG_HDR_SIZE + num_ids + 1; 117 p->offset = NCI_MSG_OFFSET_SIZE; 118 p->layer_specific = 0; 119 pp = (UINT8 *) (p + 1) + p->offset; 120 121 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE); 122 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_GET_CONFIG); 123 UINT8_TO_STREAM (pp, (UINT8) (num_ids + 1)); 124 UINT8_TO_STREAM (pp, num_ids); 125 ARRAY_TO_STREAM (pp, param_ids, num_ids); 126 127 nfc_ncif_send_cmd (p); 128 return (NCI_STATUS_OK); 129 } 130 131 /******************************************************************************* 132 ** 133 ** Function nci_snd_core_set_config 134 ** 135 ** Description compose and send CORE SET_CONFIG command to command queue 136 ** 137 ** Returns status 138 ** 139 *******************************************************************************/ 140 UINT8 nci_snd_core_set_config (UINT8 *p_param_tlvs, UINT8 tlv_size) 141 { 142 BT_HDR *p; 143 UINT8 *pp; 144 UINT8 num = 0, ulen, len, *pt; 145 146 if ((p = NCI_GET_CMD_BUF (tlv_size + 1)) == NULL) 147 return (NCI_STATUS_FAILED); 148 149 p->event = BT_EVT_TO_NFC_NCI; 150 p->len = NCI_MSG_HDR_SIZE + tlv_size + 1; 151 p->offset = NCI_MSG_OFFSET_SIZE; 152 pp = (UINT8 *) (p + 1) + p->offset; 153 154 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE); 155 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_SET_CONFIG); 156 UINT8_TO_STREAM (pp, (UINT8) (tlv_size + 1)); 157 len = tlv_size; 158 pt = p_param_tlvs; 159 while (len > 1) 160 { 161 len -= 2; 162 pt++; 163 num++; 164 ulen = *pt++; 165 pt += ulen; 166 if (len >= ulen) 167 { 168 len -= ulen; 169 } 170 else 171 { 172 GKI_freebuf (p); 173 return NCI_STATUS_FAILED; 174 } 175 } 176 177 UINT8_TO_STREAM (pp, num); 178 ARRAY_TO_STREAM (pp, p_param_tlvs, tlv_size); 179 nfc_ncif_send_cmd (p); 180 181 return (NCI_STATUS_OK); 182 } 183 184 /******************************************************************************* 185 ** 186 ** Function nci_snd_core_conn_create 187 ** 188 ** Description compose and send CORE CONN_CREATE command to command queue 189 ** 190 ** Returns status 191 ** 192 *******************************************************************************/ 193 UINT8 nci_snd_core_conn_create (UINT8 dest_type, UINT8 num_tlv, UINT8 tlv_size, UINT8 *p_param_tlvs) 194 { 195 BT_HDR *p; 196 UINT8 *pp; 197 UINT8 size = NCI_CORE_PARAM_SIZE_CON_CREATE+tlv_size; 198 199 if ((p = NCI_GET_CMD_BUF (size)) == NULL) 200 return (NCI_STATUS_FAILED); 201 202 p->event = BT_EVT_TO_NFC_NCI; 203 p->len = NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_CON_CREATE; 204 p->offset = NCI_MSG_OFFSET_SIZE; 205 p->layer_specific = 0; 206 pp = (UINT8 *) (p + 1) + p->offset; 207 208 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE); 209 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_CONN_CREATE); 210 UINT8_TO_STREAM (pp, size); 211 UINT8_TO_STREAM (pp, dest_type); 212 UINT8_TO_STREAM (pp, num_tlv); 213 if (tlv_size) 214 { 215 ARRAY_TO_STREAM (pp, p_param_tlvs, tlv_size); 216 p->len += tlv_size; 217 } 218 219 nfc_ncif_send_cmd (p); 220 return (NCI_STATUS_OK); 221 } 222 223 /******************************************************************************* 224 ** 225 ** Function nci_snd_core_conn_close 226 ** 227 ** Description compose and send CORE CONN_CLOSE command to command queue 228 ** 229 ** Returns status 230 ** 231 *******************************************************************************/ 232 UINT8 nci_snd_core_conn_close (UINT8 conn_id) 233 { 234 BT_HDR *p; 235 UINT8 *pp; 236 237 if ((p = NCI_GET_CMD_BUF (NCI_CORE_PARAM_SIZE_CON_CLOSE)) == NULL) 238 return (NCI_STATUS_FAILED); 239 240 p->event = BT_EVT_TO_NFC_NCI; 241 p->len = NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_CON_CLOSE; 242 p->offset = NCI_MSG_OFFSET_SIZE; 243 p->layer_specific = 0; 244 pp = (UINT8 *) (p + 1) + p->offset; 245 246 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE); 247 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_CONN_CLOSE); 248 UINT8_TO_STREAM (pp, NCI_CORE_PARAM_SIZE_CON_CLOSE); 249 UINT8_TO_STREAM (pp, conn_id); 250 251 nfc_ncif_send_cmd (p); 252 return (NCI_STATUS_OK); 253 } 254 255 256 #if (NFC_NFCEE_INCLUDED == TRUE) 257 #if (NFC_RW_ONLY == FALSE) 258 /******************************************************************************* 259 ** 260 ** Function nci_snd_nfcee_discover 261 ** 262 ** Description compose and send NFCEE Management NFCEE_DISCOVER command 263 ** to command queue 264 ** 265 ** Returns status 266 ** 267 *******************************************************************************/ 268 UINT8 nci_snd_nfcee_discover (UINT8 discover_action) 269 { 270 BT_HDR *p; 271 UINT8 *pp; 272 273 if ((p = NCI_GET_CMD_BUF (NCI_PARAM_SIZE_DISCOVER_NFCEE)) == NULL) 274 return (NCI_STATUS_FAILED); 275 276 p->event = BT_EVT_TO_NFC_NCI; 277 p->len = NCI_MSG_HDR_SIZE + NCI_PARAM_SIZE_DISCOVER_NFCEE; 278 p->offset = NCI_MSG_OFFSET_SIZE; 279 p->layer_specific = 0; 280 pp = (UINT8 *) (p + 1) + p->offset; 281 282 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_EE_MANAGE); 283 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_NFCEE_DISCOVER); 284 UINT8_TO_STREAM (pp, NCI_PARAM_SIZE_DISCOVER_NFCEE); 285 UINT8_TO_STREAM (pp, discover_action); 286 287 nfc_ncif_send_cmd (p); 288 return (NCI_STATUS_OK); 289 } 290 291 /******************************************************************************* 292 ** 293 ** Function nci_snd_nfcee_mode_set 294 ** 295 ** Description compose and send NFCEE Management NFCEE MODE SET command 296 ** to command queue 297 ** 298 ** Returns status 299 ** 300 *******************************************************************************/ 301 UINT8 nci_snd_nfcee_mode_set (UINT8 nfcee_id, UINT8 nfcee_mode) 302 { 303 BT_HDR *p; 304 UINT8 *pp; 305 306 if ((p = NCI_GET_CMD_BUF (NCI_CORE_PARAM_SIZE_NFCEE_MODE_SET)) == NULL) 307 return (NCI_STATUS_FAILED); 308 309 p->event = BT_EVT_TO_NFC_NCI; 310 p->len = NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_NFCEE_MODE_SET; 311 p->offset = NCI_MSG_OFFSET_SIZE; 312 p->layer_specific = 0; 313 pp = (UINT8 *) (p + 1) + p->offset; 314 315 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_EE_MANAGE); 316 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_NFCEE_MODE_SET); 317 UINT8_TO_STREAM (pp, NCI_CORE_PARAM_SIZE_NFCEE_MODE_SET); 318 UINT8_TO_STREAM (pp, nfcee_id); 319 UINT8_TO_STREAM (pp, nfcee_mode); 320 321 nfc_ncif_send_cmd (p); 322 return (NCI_STATUS_OK); 323 } 324 #endif 325 #endif 326 327 /******************************************************************************* 328 ** 329 ** Function nci_snd_discover_cmd 330 ** 331 ** Description compose and send RF Management DISCOVER command to command queue 332 ** 333 ** Returns status 334 ** 335 *******************************************************************************/ 336 UINT8 nci_snd_discover_cmd (UINT8 num, tNCI_DISCOVER_PARAMS *p_param) 337 { 338 BT_HDR *p; 339 UINT8 *pp, *p_size, *p_start; 340 int xx; 341 int size; 342 343 size = num * sizeof (tNCI_DISCOVER_PARAMS) + 1; 344 if ((p = NCI_GET_CMD_BUF (size)) == NULL) 345 return (NCI_STATUS_FAILED); 346 347 p->event = BT_EVT_TO_NFC_NCI; 348 p->offset = NCI_MSG_OFFSET_SIZE; 349 p->layer_specific = 0; 350 pp = (UINT8 *) (p + 1) + p->offset; 351 352 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE); 353 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_DISCOVER); 354 p_size = pp; 355 pp++; 356 p_start = pp; 357 UINT8_TO_STREAM (pp, num); 358 for (xx=0; xx<num; xx++) 359 { 360 UINT8_TO_STREAM (pp, p_param[xx].type); 361 UINT8_TO_STREAM (pp, p_param[xx].frequency); 362 } 363 *p_size = (UINT8) (pp - p_start); 364 p->len = NCI_MSG_HDR_SIZE + *p_size; 365 366 nfc_ncif_send_cmd (p); 367 return (NCI_STATUS_OK); 368 } 369 370 /******************************************************************************* 371 ** 372 ** Function nci_snd_discover_select_cmd 373 ** 374 ** Description compose and send RF Management DISCOVER SELECT command 375 ** to command queue 376 ** 377 ** Returns status 378 ** 379 *******************************************************************************/ 380 UINT8 nci_snd_discover_select_cmd (UINT8 rf_disc_id, UINT8 protocol, UINT8 rf_interface) 381 { 382 BT_HDR *p; 383 UINT8 *pp; 384 385 if ((p = NCI_GET_CMD_BUF (NCI_DISCOVER_PARAM_SIZE_SELECT)) == NULL) 386 return (NCI_STATUS_FAILED); 387 388 p->event = BT_EVT_TO_NFC_NCI; 389 p->len = NCI_MSG_HDR_SIZE + NCI_DISCOVER_PARAM_SIZE_SELECT; 390 p->offset = NCI_MSG_OFFSET_SIZE; 391 p->layer_specific = 0; 392 pp = (UINT8 *) (p + 1) + p->offset; 393 394 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE); 395 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_DISCOVER_SELECT); 396 UINT8_TO_STREAM (pp, NCI_DISCOVER_PARAM_SIZE_SELECT); 397 UINT8_TO_STREAM (pp, rf_disc_id); 398 UINT8_TO_STREAM (pp, protocol); 399 UINT8_TO_STREAM (pp, rf_interface); 400 401 nfc_ncif_send_cmd (p); 402 return (NCI_STATUS_OK); 403 } 404 405 /******************************************************************************* 406 ** 407 ** Function nci_snd_deactivate_cmd 408 ** 409 ** Description compose and send RF Management DEACTIVATE command 410 ** to command queue 411 ** 412 ** Returns status 413 ** 414 *******************************************************************************/ 415 UINT8 nci_snd_deactivate_cmd (UINT8 de_act_type ) 416 { 417 BT_HDR *p; 418 UINT8 *pp; 419 420 nfc_cb.reassembly = TRUE; 421 422 if ((p = NCI_GET_CMD_BUF (NCI_DISCOVER_PARAM_SIZE_DEACT)) == NULL) 423 return (NCI_STATUS_FAILED); 424 425 p->event = BT_EVT_TO_NFC_NCI; 426 p->len = NCI_MSG_HDR_SIZE + NCI_DISCOVER_PARAM_SIZE_DEACT; 427 p->offset = NCI_MSG_OFFSET_SIZE; 428 p->layer_specific = 0; 429 pp = (UINT8 *) (p + 1) + p->offset; 430 431 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE); 432 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_DEACTIVATE); 433 UINT8_TO_STREAM (pp, NCI_DISCOVER_PARAM_SIZE_DEACT); 434 UINT8_TO_STREAM (pp, de_act_type); 435 436 nfc_ncif_send_cmd (p); 437 return (NCI_STATUS_OK); 438 } 439 440 /******************************************************************************* 441 ** 442 ** Function nci_snd_discover_map_cmd 443 ** 444 ** Description compose and send RF Management DISCOVER MAP command 445 ** to command queue 446 ** 447 ** Returns status 448 ** 449 *******************************************************************************/ 450 UINT8 nci_snd_discover_map_cmd (UINT8 num, tNCI_DISCOVER_MAPS *p_maps) 451 { 452 BT_HDR *p; 453 UINT8 *pp, *p_size, *p_start; 454 int xx; 455 int size; 456 457 size = num * sizeof (tNCI_DISCOVER_MAPS) + 1; 458 459 if ((p = NCI_GET_CMD_BUF (size)) == NULL) 460 return (NCI_STATUS_FAILED); 461 462 p->event = BT_EVT_TO_NFC_NCI; 463 p->offset = NCI_MSG_OFFSET_SIZE; 464 p->layer_specific = 0; 465 pp = (UINT8 *) (p + 1) + p->offset; 466 467 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE); 468 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_DISCOVER_MAP); 469 p_size = pp; 470 pp++; 471 p_start = pp; 472 UINT8_TO_STREAM (pp, num); 473 for (xx = 0; xx < num; xx++) 474 { 475 UINT8_TO_STREAM (pp, p_maps[xx].protocol); 476 UINT8_TO_STREAM (pp, p_maps[xx].mode); 477 UINT8_TO_STREAM (pp, p_maps[xx].intf_type); 478 } 479 *p_size = (UINT8) (pp - p_start); 480 p->len = NCI_MSG_HDR_SIZE + *p_size; 481 nfc_ncif_send_cmd (p); 482 return (NCI_STATUS_OK); 483 } 484 /******************************************************************************* 485 ** 486 ** Function nci_snd_t3t_polling 487 ** 488 ** Description compose and send RF Management T3T POLLING command 489 ** to command queue 490 ** 491 ** Returns status 492 ** 493 *******************************************************************************/ 494 UINT8 nci_snd_t3t_polling (UINT16 system_code, UINT8 rc, UINT8 tsn) 495 { 496 BT_HDR *p; 497 UINT8 *pp; 498 499 if ((p = NCI_GET_CMD_BUF (NCI_RF_PARAM_SIZE_T3T_POLLING)) == NULL) 500 return (NCI_STATUS_FAILED); 501 502 p->event = BT_EVT_TO_NFC_NCI; 503 p->len = NCI_MSG_HDR_SIZE + NCI_RF_PARAM_SIZE_T3T_POLLING; 504 p->offset = NCI_MSG_OFFSET_SIZE; 505 p->layer_specific = 0; 506 pp = (UINT8 *) (p + 1) + p->offset; 507 508 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE); 509 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_T3T_POLLING); 510 UINT8_TO_STREAM (pp, NCI_RF_PARAM_SIZE_T3T_POLLING); 511 UINT16_TO_BE_STREAM (pp, system_code); 512 UINT8_TO_STREAM (pp, rc); 513 UINT8_TO_STREAM (pp, tsn); 514 515 nfc_ncif_send_cmd (p); 516 return (NCI_STATUS_OK); 517 } 518 519 /******************************************************************************* 520 ** 521 ** Function nci_snd_parameter_update_cmd 522 ** 523 ** Description compose and send RF Management RF Communication Parameter 524 ** Update commandto command queue 525 ** 526 ** Returns status 527 ** 528 *******************************************************************************/ 529 UINT8 nci_snd_parameter_update_cmd (UINT8 *p_param_tlvs, UINT8 tlv_size) 530 { 531 BT_HDR *p; 532 UINT8 *pp; 533 UINT8 num = 0, ulen, len, *pt; 534 535 if ((p = NCI_GET_CMD_BUF (tlv_size + 1)) == NULL) 536 return (NCI_STATUS_FAILED); 537 538 p->event = BT_EVT_TO_NFC_NCI; 539 p->len = NCI_MSG_HDR_SIZE + tlv_size + 1; 540 p->offset = NCI_MSG_OFFSET_SIZE; 541 pp = (UINT8 *) (p + 1) + p->offset; 542 543 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE); 544 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_PARAMETER_UPDATE); 545 UINT8_TO_STREAM (pp, (UINT8) (tlv_size + 1)); 546 len = tlv_size; 547 pt = p_param_tlvs; 548 while (len > 1) 549 { 550 len -= 2; 551 pt++; 552 num++; 553 ulen = *pt++; 554 pt += ulen; 555 if (len >= ulen) 556 { 557 len -= ulen; 558 } 559 else 560 { 561 GKI_freebuf (p); 562 return NCI_STATUS_FAILED; 563 } 564 } 565 566 UINT8_TO_STREAM (pp, num); 567 ARRAY_TO_STREAM (pp, p_param_tlvs, tlv_size); 568 nfc_ncif_send_cmd (p); 569 570 return (NCI_STATUS_OK); 571 } 572 573 #if (NFC_NFCEE_INCLUDED == TRUE) 574 #if (NFC_RW_ONLY == FALSE) 575 /******************************************************************************* 576 ** 577 ** Function nci_snd_set_routing_cmd 578 ** 579 ** Description compose and send RF Management SET_LISTEN_MODE_ROUTING command 580 ** to command queue 581 ** 582 ** Returns status 583 ** 584 *******************************************************************************/ 585 UINT8 nci_snd_set_routing_cmd (BOOLEAN more, UINT8 num_tlv, UINT8 tlv_size, UINT8 *p_param_tlvs) 586 { 587 BT_HDR *p; 588 UINT8 *pp; 589 UINT8 size = tlv_size + 2; 590 591 if (tlv_size == 0) 592 { 593 /* just to terminate routing table 594 * 2 bytes (more=FALSE and num routing entries=0) */ 595 size = 2; 596 } 597 598 if ((p = NCI_GET_CMD_BUF(size)) == NULL) 599 return (NCI_STATUS_FAILED); 600 601 p->event = BT_EVT_TO_NFC_NCI; 602 p->offset = NCI_MSG_OFFSET_SIZE; 603 p->len = NCI_MSG_HDR_SIZE + size; 604 p->layer_specific = 0; 605 pp = (UINT8 *) (p + 1) + p->offset; 606 607 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE); 608 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_SET_ROUTING); 609 UINT8_TO_STREAM (pp, size); 610 UINT8_TO_STREAM (pp, more); 611 if (size == 2) 612 { 613 UINT8_TO_STREAM (pp, 0); 614 } 615 else 616 { 617 UINT8_TO_STREAM (pp, num_tlv); 618 ARRAY_TO_STREAM (pp, p_param_tlvs, tlv_size); 619 } 620 nfc_ncif_send_cmd (p); 621 622 return (NCI_STATUS_OK); 623 } 624 625 /******************************************************************************* 626 ** 627 ** Function nci_snd_get_routing_cmd 628 ** 629 ** Description compose and send RF Management GET_LISTEN_MODE_ROUTING command 630 ** to command queue 631 ** 632 ** Returns status 633 ** 634 *******************************************************************************/ 635 UINT8 nci_snd_get_routing_cmd (void) 636 { 637 BT_HDR *p; 638 UINT8 *pp; 639 UINT8 param_size = 0; 640 641 if ((p = NCI_GET_CMD_BUF (param_size)) == NULL) 642 return (NCI_STATUS_FAILED); 643 644 p->event = BT_EVT_TO_NFC_NCI; 645 p->len = NCI_MSG_HDR_SIZE + param_size; 646 p->offset = NCI_MSG_OFFSET_SIZE; 647 p->layer_specific = 0; 648 pp = (UINT8 *) (p + 1) + p->offset; 649 650 NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE); 651 NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_GET_ROUTING); 652 UINT8_TO_STREAM (pp, param_size); 653 654 nfc_ncif_send_cmd (p); 655 return (NCI_STATUS_OK); 656 } 657 #endif 658 #endif 659 660 661 #endif /* NFC_INCLUDED == TRUE*/ 662