1/* 2 * Copyright 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17/****************************************************************************** 18 * 19 * Filename: bt_vendor_brcm.c 20 * 21 * Description: Broadcom vendor specific library implementation 22 * 23 ******************************************************************************/ 24 25#define LOG_TAG "bt_vendor" 26 27#include <utils/Log.h> 28#include <string.h> 29#include <fcntl.h> 30#include <termios.h> 31#include "bt_vendor_qcom.h" 32#include "userial_vendor.h" 33 34/****************************************************************************** 35** Externs 36******************************************************************************/ 37extern int hw_config(int nState); 38 39extern int is_hw_ready(); 40 41/****************************************************************************** 42** Variables 43******************************************************************************/ 44int pFd[2] = {0,}; 45bt_hci_transport_device_type bt_hci_transport_device; 46 47bt_vendor_callbacks_t *bt_vendor_cbacks = NULL; 48uint8_t vnd_local_bd_addr[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 49 50#if (HW_NEED_END_WITH_HCI_RESET == TRUE) 51void hw_epilog_process(void); 52#endif 53 54 55/****************************************************************************** 56** Local type definitions 57******************************************************************************/ 58 59 60/****************************************************************************** 61** Functions 62******************************************************************************/ 63 64/***************************************************************************** 65** 66** BLUETOOTH VENDOR INTERFACE LIBRARY FUNCTIONS 67** 68*****************************************************************************/ 69 70static int init(const bt_vendor_callbacks_t* p_cb, unsigned char *local_bdaddr) 71{ 72 ALOGI("bt-vendor : init"); 73 74 if (p_cb == NULL) 75 { 76 ALOGE("init failed with no user callbacks!"); 77 return -1; 78 } 79 80 //userial_vendor_init(); 81 //upio_init(); 82 83 //vnd_load_conf(VENDOR_LIB_CONF_FILE); 84 85 /* store reference to user callbacks */ 86 bt_vendor_cbacks = (bt_vendor_callbacks_t *) p_cb; 87 88 /* This is handed over from the stack */ 89 memcpy(vnd_local_bd_addr, local_bdaddr, 6); 90 91 return 0; 92} 93 94 95/** Requested operations */ 96static int op(bt_vendor_opcode_t opcode, void *param) 97{ 98 int retval = 0; 99 int nCnt = 0; 100 int nState = -1; 101 102 ALOGV("bt-vendor : op for %d", opcode); 103 104 switch(opcode) 105 { 106 case BT_VND_OP_POWER_CTRL: 107 { 108 nState = *(int *) param; 109 retval = hw_config(nState); 110 if(nState == BT_VND_PWR_ON 111 && retval == 0 112 && is_hw_ready() == TRUE){ 113 retval = 0; 114 } 115 else { 116 retval = -1; 117 } 118 } 119 break; 120 121 case BT_VND_OP_FW_CFG: 122 { 123 // call hciattach to initalize the stack 124 if(bt_vendor_cbacks){ 125 ALOGI("Bluetooth Firmware and smd is initialized"); 126 bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_SUCCESS); 127 } 128 else{ 129 ALOGE("Error : hci, smd initialization Error"); 130 bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_FAIL); 131 } 132 } 133 break; 134 135 case BT_VND_OP_SCO_CFG: 136 { 137 bt_vendor_cbacks->scocfg_cb(BT_VND_OP_RESULT_SUCCESS); //dummy 138 } 139 break; 140 141 case BT_VND_OP_USERIAL_OPEN: 142 { 143 if(bt_hci_init_transport(pFd) != -1){ 144 int (*fd_array)[] = (int (*) []) param; 145 146 (*fd_array)[CH_CMD] = pFd[0]; 147 (*fd_array)[CH_EVT] = pFd[0]; 148 (*fd_array)[CH_ACL_OUT] = pFd[1]; 149 (*fd_array)[CH_ACL_IN] = pFd[1]; 150 } 151 else { 152 retval = -1; 153 break; 154 } 155 retval = 2; 156 } 157 break; 158 159 case BT_VND_OP_USERIAL_CLOSE: 160 { 161 bt_hci_deinit_transport(pFd); 162 } 163 break; 164 165 case BT_VND_OP_GET_LPM_IDLE_TIMEOUT: 166 break; 167 168 case BT_VND_OP_LPM_SET_MODE: 169 { 170 bt_vendor_cbacks->lpm_cb(BT_VND_OP_RESULT_SUCCESS); //dummy 171 } 172 break; 173 174 case BT_VND_OP_LPM_WAKE_SET_STATE: 175 break; 176 case BT_VND_OP_EPILOG: 177 { 178#if (HW_NEED_END_WITH_HCI_RESET == FALSE) 179 if (bt_vendor_cbacks) 180 { 181 bt_vendor_cbacks->epilog_cb(BT_VND_OP_RESULT_SUCCESS); 182 } 183#else 184 hw_epilog_process(); 185#endif 186 } 187 break; 188 } 189 190 return retval; 191} 192 193/** Closes the interface */ 194static void cleanup( void ) 195{ 196 ALOGI("cleanup"); 197 198 //upio_cleanup(); 199 200 bt_vendor_cbacks = NULL; 201} 202 203// Entry point of DLib 204const bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE = { 205 sizeof(bt_vendor_interface_t), 206 init, 207 op, 208 cleanup 209}; 210