bluetooth: revert to 'LP' blobs and build libbt-vendor-mtk

This commit is contained in:
Mister Oyster 2017-01-22 17:45:18 +01:00
parent f4c227f49e
commit 70124fec5b
6 changed files with 886 additions and 0 deletions

View File

@ -0,0 +1,27 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := \
system/bt/hci/include \
$(LOCAL_PATH)
LOCAL_CFLAGS := -g -c -W -Wall -O2 -D_POSIX_SOURCE
LOCAL_SRC_FILES := libbt-vendor-mtk.c
LOCAL_SHARED_LIBRARIES := \
libnativehelper \
libcutils \
libutils \
liblog \
libdl
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := libbt-vendor
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR_SHARED_LIBRARIES)
LOCAL_MODULE_PATH_32 := $(2ND_TARGET_OUT_VENDOR_SHARED_LIBRARIES)
LOCAL_MULTILIB := both
include $(BUILD_SHARED_LIBRARY)

View File

@ -0,0 +1,135 @@
/******************************************************************************
*
* 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_hci_bdroid.h
*
* Description: A wrapper header file of bt_hci_lib.h
*
* Contains definitions specific for interfacing with Bluedroid
* Bluetooth stack
*
******************************************************************************/
#pragma once
#include "bt_hci_lib.h"
#ifdef HAS_BDROID_BUILDCFG
#include "bdroid_buildcfg.h"
#endif
/******************************************************************************
** Constants & Macros
******************************************************************************/
#if __STDC_VERSION__ < 199901L
# ifndef FALSE
# define FALSE 0
# endif
# ifndef TRUE
# define TRUE (!FALSE)
# endif
#else
# include <stdbool.h>
# ifndef FALSE
# define FALSE false
# endif
# ifndef TRUE
# define TRUE true
# endif
#endif
#define HCI_ACL_MAX_SIZE 1024
#define HCI_MAX_FRAME_SIZE (HCI_ACL_MAX_SIZE + 4)
/* Host/Controller lib internal event ID */
typedef enum {
HC_EVENT_LPM_IDLE_TIMEOUT,
} bthc_event_t;
#define MSG_CTRL_TO_HC_CMD 0x0100 /* evt mask used by HC_EVENT_TX_CMD */
/* Message event mask across Host/Controller lib and stack */
#define MSG_EVT_MASK 0xFF00 /* eq. BT_EVT_MASK */
#define MSG_SUB_EVT_MASK 0x00FF /* eq. BT_SUB_EVT_MASK */
/* Message event ID passed from Host/Controller lib to stack */
#define MSG_HC_TO_STACK_HCI_ERR 0x1300 /* eq. BT_EVT_TO_BTU_HCIT_ERR */
#define MSG_HC_TO_STACK_HCI_ACL 0x1100 /* eq. BT_EVT_TO_BTU_HCI_ACL */
#define MSG_HC_TO_STACK_HCI_SCO 0x1200 /* eq. BT_EVT_TO_BTU_HCI_SCO */
#define MSG_HC_TO_STACK_HCI_EVT 0x1000 /* eq. BT_EVT_TO_BTU_HCI_EVT */
#define MSG_HC_TO_STACK_L2C_SEG_XMIT 0x1900 /* eq. BT_EVT_TO_BTU_L2C_SEG_XMIT */
/* Message event ID passed from stack to vendor lib */
#define MSG_STACK_TO_HC_HCI_ACL 0x2100 /* eq. BT_EVT_TO_LM_HCI_ACL */
#define MSG_STACK_TO_HC_HCI_SCO 0x2200 /* eq. BT_EVT_TO_LM_HCI_SCO */
#define MSG_STACK_TO_HC_HCI_CMD 0x2000 /* eq. BT_EVT_TO_LM_HCI_CMD */
/* Local Bluetooth Controller ID for BR/EDR */
#define LOCAL_BR_EDR_CONTROLLER_ID 0
/* Definitions of audio codec type
* inherited from AG callout function "codec" parameter
*/
#define SCO_CODEC_NONE 0x0000 /* BTA_AG_CODEC_NONE/BTM_SCO_CODEC_NONE */
#define SCO_CODEC_CVSD 0x0001 /* BTA_AG_CODEC_CVSD/BTM_SCO_CODEC_CVSD */
#define SCO_CODEC_MSBC 0x0002 /* BTA_AG_CODEC_MSBC/BTM_SCO_CODEC_MSBC */
/******************************************************************************
** Type definitions and return values
******************************************************************************/
typedef struct
{
uint16_t event;
uint16_t len;
uint16_t offset;
uint16_t layer_specific;
uint8_t data[];
} HC_BT_HDR;
#define BT_HC_HDR_SIZE (sizeof(HC_BT_HDR))
typedef struct _hc_buffer_hdr
{
struct _hc_buffer_hdr *p_next; /* next buffer in the queue */
uint8_t reserved1;
uint8_t reserved2;
uint8_t reserved3;
uint8_t reserved4;
} HC_BUFFER_HDR_T;
#define BT_HC_BUFFER_HDR_SIZE (sizeof(HC_BUFFER_HDR_T))
/******************************************************************************
** Extern variables and functions
******************************************************************************/
extern bt_hc_callbacks_t *bt_hc_cbacks;
/******************************************************************************
** Functions
******************************************************************************/
// Called when a buffer has been produced by the serial layer and should be
// processed by the HCI layer.
void bthc_rx_ready(void);
void bthc_tx(HC_BT_HDR *buf);
void bthc_idle_timeout(void);

