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