16ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 2e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * 3e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * Copyright (C) 2009-2012 Broadcom Corporation 4e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * 56ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Licensed under the Apache License, Version 2.0 (the "License"); 66ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * you may not use this file except in compliance with the License. 76ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * You may obtain a copy of the License at: 8e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * 96ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * http://www.apache.org/licenses/LICENSE-2.0 10e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * 116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Unless required by applicable law or agreed to in writing, software 126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * distributed under the License is distributed on an "AS IS" BASIS, 136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * See the License for the specific language governing permissions and 156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * limitations under the License. 16e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * 176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 18e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 19e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/************************************************************************************ 20e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * 21e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * Filename: btif_core.c 22e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * 235140bed9a19aadca962184ebc9ed823d5d7cb745jechao * Description: Contains core functionality related to interfacing between 245140bed9a19aadca962184ebc9ed823d5d7cb745jechao * Bluetooth HAL and BTE core stack. 25254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren * 26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ***********************************************************************************/ 27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy#include <stdlib.h> 29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <hardware/bluetooth.h> 30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <string.h> 3135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy#include <sys/types.h> 3235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy#include <sys/stat.h> 3335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy#include <fcntl.h> 3435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy#include <dirent.h> 3535207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy#include <ctype.h> 3635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy#include <cutils/properties.h> 3735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy 38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define LOG_TAG "BTIF_CORE" 39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btif_api.h" 40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bta_api.h" 41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "gki.h" 42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btu.h" 43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bte.h" 44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bd.h" 452fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren#include "btif_av.h" 46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btif_storage.h" 47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btif_util.h" 48b888218fb9061d8ddf41013dba6d0956b3322fd6zzy#include "btif_sock.h" 498e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy#include "btif_pan.h" 50fe1b7a6c392ef7ccc371e3bf580f2e853d0d6c65Ganesh Ganapathi Batta#include "btif_profile_queue.h" 5154cdfabe7c0ed98732d0641ffe8b19ff7284e7d4zzy#include "btif_config.h" 52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/************************************************************************************ 53e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Constants & Macros 54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach************************************************************************************/ 55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#ifndef BTIF_TASK_STACK_SIZE 5795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#define BTIF_TASK_STACK_SIZE 0x2000 /* In bytes */ 58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 605edcdde0b51f3d5153990672f55422bbcabc5cecSreenidhi T#ifndef BTE_DID_CONF_FILE 615edcdde0b51f3d5153990672f55422bbcabc5cecSreenidhi T#define BTE_DID_CONF_FILE "/etc/bluetooth/bt_did.conf" 625edcdde0b51f3d5153990672f55422bbcabc5cecSreenidhi T#endif 635edcdde0b51f3d5153990672f55422bbcabc5cecSreenidhi T 64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define BTIF_TASK_STR ((INT8 *) "BTIF") 6595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/************************************************************************************ 67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Local type definitions 68e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach************************************************************************************/ 6929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* These type definitions are used when passing data from the HAL to BTIF context 71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach* in the downstream path for the adapter and remote_device property APIs */ 7229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachtypedef struct { 74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_bdaddr_t bd_addr; 75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_property_type_t type; 76e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} btif_storage_read_t; 77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachtypedef struct { 79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_bdaddr_t bd_addr; 80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_property_t prop; 81e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} btif_storage_write_t; 82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 83e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachtypedef union { 84e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_read_t read_req; 85e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_write_t write_req; 86e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} btif_storage_req_t; 8729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 8829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agrentypedef enum { 8929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren BTIF_CORE_STATE_DISABLED = 0, 9029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren BTIF_CORE_STATE_ENABLING, 9129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren BTIF_CORE_STATE_ENABLED, 9229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren BTIF_CORE_STATE_DISABLING 9329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren} btif_core_state_t; 9429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/************************************************************************************ 96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Static variables 97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach************************************************************************************/ 9829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 9935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamybt_bdaddr_t btif_local_bd_addr; 10029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 10129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agrenstatic UINT32 btif_task_stack[(BTIF_TASK_STACK_SIZE + 3) / 4]; 10229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 10329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren/* holds main adapter state */ 10429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agrenstatic btif_core_state_t btif_core_state = BTIF_CORE_STATE_DISABLED; 10529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 10629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agrenstatic int btif_shutdown_pending = 0; 10729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agrenstatic tBTA_SERVICE_MASK btif_enabled_services = 0; 10829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 109a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy/* 110a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy* This variable should be set to 1, if the Bluedroid+BTIF libraries are to 111a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy* function in DUT mode. 112a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy* 113a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy* To set this, the btif_init_bluetooth needs to be called with argument as 1 114a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy*/ 115a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamystatic UINT8 btif_dut_mode = 0; 116a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy 117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/************************************************************************************ 118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Static functions 119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach************************************************************************************/ 1205140bed9a19aadca962184ebc9ed823d5d7cb745jechaostatic bt_status_t btif_associate_evt(void); 1215140bed9a19aadca962184ebc9ed823d5d7cb745jechaostatic bt_status_t btif_disassociate_evt(void); 122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* sends message to btif task */ 124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void btif_sendmsg(void *p_msg); 125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/************************************************************************************ 127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Externs 128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach************************************************************************************/ 1295edcdde0b51f3d5153990672f55422bbcabc5cecSreenidhi Textern void bte_load_did_conf(const char *p_path); 130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/** TODO: Move these to _common.h */ 132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bte_main_boot_entry(void); 13335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamyvoid bte_main_enable(uint8_t *local_addr); 134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bte_main_disable(void); 135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bte_main_shutdown(void); 136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE) 137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bte_main_enable_lpm(BOOLEAN enable); 138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bte_main_postload_cfg(void); 140b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamyvoid btif_dm_execute_service_request(UINT16 event, char *p_param); 141a858acd87bb1cb8f584b66a50e16b1adcfd6a42fSen-Der Huang#ifdef BTIF_DM_OOB_TEST 142a858acd87bb1cb8f584b66a50e16b1adcfd6a42fSen-Der Huangvoid btif_dm_load_local_oob(void); 143a858acd87bb1cb8f584b66a50e16b1adcfd6a42fSen-Der Huang#endif 144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/************************************************************************************ 146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Functions 147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach************************************************************************************/ 148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/***************************************************************************** 151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Context switching functions 152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*****************************************************************************/ 153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btif_context_switched 158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1595140bed9a19aadca962184ebc9ed823d5d7cb745jechao** Description Callback used to execute transferred context callback 160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_msg : message to be executed in btif context 162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1635140bed9a19aadca962184ebc9ed823d5d7cb745jechao** Returns void 164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void btif_context_switched(void *p_msg) 168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTIF_CONTEXT_SWITCH_CBACK *p; 170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_VERBOSE0("btif_context_switched"); 172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p = (tBTIF_CONTEXT_SWITCH_CBACK *) p_msg; 174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* each callback knows how to parse the data */ 176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p->p_cb) 1775140bed9a19aadca962184ebc9ed823d5d7cb745jechao p->p_cb(p->event, p->p_param); 178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btif_transfer_context 184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function switches context to btif task 186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_cback : callback used to process message in btif context 188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** event : event id of message 189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_params : parameter area passed to callback (copied) 190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** param_len : length of parameter area 191254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** p_copy_cback : If set this function will be invoked for deep copy 192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 193254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns void 194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_transfer_context (tBTIF_CBACK *p_cback, UINT16 event, char* p_params, int param_len, tBTIF_COPY_CBACK *p_copy_cback) 198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1995140bed9a19aadca962184ebc9ed823d5d7cb745jechao tBTIF_CONTEXT_SWITCH_CBACK *p_msg; 200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_VERBOSE2("btif_transfer_context event %d, len %d", event, param_len); 202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* allocate and send message that will be executed in btif context */ 204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_msg = (tBTIF_CONTEXT_SWITCH_CBACK *) GKI_getbuf(sizeof(tBTIF_CONTEXT_SWITCH_CBACK) + param_len)) != NULL) 205254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.event = BT_EVT_CONTEXT_SWITCH_EVT; /* internal event */ 207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->p_cb = p_cback; 208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->event = event; /* callback event */ 210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* check if caller has provided a copy callback to do the deep copy */ 212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_copy_cback) 213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_copy_cback(event, p_msg->p_param, p_params); 215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (p_params) 217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(p_msg->p_param, p_params, param_len); /* callback parameter data */ 219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_sendmsg(p_msg); 222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BT_STATUS_SUCCESS; 223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* let caller deal with a failed allocation */ 227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BT_STATUS_NOMEM; 228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 231a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy/******************************************************************************* 232a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** 233a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Function btif_is_dut_mode 234a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** 235a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Description checks if BTIF is currently in DUT mode 236a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** 237a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Returns 1 if test mode, otherwize 0 238a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** 239a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy*******************************************************************************/ 240a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy 241a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik SinnaswamyUINT8 btif_is_dut_mode(void) 242a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy{ 243a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy return (btif_dut_mode == 1); 244a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy} 24529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 24629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren/******************************************************************************* 24729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** 24829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** Function btif_is_enabled 24929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** 25029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** Description checks if main adapter is fully enabled 25129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** 25229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** Returns 1 if fully enabled, otherwize 0 25329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** 25429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren*******************************************************************************/ 25529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 25629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agrenint btif_is_enabled(void) 25729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren{ 258a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy return ((!btif_is_dut_mode()) && (btif_core_state == BTIF_CORE_STATE_ENABLED)); 25929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren} 26029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btif_task 264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description BTIF task handler managing all messages being passed 266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Bluetooth HAL and BTA. 267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2685140bed9a19aadca962184ebc9ed823d5d7cb745jechao** Returns void 269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void btif_task(UINT32 params) 273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 event; 275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BT_HDR *p_msg; 276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_DEBUG0("btif task starting"); 278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2795140bed9a19aadca962184ebc9ed823d5d7cb745jechao btif_associate_evt(); 280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for(;;) 282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* wait for specified events */ 284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach event = GKI_wait(0xFFFF, 0); 2855140bed9a19aadca962184ebc9ed823d5d7cb745jechao 286254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* 287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * Wait for the trigger to init chip and stack. This trigger will 288254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren * be received by btu_task once the UART is opened and ready 289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach */ 290254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren if (event == BT_EVT_TRIGGER_STACK_INIT) 291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_DEBUG0("btif_task: received trigger stack init event"); 293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_EnableBluetooth(bte_dm_evt); 294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (event & EVENT_MASK(GKI_SHUTDOWN_EVT)) 297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(event & TASK_MBOX_1_EVT_MASK) 300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach while((p_msg = GKI_read_mbox(BTU_BTIF_MBOX)) != NULL) 302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_VERBOSE1("btif task fetched event %x", p_msg->event); 3045140bed9a19aadca962184ebc9ed823d5d7cb745jechao 305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach switch (p_msg->event) 306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BT_EVT_CONTEXT_SWITCH_EVT: 308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_context_switched(p_msg); 3095140bed9a19aadca962184ebc9ed823d5d7cb745jechao break; 310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach default: 311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_ERROR1("unhandled btif event (%d)", p_msg->event & BT_EVT_MASK); 312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf(p_msg); 316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3195140bed9a19aadca962184ebc9ed823d5d7cb745jechao 3205140bed9a19aadca962184ebc9ed823d5d7cb745jechao btif_disassociate_evt(); 3215140bed9a19aadca962184ebc9ed823d5d7cb745jechao 3225140bed9a19aadca962184ebc9ed823d5d7cb745jechao BTIF_TRACE_DEBUG0("btif task exiting"); 323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btif_sendmsg 329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Sends msg to BTIF task 331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 332254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns void 333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btif_sendmsg(void *p_msg) 337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_send_msg(BTIF_TASK, BTU_BTIF_MBOX, p_msg); 339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 34135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamystatic void btif_fetch_local_bdaddr(bt_bdaddr_t *local_addr) 34235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy{ 34335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy char val[256]; 34435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy uint8_t valid_bda = FALSE; 345bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta int val_size = 0; 34635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy const uint8_t null_bdaddr[BD_ADDR_LEN] = {0,0,0,0,0,0}; 34735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy 34835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy /* Get local bdaddr storage path from property */ 34935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy if (property_get(PROPERTY_BT_BDADDR_PATH, val, NULL)) 35035207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy { 35135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy int addr_fd; 35235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy 35335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy BTIF_TRACE_DEBUG1("local bdaddr is stored in %s", val); 35435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy 35535207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy if ((addr_fd = open(val, O_RDONLY)) != -1) 35635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy { 35735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy memset(val, 0, sizeof(val)); 35835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy read(addr_fd, val, FACTORY_BT_BDADDR_STORAGE_LEN); 35935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy str2bd(val, local_addr); 36035207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy /* If this is not a reserved/special bda, then use it */ 36135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy if (memcmp(local_addr->address, null_bdaddr, BD_ADDR_LEN) != 0) 36235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy { 36335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy valid_bda = TRUE; 36435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy BTIF_TRACE_DEBUG6("Got Factory BDA %02X:%02X:%02X:%02X:%02X:%02X", 36535207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy local_addr->address[0], local_addr->address[1], local_addr->address[2], 36635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy local_addr->address[3], local_addr->address[4], local_addr->address[5]); 36735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy } 36835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy 36935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy close(addr_fd); 37035207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy } 37135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy } 37235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy 373bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta if(!valid_bda) 374bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta { 375bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta val_size = sizeof(val); 376bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta if(btif_config_get_str("Local", "Adapter", "Address", val, &val_size)) 377bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta { 378bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta str2bd(val, local_addr); 379ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao BTIF_TRACE_DEBUG1("local bdaddr from bt_config.xml is %s", val); 380bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta return; 381bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta } 382bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta } 383bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta 38435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy /* No factory BDADDR found. Look for previously generated random BDA */ 38535207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy if ((!valid_bda) && \ 38635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy (property_get(PERSIST_BDADDR_PROPERTY, val, NULL))) 38735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy { 38835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy str2bd(val, local_addr); 38935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy valid_bda = TRUE; 39035207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy BTIF_TRACE_DEBUG6("Got prior random BDA %02X:%02X:%02X:%02X:%02X:%02X", 39135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy local_addr->address[0], local_addr->address[1], local_addr->address[2], 39235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy local_addr->address[3], local_addr->address[4], local_addr->address[5]); 39335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy } 39435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy 39535207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy /* Generate new BDA if necessary */ 39635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy if (!valid_bda) 39735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy { 39835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy bdstr_t bdstr; 39935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy /* Seed the random number generator */ 40035207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy srand((unsigned int) (time(0))); 40135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy 40235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy /* No autogen BDA. Generate one now. */ 40335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy local_addr->address[0] = 0x22; 40435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy local_addr->address[1] = 0x22; 40535207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy local_addr->address[2] = (uint8_t) ((rand() >> 8) & 0xFF); 40635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy local_addr->address[3] = (uint8_t) ((rand() >> 8) & 0xFF); 40735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy local_addr->address[4] = (uint8_t) ((rand() >> 8) & 0xFF); 40835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy local_addr->address[5] = (uint8_t) ((rand() >> 8) & 0xFF); 40935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy 41035207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy /* Convert to ascii, and store as a persistent property */ 41135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy bd2str(local_addr, &bdstr); 41235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy 41335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy BTIF_TRACE_DEBUG2("No preset BDA. Generating BDA: %s for prop %s", 41435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy (char*)bdstr, PERSIST_BDADDR_PROPERTY); 41535207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy 41635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy if (property_set(PERSIST_BDADDR_PROPERTY, (char*)bdstr) < 0) 41735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy BTIF_TRACE_ERROR1("Failed to set random BDA in prop %s",PERSIST_BDADDR_PROPERTY); 41835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy } 419ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao 42054cdfabe7c0ed98732d0641ffe8b19ff7284e7d4zzy //save the bd address to config file 42154cdfabe7c0ed98732d0641ffe8b19ff7284e7d4zzy bdstr_t bdstr; 42254cdfabe7c0ed98732d0641ffe8b19ff7284e7d4zzy bd2str(local_addr, &bdstr); 423bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta val_size = sizeof(val); 424bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta if (btif_config_get_str("Local", "Adapter", "Address", val, &val_size)) 425bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta { 426bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta if (strcmp(bdstr, val) ==0) 427bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta { 428bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta // BDA is already present in the config file. 429bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta return; 430bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta } 431bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta } 43254cdfabe7c0ed98732d0641ffe8b19ff7284e7d4zzy btif_config_set_str("Local", "Adapter", "Address", bdstr); 43354cdfabe7c0ed98732d0641ffe8b19ff7284e7d4zzy btif_config_save(); 43435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy} 43535207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy 436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/***************************************************************************** 437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** btif core api functions 439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*****************************************************************************/ 441e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 442e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 443e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 444e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btif_init_bluetooth 445e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Creates BTIF task and prepares BT scheduler for startup 447254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 448254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns bt_status_t 449e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 451e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 452a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamybt_status_t btif_init_bluetooth() 453e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 45435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy UINT8 status; 45554cdfabe7c0ed98732d0641ffe8b19ff7284e7d4zzy btif_config_init(); 456e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bte_main_boot_entry(); 457e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 45835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy /* As part of the init, fetch the local BD ADDR */ 45935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy memset(&btif_local_bd_addr, 0, sizeof(bt_bdaddr_t)); 46035207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy btif_fetch_local_bdaddr(&btif_local_bd_addr); 46135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy 46235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy /* start btif task */ 46335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy status = GKI_create_task(btif_task, BTIF_TASK, BTIF_TASK_STR, 46435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy (UINT16 *) ((UINT8 *)btif_task_stack + BTIF_TASK_STACK_SIZE), 46535207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy sizeof(btif_task_stack)); 46635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy 46735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy if (status != GKI_SUCCESS) 46835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy return BT_STATUS_FAIL; 46935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy 470e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BT_STATUS_SUCCESS; 471e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 472e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 473e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 474e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4755140bed9a19aadca962184ebc9ed823d5d7cb745jechao** Function btif_associate_evt 476e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4775140bed9a19aadca962184ebc9ed823d5d7cb745jechao** Description Event indicating btif_task is up 478e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Attach btif_task to JVM 479e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 480e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 481e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 482e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 483e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4845140bed9a19aadca962184ebc9ed823d5d7cb745jechaostatic bt_status_t btif_associate_evt(void) 485e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 486e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_DEBUG1("%s: notify ASSOCIATE_JVM", __FUNCTION__); 487254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren HAL_CBACK(bt_hal_cbacks, thread_evt_cb, ASSOCIATE_JVM); 488e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 489e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BT_STATUS_SUCCESS; 490e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 491e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 492e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 493e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 494e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 495e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btif_enable_bluetooth 496e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 497e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Performs chip power on and kickstarts OS scheduler 498254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 499254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns bt_status_t 500e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 501e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 502e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 503e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_enable_bluetooth(void) 504e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 50529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren BTIF_TRACE_DEBUG0("BTIF ENABLE BLUETOOTH"); 506e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 50729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren if (btif_core_state != BTIF_CORE_STATE_DISABLED) 508e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 509595bced8e7c280e37a75b9bf9c1f36263434041cMatthew Xie ALOGD("not disabled\n"); 510e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BT_STATUS_DONE; 511e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 512e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 51329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren btif_core_state = BTIF_CORE_STATE_ENABLING; 514e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 515e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Create the GKI tasks and run them */ 51635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy bte_main_enable(btif_local_bd_addr.address); 51735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy 518e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BT_STATUS_SUCCESS; 519e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 520e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 521e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 522e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 523e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 524e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btif_enable_bluetooth_evt 525e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 526e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Event indicating bluetooth enable is completed 527e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Notifies HAL user with updated adapter state 528254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 529254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns void 530e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 531e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 532e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 533e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btif_enable_bluetooth_evt(tBTA_STATUS status, BD_ADDR local_bd) 534e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 535e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_bdaddr_t bd_addr; 536e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdstr_t bdstr; 537e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 538e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(bd_addr.address, local_bd); 539e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_DEBUG3("%s: status %d, local bd [%s]", __FUNCTION__, status, 540e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bd2str(&bd_addr, &bdstr)); 541ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao 542ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao if (bdcmp(btif_local_bd_addr.address,local_bd)) 543ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao { 544ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao bdstr_t buf; 545ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao bt_property_t prop; 546ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao 547ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao /** 548ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao * The Controller's BDADDR does not match to the BTIF's initial BDADDR! 549ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao * This could be because the factory BDADDR was stored separatley in 550ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao * the Controller's non-volatile memory rather than in device's file 551ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao * system. 552ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao **/ 553ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao BTIF_TRACE_WARNING0("***********************************************"); 554ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao BTIF_TRACE_WARNING6("BTIF init BDA was %02X:%02X:%02X:%02X:%02X:%02X", 555ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao btif_local_bd_addr.address[0], btif_local_bd_addr.address[1], 556ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao btif_local_bd_addr.address[2], btif_local_bd_addr.address[3], 557ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao btif_local_bd_addr.address[4], btif_local_bd_addr.address[5]); 558ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao BTIF_TRACE_WARNING6("Controller BDA is %02X:%02X:%02X:%02X:%02X:%02X", 559ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao local_bd[0], local_bd[1], local_bd[2], 560ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao local_bd[3], local_bd[4], local_bd[5]); 561ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao BTIF_TRACE_WARNING0("***********************************************"); 562ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao 563ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao bdcpy(btif_local_bd_addr.address, local_bd); 564ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao 565ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao //save the bd address to config file 566ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao bd2str(&btif_local_bd_addr, &buf); 567ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao btif_config_set_str("Local", "Adapter", "Address", buf); 568ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao btif_config_save(); 569ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao 570ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao //fire HAL callback for property change 571ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao memcpy(buf, &btif_local_bd_addr, sizeof(bt_bdaddr_t)); 572ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao prop.type = BT_PROPERTY_BDADDR; 573ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao prop.val = (void*)buf; 574ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao prop.len = sizeof(bt_bdaddr_t); 575ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, BT_STATUS_SUCCESS, 1, &prop); 576ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao } 577ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao 578e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bte_main_postload_cfg(); 579e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE) 580e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bte_main_enable_lpm(TRUE); 581e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 582e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* add passing up bd address as well ? */ 583e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 584e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* callback to HAL */ 585e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (status == BTA_SUCCESS) 586e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 58729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren /* initialize a2dp service */ 5882fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren btif_av_init(); 5892fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren 5902fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren /* init rfcomm & l2cap api */ 591b888218fb9061d8ddf41013dba6d0956b3322fd6zzy btif_sock_init(); 59229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 5937105408a110e1fa7bfa7b82637cd704a2c428f68fredc /* init pan */ 5947105408a110e1fa7bfa7b82637cd704a2c428f68fredc btif_pan_init(); 5950872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren 5962fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren /* load did configuration */ 5975edcdde0b51f3d5153990672f55422bbcabc5cecSreenidhi T bte_load_did_conf(BTE_DID_CONF_FILE); 5982fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren 599a858acd87bb1cb8f584b66a50e16b1adcfd6a42fSen-Der Huang#ifdef BTIF_DM_OOB_TEST 600a858acd87bb1cb8f584b66a50e16b1adcfd6a42fSen-Der Huang btif_dm_load_local_oob(); 601a858acd87bb1cb8f584b66a50e16b1adcfd6a42fSen-Der Huang#endif 60229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren /* now fully enabled, update state */ 60329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren btif_core_state = BTIF_CORE_STATE_ENABLED; 60429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 605254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren HAL_CBACK(bt_hal_cbacks, adapter_state_changed_cb, BT_STATE_ON); 606e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 607e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 608e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 6092fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren /* cleanup rfcomm & l2cap api */ 610b888218fb9061d8ddf41013dba6d0956b3322fd6zzy btif_sock_cleanup(); 6112f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 6127105408a110e1fa7bfa7b82637cd704a2c428f68fredc btif_pan_cleanup(); 6137105408a110e1fa7bfa7b82637cd704a2c428f68fredc 61429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren /* we failed to enable, reset state */ 61529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren btif_core_state = BTIF_CORE_STATE_DISABLED; 6162fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren 617254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren HAL_CBACK(bt_hal_cbacks, adapter_state_changed_cb, BT_STATE_OFF); 618e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 619e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 620e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 621e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 622e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 623e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btif_disable_bluetooth 624e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 625e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Inititates shutdown of Bluetooth system. 626e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Any active links will be dropped and device entering 627e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** non connectable/discoverable mode 628254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 629254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns void 630e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 631e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 632e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_disable_bluetooth(void) 633e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 634e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_STATUS status; 635e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 63629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren if (!btif_is_enabled()) 637e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 638e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_ERROR0("btif_disable_bluetooth : not yet enabled"); 63929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren return BT_STATUS_NOT_READY; 640e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 641e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 64229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren BTIF_TRACE_DEBUG0("BTIF DISABLE BLUETOOTH"); 64329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 644cc10fec21ba2bdb9c908509b1667c8c34d0e8c02Ravi Nagarajan btif_dm_on_disable(); 64529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren btif_core_state = BTIF_CORE_STATE_DISABLING; 6462fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren 6472fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren /* cleanup rfcomm & l2cap api */ 648e8070c41e25c6f0d368d7a53c0641524ea4630d2zzy btif_sock_cleanup(); 6492f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 6507105408a110e1fa7bfa7b82637cd704a2c428f68fredc btif_pan_cleanup(); 6517105408a110e1fa7bfa7b82637cd704a2c428f68fredc 652e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = BTA_DisableBluetooth(); 653e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 65454cdfabe7c0ed98732d0641ffe8b19ff7284e7d4zzy btif_config_flush(); 65554cdfabe7c0ed98732d0641ffe8b19ff7284e7d4zzy 656e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (status != BTA_SUCCESS) 657e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 658e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_ERROR1("disable bt failed (%d)", status); 65929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 66029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren /* reset the original state to allow attempting disable again */ 66129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren btif_core_state = BTIF_CORE_STATE_ENABLED; 66229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 663e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BT_STATUS_FAIL; 664e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 665254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren return BT_STATUS_SUCCESS; 666e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 667e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 668e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 669e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 670e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btif_disable_bluetooth_evt 671e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 672e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Event notifying BT disable is now complete. 673254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Terminates main stack tasks and notifies HAL 674254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** user with updated BT state. 675254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 676254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns void 677e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 678e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 679e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 680e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btif_disable_bluetooth_evt(void) 681e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 682e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_DEBUG1("%s", __FUNCTION__); 683e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 6849ab1946281916b06df6cb2e5eb37ad12cd4dce4aYK Jeffrey Chao#if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE) 6859ab1946281916b06df6cb2e5eb37ad12cd4dce4aYK Jeffrey Chao bte_main_enable_lpm(FALSE); 6869ab1946281916b06df6cb2e5eb37ad12cd4dce4aYK Jeffrey Chao#endif 6879ab1946281916b06df6cb2e5eb37ad12cd4dce4aYK Jeffrey Chao 688e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bte_main_disable(); 68929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 69029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren /* update local state */ 69129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren btif_core_state = BTIF_CORE_STATE_DISABLED; 692e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 693e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* callback to HAL */ 694254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren HAL_CBACK(bt_hal_cbacks, adapter_state_changed_cb, BT_STATE_OFF); 695e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 69635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy if (btif_shutdown_pending) 69735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy { 69829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren BTIF_TRACE_DEBUG1("%s: calling btif_shutdown_bluetooth", __FUNCTION__); 69935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy btif_shutdown_bluetooth(); 70035207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy } 701e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 702e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 703e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 704e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 705e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 706e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btif_shutdown_bluetooth 707e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 708e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Finalizes BT scheduler shutdown and terminates BTIF 709e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** task. 710254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 711254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns void 712e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 713e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 714e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 715e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_shutdown_bluetooth(void) 716e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 717e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_DEBUG1("%s", __FUNCTION__); 718e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 71929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren if (btif_is_enabled()) 720e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 721e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_WARNING0("shutdown while still enabled, initiate disable"); 722e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 723e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* shutdown called prior to disabling, initiate disable */ 724e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_disable_bluetooth(); 725e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_shutdown_pending = 1; 72629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren return BT_STATUS_NOT_READY; 727e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 728e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 72935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy btif_shutdown_pending = 0; 730e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 73135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy GKI_destroy_task(BTIF_TASK); 732fe1b7a6c392ef7ccc371e3bf580f2e853d0d6c65Ganesh Ganapathi Batta btif_queue_release(); 73335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy bte_main_shutdown(); 73429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 735a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy btif_dut_mode = 0; 736a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy 73729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren BTIF_TRACE_DEBUG1("%s done", __FUNCTION__); 7385140bed9a19aadca962184ebc9ed823d5d7cb745jechao 739e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BT_STATUS_SUCCESS; 740e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 741e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 7425140bed9a19aadca962184ebc9ed823d5d7cb745jechao 7435140bed9a19aadca962184ebc9ed823d5d7cb745jechao/******************************************************************************* 7445140bed9a19aadca962184ebc9ed823d5d7cb745jechao** 7455140bed9a19aadca962184ebc9ed823d5d7cb745jechao** Function btif_disassociate_evt 7465140bed9a19aadca962184ebc9ed823d5d7cb745jechao** 7475140bed9a19aadca962184ebc9ed823d5d7cb745jechao** Description Event indicating btif_task is going down 7485140bed9a19aadca962184ebc9ed823d5d7cb745jechao** Detach btif_task to JVM 7495140bed9a19aadca962184ebc9ed823d5d7cb745jechao** 7505140bed9a19aadca962184ebc9ed823d5d7cb745jechao** Returns void 7515140bed9a19aadca962184ebc9ed823d5d7cb745jechao** 7525140bed9a19aadca962184ebc9ed823d5d7cb745jechao*******************************************************************************/ 7535140bed9a19aadca962184ebc9ed823d5d7cb745jechao 7545140bed9a19aadca962184ebc9ed823d5d7cb745jechaostatic bt_status_t btif_disassociate_evt(void) 755e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 756e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_DEBUG1("%s: notify DISASSOCIATE_JVM", __FUNCTION__); 757254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 758254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren HAL_CBACK(bt_hal_cbacks, thread_evt_cb, DISASSOCIATE_JVM); 759e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 76035207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy /* shutdown complete, all events notified and we reset HAL callbacks */ 76135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy bt_hal_cbacks = NULL; 76235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy 763e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BT_STATUS_SUCCESS; 764e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 765e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 766a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy/**************************************************************************** 767a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** 768a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** BTIF Test Mode APIs 769a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** 770a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy*****************************************************************************/ 771a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy/******************************************************************************* 772a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** 773a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Function btif_dut_mode_cback 774a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** 775a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Description Callback invoked on completion of vendor specific test mode command 776a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** 777a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Returns None 778a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** 779a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy*******************************************************************************/ 780a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamystatic void btif_dut_mode_cback( tBTM_VSC_CMPL *p ) 781a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy{ 782a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy /* For now nothing to be done. */ 783a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy} 784e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 785a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy/******************************************************************************* 786a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** 787a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Function btif_dut_mode_configure 788a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** 789a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Description Configure Test Mode - 'enable' to 1 puts the device in test mode and 0 exits 790a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** test mode 791a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** 792a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Returns BT_STATUS_SUCCESS on success 793a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** 794a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy*******************************************************************************/ 795a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamybt_status_t btif_dut_mode_configure(uint8_t enable) 796a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy{ 797a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy BTIF_TRACE_DEBUG1("%s", __FUNCTION__); 798a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy 799a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy if (btif_core_state != BTIF_CORE_STATE_ENABLED) { 800a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy BTIF_TRACE_ERROR0("btif_dut_mode_configure : Bluetooth not enabled"); 801a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy return BT_STATUS_NOT_READY; 802a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy } 803a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy 804a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy btif_dut_mode = enable; 805a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy if (enable == 1) { 806a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy BTA_EnableTestMode(); 807a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy } else { 808a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy BTA_DisableTestMode(); 809a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy } 810a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy return BT_STATUS_SUCCESS; 811a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy} 812e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 813a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy/******************************************************************************* 814a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** 815a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Function btif_dut_mode_send 816a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** 817a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Description Sends a HCI Vendor specific command to the controller 818a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** 819a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Returns BT_STATUS_SUCCESS on success 820a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** 821a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy*******************************************************************************/ 822a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamybt_status_t btif_dut_mode_send(uint16_t opcode, uint8_t *buf, uint8_t len) 823a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy{ 824a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy /* TODO: Check that opcode is a vendor command group */ 825a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy BTIF_TRACE_DEBUG1("%s", __FUNCTION__); 826a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy if (!btif_is_dut_mode()) { 827a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy BTIF_TRACE_ERROR0("Bluedroid HAL needs to be init with test_mode set to 1."); 828a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy return BT_STATUS_FAIL; 829a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy } 830a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy BTM_VendorSpecificCommand(opcode, len, buf, btif_dut_mode_cback); 831a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy return BT_STATUS_SUCCESS; 832a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy} 833e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/***************************************************************************** 834e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 835e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** btif api adapter property functions 836e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 837e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*****************************************************************************/ 838e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 839e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic bt_status_t btif_in_get_adapter_properties(void) 840e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 841e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_property_t properties[6]; 842e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach uint32_t num_props; 843e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 844e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_bdaddr_t addr; 845e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_bdname_t name; 846e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_scan_mode_t mode; 847e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach uint32_t disc_timeout; 848e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_bdaddr_t bonded_devices[BTM_SEC_MAX_DEVICE_RECORDS]; 849e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_uuid_t local_uuids[BT_MAX_NUM_UUIDS]; 850e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_props = 0; 851e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 852e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* BD_ADDR */ 853e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_BDADDR, 854e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sizeof(addr), &addr); 855e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_get_adapter_property(&properties[num_props]); 856e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_props++; 857e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 858e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* BD_NAME */ 859e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_BDNAME, 860e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sizeof(name), &name); 861e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_get_adapter_property(&properties[num_props]); 862e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_props++; 863e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 864e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* SCAN_MODE */ 865e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_ADAPTER_SCAN_MODE, 866e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sizeof(mode), &mode); 867e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_get_adapter_property(&properties[num_props]); 868e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_props++; 869e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 870e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* DISC_TIMEOUT */ 871e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT, 872e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sizeof(disc_timeout), &disc_timeout); 873e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_get_adapter_property(&properties[num_props]); 874e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_props++; 875e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 876e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* BONDED_DEVICES */ 877e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_ADAPTER_BONDED_DEVICES, 878e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sizeof(bonded_devices), bonded_devices); 879e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_get_adapter_property(&properties[num_props]); 880e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_props++; 881e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 882e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* LOCAL UUIDs */ 883e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_UUIDS, 884e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sizeof(local_uuids), local_uuids); 885e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_get_adapter_property(&properties[num_props]); 886e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_props++; 887e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 888254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, 889e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BT_STATUS_SUCCESS, num_props, properties); 890e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 891e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BT_STATUS_SUCCESS; 892e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 893e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 894e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic bt_status_t btif_in_get_remote_device_properties(bt_bdaddr_t *bd_addr) 895e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 896e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_property_t remote_properties[8]; 897e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach uint32_t num_props = 0; 898e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 899e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_bdname_t name, alias; 900e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach uint32_t cod, devtype; 901e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_uuid_t remote_uuids[BT_MAX_NUM_UUIDS]; 902e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 903e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(remote_properties, 0, sizeof(remote_properties)); 904e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], BT_PROPERTY_BDNAME, 905e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sizeof(name), &name); 906e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_get_remote_device_property(bd_addr, 907e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &remote_properties[num_props]); 908e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_props++; 909e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 910e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], BT_PROPERTY_REMOTE_FRIENDLY_NAME, 911e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sizeof(alias), &alias); 912e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_get_remote_device_property(bd_addr, 913e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &remote_properties[num_props]); 914e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_props++; 915e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 916e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], BT_PROPERTY_CLASS_OF_DEVICE, 917e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sizeof(cod), &cod); 918e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_get_remote_device_property(bd_addr, 919e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &remote_properties[num_props]); 920e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_props++; 921e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 922e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], BT_PROPERTY_TYPE_OF_DEVICE, 923e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sizeof(devtype), &devtype); 924e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_get_remote_device_property(bd_addr, 925e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &remote_properties[num_props]); 926e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_props++; 927e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 928e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], BT_PROPERTY_UUIDS, 929e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sizeof(remote_uuids), remote_uuids); 930e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_get_remote_device_property(bd_addr, 931e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &remote_properties[num_props]); 932e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_props++; 933e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 934254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb, 935e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BT_STATUS_SUCCESS, bd_addr, num_props, remote_properties); 936e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 937e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BT_STATUS_SUCCESS; 938e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 939e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 940e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 941e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 942e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 943e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function execute_storage_request 944e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 945e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Executes adapter storage request in BTIF context 946e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 947254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns bt_status_t 948e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 949e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 950e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 951e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void execute_storage_request(UINT16 event, char *p_param) 952e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 953e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach uint8_t is_local; 954254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren int num_entries = 0; 955e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_status_t status = BT_STATUS_SUCCESS; 956254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 957e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_EVENT1("execute storage request event : %d", event); 958e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 959e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach switch(event) 960e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 961e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTIF_CORE_STORAGE_ADAPTER_WRITE: 962e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 963e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_req_t *p_req = (btif_storage_req_t*)p_param; 964e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_property_t *p_prop = &(p_req->write_req.prop); 965e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_EVENT3("type: %d, len %d, 0x%x", p_prop->type, 966e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_prop->len, p_prop->val); 967e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 968e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = btif_storage_set_adapter_property(p_prop); 969254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, status, 1, p_prop); 970e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } break; 971e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 972e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTIF_CORE_STORAGE_ADAPTER_READ: 973e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 974e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_req_t *p_req = (btif_storage_req_t*)p_param; 975e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach char buf[512]; 976e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_property_t prop; 977e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach prop.type = p_req->read_req.type; 978e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach prop.val = (void*)buf; 979e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach prop.len = sizeof(buf); 980e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = btif_storage_get_adapter_property(&prop); 981254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, status, 1, &prop); 982e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } break; 983254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 984e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTIF_CORE_STORAGE_ADAPTER_READ_ALL: 985e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 986e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = btif_in_get_adapter_properties(); 987e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } break; 988e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 989e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTIF_CORE_STORAGE_NOTIFY_STATUS: 990e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 991254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, status, 0, NULL); 992e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } break; 993e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 994e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach default: 995e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_ERROR2("%s invalid event id (%d)", __FUNCTION__, event); 996e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 997e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 998e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 999e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1000e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void execute_storage_remote_request(UINT16 event, char *p_param) 1001e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1002e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_status_t status = BT_STATUS_FAIL; 1003e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_property_t prop; 1004e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1005e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_EVENT1("execute storage remote request event : %d", event); 1006e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1007e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach switch (event) 1008e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1009e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTIF_CORE_STORAGE_REMOTE_READ: 1010e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1011e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach char buf[1024]; 1012e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_req_t *p_req = (btif_storage_req_t*)p_param; 1013e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach prop.type = p_req->read_req.type; 1014e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach prop.val = (void*) buf; 1015e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach prop.len = sizeof(buf); 1016e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1017e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = btif_storage_get_remote_device_property(&(p_req->read_req.bd_addr), 1018e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &prop); 1019254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb, 1020e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status, &(p_req->read_req.bd_addr), 1, &prop); 1021e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach }break; 1022e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTIF_CORE_STORAGE_REMOTE_WRITE: 1023e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1024e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_req_t *p_req = (btif_storage_req_t*)p_param; 1025e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = btif_storage_set_remote_device_property(&(p_req->write_req.bd_addr), 1026e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &(p_req->write_req.prop)); 1027e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach }break; 1028e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTIF_CORE_STORAGE_REMOTE_READ_ALL: 1029e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1030e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_req_t *p_req = (btif_storage_req_t*)p_param; 1031e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_in_get_remote_device_properties(&p_req->read_req.bd_addr); 1032e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach }break; 1033e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1034e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1035e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1036e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btif_adapter_properties_evt(bt_status_t status, uint32_t num_props, 1037e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_property_t *p_props) 1038e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1039254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, 1040e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status, num_props, p_props); 1041e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1042e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1043e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btif_remote_properties_evt(bt_status_t status, bt_bdaddr_t *remote_addr, 1044e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach uint32_t num_props, bt_property_t *p_props) 1045e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1046254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb, 1047e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status, remote_addr, num_props, p_props); 1048e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1049e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1050e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1051e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1052e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btif_in_storage_request_copy_cb 1053e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1054e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Switch context callback function to perform the deep copy for 1055e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** both the adapter and remote_device property API 1056e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1057e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None 1058e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1059e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1060e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void btif_in_storage_request_copy_cb(UINT16 event, 1061e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach char *p_new_buf, char *p_old_buf) 1062e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1063e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_req_t *new_req = (btif_storage_req_t*)p_new_buf; 1064e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_req_t *old_req = (btif_storage_req_t*)p_old_buf; 1065e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1066e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_EVENT1("%s", __FUNCTION__); 1067e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach switch (event) 1068e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1069e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTIF_CORE_STORAGE_REMOTE_WRITE: 1070e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTIF_CORE_STORAGE_ADAPTER_WRITE: 1071e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1072e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(new_req->write_req.bd_addr.address, old_req->write_req.bd_addr.address); 1073e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Copy the member variables one at a time */ 1074e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach new_req->write_req.prop.type = old_req->write_req.prop.type; 1075e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach new_req->write_req.prop.len = old_req->write_req.prop.len; 1076e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1077e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach new_req->write_req.prop.val = (UINT8 *)(p_new_buf + sizeof(btif_storage_req_t)); 1078e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(new_req->write_req.prop.val, old_req->write_req.prop.val, 1079e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach old_req->write_req.prop.len); 1080e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach }break; 1081e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1082e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1083e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1084e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1085e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1086e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btif_get_adapter_properties 1087e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1088e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Fetch all available properties (local & remote) 1089e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1090254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns bt_status_t 1091e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1092e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1093e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1094e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_get_adapter_properties(void) 1095e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1096e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_EVENT1("%s", __FUNCTION__); 1097e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 109829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren if (!btif_is_enabled()) 109929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren return BT_STATUS_NOT_READY; 1100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return btif_transfer_context(execute_storage_request, 1102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_CORE_STORAGE_ADAPTER_READ_ALL, 1103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach NULL, 0, NULL); 1104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btif_get_adapter_property 1109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Fetches property value from local cache 1111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1112254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns bt_status_t 1113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_get_adapter_property(bt_property_type_t type) 1117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_req_t req; 1119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_EVENT2("%s %d", __FUNCTION__, type); 1121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 112235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy /* Allow get_adapter_property only for BDADDR and BDNAME if BT is disabled */ 112329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren if (!btif_is_enabled() && (type != BT_PROPERTY_BDADDR) && (type != BT_PROPERTY_BDNAME)) 112429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren return BT_STATUS_NOT_READY; 1125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&(req.read_req.bd_addr), 0, sizeof(bt_bdaddr_t)); 1127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach req.read_req.type = type; 1128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return btif_transfer_context(execute_storage_request, 1130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_CORE_STORAGE_ADAPTER_READ, 1131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (char*)&req, sizeof(btif_storage_req_t), NULL); 1132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btif_set_adapter_property 1137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1138254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Description Updates core stack with property value and stores it in 1139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** local cache 1140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1141254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns bt_status_t 1142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_set_adapter_property(const bt_property_t *property) 1146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_req_t req; 1148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_status_t status = BT_STATUS_SUCCESS; 1149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach int storage_req_id = BTIF_CORE_STORAGE_NOTIFY_STATUS; /* default */ 1150be7063ce21ac1e2f67d489c29a1e979dc3d8f075Ganesh Ganapathi Batta char bd_name[BTM_MAX_LOC_BD_NAME_LEN +1]; 1151be7063ce21ac1e2f67d489c29a1e979dc3d8f075Ganesh Ganapathi Batta UINT16 name_len = 0; 1152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_EVENT3("btif_set_adapter_property type: %d, len %d, 0x%x", 1154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach property->type, property->len, property->val); 1155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 115629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren if (!btif_is_enabled()) 115729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren return BT_STATUS_NOT_READY; 1158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach switch(property->type) 1160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BT_PROPERTY_BDNAME: 1162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1163be7063ce21ac1e2f67d489c29a1e979dc3d8f075Ganesh Ganapathi Batta name_len = property->len > BTM_MAX_LOC_BD_NAME_LEN ? BTM_MAX_LOC_BD_NAME_LEN: 1164be7063ce21ac1e2f67d489c29a1e979dc3d8f075Ganesh Ganapathi Batta property->len; 1165be7063ce21ac1e2f67d489c29a1e979dc3d8f075Ganesh Ganapathi Batta memcpy(bd_name,property->val, name_len); 1166be7063ce21ac1e2f67d489c29a1e979dc3d8f075Ganesh Ganapathi Batta bd_name[name_len] = '\0'; 1167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1168be7063ce21ac1e2f67d489c29a1e979dc3d8f075Ganesh Ganapathi Batta BTIF_TRACE_EVENT1("set property name : %s", (char *)bd_name); 1169be7063ce21ac1e2f67d489c29a1e979dc3d8f075Ganesh Ganapathi Batta 1170be7063ce21ac1e2f67d489c29a1e979dc3d8f075Ganesh Ganapathi Batta BTA_DmSetDeviceName((char *)bd_name); 1171254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 1172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach storage_req_id = BTIF_CORE_STORAGE_ADAPTER_WRITE; 1173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 1175254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 1176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BT_PROPERTY_ADAPTER_SCAN_MODE: 1177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_scan_mode_t mode = *(bt_scan_mode_t*)property->val; 1179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_DISC disc_mode; 1180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_CONN conn_mode; 1181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach switch(mode) 1183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BT_SCAN_MODE_NONE: 1185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach disc_mode = BTA_DM_NON_DISC; 1186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach conn_mode = BTA_DM_NON_CONN; 1187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 1188254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 1189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BT_SCAN_MODE_CONNECTABLE: 1190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach disc_mode = BTA_DM_NON_DISC; 1191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach conn_mode = BTA_DM_CONN; 1192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 1193254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 1194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE: 1195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach disc_mode = BTA_DM_GENERAL_DISC; 1196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach conn_mode = BTA_DM_CONN; 1197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 1198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach default: 1200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_ERROR1("invalid scan mode (0x%x)", mode); 1201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BT_STATUS_PARM_INVALID; 1202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1203254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 1204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_TRACE_EVENT1("set property scan mode : %x", mode); 1205254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 1206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_DmSetVisibility(disc_mode, conn_mode, BTA_DM_IGNORE, BTA_DM_IGNORE); 1207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach storage_req_id = BTIF_CORE_STORAGE_ADAPTER_WRITE; 1209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 1211a379d445a64ce499ff8f32ffa3db49e570da2945Srikanth Uppala case BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT: 1212a379d445a64ce499ff8f32ffa3db49e570da2945Srikanth Uppala { 12132f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren /* Nothing to do beside store the value in NV. Java 12142f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren will change the SCAN_MODE property after setting timeout, 12152f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren if required */ 1216a379d445a64ce499ff8f32ffa3db49e570da2945Srikanth Uppala storage_req_id = BTIF_CORE_STORAGE_ADAPTER_WRITE; 1217a379d445a64ce499ff8f32ffa3db49e570da2945Srikanth Uppala } 1218a379d445a64ce499ff8f32ffa3db49e570da2945Srikanth Uppala break; 1219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BT_PROPERTY_BDADDR: 1220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BT_PROPERTY_UUIDS: 1221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BT_PROPERTY_ADAPTER_BONDED_DEVICES: 1222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BT_PROPERTY_REMOTE_FRIENDLY_NAME: 1223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* no write support through HAL, these properties are only populated from BTA events */ 1224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = BT_STATUS_FAIL; 1225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 1226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach default: 1227254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren BTIF_TRACE_ERROR1("btif_get_adapter_property : invalid type %d", 1228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach property->type); 1229254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren status = BT_STATUS_FAIL; 1230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 1231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (storage_req_id != BTIF_CORE_STORAGE_NO_ACTION) 1234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach int btif_status; 1236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* pass on to storage for updating local database */ 1237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&(req.write_req.bd_addr), 0, sizeof(bt_bdaddr_t)); 1239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(&(req.write_req.prop), property, sizeof(bt_property_t)); 1240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return btif_transfer_context(execute_storage_request, 1242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach storage_req_id, 1243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (char*)&req, 1244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sizeof(btif_storage_req_t)+property->len, 1245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_in_storage_request_copy_cb); 1246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return status; 1249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btif_get_remote_device_property 1255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Fetches the remote device property from the NVRAM 1257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns bt_status_t 1259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_get_remote_device_property(bt_bdaddr_t *remote_addr, 1262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_property_type_t type) 1263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_req_t req; 1265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 126629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren if (!btif_is_enabled()) 126729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren return BT_STATUS_NOT_READY; 1268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(&(req.read_req.bd_addr), remote_addr, sizeof(bt_bdaddr_t)); 1270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach req.read_req.type = type; 1271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return btif_transfer_context(execute_storage_remote_request, 1272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_CORE_STORAGE_REMOTE_READ, 1273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (char*)&req, sizeof(btif_storage_req_t), 1274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach NULL); 1275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btif_get_remote_device_properties 1280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Fetches all the remote device properties from NVRAM 1282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns bt_status_t 1284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_get_remote_device_properties(bt_bdaddr_t *remote_addr) 1287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_req_t req; 1289254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 129029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren if (!btif_is_enabled()) 129129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren return BT_STATUS_NOT_READY; 1292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(&(req.read_req.bd_addr), remote_addr, sizeof(bt_bdaddr_t)); 1294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return btif_transfer_context(execute_storage_remote_request, 1295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_CORE_STORAGE_REMOTE_READ_ALL, 1296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (char*)&req, sizeof(btif_storage_req_t), 1297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach NULL); 1298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btif_set_remote_device_property 1303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Writes the remote device property to NVRAM. 1305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Currently, BT_PROPERTY_REMOTE_FRIENDLY_NAME is the only 1306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** remote device property that can be set 1307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns bt_status_t 1309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_set_remote_device_property(bt_bdaddr_t *remote_addr, 1312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach const bt_property_t *property) 1313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_storage_req_t req; 1315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 131629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren if (!btif_is_enabled()) 131729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren return BT_STATUS_NOT_READY; 1318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(&(req.write_req.bd_addr), remote_addr, sizeof(bt_bdaddr_t)); 1320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(&(req.write_req.prop), property, sizeof(bt_property_t)); 1321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return btif_transfer_context(execute_storage_remote_request, 1323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTIF_CORE_STORAGE_REMOTE_WRITE, 1324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (char*)&req, 1325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sizeof(btif_storage_req_t)+property->len, 1326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btif_in_storage_request_copy_cb); 1327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btif_get_remote_service_record 1333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Looks up the service matching uuid on the remote device 1335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** and fetches the SCN and service_name if the UUID is found 1336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns bt_status_t 1338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1340254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenbt_status_t btif_get_remote_service_record(bt_bdaddr_t *remote_addr, 1341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bt_uuid_t *uuid) 1342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 134329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren if (!btif_is_enabled()) 134429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren return BT_STATUS_NOT_READY; 1345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return btif_dm_get_remote_service_record(remote_addr, uuid); 1347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 134929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 135029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren/******************************************************************************* 135129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** 135229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** Function btif_get_enabled_services_mask 135329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** 135429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** Description Fetches currently enabled services 135529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** 135629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** Returns tBTA_SERVICE_MASK 135729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** 135829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren*******************************************************************************/ 135929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 1360b23905722d8a1c714d66aaee2da5712694596426Kausik SinnaswamytBTA_SERVICE_MASK btif_get_enabled_services_mask(void) 1361b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy{ 1362b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy return btif_enabled_services; 1363b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy} 1364b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy 1365b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy/******************************************************************************* 1366b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** 1367b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** Function btif_enable_service 1368b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** 1369b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** Description Enables the service 'service_ID' to the service_mask. 1370b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** Upon BT enable, BTIF core shall invoke the BTA APIs to 1371b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** enable the profiles 1372b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** 1373b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** Returns bt_status_t 1374b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** 1375b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy*******************************************************************************/ 1376b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamybt_status_t btif_enable_service(tBTA_SERVICE_ID service_id) 1377b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy{ 137829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren tBTA_SERVICE_ID *p_id = &service_id; 137929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 138029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren /* If BT is enabled, we need to switch to BTIF context and trigger the 138129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren * enable for that profile 138229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren * 138329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren * Otherwise, we just set the flag. On BT_Enable, the DM will trigger 138429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren * enable for the profiles that have been enabled */ 138529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 138629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren btif_enabled_services |= (1 << service_id); 138729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 138829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren BTIF_TRACE_ERROR2("%s: current services:0x%x", __FUNCTION__, btif_enabled_services); 138929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 139029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren if (btif_is_enabled()) 139129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren { 139229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren btif_transfer_context(btif_dm_execute_service_request, 139329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren BTIF_DM_ENABLE_SERVICE, 139429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren (char*)p_id, sizeof(tBTA_SERVICE_ID), NULL); 139529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren } 139629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 139729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren return BT_STATUS_SUCCESS; 1398b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy} 1399b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy/******************************************************************************* 1400b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** 1401b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** Function btif_disable_service 1402b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** 1403b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** Description Disables the service 'service_ID' to the service_mask. 1404b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** Upon BT disable, BTIF core shall invoke the BTA APIs to 1405b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** disable the profiles 1406b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** 1407b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** Returns bt_status_t 1408b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** 1409b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy*******************************************************************************/ 1410b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamybt_status_t btif_disable_service(tBTA_SERVICE_ID service_id) 1411b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy{ 141229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren tBTA_SERVICE_ID *p_id = &service_id; 141329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 141429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren /* If BT is enabled, we need to switch to BTIF context and trigger the 141529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren * disable for that profile so that the appropriate uuid_property_changed will 141629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren * be triggerred. Otherwise, we just need to clear the service_id in the mask 141729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren */ 141829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 141929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren btif_enabled_services &= (tBTA_SERVICE_MASK)(~(1<<service_id)); 142029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 142129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren BTIF_TRACE_ERROR2("%s: Current Services:0x%x", __FUNCTION__, btif_enabled_services); 142229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 142329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren if (btif_is_enabled()) 142429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren { 142529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren btif_transfer_context(btif_dm_execute_service_request, 142629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren BTIF_DM_DISABLE_SERVICE, 142729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren (char*)p_id, sizeof(tBTA_SERVICE_ID), NULL); 142829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren } 142929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 143029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren return BT_STATUS_SUCCESS; 1431b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy} 1432