View File

@ -0,0 +1,208 @@
/******************************************************************************
*
* 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.
*
******************************************************************************/
#ifndef BT_HCI_LIB_H
#define BT_HCI_LIB_H
#include <stdint.h>
#include <stdbool.h>
#include <sys/cdefs.h>
#include <sys/types.h>
/** Struct types */
/** Typedefs and defines */
/* Generic purpose transac returned upon request complete */
typedef void* TRANSAC;
/** Bluetooth Power Control States */
typedef enum {
BT_HC_CHIP_PWR_OFF,
BT_HC_CHIP_PWR_ON,
} bt_hc_chip_power_state_t;
/** Bluetooth Low Power Mode */
typedef enum {
BT_HC_LPM_DISABLE,
BT_HC_LPM_ENABLE,
BT_HC_LPM_WAKE_ASSERT,
BT_HC_LPM_WAKE_DEASSERT,
} bt_hc_low_power_event_t;
/** Receive flow control */
typedef enum {
BT_RXFLOW_OFF, /* add transport device fd to select set */
BT_RXFLOW_ON, /* remove transport device to from select set */
} bt_rx_flow_state_t;
/** HCI logging control */
typedef enum {
BT_HC_LOGGING_OFF,
BT_HC_LOGGING_ON,
} bt_hc_logging_state_t;
/* commands to be used in LSB with MSG_CTRL_TO_HC_CMD */
typedef enum {
BT_HC_AUDIO_STATE = 0,
BT_HC_CMD_MAX
} bt_hc_tx_cmd_t;
/** Result of write request */
typedef enum {
BT_HC_TX_SUCCESS, /* a buffer is fully processed and can be released */
BT_HC_TX_FAIL, /* transmit fail */
BT_HC_TX_FRAGMENT, /* send split ACL pkt back to stack to reprocess */
} bt_hc_transmit_result_t;
/** Result of preload initialization */
typedef enum {
BT_HC_PRELOAD_SUCCESS,
BT_HC_PRELOAD_FAIL,
} bt_hc_preload_result_t;
/** Result of postload initialization */
typedef enum {
BT_HC_POSTLOAD_SUCCESS,
BT_HC_POSTLOAD_FAIL,
} bt_hc_postload_result_t;
/** Result of low power enable/disable request */
typedef enum {
BT_HC_LPM_DISABLED,
BT_HC_LPM_ENABLED,
} bt_hc_lpm_request_result_t;
/** Host/Controller Library Return Status */
typedef enum {
BT_HC_STATUS_SUCCESS,
BT_HC_STATUS_FAIL,
BT_HC_STATUS_NOT_READY,
BT_HC_STATUS_NOMEM,
BT_HC_STATUS_BUSY,
BT_HC_STATUS_CORRUPTED_BUFFER
} bt_hc_status_t;
/* Section comment */
/*
* Bluetooth Host/Controller callback structure.
*/
/* called upon bt host wake signal */
typedef void (*hostwake_ind_cb)(bt_hc_low_power_event_t event);
/* preload initialization callback */
typedef void (*preload_result_cb)(TRANSAC transac, bt_hc_preload_result_t result);
/* postload initialization callback */
typedef void (*postload_result_cb)(TRANSAC transac, bt_hc_postload_result_t result);
/* lpm enable/disable callback */
typedef void (*lpm_result_cb)(bt_hc_lpm_request_result_t result);
/* datapath buffer allocation callback (callout) */
typedef char* (*alloc_mem_cb)(int size);
/* datapath buffer deallocation callback (callout) */
typedef void (*dealloc_mem_cb)(TRANSAC transac);
/* transmit result callback */
typedef int (*tx_result_cb)(TRANSAC transac, char *p_buf, bt_hc_transmit_result_t result);
/* a previously setup buffer is read and available for processing
buffer is deallocated in stack when processed */
typedef int (*data_ind_cb)(TRANSAC transac, char *p_buf, int len);
typedef struct {
/** set to sizeof(bt_hc_callbacks_t) */
size_t size;
/* notifies caller result of preload request */
preload_result_cb preload_cb;
/* notifies caller result of postload request */
postload_result_cb postload_cb;
/* notifies caller result of lpm enable/disable */
lpm_result_cb lpm_cb;
/* notifies hardware on host wake state */
hostwake_ind_cb hostwake_ind;
/* buffer allocation request */
alloc_mem_cb alloc;
/* buffer deallocation request */
dealloc_mem_cb dealloc;
/* notifies stack data is available */
data_ind_cb data_ind;
/* notifies caller when a buffer is transmitted (or failed) */
tx_result_cb tx_result;
} bt_hc_callbacks_t;
/*
* Bluetooth Host/Controller Interface
*/
typedef struct {
/** Set to sizeof(bt_hc_interface_t) */
size_t size;
/**
* Opens the interface and provides the callback routines
* to the implemenation of this interface.
*/
int (*init)(const bt_hc_callbacks_t* p_cb, unsigned char *local_bdaddr);
/** Chip power control */
void (*set_power)(bt_hc_chip_power_state_t state);
/** Set low power mode wake */
int (*lpm)(bt_hc_low_power_event_t event);
/** Called prior to stack initialization */
void (*preload)(TRANSAC transac);
/** Called post stack initialization */
void (*postload)(TRANSAC transac);
/** Transmit buffer */
int (*transmit_buf)(TRANSAC transac, char *p_buf, int len);
/** Controls HCI logging on/off */
int (*logging)(bt_hc_logging_state_t state, char *p_path, bool save_existing);
/** Closes the interface */
void (*cleanup)( void );
/** sends commands to hc layer (e.g. SCO state) */
int (*tx_cmd)(TRANSAC transac, char *p_buf, int len);
} bt_hc_interface_t;
/*
* External shared lib functions
*/
extern const bt_hc_interface_t* bt_hc_get_interface(void);
#endif /* BT_HCI_LIB_H */

