15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2009-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Filename:      bluetooth.c
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Description:   Bluetooth HAL implementation
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***********************************************************************************/
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h>
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <unistd.h>
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <hardware/bluetooth.h>
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <hardware/bt_hf.h>
3341d4a266ceca77bb09ab1bf5c04c30d15f3ded3aHemant Gupta#include <hardware/bt_hf_client.h>
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <hardware/bt_av.h>
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <hardware/bt_sock.h>
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <hardware/bt_hh.h>
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <hardware/bt_hl.h>
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <hardware/bt_pan.h>
392dc999935d4c69ae31ea93d9014165965dd373d6Hemant Gupta#include <hardware/bt_mce.h>
40ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include <hardware/bt_gatt.h>
419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#include <hardware/bt_rc.h>
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define LOG_NDDEBUG 0
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define LOG_TAG "bluedroid"
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_api.h"
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_utils.h"
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Constants & Macros
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define is_profile(profile, str) ((strlen(str) == strlen(profile)) && strncmp((const char *)profile, str, strlen(str)) == 0)
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Local type definitions
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Static variables
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectbt_callbacks_t *bt_hal_cbacks = NULL;
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6510aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati/** Operating System specific callouts for resource management */
6610aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavatibt_os_callouts_t *bt_os_callouts = NULL;
6710aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Static functions
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Externs
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* list all extended interfaces here */
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* handsfree profile */
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern bthf_interface_t *btif_hf_get_interface();
8041d4a266ceca77bb09ab1bf5c04c30d15f3ded3aHemant Gupta/* handsfree profile - client */
8141d4a266ceca77bb09ab1bf5c04c30d15f3ded3aHemant Guptaextern bthf_client_interface_t *btif_hf_client_get_interface();
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* advanced audio profile */
833e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodextern btav_interface_t *btif_av_get_src_interface();
843e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodextern btav_interface_t *btif_av_get_sink_interface();
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*rfc l2cap*/
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern btsock_interface_t *btif_sock_get_interface();
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* hid host profile */
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern bthh_interface_t *btif_hh_get_interface();
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* health device profile */
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern bthl_interface_t *btif_hl_get_interface();
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*pan*/
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern btpan_interface_t *btif_pan_get_interface();
932dc999935d4c69ae31ea93d9014165965dd373d6Hemant Gupta/*map client*/
942dc999935d4c69ae31ea93d9014165965dd373d6Hemant Guptaextern btmce_interface_t *btif_mce_get_interface();
95bf9a8aa26988aedbc161d75f2688641ce59dc001Mike J. Chen#if BLE_INCLUDED == TRUE
96ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/* gatt */
97ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battaextern btgatt_interface_t *btif_gatt_get_interface();
98bf9a8aa26988aedbc161d75f2688641ce59dc001Mike J. Chen#endif
994ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood/* avrc target */
1009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanextern btrc_interface_t *btif_rc_get_interface();
1014ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood/* avrc controller */
1024ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwoodextern btrc_interface_t *btif_rc_ctrl_get_interface();
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Functions
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic uint8_t interface_ready(void)
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* add checks here that would prevent API calls other than init to be executed */
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bt_hal_cbacks == NULL)
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**   BLUETOOTH HAL INTERFACE FUNCTIONS
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int init(bt_callbacks_t* callbacks )
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ALOGI("init");
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == TRUE)
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_DONE;
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* store reference to user callbacks */
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bt_hal_cbacks = callbacks;
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* add checks for individual callbacks ? */
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bt_utils_init();
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* init btif */
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_init_bluetooth();
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return BT_STATUS_SUCCESS;
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int enable( void )
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ALOGI("enable");
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return btif_enable_bluetooth();
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int disable(void)
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return btif_disable_bluetooth();
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void cleanup( void )
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_shutdown_bluetooth();
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* hal callbacks reset upon shutdown complete callback */
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int get_adapter_properties(void)
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return btif_get_adapter_properties();
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int get_adapter_property(bt_property_type_t type)
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return btif_get_adapter_property(type);
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int set_adapter_property(const bt_property_t *property)
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return btif_set_adapter_property(property);
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint get_remote_device_properties(bt_bdaddr_t *remote_addr)
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return btif_get_remote_device_properties(remote_addr);
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint get_remote_device_property(bt_bdaddr_t *remote_addr, bt_property_type_t type)
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return btif_get_remote_device_property(remote_addr, type);
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint set_remote_device_property(bt_bdaddr_t *remote_addr, const bt_property_t *property)
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return btif_set_remote_device_property(remote_addr, property);
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint get_remote_service_record(bt_bdaddr_t *remote_addr, bt_uuid_t *uuid)
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return btif_get_remote_service_record(remote_addr, uuid);
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint get_remote_services(bt_bdaddr_t *remote_addr)
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return btif_dm_get_remote_services(remote_addr);
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int start_discovery(void)
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return btif_dm_start_discovery();
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int cancel_discovery(void)
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return btif_dm_cancel_discovery();
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
268b0daa5d79d4e2950701fb9a5f76a306e1da42de0Andre Eisenbachstatic int create_bond(const bt_bdaddr_t *bd_addr, int transport)
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
274b0daa5d79d4e2950701fb9a5f76a306e1da42de0Andre Eisenbach    return btif_dm_create_bond(bd_addr, transport);
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int cancel_bond(const bt_bdaddr_t *bd_addr)
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return btif_dm_cancel_bond(bd_addr);
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int remove_bond(const bt_bdaddr_t *bd_addr)
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return btif_dm_remove_bond(bd_addr);
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2955c0b052090a57b3926669c23349b0f0db68853f8Andre Eisenbachstatic int get_connection_state(const bt_bdaddr_t *bd_addr)
2965c0b052090a57b3926669c23349b0f0db68853f8Andre Eisenbach{
2975c0b052090a57b3926669c23349b0f0db68853f8Andre Eisenbach    /* sanity check */
2985c0b052090a57b3926669c23349b0f0db68853f8Andre Eisenbach    if (interface_ready() == FALSE)
2995c0b052090a57b3926669c23349b0f0db68853f8Andre Eisenbach        return 0;
3005c0b052090a57b3926669c23349b0f0db68853f8Andre Eisenbach
3015c0b052090a57b3926669c23349b0f0db68853f8Andre Eisenbach    return btif_dm_get_connection_state(bd_addr);
3025c0b052090a57b3926669c23349b0f0db68853f8Andre Eisenbach}
3035c0b052090a57b3926669c23349b0f0db68853f8Andre Eisenbach
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int pin_reply(const bt_bdaddr_t *bd_addr, uint8_t accept,
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 uint8_t pin_len, bt_pin_code_t *pin_code)
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return btif_dm_pin_reply(bd_addr, accept, pin_len, pin_code);
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int ssp_reply(const bt_bdaddr_t *bd_addr, bt_ssp_variant_t variant,
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       uint8_t accept, uint32_t passkey)
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return btif_dm_ssp_reply(bd_addr, variant, accept, passkey);
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
324e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Callojistatic int read_energy_info()
325e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji{
326e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji    if (interface_ready() == FALSE)
327e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji        return BT_STATUS_NOT_READY;
328e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji    btif_dm_read_energy_info();
329e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji    return BT_STATUS_SUCCESS;
330e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji}
331e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const void* get_profile_interface (const char *profile_id)
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ALOGI("get_profile_interface %s", profile_id);
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return NULL;
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* check for supported profile interfaces */
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_profile(profile_id, BT_PROFILE_HANDSFREE_ID))
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return btif_hf_get_interface();
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34441d4a266ceca77bb09ab1bf5c04c30d15f3ded3aHemant Gupta    if (is_profile(profile_id, BT_PROFILE_HANDSFREE_CLIENT_ID))
34541d4a266ceca77bb09ab1bf5c04c30d15f3ded3aHemant Gupta        return btif_hf_client_get_interface();
34641d4a266ceca77bb09ab1bf5c04c30d15f3ded3aHemant Gupta
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_profile(profile_id, BT_PROFILE_SOCKETS_ID))
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return btif_sock_get_interface();
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_profile(profile_id, BT_PROFILE_PAN_ID))
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return btif_pan_get_interface();
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_profile(profile_id, BT_PROFILE_ADVANCED_AUDIO_ID))
3543e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood        return btif_av_get_src_interface();
3553e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
3563e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    if (is_profile(profile_id, BT_PROFILE_ADVANCED_AUDIO_SINK_ID))
3573e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood        return btif_av_get_sink_interface();
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_profile(profile_id, BT_PROFILE_HIDHOST_ID))
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return btif_hh_get_interface();
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_profile(profile_id, BT_PROFILE_HEALTH_ID))
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return btif_hl_get_interface();
3649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
3652dc999935d4c69ae31ea93d9014165965dd373d6Hemant Gupta    if (is_profile(profile_id, BT_PROFILE_MAP_CLIENT_ID))
3662dc999935d4c69ae31ea93d9014165965dd373d6Hemant Gupta        return btif_mce_get_interface();
3672dc999935d4c69ae31ea93d9014165965dd373d6Hemant Gupta
3682dc999935d4c69ae31ea93d9014165965dd373d6Hemant Gupta#if ( BTA_GATT_INCLUDED == TRUE && BLE_INCLUDED == TRUE)
369ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (is_profile(profile_id, BT_PROFILE_GATT_ID))
370ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return btif_gatt_get_interface();
371fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie#endif
3729adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
3739adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (is_profile(profile_id, BT_PROFILE_AV_RC_ID))
3749adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return btif_rc_get_interface();
3759adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
3764ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    if (is_profile(profile_id, BT_PROFILE_AV_RC_CTRL_ID))
3774ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        return btif_rc_ctrl_get_interface();
3784ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return NULL;
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint dut_mode_configure(uint8_t enable)
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ALOGI("dut_mode_configure");
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return btif_dut_mode_configure(enable);
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint dut_mode_send(uint16_t opcode, uint8_t* buf, uint8_t len)
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ALOGI("dut_mode_send");
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (interface_ready() == FALSE)
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BT_STATUS_NOT_READY;
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return btif_dut_mode_send(opcode, buf, len);
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
403fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie
404fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie#if BLE_INCLUDED == TRUE
405ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battaint le_test_mode(uint16_t opcode, uint8_t* buf, uint8_t len)
406ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
407ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    ALOGI("le_test_mode");
408ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
409ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* sanity check */
410ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (interface_ready() == FALSE)
411ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return BT_STATUS_NOT_READY;
412ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
413ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return btif_le_test_mode(opcode, buf, len);
414ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
415fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie#endif
416ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
417bad70b1d0071ee9b16a029ff145e8e53038571ffZhihai Xuint config_hci_snoop_log(uint8_t enable)
418bad70b1d0071ee9b16a029ff145e8e53038571ffZhihai Xu{
419bad70b1d0071ee9b16a029ff145e8e53038571ffZhihai Xu    ALOGI("config_hci_snoop_log");
420bad70b1d0071ee9b16a029ff145e8e53038571ffZhihai Xu
421bad70b1d0071ee9b16a029ff145e8e53038571ffZhihai Xu    /* sanity check */
422bad70b1d0071ee9b16a029ff145e8e53038571ffZhihai Xu    if (interface_ready() == FALSE)
423bad70b1d0071ee9b16a029ff145e8e53038571ffZhihai Xu        return BT_STATUS_NOT_READY;
424bad70b1d0071ee9b16a029ff145e8e53038571ffZhihai Xu
425bad70b1d0071ee9b16a029ff145e8e53038571ffZhihai Xu    return btif_config_hci_snoop_log(enable);
426bad70b1d0071ee9b16a029ff145e8e53038571ffZhihai Xu}
427bad70b1d0071ee9b16a029ff145e8e53038571ffZhihai Xu
42810aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavatistatic int set_os_callouts(bt_os_callouts_t *callouts) {
42910aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati    bt_os_callouts = callouts;
43010aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati    return BT_STATUS_SUCCESS;
43110aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati}
43210aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const bt_interface_t bluetoothInterface = {
434ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    sizeof(bluetoothInterface),
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    init,
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    enable,
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    disable,
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cleanup,
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    get_adapter_properties,
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    get_adapter_property,
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    set_adapter_property,
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    get_remote_device_properties,
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    get_remote_device_property,
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    set_remote_device_property,
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    get_remote_service_record,
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    get_remote_services,
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    start_discovery,
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cancel_discovery,
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    create_bond,
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    remove_bond,
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cancel_bond,
4525c0b052090a57b3926669c23349b0f0db68853f8Andre Eisenbach    get_connection_state,
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pin_reply,
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ssp_reply,
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    get_profile_interface,
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dut_mode_configure,
457ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    dut_mode_send,
458fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie#if BLE_INCLUDED == TRUE
459bad70b1d0071ee9b16a029ff145e8e53038571ffZhihai Xu    le_test_mode,
460fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie#else
461bad70b1d0071ee9b16a029ff145e8e53038571ffZhihai Xu    NULL,
462fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie#endif
46310aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati    config_hci_snoop_log,
46410aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati    set_os_callouts,
465e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji    read_energy_info,
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst bt_interface_t* bluetooth__get_bluetooth_interface ()
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* fixme -- add property to disable bt interface ? */
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return &bluetoothInterface;
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int close_bluetooth_stack(struct hw_device_t* device)
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4775cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(device);
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cleanup();
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return 0;
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int open_bluetooth_stack (const struct hw_module_t* module, char const* name,
4835cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen                                 struct hw_device_t** abstraction)
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4855cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(name);
4865cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bluetooth_device_t *stack = malloc(sizeof(bluetooth_device_t) );
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(stack, 0, sizeof(bluetooth_device_t) );
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    stack->common.tag = HARDWARE_DEVICE_TAG;
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    stack->common.version = 0;
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    stack->common.module = (struct hw_module_t*)module;
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    stack->common.close = close_bluetooth_stack;
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    stack->get_bluetooth_interface = bluetooth__get_bluetooth_interface;
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *abstraction = (struct hw_device_t*)stack;
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return 0;
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic struct hw_module_methods_t bt_stack_module_methods = {
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    .open = open_bluetooth_stack,
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstruct hw_module_t HAL_MODULE_INFO_SYM = {
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    .tag = HARDWARE_MODULE_TAG,
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    .version_major = 1,
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    .version_minor = 0,
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    .id = BT_HARDWARE_MODULE_ID,
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    .name = "Bluetooth Stack",
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    .author = "The Android Open Source Project",
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    .methods = &bt_stack_module_methods
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
513