mcu_ab568x/userboot240328/app/platform/libs/api_btstack.h
2025-05-30 18:03:10 +08:00

465 lines
19 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef _API_BTSTACK_H
#define _API_BTSTACK_H
//工作模式
#define MODE_NORMAL 0
#define MODE_CBT_TEST 1
#define MODE_FCC_TEST 2
#define MODE_BQB_RF 3
#define MODE_BQB_PROFILE 4
//蓝牙功能
#define PROF_A2DP 0x0007 //蓝牙音乐功能
#define PROF_HID 0x0018 //蓝牙键盘功能
#define PROF_HFP 0x0060 //蓝牙通话功能
#define PROF_SPP 0x0080 //蓝牙串口功能
#define PROF_PBAP 0x0100 //蓝牙电话本功能
#define PROF_HSP 0x0200
#define PROF_MAP 0x0400 //蓝牙短息功能
//蓝牙特性
#define HFP_BAT_REPORT 0x01 //是否支持手机电量显示
#define HFP_3WAY_CALL 0x02 //是否支持三通电话
#define HFP_INBAND_RING_RONE 0x04 //是否支持手机来电铃声
#define HFP_CALL_PRIVATE 0x08 //是否打开强制私密接听
#define HFP_SIRI_CMD 0x10 //是否打开siri控制命令
#define HFP_EC_AND_NR 0x20 //是否打开手机端回音和降噪
#define HFP_RING_NUMBER_EN 0x40 //是否支持来电报号
#define A2DP_VOL_CTRL 0x01 //是否支持手机音量控制同步
#define A2DP_IOS_PLAY_STATUS 0x02 //是否支持IOS手机播放状态同步注意打开后微信小视频会无声蓝牙后台建议打开
#define A2DP_ANDROID_PLAY_STATUS 0x04 //是否支持ANDROID手机播放状态同步
#define A2DP_RESTORE_PLAYING 0x08 //是否支持掉线回连后恢复播放
#define A2DP_AVDTP_DELAY_REPORT 0x10 //是否支持AVDTP delay report功能
//蓝牙编解码
#define CODEC_SBC 0x01
#define CODEC_AAC 0x02
#define CODEC_MSBC 0x04
#define CODEC_PLC 0x08
//蓝牙状态
enum {
BT_STA_OFF, //蓝牙模块已关闭
BT_STA_INITING, //初始化中
BT_STA_IDLE, //蓝牙模块打开,未连接
BT_STA_SCANNING, //扫描中
BT_STA_DISCONNECTING, //断开中
BT_STA_CONNECTING, //连接中
BT_STA_CONNECTED, //已连接
BT_STA_PLAYING, //播放
BT_STA_INCOMING, //来电响铃
BT_STA_OUTGOING, //正在呼出
BT_STA_INCALL, //通话中
BT_STA_OTA, //OTA升级中
};
//蓝牙通知
enum {
BT_NOTICE_INIT_FINISH, //蓝牙初始化完成
};
//BLE通知
enum {
BLE_NOTICE_INIT_FINISH, //蓝牙初始化完成
BLE_NOTICE_CONNECTED, //BLE连接成功
BLE_NOTICE_DISCONNECT, //BLE连接丢失param[0]=reason
BLE_NOTICE_DATA_LEN_CHANGE,
};
//控制消息
enum {
BT_CTL_OFF = 0, //关闭蓝牙
BT_CTL_ON, //打开蓝牙
BT_CTL_MAX,
};
//BLE消息
enum {
BLE_ADV_ENABLE = 0, //打开广播
BLE_ADV_DISABLE, //关闭广播
BLE_SET_ADV_INTV, //设置广播间隔
BLE_SET_ADV_DATA, //设置广播数据
BLE_SET_SCAN_RSP_DATA,
BLE_UPDATE_CONN_PARAM, //更新连接参数
BLE_SEND_DATA, //发送数据
BLE_SM_REQ, //发起加密请求
BLE_EXCHANGE_MTU_REQ,
BLE_DISCONNECT, //断开连接
};
//蓝牙消息
enum bt_msg_t {
BT_MSG_CTRL = 0, //蓝牙控制消息
BT_MSG_BLE,
BT_MSG_MAX,
};
//LE Addr Type, public or random(static or non resolvable or resolvable)
enum {
GAP_RANDOM_ADDRESS_TYPE_OFF = 0, //Public
GAP_RANDOM_ADDRESS_TYPE_STATIC,
GAP_RANDOM_ADDRESS_NON_RESOLVABLE,
GAP_RANDOM_ADDRESS_RESOLVABLE,
};
//LE状态
enum {
LE_STA_STANDBY,
LE_STA_ADVERTISING, //正在广播
LE_STA_CONNECTION, //已连接
};
//LE GATT 服务相关
/**
BLE GATTS ERR return
*/
#define BLE_GATTS_SUCCESS 0x00
#define BLE_GATTS_SRVC_TYPE_ERR 0x01
#define BLE_GATTS_SRVC_RULES_ERR 0x02
#define BLE_GATTS_SRVC_PROPS_ERR 0x03
#define BLE_GATTS_SRVC_ATT_FULL_ERR 0x04
#define BLE_GATTS_SRVC_PROFILE_FULL_ERR 0x05
/**
att property flag
*/
#define ATT_BROADCAST 0x01
#define ATT_READ 0x02
#define ATT_WRITE_WITHOUT_RESPONSE 0x04
#define ATT_WRITE 0x08
#define ATT_NOTIFY 0x10
#define ATT_INDICATE 0x20
#define ATT_AUTHENTICATED_SIGNED_WRITE 0x40
#define ATT_EXTENDED_PROPERTIES 0x80
#define ATT_DYNAMIC 0x100
#define ATT_UUID128 0x200
#define ATT_AUTHENTICATION_REQUIRED 0x400
#define ATT_AUTHORIZATION_REQUIRED 0x800
/**
define group GATT Server Service Types
*/
typedef enum {
BLE_GATTS_SRVC_TYPE_PRIMARY = 0x00, //Primary Service
BLE_GATTS_SRVC_TYPE_SEVONDARY= 0x01, //Secondary Service
BLE_GATTS_SRVC_TYPE_INCLUDE = 0x02, //include Type
} ble_gatts_service_type;
/**
define group GATT Server UUID Types
*/
typedef enum {
BLE_GATTS_UUID_TYPE_16BIT = 0x00, //UUID 16BIT
BLE_GATTS_UUID_TYPE_128BIT = 0x01, //UUID 128BIT
} ble_gatts_uuid_type;
/**
define GATT handler callback
con_handle: connect handle
handle : attribute handle
flag : call back flag
*/
#define ATT_CB_FALG_OFFSET (0xffff)
#define ATT_CB_FALG_DIR_WRITE (0x10000)
typedef int (*ble_gatt_callback_func)(uint16_t con_handle, uint16_t handle, uint32_t flag, uint8_t *ptr, uint16_t len);
/**
define GATT service base
*/
typedef struct gatts_service_base{
uint16_t handle;
} gatts_service_base_st;
/**
define GATT service uuid
*/
typedef struct gatts_uuid_base{
uint16_t props;
uint8_t type;
const uint8_t *uuid;
} gatts_uuid_base_st;
/**
define GATT service call back info
*/
typedef struct {
uint16_t client_config; // att config, 1:notify enable; 2:indicate enable;
uint16_t value_len;
ble_gatt_callback_func att_write_callback_func; // 特征值的写操作回调
ble_gatt_callback_func att_read_callback_func; // 特征值的读操作回调, 注意要设置value_len
uint8_t *value; // read return data, when att_read_callback_func is NULL
} ble_gatt_characteristic_cb_info_t;
#define GATT_CLIENT_CONFIG_NOTIFY 1
#define GATT_CLIENT_CONFIG_INDICATE 2
/**
define group GATT Server profile struct
*/
typedef struct gatts_profile_list{
void *item;
uint16_t profile_start_handle;
uint16_t profile_end_handle;
const uint8_t *profile_date;
uint16_t profile_date_size;
} ble_gatts_profile_list_st;
#define BD_ADDR_LENGTH 6
typedef uint8_t bd_addr_t[BD_ADDR_LENGTH];
extern uint8_t cfg_bt_work_mode;
extern uint8_t cfg_bt_max_acl_link;
extern bool cfg_bt_dual_mode;
extern bool cfg_bt_scan_ctrl_mode;
extern bool cfg_bt_simple_pair_mode;
extern bool cfg_bt_voip_reject_en;
extern uint16_t cfg_bt_support_profile;
extern uint16_t cfg_bt_support_codec;
extern uint8_t cfg_bt_hid_type;
extern uint16_t cfg_bt_def_connect_times;
extern uint16_t cfg_bt_sup_to_connect_times;
extern uint8_t cfg_bt_rf_def_txpwr;
extern uint8_t cfg_bt_page_inq_txpwr;
extern uint8_t cfg_bt_a2dp_feature;
extern uint8_t cfg_bt_hfp_feature;
extern uint8_t cfg_bt_sniff_clk_sel;
#define bt_a2dp_is_vol_ctrl() (cfg_bt_a2dp_feature & A2DP_VOL_CTRL)
#define bt_a2dp_is_ios_play_status() (cfg_bt_a2dp_feature & A2DP_IOS_PLAY_STATUS)
//control
void bt_fcc_init(void);
void bt_init(void); //初始化蓝牙变量
int bt_setup(void); //打开蓝牙模块
void bt_off(void); //关闭蓝牙模块
void bt_wakeup(void); //唤醒蓝牙模块
void bt_send_msg_do(uint msg); //蓝牙控制消息参数详见bt_msg_t
void bt_audio_bypass(void); //蓝牙SBC/SCO通路关闭
void bt_audio_enable(void); //蓝牙SBC/SCO通路使能
void bt_set_sco_far_delay(void *buf, uint size, uint delay);
void bt_set_scan(u8 iscan, u8 pscan); //打开/关闭可被发现和可被连接
void bt_set_scan_param(uint param); //pscan int = 0x100*((param >> 8)&0xff) + 1), iscan int = 0x100*((param&0xff) + 1)
uint8_t bt_get_scan(void); //获取设置的可被发现可被连接状态
void bt_connect(uint times); //蓝牙设备回连, times: 重试次数每次6s
void bt_disconnect(uint reason); //蓝牙设备断开, reason: 0=单独断开入仓1=断开并同步关机(按键/自动关机)
void bt_hid_connect(void); //蓝牙HID服务回连
void bt_hid_disconnect(void); //蓝牙HID服务断开
uint32_t bt_sleep_proc(void);
void bt_enter_sleep(void);
void bt_exit_sleep(void);
void updata_bt_name(char *bt_name);
//status
uint bt_get_disp_status(void); //获取蓝牙的当前显示状态
uint bt_get_status(void); //获取蓝牙的当前状态
uint bt_get_call_indicate(void); //获取通话的当前状态
uint bt_get_siri_status(void); //获取SIRI当前状态, 0=SIRI已退出, 1=SIRI已唤出
bool bt_is_calling(void); //判断是否正在通话
bool bt_is_playing(void); //判断是否正在播放
bool bt_is_ring(void); //判断是否正在响铃
bool bt_is_testmode(void); //判断当前蓝牙是否处于测试模式
bool bt_is_sleep(void); //判断蓝牙是否进入休眠状态
bool bt_is_connected(void); //判断蓝牙是否已连接
bool bt_is_ios_device(void); //判断当前播放的是否ios设备
bool sco_is_connected(void); //判断当前SCO链路是否连接
bool bt_sco_is_msbc(void); //判断当前通话是否是宽带通话
bool bt_a2dp_is_connected(void); //判断蓝牙A2DP是否已连接
bool bt_hfp_is_connected(void); //判断蓝牙HFP是否已连接
int bt_hid_is_connected(void);
bool bt_hid_is_ready_to_discon(void);
bool sbc_is_bypass(void);
bool bt_sync_tick(void); //根据蓝牙时钟同步到50ms误差为5ms
void bt_reset_addr(void); //重置bt地址, 值通过bt_get_local_bd_addr设置;
//info
bool bt_get_link_btname(uint8_t index, char *name, uint8_t max_size); //index: 0=link0, 1=link1, 0xff=auto(default link0)
bool bt_nor_get_link_info(uint8_t *bd_addr); //获取手机配对信息bd_addr=NULL时仅查询是否存在回连信息
bool bt_nor_get_link_info_addr(uint8_t *bd_addr, uint8_t order); //获取第n个手机配对信息bd_addr=NULL时仅查询是否存在回连信息
void bt_nor_delete_link_info(void); //删除手机配对信息
#define bt_send_msg(ogf, ocf) bt_send_msg_do((ogf<<24) | (ocf))
#define bt_ctrl_msg(msg) bt_send_msg(BT_MSG_CTRL, msg)
#define bt_ble_msg(msg) bt_send_msg(BT_MSG_BLE, msg)
//pkt
typedef void (*kick_func_t)(void);
struct txbuf_tag {
uint8_t *ptr;
uint16_t len;
uint16_t handle;
} __attribute__ ((packed)) ;
struct txpkt_tag
{
struct txbuf_tag *buf;
uint16_t buf_size;
uint8_t total;
volatile uint8_t cnt;
uint8_t rptr;
volatile uint8_t wptr;
kick_func_t send_kick;
};
extern struct txpkt_tag notify_tx;
uint32_t txpkt_init(struct txpkt_tag *txpkt, void *mem_pool, uint8_t total, uint16_t buf_size);
/*****************************************************************************
* BLE API
*****************************************************************************/
#define ble_adv_dis() bt_ble_msg(BLE_ADV_DISABLE)
#define ble_adv_en() bt_ble_msg(BLE_ADV_ENABLE)
void ble_set_gap_name(char *gap_name, u8 len);
u16 ble_get_conn_interval(void); //N*1.25ms
u16 ble_get_conn_latency(void);
u16 ble_get_conn_timeout(void); //N*10ms
u16 ble_get_adv_interval(void); //N*625us
/*****************************************************************************
* BLE连接相关通道1与BLE无连接广播相互独立
*****************************************************************************/
void ble_send_kick(void);
/**
* @brief 主动请求mtu
* @return void
*
**/
void ble_exchange_mtu_request(void);
/**
* @brief 获取BLE的状态
* @return 3种状态的一种
LE_STA_STANDBY, //standby
LE_STA_ADVERTISING, //正在广播
LE_STA_CONNECTION, //已连接
*
**/
u8 ble_get_status(void);
/**
* @brief 判断BLE是否已经链接
* @return true表示已连接false断开
*
**/
bool ble_is_connect(void);
/**
* @brief 获取当前MTU值
* @return 返回MTU
*
**/
u16 ble_get_gatt_mtu(void);
/**
* @brief 设置广播间隔时间
* 注意单位是625us
* @param[in] interval 参数数据范围是32 到 16384
*
**/
void ble_set_adv_interval(u16 interval);
/**
* @brief 断开BLE连接
*
*
**/
void ble_disconnect(void);
/**
* @brief 往手机(client)端发送数据
注: 发送的数据长度不能超过MTU设置可以通过ble_get_gatt_mtu函数获取。
* @param[in] index GATT初始化的时候返回的一个ID在ble_gatts_characteristic_add_do函数里有返回
* @param[in] buf 发送数据的buff
* @param[len] buf 发送数据的长度
* @return[int] 0: 成功
0x0C: APP没打开client_config或发送的数据大于MTU或BLE没连接
0x57: 内部缓存已满
0x56发送数据为空指针或发送数据大小超过init设置的(txpkt_init函数的buf_size参数)
*
**/
int ble_tx_notify(u16 att_handle, u8* buf, u8 len);
/**
* @brief 更新连接间隔
注:
* @param[in] interval 连接间隔1.25ms为单位;最大和最小连接间隔设置为一样了
* @param[in] latency 潜伏时间 可跳过多少事件
* @param[len] timeout 超时时间 10ms为单位
*
**/
void ble_update_conn_param(u16 interval, u16 latency, u16 timeout);
/**
* @brief 主动设置广播数据
注: 意思可以在广播过程中,更改广播数据
* @param[in] adv_buf 广播数据buff
* @param[in] size 数据大小最大31字节
* return : ture 成功
**/
bool ble_set_adv_data(const u8 *adv_buf, u32 size);
/**
* @brief 主动设置扫描响应数据
注: 意思可以在广播过程中,更改扫描相应
* @param[in] scan_rsp_buf 数据buff
* @param[in] size 数据大小最大31字节
* return : ture 成功
**/
bool ble_set_scan_rsp_data(const u8 *scan_rsp_buf, u32 size);
/**
* @brief 添加服务初始化函数
客户一般不需要直接调用SDK默认引用好了
* @param[in] profile_table : 存储profile的buuff
* @param[in] profile_table_size : profile_table大小
* @param[in] cb_info_table_p回调结构体
* @param[in] gatt_max_attGATT数量的最多需求
**/
void ble_gatts_init(uint8_t *profile_table, uint16_t profile_table_size,
ble_gatt_characteristic_cb_info_t **cb_info_table_p,
uint16_t gatt_max_att);
/**
* @brief 添加服务函数
* @param[in] service_type BLE_GATTS_SRVC_TYPE_PRIMARY BLE_GATTS_SRVC_TYPE_SEVONDARY BLE_GATTS_SRVC_TYPE_INCLUDE一种
* @param[in] service_uuid UUID数据
* @param[in] uuid_type UUID类型指16bit还是128bit类型
* @param[in] service_handle 用这个位置去获取当前分配的handle
**/
int ble_gatts_service_add(ble_gatts_service_type service_type, const uint8_t *service_uuid, ble_gatts_uuid_type uuid_type, uint8_t *service_handle);
/**
* @brief 添加特征值函数
* @param[in] att_uuid GATT的UUID
* @param[in] uuid_type UUID类型指16bit还是128bit类型
* @param[in] props 读写权限
* @param[in] att_handle 用这个位置去获取当前分配的handle 可以填NULL
* @param[in] cb_info 回调信息,存放读写回调函数等
**/
int ble_gatts_characteristic_add( const uint8_t *att_uuid, ble_gatts_uuid_type uuid_type, uint16_t props,
uint16_t *att_handle, ble_gatt_characteristic_cb_info_t *cb_info);
bool ble_gatt_init_att_info(uint16_t att_handle, ble_gatt_characteristic_cb_info_t *att_cb_info);
int ble_gatts_inlcude_service_add(ble_gatts_uuid_type uuid_type, const uint8_t *service_uuid, uint16_t start_handle, uint16_t end_handle, uint16_t *att_handle);
int ble_gatts_add_profile_date(ble_gatts_profile_list_st *gatts_profile);
int ble_gatts_attribute_add(const uint8_t *att_data, uint16_t *att_handle);
bool ble_gatts_profile_mg_alloc_att_num_check(uint8_t att_num);
/*****************************************************************************
* BLE无连接广播相关通道0与BLE连接相互独立
*****************************************************************************/
#define BLE_ADV0_EN_BIT 0x01
#define BLE_ADV0_MS_VAR_BIT 0x02
#define BLE_ADV0_ADDR_PUBIC_BIT 0x04
uint8_t ble_adv0_get_adv_en(void);
void ble_adv0_set_ctrl(uint opcode); //0=关闭广播, 1=打开广播, 2=更新广播数据打开时直接广播关闭时仅更新buffer
#endif