View File

@ -0,0 +1,362 @@
/******************************************************************************
*
* 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.
*
******************************************************************************/
#ifndef BT_VENDOR_LIB_H
#define BT_VENDOR_LIB_H
#include <stdint.h>
#include <sys/cdefs.h>
#include <sys/types.h>
/** Struct types */
/** Typedefs and defines */
/** Vendor specific operations OPCODE */
typedef enum {
/* [operation]
* Power on or off the BT Controller.
* [input param]
* A pointer to int type with content of bt_vendor_power_state_t.
* Typecasting conversion: (int *) param.
* [return]
* 0 - default, don't care.
* [callback]
* None.
*/
BT_VND_OP_POWER_CTRL,
/* [operation]
* Perform any vendor specific initialization or configuration
* on the BT Controller. This is called before stack initialization.
* [input param]
* None.
* [return]
* 0 - default, don't care.
* [callback]
* Must call fwcfg_cb to notify the stack of the completion of vendor
* specific initialization once it has been done.
*/
BT_VND_OP_FW_CFG,
/* [operation]
* Perform any vendor specific SCO/PCM configuration on the BT Controller.
* This is called after stack initialization.
* [input param]
* None.
* [return]
* 0 - default, don't care.
* [callback]
* Must call scocfg_cb to notify the stack of the completion of vendor
* specific SCO configuration once it has been done.
*/
BT_VND_OP_SCO_CFG,
/* [operation]
* Open UART port on where the BT Controller is attached.
* This is called before stack initialization.
* [input param]
* A pointer to int array type for open file descriptors.
* The mapping of HCI channel to fd slot in the int array is given in
* bt_vendor_hci_channels_t.
* And, it requires the vendor lib to fill up the content before returning
* the call.
* Typecasting conversion: (int (*)[]) param.
* [return]
* Numbers of opened file descriptors.
* Valid number:
* 1 - CMD/EVT/ACL-In/ACL-Out via the same fd (e.g. UART)
* 2 - CMD/EVT on one fd, and ACL-In/ACL-Out on the other fd
* 4 - CMD, EVT, ACL-In, ACL-Out are on their individual fd
* [callback]
* None.
*/
BT_VND_OP_USERIAL_OPEN,
/* [operation]
* Close the previously opened UART port.
* [input param]
* None.
* [return]
* 0 - default, don't care.
* [callback]
* None.
*/
BT_VND_OP_USERIAL_CLOSE,
/* [operation]
* Get the LPM idle timeout in milliseconds.
* The stack uses this information to launch a timer delay before it
* attempts to de-assert LPM WAKE signal once downstream HCI packet
* has been delivered.
* [input param]
* A pointer to uint32_t type which is passed in by the stack. And, it
* requires the vendor lib to fill up the content before returning
* the call.
* Typecasting conversion: (uint32_t *) param.
* [return]
* 0 - default, don't care.
* [callback]
* None.
*/
BT_VND_OP_GET_LPM_IDLE_TIMEOUT,
/* [operation]
* Enable or disable LPM mode on BT Controller.
* [input param]
* A pointer to uint8_t type with content of bt_vendor_lpm_mode_t.
* Typecasting conversion: (uint8_t *) param.
* [return]
* 0 - default, don't care.
* [callback]
* Must call lpm_cb to notify the stack of the completion of LPM
* disable/enable process once it has been done.
*/
BT_VND_OP_LPM_SET_MODE,
/* [operation]
* Assert or Deassert LPM WAKE on BT Controller.
* [input param]
* A pointer to uint8_t type with content of bt_vendor_lpm_wake_state_t.
* Typecasting conversion: (uint8_t *) param.
* [return]
* 0 - default, don't care.
* [callback]
* None.
*/
BT_VND_OP_LPM_WAKE_SET_STATE,
/* [operation]
* Perform any vendor specific commands related to audio state changes.
* [input param]
* a pointer to bt_vendor_op_audio_state_t indicating what audio state is
* set.
* [return]
* 0 - default, don't care.
* [callback]
* None.
*/
BT_VND_OP_SET_AUDIO_STATE,
/* [operation]
* The epilog call to the vendor module so that it can perform any
* vendor-specific processes (e.g. send a HCI_RESET to BT Controller)
* before the caller calls for cleanup().
* [input param]
* None.
* [return]
* 0 - default, don't care.
* [callback]
* Must call epilog_cb to notify the stack of the completion of vendor
* specific epilog process once it has been done.
*/
BT_VND_OP_EPILOG,
} bt_vendor_opcode_t;
/** Power on/off control states */
typedef enum {
BT_VND_PWR_OFF,
BT_VND_PWR_ON,
} bt_vendor_power_state_t;
/** Define HCI channel identifier in the file descriptors array
used in BT_VND_OP_USERIAL_OPEN operation.
*/
typedef enum {
CH_CMD, // HCI Command channel
CH_EVT, // HCI Event channel
CH_ACL_OUT, // HCI ACL downstream channel
CH_ACL_IN, // HCI ACL upstream channel
CH_MAX // Total channels
} bt_vendor_hci_channels_t;
/** LPM disable/enable request */
typedef enum {
BT_VND_LPM_DISABLE,
BT_VND_LPM_ENABLE,
} bt_vendor_lpm_mode_t;
/** LPM WAKE set state request */
typedef enum {
BT_VND_LPM_WAKE_ASSERT,
BT_VND_LPM_WAKE_DEASSERT,
} bt_vendor_lpm_wake_state_t;
/** Callback result values */
typedef enum {
BT_VND_OP_RESULT_SUCCESS,
BT_VND_OP_RESULT_FAIL,
} bt_vendor_op_result_t;
/** audio (SCO) state changes triggering VS commands for configuration */
typedef struct {
uint16_t handle;
uint16_t peer_codec;
uint16_t state;
} bt_vendor_op_audio_state_t;
/*
* Bluetooth Host/Controller Vendor callback structure.
*/
/* vendor initialization/configuration callback */
typedef void (*cfg_result_cb)(bt_vendor_op_result_t result);
/* datapath buffer allocation callback (callout)
*
* Vendor lib needs to request a buffer through the alloc callout function
* from HCI lib if the buffer is for constructing a HCI Command packet which
* will be sent through xmit_cb to BT Controller.
*
* For each buffer allocation, the requested size needs to be big enough to
* accommodate the below header plus a complete HCI packet --
* typedef struct
* {
* uint16_t event;
* uint16_t len;
* uint16_t offset;
* uint16_t layer_specific;
* } HC_BT_HDR;
*
* HCI lib returns a pointer to the buffer where Vendor lib should use to
* construct a HCI command packet as below format:
*
* --------------------------------------------
* | HC_BT_HDR | HCI command |
* --------------------------------------------
* where
* HC_BT_HDR.event = 0x2000;
* HC_BT_HDR.len = Length of HCI command;
* HC_BT_HDR.offset = 0;
* HC_BT_HDR.layer_specific = 0;
*
* For example, a HCI_RESET Command will be formed as
* ------------------------
* | HC_BT_HDR |03|0c|00|
* ------------------------
* with
* HC_BT_HDR.event = 0x2000;
* HC_BT_HDR.len = 3;
* HC_BT_HDR.offset = 0;
* HC_BT_HDR.layer_specific = 0;
*/
typedef void* (*malloc_cb)(int size);
/* datapath buffer deallocation callback (callout) */
typedef void (*mdealloc_cb)(void *p_buf);
/* define callback of the cmd_xmit_cb
*
* The callback function which HCI lib will call with the return of command
* complete packet. Vendor lib is responsible for releasing the buffer passed
* in at the p_mem parameter by calling dealloc callout function.
*/
typedef void (*tINT_CMD_CBACK)(void *p_mem);
/* hci command packet transmit callback (callout)
*
* Vendor lib calls xmit_cb callout function in order to send a HCI Command
* packet to BT Controller. The buffer carrying HCI Command packet content
* needs to be first allocated through the alloc callout function.
* HCI lib will release the buffer for Vendor lib once it has delivered the
* packet content to BT Controller.
*
* Vendor lib needs also provide a callback function (p_cback) which HCI lib
* will call with the return of command complete packet.
*
* The opcode parameter gives the HCI OpCode (combination of OGF and OCF) of
* HCI Command packet. For example, opcode = 0x0c03 for the HCI_RESET command
* packet.
*/
typedef uint8_t (*cmd_xmit_cb)(uint16_t opcode, void *p_buf, tINT_CMD_CBACK p_cback);
typedef struct {
/** set to sizeof(bt_vendor_callbacks_t) */
size_t size;
/*
* Callback and callout functions have implemented in HCI libray
* (libbt-hci.so).
*/
/* notifies caller result of firmware configuration request */
cfg_result_cb fwcfg_cb;
/* notifies caller result of sco configuration request */
cfg_result_cb scocfg_cb;
/* notifies caller result of lpm enable/disable */
cfg_result_cb lpm_cb;
/* notifies the result of codec setting */
cfg_result_cb audio_state_cb;
/* buffer allocation request */
malloc_cb alloc;
/* buffer deallocation request */
mdealloc_cb dealloc;
/* hci command packet transmit request */
cmd_xmit_cb xmit_cb;
/* notifies caller completion of epilog process */
cfg_result_cb epilog_cb;
} bt_vendor_callbacks_t;
/*
* Bluetooth Host/Controller VENDOR Interface
*/
typedef struct {
/** Set to sizeof(bt_vndor_interface_t) */
size_t size;
/*
* Functions need to be implemented in Vendor libray (libbt-vendor.so).
*/
/**
* Caller will open the interface and pass in the callback routines
* to the implemenation of this interface.
*/
int (*init)(const bt_vendor_callbacks_t* p_cb, unsigned char *local_bdaddr);
/** Vendor specific operations */
int (*op)(bt_vendor_opcode_t opcode, void *param);
/** Closes the interface */
void (*cleanup)(void);
} bt_vendor_interface_t;
/*
* External shared lib functions/data
*/
/* Entry point of DLib --
* Vendor library needs to implement the body of bt_vendor_interface_t
* structure and uses the below name as the variable name. HCI library
* will use this symbol name to get address of the object through the
* dlsym call.
*/
extern const bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE;
#endif /* BT_VENDOR_LIB_H */

