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 functions that handle BTM interface functions for the 22 * Bluetooth device including Rest, HCI buffer size and others 23 * 24 ******************************************************************************/ 25 26 #include <stdlib.h> 27 #include <string.h> 28 #include <stdio.h> 29 #include <stddef.h> 30 31 #include "bt_types.h" 32 #include "hcimsgs.h" 33 #include "btu.h" 34 #include "btm_int.h" 35 #include "l2c_int.h" 36 37 #if BLE_INCLUDED == TRUE 38 #include "gatt_int.h" 39 40 #endif /* BLE_INCLUDED */ 41 42 /* BTM_APP_DEV_INIT should be defined if additional controller initialization is 43 ** needed by the application to be performed after the HCI reset 44 */ 45 #ifdef BTM_APP_DEV_INIT 46 extern void BTM_APP_DEV_INIT(void); 47 #endif 48 49 #ifdef BTA_PRM_CHECK_FW_VER 50 extern BOOLEAN BTA_PRM_CHECK_FW_VER(UINT8 *p); 51 #endif 52 53 #ifndef TT_DEV_RESET_MASK 54 #define TT_DEV_RESET_MASK 0xff 55 #endif 56 57 /********************************************************************************/ 58 /* L O C A L D A T A D E F I N I T I O N S */ 59 /********************************************************************************/ 60 61 /* The default class of device. */ 62 #ifndef BTM_INIT_CLASS_OF_DEVICE 63 #define BTM_INIT_CLASS_OF_DEVICE "\x00\x1F\x00" 64 #endif 65 66 #ifndef BTM_DEV_RESET_TIMEOUT 67 #define BTM_DEV_RESET_TIMEOUT 4 68 #endif 69 70 #define BTM_DEV_REPLY_TIMEOUT 2 /* 1 second expiration time is not good. Timer may start between 0 and 1 second. */ 71 /* if it starts at the very end of the 0 second, timer will expire really easily. */ 72 73 #define BTM_INFO_TIMEOUT 5 /* 5 seconds for info response */ 74 75 /* After Reset a timeout can be specified in the target.h for specific targets 76 * that may require additional time to reset 77 * otherwise no timeout is required 78 */ 79 #ifndef BTM_AFTER_RESET_TIMEOUT 80 #define BTM_AFTER_RESET_TIMEOUT 0 81 #endif 82 83 /* Internal baseband so the parameters such as local features, version etc. are known 84 so there is no need to issue HCI commands and wait for responses at BTM initialization */ 85 #ifndef BTM_INTERNAL_BB 86 #define BTM_INTERNAL_BB FALSE 87 #endif 88 89 /* The local version information in the format specified in the HCI read local version 90 response message */ 91 #ifndef BTM_INTERNAL_LOCAL_VER 92 #define BTM_INTERNAL_LOCAL_VER {0x00, 0x01, 0x05, 0x81, 0x01, 0x30, 0x00, 0x40, 0x8D} 93 #endif 94 95 /* The local features information in the format specified in the HCI read local features 96 response message */ 97 #ifndef BTM_INTERNAL_LOCAL_FEA 98 #define BTM_INTERNAL_LOCAL_FEA {0x00, 0xFF, 0xF9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00} 99 #endif 100 101 #ifndef BTM_SET_DEV_NAME_UPON_RESET 102 #define BTM_SET_DEV_NAME_UPON_RESET TRUE 103 #endif 104 105 /* host SCO buffer size */ 106 #ifndef BTM_SCO_HOST_BUF_SIZE 107 #define BTM_SCO_HOST_BUF_SIZE 0xff 108 #endif 109 110 /********************************************************************************/ 111 /* L O C A L F U N C T I O N P R O T O T Y P E S */ 112 /********************************************************************************/ 113 static void btm_dev_reset (void); 114 static void btm_after_reset_hold_complete (void); 115 static void btm_continue_reset (void); 116 117 static void btm_get_local_ext_features (UINT8 page_number); 118 static void btm_decode_ext_features_page (UINT8 page_number, const BD_FEATURES p_features); 119 static void btm_read_all_lmp_features_complete (UINT8 max_page_number); 120 static void btm_set_lmp_features_host_may_support (UINT8 max_page_number); 121 static void btm_get_local_features (void); 122 static void btm_issue_host_support_for_lmp_features (void); 123 static void btm_read_local_supported_cmds (UINT8 local_controller_id); 124 125 #if BLE_INCLUDED == TRUE 126 static void btm_read_ble_local_supported_features (void); 127 #endif 128 129 /******************************************************************************* 130 ** 131 ** Function btm_dev_init 132 ** 133 ** Description This function is on the BTM startup 134 ** 135 ** Returns void 136 ** 137 *******************************************************************************/ 138 void btm_dev_init (void) 139 { 140 #if 0 /* cleared in btm_init; put back in if called from anywhere else! */ 141 memset (&btm_cb.devcb, 0, sizeof (tBTM_DEVCB)); 142 #endif 143 144 /* Initialize nonzero defaults */ 145 #if (BTM_MAX_LOC_BD_NAME_LEN > 0) 146 memset(btm_cb.cfg.bd_name, 0, sizeof(tBTM_LOC_BD_NAME)); 147 #endif 148 149 btm_cb.devcb.reset_timer.param = (TIMER_PARAM_TYPE)TT_DEV_RESET; 150 btm_cb.devcb.rln_timer.param = (TIMER_PARAM_TYPE)TT_DEV_RLN; 151 btm_cb.devcb.rlinkp_timer.param = (TIMER_PARAM_TYPE)TT_DEV_RLNKP; 152 153 btm_cb.btm_acl_pkt_types_supported = BTM_ACL_PKT_TYPES_MASK_DH1 + BTM_ACL_PKT_TYPES_MASK_DM1 + 154 BTM_ACL_PKT_TYPES_MASK_DH3 + BTM_ACL_PKT_TYPES_MASK_DM3 + 155 BTM_ACL_PKT_TYPES_MASK_DH5 + BTM_ACL_PKT_TYPES_MASK_DM5; 156 157 btm_cb.btm_sco_pkt_types_supported = BTM_SCO_PKT_TYPES_MASK_HV1 + 158 BTM_SCO_PKT_TYPES_MASK_HV2 + 159 BTM_SCO_PKT_TYPES_MASK_HV3 + 160 BTM_SCO_PKT_TYPES_MASK_EV3 + 161 BTM_SCO_PKT_TYPES_MASK_EV4 + 162 BTM_SCO_PKT_TYPES_MASK_EV5; 163 164 btm_cb.first_disabled_channel = 0xff; /* To allow disabling 0th channel alone */ 165 btm_cb.last_disabled_channel = 0xff; /* To allow disabling 0th channel alone */ 166 167 #if (BTM_AUTOMATIC_HCI_RESET == TRUE) 168 169 #if (BTM_FIRST_RESET_DELAY > 0) 170 btm_cb.devcb.state = BTM_DEV_STATE_WAIT_RESET_CMPLT; 171 btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_FIRST_RESET_DELAY); 172 #else 173 btm_dev_reset(); 174 #endif 175 176 #else 177 BTM_TRACE_EVENT0 ("BTM_AUTOMATIC_HCI_RESET is FALSE, so skip btm reset for now"); 178 #endif 179 180 } 181 182 183 /******************************************************************************* 184 ** 185 ** Function btm_db_reset 186 ** 187 ** Description This function is called by BTM_DeviceReset and clears out any 188 ** pending callbacks for inquiries, discoveries, other pending 189 ** functions that may be in progress. 190 ** 191 ** Returns void 192 ** 193 *******************************************************************************/ 194 static void btm_db_reset (void) 195 { 196 tBTM_CMPL_CB *p_cb; 197 tBTM_STATUS status = BTM_DEV_RESET; 198 199 btm_inq_db_reset(); 200 201 if (btm_cb.devcb.p_rln_cmpl_cb) 202 { 203 p_cb = btm_cb.devcb.p_rln_cmpl_cb; 204 btm_cb.devcb.p_rln_cmpl_cb = NULL; 205 206 if (p_cb) 207 (*p_cb)((void *) NULL); 208 } 209 210 if (btm_cb.devcb.p_rlinkp_cmpl_cb) 211 { 212 p_cb = btm_cb.devcb.p_rlinkp_cmpl_cb; 213 btm_cb.devcb.p_rlinkp_cmpl_cb = NULL; 214 215 if (p_cb) 216 (*p_cb)((void *) &status); 217 } 218 219 if (btm_cb.devcb.p_rssi_cmpl_cb) 220 { 221 p_cb = btm_cb.devcb.p_rssi_cmpl_cb; 222 btm_cb.devcb.p_rssi_cmpl_cb = NULL; 223 224 if (p_cb) 225 (*p_cb)((tBTM_RSSI_RESULTS *) &status); 226 } 227 } 228 229 230 231 /******************************************************************************* 232 ** 233 ** Function btm_dev_absent 234 ** 235 ** Description This function is called by when it is detected that the 236 ** device is not connected any more. 237 ** 238 ** Returns void 239 ** 240 *******************************************************************************/ 241 void btm_dev_absent (void) 242 { 243 btm_cb.devcb.state = BTM_DEV_STATE_WAIT_RESET_CMPLT; 244 245 btm_db_reset (); 246 btm_inq_db_reset(); 247 248 /* If anyone wants device status notifications, give him one */ 249 btm_report_device_status (BTM_DEV_STATUS_DOWN); 250 251 btu_stop_timer (&btm_cb.devcb.reset_timer); 252 } 253 254 255 /******************************************************************************* 256 ** 257 ** Function BTM_DeviceReset 258 ** 259 ** Description This function is called to reset the HCI. Callback function 260 ** if provided is called when startup of the device is 261 ** completed. 262 ** 263 ** Returns void 264 ** 265 *******************************************************************************/ 266 void BTM_DeviceReset (tBTM_CMPL_CB *p_cb) 267 { 268 tBTM_STATUS status; 269 270 /* If device is already resetting, do not allow another */ 271 if ((!btm_cb.devcb.p_reset_cmpl_cb) || (btm_cb.devcb.p_reset_cmpl_cb == p_cb)) 272 { 273 /* Flush all ACL connections */ 274 btm_acl_device_down(); 275 276 /* Clear the callback, so application would not hang on reset */ 277 btm_db_reset(); 278 279 /* Save address of the completion routine, if provided */ 280 btm_cb.devcb.p_reset_cmpl_cb = p_cb; 281 282 btm_dev_reset (); 283 } 284 else 285 { 286 /* pass an error to the bad callback, another one was already provided */ 287 if (p_cb) 288 { 289 status = BTM_ILLEGAL_VALUE; 290 p_cb (&status); 291 } 292 } 293 } 294 295 296 /******************************************************************************* 297 ** 298 ** Function BTM_IsDeviceUp 299 ** 300 ** Description This function is called to check if the device is up. 301 ** 302 ** Returns TRUE if device is up, else FALSE 303 ** 304 *******************************************************************************/ 305 BOOLEAN BTM_IsDeviceUp (void) 306 { 307 return ((BOOLEAN) (btm_cb.devcb.state == BTM_DEV_STATE_READY)); 308 } 309 310 /******************************************************************************* 311 ** 312 ** Function BTM_SetAfhChannels 313 ** 314 ** Description This function is called disable channels 315 ** 316 ** Returns tBTM_STATUS 317 ** 318 *******************************************************************************/ 319 tBTM_STATUS BTM_SetAfhChannels (UINT8 first, UINT8 last) 320 { 321 BTM_TRACE_API4 ("BTM_SetAfhChannels first: %d (%d) last: %d (%d)", 322 first, btm_cb.first_disabled_channel, last, 323 btm_cb.last_disabled_channel); 324 325 /* Make sure the local device supports the feature before sending */ 326 if ((!HCI_LMP_AFH_CAP_MASTR_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0])) && 327 (!HCI_LMP_AFH_CLASS_SLAVE_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0])) && 328 (!HCI_LMP_AFH_CLASS_MASTR_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]))) 329 return (BTM_MODE_UNSUPPORTED); 330 331 if (!BTM_IsDeviceUp()) 332 return (BTM_WRONG_MODE); 333 334 if ((btm_cb.first_disabled_channel != first) 335 || (btm_cb.last_disabled_channel != last)) 336 { 337 if (btsnd_hcic_set_afh_channels (first, last)) 338 { 339 btm_cb.first_disabled_channel = first; 340 btm_cb.last_disabled_channel = last; 341 } 342 else 343 return (BTM_NO_RESOURCES); 344 } 345 return (BTM_SUCCESS); 346 } 347 348 /******************************************************************************* 349 ** 350 ** Function BTM_SetAfhChannelAssessment 351 ** 352 ** Description This function is called to set the channel assessment mode on or off 353 ** 354 ** Returns none 355 ** 356 *******************************************************************************/ 357 tBTM_STATUS BTM_SetAfhChannelAssessment (BOOLEAN enable_or_disable) 358 { 359 /* whatever app wants if device is not 1.2 scan type should be STANDARD */ 360 if (!HCI_LMP_AFH_CAP_SLAVE_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0])) 361 return (BTM_MODE_UNSUPPORTED); 362 363 if (!btsnd_hcic_write_afh_channel_assessment_mode (enable_or_disable)) 364 return (BTM_NO_RESOURCES); 365 366 return (BTM_SUCCESS); 367 } 368 369 /******************************************************************************* 370 ** 371 ** Function BTM_ContinueReset 372 ** 373 ** Description This function is called by the application to continue 374 ** initialization after the application has completed its 375 ** vendor specific sequence. It is only used when 376 ** BTM_APP_DEV_INIT is defined in target.h. 377 ** 378 ** Returns void 379 ** 380 *******************************************************************************/ 381 void BTM_ContinueReset (void) 382 { 383 #ifdef BTM_APP_DEV_INIT 384 btm_continue_reset(); 385 #endif 386 } 387 388 /******************************************************************************* 389 ** 390 ** Function btm_dev_reset 391 ** 392 ** Description Local function called to send a reset command 393 ** 394 ** Returns void 395 ** 396 *******************************************************************************/ 397 static void btm_dev_reset (void) 398 { 399 btm_cb.devcb.state = BTM_DEV_STATE_WAIT_RESET_CMPLT; 400 401 /* flush out the command complete queue and command transmit queue */ 402 btu_hcif_flush_cmd_queue(); 403 404 /* Start reset timer. When timer expires we will send first command */ 405 /* from the setup sequence */ 406 407 btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, 408 BTM_DEV_RESET_TIMEOUT); 409 btsnd_hcic_reset (LOCAL_BR_EDR_CONTROLLER_ID); 410 } 411 412 413 /******************************************************************************* 414 ** 415 ** Function btm_get_hci_buf_size 416 ** 417 ** Description Local function called to send a read buffer size command 418 ** 419 ** Returns void 420 ** 421 *******************************************************************************/ 422 void btm_get_hci_buf_size (void) 423 { 424 425 btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT); 426 427 /* Send a Read Buffer Size message to the Host Controller. */ 428 btsnd_hcic_read_buffer_size (); 429 430 } 431 #if BLE_INCLUDED == TRUE 432 /******************************************************************************* 433 ** 434 ** Function btm_read_ble_wl_size 435 ** 436 ** Description Local function called to send a read BLE buffer size command 437 ** 438 ** Returns void 439 ** 440 *******************************************************************************/ 441 void btm_read_ble_wl_size(void) 442 { 443 BTM_TRACE_DEBUG0("btm_read_ble_wl_size "); 444 btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT); 445 446 /* Send a Read Buffer Size message to the Host Controller. */ 447 btsnd_hcic_ble_read_white_list_size(); 448 } 449 /******************************************************************************* 450 ** 451 ** Function btm_get_ble_buffer_size 452 ** 453 ** Description Local function called to send a read BLE buffer size command 454 ** 455 ** Returns void 456 ** 457 *******************************************************************************/ 458 void btm_get_ble_buffer_size(void) 459 { 460 BTM_TRACE_DEBUG0("btm_get_ble_buffer_size "); 461 btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT); 462 463 /* Send a Read Buffer Size message to the Host Controller. */ 464 btsnd_hcic_ble_read_buffer_size (); 465 } 466 467 /******************************************************************************* 468 ** 469 ** Function btm_read_ble_local_supported_features 470 ** 471 ** Description Local function called to send a read BLE local supported 472 ** features command 473 ** 474 ** Returns void 475 ** 476 *******************************************************************************/ 477 static void btm_read_ble_local_supported_features(void) 478 { 479 BTM_TRACE_DEBUG0("btm_read_ble_local_supported_features "); 480 btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT); 481 482 /* Send a Read Local Supported Features message to the Host Controller. */ 483 btsnd_hcic_ble_read_local_spt_feat (); 484 } 485 #endif 486 /******************************************************************************* 487 ** 488 ** Function btm_get_local_version 489 ** 490 ** Description Local function called to send a read local version to controller 491 ** 492 ** Returns void 493 ** 494 *******************************************************************************/ 495 void btm_get_local_version (void) 496 { 497 498 btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT); 499 500 /* Send a Read Local Version message to the Host Controller. */ 501 btsnd_hcic_read_local_ver (LOCAL_BR_EDR_CONTROLLER_ID); 502 btsnd_hcic_read_bd_addr (); 503 504 #if BTM_PWR_MGR_INCLUDED == TRUE 505 btm_pm_reset(); 506 #endif 507 508 } 509 510 /******************************************************************************* 511 ** 512 ** Function btm_read_local_supported_cmds 513 ** 514 ** Description Local function called to send a read local supported commands 515 ** 516 ** Returns void 517 ** 518 *******************************************************************************/ 519 static void btm_read_local_supported_cmds (UINT8 local_controller_id) 520 { 521 BTM_TRACE_DEBUG0("Start reading local supported commands"); 522 523 btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT); 524 525 btsnd_hcic_read_local_supported_cmds(local_controller_id); 526 } 527 528 /******************************************************************************* 529 ** 530 ** Function btm_get_local_features 531 ** 532 ** Description Local function called to send a read local features 533 ** 534 ** Returns void 535 ** 536 *******************************************************************************/ 537 static void btm_get_local_features (void) 538 { 539 /* If this BT controller supports Read Extended Feature */ 540 if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_2_0) 541 { 542 btm_get_local_ext_features(HCI_EXT_FEATURES_PAGE_0); 543 } 544 /* else, if this is a very old BT controller */ 545 else 546 { 547 btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT); 548 549 /* Just read the basic features (legacy HCI command) */ 550 btsnd_hcic_read_local_features (); 551 } 552 } 553 554 /******************************************************************************* 555 ** 556 ** Function btm_get_local_ext_features 557 ** 558 ** Description Local function called to send a read local extended features 559 ** 560 ** Returns void 561 ** 562 *******************************************************************************/ 563 static void btm_get_local_ext_features (UINT8 page_number) 564 { 565 btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT); 566 567 btsnd_hcic_read_local_ext_features(page_number); 568 } 569 570 /******************************************************************************* 571 ** 572 ** Function btm_dev_timeout 573 ** 574 ** Description This function is called when a timer list entry expires. 575 ** 576 ** Returns void 577 ** 578 *******************************************************************************/ 579 void btm_dev_timeout (TIMER_LIST_ENT *p_tle) 580 { 581 TIMER_PARAM_TYPE timer_type = (TIMER_PARAM_TYPE)p_tle->param; 582 583 if ((timer_type & TT_DEV_RESET_MASK) == TT_DEV_RESET) 584 { 585 /* Call device reset as long as there is timeout*/ 586 btm_dev_reset(); 587 } 588 else if (timer_type == (TIMER_PARAM_TYPE)TT_DEV_RLN) 589 { 590 tBTM_CMPL_CB *p_cb = btm_cb.devcb.p_rln_cmpl_cb; 591 592 btm_cb.devcb.p_rln_cmpl_cb = NULL; 593 594 if (p_cb) 595 (*p_cb)((void *) NULL); 596 } 597 } 598 599 /******************************************************************************* 600 ** 601 ** Function btm_reset_complete 602 ** 603 ** Description This function is called when command complete for HCI_Reset 604 ** is received. It does not make sense to send next command 605 ** because device is resetting after command complete is 606 ** received. Just start timer and set required state. 607 ** 608 ** Returns void 609 ** 610 *******************************************************************************/ 611 void btm_reset_complete (void) 612 { 613 int devinx; 614 615 BTM_TRACE_EVENT0 ("btm_reset_complete"); 616 617 /* Handle if btm initiated the reset */ 618 if (btm_cb.devcb.state == BTM_DEV_STATE_WAIT_RESET_CMPLT) 619 { 620 /* Tell L2CAP that all connections are gone */ 621 l2cu_device_reset (); 622 623 /* Clear current security state */ 624 for (devinx = 0; devinx < BTM_SEC_MAX_DEVICE_RECORDS; devinx++) 625 { 626 btm_cb.sec_dev_rec[devinx].sec_state = BTM_SEC_STATE_IDLE; 627 } 628 629 /* After the reset controller should restore all parameters to defaults. */ 630 btm_cb.btm_inq_vars.inq_counter = 1; 631 btm_cb.btm_inq_vars.inq_scan_window = HCI_DEF_INQUIRYSCAN_WINDOW; 632 btm_cb.btm_inq_vars.inq_scan_period = HCI_DEF_INQUIRYSCAN_INTERVAL; 633 btm_cb.btm_inq_vars.inq_scan_type = HCI_DEF_SCAN_TYPE; 634 635 btm_cb.btm_inq_vars.page_scan_window = HCI_DEF_PAGESCAN_WINDOW; 636 btm_cb.btm_inq_vars.page_scan_period = HCI_DEF_PAGESCAN_INTERVAL; 637 btm_cb.btm_inq_vars.page_scan_type = HCI_DEF_SCAN_TYPE; 638 639 #if (BTM_AFTER_RESET_TIMEOUT > 0) 640 btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, 641 BTM_AFTER_RESET_TIMEOUT); 642 #else 643 btm_cb.devcb.state = BTM_DEV_STATE_WAIT_AFTER_RESET; 644 btm_after_reset_hold_complete(); 645 #endif 646 647 #if (BLE_INCLUDED == TRUE) 648 btm_cb.ble_ctr_cb.conn_state = BLE_CONN_IDLE; 649 btm_cb.ble_ctr_cb.bg_dev_num = 0; 650 btm_cb.ble_ctr_cb.bg_conn_type = BTM_BLE_CONN_NONE; 651 btm_cb.ble_ctr_cb.p_select_cback = NULL; 652 memset(&btm_cb.ble_ctr_cb.bg_dev_list, 0, (sizeof(tBTM_LE_BG_CONN_DEV)*BTM_BLE_MAX_BG_CONN_DEV_NUM)); 653 gatt_reset_bgdev_list(); 654 #endif 655 } 656 } 657 658 /******************************************************************************* 659 ** 660 ** Function btm_continue_reset 661 ** 662 ** Description This function is called when wait period expired after 663 ** device reset or called by the application to continue 664 ** initialization after the application has completed its 665 ** vendor specific sequence. 666 ** 667 ** Returns void 668 ** 669 *******************************************************************************/ 670 void btm_continue_reset (void) 671 { 672 673 /* Reinitialize the default class of device */ 674 #if BTM_INTERNAL_BB == TRUE 675 btsnd_hcic_read_bd_addr (); 676 #if BTM_PWR_MGR_INCLUDED == TRUE 677 btm_pm_reset(); 678 #endif 679 #endif 680 681 btm_get_hci_buf_size (); 682 683 /* default device class */ 684 BTM_SetDeviceClass((UINT8 *) BTM_INIT_CLASS_OF_DEVICE); 685 686 #if (BTM_MAX_LOC_BD_NAME_LEN > 0) && (BTM_SET_DEV_NAME_UPON_RESET == TRUE) 687 BTM_SetLocalDeviceName(btm_cb.cfg.bd_name); 688 #endif 689 690 BTM_SetPinType (btm_cb.cfg.pin_type, btm_cb.cfg.pin_code, btm_cb.cfg.pin_code_len); 691 } 692 693 /******************************************************************************* 694 ** 695 ** Function btm_after_reset_hold_complete 696 ** 697 ** Description This function is called when wait period expired after 698 ** device reset. Continue intitialization 699 ** 700 ** Returns void 701 ** 702 *******************************************************************************/ 703 void btm_after_reset_hold_complete (void) 704 { 705 #ifdef BTM_APP_DEV_INIT 706 btu_stop_timer(&btm_cb.devcb.reset_timer); 707 BTM_APP_DEV_INIT(); 708 #else 709 btm_continue_reset(); 710 #endif 711 } 712 713 714 /******************************************************************************* 715 ** 716 ** Function btm_read_hci_buf_size_complete 717 ** 718 ** Description This function is called when command complete for 719 ** get HCI buffer size is received. Start timer and send 720 ** read local features request 721 ** 722 ** Returns void 723 ** 724 *******************************************************************************/ 725 void btm_read_hci_buf_size_complete (UINT8 *p, UINT16 evt_len) 726 { 727 UINT8 status; 728 UINT8 lm_sco_buf_size; 729 UINT16 lm_num_acl_bufs; 730 UINT16 lm_num_sco_bufs; 731 UINT16 acl_buf_size; 732 733 STREAM_TO_UINT8 (status, p); 734 if (status == HCI_SUCCESS) 735 { 736 STREAM_TO_UINT16 (btu_cb.hcit_acl_data_size, p); 737 STREAM_TO_UINT8 (lm_sco_buf_size, p); 738 STREAM_TO_UINT16 (lm_num_acl_bufs, p); 739 STREAM_TO_UINT16 (lm_num_sco_bufs, p); 740 741 btu_cb.hcit_acl_pkt_size = btu_cb.hcit_acl_data_size + HCI_DATA_PREAMBLE_SIZE; 742 743 l2c_link_processs_num_bufs (lm_num_acl_bufs); 744 745 #if BTM_ACL_BUF_SIZE > 0 746 acl_buf_size = (BTM_ACL_BUF_SIZE < L2CAP_MTU_SIZE) ? BTM_ACL_BUF_SIZE : L2CAP_MTU_SIZE; 747 #else 748 acl_buf_size = L2CAP_MTU_SIZE; 749 #endif 750 /* Tell the controller what our buffer sizes are. ?? Need SCO info */ 751 btsnd_hcic_set_host_buf_size (acl_buf_size, BTM_SCO_HOST_BUF_SIZE, L2CAP_HOST_FC_ACL_BUFS, 10); 752 753 #if L2CAP_HOST_FLOW_CTRL == TRUE 754 btsnd_hcic_set_host_flow_ctrl (HCI_HOST_FLOW_CTRL_ACL_ON); 755 #endif 756 } 757 758 /* Set the device into connectable and/or discoverable mode (if configured to do so) */ 759 #if BTM_IS_CONNECTABLE == TRUE 760 (void) BTM_SetConnectability (BTM_CONNECTABLE, BTM_DEFAULT_CONN_WINDOW, BTM_DEFAULT_CONN_INTERVAL); 761 #endif 762 763 #if BTM_IS_DISCOVERABLE == TRUE 764 (void) BTM_SetDiscoverability (BTM_DEFAULT_DISC_MODE, BTM_DEFAULT_DISC_WINDOW, BTM_DEFAULT_DISC_INTERVAL); 765 #endif 766 767 #if BTM_INTERNAL_BB == TRUE 768 { 769 UINT8 buf[9] = BTM_INTERNAL_LOCAL_VER; 770 btm_read_local_version_complete( buf, 9 ); 771 } 772 #else 773 btm_get_local_version (); 774 #endif 775 } 776 777 #if (BLE_INCLUDED == TRUE) 778 /******************************************************************************* 779 ** 780 ** Function btm_read_ble_buf_size_complete 781 ** 782 ** Description This function is called when command complete for 783 ** get HCI buffer size is received. Start timer and send 784 ** read local supported features request 785 ** 786 ** Returns void 787 ** 788 *******************************************************************************/ 789 void btm_read_ble_buf_size_complete (UINT8 *p, UINT16 evt_len) 790 { 791 UINT8 status; 792 UINT16 lm_num_le_bufs; 793 794 BTM_TRACE_DEBUG0("btm_read_ble_buf_size_complete "); 795 STREAM_TO_UINT8 (status, p); 796 if (status == HCI_SUCCESS) 797 { 798 STREAM_TO_UINT16 (btu_cb.hcit_ble_acl_data_size, p); 799 STREAM_TO_UINT8 (lm_num_le_bufs, p); 800 801 if (btu_cb.hcit_ble_acl_data_size == 0) 802 btu_cb.hcit_ble_acl_data_size = btu_cb.hcit_acl_data_size; 803 804 btu_cb.hcit_ble_acl_pkt_size = btu_cb.hcit_ble_acl_data_size + HCI_DATA_PREAMBLE_SIZE; 805 806 l2c_link_processs_ble_num_bufs (lm_num_le_bufs); 807 } 808 809 btm_read_ble_local_supported_features(); 810 } 811 812 /******************************************************************************* 813 ** 814 ** Function btm_read_ble_local_supported_features_complete 815 ** 816 ** Description This function is called when command complete for 817 ** Read LE Local Supported Features is received. Start timer and send 818 ** read LMP local features request 819 ** 820 ** Returns void 821 ** 822 *******************************************************************************/ 823 void btm_read_ble_local_supported_features_complete (UINT8 *p, UINT16 evt_len) 824 { 825 UINT8 status; 826 827 BTM_TRACE_DEBUG0("btm_read_ble_local_supported_features_complete "); 828 829 btu_stop_timer (&btm_cb.devcb.reset_timer); 830 831 STREAM_TO_UINT8 (status, p); 832 if (status == HCI_SUCCESS) 833 { 834 STREAM_TO_ARRAY(&btm_cb.devcb.local_le_features, p, HCI_FEATURE_BYTES_PER_PAGE); 835 } 836 else 837 { 838 BTM_TRACE_WARNING1 ("btm_read_ble_local_supported_features_complete status = %d", status); 839 } 840 841 #if BTM_INTERNAL_BB == TRUE 842 { 843 UINT8 buf[9] = BTM_INTERNAL_LOCAL_FEA; 844 btm_read_local_features_complete( buf, 9 ); 845 } 846 #else 847 848 /* get local feature if BRCM specific feature is not included */ 849 btm_reset_ctrlr_complete(); 850 #endif 851 852 } 853 854 /******************************************************************************* 855 ** 856 ** Function btm_read_white_list_size_complete 857 ** 858 ** Description This function read the current white list size. 859 *******************************************************************************/ 860 void btm_read_white_list_size_complete(UINT8 *p, UINT16 evt_len) 861 { 862 UINT8 status; 863 864 BTM_TRACE_DEBUG0("btm_read_white_list_size_complete "); 865 STREAM_TO_UINT8 (status, p); 866 867 if (status == HCI_SUCCESS) 868 { 869 STREAM_TO_UINT8(btm_cb.ble_ctr_cb.max_filter_entries, p); 870 btm_cb.ble_ctr_cb.num_empty_filter = btm_cb.ble_ctr_cb.max_filter_entries; 871 } 872 873 btm_get_ble_buffer_size(); 874 } 875 876 #endif 877 /******************************************************************************* 878 ** 879 ** Function btm_read_local_version_complete 880 ** 881 ** Description This function is called when local BD Addr read complete 882 ** message is received from the HCI. 883 ** 884 ** Returns void 885 ** 886 *******************************************************************************/ 887 void btm_read_local_version_complete (UINT8 *p, UINT16 evt_len) 888 { 889 tBTM_VERSION_INFO *p_vi = &btm_cb.devcb.local_version; 890 UINT8 status; 891 892 #ifdef BTA_PRM_CHECK_FW_VER 893 if(BTA_PRM_CHECK_FW_VER(p)) 894 return; 895 #endif 896 897 STREAM_TO_UINT8 (status, p); 898 if (status == HCI_SUCCESS) 899 { 900 901 STREAM_TO_UINT8 (p_vi->hci_version, p); 902 STREAM_TO_UINT16 (p_vi->hci_revision, p); 903 STREAM_TO_UINT8 (p_vi->lmp_version, p); 904 STREAM_TO_UINT16 (p_vi->manufacturer, p); 905 STREAM_TO_UINT16 (p_vi->lmp_subversion, p); 906 } 907 908 if (p_vi->hci_version >= HCI_PROTO_VERSION_1_2) 909 { 910 btm_read_local_supported_cmds(LOCAL_BR_EDR_CONTROLLER_ID); 911 } 912 else 913 { 914 btm_get_local_features (); 915 } 916 } 917 918 /******************************************************************************* 919 ** 920 ** Function btm_decode_ext_features_page 921 ** 922 ** Description This function is decodes a features page. 923 ** 924 ** Returns void 925 ** 926 *******************************************************************************/ 927 static void btm_decode_ext_features_page (UINT8 page_number, const UINT8 *p_features) 928 { 929 UINT8 last; 930 UINT8 first; 931 932 BTM_TRACE_DEBUG1 ("btm_decode_ext_features_page page: %d", page_number); 933 switch (page_number) 934 { 935 /* Extended (Legacy) Page 0 */ 936 case HCI_EXT_FEATURES_PAGE_0: 937 938 /* Create ACL supported packet types mask */ 939 btm_cb.btm_acl_pkt_types_supported = (BTM_ACL_PKT_TYPES_MASK_DH1 + 940 BTM_ACL_PKT_TYPES_MASK_DM1); 941 942 if (HCI_3_SLOT_PACKETS_SUPPORTED(p_features)) 943 btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_DH3 + 944 BTM_ACL_PKT_TYPES_MASK_DM3); 945 946 if (HCI_5_SLOT_PACKETS_SUPPORTED(p_features)) 947 btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_DH5 + 948 BTM_ACL_PKT_TYPES_MASK_DM5); 949 950 /* _NO_X_DXX masks are reserved before ver 2.0. 951 Set them only for later versions of controller */ 952 if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_2_0) 953 { 954 /* Add in EDR related ACL types */ 955 if (!HCI_EDR_ACL_2MPS_SUPPORTED(p_features)) 956 { 957 btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH1 + 958 BTM_ACL_PKT_TYPES_MASK_NO_2_DH3 + 959 BTM_ACL_PKT_TYPES_MASK_NO_2_DH5); 960 } 961 962 if (!HCI_EDR_ACL_3MPS_SUPPORTED(p_features)) 963 { 964 btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_3_DH1 + 965 BTM_ACL_PKT_TYPES_MASK_NO_3_DH3 + 966 BTM_ACL_PKT_TYPES_MASK_NO_3_DH5); 967 } 968 969 /* Check to see if 3 and 5 slot packets are available */ 970 if (HCI_EDR_ACL_2MPS_SUPPORTED(p_features) || 971 HCI_EDR_ACL_3MPS_SUPPORTED(p_features)) 972 { 973 if (!HCI_3_SLOT_EDR_ACL_SUPPORTED(p_features)) 974 btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH3 + 975 BTM_ACL_PKT_TYPES_MASK_NO_3_DH3); 976 977 if (!HCI_5_SLOT_EDR_ACL_SUPPORTED(p_features)) 978 btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH5 + 979 BTM_ACL_PKT_TYPES_MASK_NO_3_DH5); 980 } 981 } 982 983 BTM_TRACE_DEBUG1("Local supported ACL packet types: 0x%04x", 984 btm_cb.btm_acl_pkt_types_supported); 985 986 /* Create (e)SCO supported packet types mask */ 987 btm_cb.btm_sco_pkt_types_supported = 0; 988 #if BTM_SCO_INCLUDED == TRUE 989 btm_cb.sco_cb.esco_supported = FALSE; 990 #endif 991 if (HCI_SCO_LINK_SUPPORTED(p_features)) 992 { 993 btm_cb.btm_sco_pkt_types_supported = BTM_SCO_PKT_TYPES_MASK_HV1; 994 995 if (HCI_HV2_PACKETS_SUPPORTED(p_features)) 996 btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_HV2; 997 998 if (HCI_HV3_PACKETS_SUPPORTED(p_features)) 999 btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_HV3; 1000 } 1001 1002 if (HCI_ESCO_EV3_SUPPORTED(p_features)) 1003 btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_EV3; 1004 1005 if (HCI_ESCO_EV4_SUPPORTED(p_features)) 1006 btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_EV4; 1007 1008 if (HCI_ESCO_EV5_SUPPORTED(p_features)) 1009 btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_EV5; 1010 #if BTM_SCO_INCLUDED == TRUE 1011 if (btm_cb.btm_sco_pkt_types_supported & BTM_ESCO_LINK_ONLY_MASK) 1012 { 1013 btm_cb.sco_cb.esco_supported = TRUE; 1014 1015 /* Add in EDR related eSCO types */ 1016 if (HCI_EDR_ESCO_2MPS_SUPPORTED(p_features)) 1017 { 1018 if (!HCI_3_SLOT_EDR_ESCO_SUPPORTED(p_features)) 1019 btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_NO_2_EV5; 1020 } 1021 else 1022 { 1023 btm_cb.btm_sco_pkt_types_supported |= (BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 + 1024 BTM_SCO_PKT_TYPES_MASK_NO_2_EV5); 1025 } 1026 1027 if (HCI_EDR_ESCO_3MPS_SUPPORTED(p_features)) 1028 { 1029 if (!HCI_3_SLOT_EDR_ESCO_SUPPORTED(p_features)) 1030 btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_NO_3_EV5; 1031 } 1032 else 1033 { 1034 btm_cb.btm_sco_pkt_types_supported |= (BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 + 1035 BTM_SCO_PKT_TYPES_MASK_NO_3_EV5); 1036 } 1037 } 1038 #endif 1039 1040 BTM_TRACE_DEBUG1("Local supported SCO packet types: 0x%04x", 1041 btm_cb.btm_sco_pkt_types_supported); 1042 1043 /* Create Default Policy Settings */ 1044 if (HCI_SWITCH_SUPPORTED(p_features)) 1045 btm_cb.btm_def_link_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 1046 else 1047 btm_cb.btm_def_link_policy &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH; 1048 1049 if (HCI_HOLD_MODE_SUPPORTED(p_features)) 1050 btm_cb.btm_def_link_policy |= HCI_ENABLE_HOLD_MODE; 1051 else 1052 btm_cb.btm_def_link_policy &= ~HCI_ENABLE_HOLD_MODE; 1053 1054 if (HCI_SNIFF_MODE_SUPPORTED(p_features)) 1055 btm_cb.btm_def_link_policy |= HCI_ENABLE_SNIFF_MODE; 1056 else 1057 btm_cb.btm_def_link_policy &= ~HCI_ENABLE_SNIFF_MODE; 1058 1059 if (HCI_PARK_MODE_SUPPORTED(p_features)) 1060 btm_cb.btm_def_link_policy |= HCI_ENABLE_PARK_MODE; 1061 else 1062 btm_cb.btm_def_link_policy &= ~HCI_ENABLE_PARK_MODE; 1063 1064 btm_sec_dev_reset (); 1065 #if ((BTM_EIR_SERVER_INCLUDED == TRUE)||(BTM_EIR_CLIENT_INCLUDED == TRUE)) 1066 if (HCI_LMP_INQ_RSSI_SUPPORTED(p_features)) 1067 { 1068 if (HCI_EXT_INQ_RSP_SUPPORTED(p_features)) 1069 BTM_SetInquiryMode (BTM_INQ_RESULT_EXTENDED); 1070 else 1071 BTM_SetInquiryMode (BTM_INQ_RESULT_WITH_RSSI); 1072 } 1073 #else 1074 if (HCI_LMP_INQ_RSSI_SUPPORTED(p_features)) 1075 BTM_SetInquiryMode (BTM_INQ_RESULT_WITH_RSSI); 1076 #endif 1077 #if L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE 1078 if( HCI_NON_FLUSHABLE_PB_SUPPORTED(p_features)) 1079 l2cu_set_non_flushable_pbf(TRUE); 1080 else 1081 l2cu_set_non_flushable_pbf(FALSE); 1082 #endif 1083 BTM_SetPageScanType (BTM_DEFAULT_SCAN_TYPE); 1084 BTM_SetInquiryScanType (BTM_DEFAULT_SCAN_TYPE); 1085 1086 break; 1087 1088 /* Extended Page 1 */ 1089 case HCI_EXT_FEATURES_PAGE_1: 1090 /* Nothing to do for page 1 */ 1091 break; 1092 1093 /* Extended Page 2 */ 1094 case HCI_EXT_FEATURES_PAGE_2: 1095 /* Nothing to do for page 2 */ 1096 break; 1097 1098 default: 1099 BTM_TRACE_ERROR1("btm_decode_ext_features_page page=%d unknown", page_number); 1100 break; 1101 } 1102 } 1103 1104 /******************************************************************************* 1105 ** 1106 ** Function btm_reset_ctrlr_complete 1107 ** 1108 ** Description This is the last step of BR/EDR controller startup sequence. 1109 ** 1110 ** Returns void 1111 ** 1112 *******************************************************************************/ 1113 void btm_reset_ctrlr_complete () 1114 { 1115 tBTM_DEVCB *p_devcb = &btm_cb.devcb; 1116 tBTM_CMPL_CB *p_cb = p_devcb->p_reset_cmpl_cb; 1117 BOOLEAN found = FALSE; 1118 UINT8 i, j, max_page_number; 1119 1120 btu_stop_timer (&btm_cb.devcb.reset_timer); 1121 1122 /* find the highest feature page number which contains non-zero bits */ 1123 for (i = HCI_EXT_FEATURES_PAGE_MAX; i >= 0; i--) 1124 { 1125 for (j = 0; j < HCI_FEATURE_BYTES_PER_PAGE; j++) 1126 { 1127 if (p_devcb->local_lmp_features[i][j] != 0) 1128 { 1129 found = TRUE; 1130 break; 1131 } 1132 } 1133 if (found || !i) 1134 { 1135 break; 1136 } 1137 } 1138 1139 if (!found) 1140 BTM_TRACE_WARNING0 ("btm_reset_ctrlr_complete: NONE of local controller features is set"); 1141 1142 max_page_number = i; 1143 1144 BTM_TRACE_DEBUG1 ("btm_reset_ctrlr_complete: max_page_number: %d", max_page_number); 1145 1146 /* 1147 * Set State to Ready (needs to be done before btm_decode_ext_features_page 1148 * to allow it to send some HCI configuration commands) 1149 */ 1150 p_devcb->state = BTM_DEV_STATE_READY; 1151 1152 /* For every received/saved feature page */ 1153 for (i = 0; i <= max_page_number; i++) 1154 { 1155 /* Decode the saved Feature Page */ 1156 btm_decode_ext_features_page(i, p_devcb->local_lmp_features[i]); 1157 } 1158 1159 /* If there was a callback address for reset complete, reset it */ 1160 p_devcb->p_reset_cmpl_cb = NULL; 1161 1162 /* If anyone wants device status notifications, give him one */ 1163 btm_report_device_status(BTM_DEV_STATUS_UP); 1164 1165 /* Reset sequence is complete. If this was an application originated */ 1166 /* reset, tell him its done. */ 1167 if (p_cb) 1168 (*p_cb)((void *) NULL); 1169 } 1170 1171 /******************************************************************************* 1172 ** 1173 ** Function btm_issue_host_support_for_lmp_features 1174 ** 1175 ** Description This function: 1176 ** - issues commands to set host supported LMP features (one at 1177 ** a time); 1178 ** - after this is done it issues command to re-read LMP features 1179 ** page 1; 1180 ** - after this is done it calls the last step of BR/EDR 1181 ** controller startup sequence. 1182 ** 1183 ** Returns void 1184 ** 1185 *******************************************************************************/ 1186 static void btm_issue_host_support_for_lmp_features (void) 1187 { 1188 BTM_TRACE_DEBUG1("btm_issue_host_support_for_lmp_features lmp_features_host_may_support: 0x%02x", btm_cb.devcb.lmp_features_host_may_support); 1189 1190 if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_SSP) 1191 { 1192 btsnd_hcic_write_simple_pairing_mode(HCI_SP_MODE_ENABLED); 1193 return; 1194 } 1195 1196 #if (BLE_INCLUDED == TRUE) 1197 if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_LE) 1198 { 1199 if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_SIMULT_BR_LE) 1200 { 1201 /* At the moment the host can't work simultaneously with BR/EDR and LE */ 1202 btsnd_hcic_ble_write_host_supported(BTM_BLE_HOST_SUPPORT, 0); 1203 } 1204 else 1205 { 1206 btsnd_hcic_ble_write_host_supported(BTM_BLE_HOST_SUPPORT, 0); 1207 } 1208 return; 1209 } 1210 #endif 1211 1212 if (btm_cb.devcb.lmp_features_host_may_support & BTM_RE_READ_1ST_PAGE) 1213 { 1214 btm_get_local_ext_features(HCI_EXT_FEATURES_PAGE_1); 1215 return; 1216 } 1217 1218 if (!btm_cb.devcb.lmp_features_host_may_support) 1219 { 1220 #if BLE_INCLUDED == TRUE 1221 if (HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1])) 1222 { 1223 btm_read_ble_wl_size(); 1224 } 1225 else 1226 #elif BTM_INTERNAL_BB == TRUE 1227 { 1228 UINT8 buf[9] = BTM_INTERNAL_LOCAL_FEA; 1229 btm_read_local_features_complete( buf, 9 ); 1230 } 1231 #endif 1232 { 1233 btm_reset_ctrlr_complete(); 1234 } 1235 return; 1236 } 1237 1238 BTM_TRACE_ERROR2("%s lmp_features_host_may_support: 0x%02x. This is unexpected.",__FUNCTION__, 1239 btm_cb.devcb.lmp_features_host_may_support); 1240 } 1241 1242 /******************************************************************************* 1243 ** 1244 ** Function btm_set_lmp_features_host_may_support 1245 ** 1246 ** Description This function is called after all LMP features provided by 1247 ** controller are read. It sets the mask that indicates LMP 1248 ** features the host may support based on LMP features supported 1249 ** by controller. 1250 ** Example: 1251 ** Host may set SSP (host support) bit only if SSP (controller 1252 ** support) bit is set by controller. 1253 ** 1254 ** Returns void 1255 ** 1256 *******************************************************************************/ 1257 static void btm_set_lmp_features_host_may_support (UINT8 max_page_number) 1258 { 1259 btm_cb.devcb.lmp_features_host_may_support = 0; 1260 1261 /* LMP page 0 is always read */ 1262 if (HCI_SIMPLE_PAIRING_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0])) 1263 { 1264 /* host may support SSP */ 1265 btm_cb.devcb.lmp_features_host_may_support |= BTM_HOST_MAY_SUPP_SSP; 1266 } 1267 1268 #if (BLE_INCLUDED == TRUE) 1269 if (HCI_LE_SPT_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0])) 1270 { 1271 /* host may support LE */ 1272 btm_cb.devcb.lmp_features_host_may_support |= BTM_HOST_MAY_SUPP_LE; 1273 1274 if (HCI_SIMUL_LE_BREDR_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0])) 1275 { 1276 /* host may support BR/EDR and LE simultaneously */ 1277 btm_cb.devcb.lmp_features_host_may_support |= BTM_HOST_MAY_SUPP_SIMULT_BR_LE; 1278 } 1279 } 1280 #endif 1281 1282 if (max_page_number >= HCI_EXT_FEATURES_PAGE_1) 1283 { 1284 /* nothing yet for HCI_EXT_FEATURES_PAGE_1 */ 1285 } 1286 1287 if (max_page_number >= HCI_EXT_FEATURES_PAGE_1) 1288 { 1289 /* nothing yet for HCI_EXT_FEATURES_PAGE_2 */ 1290 } 1291 1292 if (btm_cb.devcb.lmp_features_host_may_support) 1293 btm_cb.devcb.lmp_features_host_may_support |= BTM_RE_READ_1ST_PAGE; 1294 } 1295 1296 /******************************************************************************* 1297 ** 1298 ** Function btm_read_all_lmp_features_complete 1299 ** 1300 ** Description This function is called after all LMP features provided by 1301 ** controller are read. 1302 ** It works with controller supported LMP features which host 1303 ** may support too. 1304 ** 1305 ** Returns void 1306 ** 1307 *******************************************************************************/ 1308 static void btm_read_all_lmp_features_complete (UINT8 max_page_number) 1309 { 1310 btm_set_lmp_features_host_may_support(max_page_number); 1311 1312 btm_issue_host_support_for_lmp_features(); 1313 } 1314 1315 /******************************************************************************* 1316 ** 1317 ** Function btm_read_local_features_complete 1318 ** 1319 ** Description This function is called when local supported features read 1320 ** is complete. 1321 ** 1322 ** Returns void 1323 ** 1324 *******************************************************************************/ 1325 void btm_read_local_features_complete (UINT8 *p, UINT16 evt_len) 1326 { 1327 tBTM_DEVCB *p_devcb = &btm_cb.devcb; 1328 UINT8 status; 1329 1330 btu_stop_timer (&p_devcb->reset_timer); 1331 1332 STREAM_TO_UINT8 (status, p); 1333 if (status == HCI_SUCCESS) 1334 { 1335 /* Save the Feature Page 0 */ 1336 STREAM_TO_ARRAY(p_devcb->local_lmp_features[0], 1337 p, HCI_FEATURE_BYTES_PER_PAGE); 1338 1339 if ((HCI_LMP_EXTENDED_SUPPORTED(p_devcb->local_lmp_features[HCI_EXT_FEATURES_PAGE_0])) && 1340 (HCI_READ_LOCAL_EXT_FEATURES_SUPPORTED(p_devcb->supported_cmds))) 1341 { 1342 /* if local controller has extended features and supports 1343 **HCI_Read_Local_Extended_Features command, 1344 ** then start reading these feature starting with extended features page 1 */ 1345 BTM_TRACE_DEBUG0 ("Start reading local extended features"); 1346 btm_get_local_ext_features(HCI_EXT_FEATURES_PAGE_1); 1347 } 1348 else 1349 { 1350 btm_read_all_lmp_features_complete (HCI_EXT_FEATURES_PAGE_0); 1351 } 1352 } 1353 } 1354 1355 /******************************************************************************* 1356 ** 1357 ** Function btm_read_local_ext_features_complete 1358 ** 1359 ** Description This function is called when read local extended features 1360 ** command complete message is received from the HCI. 1361 ** 1362 ** Returns void 1363 ** 1364 *******************************************************************************/ 1365 void btm_read_local_ext_features_complete (UINT8 *p, UINT16 evt_len) 1366 { 1367 tBTM_DEVCB *p_devcb = &btm_cb.devcb; 1368 tBTM_CMPL_CB *p_cb = p_devcb->p_reset_cmpl_cb; 1369 UINT8 status; 1370 UINT8 page_number; 1371 UINT8 page_number_max; 1372 1373 btu_stop_timer (&btm_cb.devcb.reset_timer); 1374 1375 STREAM_TO_UINT8 (status, p); 1376 1377 if (status != HCI_SUCCESS) 1378 { 1379 BTM_TRACE_WARNING1("btm_read_local_ext_features_complete status = 0x%02X", status); 1380 btm_read_all_lmp_features_complete (HCI_EXT_FEATURES_PAGE_0); 1381 return; 1382 } 1383 1384 /* Extract Page number */ 1385 STREAM_TO_UINT8 (page_number, p); 1386 1387 /* Extract Page number Max */ 1388 STREAM_TO_UINT8 (page_number_max, p); 1389 1390 if (page_number > HCI_EXT_FEATURES_PAGE_MAX) 1391 { 1392 BTM_TRACE_ERROR1("btm_read_local_ext_features_complete page=%d unknown", 1393 page_number); 1394 return; 1395 } 1396 1397 /* Save the extended features Page received */ 1398 STREAM_TO_ARRAY(btm_cb.devcb.local_lmp_features[page_number], 1399 p, HCI_FEATURE_BYTES_PER_PAGE); 1400 1401 /* If this is re-read of the 1-st extended page after host supported LMP features are set */ 1402 if ((page_number == HCI_EXT_FEATURES_PAGE_1) && 1403 (btm_cb.devcb.lmp_features_host_may_support == BTM_RE_READ_1ST_PAGE)) 1404 { 1405 btm_cb.devcb.lmp_features_host_may_support &= ~BTM_RE_READ_1ST_PAGE; 1406 btm_issue_host_support_for_lmp_features(); 1407 return; 1408 } 1409 1410 /* If this is the last page supported by the local BT controller OR */ 1411 /* if this is the last page supported by the Host */ 1412 if ((page_number == page_number_max) || 1413 (page_number == HCI_EXT_FEATURES_PAGE_MAX)) 1414 { 1415 BTM_TRACE_DEBUG1("BTM reached last extended features page (%d)", page_number); 1416 btm_read_all_lmp_features_complete(page_number); 1417 } 1418 /* Else (another page must be read) */ 1419 else 1420 { 1421 /* Read the next features page */ 1422 page_number++; 1423 BTM_TRACE_DEBUG1("BTM reads next extended features page (%d)", page_number); 1424 btm_get_local_ext_features(page_number); 1425 } 1426 } 1427 1428 /******************************************************************************* 1429 ** 1430 ** Function btm_read_local_supported_cmds_complete 1431 ** 1432 ** Description This function is called when local supported commands read 1433 ** is complete. 1434 ** 1435 ** Returns void 1436 ** 1437 *******************************************************************************/ 1438 void btm_read_local_supported_cmds_complete (UINT8 *p) 1439 { 1440 tBTM_DEVCB *p_devcb = &btm_cb.devcb; 1441 UINT8 status; 1442 1443 btu_stop_timer (&(p_devcb->reset_timer)); 1444 1445 STREAM_TO_UINT8 (status, p); 1446 BTM_TRACE_DEBUG1("btm_read_local_supported_cmds_complete status (0x%02x)", status); 1447 1448 if (status == HCI_SUCCESS) 1449 { 1450 /* Save the supported commands bit mask */ 1451 STREAM_TO_ARRAY(p_devcb->supported_cmds, p, HCI_NUM_SUPP_COMMANDS_BYTES); 1452 } 1453 1454 btm_get_local_features(); 1455 } 1456 1457 /******************************************************************************* 1458 ** 1459 ** Function btm_write_simple_paring_mode_complete 1460 ** 1461 ** Description This function is called when the command complete message 1462 ** is received from the HCI for the write simple pairing mode 1463 ** command. 1464 ** 1465 ** Returns void 1466 ** 1467 *******************************************************************************/ 1468 void btm_write_simple_paring_mode_complete (UINT8 *p) 1469 { 1470 UINT8 status; 1471 1472 STREAM_TO_UINT8 (status, p); 1473 1474 if (status != HCI_SUCCESS) 1475 { 1476 BTM_TRACE_WARNING1("btm_write_simple_paring_mode_complete status: 0x%02x", status); 1477 } 1478 1479 if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_SSP) 1480 { 1481 btm_cb.devcb.lmp_features_host_may_support &= ~BTM_HOST_MAY_SUPP_SSP; 1482 btm_issue_host_support_for_lmp_features(); 1483 } 1484 } 1485 1486 /******************************************************************************* 1487 ** 1488 ** Function btm_write_le_host_supported_complete 1489 ** 1490 ** Description This function is called when the command complete message 1491 ** is received from the HCI for the write LE host supported 1492 ** command. 1493 ** 1494 ** Returns void 1495 ** 1496 *******************************************************************************/ 1497 void btm_write_le_host_supported_complete (UINT8 *p) 1498 { 1499 UINT8 status; 1500 1501 STREAM_TO_UINT8 (status, p); 1502 1503 if (status != HCI_SUCCESS) 1504 { 1505 BTM_TRACE_WARNING1("btm_write_le_host_supported_complete status: 0x%02x", status); 1506 } 1507 1508 if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_LE) 1509 { 1510 btm_cb.devcb.lmp_features_host_may_support &= ~BTM_HOST_MAY_SUPP_LE; 1511 if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_SIMULT_BR_LE) 1512 { 1513 btm_cb.devcb.lmp_features_host_may_support &= ~BTM_HOST_MAY_SUPP_SIMULT_BR_LE; 1514 } 1515 btm_issue_host_support_for_lmp_features(); 1516 } 1517 } 1518 1519 /******************************************************************************* 1520 ** 1521 ** Function btm_get_voice_coding_support 1522 ** 1523 ** Description This function is provides a way to get the voice coding schemes 1524 ** supported the device. 1525 ** 1526 ** Returns A bit mask - Bit 0 if set indicates CVSD support 1527 ** Bit 1 if set indicates PCM A-law support 1528 ** Bit 2 if set indicates PCM Mu-law support 1529 ** 1530 *******************************************************************************/ 1531 1532 UINT8 btm_get_voice_coding_support( void ) 1533 { 1534 UINT8 code = 0; 1535 1536 if( HCI_LMP_CVSD_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]) ) code |= 0x01 ; 1537 if( HCI_LMP_A_LAW_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]) ) code |= 0x02 ; 1538 if( HCI_LMP_U_LAW_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]) ) code |= 0x04 ; 1539 1540 return code ; 1541 } 1542 1543 /******************************************************************************* 1544 ** 1545 ** Function BTM_SetLocalDeviceName 1546 ** 1547 ** Description This function is called to set the local device name. 1548 ** 1549 ** Returns status of the operation 1550 ** 1551 *******************************************************************************/ 1552 tBTM_STATUS BTM_SetLocalDeviceName (char *p_name) 1553 { 1554 UINT8 *p; 1555 1556 if (!p_name || !p_name[0] || (strlen ((char *)p_name) > BD_NAME_LEN)) 1557 return (BTM_ILLEGAL_VALUE); 1558 1559 if (btm_cb.devcb.state == BTM_DEV_STATE_WAIT_RESET_CMPLT || 1560 btm_cb.devcb.state == BTM_DEV_STATE_WAIT_AFTER_RESET) 1561 return (BTM_DEV_RESET); 1562 1563 #if BTM_MAX_LOC_BD_NAME_LEN > 0 1564 /* Save the device name if local storage is enabled */ 1565 p = (UINT8 *)btm_cb.cfg.bd_name; 1566 if (p != (UINT8 *)p_name) 1567 { 1568 BCM_STRNCPY_S(btm_cb.cfg.bd_name, sizeof(btm_cb.cfg.bd_name), p_name, BTM_MAX_LOC_BD_NAME_LEN); 1569 btm_cb.cfg.bd_name[BTM_MAX_LOC_BD_NAME_LEN] = '\0'; 1570 } 1571 #else 1572 p = (UINT8 *)p_name; 1573 #endif 1574 1575 if (btsnd_hcic_change_name(p)) 1576 return (BTM_CMD_STARTED); 1577 else 1578 return (BTM_NO_RESOURCES); 1579 } 1580 1581 1582 1583 /******************************************************************************* 1584 ** 1585 ** Function BTM_ReadLocalDeviceName 1586 ** 1587 ** Description This function is called to read the local device name. 1588 ** 1589 ** Returns status of the operation 1590 ** If success, BTM_SUCCESS is returned and p_name points stored 1591 ** local device name 1592 ** If BTM doesn't store local device name, BTM_NO_RESOURCES is 1593 ** is returned and p_name is set to NULL 1594 ** 1595 *******************************************************************************/ 1596 tBTM_STATUS BTM_ReadLocalDeviceName (char **p_name) 1597 { 1598 #if BTM_MAX_LOC_BD_NAME_LEN > 0 1599 *p_name = btm_cb.cfg.bd_name; 1600 return(BTM_SUCCESS); 1601 #else 1602 *p_name = NULL; 1603 return(BTM_NO_RESOURCES); 1604 #endif 1605 } 1606 1607 1608 /******************************************************************************* 1609 ** 1610 ** Function BTM_ReadLocalDeviceNameFromController 1611 ** 1612 ** Description Get local device name from controller. Do not use cached 1613 ** name (used to get chip-id prior to btm reset complete). 1614 ** 1615 ** Returns BTM_CMD_STARTED if successful, otherwise an error 1616 ** 1617 *******************************************************************************/ 1618 tBTM_STATUS BTM_ReadLocalDeviceNameFromController (tBTM_CMPL_CB *p_rln_cmpl_cback) 1619 { 1620 /* Check if rln already in progress */ 1621 if (btm_cb.devcb.p_rln_cmpl_cb) 1622 return(BTM_NO_RESOURCES); 1623 1624 /* Save callback */ 1625 btm_cb.devcb.p_rln_cmpl_cb = p_rln_cmpl_cback; 1626 1627 btsnd_hcic_read_name(); 1628 btu_start_timer (&btm_cb.devcb.rln_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT); 1629 1630 return BTM_CMD_STARTED; 1631 } 1632 1633 /******************************************************************************* 1634 ** 1635 ** Function btm_read_local_name_complete 1636 ** 1637 ** Description This function is called when local name read complete. 1638 ** message is received from the HCI. 1639 ** 1640 ** Returns void 1641 ** 1642 *******************************************************************************/ 1643 void btm_read_local_name_complete (UINT8 *p, UINT16 evt_len) 1644 { 1645 tBTM_CMPL_CB *p_cb = btm_cb.devcb.p_rln_cmpl_cb; 1646 UINT8 status; 1647 1648 btu_stop_timer (&btm_cb.devcb.rln_timer); 1649 1650 /* If there was a callback address for read local name, call it */ 1651 btm_cb.devcb.p_rln_cmpl_cb = NULL; 1652 1653 if (p_cb) 1654 { 1655 STREAM_TO_UINT8 (status, p); 1656 1657 if (status == HCI_SUCCESS) 1658 (*p_cb)(p); 1659 else 1660 (*p_cb)(NULL); 1661 } 1662 } 1663 1664 1665 /******************************************************************************* 1666 ** 1667 ** Function BTM_GetLocalDeviceAddr 1668 ** 1669 ** Description This function is called to read the local device address 1670 ** 1671 ** Returns void 1672 ** the local device address is copied into bd_addr 1673 ** 1674 *******************************************************************************/ 1675 void BTM_GetLocalDeviceAddr (BD_ADDR bd_addr) 1676 { 1677 memcpy (bd_addr, btm_cb.devcb.local_addr, BD_ADDR_LEN); 1678 } 1679 1680 /******************************************************************************* 1681 ** 1682 ** Function BTM_ReadLocalDeviceAddr 1683 ** 1684 ** Description This function is called to read the local device address 1685 ** 1686 ** Returns status of the operation 1687 ** 1688 *******************************************************************************/ 1689 tBTM_STATUS BTM_ReadLocalDeviceAddr (tBTM_CMPL_CB *p_cb) 1690 { 1691 if(p_cb) 1692 (*p_cb)(btm_cb.devcb.local_addr); 1693 1694 return (BTM_SUCCESS); 1695 } 1696 1697 1698 /******************************************************************************* 1699 ** 1700 ** Function btm_read_local_addr_complete 1701 ** 1702 ** Description This function is called when local BD Addr read complete 1703 ** message is received from the HCI. 1704 ** 1705 ** Returns void 1706 ** 1707 *******************************************************************************/ 1708 void btm_read_local_addr_complete (UINT8 *p, UINT16 evt_len) 1709 { 1710 UINT8 status; 1711 1712 STREAM_TO_UINT8 (status, p); 1713 1714 if (status == HCI_SUCCESS) 1715 { 1716 STREAM_TO_BDADDR (btm_cb.devcb.local_addr, p); 1717 } 1718 } 1719 1720 1721 /******************************************************************************* 1722 ** 1723 ** Function BTM_ReadLocalVersion 1724 ** 1725 ** Description This function is called to read the local device version 1726 ** 1727 ** Returns status of the operation 1728 ** 1729 *******************************************************************************/ 1730 tBTM_STATUS BTM_ReadLocalVersion (tBTM_VERSION_INFO *p_vers) 1731 { 1732 /* Make sure the device has retrieved the info (not being reset) */ 1733 if (btm_cb.devcb.state < BTM_DEV_STATE_READY) 1734 return (BTM_DEV_RESET); 1735 1736 *p_vers = btm_cb.devcb.local_version; 1737 1738 return (BTM_SUCCESS); 1739 } 1740 1741 1742 1743 1744 /******************************************************************************* 1745 ** 1746 ** Function BTM_SetDeviceClass 1747 ** 1748 ** Description This function is called to set the local device class 1749 ** 1750 ** Returns status of the operation 1751 ** 1752 *******************************************************************************/ 1753 tBTM_STATUS BTM_SetDeviceClass (DEV_CLASS dev_class) 1754 { 1755 if(!memcmp (btm_cb.devcb.dev_class, dev_class, DEV_CLASS_LEN)) 1756 return(BTM_SUCCESS); 1757 1758 memcpy (btm_cb.devcb.dev_class, dev_class, DEV_CLASS_LEN); 1759 1760 if (btm_cb.devcb.state == BTM_DEV_STATE_WAIT_RESET_CMPLT || 1761 btm_cb.devcb.state == BTM_DEV_STATE_WAIT_AFTER_RESET) 1762 return (BTM_DEV_RESET); 1763 1764 if (!btsnd_hcic_write_dev_class (dev_class)) 1765 return (BTM_NO_RESOURCES); 1766 1767 return (BTM_SUCCESS); 1768 } 1769 1770 1771 /******************************************************************************* 1772 ** 1773 ** Function BTM_ReadDeviceClass 1774 ** 1775 ** Description This function is called to read the local device class 1776 ** 1777 ** Returns pointer to the device class 1778 ** 1779 *******************************************************************************/ 1780 UINT8 *BTM_ReadDeviceClass (void) 1781 { 1782 return ((UINT8 *)btm_cb.devcb.dev_class); 1783 } 1784 1785 1786 /******************************************************************************* 1787 ** 1788 ** Function BTM_ReadLocalFeatures 1789 ** 1790 ** Description This function is called to read the local features 1791 ** 1792 ** Returns pointer to the local features string 1793 ** 1794 *******************************************************************************/ 1795 UINT8 *BTM_ReadLocalFeatures (void) 1796 { 1797 return (btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]); 1798 } 1799 1800 /******************************************************************************* 1801 ** 1802 ** Function BTM_ReadLocalExtendedFeatures 1803 ** 1804 ** Description This function is called to read the local extended features 1805 ** 1806 ** Returns pointer to the local extended features mask or NULL if bad 1807 ** page 1808 ** 1809 *******************************************************************************/ 1810 UINT8 *BTM_ReadLocalExtendedFeatures (UINT8 page_number) 1811 { 1812 if (page_number <= HCI_EXT_FEATURES_PAGE_MAX) 1813 return (btm_cb.devcb.local_lmp_features[page_number]); 1814 1815 BTM_TRACE_ERROR1("Warning: BTM_ReadLocalExtendedFeatures page %d unknown", 1816 page_number); 1817 return NULL; 1818 } 1819 1820 /******************************************************************************* 1821 ** 1822 ** Function BTM_ReadBrcmFeatures 1823 ** 1824 ** Description This function is called to read the Broadcom specific features 1825 ** 1826 ** Returns pointer to the Broadcom features string 1827 ** 1828 *******************************************************************************/ 1829 UINT8 *BTM_ReadBrcmFeatures (void) 1830 { 1831 return (btm_cb.devcb.brcm_features); 1832 } 1833 1834 /******************************************************************************* 1835 ** 1836 ** Function BTM_RegisterForDeviceStatusNotif 1837 ** 1838 ** Description This function is called to register for device status 1839 ** change notifications. 1840 ** 1841 ** If one registration is already there calling function should 1842 ** save the pointer to the function that is return and 1843 ** call it when processing of the event is complete 1844 ** 1845 ** Returns status of the operation 1846 ** 1847 *******************************************************************************/ 1848 tBTM_DEV_STATUS_CB *BTM_RegisterForDeviceStatusNotif (tBTM_DEV_STATUS_CB *p_cb) 1849 { 1850 tBTM_DEV_STATUS_CB *p_prev = btm_cb.devcb.p_dev_status_cb; 1851 1852 btm_cb.devcb.p_dev_status_cb = p_cb; 1853 return (p_prev); 1854 } 1855 1856 /******************************************************************************* 1857 ** 1858 ** Function BTM_VendorSpecificCommand 1859 ** 1860 ** Description Send a vendor specific HCI command to the controller. 1861 ** 1862 ** Returns 1863 ** BTM_SUCCESS Command sent. Does not expect command complete 1864 ** event. (command cmpl callback param is NULL) 1865 ** BTM_CMD_STARTED Command sent. Waiting for command cmpl event. 1866 ** 1867 ** Notes 1868 ** Opcode will be OR'd with HCI_GRP_VENDOR_SPECIFIC. 1869 ** 1870 *******************************************************************************/ 1871 tBTM_STATUS BTM_VendorSpecificCommand(UINT16 opcode, UINT8 param_len, 1872 UINT8 *p_param_buf, tBTM_VSC_CMPL_CB *p_cb) 1873 { 1874 void *p_buf; 1875 1876 BTM_TRACE_EVENT2 ("BTM: BTM_VendorSpecificCommand: Opcode: 0x%04X, ParamLen: %i.", 1877 opcode, param_len); 1878 1879 /* Allocate a buffer to hold HCI command plus the callback function */ 1880 if ((p_buf = GKI_getbuf((UINT16)(sizeof(BT_HDR) + sizeof (tBTM_CMPL_CB *) + 1881 param_len + HCIC_PREAMBLE_SIZE))) != NULL) 1882 { 1883 /* Send the HCI command (opcode will be OR'd with HCI_GRP_VENDOR_SPECIFIC) */ 1884 btsnd_hcic_vendor_spec_cmd (p_buf, opcode, param_len, p_param_buf, (void *)p_cb); 1885 1886 /* Return value */ 1887 if (p_cb != NULL) 1888 return (BTM_CMD_STARTED); 1889 else 1890 return (BTM_SUCCESS); 1891 } 1892 else 1893 return (BTM_NO_RESOURCES); 1894 1895 } 1896 1897 1898 /******************************************************************************* 1899 ** 1900 ** Function btm_vsc_complete 1901 ** 1902 ** Description This function is called when local HCI Vendor Specific 1903 ** Command complete message is received from the HCI. 1904 ** 1905 ** Returns void 1906 ** 1907 *******************************************************************************/ 1908 void btm_vsc_complete (UINT8 *p, UINT16 opcode, UINT16 evt_len, 1909 tBTM_CMPL_CB *p_vsc_cplt_cback) 1910 { 1911 tBTM_VSC_CMPL vcs_cplt_params; 1912 1913 /* If there was a callback address for vcs complete, call it */ 1914 if (p_vsc_cplt_cback) 1915 { 1916 /* Pass paramters to the callback function */ 1917 vcs_cplt_params.opcode = opcode; /* Number of bytes in return info */ 1918 vcs_cplt_params.param_len = evt_len; /* Number of bytes in return info */ 1919 vcs_cplt_params.p_param_buf = p; 1920 (*p_vsc_cplt_cback)(&vcs_cplt_params); /* Call the VSC complete callback function */ 1921 } 1922 } 1923 1924 /******************************************************************************* 1925 ** 1926 ** Function BTM_RegisterForVSEvents 1927 ** 1928 ** Description This function is called to register/deregister for vendor 1929 ** specific HCI events. 1930 ** 1931 ** If is_register=TRUE, then the function will be registered; 1932 ** if is_register=FALSE, then the function will be deregistered. 1933 ** 1934 ** Returns BTM_SUCCESS if successful, 1935 ** BTM_BUSY if maximum number of callbacks have already been 1936 ** registered. 1937 ** 1938 *******************************************************************************/ 1939 tBTM_STATUS BTM_RegisterForVSEvents (tBTM_VS_EVT_CB *p_cb, BOOLEAN is_register) 1940 { 1941 tBTM_STATUS retval = BTM_SUCCESS; 1942 UINT8 i, free_idx = BTM_MAX_VSE_CALLBACKS; 1943 1944 /* See if callback is already registered */ 1945 for (i=0; i<BTM_MAX_VSE_CALLBACKS; i++) 1946 { 1947 if (btm_cb.devcb.p_vend_spec_cb[i] == NULL) 1948 { 1949 /* Found a free slot. Store index */ 1950 free_idx = i; 1951 } 1952 else if (btm_cb.devcb.p_vend_spec_cb[i] == p_cb) 1953 { 1954 /* Found callback in lookup table. If deregistering, clear the entry. */ 1955 if (is_register == FALSE) 1956 { 1957 btm_cb.devcb.p_vend_spec_cb[i] = NULL; 1958 BTM_TRACE_EVENT0("BTM Deregister For VSEvents is successfully"); 1959 } 1960 return (BTM_SUCCESS); 1961 } 1962 } 1963 1964 /* Didn't find callback. Add callback to free slot if registering */ 1965 if (is_register) 1966 { 1967 if (free_idx < BTM_MAX_VSE_CALLBACKS) 1968 { 1969 btm_cb.devcb.p_vend_spec_cb[free_idx] = p_cb; 1970 BTM_TRACE_EVENT0("BTM Register For VSEvents is successfully"); 1971 } 1972 else 1973 { 1974 /* No free entries available */ 1975 BTM_TRACE_ERROR0 ("BTM_RegisterForVSEvents: too many callbacks registered"); 1976 1977 retval = BTM_NO_RESOURCES; 1978 } 1979 } 1980 1981 return (retval); 1982 } 1983 1984 /******************************************************************************* 1985 ** 1986 ** Function btm_vendor_specific_evt 1987 ** 1988 ** Description Process event HCI_VENDOR_SPECIFIC_EVT 1989 ** 1990 ** Note: Some controllers do not send command complete, so 1991 ** the callback and busy flag are cleared here also. 1992 ** 1993 ** Returns void 1994 ** 1995 *******************************************************************************/ 1996 void btm_vendor_specific_evt (UINT8 *p, UINT8 evt_len) 1997 { 1998 UINT8 i; 1999 2000 BTM_TRACE_DEBUG0 ("BTM Event: Vendor Specific event from controller"); 2001 2002 for (i=0; i<BTM_MAX_VSE_CALLBACKS; i++) 2003 { 2004 if (btm_cb.devcb.p_vend_spec_cb[i]) 2005 (*btm_cb.devcb.p_vend_spec_cb[i])(evt_len, p); 2006 } 2007 } 2008 2009 2010 /******************************************************************************* 2011 ** 2012 ** Function BTM_WritePageTimeout 2013 ** 2014 ** Description Send HCI Write Page Timeout. 2015 ** 2016 ** Returns 2017 ** BTM_SUCCESS Command sent. 2018 ** BTM_NO_RESOURCES If out of resources to send the command. 2019 ** 2020 ** 2021 *******************************************************************************/ 2022 tBTM_STATUS BTM_WritePageTimeout(UINT16 timeout) 2023 { 2024 BTM_TRACE_EVENT1 ("BTM: BTM_WritePageTimeout: Timeout: %d.", timeout); 2025 2026 /* Send the HCI command */ 2027 if (btsnd_hcic_write_page_tout (timeout)) 2028 return (BTM_SUCCESS); 2029 else 2030 return (BTM_NO_RESOURCES); 2031 } 2032 2033 /******************************************************************************* 2034 ** 2035 ** Function BTM_WriteVoiceSettings 2036 ** 2037 ** Description Send HCI Write Voice Settings command. 2038 ** See hcidefs.h for settings bitmask values. 2039 ** 2040 ** Returns 2041 ** BTM_SUCCESS Command sent. 2042 ** BTM_NO_RESOURCES If out of resources to send the command. 2043 ** 2044 ** 2045 *******************************************************************************/ 2046 tBTM_STATUS BTM_WriteVoiceSettings(UINT16 settings) 2047 { 2048 BTM_TRACE_EVENT1 ("BTM: BTM_WriteVoiceSettings: Settings: 0x%04x.", settings); 2049 2050 /* Send the HCI command */ 2051 if (btsnd_hcic_write_voice_settings ((UINT16)(settings & 0x03ff))) 2052 return (BTM_SUCCESS); 2053 2054 return (BTM_NO_RESOURCES); 2055 } 2056 2057 /******************************************************************************* 2058 ** 2059 ** Function BTM_EnableTestMode 2060 ** 2061 ** Description Send HCI the enable device under test command. 2062 ** 2063 ** Note: Controller can only be taken out of this mode by 2064 ** resetting the controller. 2065 ** 2066 ** Returns 2067 ** BTM_SUCCESS Command sent. 2068 ** BTM_NO_RESOURCES If out of resources to send the command. 2069 ** 2070 ** 2071 *******************************************************************************/ 2072 tBTM_STATUS BTM_EnableTestMode(void) 2073 { 2074 UINT8 cond; 2075 2076 BTM_TRACE_EVENT0 ("BTM: BTM_EnableTestMode"); 2077 2078 /* set auto accept connection as this is needed during test mode */ 2079 /* Allocate a buffer to hold HCI command */ 2080 cond = HCI_DO_AUTO_ACCEPT_CONNECT; 2081 if (!btsnd_hcic_set_event_filter(HCI_FILTER_CONNECTION_SETUP, 2082 HCI_FILTER_COND_NEW_DEVICE, 2083 &cond, sizeof(cond))) 2084 { 2085 return (BTM_NO_RESOURCES); 2086 } 2087 2088 /* put device to connectable mode */ 2089 if (!BTM_SetConnectability(BTM_CONNECTABLE, BTM_DEFAULT_CONN_WINDOW, 2090 BTM_DEFAULT_CONN_INTERVAL) == BTM_SUCCESS) 2091 { 2092 return BTM_NO_RESOURCES; 2093 } 2094 2095 /* put device to discoverable mode */ 2096 if (!BTM_SetDiscoverability(BTM_GENERAL_DISCOVERABLE, BTM_DEFAULT_DISC_WINDOW, 2097 BTM_DEFAULT_DISC_INTERVAL) == BTM_SUCCESS) 2098 { 2099 return BTM_NO_RESOURCES; 2100 } 2101 2102 /* mask off all of event from controller */ 2103 if (!btsnd_hcic_set_event_mask(LOCAL_BR_EDR_CONTROLLER_ID, 2104 (UINT8 *)"\x00\x00\x00\x00\x00\x00\x00\x00")) 2105 { 2106 return BTM_NO_RESOURCES; 2107 } 2108 2109 /* Send the HCI command */ 2110 if (btsnd_hcic_enable_test_mode ()) 2111 return (BTM_SUCCESS); 2112 else 2113 return (BTM_NO_RESOURCES); 2114 } 2115 2116 /******************************************************************************* 2117 ** 2118 ** Function btm_get_hci_version 2119 ** 2120 ** Description Local function called to retrieve the current HCI version 2121 ** 2122 ** Returns Bluetooth HCI Version returned by the controller 2123 ** 2124 *******************************************************************************/ 2125 UINT8 btm_get_hci_version (void) 2126 { 2127 return (btm_cb.devcb.local_version.hci_version); 2128 } 2129 2130 2131 2132 /******************************************************************************* 2133 ** 2134 ** Function BTM_ReadStoredLinkKey 2135 ** 2136 ** Description This function is called to obtain link key for the specified 2137 ** device from the NVRAM storage attached to the Bluetooth 2138 ** controller. 2139 ** 2140 ** Parameters: bd_addr - Address of the device 2141 ** p_cb - Call back function to be called to return 2142 ** the results 2143 ** 2144 *******************************************************************************/ 2145 tBTM_STATUS BTM_ReadStoredLinkKey (BD_ADDR bd_addr, tBTM_CMPL_CB *p_cb) 2146 { 2147 BD_ADDR local_bd_addr; 2148 BOOLEAN read_all_flag = FALSE; 2149 2150 /* Check if the previous command is completed */ 2151 if (btm_cb.devcb.p_stored_link_key_cmpl_cb) 2152 return (BTM_BUSY); 2153 2154 if (!bd_addr) 2155 { 2156 /* This is to read all the link keys */ 2157 read_all_flag = TRUE; 2158 2159 /* We don't care the BD address. Just pass a non zero pointer */ 2160 bd_addr = local_bd_addr; 2161 } 2162 2163 BTM_TRACE_EVENT1 ("BTM: BTM_ReadStoredLinkKey: Read_All: %s", 2164 read_all_flag ? "TRUE" : "FALSE"); 2165 2166 /* Send the HCI command */ 2167 btm_cb.devcb.p_stored_link_key_cmpl_cb = p_cb; 2168 if (btsnd_hcic_read_stored_key (bd_addr, read_all_flag)) 2169 return (BTM_SUCCESS); 2170 else 2171 return (BTM_NO_RESOURCES); 2172 2173 } 2174 2175 2176 /******************************************************************************* 2177 ** 2178 ** Function BTM_WriteStoredLinkKey 2179 ** 2180 ** Description This function is called to write link keys for the specified 2181 ** device addresses to the NVRAM storage attached to the Bluetooth 2182 ** controller. 2183 ** 2184 ** Parameters: num_keys - Number of link keys 2185 ** bd_addr - Addresses of the devices 2186 ** link_key - Link Keys to be stored 2187 ** p_cb - Call back function to be called to return 2188 ** the results 2189 ** 2190 *******************************************************************************/ 2191 tBTM_STATUS BTM_WriteStoredLinkKey (UINT8 num_keys, 2192 BD_ADDR *bd_addr, 2193 LINK_KEY *link_key, 2194 tBTM_CMPL_CB *p_cb) 2195 { 2196 /* Check if the previous command is completed */ 2197 if (btm_cb.devcb.p_stored_link_key_cmpl_cb) 2198 return (BTM_BUSY); 2199 2200 BTM_TRACE_EVENT1 ("BTM: BTM_WriteStoredLinkKey: num_keys: %d", num_keys); 2201 2202 /* Check the maximum number of link keys */ 2203 if(num_keys > HCI_MAX_NUM_OF_LINK_KEYS_PER_CMMD) 2204 num_keys = HCI_MAX_NUM_OF_LINK_KEYS_PER_CMMD; 2205 2206 /* Send the HCI command */ 2207 btm_cb.devcb.p_stored_link_key_cmpl_cb = p_cb; 2208 if (btsnd_hcic_write_stored_key (num_keys, bd_addr, link_key)) 2209 return (BTM_SUCCESS); 2210 else 2211 return (BTM_NO_RESOURCES); 2212 2213 } 2214 2215 2216 /******************************************************************************* 2217 ** 2218 ** Function BTM_DeleteStoredLinkKey 2219 ** 2220 ** Description This function is called to delete link key for the specified 2221 ** device addresses from the NVRAM storage attached to the Bluetooth 2222 ** controller. 2223 ** 2224 ** Parameters: bd_addr - Addresses of the devices 2225 ** p_cb - Call back function to be called to return 2226 ** the results 2227 ** 2228 *******************************************************************************/ 2229 tBTM_STATUS BTM_DeleteStoredLinkKey(BD_ADDR bd_addr, tBTM_CMPL_CB *p_cb) 2230 { 2231 BD_ADDR local_bd_addr; 2232 BOOLEAN delete_all_flag = FALSE; 2233 2234 /* Check if the previous command is completed */ 2235 if (btm_cb.devcb.p_stored_link_key_cmpl_cb) 2236 return (BTM_BUSY); 2237 2238 if (!bd_addr) 2239 { 2240 /* This is to delete all link keys */ 2241 delete_all_flag = TRUE; 2242 2243 /* We don't care the BD address. Just pass a non zero pointer */ 2244 bd_addr = local_bd_addr; 2245 } 2246 2247 BTM_TRACE_EVENT1 ("BTM: BTM_DeleteStoredLinkKey: delete_all_flag: %s", 2248 delete_all_flag ? "TRUE" : "FALSE"); 2249 2250 /* Send the HCI command */ 2251 btm_cb.devcb.p_stored_link_key_cmpl_cb = p_cb; 2252 if (!btsnd_hcic_delete_stored_key (bd_addr, delete_all_flag)) 2253 { 2254 return (BTM_NO_RESOURCES); 2255 } 2256 else 2257 return (BTM_SUCCESS); 2258 } 2259 2260 2261 /******************************************************************************* 2262 ** 2263 ** Function btm_read_stored_link_key_complete 2264 ** 2265 ** Description This function is called when the command complete message 2266 ** is received from the HCI for the read stored link key command. 2267 ** 2268 ** Returns void 2269 ** 2270 *******************************************************************************/ 2271 void btm_read_stored_link_key_complete (UINT8 *p) 2272 { 2273 tBTM_CMPL_CB *p_cb = btm_cb.devcb.p_stored_link_key_cmpl_cb; 2274 tBTM_READ_STORED_LINK_KEY_COMPLETE result; 2275 2276 /* If there was a callback registered for read stored link key, call it */ 2277 btm_cb.devcb.p_stored_link_key_cmpl_cb = NULL; 2278 2279 if (p_cb) 2280 { 2281 /* Set the call back event to indicate command complete */ 2282 result.event = BTM_CB_EVT_READ_STORED_LINK_KEYS; 2283 2284 /* Extract the result fields from the HCI event if status is success */ 2285 STREAM_TO_UINT8 (result.status, p); 2286 if (result.status == HCI_SUCCESS) 2287 { 2288 STREAM_TO_UINT16 (result.max_keys, p); 2289 STREAM_TO_UINT16 (result.read_keys, p); 2290 } 2291 else 2292 { 2293 BTM_TRACE_WARNING1("Read stored link key status %d", result.status); 2294 result.max_keys = 0; 2295 result.read_keys = 0; 2296 } 2297 /* Call the call back and pass the result */ 2298 (*p_cb)(&result); 2299 } 2300 } 2301 2302 2303 /******************************************************************************* 2304 ** 2305 ** Function btm_write_stored_link_key_complete 2306 ** 2307 ** Description This function is called when the command complete message 2308 ** is received from the HCI for the write stored link key command. 2309 ** 2310 ** Returns void 2311 ** 2312 *******************************************************************************/ 2313 void btm_write_stored_link_key_complete (UINT8 *p) 2314 { 2315 tBTM_CMPL_CB *p_cb = btm_cb.devcb.p_stored_link_key_cmpl_cb; 2316 tBTM_WRITE_STORED_LINK_KEY_COMPLETE result; 2317 2318 /* If there was a callback registered for read stored link key, call it */ 2319 btm_cb.devcb.p_stored_link_key_cmpl_cb = NULL; 2320 2321 if (p_cb) 2322 { 2323 /* Set the call back event to indicate command complete */ 2324 result.event = BTM_CB_EVT_WRITE_STORED_LINK_KEYS; 2325 2326 /* Extract the result fields from the HCI event */ 2327 STREAM_TO_UINT8 (result.status, p); 2328 STREAM_TO_UINT8 (result.num_keys, p); 2329 2330 /* Call the call back and pass the result */ 2331 (*p_cb)(&result); 2332 } 2333 } 2334 2335 2336 /******************************************************************************* 2337 ** 2338 ** Function btm_delete_stored_link_key_complete 2339 ** 2340 ** Description This function is called when the command complete message 2341 ** is received from the HCI for the delete stored link key command. 2342 ** 2343 ** Returns void 2344 ** 2345 *******************************************************************************/ 2346 void btm_delete_stored_link_key_complete (UINT8 *p) 2347 { 2348 tBTM_CMPL_CB *p_cb = btm_cb.devcb.p_stored_link_key_cmpl_cb; 2349 tBTM_DELETE_STORED_LINK_KEY_COMPLETE result; 2350 2351 /* If there was a callback registered for read stored link key, call it */ 2352 btm_cb.devcb.p_stored_link_key_cmpl_cb = NULL; 2353 2354 if (p_cb) 2355 { 2356 /* Set the call back event to indicate command complete */ 2357 result.event = BTM_CB_EVT_DELETE_STORED_LINK_KEYS; 2358 2359 /* Extract the result fields from the HCI event */ 2360 STREAM_TO_UINT8 (result.status, p); 2361 STREAM_TO_UINT16 (result.num_keys, p); 2362 2363 /* Call the call back and pass the result */ 2364 (*p_cb)(&result); 2365 } 2366 } 2367 2368 2369 /******************************************************************************* 2370 ** 2371 ** Function btm_return_link_keys_evt 2372 ** 2373 ** Description This function is called when the return link keys event 2374 ** is received from the HCI for the read stored link key command. 2375 ** 2376 ** Returns void 2377 ** 2378 *******************************************************************************/ 2379 void btm_return_link_keys_evt (tBTM_RETURN_LINK_KEYS_EVT *result) 2380 { 2381 tBTM_CMPL_CB *p_cb = btm_cb.devcb.p_stored_link_key_cmpl_cb; 2382 UINT8 i, *p, *p1; 2383 UINT8 bd_addr[BD_ADDR_LEN]; 2384 UINT8 link_key[LINK_KEY_LEN]; 2385 2386 /* Call the call back to pass the link keys to application */ 2387 if (p_cb) 2388 { 2389 /* Change the BD addr and Link key in to big endian order */ 2390 p = (UINT8 *)(result + 1); 2391 for (i=0; i<result->num_keys; i++) 2392 { 2393 /* Initialize the backup pointer */ 2394 p1 = p; 2395 2396 /* Extract the BD Addr and Link Key */ 2397 REVERSE_STREAM_TO_ARRAY(bd_addr, p1, BD_ADDR_LEN); 2398 REVERSE_STREAM_TO_ARRAY(link_key, p1, LINK_KEY_LEN); 2399 2400 /* Write the BD Addr and Link Key back in big endian format */ 2401 ARRAY_TO_STREAM(p, bd_addr, BD_ADDR_LEN); 2402 ARRAY_TO_STREAM(p, link_key, LINK_KEY_LEN); 2403 } 2404 2405 (*p_cb)(result); 2406 } 2407 } 2408 2409 2410 2411 /******************************************************************************* 2412 ** 2413 ** Function btm_report_device_status 2414 ** 2415 ** Description This function is called when there is a change in the device 2416 ** status. This function will report the new device status to 2417 ** the application 2418 ** 2419 ** Returns void 2420 ** 2421 *******************************************************************************/ 2422 void btm_report_device_status (tBTM_DEV_STATUS status) 2423 { 2424 tBTM_DEV_STATUS_CB *p_cb = btm_cb.devcb.p_dev_status_cb; 2425 2426 /* Call the call back to pass the device status to application */ 2427 if (p_cb) 2428 (*p_cb)(status); 2429 } 2430 2431 2432