1 /****************************************************************************** 2 * 3 * Copyright (C) 2009-2012 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19 /****************************************************************************** 20 * 21 * Filename: bt_hw.c 22 * 23 * Description: Bluedroid libbt-vendor callback functions 24 * 25 ******************************************************************************/ 26 27 #define LOG_TAG "bt_hw" 28 29 #include <dlfcn.h> 30 #include <utils/Log.h> 31 #include <pthread.h> 32 #include "bt_vendor_lib.h" 33 #include "bt_hci_bdroid.h" 34 #include "hci.h" 35 #include "userial.h" 36 37 /****************************************************************************** 38 ** Externs 39 ******************************************************************************/ 40 41 extern tHCI_IF *p_hci_if; 42 extern uint8_t fwcfg_acked; 43 void lpm_vnd_cback(uint8_t vnd_result); 44 45 /****************************************************************************** 46 ** Variables 47 ******************************************************************************/ 48 49 bt_vendor_interface_t *bt_vnd_if=NULL; 50 51 /****************************************************************************** 52 ** Functions 53 ******************************************************************************/ 54 55 /****************************************************************************** 56 ** 57 ** Function fwcfg_cb 58 ** 59 ** Description HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is 60 ** called when the libbt-vendor completed firmware 61 ** configuration process 62 ** 63 ** Returns None 64 ** 65 ******************************************************************************/ 66 static void fwcfg_cb(bt_vendor_op_result_t result) 67 { 68 bt_hc_postload_result_t status = (result == BT_VND_OP_RESULT_SUCCESS) ? \ 69 BT_HC_PRELOAD_SUCCESS : BT_HC_PRELOAD_FAIL; 70 71 fwcfg_acked = TRUE; 72 73 if (bt_hc_cbacks) 74 bt_hc_cbacks->preload_cb(NULL, status); 75 } 76 77 /****************************************************************************** 78 ** 79 ** Function scocfg_cb 80 ** 81 ** Description HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is 82 ** called when the libbt-vendor completed vendor specific SCO 83 ** configuration process 84 ** 85 ** Returns None 86 ** 87 ******************************************************************************/ 88 static void scocfg_cb(bt_vendor_op_result_t result) 89 { 90 /* Continue rest of postload process*/ 91 p_hci_if->get_acl_max_len(); 92 } 93 94 /****************************************************************************** 95 ** 96 ** Function lpm_vnd_cb 97 ** 98 ** Description HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is 99 ** called back from the libbt-vendor to indicate the result of 100 ** previous LPM enable/disable request 101 ** 102 ** Returns None 103 ** 104 ******************************************************************************/ 105 static void lpm_vnd_cb(bt_vendor_op_result_t result) 106 { 107 uint8_t status = (result == BT_VND_OP_RESULT_SUCCESS) ? 0 : 1; 108 109 lpm_vnd_cback(status); 110 } 111 112 /****************************************************************************** 113 ** 114 ** Function alloc 115 ** 116 ** Description HOST/CONTROLLER VENDOR LIB CALLOUT API - This function is 117 ** called from the libbt-vendor to request for data buffer 118 ** allocation 119 ** 120 ** Returns NULL / pointer to allocated buffer 121 ** 122 ******************************************************************************/ 123 static void *alloc(int size) 124 { 125 HC_BT_HDR *p_hdr = NULL; 126 127 if (bt_hc_cbacks) 128 p_hdr = (HC_BT_HDR *) bt_hc_cbacks->alloc(size); 129 130 return (p_hdr); 131 } 132 133 /****************************************************************************** 134 ** 135 ** Function dealloc 136 ** 137 ** Description HOST/CONTROLLER VENDOR LIB CALLOUT API - This function is 138 ** called from the libbt-vendor to release the data buffer 139 ** allocated through the alloc call earlier 140 ** 141 ** Returns None 142 ** 143 ******************************************************************************/ 144 static void dealloc(void *p_buf) 145 { 146 HC_BT_HDR *p_hdr = (HC_BT_HDR *) p_buf; 147 148 if (bt_hc_cbacks) 149 bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_hdr+1)); 150 } 151 152 /****************************************************************************** 153 ** 154 ** Function xmit_cb 155 ** 156 ** Description HOST/CONTROLLER VEDNOR LIB CALLOUT API - This function is 157 ** called from the libbt-vendor in order to send a prepared 158 ** HCI command packet through HCI transport TX function. 159 ** 160 ** Returns TRUE/FALSE 161 ** 162 ******************************************************************************/ 163 static uint8_t xmit_cb(uint16_t opcode, void *p_buf, tINT_CMD_CBACK p_cback) 164 { 165 return p_hci_if->send_int_cmd(opcode, (HC_BT_HDR *)p_buf, p_cback); 166 } 167 168 /****************************************************************************** 169 ** 170 ** Function epilog_cb 171 ** 172 ** Description HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is 173 ** called back from the libbt-vendor to indicate the result of 174 ** previous epilog call. 175 ** 176 ** Returns None 177 ** 178 ******************************************************************************/ 179 static void epilog_cb(bt_vendor_op_result_t result) 180 { 181 bthc_signal_event(HC_EVENT_EXIT); 182 } 183 184 /***************************************************************************** 185 ** The libbt-vendor Callback Functions Table 186 *****************************************************************************/ 187 static const bt_vendor_callbacks_t vnd_callbacks = { 188 sizeof(bt_vendor_callbacks_t), 189 fwcfg_cb, 190 scocfg_cb, 191 lpm_vnd_cb, 192 alloc, 193 dealloc, 194 xmit_cb, 195 epilog_cb 196 }; 197 198 /****************************************************************************** 199 ** 200 ** Function init_vnd_if 201 ** 202 ** Description Initialize vendor lib interface 203 ** 204 ** Returns None 205 ** 206 ******************************************************************************/ 207 void init_vnd_if(unsigned char *local_bdaddr) 208 { 209 void *dlhandle; 210 211 dlhandle = dlopen("libbt-vendor.so", RTLD_NOW); 212 if (!dlhandle) 213 { 214 ALOGE("!!! Failed to load libbt-vendor.so !!!"); 215 return; 216 } 217 218 bt_vnd_if = (bt_vendor_interface_t *) dlsym(dlhandle, "BLUETOOTH_VENDOR_LIB_INTERFACE"); 219 if (!bt_vnd_if) 220 { 221 ALOGE("!!! Failed to get bt vendor interface !!!"); 222 return; 223 } 224 225 bt_vnd_if->init(&vnd_callbacks, local_bdaddr); 226 } 227 228