btm_devctl.cc revision b707f447cbb916de2e0dfd2b4e9bf15818376e64
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 1999-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains functions that handle BTM interface functions for the 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Bluetooth device including Rest, HCI buffer size and others 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26f2af1c42ccb2f642b241c2261b42d0be61d45438Jack He#include <base/logging.h> 27911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include <stddef.h> 28911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include <stdio.h> 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h> 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 335cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 34911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "btcore/include/module.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 3630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#include "btu.h" 3779ecab5d0418fde77e9afcdd451bd713af73e180Chris Manton#include "device/include/controller.h" 3830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#include "hci_layer.h" 3930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#include "hcimsgs.h" 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_int.h" 41d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h" 420f9b91e150e153229235c163861198e23600e636Sharvil Nanavati#include "osi/include/thread.h" 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gatt_int.h" 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonextern fixed_queue_t* btu_general_alarm_queue; 47911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonextern thread_t* bt_workqueue_thread; 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 509ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson/* L O C A L D A T A D E F I N I T I O N S */ 51ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTM_DEV_RESET_TIMEOUT 54911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define BTM_DEV_RESET_TIMEOUT 4 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov// TODO: Reevaluate this value in the context of timers with ms granularity 58911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define BTM_DEV_NAME_REPLY_TIMEOUT_MS \ 59911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (2 * 1000) /* 2 seconds for name reply \ 60911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 62911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define BTM_INFO_TIMEOUT 5 /* 5 seconds for info response */ 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 64ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 659ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson/* L O C A L F U N C T I O N P R O T O T Y P E S */ 66ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 68911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_decode_ext_features_page(uint8_t page_number, 69911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const BD_FEATURES p_features); 703aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 72ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 73ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_dev_init 74ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 75ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is on the BTM startup 76ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 77ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 78ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 79ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 80911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_dev_init(void) { 81911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Initialize nonzero defaults */ 82911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(btm_cb.cfg.bd_name, 0, sizeof(tBTM_LOC_BD_NAME)); 83911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 84911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.read_local_name_timer = alarm_new("btm.read_local_name_timer"); 85911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.read_rssi_timer = alarm_new("btm.read_rssi_timer"); 86911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.read_link_quality_timer = 87911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_new("btm.read_link_quality_timer"); 88911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.read_inq_tx_power_timer = 89911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_new("btm.read_inq_tx_power_timer"); 90911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.qos_setup_timer = alarm_new("btm.qos_setup_timer"); 91911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.read_tx_power_timer = alarm_new("btm.read_tx_power_timer"); 92911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 93911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_acl_pkt_types_supported = 94911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ACL_PKT_TYPES_MASK_DH1 + BTM_ACL_PKT_TYPES_MASK_DM1 + 95911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ACL_PKT_TYPES_MASK_DH3 + BTM_ACL_PKT_TYPES_MASK_DM3 + 96911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ACL_PKT_TYPES_MASK_DH5 + BTM_ACL_PKT_TYPES_MASK_DM5; 97911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 98911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_sco_pkt_types_supported = 9957f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth ESCO_PKT_TYPES_MASK_HV1 + ESCO_PKT_TYPES_MASK_HV2 + 10057f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth ESCO_PKT_TYPES_MASK_HV3 + ESCO_PKT_TYPES_MASK_EV3 + 10157f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth ESCO_PKT_TYPES_MASK_EV4 + ESCO_PKT_TYPES_MASK_EV5; 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 105ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 106ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_db_reset 107ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1089ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called by BTM_DeviceReset and clears out 1099ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * any pending callbacks for inquiries, discoveries, other 1109ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * pending functions that may be in progress. 111ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 112ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 113ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 114ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_db_reset(void) { 116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CMPL_CB* p_cb; 117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS status = BTM_DEV_RESET; 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_inq_db_reset(); 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.devcb.p_rln_cmpl_cb) { 122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb = btm_cb.devcb.p_rln_cmpl_cb; 123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_rln_cmpl_cb = NULL; 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb) (*p_cb)((void*)NULL); 126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.devcb.p_rssi_cmpl_cb) { 129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cb = btm_cb.devcb.p_rssi_cmpl_cb; 130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_rssi_cmpl_cb = NULL; 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb) (*p_cb)((tBTM_RSSI_RESULTS*)&status); 133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool set_sec_state_idle(void* data, void* context) { 137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SEC_DEV_REC* p_dev_rec = static_cast<tBTM_SEC_DEV_REC*>(data); 138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return true; 140cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski} 141cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void reset_complete(void* result) { 143f2af1c42ccb2f642b241c2261b42d0be61d45438Jack He CHECK(result == FUTURE_SUCCESS); 144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const controller_t* controller = controller_get_interface(); 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Tell L2CAP that all connections are gone */ 147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2cu_device_reset(); 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Clear current security state */ 150cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski list_foreach(btm_cb.sec_dev_rec, set_sec_state_idle, NULL); 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* After the reset controller should restore all parameters to defaults. */ 153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inq_counter = 1; 154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inq_scan_window = HCI_DEF_INQUIRYSCAN_WINDOW; 155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inq_scan_period = HCI_DEF_INQUIRYSCAN_INTERVAL; 156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inq_scan_type = HCI_DEF_SCAN_TYPE; 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.page_scan_window = HCI_DEF_PAGESCAN_WINDOW; 159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.page_scan_period = HCI_DEF_PAGESCAN_INTERVAL; 160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.page_scan_type = HCI_DEF_SCAN_TYPE; 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.ble_ctr_cb.conn_state = BLE_CONN_IDLE; 16330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.ble_ctr_cb.bg_conn_type = BTM_BLE_CONN_NONE; 16430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson gatt_reset_bgdev_list(); 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_pm_reset(); 16730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson 16830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson l2c_link_processs_num_bufs(controller->get_acl_buffer_count_classic()); 169444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 170d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE) 171444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* Set up the BLE privacy settings */ 172444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (controller->supports_ble() && controller->supports_ble_privacy() && 173444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji controller->get_ble_resolving_list_max_size() > 0) { 174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_resolving_list_init(controller->get_ble_resolving_list_max_size()); 175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* set the default random private address timeout */ 176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_ble_set_rand_priv_addr_timeout(BTM_BLE_PRIVATE_ADDR_INT_MS / 177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1000); 178444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 179f88a7a197ab6652988e575ee419f6bc93b8c5b47Andre Eisenbach#endif 180444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 18130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (controller->supports_ble()) { 182b8b3e8070ad027e7a45ca5048ae807c4ec099b15Priti Aghera btm_ble_white_list_init(controller->get_ble_white_list_size()); 18330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson l2c_link_processs_ble_num_bufs(controller->get_acl_buffer_count_ble()); 18430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetPinType(btm_cb.cfg.pin_type, btm_cb.cfg.pin_code, 187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.cfg.pin_code_len); 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson for (int i = 0; i <= controller->get_last_features_classic_index(); i++) { 190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_decode_ext_features_page(i, 191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson controller->get_features_classic(i)->as_array); 19230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_report_device_status(BTM_DEV_STATUS_UP); 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson// TODO(zachoverflow): remove this function 198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_DeviceReset(UNUSED_ATTR tBTM_CMPL_CB* p_cb) { 19930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Flush all ACL connections */ 20030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_acl_device_down(); 20130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson 20230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Clear the callback, so application would not hang on reset */ 20330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_db_reset(); 20430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson 205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson module_start_up_callbacked_wrapper(get_module(CONTROLLER_MODULE), 206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bt_workqueue_thread, reset_complete); 20730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson} 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 210ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 211ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_IsDeviceUp 212ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 213ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to check if the device is up. 214ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 215ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if device is up, else false 216ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool BTM_IsDeviceUp(void) { return controller_get_interface()->get_is_ready(); } 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 221ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 222ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_read_local_name_timeout 223ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 224ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Callback when reading the local name times out. 225ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 226ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 227ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 228ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_read_local_name_timeout(UNUSED_ATTR void* data) { 230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_rln_cmpl_cb; 231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_rln_cmpl_cb = NULL; 232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb) (*p_cb)((void*)NULL); 2333aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach} 2343aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 2353aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach/******************************************************************************* 236ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 237ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_decode_ext_features_page 238ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 239ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is decodes a features page. 240ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 241ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 242ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 243ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_decode_ext_features_page(uint8_t page_number, 245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const uint8_t* p_features) { 246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_decode_ext_features_page page: %d", page_number); 247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (page_number) { 24830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Extended (Legacy) Page 0 */ 249f6ac424a81bad038bbf9a90c7c569dba81978f51Venkata Jagadeesh Garaga case 0: 2503aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Create ACL supported packet types mask */ 252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_acl_pkt_types_supported = 253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_ACL_PKT_TYPES_MASK_DH1 + BTM_ACL_PKT_TYPES_MASK_DM1); 254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_3_SLOT_PACKETS_SUPPORTED(p_features)) 256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_acl_pkt_types_supported |= 257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_ACL_PKT_TYPES_MASK_DH3 + BTM_ACL_PKT_TYPES_MASK_DM3); 258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_5_SLOT_PACKETS_SUPPORTED(p_features)) 260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_acl_pkt_types_supported |= 261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_ACL_PKT_TYPES_MASK_DH5 + BTM_ACL_PKT_TYPES_MASK_DM5); 262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Add in EDR related ACL types */ 264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!HCI_EDR_ACL_2MPS_SUPPORTED(p_features)) { 265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_acl_pkt_types_supported |= 266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_ACL_PKT_TYPES_MASK_NO_2_DH1 + BTM_ACL_PKT_TYPES_MASK_NO_2_DH3 + 267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ACL_PKT_TYPES_MASK_NO_2_DH5); 268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!HCI_EDR_ACL_3MPS_SUPPORTED(p_features)) { 271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_acl_pkt_types_supported |= 272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_ACL_PKT_TYPES_MASK_NO_3_DH1 + BTM_ACL_PKT_TYPES_MASK_NO_3_DH3 + 273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ACL_PKT_TYPES_MASK_NO_3_DH5); 274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 275911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 276911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check to see if 3 and 5 slot packets are available */ 277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_EDR_ACL_2MPS_SUPPORTED(p_features) || 278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_EDR_ACL_3MPS_SUPPORTED(p_features)) { 279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!HCI_3_SLOT_EDR_ACL_SUPPORTED(p_features)) 280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_acl_pkt_types_supported |= 281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_ACL_PKT_TYPES_MASK_NO_2_DH3 + 282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ACL_PKT_TYPES_MASK_NO_3_DH3); 283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!HCI_5_SLOT_EDR_ACL_SUPPORTED(p_features)) 285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_acl_pkt_types_supported |= 286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_ACL_PKT_TYPES_MASK_NO_2_DH5 + 287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ACL_PKT_TYPES_MASK_NO_3_DH5); 288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("Local supported ACL packet types: 0x%04x", 291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_acl_pkt_types_supported); 292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Create (e)SCO supported packet types mask */ 294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_sco_pkt_types_supported = 0; 295d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_INCLUDED == TRUE) 296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.esco_supported = false; 29730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#endif 298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_SCO_LINK_SUPPORTED(p_features)) { 29957f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth btm_cb.btm_sco_pkt_types_supported = ESCO_PKT_TYPES_MASK_HV1; 3009d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_HV2_PACKETS_SUPPORTED(p_features)) 30257f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth btm_cb.btm_sco_pkt_types_supported |= ESCO_PKT_TYPES_MASK_HV2; 3039d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_HV3_PACKETS_SUPPORTED(p_features)) 30557f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth btm_cb.btm_sco_pkt_types_supported |= ESCO_PKT_TYPES_MASK_HV3; 306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3079d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_ESCO_EV3_SUPPORTED(p_features)) 30957f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth btm_cb.btm_sco_pkt_types_supported |= ESCO_PKT_TYPES_MASK_EV3; 3109d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_ESCO_EV4_SUPPORTED(p_features)) 31257f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth btm_cb.btm_sco_pkt_types_supported |= ESCO_PKT_TYPES_MASK_EV4; 3139d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_ESCO_EV5_SUPPORTED(p_features)) 31557f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth btm_cb.btm_sco_pkt_types_supported |= ESCO_PKT_TYPES_MASK_EV5; 316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.btm_sco_pkt_types_supported & BTM_ESCO_LINK_ONLY_MASK) { 317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.esco_supported = true; 318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Add in EDR related eSCO types */ 320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_EDR_ESCO_2MPS_SUPPORTED(p_features)) { 321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!HCI_3_SLOT_EDR_ESCO_SUPPORTED(p_features)) 32257f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth btm_cb.btm_sco_pkt_types_supported |= ESCO_PKT_TYPES_MASK_NO_2_EV5; 323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_sco_pkt_types_supported |= 32557f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth (ESCO_PKT_TYPES_MASK_NO_2_EV3 + ESCO_PKT_TYPES_MASK_NO_2_EV5); 326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_EDR_ESCO_3MPS_SUPPORTED(p_features)) { 329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!HCI_3_SLOT_EDR_ESCO_SUPPORTED(p_features)) 33057f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth btm_cb.btm_sco_pkt_types_supported |= ESCO_PKT_TYPES_MASK_NO_3_EV5; 331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_sco_pkt_types_supported |= 33357f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth (ESCO_PKT_TYPES_MASK_NO_3_EV3 + ESCO_PKT_TYPES_MASK_NO_3_EV5); 33430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 335911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3363aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("Local supported SCO packet types: 0x%04x", 338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_sco_pkt_types_supported); 3393aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Create Default Policy Settings */ 341911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_SWITCH_SUPPORTED(p_features)) 342911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_def_link_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 344911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_def_link_policy &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH; 3453aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 346911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_HOLD_MODE_SUPPORTED(p_features)) 347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_def_link_policy |= HCI_ENABLE_HOLD_MODE; 348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_def_link_policy &= ~HCI_ENABLE_HOLD_MODE; 3503aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_SNIFF_MODE_SUPPORTED(p_features)) 352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_def_link_policy |= HCI_ENABLE_SNIFF_MODE; 353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_def_link_policy &= ~HCI_ENABLE_SNIFF_MODE; 3553aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_PARK_MODE_SUPPORTED(p_features)) 357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_def_link_policy |= HCI_ENABLE_PARK_MODE; 358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_def_link_policy &= ~HCI_ENABLE_PARK_MODE; 3603aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_dev_reset(); 362fc9c99817a6f3a951e3fc1ccdc48ebd2a54824a7Andre Eisenbach 363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_LMP_INQ_RSSI_SUPPORTED(p_features)) { 364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_EXT_INQ_RSP_SUPPORTED(p_features)) 365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetInquiryMode(BTM_INQ_RESULT_EXTENDED); 366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetInquiryMode(BTM_INQ_RESULT_WITH_RSSI); 368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 369fc9c99817a6f3a951e3fc1ccdc48ebd2a54824a7Andre Eisenbach 370d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE) 371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (HCI_NON_FLUSHABLE_PB_SUPPORTED(p_features)) 372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2cu_set_non_flushable_pbf(true); 373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson l2cu_set_non_flushable_pbf(false); 37530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#endif 376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetPageScanType(BTM_DEFAULT_SCAN_TYPE); 377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetInquiryScanType(BTM_DEFAULT_SCAN_TYPE); 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson default: 382f6ac424a81bad038bbf9a90c7c569dba81978f51Venkata Jagadeesh Garaga BTM_TRACE_WARNING("%s: feature page %d ignored", __func__, page_number); 383911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 388ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 389ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetLocalDeviceName 390ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 391ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to set the local device name. 392ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 393ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns status of the operation 394ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 395ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 396911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_SetLocalDeviceName(char* p_name) { 397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p; 398911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_name || !p_name[0] || (strlen((char*)p_name) > BD_NAME_LEN)) 400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_ILLEGAL_VALUE); 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 402911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!controller_get_interface()->get_is_ready()) return (BTM_DEV_RESET); 403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Save the device name if local storage is enabled */ 404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = (uint8_t*)btm_cb.cfg.bd_name; 405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p != (uint8_t*)p_name) 406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson strlcpy(btm_cb.cfg.bd_name, p_name, BTM_MAX_LOC_BD_NAME_LEN); 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_change_name(p); 409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 413ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 414ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadLocalDeviceName 415ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 416ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to read the local device name. 417ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 418ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns status of the operation 419ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If success, BTM_SUCCESS is returned and p_name points stored 420ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * local device name 421ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If BTM doesn't store local device name, BTM_NO_RESOURCES is 422ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is returned and p_name is set to NULL 423ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 424ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 425911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_ReadLocalDeviceName(char** p_name) { 426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_name = btm_cb.cfg.bd_name; 427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 431ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 432ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadLocalDeviceNameFromController 433ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 434ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Get local device name from controller. Do not use cached 435ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * name (used to get chip-id prior to btm reset complete). 436ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 437ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_CMD_STARTED if successful, otherwise an error 438ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 439ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 440911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_ReadLocalDeviceNameFromController( 441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CMPL_CB* p_rln_cmpl_cback) { 442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check if rln already in progress */ 443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.devcb.p_rln_cmpl_cb) return (BTM_NO_RESOURCES); 444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Save callback */ 446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_rln_cmpl_cb = p_rln_cmpl_cback; 447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_read_name(); 449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_set_on_queue(btm_cb.devcb.read_local_name_timer, 450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_DEV_NAME_REPLY_TIMEOUT_MS, btm_read_local_name_timeout, 451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson NULL, btu_general_alarm_queue); 452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_CMD_STARTED; 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 457ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 458ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_read_local_name_complete 459ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 460ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when local name read complete. 461ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * message is received from the HCI. 462ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 463ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 464ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 465ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_read_local_name_complete(uint8_t* p, UNUSED_ATTR uint16_t evt_len) { 467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_rln_cmpl_cb; 468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t status; 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_cancel(btm_cb.devcb.read_local_name_timer); 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If there was a callback address for read local name, call it */ 473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_rln_cmpl_cb = NULL; 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb) { 476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(status, p); 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status == HCI_SUCCESS) 479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p_cb)(p); 480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p_cb)(NULL); 482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 486ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 487ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetDeviceClass 488ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 489ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to set the local device class 490ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 491ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns status of the operation 492ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 493ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 494911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_SetDeviceClass(DEV_CLASS dev_class) { 495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!memcmp(btm_cb.devcb.dev_class, dev_class, DEV_CLASS_LEN)) 496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(btm_cb.devcb.dev_class, dev_class, DEV_CLASS_LEN); 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!controller_get_interface()->get_is_ready()) return (BTM_DEV_RESET); 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_dev_class(dev_class); 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 508ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 509ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadDeviceClass 510ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 511ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to read the local device class 512ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 513ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns pointer to the device class 514ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 515ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t* BTM_ReadDeviceClass(void) { 517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ((uint8_t*)btm_cb.devcb.dev_class); 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 521ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 522ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadLocalFeatures 523ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 524ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to read the local features 525ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 526ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns pointer to the local features string 527ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 528ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 52930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson// TODO(zachoverflow): get rid of this function 530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t* BTM_ReadLocalFeatures(void) { 531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // Discarding const modifier for now, until this function dies 532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (uint8_t*)controller_get_interface() 533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ->get_features_classic(0) 534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ->as_array; 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 538ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 539ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_RegisterForDeviceStatusNotif 540ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 541ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to register for device status 542ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * change notifications. 543ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 544ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If one registration is already there calling function should 545ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * save the pointer to the function that is return and 546ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * call it when processing of the event is complete 547ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 548ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns status of the operation 549ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 550ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 551911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_DEV_STATUS_CB* BTM_RegisterForDeviceStatusNotif(tBTM_DEV_STATUS_CB* p_cb) { 552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_DEV_STATUS_CB* p_prev = btm_cb.devcb.p_dev_status_cb; 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_dev_status_cb = p_cb; 555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_prev); 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 559ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 560ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_VendorSpecificCommand 561ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 562ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Send a vendor specific HCI command to the controller. 563ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 564ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Notes 565ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Opcode will be OR'd with HCI_GRP_VENDOR_SPECIFIC. 566ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 567ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 5683d5fbcaf9f191737b1c818523e1bf6831c50d586Jakub Pawlowskivoid BTM_VendorSpecificCommand(uint16_t opcode, uint8_t param_len, 569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_param_buf, tBTM_VSC_CMPL_CB* p_cb) { 570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Allocate a buffer to hold HCI command plus the callback function */ 571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson void* p_buf = osi_malloc(sizeof(BT_HDR) + sizeof(tBTM_CMPL_CB*) + param_len + 572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCIC_PREAMBLE_SIZE); 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("BTM: %s: Opcode: 0x%04X, ParamLen: %i.", __func__, opcode, 575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson param_len); 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Send the HCI command (opcode will be OR'd with HCI_GRP_VENDOR_SPECIFIC) */ 578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_vendor_spec_cmd(p_buf, opcode, param_len, p_param_buf, 579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (void*)p_cb); 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 583ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 584ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_vsc_complete 585ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 586ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when local HCI Vendor Specific 587ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Command complete message is received from the HCI. 588ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 589ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 590ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 591ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_vsc_complete(uint8_t* p, uint16_t opcode, uint16_t evt_len, 593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CMPL_CB* p_vsc_cplt_cback) { 594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_VSC_CMPL vcs_cplt_params; 595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If there was a callback address for vcs complete, call it */ 597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_vsc_cplt_cback) { 598911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Pass paramters to the callback function */ 599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson vcs_cplt_params.opcode = opcode; /* Number of bytes in return info */ 600911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson vcs_cplt_params.param_len = evt_len; /* Number of bytes in return info */ 601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson vcs_cplt_params.p_param_buf = p; 602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p_vsc_cplt_cback)( 603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson &vcs_cplt_params); /* Call the VSC complete callback function */ 604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 608ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 609ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_RegisterForVSEvents 610ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 611ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to register/deregister for vendor 612ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * specific HCI events. 613ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 614ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If is_register=true, then the function will be registered; 6159ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * otherwise, the the function will be deregistered. 616ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 617ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS if successful, 618ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_BUSY if maximum number of callbacks have already been 619ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * registered. 620ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 621ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 622911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_RegisterForVSEvents(tBTM_VS_EVT_CB* p_cb, bool is_register) { 623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS retval = BTM_SUCCESS; 624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t i, free_idx = BTM_MAX_VSE_CALLBACKS; 625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* See if callback is already registered */ 627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < BTM_MAX_VSE_CALLBACKS; i++) { 628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.devcb.p_vend_spec_cb[i] == NULL) { 629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Found a free slot. Store index */ 630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson free_idx = i; 631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (btm_cb.devcb.p_vend_spec_cb[i] == p_cb) { 632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Found callback in lookup table. If deregistering, clear the entry. */ 633911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_register == false) { 634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_vend_spec_cb[i] = NULL; 635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("BTM Deregister For VSEvents is successfully"); 636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Didn't find callback. Add callback to free slot if registering */ 642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_register) { 643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (free_idx < BTM_MAX_VSE_CALLBACKS) { 644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_vend_spec_cb[free_idx] = p_cb; 645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("BTM Register For VSEvents is successfully"); 646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* No free entries available */ 648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("BTM_RegisterForVSEvents: too many callbacks registered"); 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson retval = BTM_NO_RESOURCES; 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (retval); 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 658ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 659ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_vendor_specific_evt 660ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 661ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Process event HCI_VENDOR_SPECIFIC_EVT 662ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 663ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note: Some controllers do not send command complete, so 664ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the callback and busy flag are cleared here also. 665ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 666ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 667ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 668ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_vendor_specific_evt(uint8_t* p, uint8_t evt_len) { 670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t i; 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM Event: Vendor Specific event from controller"); 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 674911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < BTM_MAX_VSE_CALLBACKS; i++) { 675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.devcb.p_vend_spec_cb[i]) 676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.devcb.p_vend_spec_cb[i])(evt_len, p); 677911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 681ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 682ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_WritePageTimeout 683ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 684ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Send HCI Write Page Timeout. 685ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 686ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_WritePageTimeout(uint16_t timeout) { 688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("BTM: BTM_WritePageTimeout: Timeout: %d.", timeout); 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 690911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Send the HCI command */ 691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_page_tout(timeout); 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 695ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 696ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_WriteVoiceSettings 697ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 698ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Send HCI Write Voice Settings command. 699ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * See hcidefs.h for settings bitmask values. 700ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 701ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_WriteVoiceSettings(uint16_t settings) { 703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("BTM: BTM_WriteVoiceSettings: Settings: 0x%04x.", settings); 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 705911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Send the HCI command */ 706911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_voice_settings((uint16_t)(settings & 0x03ff)); 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 710ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 711ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_EnableTestMode 712ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 713ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Send HCI the enable device under test command. 714ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 715ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note: Controller can only be taken out of this mode by 716ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * resetting the controller. 717ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 718ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns 719ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SUCCESS Command sent. 720ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_NO_RESOURCES If out of resources to send the command. 721ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 722ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 723ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 724911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_EnableTestMode(void) { 725911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t cond; 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 727911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("BTM: BTM_EnableTestMode"); 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 729911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* set auto accept connection as this is needed during test mode */ 730911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Allocate a buffer to hold HCI command */ 731911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cond = HCI_DO_AUTO_ACCEPT_CONNECT; 732911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_set_event_filter(HCI_FILTER_CONNECTION_SETUP, 733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_FILTER_COND_NEW_DEVICE, &cond, sizeof(cond)); 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* put device to connectable mode */ 736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_SetConnectability(BTM_CONNECTABLE, BTM_DEFAULT_CONN_WINDOW, 737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_DEFAULT_CONN_INTERVAL) != BTM_SUCCESS) { 738911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_NO_RESOURCES; 739911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 740911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 741911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* put device to discoverable mode */ 742911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_SetDiscoverability(BTM_GENERAL_DISCOVERABLE, BTM_DEFAULT_DISC_WINDOW, 743911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_DEFAULT_DISC_INTERVAL) != BTM_SUCCESS) { 744911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_NO_RESOURCES; 745911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 746911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 747911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* mask off all of event from controller */ 748911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson hci_layer_get_interface()->transmit_command( 749911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson hci_packet_factory_get_interface()->make_set_event_mask( 750911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (const bt_event_mask_t*)("\x00\x00\x00\x00\x00\x00\x00\x00")), 751911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson NULL, NULL, NULL); 752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Send the HCI command */ 754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_enable_test_mode(); 755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 759ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 760ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_DeleteStoredLinkKey 761ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 762ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to delete link key for the specified 7639ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * device addresses from the NVRAM storage attached to the 7649ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Bluetooth controller. 765ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 766ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: bd_addr - Addresses of the devices 767ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_cb - Call back function to be called to return 768ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the results 769ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 770ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 771a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub PawlowskitBTM_STATUS BTM_DeleteStoredLinkKey(const RawAddress* bd_addr, 772c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski tBTM_CMPL_CB* p_cb) { 773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check if the previous command is completed */ 774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.devcb.p_stored_link_key_cmpl_cb) return (BTM_BUSY); 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 776c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski bool delete_all_flag = !bd_addr; 777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("BTM: BTM_DeleteStoredLinkKey: delete_all_flag: %s", 779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson delete_all_flag ? "true" : "false"); 780911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 781911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_stored_link_key_cmpl_cb = p_cb; 782c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski if (!bd_addr) { 783c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski /* This is to delete all link keys */ 784c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski /* We don't care the BD address. Just pass a non zero pointer */ 785b707f447cbb916de2e0dfd2b4e9bf15818376e64Jakub Pawlowski RawAddress local_bd_addr = RawAddress::kEmpty; 786c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btsnd_hcic_delete_stored_key(local_bd_addr, delete_all_flag); 787c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski } else { 788c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btsnd_hcic_delete_stored_key(*bd_addr, delete_all_flag); 789c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski } 790c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski 791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 795ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 796ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_delete_stored_link_key_complete 797ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 798ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when the command complete message 7999ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * is received from the HCI for the delete stored link key 8009ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * command. 801ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 802ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 803ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 804ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_delete_stored_link_key_complete(uint8_t* p) { 806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_stored_link_key_cmpl_cb; 807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_DELETE_STORED_LINK_KEY_COMPLETE result; 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If there was a callback registered for read stored link key, call it */ 810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_stored_link_key_cmpl_cb = NULL; 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb) { 813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Set the call back event to indicate command complete */ 814911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result.event = BTM_CB_EVT_DELETE_STORED_LINK_KEYS; 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 816911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Extract the result fields from the HCI event */ 817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(result.status, p); 818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT16(result.num_keys, p); 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Call the call back and pass the result */ 821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p_cb)(&result); 822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 826ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 827ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_report_device_status 828ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 829ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when there is a change in the device 830ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * status. This function will report the new device status to 831ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the application 832ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 833ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 834ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 835ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 836911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_report_device_status(tBTM_DEV_STATUS status) { 837911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_DEV_STATUS_CB* p_cb = btm_cb.devcb.p_dev_status_cb; 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 839911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Call the call back to pass the device status to application */ 840911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb) (*p_cb)(status); 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 842