summaryrefslogtreecommitdiffstats
path: root/hci/src/bt_hw.c
diff options
context:
space:
mode:
Diffstat (limited to 'hci/src/bt_hw.c')
-rw-r--r--hci/src/bt_hw.c207
1 files changed, 207 insertions, 0 deletions
diff --git a/hci/src/bt_hw.c b/hci/src/bt_hw.c
new file mode 100644
index 0000000..b2a099f
--- /dev/null
+++ b/hci/src/bt_hw.c
@@ -0,0 +1,207 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2009-2012 Broadcom Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * Filename: bt_hw.c
+ *
+ * Description: Bluedroid libbt-vendor callback functions
+ *
+ ******************************************************************************/
+
+#define LOG_TAG "bt_hw"
+
+#include <dlfcn.h>
+#include <utils/Log.h>
+#include <pthread.h>
+#include "bt_vendor_lib.h"
+#include "bt_hci_bdroid.h"
+#include "hci.h"
+#include "userial.h"
+
+/******************************************************************************
+** Externs
+******************************************************************************/
+
+extern tHCI_IF *p_hci_if;
+void lpm_vnd_cback(uint8_t vnd_result);
+
+/******************************************************************************
+** Variables
+******************************************************************************/
+
+bt_vendor_interface_t *bt_vnd_if=NULL;
+
+/******************************************************************************
+** Functions
+******************************************************************************/
+
+/******************************************************************************
+**
+** Function fwcfg_cb
+**
+** Description HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is
+** called when the libbt-vendor completed firmware
+** configuration process
+**
+** Returns None
+**
+******************************************************************************/
+static void fwcfg_cb(bt_vendor_op_result_t result)
+{
+ bt_hc_postload_result_t status = (result == BT_VND_OP_RESULT_SUCCESS) ? \
+ BT_HC_PRELOAD_SUCCESS : BT_HC_PRELOAD_FAIL;
+
+ if (bt_hc_cbacks)
+ bt_hc_cbacks->preload_cb(NULL, status);
+}
+
+/******************************************************************************
+**
+** Function scocfg_cb
+**
+** Description HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is
+** called when the libbt-vendor completed vendor specific SCO
+** configuration process
+**
+** Returns None
+**
+******************************************************************************/
+static void scocfg_cb(bt_vendor_op_result_t result)
+{
+ /* Continue rest of postload process*/
+ p_hci_if->get_acl_max_len();
+}
+
+/******************************************************************************
+**
+** Function lpm_vnd_cb
+**
+** Description HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is
+** called back from the libbt-vendor to indicate the result of
+** previous LPM enable/disable request
+**
+** Returns None
+**
+******************************************************************************/
+static void lpm_vnd_cb(bt_vendor_op_result_t result)
+{
+ uint8_t status = (result == BT_VND_OP_RESULT_SUCCESS) ? 0 : 1;
+
+ lpm_vnd_cback(status);
+}
+
+/******************************************************************************
+**
+** Function alloc
+**
+** Description HOST/CONTROLLER VENDOR LIB CALLOUT API - This function is
+** called from the libbt-vendor to request for data buffer
+** allocation
+**
+** Returns NULL / pointer to allocated buffer
+**
+******************************************************************************/
+static void *alloc(int size)
+{
+ HC_BT_HDR *p_hdr = NULL;
+
+ if (bt_hc_cbacks)
+ p_hdr = (HC_BT_HDR *) bt_hc_cbacks->alloc(size);
+
+ return (p_hdr);
+}
+
+/******************************************************************************
+**
+** Function dealloc
+**
+** Description HOST/CONTROLLER VENDOR LIB CALLOUT API - This function is
+** called from the libbt-vendor to release the data buffer
+** allocated through the alloc call earlier
+**
+** Returns None
+**
+******************************************************************************/
+static void dealloc(void *p_buf)
+{
+ HC_BT_HDR *p_hdr = (HC_BT_HDR *) p_buf;
+
+ if (bt_hc_cbacks)
+ bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_hdr+1));
+}
+
+/******************************************************************************
+**
+** Function xmit_cb
+**
+** Description HOST/CONTROLLER VEDNOR LIB CALLOUT API - This function is
+** called from the libbt-vendor in order to send a prepared
+** HCI command packet through HCI transport TX function.
+**
+** Returns TRUE/FALSE
+**
+******************************************************************************/
+static uint8_t xmit_cb(uint16_t opcode, void *p_buf, tINT_CMD_CBACK p_cback)
+{
+ return p_hci_if->send_int_cmd(opcode, (HC_BT_HDR *)p_buf, p_cback);
+}
+
+/*****************************************************************************
+** The libbt-vendor Callback Functions Table
+*****************************************************************************/
+static const bt_vendor_callbacks_t vnd_callbacks = {
+ sizeof(bt_vendor_callbacks_t),
+ fwcfg_cb,
+ scocfg_cb,
+ lpm_vnd_cb,
+ alloc,
+ dealloc,
+ xmit_cb
+};
+
+/******************************************************************************
+**
+** Function init_vnd_if
+**
+** Description Initialize vendor lib interface
+**
+** Returns None
+**
+******************************************************************************/
+void init_vnd_if(unsigned char *local_bdaddr)
+{
+ void *dlhandle;
+
+ dlhandle = dlopen("libbt-vendor.so", RTLD_NOW);
+ if (!dlhandle)
+ {
+ ALOGE("!!! Failed to load libbt-vendor.so !!!");
+ return;
+ }
+
+ bt_vnd_if = (bt_vendor_interface_t *) dlsym(dlhandle, "BLUETOOTH_VENDOR_LIB_INTERFACE");
+ if (!bt_vnd_if)
+ {
+ ALOGE("!!! Failed to get bt vendor interface !!!");
+ return;
+ }
+
+ bt_vnd_if->init(&vnd_callbacks, local_bdaddr);
+}
+