#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_att:GATT数量的最多需求 **/ 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