View File

@ -0,0 +1,151 @@
#define LOG_TAG "libbt_vendor_mtk"
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
#include <utils/Log.h>
#include <pthread.h>
#include <fcntl.h>
#include <errno.h>
#include <bt_vendor_lib.h>
#include <bt_hci_lib.h>
#include <bt_hci_bdroid.h>
/**
* TODO: check/fix this value. does this make sense for MTK? It is taken from TI
* Low power mode: default transport idle timer
*/
#define WL_DEFAULT_LPM_IDLE_TIMEOUT 200
static void *mtklib_handle = NULL;
typedef int (*ENABLE)(int flag, void *func_cb);
typedef int (*DISABLE)(int bt_fd);
unsigned int hci_tty_fd = -1;
ENABLE mtk_bt_enable = NULL;
DISABLE mtk_bt_disable = NULL;
bt_vendor_callbacks_t *bt_vendor_cbacks = NULL;
void hw_config_cback(HC_BT_HDR *p_evt_buf);
/*******************************************************************************
*
* Function hw_config_cback
*
* Description Callback function for controller configuration
*
* Returns None
*
* *******************************************************************************/
void hw_config_cback(HC_BT_HDR *p_evt_buf)
{
ALOGI("hw_config_cback");
}
int mtk_init(const bt_vendor_callbacks_t* p_cb, unsigned char *local_bdaddr) {
const char *dlerrors;
ALOGI("libbt-vendor init for MTK blob");
if (p_cb == NULL)
{
ALOGE("init failed with no user callbacks!");
return BT_HC_STATUS_FAIL;
}
bt_vendor_cbacks = (bt_vendor_callbacks_t *) p_cb;
dlerror();
mtklib_handle = dlopen("libbluetoothdrv.so", RTLD_LAZY);
mtk_bt_enable = dlsym(mtklib_handle, "mtk_bt_enable");
mtk_bt_disable = dlsym(mtklib_handle, "mtk_bt_disable");
if ((dlerrors = dlerror()) != NULL){
ALOGE("Errors while opening symbols from mtk blob");
dlclose(mtklib_handle);
}
return 0;
}
void mtk_cleanup(void) {
ALOGI("vendor cleanup");
bt_vendor_cbacks = NULL;
if (mtklib_handle) {
dlclose(mtklib_handle);
}
}
int mtk_open(void **param) {
int (*fd_array)[] = (int (*)[]) param;
int fd, idx;
fd = mtk_bt_enable(0, NULL);
if (fd < 0) {
ALOGE("Can't open mtk fd");
return -1;
}
for (idx = 0; idx < CH_MAX; idx++)
(*fd_array)[idx] = fd;
hci_tty_fd = fd; /* for userial_close op */
return 1; /* CMD/EVT/ACL on same fd */
}
int mtk_close() {
if (hci_tty_fd == (unsigned int) -1)
return -1;
return mtk_bt_disable(hci_tty_fd);
}
int mtk_op(bt_vendor_opcode_t opcode, void **param) {
int ret = 0;
switch(opcode)
{
case BT_VND_OP_POWER_CTRL:
break;
case BT_VND_OP_SCO_CFG:
break;
case BT_VND_OP_GET_LPM_IDLE_TIMEOUT:
*((uint32_t *) param) = WL_DEFAULT_LPM_IDLE_TIMEOUT;
break;
case BT_VND_OP_LPM_SET_MODE:
break;
case BT_VND_OP_LPM_WAKE_SET_STATE:
break;
case BT_VND_OP_USERIAL_OPEN:
ret = mtk_open(param);
break;
case BT_VND_OP_USERIAL_CLOSE:
ret = mtk_close();
break;
/* Since new stack expects fwcfg_cb we are returning SUCCESS here
* in actual, firmware download is already happened when /dev/hci_tty
* opened.
*/
case BT_VND_OP_FW_CFG:
bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_SUCCESS);
break;
case BT_VND_OP_EPILOG:
bt_vendor_cbacks->epilog_cb(BT_VND_OP_RESULT_SUCCESS);
break;
default:
ALOGW("Unknown opcode: %d", opcode);
break;
}
return ret;
}
const bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE = {
.init = mtk_init,
.op = mtk_op,
.cleanup = mtk_cleanup,
};
int main()
{
return 0;
}

View File

@ -52,6 +52,9 @@ PRODUCT_PACKAGES += \
gps.mt6753 \
libcurl
# BT
PRODUCT_PACKAGES += libbt-vendor
# Audio
PRODUCT_PACKAGES += \
audio.a2dp.default \