blob: 5265dced6770add138d971232d419f4c479d2253 [file] [log] [blame]
/******************************************************************************
*
* 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;
extern uint8_t fwcfg_acked;
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;
fwcfg_acked = TRUE;
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);
}
/******************************************************************************
**
** Function epilog_cb
**
** Description HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is
** called back from the libbt-vendor to indicate the result of
** previous epilog call.
**
** Returns None
**
******************************************************************************/
static void epilog_cb(bt_vendor_op_result_t result)
{
bthc_signal_event(HC_EVENT_EXIT);
}
/*****************************************************************************
** 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,
epilog_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);
}