diff options
Diffstat (limited to 'libbt/src/bt_vendor_brcm.c')
-rw-r--r-- | libbt/src/bt_vendor_brcm.c | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/libbt/src/bt_vendor_brcm.c b/libbt/src/bt_vendor_brcm.c new file mode 100644 index 0000000..d17baa2 --- /dev/null +++ b/libbt/src/bt_vendor_brcm.c @@ -0,0 +1,227 @@ +/****************************************************************************** + * + * 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_vendor_brcm.c + * + * Description: Broadcom vendor specific library implementation + * + ******************************************************************************/ + +#define LOG_TAG "bt_vendor" + +#include <utils/Log.h> +#include "bt_vendor_brcm.h" +#include "upio.h" +#include "userial_vendor.h" + +#ifndef BTVND_DBG +#define BTVND_DBG FALSE +#endif + +#if (BTVND_DBG == TRUE) +#define BTVNDDBG(param, ...) {ALOGD(param, ## __VA_ARGS__);} +#else +#define BTVNDDBG(param, ...) {} +#endif + +/****************************************************************************** +** Externs +******************************************************************************/ + +void hw_config_start(void); +uint8_t hw_lpm_enable(uint8_t turn_on); +uint32_t hw_lpm_get_idle_timeout(void); +void hw_lpm_set_wake_state(uint8_t wake_assert); +#if (SCO_CFG_INCLUDED == TRUE) +void hw_sco_config(void); +#endif +void vnd_load_conf(const char *p_path); + +/****************************************************************************** +** Variables +******************************************************************************/ + +bt_vendor_callbacks_t *bt_vendor_cbacks = NULL; +uint8_t vnd_local_bd_addr[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +/****************************************************************************** +** Local type definitions +******************************************************************************/ + +/****************************************************************************** +** Static Variables +******************************************************************************/ + +static const tUSERIAL_CFG userial_init_cfg = +{ + (USERIAL_DATABITS_8 | USERIAL_PARITY_NONE | USERIAL_STOPBITS_1), + USERIAL_BAUD_115200 +}; + +/****************************************************************************** +** Functions +******************************************************************************/ + +/***************************************************************************** +** +** BLUETOOTH VENDOR INTERFACE LIBRARY FUNCTIONS +** +*****************************************************************************/ + +static int init(const bt_vendor_callbacks_t* p_cb, unsigned char *local_bdaddr) +{ + ALOGI("init"); + + if (p_cb == NULL) + { + ALOGE("init failed with no user callbacks!"); + return -1; + } + +#if (VENDOR_LIB_RUNTIME_TUNING_ENABLED == TRUE) + ALOGW("*****************************************************************"); + ALOGW("*****************************************************************"); + ALOGW("** Warning - BT Vendor Lib is loaded in debug tuning mode!"); + ALOGW("**"); + ALOGW("** If this is not intentional, rebuild libbt-vendor.so "); + ALOGW("** with VENDOR_LIB_RUNTIME_TUNING_ENABLED=FALSE and "); + ALOGW("** check if any run-time tuning parameters needed to be"); + ALOGW("** carried to the build-time configuration accordingly."); + ALOGW("*****************************************************************"); + ALOGW("*****************************************************************"); +#endif + + userial_vendor_init(); + upio_init(); + + vnd_load_conf(VENDOR_LIB_CONF_FILE); + + /* store reference to user callbacks */ + bt_vendor_cbacks = (bt_vendor_callbacks_t *) p_cb; + + /* This is handed over from the stack */ + memcpy(vnd_local_bd_addr, local_bdaddr, 6); + + return 0; +} + + +/** Requested operations */ +static int op(bt_vendor_opcode_t opcode, void *param) +{ + int retval = 0; + + BTVNDDBG("op for %d", opcode); + + switch(opcode) + { + case BT_VND_OP_POWER_CTRL: + { + int *state = (int *) param; + if (*state == BT_VND_PWR_OFF) + upio_set_bluetooth_power(UPIO_BT_POWER_OFF); + else if (*state == BT_VND_PWR_ON) + upio_set_bluetooth_power(UPIO_BT_POWER_ON); + } + break; + + case BT_VND_OP_FW_CFG: + { + hw_config_start(); + } + break; + + case BT_VND_OP_SCO_CFG: + { +#if (SCO_CFG_INCLUDED == TRUE) + hw_sco_config(); +#else + retval = -1; +#endif + } + break; + + case BT_VND_OP_USERIAL_OPEN: + { + int (*fd_array)[] = (int (*)[]) param; + int fd, idx; + fd = userial_vendor_open((tUSERIAL_CFG *) &userial_init_cfg); + if (fd != -1) + { + for (idx=0; idx < CH_MAX; idx++) + (*fd_array)[idx] = fd; + + retval = 1; + } + /* retval contains numbers of open fd of HCI channels */ + } + break; + + case BT_VND_OP_USERIAL_CLOSE: + { + userial_vendor_close(); + } + break; + + case BT_VND_OP_GET_LPM_IDLE_TIMEOUT: + { + uint32_t *timeout_ms = (uint32_t *) param; + *timeout_ms = hw_lpm_get_idle_timeout(); + } + break; + + case BT_VND_OP_LPM_SET_MODE: + { + uint8_t *mode = (uint8_t *) param; + retval = hw_lpm_enable(*mode); + } + break; + + case BT_VND_OP_LPM_WAKE_SET_STATE: + { + uint8_t *state = (uint8_t *) param; + uint8_t wake_assert = (state == BT_VND_LPM_WAKE_ASSERT) ? \ + TRUE : FALSE; + + hw_lpm_set_wake_state(wake_assert); + } + break; + } + + return retval; +} + +/** Closes the interface */ +static void cleanup( void ) +{ + BTVNDDBG("cleanup"); + + upio_cleanup(); + + bt_vendor_cbacks = NULL; +} + +// Entry point of DLib +const bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE = { + sizeof(bt_vendor_interface_t), + init, + op, + cleanup +}; |