1ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/****************************************************************************** 2ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * 3ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * Copyright (C) 2009-2012 Broadcom Corporation 4ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * 5ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 6ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * you may not use this file except in compliance with the License. 7ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * You may obtain a copy of the License at: 8ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * 9ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 10ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * 11ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * Unless required by applicable law or agreed to in writing, software 12ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 13ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * See the License for the specific language governing permissions and 15ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * limitations under the License. 16ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * 17ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ******************************************************************************/ 18ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 19ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/****************************************************************************** 20ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * 21ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * Filename: bt_vendor_brcm.c 22ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * 23ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * Description: Broadcom vendor specific library implementation 24ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * 25ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ******************************************************************************/ 26ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 27ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define LOG_TAG "bt_vendor" 28ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 29ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include <utils/Log.h> 30ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include "bt_vendor_brcm.h" 31ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include "upio.h" 32ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include "userial_vendor.h" 33ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 34ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#ifndef BTVND_DBG 35ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define BTVND_DBG FALSE 36ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif 37ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 38ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (BTVND_DBG == TRUE) 39ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define BTVNDDBG(param, ...) {ALOGD(param, ## __VA_ARGS__);} 40ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#else 41ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define BTVNDDBG(param, ...) {} 42ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif 43ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 44ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/****************************************************************************** 45ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Externs 46ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/ 47ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 48ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid hw_config_start(void); 49ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleuint8_t hw_lpm_enable(uint8_t turn_on); 50ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleuint32_t hw_lpm_get_idle_timeout(void); 51ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid hw_lpm_set_wake_state(uint8_t wake_assert); 52ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (SCO_CFG_INCLUDED == TRUE) 53ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid hw_sco_config(void); 54ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif 55ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid vnd_load_conf(const char *p_path); 56f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao#if (HW_END_WITH_HCI_RESET == TRUE) 57f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chaovoid hw_epilog_process(void); 58f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao#endif 59ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 60ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/****************************************************************************** 61ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Variables 62ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/ 63ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 64ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillebt_vendor_callbacks_t *bt_vendor_cbacks = NULL; 65ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleuint8_t vnd_local_bd_addr[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 66ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 67ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/****************************************************************************** 68ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Local type definitions 69ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/ 70ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 71ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/****************************************************************************** 72ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Static Variables 73ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/ 74ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 75ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic const tUSERIAL_CFG userial_init_cfg = 76ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{ 77ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville (USERIAL_DATABITS_8 | USERIAL_PARITY_NONE | USERIAL_STOPBITS_1), 78ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville USERIAL_BAUD_115200 79ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}; 80ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 81ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/****************************************************************************** 82ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Functions 83ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/ 84ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 85ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/***************************************************************************** 86ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** 87ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** BLUETOOTH VENDOR INTERFACE LIBRARY FUNCTIONS 88ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** 89ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*****************************************************************************/ 90ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 91ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic int init(const bt_vendor_callbacks_t* p_cb, unsigned char *local_bdaddr) 92ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{ 93ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGI("init"); 94ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 95ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville if (p_cb == NULL) 96ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 97ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGE("init failed with no user callbacks!"); 98ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville return -1; 99ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 100ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 101ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (VENDOR_LIB_RUNTIME_TUNING_ENABLED == TRUE) 102ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("*****************************************************************"); 103ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("*****************************************************************"); 104ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("** Warning - BT Vendor Lib is loaded in debug tuning mode!"); 105ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("**"); 106ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("** If this is not intentional, rebuild libbt-vendor.so "); 107ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("** with VENDOR_LIB_RUNTIME_TUNING_ENABLED=FALSE and "); 108ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("** check if any run-time tuning parameters needed to be"); 109ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("** carried to the build-time configuration accordingly."); 110ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("*****************************************************************"); 111ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("*****************************************************************"); 112ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif 113ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 114ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville userial_vendor_init(); 115ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville upio_init(); 116ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 117ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville vnd_load_conf(VENDOR_LIB_CONF_FILE); 118ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 119ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville /* store reference to user callbacks */ 120ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville bt_vendor_cbacks = (bt_vendor_callbacks_t *) p_cb; 121ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 122ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville /* This is handed over from the stack */ 123ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville memcpy(vnd_local_bd_addr, local_bdaddr, 6); 124ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 125ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville return 0; 126ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville} 127ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 128ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 129ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/** Requested operations */ 130ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic int op(bt_vendor_opcode_t opcode, void *param) 131ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{ 132ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville int retval = 0; 133ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 134ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville BTVNDDBG("op for %d", opcode); 135ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 136ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville switch(opcode) 137ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 138ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville case BT_VND_OP_POWER_CTRL: 139ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 140ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville int *state = (int *) param; 141ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville if (*state == BT_VND_PWR_OFF) 142ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville upio_set_bluetooth_power(UPIO_BT_POWER_OFF); 143ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville else if (*state == BT_VND_PWR_ON) 144ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville upio_set_bluetooth_power(UPIO_BT_POWER_ON); 145ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 146ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville break; 147ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 148ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville case BT_VND_OP_FW_CFG: 149ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 150ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville hw_config_start(); 151ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 152ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville break; 153ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 154ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville case BT_VND_OP_SCO_CFG: 155ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 156ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (SCO_CFG_INCLUDED == TRUE) 157ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville hw_sco_config(); 158ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#else 159ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville retval = -1; 160ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif 161ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 162ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville break; 163ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 164ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville case BT_VND_OP_USERIAL_OPEN: 165ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 166ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville int (*fd_array)[] = (int (*)[]) param; 167ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville int fd, idx; 168ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville fd = userial_vendor_open((tUSERIAL_CFG *) &userial_init_cfg); 169ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville if (fd != -1) 170ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 171ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville for (idx=0; idx < CH_MAX; idx++) 172ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville (*fd_array)[idx] = fd; 173ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 174ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville retval = 1; 175ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 176ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville /* retval contains numbers of open fd of HCI channels */ 177ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 178ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville break; 179ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 180ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville case BT_VND_OP_USERIAL_CLOSE: 181ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 182ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville userial_vendor_close(); 183ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 184ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville break; 185ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 186ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville case BT_VND_OP_GET_LPM_IDLE_TIMEOUT: 187ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 188ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville uint32_t *timeout_ms = (uint32_t *) param; 189ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *timeout_ms = hw_lpm_get_idle_timeout(); 190ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 191ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville break; 192ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 193ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville case BT_VND_OP_LPM_SET_MODE: 194ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 195ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville uint8_t *mode = (uint8_t *) param; 196ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville retval = hw_lpm_enable(*mode); 197ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 198ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville break; 199ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 200ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville case BT_VND_OP_LPM_WAKE_SET_STATE: 201ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 202ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville uint8_t *state = (uint8_t *) param; 20378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao uint8_t wake_assert = (*state == BT_VND_LPM_WAKE_ASSERT) ? \ 204ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville TRUE : FALSE; 205ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 206ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville hw_lpm_set_wake_state(wake_assert); 207ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 208ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville break; 209f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao 210f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao case BT_VND_OP_EPILOG: 211f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao { 212f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao#if (HW_END_WITH_HCI_RESET == FALSE) 213f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao if (bt_vendor_cbacks) 214f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao { 215f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao bt_vendor_cbacks->epilog_cb(BT_VND_OP_RESULT_SUCCESS); 216f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao } 217f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao#else 218f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao hw_epilog_process(); 219f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao#endif 220f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao } 221f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao break; 222ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 223ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 224ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville return retval; 225ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville} 226ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 227ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/** Closes the interface */ 228ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic void cleanup( void ) 229ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{ 230ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville BTVNDDBG("cleanup"); 231ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 232ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville upio_cleanup(); 233ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 234ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville bt_vendor_cbacks = NULL; 235ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville} 236ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 237ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville// Entry point of DLib 238ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleconst bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE = { 239ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville sizeof(bt_vendor_interface_t), 240ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville init, 241ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville op, 242ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville cleanup 243ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}; 244