pinebuds/services/bt_profiles_enhanced/inc/btm.h

410 lines
14 KiB
C

/***************************************************************************
*
* Copyright 2015-2019 BES.
* All rights reserved. All unpublished rights reserved.
*
* No part of this work may be used or reproduced in any form or by any
* means, or stored in a database or retrieval system, without prior written
* permission of BES.
*
* Use of this work is governed by a license granted by BES.
* This work contains confidential and proprietary information of
* BES. which is protected by copyright, trade secret,
* trademark and other intellectual property rights.
*
****************************************************************************/
#ifndef __BTM_H__
#define __BTM_H__
#include "bt_sys_cfg.h"
#include "btlib_type.h"
#include "bt_co_list.h"
#include "btm_devicedb.h"
#include "btm_security.h"
#include "btm_i.h"
struct btm_device_mode_t
{
enum device_mode_dis_enum discoverable;
enum device_mode_conn_enum connectable;
};
struct btm_inquiry_result_item_t
{
struct list_node list;
struct bdaddr_t remote;
uint16 timeout_count; /*=0: disable , count down to 1: timeout happen*/
/* received in inquiry result */
uint8 page_scan_repetition_mode;
uint8 page_scan_period_mode;
uint8 class_dev[3];
uint16 clk_off;
};
typedef uint8 connection_role;
#define BCR_MASTER 0x00
#define BCR_SLAVE 0x01
#define BCR_ANY 0x02
#define GAP_INVALID_CONIDX 0xFF
#define BTM_MAX_LINK_NUMS 0x02
#define BTM_MAX_xSCO_NUMS 0x02
#define BTM_FEAT_3SLOT_PACKETS 0,0,0x01
#define BTM_FEAT_5SLOT_PACKETS 0,0,0x02
#define BTM_FEAT_ENCRYPTION 0,0,0x04
#define BTM_FEAT_SLOT_OFFSET 0,0,0x08
#define BTM_FEAT_TIMING_ACC 0,0,0x10
#define BTM_FEAT_ROLE_SWITCH 0,0,0x20
#define BTM_FEAT_HOLD_MODE 0,0,0x40
#define BTM_FEAT_SNIFF_MODE 0,0,0x80
#define BTM_FEAT_PWR_CTRL_REQ 0,1,0x02
#define BTM_FEAT_CQDDR 0,1,0x04
#define BTM_FEAT_SCO_LINK 0,1,0x08
#define BTM_FEAT_HV2_PACKETS 0,1,0x10
#define BTM_FEAT_HV3_PACKETS 0,1,0x20
#define BTM_FEAT_ULAW_SYNC_DATA 0,1,0x40
#define BTM_FEAT_ALAW_SYNC_DATA 0,1,0x80
#define BTM_FEAT_CVSD_SYNC_DATA 0,2,0x01
#define BTM_FEAT_PAGE_PARA_NEGO 0,2,0x02
#define BTM_FEAT_PWR_CTRL 0,2,0x04
#define BTM_FEAT_TRANS_SYNC_DATA 0,2,0x08
#define BTM_FEAT_FLOW_CTRL_LST_BIT 0,2,0x10
#define BTM_FEAT_FLOW_CTRL_MID_BIT 0,2,0x20
#define BTM_FEAT_FLOW_CTRL_MST_BIT 0,2,0x40
#define BTM_FEAT_BROADCAST_ENCRYT 0,2,0x80
#define BTM_FEAT_EDR_2M_MODE 0,3,0x02
#define BTM_FEAT_EDR_3M_MODE 0,3,0x04
#define BTM_FEAT_ENHANCED_ISCAN 0,3,0x08
#define BTM_FEAT_INTERLACED_ISCAN 0,3,0x10
#define BTM_FEAT_INTERLACED_PSCAN 0,3,0x20
#define BTM_FEAT_RSSI_WITH_INQRES 0,3,0x40
#define BTM_FEAT_ESCO_LINK 0,3,0x80
#define BTM_FEAT_EV4_PACKETS 0,4,0x01
#define BTM_FEAT_EV5_PACKETS 0,4,0x02
#define BTM_FEAT_AFH_CAPAB_SLAVE 0,4,0x08
#define BTM_FEAT_AFH_CLASS_SLAVE 0,4,0x10
#define BTM_FEAT_BREDR_NOT_SUPP 0,4,0x20
#define BTM_FEAT_LE_CTRL_SUPP 0,4,0x40
#define BTM_FEAT_3SLOT_EDR_ACL 0,4,0x80
#define BTM_FEAT_5SLOT_EDR_ACL 0,5,0x01
#define BTM_FEAT_SNIFF_SUBRATING 0,5,0x02
#define BTM_FEAT_PAUSE_ENCRYPT 0,5,0x04
#define BTM_FEAT_AFH_CAPAB_MASTER 0,5,0x08
#define BTM_FEAT_AFH_CLASS_MASTER 0,5,0x10
#define BTM_FEAT_EDR_ESCO_2M_MODE 0,5,0x20
#define BTM_FEAT_EDR_ESCO_3M_MODE 0,5,0x40
#define BTM_FEAT_3SLOT_EDR_ESCO 0,5,0x80
#define BTM_FEAT_EXTENDED_INQRES 0,6,0x01
#define BTM_FEAT_SIMU_LE_BREDR_CTRL 0,6,0x02
#define BTM_FEAT_SECURE_SIMPLE_PAIR 0,6,0x08
#define BTM_FEAT_ENCAPSULATED_PDU 0,6,0x10
#define BTM_FEAT_ERR_DATA_REPORT 0,6,0x20
#define BTM_FEAT_NONFLUSH_PBF 0,6,0x40
#define BTM_FEAT_LINKSUPTO_CHANGE 0,7,0x01
#define BTM_FEAT_INQ_TX_PWR_LEVEL 0,7,0x02
#define BTM_FEAT_ENHANCED_PWR_CTRL 0,7,0x04
#define BTM_FEAT_EXTENDED_FEATURES 0,7,0x80
#define BTM_FEAT_SSP_HOST_SUPP 1,0,0x01
#define BTM_FEAT_LE_HOST_SUPP 1,0,0x02
#define BTM_FEAT_SIMU_LE_BREDR_HOST 1,0,0x04
#define BTM_FEAT_SEC_CONN_HOST_SUPP 1,0,0x08
#define BTM_FEAT_SLAVE_BROAD_MSTOP 2,0,0x01
#define BTM_FEAT_SLAVE_BROAD_SLVOP 2,0,0x02
#define BTM_FEAT_SYNCHRON_TRAIN 2,0,0x04
#define BTM_FEAT_SYNCHRON_SCAN 2,0,0x08
#define BTM_FEAT_INQRES_NOTIFY 2,0,0x10
#define BTM_FEAT_GENERAL_INTERSCAN 2,0,0x20
#define BTM_FEAT_COARSE_CLOCK_ADJ 2,0,0x40
#define BTM_FEAT_SEC_CONN_CTRL_SUPP 2,1,0x01
#define BTM_FEAT_PING 2,1,0x02
#define BTM_FEAT_TRAIN_NUDGING 2,1,0x08
#define BTM_FEAT_SLOT_AVAIL_MASK 2,1,0x10
#define BTM_MAX_FEATURE_PAGE (3)
struct btm_feature_t
{
uint8 max_page;
uint8 feature[8];
};
#define BTM_AUTH_WAIT_CMPL 0x01
#define BTM_AUTH_WAIT_MSS 0x02
#define REMOTE_VERSION_LEN 5
struct btm_conn_item_t
{
struct list_node list;
struct list_node sco_conn_list;
struct pp_buff_head tx_queue;
struct pp_buff * ppb_recv;
struct bdaddr_t remote;
void *cmgr_handler;
uint16 conn_handle;
uint8 used;
/*1: positive connet to the remote or 0: negtive be connected*/
uint8 positive;
/* received in inquiry result */
uint8 page_scan_repetition_mode;
uint16 clk_off;
#if CFG_BTM_DISC_ACL_IN_BTM_TIMER==1
uint8 disconn_flag; /*if this is need to disconn*/
uint8 disconn_count; /*to undercount to disconn*/
#endif
uint8 discReason_saved;
uint8 discReason;
uint8 lowpower_flag; /*if is lowpower. decided to buffer tx data*/
uint8 lowpower_count; /*to count when to enter lowpower*/
uint8 sniff_count; /*to count how many sniff req sent*/
uint8 role_switch_pending;
uint8 authen_enable_flag;
uint8 authen_pending;
uint8 encry_enable_flag;/*tell if the entryption is enabled in this acl conn*/
uint8 encry_need_flag;/*tell if the entryption is need*/
connection_role role;
uint8 state;
uint8 mode;
uint8 authState;
uint8 io_cap;
uint8 oob_present;
uint8 authen_requirement;
uint8 conn_dev_idx;
uint16 rx_complete_count; /* Host HCI RX packets complete number, controller to host flow control */
uint8 remote_version[5];
struct btm_feature_t remote_feature[BTM_MAX_FEATURE_PAGE];
#if (BTM_HCI_HOST_FLOW_CONTROL_ENABLE == 1)
uint8 fc_bt_tx_acl_unconfirmed;
#endif
#if (CFG_BTM_USE_INPLACE_BUFFER_FOR_ACL==1)
uint8 *btm_acl_inplace_buff;
#endif
};
#define IS_REMOTE_FEAT_SUPPORT(conn, FEAT_MASK) \
btm_is_remote_feature_support(conn, FEAT_MASK)
struct btm_sco_conn_item_t
{
struct list_node list;
struct btm_conn_item_t *conn; /*acl connection*/
uint16 conn_handle;
uint8 link_type; /* HCI_LINK_TYPE_ESCO or HCI_LINK_TYPE_SCO */
enum conn_sco_stat_enum status;
connection_role role;
uint8 index;
uint8 used;
};
enum btm_stack_state {
BTM_STACK_Initializing = 0,
BTM_STACK_Ready = 1,
};
enum btm_stack_init_sub_state {
BTM_INIT_ST_RESET = 0,
BTM_INIT_ST_SET_VOICE_SETTTING,
BTM_INIT_ST_READ_BUFFER_SIZE,
BTM_INIT_ST_LE_READ_BUFFER_SIZE,
BTM_INIT_ST_HOST_BUFFER_SIZE,
BTM_INIT_ST_SET_HCITOHOST_FLOW_CONTROL,
BTM_INIT_ST_WRITE_PAGE_TIEMOUT,
BTM_INIT_ST_READ_PAGE_TIMEOUT,
BTM_INIT_ST_SET_BLE_ADDRESS,
BTM_INIT_ST_SET_BD_ADDRESS,
BTM_INIT_ST_SET_EVENT_MASK,
BTM_INIT_ST_SET_BLE_EVENT_MASK,
BTM_INIT_ST_READ_LOCAL_VER_INFO,
BTM_INIT_ST_READ_LOCAL_SUP_COMMANDS,
BTM_INIT_ST_READ_LOCAL_FEATURES,
BTM_INIT_ST_READ_LOCAL_EXT_FEATURES,
BTM_INIT_ST_READ_LOCAL_EXT_FEATURES_1,
BTM_INIT_ST_READ_LOCAL_EXT_FEATURES_2,
BTM_INIT_ST_READ_BD_ADDRESS,
BTM_INIT_ST_READ_INQUIRY_MODE,
BTM_INIT_ST_READ_DEF_ERR_DATA_REPORTING,
BTM_INIT_ST_WRITE_SAMPLE_PAIRING_MODE,
BTM_INIT_ST_WRITE_CLASS_OF_DEVICE,
BTM_INIT_ST_WRITE_LOCAL_NAME,
BTM_INIT_ST_WRITE_SYNC_CONFIG,
BTM_INIT_ST_WRITE_DEF_ERR_DATA_REPORTING,
BTM_INIT_ST_WRITE_DEFAULT_LP_SETTINGS,
BTM_INIT_ST_WRITE_PAGESCAN_ACTIVITY,
BTM_INIT_ST_WRITE_INQUIRYSCAN_ACTIVITY,
BTM_INIT_ST_WRITE_INQUIRYSCAN_TYPE,
BTM_INIT_ST_WRITE_PAGESCAN_TYPE,
BTM_INIT_ST_NUM,
};
struct btm_sync_conn_param {
uint16 max_latency;
uint16 packet_type;
uint16 voice_setting;
uint8 retrans_effort;
uint32 receive_bandwidth;
uint32 transmit_bandwidth;
};
struct btm_ctrl_t {
enum btm_stack_state stack_state;
enum btm_stack_init_sub_state init_sub_state;
uint16 init_sub_state_opcode;
uint8 pairing_flag; /*tell whether the device in pairing state, 1:yes, 0:no*/
uint32 pairing_timeout;
void (*btm_pairing_notify_callback)(enum btm_pairing_event event,void *pdata);
uint8 security_waitfor_linkkey_reply;
struct bdaddr_t security_waitfor_linkkey_reply_bdaddr;
// local
uint8 bt_version;
uint8 bt_features[8];
uint8 bt_ext_features[2][8];
// esco
uint8 sco_param_select;
uint8 sco_default_param_select;
struct btm_sync_conn_param sco_custom_param;
// security
uint8 security_bonding_mode;
uint8 security_auth_requirements;
uint8 security_io_capability;
uint8 security_oob_present;
#if (BTM_HCI_HOST_FLOW_CONTROL_ENABLE == 1)
uint16 fc_bt_tx_cmd_left;
uint8 fc_bt_tx_acl_left;
uint8 fc_bt_tx_acl_total;
uint8 fc_bt_rx_acl_left;
#ifdef __IAG_BLE_INCLUDE__
uint8 fc_ble_tx_acl_left;
uint8 fc_ble_tx_acl_total;
uint8 fc_ble_share_bt_tx_packet;
uint8 bleAclRxPacketsLeft;
uint8 bleFlags;
#endif
#endif /* BTM_HCI_HOST_FLOW_CONTROL_ENABLE */
void (*btm_event_report)(uint16 evt_id, void* pdata);
void (*btm_cmgr_event_report)(uint16 evt_id, void* conn);
bool conn_req_cb_enable;
uint8 con_num;
uint8 sync_cmd_busy;
hci_buff_t *sync_cmd_curr;
};
#define BTM(x) btm_ctrl.x
struct btm_conn_env_t {
struct btm_conn_item_t *conn_item;
};
struct btm_pts_ctrl_t{
uint8_t pts_mode ;
uint8_t pts_accept ;
};
#if defined(__cplusplus)
extern "C" {
#endif
extern struct btm_pts_ctrl_t btm_pts_ctrl;
extern struct btm_ctrl_t btm_ctrl;
struct btm_inquiry_result_item_t *btm_inquiry_result_search ( struct bdaddr_t *bdaddr );
struct btm_inquiry_result_item_t *btm_inquiry_result_find_or_add ( struct bdaddr_t *bdaddr );
struct btm_conn_item_t *btm_conn_add_new ( struct bdaddr_t *bdaddr );
struct btm_conn_item_t *btm_conn_search ( struct bdaddr_t *bdaddr );
uint16 btm_conn_find_scohdl_by_connhdl(uint16 conn_handle);
struct btm_conn_item_t *btm_conn_search_linkup ( struct bdaddr_t *bdaddr );
struct btm_conn_item_t *btm_conn_find_or_add ( struct bdaddr_t *bdaddr );
struct btm_sco_conn_item_t *btm_conn_sco_find_or_add( struct btm_conn_item_t *conn);
struct btm_conn_item_t *btm_conn_acl_search_by_handle( uint16 conn_handle);
struct btm_sco_conn_item_t *btm_conn_sco_search_by_handle( uint16 conn_handle);
bool btm_is_remote_feature_support(struct btm_conn_item_t* conn, uint8 page, uint8 i, uint8 mask);
void btm_conn_disconnect_process(uint16 handle, uint8 status, uint8 reason);
int8 btlib_hcicmd_read_remote_name(struct bdaddr_t *bdaddr, uint8 page_scan_repetition_mode, uint16 clk_off);
void btm_sco_conn_status_notify (struct bdaddr_t *remote_bdaddr, enum conn_sco_stat_enum sco_conn_notify_type);
void btm_conn_acl_process_tx(struct btm_conn_item_t *conn);
int8 btm_conn_acl_send_ppb_done(uint16 conn_handle, struct pp_buff *ppb);
void btm_register_event_report( void (*evt_cb)(uint16 evt_id, void *pdata));
void btm_register_cmgr_event_report(void (*evt_cb)(uint16 evt_id, void* conn));
extern uint8 gapc_get_conidx(uint16 conhdl);
extern void gapc_inc_rx_packet_count(uint8 idx,uint8 inc_count);
extern uint8 gapc_get_rx_packet_counnt(uint8 idx);
extern uint8 gapc_get_conn_handle(uint8 idx);
extern void gapc_rx_packet_count_reset(uint8 idx);
bool btm_conn_need_authentication(struct btm_conn_item_t *conn);
uint8 btm_conn_allocate_dev_idx(void);
void btm_conn_free_dev_idx(uint8 idx);
void btm_conn_set_item_by_idx(struct btm_conn_item_t *p_conn_item, uint8 dev_idx);
struct l2cap_conn *l2cap_conn_search(struct bdaddr_t *bdaddr);
struct l2cap_conn *l2cap_conn_add_new(struct bdaddr_t *bdaddr);
struct bdaddr_t *btm_get_address_from_rem_dev(struct btm_conn_item_t *rem_dev);
struct btm_conn_item_t * btm_conn_get_item_by_idx(uint8 dev_idx);
uint8 btm_get_bt_version(void);
uint8 btm_get_bt_features(uint8 index);
void btm_print_statistic(void);
void btm_conn_delete_free(struct btm_conn_item_t *conn);
struct btm_sco_conn_item_t *btm_conn_sco_find( struct btm_conn_item_t *conn);
struct btm_sco_conn_item_t *btm_sco_malloc_add( struct btm_conn_item_t *conn);
void btm_sco_delete_free(struct btm_sco_conn_item_t *sco);
int8 btm_get_pending_hci_cmd(uint16 opcode, struct hci_cmd_packet **cmd);
bool btm_acl_role_switch_pending(uint16_t conn_handle);
#if (CFG_BTM_USE_INPLACE_BUFFER_FOR_ACL==1)
void btm_inplacebuff_init(void);
#endif
#if (BTM_HCI_HOST_FLOW_CONTROL_ENABLE == 1)
void btm_fc_init(void);
// bt : host to controller
void btm_fc_bt_host_to_controller_cmd_tx_left_update(uint16 v);
void btm_fc_bt_host_to_controller_cmd_tx_left_dec(uint8 v);
int8 btm_fc_bt_host_to_controller_cmd_can_send(void);
void btm_fc_bt_host_to_controller_acl_unconfirmed_inc(uint16 handle, uint8 v);
void btm_fc_bt_host_to_controller_acl_unconfirmed_dec(uint16 handle, uint8 v);
void btm_fc_bt_host_to_controller_acl_counter_inc(uint8 v);
void btm_fc_bt_host_to_controller_acl_counter_dec(uint8 v);
int8 btm_fc_bt_host_to_controller_can_send(void);
int8 btm_fc_bt_hci_buff_list_pop(uint8 type, hci_buff_t **buff);
#if defined(__IAG_BLE_INCLUDE__)
void bleUpdateFlowControl(uint16 handle);
void BleHciSendCompletedPackets(BOOL TimerFired, BOOL isForceSend);
bool bridge_get_ble_handle(uint16 connHandle);
BOOL btm_ble_conn_is_up(uint16 handle);
// bt : host to controller
void btm_fc_ble_host_to_controller_acl_unconfirmed_inc(uint16 handle, uint8 v);
void btm_fc_ble_host_to_controller_acl_unconfirmed_dec(uint16 handle, uint8 v);
void btm_fc_ble_host_to_controller_acl_counter_inc(uint8 v);
void btm_fc_ble_host_to_controller_acl_counter_dec(uint8 v);
int8 btm_fc_ble_host_to_controller_can_send(void);
void btm_fc_ble_host_to_controller_flow_check(void);
#endif /* __IAG_BLE_INCLUDE__ */
// bt : controller to host
void btm_fc_bt_controller_to_host_acl_counter_inc(uint8 v);
void btm_fc_bt_controller_to_host_acl_counter_dec(uint8 v);
void btm_fc_bt_update_host_num_complete_pkts(uint16 handle, uint8 inc, bool right_now);
void btm_fc_bt_send_host_num_completed_pkts(void *arg);
void btm_fc_print_statistic(void);
#endif /* BTM_HCI_HOST_FLOW_CONTROL_ENABLE */
uint8_t btm_sco_conn_count();
uint8_t btm_get_sco_max_number();
void btm_set_sco_max_number(uint8_t num);
#ifdef __cplusplus
}
#endif
#endif /* __BTM_H__ */