1 /****************************************************************************** 2 * 3 * Copyright (C) 1999-2012 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 function of the HCIC unit to format and send HCI 22 * commands. 23 * 24 ******************************************************************************/ 25 26 #include "bt_target.h" 27 #include "gki.h" 28 #include "hcidefs.h" 29 #include "hcimsgs.h" 30 #include "hcidefs.h" 31 #include "btu.h" 32 33 #include <stddef.h> 34 #include <string.h> 35 36 #if defined (LMP_TEST) 37 #include <script.h> 38 #define btu_hcif_send_cmd(p1, p2) HCI_CMD_TO_LOWER((p2)) 39 #else 40 #include "btm_int.h" /* Included for UIPC_* macro definitions */ 41 #endif 42 43 BOOLEAN btsnd_hcic_inquiry(const LAP inq_lap, UINT8 duration, UINT8 response_cnt) 44 { 45 BT_HDR *p; 46 UINT8 *pp; 47 48 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_INQUIRY)) == NULL) 49 return (FALSE); 50 51 pp = (UINT8 *)(p + 1); 52 53 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_INQUIRY; 54 p->offset = 0; 55 56 UINT16_TO_STREAM (pp, HCI_INQUIRY); 57 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_INQUIRY); 58 59 LAP_TO_STREAM (pp, inq_lap); 60 UINT8_TO_STREAM (pp, duration); 61 UINT8_TO_STREAM (pp, response_cnt); 62 63 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 64 return (TRUE); 65 } 66 67 BOOLEAN btsnd_hcic_inq_cancel(void) 68 { 69 BT_HDR *p; 70 UINT8 *pp; 71 72 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_INQ_CANCEL)) == NULL) 73 return (FALSE); 74 75 pp = (UINT8 *)(p + 1); 76 77 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_INQ_CANCEL; 78 p->offset = 0; 79 UINT16_TO_STREAM (pp, HCI_INQUIRY_CANCEL); 80 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_INQ_CANCEL); 81 82 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 83 return (TRUE); 84 } 85 86 BOOLEAN btsnd_hcic_per_inq_mode (UINT16 max_period, UINT16 min_period, 87 const LAP inq_lap, UINT8 duration, UINT8 response_cnt) 88 { 89 BT_HDR *p; 90 UINT8 *pp; 91 92 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PER_INQ_MODE)) == NULL) 93 return (FALSE); 94 95 pp = (UINT8 *)(p + 1); 96 97 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PER_INQ_MODE; 98 p->offset = 0; 99 100 UINT16_TO_STREAM (pp, HCI_PERIODIC_INQUIRY_MODE); 101 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_PER_INQ_MODE); 102 103 UINT16_TO_STREAM (pp, max_period); 104 UINT16_TO_STREAM (pp, min_period); 105 LAP_TO_STREAM (pp, inq_lap); 106 UINT8_TO_STREAM (pp, duration); 107 UINT8_TO_STREAM (pp, response_cnt); 108 109 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 110 return (TRUE); 111 } 112 113 BOOLEAN btsnd_hcic_exit_per_inq (void) 114 { 115 BT_HDR *p; 116 UINT8 *pp; 117 118 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_EXIT_PER_INQ)) == NULL) 119 return (FALSE); 120 121 pp = (UINT8 *)(p + 1); 122 123 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_EXIT_PER_INQ; 124 p->offset = 0; 125 UINT16_TO_STREAM (pp, HCI_EXIT_PERIODIC_INQUIRY_MODE); 126 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_EXIT_PER_INQ); 127 128 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 129 return (TRUE); 130 } 131 132 133 BOOLEAN btsnd_hcic_create_conn(BD_ADDR dest, UINT16 packet_types, 134 UINT8 page_scan_rep_mode, UINT8 page_scan_mode, 135 UINT16 clock_offset, UINT8 allow_switch) 136 { 137 BT_HDR *p; 138 UINT8 *pp; 139 140 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CREATE_CONN)) == NULL) 141 return (FALSE); 142 143 pp = (UINT8 *)(p + 1); 144 145 #ifndef BT_10A 146 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CREATE_CONN; 147 #else 148 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CREATE_CONN - 1; 149 #endif 150 p->offset = 0; 151 152 UINT16_TO_STREAM (pp, HCI_CREATE_CONNECTION); 153 #ifndef BT_10A 154 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CREATE_CONN); 155 #else 156 UINT8_TO_STREAM (pp, (HCIC_PARAM_SIZE_CREATE_CONN - 1)); 157 #endif 158 BDADDR_TO_STREAM (pp, dest); 159 UINT16_TO_STREAM (pp, packet_types); 160 UINT8_TO_STREAM (pp, page_scan_rep_mode); 161 UINT8_TO_STREAM (pp, page_scan_mode); 162 UINT16_TO_STREAM (pp, clock_offset); 163 #if !defined (BT_10A) 164 UINT8_TO_STREAM (pp, allow_switch); 165 #endif 166 /* If calling from LMP_TEST or ScriptEngine, then send HCI command immediately */ 167 #if (!defined (LMP_TEST) && !defined(BTISE)) 168 btm_acl_paging (p, dest); 169 #else 170 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 171 #endif 172 return (TRUE); 173 } 174 175 BOOLEAN btsnd_hcic_disconnect (UINT16 handle, UINT8 reason) 176 { 177 BT_HDR *p; 178 UINT8 *pp; 179 180 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_DISCONNECT)) == NULL) 181 return (FALSE); 182 183 pp = (UINT8 *)(p + 1); 184 185 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_DISCONNECT; 186 p->offset = 0; 187 188 UINT16_TO_STREAM (pp, HCI_DISCONNECT); 189 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_DISCONNECT); 190 UINT16_TO_STREAM (pp, handle); 191 UINT8_TO_STREAM (pp, reason); 192 193 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 194 /* If calling from LMP_TEST or ScriptEngine, then send HCI command immediately */ 195 #if (!defined (LMP_TEST) && !defined(BTISE)) 196 // btla-specific ++ 197 // btm_acl_set_discing(TRUE); 198 // btla-specific -- 199 #endif 200 return (TRUE); 201 } 202 203 #if BTM_SCO_INCLUDED == TRUE 204 BOOLEAN btsnd_hcic_add_SCO_conn (UINT16 handle, UINT16 packet_types) 205 { 206 BT_HDR *p; 207 UINT8 *pp; 208 209 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ADD_SCO_CONN)) == NULL) 210 return (FALSE); 211 212 pp = (UINT8 *)(p + 1); 213 214 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ADD_SCO_CONN; 215 p->offset = 0; 216 217 UINT16_TO_STREAM (pp, HCI_ADD_SCO_CONNECTION); 218 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_ADD_SCO_CONN); 219 220 UINT16_TO_STREAM (pp, handle); 221 UINT16_TO_STREAM (pp, packet_types); 222 223 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 224 return (TRUE); 225 } 226 #endif /* BTM_SCO_INCLUDED */ 227 228 BOOLEAN btsnd_hcic_create_conn_cancel(BD_ADDR dest) 229 { 230 BT_HDR *p; 231 UINT8 *pp; 232 233 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CREATE_CONN_CANCEL)) == NULL) 234 return (FALSE); 235 236 pp = (UINT8 *)(p + 1); 237 238 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CREATE_CONN_CANCEL; 239 p->offset = 0; 240 241 UINT16_TO_STREAM (pp, HCI_CREATE_CONNECTION_CANCEL); 242 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CREATE_CONN_CANCEL); 243 244 BDADDR_TO_STREAM (pp, dest); 245 246 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 247 return (TRUE); 248 } 249 250 BOOLEAN btsnd_hcic_accept_conn (BD_ADDR dest, UINT8 role) 251 { 252 BT_HDR *p; 253 UINT8 *pp; 254 255 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ACCEPT_CONN)) == NULL) 256 return (FALSE); 257 258 pp = (UINT8 *)(p + 1); 259 260 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ACCEPT_CONN; 261 p->offset = 0; 262 263 UINT16_TO_STREAM (pp, HCI_ACCEPT_CONNECTION_REQUEST); 264 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_ACCEPT_CONN); 265 BDADDR_TO_STREAM (pp, dest); 266 UINT8_TO_STREAM (pp, role); 267 268 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 269 return (TRUE); 270 } 271 272 BOOLEAN btsnd_hcic_reject_conn (BD_ADDR dest, UINT8 reason) 273 { 274 BT_HDR *p; 275 UINT8 *pp; 276 277 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REJECT_CONN)) == NULL) 278 return (FALSE); 279 280 pp = (UINT8 *)(p + 1); 281 282 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REJECT_CONN; 283 p->offset = 0; 284 285 UINT16_TO_STREAM (pp, HCI_REJECT_CONNECTION_REQUEST); 286 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_REJECT_CONN); 287 288 BDADDR_TO_STREAM (pp, dest); 289 UINT8_TO_STREAM (pp, reason); 290 291 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 292 return (TRUE); 293 } 294 295 BOOLEAN btsnd_hcic_link_key_req_reply (BD_ADDR bd_addr, LINK_KEY link_key) 296 { 297 BT_HDR *p; 298 UINT8 *pp; 299 300 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY)) == NULL) 301 return (FALSE); 302 303 pp = (UINT8 *)(p + 1); 304 305 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY; 306 p->offset = 0; 307 308 UINT16_TO_STREAM (pp, HCI_LINK_KEY_REQUEST_REPLY); 309 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY); 310 311 BDADDR_TO_STREAM (pp, bd_addr); 312 ARRAY16_TO_STREAM (pp, link_key); 313 314 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 315 return (TRUE); 316 } 317 318 BOOLEAN btsnd_hcic_link_key_neg_reply (BD_ADDR bd_addr) 319 { 320 BT_HDR *p; 321 UINT8 *pp; 322 323 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY)) == NULL) 324 return (FALSE); 325 326 pp = (UINT8 *)(p + 1); 327 328 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY; 329 p->offset = 0; 330 331 UINT16_TO_STREAM (pp, HCI_LINK_KEY_REQUEST_NEG_REPLY); 332 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY); 333 334 BDADDR_TO_STREAM (pp, bd_addr); 335 336 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 337 return (TRUE); 338 } 339 340 BOOLEAN btsnd_hcic_pin_code_req_reply (BD_ADDR bd_addr, UINT8 pin_code_len, 341 PIN_CODE pin_code) 342 { 343 BT_HDR *p; 344 UINT8 *pp; 345 int i; 346 347 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY)) == NULL) 348 return (FALSE); 349 350 pp = (UINT8 *)(p + 1); 351 352 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY; 353 p->offset = 0; 354 355 UINT16_TO_STREAM (pp, HCI_PIN_CODE_REQUEST_REPLY); 356 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY); 357 358 BDADDR_TO_STREAM (pp, bd_addr); 359 UINT8_TO_STREAM (pp, pin_code_len); 360 361 for (i = 0; i < pin_code_len; i++) 362 *pp++ = *pin_code++; 363 364 for (; i < PIN_CODE_LEN; i++) 365 *pp++ = 0; 366 367 368 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 369 return (TRUE); 370 } 371 372 BOOLEAN btsnd_hcic_pin_code_neg_reply (BD_ADDR bd_addr) 373 { 374 BT_HDR *p; 375 UINT8 *pp; 376 377 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY)) == NULL) 378 return (FALSE); 379 380 pp = (UINT8 *)(p + 1); 381 382 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY; 383 p->offset = 0; 384 385 UINT16_TO_STREAM (pp, HCI_PIN_CODE_REQUEST_NEG_REPLY); 386 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY); 387 388 BDADDR_TO_STREAM (pp, bd_addr); 389 390 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 391 return (TRUE); 392 } 393 394 BOOLEAN btsnd_hcic_change_conn_type (UINT16 handle, UINT16 packet_types) 395 { 396 BT_HDR *p; 397 UINT8 *pp; 398 399 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CHANGE_CONN_TYPE)) == NULL) 400 return (FALSE); 401 402 pp = (UINT8 *)(p + 1); 403 404 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_CONN_TYPE; 405 p->offset = 0; 406 407 UINT16_TO_STREAM (pp, HCI_CHANGE_CONN_PACKET_TYPE); 408 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CHANGE_CONN_TYPE); 409 410 UINT16_TO_STREAM (pp, handle); 411 UINT16_TO_STREAM (pp, packet_types); 412 413 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 414 return (TRUE); 415 } 416 417 BOOLEAN btsnd_hcic_auth_request (UINT16 handle) 418 { 419 BT_HDR *p; 420 UINT8 *pp; 421 422 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 423 return (FALSE); 424 425 pp = (UINT8 *)(p + 1); 426 427 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 428 p->offset = 0; 429 430 UINT16_TO_STREAM (pp, HCI_AUTHENTICATION_REQUESTED); 431 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 432 433 UINT16_TO_STREAM (pp, handle); 434 435 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 436 return (TRUE); 437 } 438 439 BOOLEAN btsnd_hcic_set_conn_encrypt (UINT16 handle, BOOLEAN enable) 440 { 441 BT_HDR *p; 442 UINT8 *pp; 443 444 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_CONN_ENCRYPT)) == NULL) 445 return (FALSE); 446 447 pp = (UINT8 *)(p + 1); 448 449 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_CONN_ENCRYPT; 450 p->offset = 0; 451 452 UINT16_TO_STREAM (pp, HCI_SET_CONN_ENCRYPTION); 453 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SET_CONN_ENCRYPT); 454 455 UINT16_TO_STREAM (pp, handle); 456 UINT8_TO_STREAM (pp, enable); 457 458 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 459 return (TRUE); 460 } 461 462 BOOLEAN btsnd_hcic_change_link_key (UINT16 handle) 463 { 464 BT_HDR *p; 465 UINT8 *pp; 466 467 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 468 return (FALSE); 469 470 pp = (UINT8 *)(p + 1); 471 472 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 473 p->offset = 0; 474 475 UINT16_TO_STREAM (pp, HCI_CHANGE_CONN_LINK_KEY); 476 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 477 478 UINT16_TO_STREAM (pp, handle); 479 480 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 481 return (TRUE); 482 } 483 484 BOOLEAN btsnd_hcic_master_link_key (BOOLEAN key_flag) 485 { 486 BT_HDR *p; 487 UINT8 *pp; 488 489 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_MASTER_LINK_KEY)) == NULL) 490 return (FALSE); 491 492 pp = (UINT8 *)(p + 1); 493 494 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_MASTER_LINK_KEY; 495 p->offset = 0; 496 497 UINT16_TO_STREAM (pp, HCI_MASTER_LINK_KEY); 498 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_MASTER_LINK_KEY); 499 500 UINT8_TO_STREAM (pp, key_flag); 501 502 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 503 return (TRUE); 504 } 505 506 BOOLEAN btsnd_hcic_rmt_name_req (BD_ADDR bd_addr, UINT8 page_scan_rep_mode, 507 UINT8 page_scan_mode, UINT16 clock_offset) 508 { 509 BT_HDR *p; 510 UINT8 *pp; 511 512 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RMT_NAME_REQ)) == NULL) 513 return (FALSE); 514 515 pp = (UINT8 *)(p + 1); 516 517 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RMT_NAME_REQ; 518 p->offset = 0; 519 520 UINT16_TO_STREAM (pp, HCI_RMT_NAME_REQUEST); 521 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_RMT_NAME_REQ); 522 523 BDADDR_TO_STREAM (pp, bd_addr); 524 UINT8_TO_STREAM (pp, page_scan_rep_mode); 525 UINT8_TO_STREAM (pp, page_scan_mode); 526 UINT16_TO_STREAM (pp, clock_offset); 527 528 /* If calling from LMP_TEST or ScriptEngine, then send HCI command immediately */ 529 #if (!defined (LMP_TEST) && !defined(BTISE)) 530 btm_acl_paging (p, bd_addr); 531 #else 532 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 533 #endif 534 return (TRUE); 535 } 536 537 BOOLEAN btsnd_hcic_rmt_name_req_cancel (BD_ADDR bd_addr) 538 { 539 BT_HDR *p; 540 UINT8 *pp; 541 542 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL)) == NULL) 543 return (FALSE); 544 545 pp = (UINT8 *)(p + 1); 546 547 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL; 548 p->offset = 0; 549 550 UINT16_TO_STREAM (pp, HCI_RMT_NAME_REQUEST_CANCEL); 551 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL); 552 553 BDADDR_TO_STREAM (pp, bd_addr); 554 555 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 556 return (TRUE); 557 } 558 559 BOOLEAN btsnd_hcic_rmt_features_req (UINT16 handle) 560 { 561 BT_HDR *p; 562 UINT8 *pp; 563 564 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 565 return (FALSE); 566 567 pp = (UINT8 *)(p + 1); 568 569 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 570 p->offset = 0; 571 572 UINT16_TO_STREAM (pp, HCI_READ_RMT_FEATURES); 573 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 574 575 UINT16_TO_STREAM (pp, handle); 576 577 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 578 return (TRUE); 579 } 580 581 BOOLEAN btsnd_hcic_rmt_ext_features (UINT16 handle, UINT8 page_num) 582 { 583 BT_HDR *p; 584 UINT8 *pp; 585 586 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RMT_EXT_FEATURES)) == NULL) 587 return (FALSE); 588 589 pp = (UINT8 *)(p + 1); 590 591 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RMT_EXT_FEATURES; 592 p->offset = 0; 593 594 UINT16_TO_STREAM (pp, HCI_READ_RMT_EXT_FEATURES); 595 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_RMT_EXT_FEATURES); 596 597 UINT16_TO_STREAM (pp, handle); 598 UINT8_TO_STREAM (pp, page_num); 599 600 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 601 return (TRUE); 602 } 603 604 BOOLEAN btsnd_hcic_rmt_ver_req (UINT16 handle) 605 { 606 BT_HDR *p; 607 UINT8 *pp; 608 609 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 610 return (FALSE); 611 612 pp = (UINT8 *)(p + 1); 613 614 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 615 p->offset = 0; 616 617 UINT16_TO_STREAM (pp, HCI_READ_RMT_VERSION_INFO); 618 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 619 620 UINT16_TO_STREAM (pp, handle); 621 622 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 623 return (TRUE); 624 } 625 626 BOOLEAN btsnd_hcic_read_rmt_clk_offset (UINT16 handle) 627 { 628 BT_HDR *p; 629 UINT8 *pp; 630 631 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 632 return (FALSE); 633 634 pp = (UINT8 *)(p + 1); 635 636 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 637 p->offset = 0; 638 639 UINT16_TO_STREAM (pp, HCI_READ_RMT_CLOCK_OFFSET); 640 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 641 642 UINT16_TO_STREAM (pp, handle); 643 644 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 645 return (TRUE); 646 } 647 648 BOOLEAN btsnd_hcic_read_lmp_handle (UINT16 handle) 649 { 650 BT_HDR *p; 651 UINT8 *pp; 652 653 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 654 return (FALSE); 655 656 pp = (UINT8 *)(p + 1); 657 658 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 659 p->offset = 0; 660 661 UINT16_TO_STREAM (pp, HCI_READ_LMP_HANDLE); 662 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 663 664 UINT16_TO_STREAM (pp, handle); 665 666 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 667 return (TRUE); 668 } 669 670 BOOLEAN btsnd_hcic_setup_esco_conn (UINT16 handle, UINT32 tx_bw, 671 UINT32 rx_bw, UINT16 max_latency, UINT16 voice, 672 UINT8 retrans_effort, UINT16 packet_types) 673 { 674 BT_HDR *p; 675 UINT8 *pp; 676 677 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SETUP_ESCO)) == NULL) 678 return (FALSE); 679 680 pp = (UINT8 *)(p + 1); 681 682 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SETUP_ESCO; 683 p->offset = 0; 684 685 UINT16_TO_STREAM (pp, HCI_SETUP_ESCO_CONNECTION); 686 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SETUP_ESCO); 687 688 UINT16_TO_STREAM (pp, handle); 689 UINT32_TO_STREAM (pp, tx_bw); 690 UINT32_TO_STREAM (pp, rx_bw); 691 UINT16_TO_STREAM (pp, max_latency); 692 UINT16_TO_STREAM (pp, voice); 693 UINT8_TO_STREAM (pp, retrans_effort); 694 UINT16_TO_STREAM (pp, packet_types); 695 696 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 697 return (TRUE); 698 } 699 700 BOOLEAN btsnd_hcic_accept_esco_conn (BD_ADDR bd_addr, UINT32 tx_bw, 701 UINT32 rx_bw, UINT16 max_latency, 702 UINT16 content_fmt, UINT8 retrans_effort, 703 UINT16 packet_types) 704 { 705 BT_HDR *p; 706 UINT8 *pp; 707 708 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ACCEPT_ESCO)) == NULL) 709 return (FALSE); 710 711 pp = (UINT8 *)(p + 1); 712 713 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ACCEPT_ESCO; 714 p->offset = 0; 715 716 UINT16_TO_STREAM (pp, HCI_ACCEPT_ESCO_CONNECTION); 717 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_ACCEPT_ESCO); 718 719 BDADDR_TO_STREAM (pp, bd_addr); 720 UINT32_TO_STREAM (pp, tx_bw); 721 UINT32_TO_STREAM (pp, rx_bw); 722 UINT16_TO_STREAM (pp, max_latency); 723 UINT16_TO_STREAM (pp, content_fmt); 724 UINT8_TO_STREAM (pp, retrans_effort); 725 UINT16_TO_STREAM (pp, packet_types); 726 727 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 728 return (TRUE); 729 } 730 731 BOOLEAN btsnd_hcic_reject_esco_conn (BD_ADDR bd_addr, UINT8 reason) 732 { 733 BT_HDR *p; 734 UINT8 *pp; 735 736 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REJECT_ESCO)) == NULL) 737 return (FALSE); 738 739 pp = (UINT8 *)(p + 1); 740 741 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REJECT_ESCO; 742 p->offset = 0; 743 744 UINT16_TO_STREAM (pp, HCI_REJECT_ESCO_CONNECTION); 745 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_REJECT_ESCO); 746 747 BDADDR_TO_STREAM (pp, bd_addr); 748 UINT8_TO_STREAM (pp, reason); 749 750 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 751 return (TRUE); 752 } 753 754 BOOLEAN btsnd_hcic_hold_mode (UINT16 handle, UINT16 max_hold_period, 755 UINT16 min_hold_period) 756 { 757 BT_HDR *p; 758 UINT8 *pp; 759 760 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_HOLD_MODE)) == NULL) 761 return (FALSE); 762 763 pp = (UINT8 *)(p + 1); 764 765 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_HOLD_MODE; 766 p->offset = 0; 767 768 UINT16_TO_STREAM (pp, HCI_HOLD_MODE); 769 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_HOLD_MODE); 770 771 UINT16_TO_STREAM (pp, handle); 772 UINT16_TO_STREAM (pp, max_hold_period); 773 UINT16_TO_STREAM (pp, min_hold_period); 774 775 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 776 return (TRUE); 777 } 778 779 BOOLEAN btsnd_hcic_sniff_mode (UINT16 handle, UINT16 max_sniff_period, 780 UINT16 min_sniff_period, UINT16 sniff_attempt, 781 UINT16 sniff_timeout) 782 { 783 BT_HDR *p; 784 UINT8 *pp; 785 786 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SNIFF_MODE)) == NULL) 787 return (FALSE); 788 789 pp = (UINT8 *)(p + 1); 790 791 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SNIFF_MODE; 792 p->offset = 0; 793 794 UINT16_TO_STREAM (pp, HCI_SNIFF_MODE); 795 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SNIFF_MODE); 796 797 UINT16_TO_STREAM (pp, handle); 798 UINT16_TO_STREAM (pp, max_sniff_period); 799 UINT16_TO_STREAM (pp, min_sniff_period); 800 UINT16_TO_STREAM (pp, sniff_attempt); 801 UINT16_TO_STREAM (pp, sniff_timeout); 802 803 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 804 return (TRUE); 805 } 806 807 BOOLEAN btsnd_hcic_exit_sniff_mode (UINT16 handle) 808 { 809 BT_HDR *p; 810 UINT8 *pp; 811 812 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 813 return (FALSE); 814 815 pp = (UINT8 *)(p + 1); 816 817 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 818 p->offset = 0; 819 820 UINT16_TO_STREAM (pp, HCI_EXIT_SNIFF_MODE); 821 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 822 823 UINT16_TO_STREAM (pp, handle); 824 825 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 826 return TRUE; 827 } 828 829 BOOLEAN btsnd_hcic_park_mode (UINT16 handle, UINT16 beacon_max_interval, 830 UINT16 beacon_min_interval) 831 { 832 BT_HDR *p; 833 UINT8 *pp; 834 835 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PARK_MODE)) == NULL) 836 return (FALSE); 837 838 pp = (UINT8 *)(p + 1); 839 840 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PARK_MODE; 841 p->offset = 0; 842 843 UINT16_TO_STREAM (pp, HCI_PARK_MODE); 844 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_PARK_MODE); 845 846 UINT16_TO_STREAM (pp, handle); 847 UINT16_TO_STREAM (pp, beacon_max_interval); 848 UINT16_TO_STREAM (pp, beacon_min_interval); 849 850 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 851 return (TRUE); 852 } 853 854 BOOLEAN btsnd_hcic_exit_park_mode (UINT16 handle) 855 { 856 BT_HDR *p; 857 UINT8 *pp; 858 859 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 860 return (FALSE); 861 862 pp = (UINT8 *)(p + 1); 863 864 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 865 p->offset = 0; 866 867 UINT16_TO_STREAM (pp, HCI_EXIT_PARK_MODE); 868 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 869 870 UINT16_TO_STREAM (pp, handle); 871 872 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 873 return TRUE; 874 } 875 876 BOOLEAN btsnd_hcic_qos_setup (UINT16 handle, UINT8 flags, UINT8 service_type, 877 UINT32 token_rate, UINT32 peak, UINT32 latency, 878 UINT32 delay_var) 879 { 880 BT_HDR *p; 881 UINT8 *pp; 882 883 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_QOS_SETUP)) == NULL) 884 return (FALSE); 885 886 pp = (UINT8 *)(p + 1); 887 888 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_QOS_SETUP; 889 p->offset = 0; 890 891 UINT16_TO_STREAM (pp, HCI_QOS_SETUP); 892 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_QOS_SETUP); 893 894 UINT16_TO_STREAM (pp, handle); 895 UINT8_TO_STREAM (pp, flags); 896 UINT8_TO_STREAM (pp, service_type); 897 UINT32_TO_STREAM (pp, token_rate); 898 UINT32_TO_STREAM (pp, peak); 899 UINT32_TO_STREAM (pp, latency); 900 UINT32_TO_STREAM (pp, delay_var); 901 902 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 903 return (TRUE); 904 } 905 906 BOOLEAN btsnd_hcic_role_discovery (UINT16 handle) 907 { 908 BT_HDR *p; 909 UINT8 *pp; 910 911 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 912 return (FALSE); 913 914 pp = (UINT8 *)(p + 1); 915 916 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 917 p->offset = 0; 918 919 UINT16_TO_STREAM (pp, HCI_ROLE_DISCOVERY); 920 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 921 922 UINT16_TO_STREAM (pp, handle); 923 924 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 925 return (TRUE); 926 } 927 928 BOOLEAN btsnd_hcic_switch_role (BD_ADDR bd_addr, UINT8 role) 929 { 930 BT_HDR *p; 931 UINT8 *pp; 932 933 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SWITCH_ROLE)) == NULL) 934 return (FALSE); 935 936 pp = (UINT8 *)(p + 1); 937 938 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SWITCH_ROLE; 939 p->offset = 0; 940 941 UINT16_TO_STREAM (pp, HCI_SWITCH_ROLE); 942 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SWITCH_ROLE); 943 944 BDADDR_TO_STREAM (pp, bd_addr); 945 UINT8_TO_STREAM (pp, role); 946 947 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 948 return (TRUE); 949 } 950 951 BOOLEAN btsnd_hcic_read_policy_set (UINT16 handle) 952 { 953 BT_HDR *p; 954 UINT8 *pp; 955 956 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 957 return (FALSE); 958 959 pp = (UINT8 *)(p + 1); 960 961 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 962 p->offset = 0; 963 964 UINT16_TO_STREAM (pp, HCI_READ_POLICY_SETTINGS); 965 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 966 967 UINT16_TO_STREAM (pp, handle); 968 969 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 970 return (TRUE); 971 } 972 973 BOOLEAN btsnd_hcic_write_policy_set (UINT16 handle, UINT16 settings) 974 { 975 BT_HDR *p; 976 UINT8 *pp; 977 978 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_POLICY_SET)) == NULL) 979 return (FALSE); 980 981 pp = (UINT8 *)(p + 1); 982 983 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_POLICY_SET; 984 p->offset = 0; 985 UINT16_TO_STREAM (pp, HCI_WRITE_POLICY_SETTINGS); 986 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_POLICY_SET); 987 988 UINT16_TO_STREAM (pp, handle); 989 UINT16_TO_STREAM (pp, settings); 990 991 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 992 return (TRUE); 993 } 994 995 BOOLEAN btsnd_hcic_read_def_policy_set (void) 996 { 997 BT_HDR *p; 998 UINT8 *pp; 999 1000 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_DEF_POLICY_SET)) == NULL) 1001 return (FALSE); 1002 1003 pp = (UINT8 *)(p + 1); 1004 1005 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_DEF_POLICY_SET; 1006 p->offset = 0; 1007 1008 UINT16_TO_STREAM (pp, HCI_READ_DEF_POLICY_SETTINGS); 1009 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_DEF_POLICY_SET); 1010 1011 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1012 return (TRUE); 1013 } 1014 1015 BOOLEAN btsnd_hcic_write_def_policy_set (UINT16 settings) 1016 { 1017 BT_HDR *p; 1018 UINT8 *pp; 1019 1020 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET)) == NULL) 1021 return (FALSE); 1022 1023 pp = (UINT8 *)(p + 1); 1024 1025 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET; 1026 p->offset = 0; 1027 UINT16_TO_STREAM (pp, HCI_WRITE_DEF_POLICY_SETTINGS); 1028 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET); 1029 1030 UINT16_TO_STREAM (pp, settings); 1031 1032 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1033 return (TRUE); 1034 } 1035 1036 BOOLEAN btsnd_hcic_flow_specification(UINT16 handle, UINT8 flags, UINT8 flow_direct, 1037 UINT8 service_type, UINT32 token_rate, 1038 UINT32 token_bucket_size, UINT32 peak, 1039 UINT32 latency) 1040 { 1041 BT_HDR *p; 1042 UINT8 *pp; 1043 1044 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_FLOW_SPEC)) == NULL) 1045 return (FALSE); 1046 1047 pp = (UINT8 *)(p + 1); 1048 1049 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_FLOW_SPEC; 1050 p->offset = 0; 1051 1052 UINT16_TO_STREAM (pp, HCI_FLOW_SPECIFICATION); 1053 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_FLOW_SPEC); 1054 1055 UINT16_TO_STREAM (pp, handle); 1056 UINT8_TO_STREAM (pp, flags); 1057 UINT8_TO_STREAM (pp, flow_direct); 1058 UINT8_TO_STREAM (pp, service_type); 1059 UINT32_TO_STREAM (pp, token_rate); 1060 UINT32_TO_STREAM (pp, token_bucket_size); 1061 UINT32_TO_STREAM (pp, peak); 1062 UINT32_TO_STREAM (pp, latency); 1063 1064 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1065 return (TRUE); 1066 } 1067 1068 BOOLEAN btsnd_hcic_set_event_mask(UINT8 local_controller_id, BT_EVENT_MASK event_mask) 1069 { 1070 BT_HDR *p; 1071 UINT8 *pp; 1072 1073 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_EVENT_MASK)) == NULL) 1074 return (FALSE); 1075 1076 pp = (UINT8 *)(p + 1); 1077 1078 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_EVENT_MASK; 1079 p->offset = 0; 1080 1081 UINT16_TO_STREAM (pp, HCI_SET_EVENT_MASK); 1082 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SET_EVENT_MASK); 1083 ARRAY8_TO_STREAM (pp, event_mask); 1084 1085 btu_hcif_send_cmd (local_controller_id, p); 1086 return (TRUE); 1087 } 1088 1089 BOOLEAN btsnd_hcic_set_event_mask_page_2 (UINT8 local_controller_id, BT_EVENT_MASK event_mask) 1090 { 1091 BT_HDR *p; 1092 UINT8 *pp; 1093 1094 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_EVENT_MASK_PAGE_2)) == NULL) 1095 return (FALSE); 1096 1097 pp = (UINT8 *)(p + 1); 1098 1099 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_EVENT_MASK_PAGE_2; 1100 p->offset = 0; 1101 1102 UINT16_TO_STREAM (pp, HCI_SET_EVENT_MASK_PAGE_2); 1103 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SET_EVENT_MASK_PAGE_2); 1104 ARRAY8_TO_STREAM (pp, event_mask); 1105 1106 btu_hcif_send_cmd (local_controller_id, p); 1107 return (TRUE); 1108 } 1109 1110 BOOLEAN btsnd_hcic_reset (UINT8 local_controller_id) 1111 { 1112 BT_HDR *p; 1113 UINT8 *pp; 1114 1115 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RESET)) == NULL) 1116 return (FALSE); 1117 1118 pp = (UINT8 *)(p + 1); 1119 1120 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RESET; 1121 p->offset = 0; 1122 1123 UINT16_TO_STREAM (pp, HCI_RESET); 1124 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_RESET); 1125 1126 btu_hcif_send_cmd (local_controller_id, p); 1127 /* If calling from LMP_TEST or ScriptEngine, then send HCI command immediately */ 1128 #if (!defined (LMP_TEST) && !defined(BTISE)) 1129 if (local_controller_id == LOCAL_BR_EDR_CONTROLLER_ID) 1130 { 1131 btm_acl_reset_paging (); 1132 btm_acl_set_discing (FALSE); 1133 } 1134 #endif 1135 return (TRUE); 1136 } 1137 1138 BOOLEAN btsnd_hcic_set_event_filter (UINT8 filt_type, UINT8 filt_cond_type, 1139 UINT8 *filt_cond, UINT8 filt_cond_len) 1140 { 1141 BT_HDR *p; 1142 UINT8 *pp; 1143 1144 /* Use buffer large enough to hold all sizes in this command */ 1145 if ((p = HCI_GET_CMD_BUF(2 + filt_cond_len)) == NULL) 1146 return (FALSE); 1147 1148 pp = (UINT8 *)(p + 1); 1149 1150 p->offset = 0; 1151 1152 UINT16_TO_STREAM (pp, HCI_SET_EVENT_FILTER); 1153 1154 if (filt_type) 1155 { 1156 p->len = (UINT16)(HCIC_PREAMBLE_SIZE + 2 + filt_cond_len); 1157 UINT8_TO_STREAM (pp, (UINT8)(2 + filt_cond_len)); 1158 1159 UINT8_TO_STREAM (pp, filt_type); 1160 UINT8_TO_STREAM (pp, filt_cond_type); 1161 1162 if (filt_cond_type == HCI_FILTER_COND_DEVICE_CLASS) 1163 { 1164 DEVCLASS_TO_STREAM (pp, filt_cond); 1165 filt_cond += DEV_CLASS_LEN; 1166 DEVCLASS_TO_STREAM (pp, filt_cond); 1167 filt_cond += DEV_CLASS_LEN; 1168 1169 filt_cond_len -= (2 * DEV_CLASS_LEN); 1170 } 1171 else if (filt_cond_type == HCI_FILTER_COND_BD_ADDR) 1172 { 1173 BDADDR_TO_STREAM (pp, filt_cond); 1174 filt_cond += BD_ADDR_LEN; 1175 1176 filt_cond_len -= BD_ADDR_LEN; 1177 } 1178 1179 if (filt_cond_len) 1180 ARRAY_TO_STREAM (pp, filt_cond, filt_cond_len); 1181 } 1182 else 1183 { 1184 p->len = (UINT16)(HCIC_PREAMBLE_SIZE + 1); 1185 UINT8_TO_STREAM (pp, 1); 1186 1187 UINT8_TO_STREAM (pp, filt_type); 1188 } 1189 1190 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1191 return (TRUE); 1192 } 1193 1194 BOOLEAN btsnd_hcic_flush (UINT8 local_controller_id, UINT16 handle) 1195 { 1196 BT_HDR *p; 1197 UINT8 *pp; 1198 1199 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 1200 return (FALSE); 1201 1202 pp = (UINT8 *)(p + 1); 1203 1204 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 1205 p->offset = 0; 1206 UINT16_TO_STREAM (pp, HCI_FLUSH); 1207 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 1208 1209 UINT16_TO_STREAM (pp, handle); 1210 1211 btu_hcif_send_cmd (local_controller_id, p); 1212 return (TRUE); 1213 } 1214 1215 BOOLEAN btsnd_hcic_read_pin_type (void) 1216 { 1217 BT_HDR *p; 1218 UINT8 *pp; 1219 1220 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 1221 return (FALSE); 1222 1223 pp = (UINT8 *)(p + 1); 1224 1225 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 1226 p->offset = 0; 1227 1228 UINT16_TO_STREAM (pp, HCI_READ_PIN_TYPE); 1229 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 1230 1231 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1232 return (TRUE); 1233 } 1234 1235 BOOLEAN btsnd_hcic_write_pin_type (UINT8 type) 1236 { 1237 BT_HDR *p; 1238 UINT8 *pp; 1239 1240 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) 1241 return (FALSE); 1242 1243 pp = (UINT8 *)(p + 1); 1244 1245 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1; 1246 p->offset = 0; 1247 1248 UINT16_TO_STREAM (pp, HCI_WRITE_PIN_TYPE); 1249 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1); 1250 1251 UINT8_TO_STREAM (pp, type); 1252 1253 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1254 return (TRUE); 1255 } 1256 1257 BOOLEAN btsnd_hcic_new_unit_key (void) 1258 { 1259 BT_HDR *p; 1260 UINT8 *pp; 1261 1262 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_NEW_UNIT_KEY)) == NULL) 1263 return (FALSE); 1264 1265 pp = (UINT8 *)(p + 1); 1266 1267 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_NEW_UNIT_KEY; 1268 p->offset = 0; 1269 1270 UINT16_TO_STREAM (pp, HCI_CREATE_NEW_UNIT_KEY); 1271 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_NEW_UNIT_KEY); 1272 1273 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1274 return (TRUE); 1275 } 1276 1277 BOOLEAN btsnd_hcic_read_stored_key (BD_ADDR bd_addr, BOOLEAN read_all_flag) 1278 { 1279 BT_HDR *p; 1280 UINT8 *pp; 1281 1282 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_STORED_KEY)) == NULL) 1283 return (FALSE); 1284 1285 pp = (UINT8 *)(p + 1); 1286 1287 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_STORED_KEY; 1288 p->offset = 0; 1289 1290 UINT16_TO_STREAM (pp, HCI_READ_STORED_LINK_KEY); 1291 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_STORED_KEY); 1292 1293 BDADDR_TO_STREAM (pp, bd_addr); 1294 UINT8_TO_STREAM (pp, read_all_flag); 1295 1296 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1297 return (TRUE); 1298 } 1299 1300 BOOLEAN btsnd_hcic_write_stored_key (UINT8 num_keys, BD_ADDR *bd_addr, 1301 LINK_KEY *link_key) 1302 { 1303 BT_HDR *p; 1304 UINT8 *pp; 1305 int j; 1306 1307 if ((p = HCI_GET_CMD_BUF(1 + (num_keys * (BD_ADDR_LEN + LINK_KEY_LEN)))) == NULL) 1308 return (FALSE); 1309 1310 pp = (UINT8 *)(p + 1); 1311 1312 1313 p->len = HCIC_PREAMBLE_SIZE + 1 + (num_keys * (BD_ADDR_LEN + LINK_KEY_LEN)); 1314 p->offset = 0; 1315 1316 UINT16_TO_STREAM (pp, HCI_WRITE_STORED_LINK_KEY); 1317 UINT8_TO_STREAM (pp, p->len - HCIC_PREAMBLE_SIZE); 1318 1319 if(num_keys > HCI_MAX_NUM_OF_LINK_KEYS_PER_CMMD) 1320 num_keys = HCI_MAX_NUM_OF_LINK_KEYS_PER_CMMD; 1321 1322 UINT8_TO_STREAM (pp, num_keys); 1323 1324 for (j = 0; j < num_keys; j++) 1325 { 1326 BDADDR_TO_STREAM (pp, bd_addr[j]); 1327 ARRAY16_TO_STREAM (pp, link_key[j]); 1328 } 1329 1330 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1331 return (TRUE); 1332 } 1333 1334 BOOLEAN btsnd_hcic_delete_stored_key (BD_ADDR bd_addr, BOOLEAN delete_all_flag) 1335 { 1336 BT_HDR *p; 1337 UINT8 *pp; 1338 1339 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_DELETE_STORED_KEY)) == NULL) 1340 return (FALSE); 1341 1342 pp = (UINT8 *)(p + 1); 1343 1344 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_DELETE_STORED_KEY; 1345 p->offset = 0; 1346 1347 UINT16_TO_STREAM (pp, HCI_DELETE_STORED_LINK_KEY); 1348 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_DELETE_STORED_KEY); 1349 1350 BDADDR_TO_STREAM (pp, bd_addr); 1351 UINT8_TO_STREAM (pp, delete_all_flag); 1352 1353 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1354 return (TRUE); 1355 } 1356 1357 BOOLEAN btsnd_hcic_change_name (BD_NAME name) 1358 { 1359 BT_HDR *p; 1360 UINT8 *pp; 1361 UINT16 len = strlen ((char *)name) + 1; 1362 1363 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CHANGE_NAME)) == NULL) 1364 return (FALSE); 1365 1366 pp = (UINT8 *)(p + 1); 1367 1368 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_NAME; 1369 p->offset = 0; 1370 1371 UINT16_TO_STREAM (pp, HCI_CHANGE_LOCAL_NAME); 1372 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CHANGE_NAME); 1373 1374 ARRAY_TO_STREAM (pp, name, len); 1375 1376 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1377 return (TRUE); 1378 } 1379 1380 BOOLEAN btsnd_hcic_read_name (void) 1381 { 1382 BT_HDR *p; 1383 UINT8 *pp; 1384 1385 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 1386 return (FALSE); 1387 1388 pp = (UINT8 *)(p + 1); 1389 1390 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 1391 p->offset = 0; 1392 1393 UINT16_TO_STREAM (pp, HCI_READ_LOCAL_NAME); 1394 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 1395 1396 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1397 return (TRUE); 1398 } 1399 1400 BOOLEAN btsnd_hcic_read_conn_acc_tout (UINT8 local_controller_id) 1401 { 1402 BT_HDR *p; 1403 UINT8 *pp; 1404 1405 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 1406 return (FALSE); 1407 1408 pp = (UINT8 *)(p + 1); 1409 1410 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 1411 p->offset = 0; 1412 1413 UINT16_TO_STREAM (pp, HCI_READ_CONN_ACCEPT_TOUT); 1414 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 1415 1416 btu_hcif_send_cmd (local_controller_id, p); 1417 return (TRUE); 1418 } 1419 1420 BOOLEAN btsnd_hcic_write_conn_acc_tout (UINT8 local_controller_id, UINT16 timeout) 1421 { 1422 BT_HDR *p; 1423 UINT8 *pp; 1424 1425 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM2)) == NULL) 1426 return (FALSE); 1427 1428 pp = (UINT8 *)(p + 1); 1429 1430 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM2; 1431 p->offset = 0; 1432 1433 UINT16_TO_STREAM (pp, HCI_WRITE_CONN_ACCEPT_TOUT); 1434 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM2); 1435 1436 UINT16_TO_STREAM (pp, timeout); 1437 1438 btu_hcif_send_cmd (local_controller_id, p); 1439 return (TRUE); 1440 } 1441 1442 BOOLEAN btsnd_hcic_read_page_tout (void) 1443 { 1444 BT_HDR *p; 1445 UINT8 *pp; 1446 1447 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 1448 return (FALSE); 1449 1450 pp = (UINT8 *)(p + 1); 1451 1452 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 1453 p->offset = 0; 1454 1455 UINT16_TO_STREAM (pp, HCI_READ_PAGE_TOUT); 1456 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 1457 1458 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1459 return (TRUE); 1460 } 1461 1462 BOOLEAN btsnd_hcic_write_page_tout (UINT16 timeout) 1463 { 1464 BT_HDR *p; 1465 UINT8 *pp; 1466 1467 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM2)) == NULL) 1468 return (FALSE); 1469 1470 pp = (UINT8 *)(p + 1); 1471 1472 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM2; 1473 p->offset = 0; 1474 1475 UINT16_TO_STREAM (pp, HCI_WRITE_PAGE_TOUT); 1476 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM2); 1477 1478 UINT16_TO_STREAM (pp, timeout); 1479 1480 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1481 return (TRUE); 1482 } 1483 1484 BOOLEAN btsnd_hcic_read_scan_enable (void) 1485 { 1486 BT_HDR *p; 1487 UINT8 *pp; 1488 1489 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 1490 return (FALSE); 1491 1492 pp = (UINT8 *)(p + 1); 1493 1494 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 1495 p->offset = 0; 1496 1497 UINT16_TO_STREAM (pp, HCI_READ_SCAN_ENABLE); 1498 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 1499 1500 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1501 return (TRUE); 1502 } 1503 1504 BOOLEAN btsnd_hcic_write_scan_enable (UINT8 flag) 1505 { 1506 BT_HDR *p; 1507 UINT8 *pp; 1508 1509 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) 1510 return (FALSE); 1511 1512 pp = (UINT8 *)(p + 1); 1513 1514 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1; 1515 p->offset = 0; 1516 1517 UINT16_TO_STREAM (pp, HCI_WRITE_SCAN_ENABLE); 1518 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1); 1519 1520 UINT8_TO_STREAM (pp, flag); 1521 1522 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1523 return (TRUE); 1524 } 1525 1526 BOOLEAN btsnd_hcic_read_pagescan_cfg(void) 1527 { 1528 BT_HDR *p; 1529 UINT8 *pp; 1530 1531 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 1532 return (FALSE); 1533 1534 pp = (UINT8 *)(p + 1); 1535 1536 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 1537 p->offset = 0; 1538 1539 UINT16_TO_STREAM (pp, HCI_READ_PAGESCAN_CFG); 1540 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 1541 1542 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1543 return (TRUE); 1544 } 1545 1546 BOOLEAN btsnd_hcic_write_pagescan_cfg(UINT16 interval, UINT16 window) 1547 { 1548 BT_HDR *p; 1549 UINT8 *pp; 1550 1551 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG)) == NULL) 1552 return (FALSE); 1553 1554 pp = (UINT8 *)(p + 1); 1555 1556 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG; 1557 p->offset = 0; 1558 1559 UINT16_TO_STREAM (pp, HCI_WRITE_PAGESCAN_CFG); 1560 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG); 1561 1562 UINT16_TO_STREAM (pp, interval); 1563 UINT16_TO_STREAM (pp, window); 1564 1565 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1566 return (TRUE); 1567 } 1568 1569 BOOLEAN btsnd_hcic_read_inqscan_cfg(void) 1570 { 1571 BT_HDR *p; 1572 UINT8 *pp; 1573 1574 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 1575 return (FALSE); 1576 1577 pp = (UINT8 *)(p + 1); 1578 1579 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 1580 p->offset = 0; 1581 1582 UINT16_TO_STREAM (pp, HCI_READ_INQUIRYSCAN_CFG); 1583 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 1584 1585 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1586 return (TRUE); 1587 } 1588 1589 BOOLEAN btsnd_hcic_write_inqscan_cfg(UINT16 interval, UINT16 window) 1590 { 1591 BT_HDR *p; 1592 UINT8 *pp; 1593 1594 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG)) == NULL) 1595 return (FALSE); 1596 1597 pp = (UINT8 *)(p + 1); 1598 1599 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG; 1600 p->offset = 0; 1601 1602 UINT16_TO_STREAM (pp, HCI_WRITE_INQUIRYSCAN_CFG); 1603 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG); 1604 1605 UINT16_TO_STREAM (pp, interval); 1606 UINT16_TO_STREAM (pp, window); 1607 1608 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1609 return (TRUE); 1610 } 1611 1612 BOOLEAN btsnd_hcic_read_auth_enable (void) 1613 { 1614 BT_HDR *p; 1615 UINT8 *pp; 1616 1617 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 1618 return (FALSE); 1619 1620 pp = (UINT8 *)(p + 1); 1621 1622 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 1623 p->offset = 0; 1624 1625 UINT16_TO_STREAM (pp, HCI_READ_AUTHENTICATION_ENABLE); 1626 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 1627 1628 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1629 return (TRUE); 1630 } 1631 1632 BOOLEAN btsnd_hcic_write_auth_enable (UINT8 flag) 1633 { 1634 BT_HDR *p; 1635 UINT8 *pp; 1636 1637 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) 1638 return (FALSE); 1639 1640 pp = (UINT8 *)(p + 1); 1641 1642 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1; 1643 p->offset = 0; 1644 1645 UINT16_TO_STREAM (pp, HCI_WRITE_AUTHENTICATION_ENABLE); 1646 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1); 1647 1648 UINT8_TO_STREAM (pp, flag); 1649 1650 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1651 return (TRUE); 1652 } 1653 1654 BOOLEAN btsnd_hcic_read_encr_mode (void) 1655 { 1656 BT_HDR *p; 1657 UINT8 *pp; 1658 1659 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 1660 return (FALSE); 1661 1662 pp = (UINT8 *)(p + 1); 1663 1664 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 1665 p->offset = 0; 1666 1667 UINT16_TO_STREAM (pp, HCI_READ_ENCRYPTION_MODE); 1668 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 1669 1670 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1671 return (TRUE); 1672 } 1673 1674 BOOLEAN btsnd_hcic_write_encr_mode (UINT8 mode) 1675 { 1676 BT_HDR *p; 1677 UINT8 *pp; 1678 1679 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) 1680 return (FALSE); 1681 1682 pp = (UINT8 *)(p + 1); 1683 1684 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1; 1685 p->offset = 0; 1686 1687 UINT16_TO_STREAM (pp, HCI_WRITE_ENCRYPTION_MODE); 1688 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1); 1689 1690 UINT8_TO_STREAM (pp, mode); 1691 1692 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1693 return (TRUE); 1694 } 1695 1696 BOOLEAN btsnd_hcic_read_dev_class(void) 1697 { 1698 BT_HDR *p; 1699 UINT8 *pp; 1700 1701 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 1702 return (FALSE); 1703 1704 pp = (UINT8 *)(p + 1); 1705 1706 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 1707 p->offset = 0; 1708 1709 UINT16_TO_STREAM (pp, HCI_READ_CLASS_OF_DEVICE); 1710 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 1711 1712 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1713 return (TRUE); 1714 } 1715 1716 BOOLEAN btsnd_hcic_write_dev_class(DEV_CLASS dev_class) 1717 { 1718 BT_HDR *p; 1719 UINT8 *pp; 1720 1721 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM3)) == NULL) 1722 return (FALSE); 1723 1724 pp = (UINT8 *)(p + 1); 1725 1726 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM3; 1727 p->offset = 0; 1728 1729 UINT16_TO_STREAM (pp, HCI_WRITE_CLASS_OF_DEVICE); 1730 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM3); 1731 1732 DEVCLASS_TO_STREAM (pp, dev_class); 1733 1734 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1735 return (TRUE); 1736 } 1737 1738 BOOLEAN btsnd_hcic_read_voice_settings(void) 1739 { 1740 BT_HDR *p; 1741 UINT8 *pp; 1742 1743 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 1744 return (FALSE); 1745 1746 pp = (UINT8 *)(p + 1); 1747 1748 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 1749 p->offset = 0; 1750 1751 UINT16_TO_STREAM (pp, HCI_READ_VOICE_SETTINGS); 1752 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 1753 1754 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1755 return (TRUE); 1756 } 1757 1758 BOOLEAN btsnd_hcic_write_voice_settings(UINT16 flags) 1759 { 1760 BT_HDR *p; 1761 UINT8 *pp; 1762 1763 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM2)) == NULL) 1764 return (FALSE); 1765 1766 pp = (UINT8 *)(p + 1); 1767 1768 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM2; 1769 p->offset = 0; 1770 1771 UINT16_TO_STREAM (pp, HCI_WRITE_VOICE_SETTINGS); 1772 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM2); 1773 1774 UINT16_TO_STREAM (pp, flags); 1775 1776 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1777 return (TRUE); 1778 } 1779 1780 BOOLEAN btsnd_hcic_read_auto_flush_tout (UINT16 handle) 1781 { 1782 BT_HDR *p; 1783 UINT8 *pp; 1784 1785 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 1786 return (FALSE); 1787 1788 pp = (UINT8 *)(p + 1); 1789 1790 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 1791 p->offset = 0; 1792 1793 UINT16_TO_STREAM (pp, HCI_READ_AUTO_FLUSH_TOUT); 1794 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 1795 1796 UINT16_TO_STREAM (pp, handle); 1797 1798 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1799 return (TRUE); 1800 } 1801 1802 BOOLEAN btsnd_hcic_write_auto_flush_tout (UINT16 handle, UINT16 tout) 1803 { 1804 BT_HDR *p; 1805 UINT8 *pp; 1806 1807 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_AUTO_FLUSH_TOUT)) == NULL) 1808 return (FALSE); 1809 1810 pp = (UINT8 *)(p + 1); 1811 1812 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_AUTO_FLUSH_TOUT; 1813 p->offset = 0; 1814 1815 UINT16_TO_STREAM (pp, HCI_WRITE_AUTO_FLUSH_TOUT); 1816 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_AUTO_FLUSH_TOUT); 1817 1818 UINT16_TO_STREAM (pp, handle); 1819 UINT16_TO_STREAM (pp, tout); 1820 1821 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1822 return (TRUE); 1823 } 1824 1825 BOOLEAN btsnd_hcic_read_num_bcast_xmit (void) 1826 { 1827 BT_HDR *p; 1828 UINT8 *pp; 1829 1830 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 1831 return (FALSE); 1832 1833 pp = (UINT8 *)(p + 1); 1834 1835 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 1836 p->offset = 0; 1837 1838 UINT16_TO_STREAM (pp, HCI_READ_NUM_BCAST_REXMITS); 1839 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 1840 1841 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1842 return (TRUE); 1843 } 1844 1845 BOOLEAN btsnd_hcic_write_num_bcast_xmit (UINT8 num) 1846 { 1847 BT_HDR *p; 1848 UINT8 *pp; 1849 1850 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) 1851 return (FALSE); 1852 1853 pp = (UINT8 *)(p + 1); 1854 1855 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1; 1856 p->offset = 0; 1857 1858 UINT16_TO_STREAM (pp, HCI_WRITE_NUM_BCAST_REXMITS); 1859 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1); 1860 1861 UINT8_TO_STREAM (pp, num); 1862 1863 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1864 return (TRUE); 1865 } 1866 1867 BOOLEAN btsnd_hcic_read_hold_mode_act (void) 1868 { 1869 BT_HDR *p; 1870 UINT8 *pp; 1871 1872 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 1873 return (FALSE); 1874 1875 pp = (UINT8 *)(p + 1); 1876 1877 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 1878 p->offset = 0; 1879 1880 UINT16_TO_STREAM (pp, HCI_READ_HOLD_MODE_ACTIVITY); 1881 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 1882 1883 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1884 return (TRUE); 1885 } 1886 1887 BOOLEAN btsnd_hcic_write_hold_mode_act (UINT8 flags) 1888 { 1889 BT_HDR *p; 1890 UINT8 *pp; 1891 1892 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) 1893 return (FALSE); 1894 1895 pp = (UINT8 *)(p + 1); 1896 1897 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1; 1898 p->offset = 0; 1899 1900 UINT16_TO_STREAM (pp, HCI_WRITE_HOLD_MODE_ACTIVITY); 1901 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1); 1902 1903 UINT8_TO_STREAM (pp, flags); 1904 1905 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1906 return (TRUE); 1907 } 1908 1909 BOOLEAN btsnd_hcic_read_tx_power (UINT16 handle, UINT8 type) 1910 { 1911 BT_HDR *p; 1912 UINT8 *pp; 1913 1914 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_TX_POWER)) == NULL) 1915 return (FALSE); 1916 1917 pp = (UINT8 *)(p + 1); 1918 1919 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_TX_POWER; 1920 p->offset = 0; 1921 1922 UINT16_TO_STREAM (pp, HCI_READ_TRANSMIT_POWER_LEVEL); 1923 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_TX_POWER); 1924 1925 UINT16_TO_STREAM (pp, handle); 1926 UINT8_TO_STREAM (pp, type); 1927 1928 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1929 return (TRUE); 1930 } 1931 1932 BOOLEAN btsnd_hcic_read_sco_flow_enable (void) 1933 { 1934 BT_HDR *p; 1935 UINT8 *pp; 1936 1937 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 1938 return (FALSE); 1939 1940 pp = (UINT8 *)(p + 1); 1941 1942 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 1943 p->offset = 0; 1944 1945 UINT16_TO_STREAM (pp, HCI_READ_SCO_FLOW_CTRL_ENABLE); 1946 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 1947 1948 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1949 return (TRUE); 1950 } 1951 1952 BOOLEAN btsnd_hcic_write_sco_flow_enable (UINT8 flag) 1953 { 1954 BT_HDR *p; 1955 UINT8 *pp; 1956 1957 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) 1958 return (FALSE); 1959 1960 pp = (UINT8 *)(p + 1); 1961 1962 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1; 1963 p->offset = 0; 1964 1965 UINT16_TO_STREAM (pp, HCI_WRITE_SCO_FLOW_CTRL_ENABLE); 1966 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1); 1967 1968 UINT8_TO_STREAM (pp, flag); 1969 1970 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1971 return (TRUE); 1972 } 1973 1974 BOOLEAN btsnd_hcic_set_host_flow_ctrl (UINT8 value) 1975 { 1976 BT_HDR *p; 1977 UINT8 *pp; 1978 1979 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) 1980 return (FALSE); 1981 1982 pp = (UINT8 *)(p + 1); 1983 1984 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1; 1985 p->offset = 0; 1986 1987 UINT16_TO_STREAM (pp, HCI_SET_HC_TO_HOST_FLOW_CTRL); 1988 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1); 1989 1990 UINT8_TO_STREAM (pp, value); 1991 1992 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 1993 return (TRUE); 1994 } 1995 1996 BOOLEAN btsnd_hcic_set_host_buf_size (UINT16 acl_len, UINT8 sco_len, 1997 UINT16 acl_num, UINT16 sco_num) 1998 { 1999 BT_HDR *p; 2000 UINT8 *pp; 2001 2002 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_HOST_BUF_SIZE)) == NULL) 2003 return (FALSE); 2004 2005 pp = (UINT8 *)(p + 1); 2006 2007 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_HOST_BUF_SIZE; 2008 p->offset = 0; 2009 2010 UINT16_TO_STREAM (pp, HCI_HOST_BUFFER_SIZE); 2011 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SET_HOST_BUF_SIZE); 2012 2013 UINT16_TO_STREAM (pp, acl_len); 2014 UINT8_TO_STREAM (pp, sco_len); 2015 UINT16_TO_STREAM (pp, acl_num); 2016 UINT16_TO_STREAM (pp, sco_num); 2017 2018 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2019 return (TRUE); 2020 } 2021 2022 BOOLEAN btsnd_hcic_host_num_xmitted_pkts (UINT8 num_handles, UINT16 *handle, 2023 UINT16 *num_pkts) 2024 { 2025 BT_HDR *p; 2026 UINT8 *pp; 2027 int j; 2028 2029 if ((p = HCI_GET_CMD_BUF(1 + (num_handles * 4))) == NULL) 2030 return (FALSE); 2031 2032 pp = (UINT8 *)(p + 1); 2033 2034 p->len = HCIC_PREAMBLE_SIZE + 1 + (num_handles * 4); 2035 p->offset = 0; 2036 2037 UINT16_TO_STREAM (pp, HCI_HOST_NUM_PACKETS_DONE); 2038 UINT8_TO_STREAM (pp, p->len - HCIC_PREAMBLE_SIZE); 2039 2040 UINT8_TO_STREAM (pp, num_handles); 2041 2042 for (j = 0; j < num_handles; j++) 2043 { 2044 UINT16_TO_STREAM (pp, handle[j]); 2045 UINT16_TO_STREAM (pp, num_pkts[j]); 2046 } 2047 2048 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2049 return (TRUE); 2050 } 2051 2052 BOOLEAN btsnd_hcic_read_link_super_tout (UINT8 local_controller_id, UINT16 handle) 2053 { 2054 BT_HDR *p; 2055 UINT8 *pp; 2056 2057 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 2058 return (FALSE); 2059 2060 pp = (UINT8 *)(p + 1); 2061 2062 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 2063 p->offset = 0; 2064 2065 UINT16_TO_STREAM (pp, HCI_READ_LINK_SUPER_TOUT); 2066 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 2067 2068 UINT16_TO_STREAM (pp, handle); 2069 2070 btu_hcif_send_cmd (local_controller_id, p); 2071 return (TRUE); 2072 } 2073 2074 BOOLEAN btsnd_hcic_write_link_super_tout (UINT8 local_controller_id, UINT16 handle, UINT16 timeout) 2075 { 2076 BT_HDR *p; 2077 UINT8 *pp; 2078 2079 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_LINK_SUPER_TOUT)) == NULL) 2080 return (FALSE); 2081 2082 pp = (UINT8 *)(p + 1); 2083 2084 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_LINK_SUPER_TOUT; 2085 p->offset = 0; 2086 2087 UINT16_TO_STREAM (pp, HCI_WRITE_LINK_SUPER_TOUT); 2088 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_LINK_SUPER_TOUT); 2089 2090 UINT16_TO_STREAM (pp, handle); 2091 UINT16_TO_STREAM (pp, timeout); 2092 2093 btu_hcif_send_cmd (local_controller_id, p); 2094 return (TRUE); 2095 } 2096 2097 BOOLEAN btsnd_hcic_read_max_iac (void) 2098 { 2099 BT_HDR *p; 2100 UINT8 *pp; 2101 2102 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 2103 return (FALSE); 2104 2105 pp = (UINT8 *)(p + 1); 2106 2107 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 2108 p->offset = 0; 2109 2110 UINT16_TO_STREAM (pp, HCI_READ_NUM_SUPPORTED_IAC); 2111 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 2112 2113 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2114 return (TRUE); 2115 } 2116 2117 BOOLEAN btsnd_hcic_read_cur_iac_lap (void) 2118 { 2119 BT_HDR *p; 2120 UINT8 *pp; 2121 2122 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 2123 return (FALSE); 2124 2125 pp = (UINT8 *)(p + 1); 2126 2127 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 2128 p->offset = 0; 2129 2130 UINT16_TO_STREAM (pp, HCI_READ_CURRENT_IAC_LAP); 2131 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 2132 2133 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2134 return (TRUE); 2135 } 2136 2137 BOOLEAN btsnd_hcic_write_cur_iac_lap (UINT8 num_cur_iac, LAP * const iac_lap) 2138 { 2139 BT_HDR *p; 2140 UINT8 *pp; 2141 int i; 2142 2143 if ((p = HCI_GET_CMD_BUF(1 + (LAP_LEN * num_cur_iac))) == NULL) 2144 return (FALSE); 2145 2146 pp = (UINT8 *)(p + 1); 2147 2148 p->len = HCIC_PREAMBLE_SIZE + 1 + (LAP_LEN * num_cur_iac); 2149 p->offset = 0; 2150 2151 UINT16_TO_STREAM (pp, HCI_WRITE_CURRENT_IAC_LAP); 2152 UINT8_TO_STREAM (pp, p->len - HCIC_PREAMBLE_SIZE); 2153 2154 UINT8_TO_STREAM (pp, num_cur_iac); 2155 2156 for (i = 0; i < num_cur_iac; i++) 2157 LAP_TO_STREAM (pp, iac_lap[i]); 2158 2159 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2160 return (TRUE); 2161 } 2162 2163 BOOLEAN btsnd_hcic_read_page_scan_per (void) 2164 { 2165 BT_HDR *p; 2166 UINT8 *pp; 2167 2168 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 2169 return (FALSE); 2170 2171 pp = (UINT8 *)(p + 1); 2172 2173 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 2174 p->offset = 0; 2175 2176 UINT16_TO_STREAM (pp, HCI_READ_PAGESCAN_PERIOD_MODE); 2177 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 2178 2179 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2180 return (TRUE); 2181 } 2182 2183 BOOLEAN btsnd_hcic_write_page_scan_per (UINT8 mode) 2184 { 2185 BT_HDR *p; 2186 UINT8 *pp; 2187 2188 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) 2189 return (FALSE); 2190 2191 pp = (UINT8 *)(p + 1); 2192 2193 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1; 2194 p->offset = 0; 2195 2196 UINT16_TO_STREAM (pp, HCI_WRITE_PAGESCAN_PERIOD_MODE); 2197 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1); 2198 2199 UINT8_TO_STREAM (pp, mode); 2200 2201 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2202 return (TRUE); 2203 } 2204 2205 BOOLEAN btsnd_hcic_read_page_scan_mode (void) 2206 { 2207 BT_HDR *p; 2208 UINT8 *pp; 2209 2210 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 2211 return (FALSE); 2212 2213 pp = (UINT8 *)(p + 1); 2214 2215 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 2216 p->offset = 0; 2217 2218 UINT16_TO_STREAM (pp, HCI_READ_PAGESCAN_MODE); 2219 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 2220 2221 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2222 return (TRUE); 2223 } 2224 2225 BOOLEAN btsnd_hcic_write_page_scan_mode (UINT8 mode) 2226 { 2227 BT_HDR *p; 2228 UINT8 *pp; 2229 2230 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) 2231 return (FALSE); 2232 2233 pp = (UINT8 *)(p + 1); 2234 2235 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1; 2236 p->offset = 0; 2237 2238 UINT16_TO_STREAM (pp, HCI_WRITE_PAGESCAN_MODE); 2239 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1); 2240 2241 UINT8_TO_STREAM (pp, mode); 2242 2243 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2244 return (TRUE); 2245 } 2246 2247 /****************************************** 2248 ** Lisbon Features 2249 *******************************************/ 2250 #if BTM_SSR_INCLUDED == TRUE 2251 2252 BOOLEAN btsnd_hcic_sniff_sub_rate(UINT16 handle, UINT16 max_lat, 2253 UINT16 min_remote_lat, UINT16 min_local_lat) 2254 { 2255 BT_HDR *p; 2256 UINT8 *pp; 2257 2258 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SNIFF_SUB_RATE)) == NULL) 2259 return (FALSE); 2260 2261 pp = (UINT8 *)(p + 1); 2262 2263 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SNIFF_SUB_RATE; 2264 p->offset = 0; 2265 2266 UINT16_TO_STREAM (pp, HCI_SNIFF_SUB_RATE); 2267 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SNIFF_SUB_RATE); 2268 2269 UINT16_TO_STREAM (pp, handle); 2270 UINT16_TO_STREAM (pp, max_lat); 2271 UINT16_TO_STREAM (pp, min_remote_lat); 2272 UINT16_TO_STREAM (pp, min_local_lat); 2273 2274 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2275 return (TRUE); 2276 } 2277 #endif /* BTM_SSR_INCLUDED */ 2278 2279 #if (BTM_EIR_SERVER_INCLUDED == TRUE) 2280 /**** Extended Inquiry Response Commands ****/ 2281 BOOLEAN btsnd_hcic_read_ext_inquiry_response (void) 2282 { 2283 BT_HDR *p; 2284 UINT8 *pp; 2285 2286 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 2287 return (FALSE); 2288 2289 pp = (UINT8 *)(p + 1); 2290 2291 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 2292 p->offset = 0; 2293 2294 UINT16_TO_STREAM (pp, HCI_READ_EXT_INQ_RESPONSE); 2295 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 2296 2297 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2298 return (TRUE); 2299 } 2300 2301 void btsnd_hcic_write_ext_inquiry_response (void *buffer, UINT8 fec_req) 2302 { 2303 BT_HDR *p = (BT_HDR *)buffer; 2304 UINT8 *pp = (UINT8 *)(p + 1); 2305 2306 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_EXT_INQ_RESP; 2307 p->offset = 0; 2308 2309 UINT16_TO_STREAM (pp, HCI_WRITE_EXT_INQ_RESPONSE); 2310 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_EXT_INQ_RESP); 2311 2312 UINT8_TO_STREAM (pp, fec_req); 2313 2314 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2315 } 2316 #endif /* BTM_EIR_SERVER_INCLUDED == TRUE */ 2317 2318 /**** Simple Pairing Commands ****/ 2319 BOOLEAN btsnd_hcic_write_simple_pairing_mode (UINT8 mode) 2320 { 2321 BT_HDR *p; 2322 UINT8 *pp; 2323 2324 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_W_SIMP_PAIR)) == NULL) 2325 return (FALSE); 2326 2327 pp = (UINT8 *)(p + 1); 2328 2329 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_W_SIMP_PAIR; 2330 p->offset = 0; 2331 2332 UINT16_TO_STREAM (pp, HCI_WRITE_SIMPLE_PAIRING_MODE); 2333 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_W_SIMP_PAIR); 2334 2335 UINT8_TO_STREAM (pp, mode); 2336 2337 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2338 return (TRUE); 2339 } 2340 2341 BOOLEAN btsnd_hcic_read_simple_pairing_mode (void) 2342 { 2343 BT_HDR *p; 2344 UINT8 *pp; 2345 2346 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_R_SIMP_PAIR)) == NULL) 2347 return (FALSE); 2348 2349 pp = (UINT8 *)(p + 1); 2350 2351 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_R_SIMP_PAIR; 2352 p->offset = 0; 2353 2354 UINT16_TO_STREAM (pp, HCI_READ_SIMPLE_PAIRING_MODE); 2355 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_R_SIMP_PAIR); 2356 2357 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2358 return (TRUE); 2359 } 2360 2361 BOOLEAN btsnd_hcic_write_simp_pair_debug_mode(UINT8 debug_mode) 2362 { 2363 BT_HDR *p; 2364 UINT8 *pp; 2365 2366 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SIMP_PAIR_DBUG)) == NULL) 2367 return (FALSE); 2368 2369 pp = (UINT8 *)(p + 1); 2370 2371 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SIMP_PAIR_DBUG; 2372 p->offset = 0; 2373 2374 UINT16_TO_STREAM (pp, HCI_WRITE_SIMP_PAIR_DEBUG_MODE); 2375 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SIMP_PAIR_DBUG); 2376 2377 UINT8_TO_STREAM (pp, debug_mode); 2378 2379 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2380 return (TRUE); 2381 } 2382 2383 BOOLEAN btsnd_hcic_io_cap_req_reply (BD_ADDR bd_addr, UINT8 capability, 2384 UINT8 oob_present, UINT8 auth_req) 2385 { 2386 BT_HDR *p; 2387 UINT8 *pp; 2388 2389 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_IO_CAP_RESP)) == NULL) 2390 return (FALSE); 2391 2392 pp = (UINT8 *)(p + 1); 2393 2394 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_IO_CAP_RESP; 2395 p->offset = 0; 2396 2397 UINT16_TO_STREAM (pp, HCI_IO_CAPABILITY_RESPONSE); 2398 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_IO_CAP_RESP); 2399 2400 BDADDR_TO_STREAM (pp, bd_addr); 2401 UINT8_TO_STREAM (pp, capability); 2402 UINT8_TO_STREAM (pp, oob_present); 2403 UINT8_TO_STREAM (pp, auth_req); 2404 2405 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2406 return (TRUE); 2407 } 2408 2409 BOOLEAN btsnd_hcic_io_cap_req_neg_reply (BD_ADDR bd_addr, UINT8 err_code) 2410 { 2411 BT_HDR *p; 2412 UINT8 *pp; 2413 2414 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_IO_CAP_NEG_REPLY)) == NULL) 2415 return (FALSE); 2416 2417 pp = (UINT8 *)(p + 1); 2418 2419 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_IO_CAP_NEG_REPLY; 2420 p->offset = 0; 2421 2422 UINT16_TO_STREAM (pp, HCI_IO_CAP_REQ_NEG_REPLY); 2423 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_IO_CAP_NEG_REPLY); 2424 2425 BDADDR_TO_STREAM (pp, bd_addr); 2426 UINT8_TO_STREAM (pp, err_code); 2427 2428 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2429 return (TRUE); 2430 } 2431 2432 BOOLEAN btsnd_hcic_read_local_oob_data (void) 2433 { 2434 BT_HDR *p; 2435 UINT8 *pp; 2436 2437 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_R_LOCAL_OOB)) == NULL) 2438 return (FALSE); 2439 2440 pp = (UINT8 *)(p + 1); 2441 2442 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_R_LOCAL_OOB; 2443 p->offset = 0; 2444 2445 UINT16_TO_STREAM (pp, HCI_READ_LOCAL_OOB_DATA); 2446 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_R_LOCAL_OOB); 2447 2448 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2449 return (TRUE); 2450 } 2451 2452 BOOLEAN btsnd_hcic_user_conf_reply (BD_ADDR bd_addr, BOOLEAN is_yes) 2453 { 2454 BT_HDR *p; 2455 UINT8 *pp; 2456 2457 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_UCONF_REPLY)) == NULL) 2458 return (FALSE); 2459 2460 pp = (UINT8 *)(p + 1); 2461 2462 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_UCONF_REPLY; 2463 p->offset = 0; 2464 2465 if (!is_yes) 2466 { 2467 /* Negative reply */ 2468 UINT16_TO_STREAM (pp, HCI_USER_CONF_VALUE_NEG_REPLY); 2469 } 2470 else 2471 { 2472 /* Confirmation */ 2473 UINT16_TO_STREAM (pp, HCI_USER_CONF_REQUEST_REPLY); 2474 } 2475 2476 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_UCONF_REPLY); 2477 2478 BDADDR_TO_STREAM (pp, bd_addr); 2479 2480 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2481 return (TRUE); 2482 } 2483 2484 BOOLEAN btsnd_hcic_user_passkey_reply (BD_ADDR bd_addr, UINT32 value) 2485 { 2486 BT_HDR *p; 2487 UINT8 *pp; 2488 2489 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_U_PKEY_REPLY)) == NULL) 2490 return (FALSE); 2491 2492 pp = (UINT8 *)(p + 1); 2493 2494 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_U_PKEY_REPLY; 2495 p->offset = 0; 2496 2497 UINT16_TO_STREAM (pp, HCI_USER_PASSKEY_REQ_REPLY); 2498 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_U_PKEY_REPLY); 2499 2500 BDADDR_TO_STREAM (pp, bd_addr); 2501 UINT32_TO_STREAM (pp, value); 2502 2503 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2504 return (TRUE); 2505 } 2506 2507 BOOLEAN btsnd_hcic_user_passkey_neg_reply (BD_ADDR bd_addr) 2508 { 2509 BT_HDR *p; 2510 UINT8 *pp; 2511 2512 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_U_PKEY_NEG_REPLY)) == NULL) 2513 return (FALSE); 2514 2515 pp = (UINT8 *)(p + 1); 2516 2517 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_U_PKEY_NEG_REPLY; 2518 p->offset = 0; 2519 2520 UINT16_TO_STREAM (pp, HCI_USER_PASSKEY_REQ_NEG_REPLY); 2521 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_U_PKEY_NEG_REPLY); 2522 2523 BDADDR_TO_STREAM (pp, bd_addr); 2524 2525 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2526 return (TRUE); 2527 } 2528 2529 BOOLEAN btsnd_hcic_rem_oob_reply (BD_ADDR bd_addr, UINT8 *p_c, UINT8 *p_r) 2530 { 2531 BT_HDR *p; 2532 UINT8 *pp; 2533 2534 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REM_OOB_REPLY)) == NULL) 2535 return (FALSE); 2536 2537 pp = (UINT8 *)(p + 1); 2538 2539 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REM_OOB_REPLY; 2540 p->offset = 0; 2541 2542 UINT16_TO_STREAM (pp, HCI_REM_OOB_DATA_REQ_REPLY); 2543 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_REM_OOB_REPLY); 2544 2545 BDADDR_TO_STREAM (pp, bd_addr); 2546 ARRAY16_TO_STREAM (pp, p_c); 2547 ARRAY16_TO_STREAM (pp, p_r); 2548 2549 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2550 return (TRUE); 2551 } 2552 2553 BOOLEAN btsnd_hcic_rem_oob_neg_reply (BD_ADDR bd_addr) 2554 { 2555 BT_HDR *p; 2556 UINT8 *pp; 2557 2558 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REM_OOB_NEG_REPLY)) == NULL) 2559 return (FALSE); 2560 2561 pp = (UINT8 *)(p + 1); 2562 2563 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REM_OOB_NEG_REPLY; 2564 p->offset = 0; 2565 2566 UINT16_TO_STREAM (pp, HCI_REM_OOB_DATA_REQ_NEG_REPLY); 2567 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_REM_OOB_NEG_REPLY); 2568 2569 BDADDR_TO_STREAM (pp, bd_addr); 2570 2571 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2572 return (TRUE); 2573 } 2574 2575 2576 BOOLEAN btsnd_hcic_read_inq_tx_power (void) 2577 { 2578 BT_HDR *p; 2579 UINT8 *pp; 2580 2581 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_R_TX_POWER)) == NULL) 2582 return (FALSE); 2583 2584 pp = (UINT8 *)(p + 1); 2585 2586 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_R_TX_POWER; 2587 p->offset = 0; 2588 2589 UINT16_TO_STREAM (pp, HCI_READ_INQ_TX_POWER_LEVEL); 2590 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_R_TX_POWER); 2591 2592 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2593 return (TRUE); 2594 } 2595 2596 BOOLEAN btsnd_hcic_write_inq_tx_power (INT8 level) 2597 { 2598 BT_HDR *p; 2599 UINT8 *pp; 2600 2601 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_W_TX_POWER)) == NULL) 2602 return (FALSE); 2603 2604 pp = (UINT8 *)(p + 1); 2605 2606 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_W_TX_POWER; 2607 p->offset = 0; 2608 2609 UINT16_TO_STREAM (pp, HCI_WRITE_INQ_TX_POWER_LEVEL); 2610 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_W_TX_POWER); 2611 2612 INT8_TO_STREAM (pp, level); 2613 2614 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2615 return (TRUE); 2616 } 2617 2618 #if 0 /* currently not been used */ 2619 BOOLEAN btsnd_hcic_read_default_erroneous_data_rpt (void) 2620 { 2621 BT_HDR *p; 2622 UINT8 *pp; 2623 2624 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_R_ERR_DATA_RPT)) == NULL) 2625 return (FALSE); 2626 2627 pp = (UINT8 *)(p + 1); 2628 2629 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_R_ERR_DATA_RPT; 2630 p->offset = 0; 2631 2632 UINT16_TO_STREAM (pp, HCI_READ_ERRONEOUS_DATA_RPT); 2633 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_R_ERR_DATA_RPT); 2634 2635 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2636 return (TRUE); 2637 } 2638 #endif 2639 2640 BOOLEAN btsnd_hcic_write_default_erroneous_data_rpt (UINT8 flag) 2641 { 2642 BT_HDR *p; 2643 UINT8 *pp; 2644 2645 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_W_ERR_DATA_RPT)) == NULL) 2646 return (FALSE); 2647 2648 pp = (UINT8 *)(p + 1); 2649 2650 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_W_ERR_DATA_RPT; 2651 p->offset = 0; 2652 2653 UINT16_TO_STREAM (pp, HCI_WRITE_ERRONEOUS_DATA_RPT); 2654 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_W_ERR_DATA_RPT); 2655 2656 UINT8_TO_STREAM (pp, flag); 2657 2658 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2659 return (TRUE); 2660 } 2661 2662 BOOLEAN btsnd_hcic_send_keypress_notif (BD_ADDR bd_addr, UINT8 notif) 2663 { 2664 BT_HDR *p; 2665 UINT8 *pp; 2666 2667 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SEND_KEYPRESS_NOTIF)) == NULL) 2668 return (FALSE); 2669 2670 pp = (UINT8 *)(p + 1); 2671 2672 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SEND_KEYPRESS_NOTIF; 2673 p->offset = 0; 2674 2675 UINT16_TO_STREAM (pp, HCI_SEND_KEYPRESS_NOTIF); 2676 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SEND_KEYPRESS_NOTIF); 2677 2678 BDADDR_TO_STREAM (pp, bd_addr); 2679 UINT8_TO_STREAM (pp, notif); 2680 2681 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2682 return (TRUE); 2683 } 2684 2685 /**** end of Simple Pairing Commands ****/ 2686 2687 #if L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE 2688 BOOLEAN btsnd_hcic_enhanced_flush (UINT16 handle, UINT8 packet_type) 2689 { 2690 BT_HDR *p; 2691 UINT8 *pp; 2692 2693 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ENHANCED_FLUSH)) == NULL) 2694 return (FALSE); 2695 2696 pp = (UINT8 *)(p + 1); 2697 2698 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ENHANCED_FLUSH; 2699 p->offset = 0; 2700 UINT16_TO_STREAM (pp, HCI_ENHANCED_FLUSH); 2701 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_ENHANCED_FLUSH); 2702 2703 UINT16_TO_STREAM (pp, handle); 2704 UINT8_TO_STREAM (pp, packet_type); 2705 2706 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2707 return (TRUE); 2708 } 2709 #endif 2710 2711 2712 BOOLEAN btsnd_hcic_refresh_encryption_key (UINT16 handle) 2713 { 2714 BT_HDR *p; 2715 UINT8 *pp; 2716 2717 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 2718 return (FALSE); 2719 2720 pp = (UINT8 *)(p + 1); 2721 2722 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 2723 p->offset = 0; 2724 UINT16_TO_STREAM (pp, HCI_REFRESH_ENCRYPTION_KEY); 2725 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 2726 2727 UINT16_TO_STREAM (pp, handle); 2728 2729 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2730 return (TRUE); 2731 } 2732 /************************* 2733 ** End of Lisbon Commands 2734 **************************/ 2735 2736 BOOLEAN btsnd_hcic_read_local_ver (UINT8 local_controller_id) 2737 { 2738 BT_HDR *p; 2739 UINT8 *pp; 2740 2741 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 2742 return (FALSE); 2743 2744 pp = (UINT8 *)(p + 1); 2745 2746 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 2747 p->offset = 0; 2748 2749 UINT16_TO_STREAM (pp, HCI_READ_LOCAL_VERSION_INFO); 2750 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 2751 2752 btu_hcif_send_cmd (local_controller_id, p); 2753 return (TRUE); 2754 } 2755 2756 BOOLEAN btsnd_hcic_read_local_supported_cmds (UINT8 local_controller_id) 2757 { 2758 BT_HDR *p; 2759 UINT8 *pp; 2760 2761 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 2762 return (FALSE); 2763 2764 pp = (UINT8 *)(p + 1); 2765 2766 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 2767 p->offset = 0; 2768 2769 UINT16_TO_STREAM (pp, HCI_READ_LOCAL_SUPPORTED_CMDS); 2770 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 2771 2772 btu_hcif_send_cmd (local_controller_id, p); 2773 return (TRUE); 2774 } 2775 2776 BOOLEAN btsnd_hcic_read_local_features (void) 2777 { 2778 BT_HDR *p; 2779 UINT8 *pp; 2780 2781 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 2782 return (FALSE); 2783 2784 pp = (UINT8 *)(p + 1); 2785 2786 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 2787 p->offset = 0; 2788 2789 UINT16_TO_STREAM (pp, HCI_READ_LOCAL_FEATURES); 2790 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 2791 2792 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2793 return (TRUE); 2794 } 2795 2796 BOOLEAN btsnd_hcic_read_local_ext_features (UINT8 page_num) 2797 { 2798 BT_HDR *p; 2799 UINT8 *pp; 2800 2801 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LOCAL_EXT_FEATURES)) == NULL) 2802 return (FALSE); 2803 2804 pp = (UINT8 *)(p + 1); 2805 2806 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LOCAL_EXT_FEATURES; 2807 p->offset = 0; 2808 2809 UINT16_TO_STREAM (pp, HCI_READ_LOCAL_EXT_FEATURES); 2810 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_LOCAL_EXT_FEATURES); 2811 2812 UINT8_TO_STREAM (pp, page_num); 2813 2814 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2815 return (TRUE); 2816 } 2817 2818 BOOLEAN btsnd_hcic_read_buffer_size (void) 2819 { 2820 BT_HDR *p; 2821 UINT8 *pp; 2822 2823 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 2824 return (FALSE); 2825 2826 pp = (UINT8 *)(p + 1); 2827 2828 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 2829 p->offset = 0; 2830 2831 UINT16_TO_STREAM (pp, HCI_READ_BUFFER_SIZE); 2832 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 2833 2834 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2835 return (TRUE); 2836 } 2837 2838 BOOLEAN btsnd_hcic_read_country_code (void) 2839 { 2840 BT_HDR *p; 2841 UINT8 *pp; 2842 2843 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 2844 return (FALSE); 2845 2846 pp = (UINT8 *)(p + 1); 2847 2848 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 2849 p->offset = 0; 2850 2851 UINT16_TO_STREAM (pp, HCI_READ_COUNTRY_CODE); 2852 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 2853 2854 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2855 return (TRUE); 2856 } 2857 2858 BOOLEAN btsnd_hcic_read_bd_addr (void) 2859 { 2860 BT_HDR *p; 2861 UINT8 *pp; 2862 2863 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 2864 return (FALSE); 2865 2866 pp = (UINT8 *)(p + 1); 2867 2868 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 2869 p->offset = 0; 2870 2871 UINT16_TO_STREAM (pp, HCI_READ_BD_ADDR); 2872 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 2873 2874 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2875 return (TRUE); 2876 } 2877 2878 BOOLEAN btsnd_hcic_read_fail_contact_count (UINT8 local_controller_id, UINT16 handle) 2879 { 2880 BT_HDR *p; 2881 UINT8 *pp; 2882 2883 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 2884 return (FALSE); 2885 2886 pp = (UINT8 *)(p + 1); 2887 2888 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 2889 p->offset = 0; 2890 2891 UINT16_TO_STREAM (pp, HCI_READ_FAILED_CONTACT_COUNT); 2892 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 2893 2894 UINT16_TO_STREAM (pp, handle); 2895 2896 btu_hcif_send_cmd (local_controller_id, p); 2897 return (TRUE); 2898 } 2899 2900 BOOLEAN btsnd_hcic_reset_fail_contact_count (UINT8 local_controller_id, UINT16 handle) 2901 { 2902 BT_HDR *p; 2903 UINT8 *pp; 2904 2905 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 2906 return (FALSE); 2907 2908 pp = (UINT8 *)(p + 1); 2909 2910 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 2911 p->offset = 0; 2912 2913 UINT16_TO_STREAM (pp, HCI_RESET_FAILED_CONTACT_COUNT); 2914 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 2915 2916 UINT16_TO_STREAM (pp, handle); 2917 2918 btu_hcif_send_cmd (local_controller_id, p); 2919 return (TRUE); 2920 } 2921 2922 BOOLEAN btsnd_hcic_get_link_quality (UINT16 handle) 2923 { 2924 BT_HDR *p; 2925 UINT8 *pp; 2926 2927 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 2928 return (FALSE); 2929 2930 pp = (UINT8 *)(p + 1); 2931 2932 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 2933 p->offset = 0; 2934 2935 UINT16_TO_STREAM (pp, HCI_GET_LINK_QUALITY); 2936 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 2937 2938 UINT16_TO_STREAM (pp, handle); 2939 2940 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2941 return (TRUE); 2942 } 2943 2944 BOOLEAN btsnd_hcic_read_rssi (UINT16 handle) 2945 { 2946 BT_HDR *p; 2947 UINT8 *pp; 2948 2949 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 2950 return (FALSE); 2951 2952 pp = (UINT8 *)(p + 1); 2953 2954 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 2955 p->offset = 0; 2956 2957 UINT16_TO_STREAM (pp, HCI_READ_RSSI); 2958 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 2959 2960 UINT16_TO_STREAM (pp, handle); 2961 2962 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2963 return (TRUE); 2964 } 2965 2966 BOOLEAN btsnd_hcic_read_loopback_mode (void) 2967 { 2968 BT_HDR *p; 2969 UINT8 *pp; 2970 2971 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 2972 return (FALSE); 2973 2974 pp = (UINT8 *)(p + 1); 2975 2976 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 2977 p->offset = 0; 2978 2979 UINT16_TO_STREAM (pp, HCI_READ_LOOPBACK_MODE); 2980 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 2981 2982 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 2983 return (TRUE); 2984 } 2985 2986 BOOLEAN btsnd_hcic_write_loopback_mode (UINT8 mode) 2987 { 2988 BT_HDR *p; 2989 UINT8 *pp; 2990 2991 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) 2992 return (FALSE); 2993 2994 pp = (UINT8 *)(p + 1); 2995 2996 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1; 2997 p->offset = 0; 2998 2999 UINT16_TO_STREAM (pp, HCI_WRITE_LOOPBACK_MODE); 3000 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1); 3001 3002 UINT8_TO_STREAM (pp, mode); 3003 3004 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 3005 return (TRUE); 3006 } 3007 3008 BOOLEAN btsnd_hcic_enable_test_mode (void) 3009 { 3010 BT_HDR *p; 3011 UINT8 *pp; 3012 3013 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 3014 return (FALSE); 3015 3016 pp = (UINT8 *)(p + 1); 3017 3018 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 3019 p->offset = 0; 3020 3021 UINT16_TO_STREAM (pp, HCI_ENABLE_DEV_UNDER_TEST_MODE); 3022 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 3023 3024 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 3025 return (TRUE); 3026 } 3027 3028 BOOLEAN btsnd_hcic_write_afh_channel_assessment_mode (UINT8 mode) 3029 { 3030 BT_HDR *p; 3031 UINT8 *pp; 3032 3033 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) 3034 return (FALSE); 3035 3036 pp = (UINT8 *)(p + 1); 3037 3038 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1; 3039 p->offset = 0; 3040 3041 UINT16_TO_STREAM (pp, HCI_WRITE_AFH_ASSESSMENT_MODE); 3042 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1); 3043 3044 UINT8_TO_STREAM (pp, mode); 3045 3046 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 3047 return (TRUE); 3048 } 3049 3050 BOOLEAN btsnd_hcic_read_afh_channel_assessment_mode(void) 3051 { 3052 BT_HDR *p; 3053 UINT8 *pp; 3054 3055 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 3056 return (FALSE); 3057 3058 pp = (UINT8 *)(p + 1); 3059 3060 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 3061 p->offset = 0; 3062 3063 UINT16_TO_STREAM (pp, HCI_READ_AFH_ASSESSMENT_MODE); 3064 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 3065 3066 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 3067 return (TRUE); 3068 } 3069 3070 BOOLEAN btsnd_hcic_set_afh_channels (UINT8 first, UINT8 last) 3071 { 3072 BT_HDR *p; 3073 UINT8 *pp; 3074 UINT8 channels[10] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F}; 3075 int i; 3076 3077 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_AFH_CHANNELS)) == NULL) 3078 return (FALSE); 3079 3080 pp = (UINT8 *)(p + 1); 3081 3082 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_AFH_CHANNELS; 3083 p->offset = 0; 3084 3085 UINT16_TO_STREAM (pp, HCI_SET_AFH_CHANNELS); 3086 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SET_AFH_CHANNELS); 3087 3088 /* Just make sure that caller did not exceed 79 Bluetooth channels */ 3089 if ((first <= last) && (last <= 78)) 3090 { 3091 for (i = first; i <= last; i++) 3092 { 3093 int byte_offset = i / 8; 3094 int bit_offset = i % 8; 3095 channels[byte_offset] &= ~(1 << bit_offset); 3096 } 3097 } 3098 for (i = 0; i < 10; i++) 3099 *pp++ = channels[i]; 3100 3101 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 3102 return (TRUE); 3103 } 3104 3105 BOOLEAN btsnd_hcic_set_afh_host_channel_class (UINT8 *p_afhchannelmap) 3106 { 3107 BT_HDR *p; 3108 UINT8 *pp; 3109 int i; 3110 3111 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_AFH_CHANNELS)) == NULL) 3112 return (FALSE); 3113 3114 pp = (UINT8 *)(p + 1); 3115 3116 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_AFH_CHANNELS; 3117 p->offset = 0; 3118 3119 UINT16_TO_STREAM (pp, HCI_SET_AFH_CHANNELS); 3120 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SET_AFH_CHANNELS); 3121 3122 /* Copy and convert */ 3123 for (i = 0; i < 10; i++) 3124 *pp++ = p_afhchannelmap[9-i]; 3125 3126 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 3127 return (TRUE); 3128 } 3129 3130 BOOLEAN btsnd_hcic_read_afh_channel_map (UINT16 handle) 3131 { 3132 BT_HDR *p; 3133 UINT8 *pp; 3134 3135 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) 3136 return (FALSE); 3137 3138 pp = (UINT8 *)(p + 1); 3139 3140 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE; 3141 p->offset = 0; 3142 3143 UINT16_TO_STREAM (pp, HCI_READ_AFH_CH_MAP); 3144 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE); 3145 3146 UINT16_TO_STREAM (pp, handle); 3147 3148 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 3149 return (TRUE); 3150 } 3151 3152 BOOLEAN btsnd_hcic_read_clock (UINT16 handle, UINT8 which_clock) 3153 { 3154 BT_HDR *p; 3155 UINT8 *pp; 3156 3157 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CLOCK)) == NULL) 3158 return (FALSE); 3159 3160 pp = (UINT8 *)(p + 1); 3161 3162 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CLOCK; 3163 p->offset = 0; 3164 3165 UINT16_TO_STREAM (pp, HCI_READ_CLOCK); 3166 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CLOCK); 3167 3168 UINT16_TO_STREAM (pp, handle); 3169 UINT8_TO_STREAM (pp, which_clock); 3170 3171 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 3172 return (TRUE); 3173 } 3174 3175 BOOLEAN btsnd_hcic_read_inqscan_type(void) 3176 { 3177 BT_HDR *p; 3178 UINT8 *pp; 3179 3180 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 3181 return (FALSE); 3182 3183 pp = (UINT8 *)(p + 1); 3184 3185 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 3186 p->offset = 0; 3187 3188 UINT16_TO_STREAM (pp, HCI_READ_INQSCAN_TYPE); 3189 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 3190 3191 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 3192 return (TRUE); 3193 } 3194 3195 BOOLEAN btsnd_hcic_write_inqscan_type (UINT8 type) 3196 { 3197 BT_HDR *p; 3198 UINT8 *pp; 3199 3200 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) 3201 return (FALSE); 3202 3203 pp = (UINT8 *)(p + 1); 3204 3205 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1; 3206 p->offset = 0; 3207 3208 UINT16_TO_STREAM (pp, HCI_WRITE_INQSCAN_TYPE); 3209 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1); 3210 3211 UINT8_TO_STREAM (pp, type); 3212 3213 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 3214 return (TRUE); 3215 } 3216 3217 BOOLEAN btsnd_hcic_read_inquiry_mode (void) 3218 { 3219 BT_HDR *p; 3220 UINT8 *pp; 3221 3222 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 3223 return (FALSE); 3224 3225 pp = (UINT8 *)(p + 1); 3226 3227 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 3228 p->offset = 0; 3229 3230 UINT16_TO_STREAM (pp, HCI_READ_INQUIRY_MODE); 3231 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 3232 3233 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 3234 return (TRUE); 3235 } 3236 3237 BOOLEAN btsnd_hcic_write_inquiry_mode (UINT8 mode) 3238 { 3239 BT_HDR *p; 3240 UINT8 *pp; 3241 3242 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) 3243 return (FALSE); 3244 3245 pp = (UINT8 *)(p + 1); 3246 3247 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1; 3248 p->offset = 0; 3249 3250 UINT16_TO_STREAM (pp, HCI_WRITE_INQUIRY_MODE); 3251 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1); 3252 3253 UINT8_TO_STREAM (pp, mode); 3254 3255 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 3256 return (TRUE); 3257 } 3258 3259 BOOLEAN btsnd_hcic_read_pagescan_type (void) 3260 { 3261 BT_HDR *p; 3262 UINT8 *pp; 3263 3264 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 3265 return (FALSE); 3266 3267 pp = (UINT8 *)(p + 1); 3268 3269 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 3270 p->offset = 0; 3271 3272 UINT16_TO_STREAM (pp, HCI_READ_PAGESCAN_TYPE); 3273 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 3274 3275 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 3276 return (TRUE); 3277 } 3278 3279 BOOLEAN btsnd_hcic_write_pagescan_type (UINT8 type) 3280 { 3281 BT_HDR *p; 3282 UINT8 *pp; 3283 3284 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) 3285 return (FALSE); 3286 3287 pp = (UINT8 *)(p + 1); 3288 3289 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1; 3290 p->offset = 0; 3291 3292 UINT16_TO_STREAM (pp, HCI_WRITE_PAGESCAN_TYPE); 3293 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1); 3294 3295 UINT8_TO_STREAM (pp, type); 3296 3297 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 3298 return (TRUE); 3299 } 3300 3301 /* Must have room to store BT_HDR + max VSC length + callback pointer */ 3302 #if !defined (LMP_TEST) && (HCI_CMD_POOL_BUF_SIZE < 268) 3303 #error "HCI_CMD_POOL_BUF_SIZE must be larger than 268" 3304 #endif 3305 3306 void btsnd_hcic_vendor_spec_cmd (void *buffer, UINT16 opcode, UINT8 len, 3307 UINT8 *p_data, void *p_cmd_cplt_cback) 3308 { 3309 BT_HDR *p = (BT_HDR *)buffer; 3310 UINT8 *pp = (UINT8 *)(p + 1); 3311 3312 p->len = HCIC_PREAMBLE_SIZE + len; 3313 p->offset = sizeof(void *); 3314 3315 *((void **)pp) = p_cmd_cplt_cback; /* Store command complete callback in buffer */ 3316 pp += sizeof(void *); /* Skip over callback pointer */ 3317 3318 UINT16_TO_STREAM (pp, HCI_GRP_VENDOR_SPECIFIC | opcode); 3319 UINT8_TO_STREAM (pp, len); 3320 ARRAY_TO_STREAM (pp, p_data, len); 3321 3322 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 3323 } 3324 3325 void btsnd_hcic_data (BT_HDR *p_buf, UINT16 len, UINT16 handle, UINT8 boundary, UINT8 broadcast) 3326 { 3327 UINT8 *p; 3328 3329 /* Higher layer should have left 4 bytes for us to fill the header */ 3330 p_buf->offset -= 4; 3331 p_buf->len += 4; 3332 3333 /* Find the pointer to the beginning of the data */ 3334 p = (UINT8 *)(p_buf + 1) + p_buf->offset; 3335 3336 UINT16_TO_STREAM (p, handle | ((boundary & 3) << 12) | ((broadcast & 3) << 14)); 3337 UINT16_TO_STREAM (p, len); 3338 3339 HCI_ACL_DATA_TO_LOWER (p_buf); 3340 } 3341 3342 BOOLEAN btsnd_hcic_nop (void) 3343 { 3344 BT_HDR *p; 3345 UINT8 *pp; 3346 3347 if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) 3348 return (FALSE); 3349 3350 pp = (UINT8 *)(p + 1); 3351 3352 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD; 3353 p->offset = 0; 3354 3355 UINT16_TO_STREAM (pp, HCI_COMMAND_NONE); 3356 UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD); 3357 3358 btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); 3359 return (TRUE); 3360 } 3361 3362