/****************************************************************************** * * 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 <stdbool.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, /* [operation] * Call to the vendor module so that it can perform all vendor-specific * operations to start offloading a2dp media encode & tx. * [input param] * pointer to bt_vendor_op_a2dp_offload_start_t containing elements * required for VND FW to setup a2dp offload. * [return] * 0 - default, dont care. * [callback] * Must call a2dp_offload_start_cb to notify the stack of the * completion of vendor specific setup process once it has been done. */ BT_VND_OP_A2DP_OFFLOAD_START, /* [operation] * Call to the vendor module so that it can perform all vendor-specific * operations to suspend offloading a2dp media encode & tx. * [input param] * pointer to bt_vendor_op_a2dp_offload_t containing elements * required for VND FW to setup a2dp offload. * [return] * 0 - default, dont care. * [callback] * Must call a2dp_offload_cb to notify the stack of the * completion of vendor specific setup process once it has been done. */ BT_VND_OP_A2DP_OFFLOAD_STOP, } 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; bool use_enhanced_sco; } 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 void (*cfg_a2dp_cb)(bt_vendor_op_result_t result, bt_vendor_opcode_t op, uint8_t bta_av_handle); 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; /* notifies status of a2dp offload cmd's */ cfg_a2dp_cb a2dp_offload_cb; } bt_vendor_callbacks_t; /** A2DP offload request */ typedef struct { uint8_t bta_av_handle; /* BTA_AV Handle for callbacks */ uint16_t xmit_quota; /* Total ACL quota for light stack */ uint16_t acl_data_size; /* Max ACL data size across HCI transport */ uint16_t stream_mtu; uint16_t local_cid; uint16_t remote_cid; uint16_t lm_handle; uint8_t is_flushable; /* true if flushable channel */ uint32_t stream_source; uint8_t codec_info[10]; /* Codec capabilities array */ } bt_vendor_op_a2dp_offload_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 */