Files
2025-12-03 11:12:34 +08:00

866 lines
34 KiB
C
Raw Permalink 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 __AVCTP_USER_H__
#define __AVCTP_USER_H__
#include "typedef.h"
#include "btstack_typedef.h"
///***注意:该文件的枚举与库编译密切相关,主要是给用户提供调用所用。用户不能自己在中间添加值。*/
////----user (command) codes----////
typedef enum {
/*
使用bt_cmd_prepare(USER_CMD_TYPE cmd,u16 param_len,u8 *param)发送命令
//返回0表支持参数个数正确,返回1表不支持,2是参数错误
要三个参数,没参数说明的命令参数param_len传0param传NULL
例子A、USER_CTRL_HFP_CALL_SET_VOLUME命令需要1个参数的使用例子:
u8 vol = 8;
bt_cmd_prepare(USER_CTRL_HFP_CALL_SET_VOLUME,1, &vol);
例子B、USER_CTRL_HFP_DIAL_NUMBER 参数要用数组先存起来,param_len是号码长度,param可传参数数组指针,
user_val->income_phone_num已经存好号码
bt_cmd_prepare(USER_CTRL_HFP_DIAL_NUMBER,user_val->phone_num_len,user_val->income_phone_num);
*/
//链路操作部分
//回连,使用的是VM的地址,一般按键操作不使用该接口
USER_CTRL_START_CONNECTION = 0x00,
//通过地址去连接,如果知道地址想去连接使用该接口
USER_CTRL_START_CONNEC_VIA_ADDR,
//通过指定地址手动回连,该地址是最后一个断开设备的地址
USER_CTRL_START_CONNEC_VIA_ADDR_MANUALLY,
//通过地址去连接spp,如果知道地址想去连接使用该接口
USER_CTRL_START_CONNEC_SPP_VIA_ADDR,
//断开连接,断开当前所有蓝牙连接,可以加地址进行指定断开
USER_CTRL_DISCONNECTION_HCI,
//取消链接
USER_CTRL_CONNECTION_CANCEL,
//读取远端名字
USER_CTRL_READ_REMOTE_NAME,
//连接或断开SCO或esco,选择这个命令会自动判断要断开还是连接sco
USER_CTRL_SCO_LINK,
//连接SCO或esco
USER_CTRL_CONN_SCO,
//断开sco或esco
USER_CTRL_DISCONN_SCO,
//断开并配置拒绝远端ESCO连接
USER_CTRL_DISCONN_REJECT_SCO,
//断开SDP,一般按键操作不使用该接口
USER_CTRL_DISCONN_SDP_MASTER,
//直接发底层断开,跳过协议的断开
USER_CTRL_DETACH,
//关闭蓝牙可发现
USER_CTRL_WRITE_SCAN_DISABLE,
//打开蓝牙可发现
USER_CTRL_WRITE_SCAN_ENABLE,
//关闭蓝牙可连接
USER_CTRL_WRITE_CONN_DISABLE,
//打开蓝牙可连接
USER_CTRL_WRITE_CONN_ENABLE,
//控制蓝牙搜索,需要搜索附件设备做功能的连续说明情况在补充完善功能
USER_CTRL_SEARCH_DEVICE,
//取消搜索
USER_CTRL_INQUIRY_CANCEL,
//取消配对
USER_CTRL_PAGE_CANCEL,
///进入sniff模式,一般按键操作不使用该接口
USER_CTRL_SNIFF_IN,
USER_CTRL_SNIFF_EXIT,
USER_CTRL_SNIFF_CLEAR_CNT,
USER_CTRL_ALL_SNIFF_EXIT,
//链路操作层接口位置预留
USER_CTRL_HCI_FUNCTION1,
//hfp链路部分
//控制打电话音量,注意可能有些手机进度条有变化音量大小没变化,同步要设置样机DAC音量
/*跟电话音量操作有关的操作最终都执行回调函数call_vol_change*/
USER_CTRL_HFP_CMD_BEGIN = 0x20,
USER_CTRL_HFP_CMD_CONN, /* 做HFP 连接 */
USER_CTRL_HFP_CALL_VOLUME_UP, /*音量加1,手机可以同步显示*/
USER_CTRL_HFP_CALL_VOLUME_DOWN, /*音量减1,手机可以同步显示*/
USER_CTRL_HFP_CALL_SET_VOLUME, /*设置固定值,手机可以同步显示,需要传1个音量值*/
USER_CTRL_HFP_CALL_GET_VOLUME, /*获取音量,默认从call_vol_change返回*/
//来电接听电话
USER_CTRL_HFP_CALL_ANSWER,
//挂断电话
USER_CTRL_HFP_CALL_HANGUP,
//回拨上一个打出电话
USER_CTRL_HFP_CALL_LAST_NO,
//获取当前通话电话号码
USER_CTRL_HFP_CALL_CURRENT,
//通话过程中根据提示输入控制
/*例子
char num = '1';
bt_cmd_prepare(USER_CTRL_HFP_DTMF_TONES,1,(u8 *)&num);
*/
//发送打电话时的信号选择DTMF tones ,有一个参数,参数支持{0-9, *, #, A, B, C, D}
USER_CTRL_HFP_DTMF_TONES,
//根据电话号码拨号
/**USER_CTRL_HFP_DIAL_NUMBER命令有参数,参数要用数组先存起来,
param_len是号码长度,param可传参数数组指针*/
USER_CTRL_HFP_DIAL_NUMBER,
//*控制siri状态*//*可以注册回调函数获取返回值*/
USER_CTRL_HFP_GET_SIRI_STATUS,
//*开启siri*/
USER_CTRL_HFP_GET_SIRI_OPEN,
//*关闭siri,一般说完话好像自动关闭了,如果要提前终止可调用*/
USER_CTRL_HFP_GET_SIRI_CLOSE,
/*获取手机的日期和时间,苹果可以,一般安卓机好像都不行*/
USER_CTRL_HFP_GET_PHONE_DATE_TIME,
USER_CTRL_HFP_CMD_SEND_BIA,
/*获取手机厂商的命令 */
USER_CTRL_HFP_CMD_GET_MANUFACTURER,
/*更新当前的电量给手机*/
USER_CTRL_HFP_CMD_UPDATE_BATTARY,
//三方通话操作
//应答
//挂断当前去听另一个(未接听或者在保留状态都可以)
USER_CTRL_HFP_THREE_WAY_ANSWER1,
//保留当前去接听, 或者用于两个通话的切换
USER_CTRL_HFP_THREE_WAY_ANSWER2,
USER_CTRL_HFP_THREE_WAY_ANSWER1X, //目前没有用
USER_CTRL_HFP_THREE_WAY_ANSWER2X, //目前没有用
//可以发完USER_CTRL_HFP_THREE_WAY_ANSWER2,又发ANSWER3,自己看看效果
USER_CTRL_HFP_THREE_WAY_ANSWER3,
//拒听
USER_CTRL_HFP_THREE_WAY_REJECT, //拒绝后台来电
USER_CTRL_HFP_DISCONNECT, //断开HFP连接
//bt_cmd_prepare(USER_CTRL_HFP_SEND_USER_AT_CMD,len,data_ptr);
USER_CTRL_HFP_SEND_USER_AT_CMD, //用户发送自己定义的AT命令
USER_CTRL_HFP_CMD_FUNCTION1, //预留HFP命令位置
USER_CTRL_HFP_CMD_FUNCTION2, //预留HFP命令位置
USER_CTRL_HFP_CMD_END,
//音乐控制部分
USER_CTRL_AVCTP_CMD_BEGIN = 0x40,
//只会发pause命令
USER_CTRL_AVCTP_PAUSE_MUSIC,
//音乐播放,会根据协议栈记录的状态发PLAY或者PAUSE
USER_CTRL_AVCTP_OPID_PLAY,
//音乐暂停,会根据协议栈记录的状态发PLAY或者PAUSE
USER_CTRL_AVCTP_OPID_PAUSE,
//音乐停止
USER_CTRL_AVCTP_OPID_STOP,
//音乐下一首
USER_CTRL_AVCTP_OPID_NEXT,
//音乐上一首
USER_CTRL_AVCTP_OPID_PREV,
//音乐快进
USER_CTRL_AVCTP_OPID_FORWARD,
//音乐快退
USER_CTRL_AVCTP_OPID_REWIND,
//音乐循环模式
USER_CTRL_AVCTP_OPID_REPEAT_MODE,
USER_CTRL_AVCTP_OPID_SHUFFLE_MODE,
//获取播放歌曲总时间和当前时间接口
USER_CTRL_AVCTP_OPID_GET_PLAY_TIME,
//获取当前音乐的一些信息.
//通过bt_music_info_handle_register注册的接口返回
USER_CTRL_AVCTP_OPID_GET_MUSIC_INFO,
//同步音量接口
USER_CTRL_AVCTP_OPID_SEND_VOL,
// //AVCTP断开,是音乐控制链路,
USER_CTRL_AVCTP_DISCONNECT,
// //AVCTP连接,是音乐控制链路,
USER_CTRL_AVCTP_CONN,
USER_CTRL_AVCTP_PLAY_MUSIC, //预留AVCTP命令位置
USER_CTRL_AVCTP_CMD_FUNCTION2, //预留AVCTP命令位置
USER_CTRL_AVCTP_CMD_END,
//高级音频部分
USER_CTRL_A2DP_CMD_BEGIN = 0x60,
//有判断条件的,回连过程连接高级音频,避免手机连也自动发起连接,一般按键操作不使用该接口
USER_CTRL_AUTO_CONN_A2DP,
//连接高级音频,回来最后一个断开设备的地址
USER_CTRL_CONN_A2DP,
//断开高级音频,只断开高级音频链路,如果有电话还会保留
USER_CTRL_DISCONN_A2DP,
//maybe BQB test will use
USER_CTRL_A2DP_CMD_START ,
USER_CTRL_A2DP_CMD_CLOSE ,
USER_CTRL_A2DP_CMD_SUSPEND ,
USER_CTRL_A2DP_CMD_GET_CONFIGURATION ,
USER_CTRL_A2DP_CMD_ABORT ,
USER_CTRL_A2DP_CMD_DELAY_REPORT, /*delay report cmd*/
/**音乐音量同步接口,自动选择通过HID还是AVRCP来发送*/
USER_CTRL_CMD_SYNC_VOL_INC,
/**音乐音量同步接口,自动选择通过HID还是AVRCP来发送*/
USER_CTRL_CMD_SYNC_VOL_DEC,
USER_CTRL_A2DP_CMD_FUNCTION1, //预留A2DP命令位置
USER_CTRL_A2DP_CMD_FUNCTION2, //预留A2DP命令位置
USER_CTRL_A2DP_CMD_END,
///*hid操作定义*/
USER_CTRL_HID_CMD_BEGIN = 0x70,
//按键连接
USER_CTRL_HID_CONN,
// //只发一个按键,安卓手机使用
USER_CTRL_HID_ANDROID,
//只发一个按键,苹果和部分安卓手机适用
USER_CTRL_HID_IOS,
// //发两个拍照按键
USER_CTRL_HID_BOTH,
//HID断开
USER_CTRL_HID_DISCONNECT,
//Home Key,apply to IOS and Android
USER_CTRL_HID_HOME ,
//Return Key,only support Android
USER_CTRL_HID_RETURN ,
//LeftArrow Key
USER_CTRL_HID_LEFTARROW ,
//RightArrow Key
USER_CTRL_HID_RIGHTARROW ,
//Volume Up
USER_CTRL_HID_VOL_UP ,
//Volume Down
USER_CTRL_HID_VOL_DOWN ,
//提高接口给用户层发送HID数据
USER_CTRL_HID_SEND_DATA ,
USER_CTRL_HID_CMD_END,
///蓝牙串口发送命令
USER_CTRL_SPP_CMD_BEGIN = 0x80,
/**USER_CTRL_SPP_SEND_DATA命令有参数,参数会先存起来,
param_len是数据长度,param发送数据指针
返回0,表示准备成功,其它值参考底下的错误表*/
USER_CTRL_SPP_SEND_DATA, //len <= 512
USER_CTRL_SPP_TRY_SEND_DATA,//
USER_CTRL_SPP_UPDATA_DATA,
//serial port profile disconnect command
USER_CTRL_SPP_DISCONNECT,
//支持多串口功能的时候发送接口,例如支持一台手机的多个串口软件同时连接
USER_CTRL_SPP_SEND_DATA_ID_A,
USER_CTRL_SPP_SEND_DATA_ID_B,
USER_CTRL_SPP_SEND_DATA_ID_C,
USER_CTRL_SPP_SEND_DATA_ID_D,
USER_CTRL_SPP_SEND_DATA_ID_E,
USER_CTRL_SPP_SEND_DATA_ID_F,
USER_CTRL_SPP_SEND_DATA_ID_G,
USER_CTRL_SPP_DISCONNECT_UPDATE,
USER_CTRL_SPP_CMD_END,
///IAP发送命令,当不需要支持IAP时可配置第二路SPP
USER_CTRL_IAP_CMD_BEGIN = 0x90,
/**USER_CTRL_IAP_SEND_DATA命令有参数,参数会先存起来,
param_len是数据长度,param发送数据指针
返回0,表示准备成功,其它值参考底下的错误表*/
USER_CTRL_IAP_SEND_DATA, //len <= 512
//serial port profile disconnect command
USER_CTRL_IAP_DISCONNECT,
USER_CTRL_IAP_CMD_END,
///pbg发送命令
USER_CTRL_PBG_CMD_BEGIN = 0xA0,
USER_CTRL_PBG_SEND_DATA,//len <= 512
USER_CTRL_PBG_TRY_SEND_DATA,//
USER_CTRL_PBG_CMD_END,
///adt 发送命令
USER_CTRL_ADT_CMD_BEGIN = 0xB0,
USER_CTRL_ADT_CONNECT,
USER_CTRL_ADT_KEY_MIC_OPEN,
USER_CTRL_ADT_SEND_DATA,//len <= 512
USER_CTRL_ADT_TRY_SEND_DATA,//
USER_CTRL_ADT_CMD_END,
///蓝牙电话本功能发送命令
USER_CTRL_PBAP_CMD_BEGIN = 0xC0,
USER_CTRL_PBAP_CONNECT,
//获取当前号码name
USER_CTRL_PBAP_READ_LIST,
//电话本功能读取通话记录的前n条
USER_CTRL_PBAP_READ_PART,
//电话本功能读全部记录
USER_CTRL_PBAP_READ_ALL,
//电话本功能中断读取记录
USER_CTRL_PBAP_STOP_READING,
USER_CTRL_PBAP_CMD_END,
//新增一个HSP的操作接口
USER_CTRL_HSP_CMD_BEGIN = 0xD0,
USER_CTRL_HSP_CONNECT, //断开HSP连接
USER_CTRL_HSP_DISCONNECT, //断开HSP连接
USER_CTRL_HSP_SPEAK_VOLUME_UP, /*音量加1*/
USER_CTRL_HSP_SPEAK_VOLUME_DOWN, /*音量减*/
USER_CTRL_HSP_MIC_VOLUME_UP, /*mic音量加1*/
USER_CTRL_HSP_MIC_VOLUME_DOWN, /*mic音量减1*/
USER_CTRL_HSP_CKPD_CMD, /*hsp 接听*/
USER_CTRL_HSP_CMD_END,
//MAP功能发送命令
USER_CTRL_MAP_CMD_BEGIN = 0xE0,
//MAP读取时间
USER_CTRL_MAP_READ_TIME,
//MAP停止读取
USER_CTRL_MAP_STOP_READING,
USER_CTRL_MAP_CMD_END,
//PAN功能发送命令
USER_CTRL_PAN_CMD_BEGIN = 0xF0,
USER_CTRL_PAN_CONNECT,
USER_CTRL_PAN_SEND_DATA,
USER_CTRL_PAN_CMD_END,
//OPP功能发送命令
USER_CTRL_OPP_CMD_BEGIN = 0x100,
USER_CTRL_OPP_CONNECTION,
USER_CTRL_OPP_DISCONNECTION,
USER_CTRL_OPP_CMD_END,
//蓝牙其他操作
//蓝牙关闭
USER_CTRL_POWER_OFF = 0x110,
//蓝牙开启
USER_CTRL_POWER_ON,
//几个蓝牙连接数据库的操作接口
//回连VM中最新一个设备记忆
USER_CTRL_CONNECT_LAST_REMOTE_INFO,
//删除最新的一个设备记忆
USER_CTRL_DEL_LAST_REMOTE_INFO,
//删除所有设备记忆
USER_CTRL_DEL_ALL_REMOTE_INFO,
//测试盒测试的时候用来发操作消息
USER_CTRL_TEST_KEY,
//自定义LMP的数据发送,
//通过重新定义weak函数void bt_get_uesr_info(u32 info)获取值;
USER_CTRL_SEND_USER_INFO,
//加密流程需要输入数字的接口
USER_CTRL_KEYPRESS,
//加密流程本地需要按键确认继续连接的接口
USER_CTRL_PAIR,
//发送跳频数据的接口,长度是10个byte
USER_CTRL_AFH_CHANNEL,
//蓝牙库里面有些流程需要建立定时查询的接口
USER_CTRL_HALF_SEC_LOOP_CREATE,
//蓝牙库里面有些流程需要删除定时查询的接口
USER_CTRL_HALF_SEC_LOOP_DEL,
/*单独HID和普通蓝牙模式的切换接口,音箱SDK才有完整流程*/
USER_CTRL_CMD_CHANGE_PROFILE_MODE,
//唤醒协议栈跑一次
USER_CTRL_CMD_RESUME_STACK,
USER_CTRL_TWS_AUDIO_SHARE_START_CONNECT,
USER_CTRL_ATWS_AUDIO_SHARE_CMD_START ,
USER_CTRL_ATWS_AUDIO_SHARE_CMD_SUSPEND ,
USER_CTRL_LAST
} USER_CMD_TYPE;
////----反馈给客户使用的状态----////
typedef enum {
/*下面是一些即时反馈的状态,无法重复获取的状态*/
BT_STATUS_POWER_ON = 1, /*上电*/
BT_STATUS_POWER_OFF = 2,
BT_STATUS_INIT_OK, /*初始化完成*/
BT_STATUS_EXIT_OK, /*蓝牙退出完成*/
BT_STATUS_START_CONNECTED, /*开始连接*/
BT_STATUS_FIRST_CONNECTED, /*连接成功*/
BT_STATUS_SECOND_CONNECTED, /*连接成功*/
BT_STATUS_ENCRY_COMPLETE, /*加密完成*/
BT_STATUS_FIRST_DISCONNECT, /*断开连接*/
BT_STATUS_SECOND_DISCONNECT, /*断开连接*/
BT_STATUS_PHONE_INCOME, /*来电*/
BT_STATUS_PHONE_NUMBER, /*来电话号码*/
BT_STATUS_PHONE_MANUFACTURER, /*获取手机的厂商*///13
BT_STATUS_PHONE_OUT, /*打出电话*/
BT_STATUS_PHONE_ACTIVE, /*接通电话*/
BT_STATUS_PHONE_HANGUP, /*挂断电话*/
BT_STATUS_BEGIN_AUTO_CON, /*发起回连*/
BT_STATUS_MUSIC_SOUND_COME, /*库中加入auto mute判断音乐播放开始*/
BT_STATUS_MUSIC_SOUND_GO, /*库中加入auto mute判断音乐播放暂停*/
BT_STATUS_RESUME, /*后台有效,手动切回蓝牙*/
BT_STATUS_RESUME_BTSTACK, /*后台有效,后台时来电切回蓝牙*/
BT_STATUS_SUSPEND, /*蓝牙挂起,退出蓝牙*/
BT_STATUS_LAST_CALL_TYPE_CHANGE, /*最后拨打电话的类型,只区分打入和打出两种状态*///23
BT_STATUS_CALL_VOL_CHANGE, /*通话过程中设置音量会产生这个状态变化*/
BT_STATUS_SCO_STATUS_CHANGE, /*当esco/sco连接或者断开时会产生这个状态变化*/
BT_STATUS_CONNECT_WITHOUT_LINKKEY, /*判断是首次连接还是配对后的连接,主要依据要不要简易配对或者pin code*/
BT_STATUS_PHONE_BATTERY_CHANGE, /*电话电量变化,该状态仅6个等级,0-5*/
BT_STATUS_RECONNECT_LINKKEY_LOST, /*回连时发现linkkey丢失了,即手机取消配对了*/
BT_STATUS_RECONN_OR_CONN, /*回连成功还是被连接*/
BT_STATUS_BT_TEST_BOX_CMD, /*蓝牙收到测试盒消息。1-升级,2-fast test*/
BT_STATUS_BT_TWS_CONNECT_CMD,
BT_STATUS_SNIFF_STATE_UPDATE, /*SNIFF STATE UPDATE*/
BT_STATUS_TONE_BY_FILE_NAME, /*直接使用文件名播放提示音*/
BT_STATUS_PHONE_DATE_AND_TIME, /*获取到手机的时间和日期,注意会有兼容性问题*/
BT_STATUS_INBAND_RINGTONE,
BT_STATUS_VOICE_RECOGNITION,
BT_STATUS_SIRI_OPEN,
BT_STATUS_SIRI_CLOSE,
BT_STATUS_SIRI_GET_STATE,
BT_STATUS_AVRCP_INCOME_OPID, /*收到远端设备发过来的AVRCP命令*/
BT_STATUS_AVRCP_VOL_CHANGE, /*协议栈更新音量值出来*/
BT_STATUS_HFP_SERVICE_LEVEL_CONNECTION_OK,
BT_STATUS_CONN_A2DP_CH,
BT_STATUS_DISCON_A2DP_CH,
BT_STATUS_CONN_HFP_CH,
BT_STATUS_DISCON_HFP_CH,
BT_STATUS_INQUIRY_TIMEOUT,
BT_STATUS_PHONE_NAME, /*获取来电号码name*/
/*下面是1个持续的状态,是get_stereo_bt_connect_status获取*/
/*下面是6个持续的状态,是bt_get_connect_status()获取*/
BT_STATUS_INITING, /*正在初始化*/
BT_STATUS_WAITINT_CONN, /*等待连接*/
BT_STATUS_AUTO_CONNECTINT, /*正在回连*/
BT_STATUS_CONNECTING, /*已连接,没有电话和音乐在活动*/
BT_STATUS_TAKEING_PHONE, /*正在电话*/
BT_STATUS_PLAYING_MUSIC, /*正在音乐*/
BT_STATUS_A2DP_MEDIA_START,
BT_STATUS_A2DP_MEDIA_STOP,
BT_STATUS_AVDTP_START,
BT_STATUS_AVDTP_SUSPEND,
BT_STATUS_SCO_CONNECTION_REQ,
BT_STATUS_SCO_DISCON,
BT_STATUS_BROADCAST_STATE,/*braoadcaset中*/
BT_STATUS_DONGLE_SPEAK_MIC_OPEN,
BT_STATUS_DONGLE_SPEAK_MIC_CLOSE,
BT_STATUS_TRIM_OVER, /*测试盒TRIM完成*/
} STATUS_FOR_USER;
typedef enum {
BT_CALL_BATTERY_CHG = 0, //电池电量改变
BT_CALL_SIGNAL_CHG, //网络信号改变
BT_CALL_INCOMING, //电话打入
BT_CALL_OUTGOING, //电话打出
BT_CALL_ACTIVE, //接通电话
BT_CALL_HANGUP, //电话挂断
BT_CALL_ALERT, //远端reach
BT_SIRI_STATE, //SIRI状态
BT_CALL_VOL_CHANGED,
} BT_CALL_IND_STA;
typedef enum {
BT_MUSIC_STATUS_IDLE = 0,
BT_MUSIC_STATUS_STARTING,
BT_MUSIC_STATUS_SUSPENDING,
} BT_MUSIC_STATE; //音乐状态
typedef enum {
BT_ESCO_STATUS_CLOSE = 0,
BT_ESCO_STATUS_OPEN,
} BT_ESCO_STATE; //esoc状态
struct bt_event {
u8 event;
u8 args[7];
u32 value;
};
//bt_cmd_prepare_for_addr和bt_cmd_prepare
//返回值参考
enum {
CMD_PREPARE_ERR_CODE_OK = 0,
CMD_PREPARE_ERR_CODE_NOT_INIT,
CMD_PREPARE_ERR_CODE_NO_MALLOC,
CMD_PREPARE_ERR_CODE_PARAM_INVALID,
CMD_PREPARE_ERR_CODE_TOO_FAST,
CMD_PREPARE_ERR_CODE_CONN_MAX,
CMD_PREPARE_ERR_CODE_CMD_MAX_NUM,
CMD_PREPARE_ERR_CODE_DATA_MAX_NUM,
CMD_PREPARE_ERR_CODE_DEV_NOT_FOUND,
CMD_PREPARE_ERR_CODE_NOT_SUPPORT,
};
#define SYS_BT_EVENT_TYPE_CON_STATUS (('C' << 24) | ('O' << 16) | ('N' << 8) | '\0')
#define SYS_BT_EVENT_TYPE_HCI_STATUS (('H' << 24) | ('C' << 16) | ('I' << 8) | '\0')
#define REMOTE_DEFAULT 0x00
#define REMOTE_SINK 0x01
#define REMOTE_SOURCE 0x02
#define SPP_CH 0x01
#define HFP_CH 0x02
#define A2DP_CH 0x04 //media
#define AVCTP_CH 0x08
#define HID_CH 0x10
#define AVDTP_CH 0x20
#define PBAP_CH 0x40
#define HFP_AG_CH 0x80
#define A2DP_SRC_CH 0x2000
#define HFP_UPDATE_BATTERY BIT(0) //hfp电量上报功能
struct sniff_ctrl_config_t {
u16 sniff_max_interval;
u16 sniff_mix_interval;
u16 sniff_attemp;
u16 sniff_timeout;
u8 sniff_addr[6];
};
#define AVC_PLAY 0x44
#define AVC_STOP 0x45
#define AVC_PAUSE 0x46
/*提供根据地址参数的命令接口
addr指定就按指定的查找,NULL就默认正在使用那个
cmd 用户可以使用USER_CMD_TYPE的枚举值
param_len 传参数需要的值或者data包的长度
param 传的是要发数据的包指针
*/
extern u32 bt_cmd_prepare_for_addr(u8 *addr, USER_CMD_TYPE cmd, u16 param_len, u8 *param);
//单个连接的时候不想管地址的命令接口
extern u32 bt_cmd_prepare(USER_CMD_TYPE cmd, u16 param_len, u8 *param);
//作为发射器时操作命令的接口
extern u32 bt_emitter_cmd_prepare(USER_CMD_TYPE cmd, u16 param_len, u8 *param);
/*根据规则生产BLE的随机地址*/
extern void bt_make_ble_address(u8 *ble_address, u8 *edr_address);
/****************蓝牙的一些状态获取接口*************************/
/*
u16 bt_get_curr_channel_state(); 与 channel 判断区分
主动获取当前链路的连接状态,可以用来判断有哪些链路连接上了
*/
extern u16 bt_get_curr_channel_state();
/*
u8 bt_get_call_status(); 与BT_CALL_IND_STA 枚举的值判断
用于获取当前蓝牙电话的状态
*/
extern u8 bt_get_call_status();
/*根据地址获取电话状态*/
extern u8 bt_get_call_status_for_addr(u8 *addr);
/*根据地址获取hfp对应的音量值*/
extern u8 bt_get_call_vol_for_addr(u8 *addr);
/*当前连接的设备是不是jl测试盒*/
extern bool bt_get_remote_test_flag();
//查询当前蓝牙的状态
extern u8 bt_get_connect_status(void);
/*查询高级音频的状态*/
extern u8 bt_a2dp_get_status(void);
/*获取上电回连地址列表里面的信息*/
extern u8 bt_get_current_poweron_memory_search_index(u8 *temp_mac_addr);
/*清除上电回连地址列表计数信息*/
extern void bt_clear_current_poweron_memory_search_index(u8 inc);
/*用来获取蓝牙连接的设备个数,不包含page状态的计数*/
extern u8 bt_get_total_connect_dev(void);
/*可以通过地址查询HFP的状态*/
extern u8 bt_check_conn_is_hangup_for_addr(u8 *addr);
//bt_get_auto_connect_state有时效性,一般不用。可以用消息BT_STATUS_RECONN_OR_CONN
/*判断是否主动回连*/
extern u8 bt_get_auto_connect_state(u8 *addr);
/*根据地址获取对应设备的高级音频音量*/
extern int bt_get_music_volume(bd_addr_t addr);
/*获取原来连接设备的地址信息,只适合支持一拖一使用*/
extern u8 *bt_get_current_remote_addr(void);
enum {
BD_ESCO_IDLE = 0, /*当前没有设备通话中*/
BD_ESCO_BUSY_CURRENT, /*当前地址对应的设备通话中*/
BD_ESCO_BUSY_OTHER, /*通话中的设备非当前地址*/
};
extern u8 bt_check_esco_state_via_addr(u8 *addr);
//判断SCO/esco有没有正在使用,两个接口一样的
extern u8 bt_get_esco_coder_busy_flag();
/*sniff 的计数查询*/
extern void bt_clear_sniff_cnt(void);
extern bool bt_api_conn_mode_check(u8 enable, u8 *addr);
extern u8 bt_api_enter_sniff_status_check(u16 time_cnt, u8 *addr);
/****************蓝牙的一些状态获取接口end*************************/
/*个性化参数设置*/
/*配置测试盒测试的全局标识*/
extern void bt_set_remote_test_flag(u8 own_remote_test);
/**配置SBC的bitpool,值越大,质量好,一般用38或者53*/
extern void bt_set_sbc_cap_bitpool(u8 sbc_cap_bitpoola);
/**提供接口修改aac的bitrate,但是有些手机不一定能接受*/
extern void bt_set_aac_bitrate(u32 bitrate);
/*用户调试设置地址,6个byte*/
extern void bt_set_bt_mac_addr(u8 *addr);
/*用户调试设置name,最长32个字符*/
extern void bt_set_host_name(const char *name, u8 len);
/*用户调试设置pin code*/
extern void bt_set_pin_code(const char *code);
/*该接口用于设置上电回连需要依次搜索设备的个数。*/
extern void bt_set_auto_conn_device_num(u8 num);
/*//回连的超时设置。ms单位。但是对手机发起的连接是没作用的*/
extern void bt_set_super_timeout_value(u16 time);
/*设置电量显示发送更新的周期时间,为0表示关闭电量显示功能*/
extern void bt_set_update_battery_time(u8 time);
/*给用户设置蓝牙支持连接的个数,主要用于控制控制可发现可连接和回连流程*/
extern void bt_set_user_ctrl_conn_num(u8 num);
/*提供接口外部设置要保留hfp不要蓝牙通话*/
extern void bt_set_disable_sco_flag(bool flag);
/*提供接口外部设置简易配对参数*/
extern void bt_set_simple_pair_param(u8 io_cap, u8 oob_data, u8 mitm);
/*//回连的超时设置。ms单位。但是对手机发起的连接是没作用的*/
extern void bt_set_super_timeout_value(u16 time);
/*//回连page的超时设置。ms单位*/
extern void bt_set_page_timeout_value(u16 time);
extern void bt_set_user_background_goback(u8 en);
/*设置一个标识给库里面说明正在退出蓝牙*/
extern void bt_set_stack_exiting(u8 exit);
/*配置协议栈支持HID功能,为了兼容以前的HID独立模式,音箱SDK有使用流程*/
extern void bt_set_hid_independent_flag(bool flag);
/*配置通话使用16k的msbc还是8k的cvsd*/
extern void bt_set_support_msbc_flag(bool flag);
/*配置协议栈使用支持AAC的信息*/
extern void bt_set_support_aac_flag(bool flag);
/*配置协议栈使用支持LHDC的信息*/
extern void bt_set_support_lhdc_flag(bool flag);
extern void bt_set_support_lhdc_v5_flag(bool flag);
/*配置协议栈使用支持LDAC的信息*/
extern void bt_set_support_ldac_flag(bool flag);
/*有些自选接口用来实现个性化功能流程,回调函数注册,记得常来看看哟*/
//蓝牙库注册接口的函数
/*音乐的ID3信息返回接口注册函数*/
extern void bt_music_info_handle_register(void (*handler)(u8 type, u32 time, u8 *info, u16 len));
/*手机更样机音乐模式的音量同步*/
extern void bt_music_vol_change_handle_register(void (*handle)(int vol), int (*handle2)(void));
/*获取到名字后的回调函数接口注册函数*/
extern void bt_read_remote_name_handle_register(void (*remote_name)(u8 status, u8 *addr, u8 *name));
/*电量发送时获取电量等级的接口注册--0-9等级*/
extern void bt_get_battery_value_handle_register(int (*handle)(void));
/*电量发送时获取电量等级的接口注册--百分比值*/
extern void bt_get_battery_percent_handle_register(int (*handle)(void));
/*支持串口功能的数据处理接口*/
extern void bt_spp_data_deal_handle_register(void (*handler)(u8 packet_type, u16 channel, u8 *packet, u16 size));
/*注册接口获取测试盒快速测试的开始状态*/
extern void bt_fast_test_handle_register(void (*handle)(void));
/*进入了DUT测试,有些状态值反馈到上层处理,参数预留以后扩展*/
extern void bt_dut_test_handle_register(void (*handle)(u8));
/*蓝牙搜索其他设备时的一些设备信息返回*/
extern void bt_inquiry_result_handle_register(u8(*handle)(char *name, u8 name_len, u8 *addr, u32 dev_class, char rssi));
/****8发射器的一些相关接口*********/
//发射器获取连接状态接口
u8 bt_emitter_get_connect_status(void);
//发射器获取当前连接链路状态接口
u16 bt_emitter_get_curr_channel_state();
//发射器获取当前音乐状态接口
u8 bt_emitter_get_a2dp_status(void);
/**发射器和接收器按键切换的时候要申请和释放资源**/
extern int bt_a2dp_source_init(void *buf, u16 len, int deal_flag);
/**发射器和接收器按键切换的时候要申请和释放资源**/
extern int bt_hfp_ag_buf_init(void *buf, int size, int deal_flag);
/*配置蓝牙协议栈处于发射器流程*/
extern void bt_emitter_set_enable_flag(u8 flag);
/*发射器启动还是暂停数据发送的接口,会发start和suspend命令*/
extern void bt_emitter_send_media_toggle(u8 *addr, u8 toggle);
/*查询当前有没有a2dp source(发射器的音频发送链路)在连接状态*/
extern u8 bt_a2dp_is_source_dev_null();
/****8发射器的一些相关接口end*********/
//LDAC采样率
#define LDAC_SAMPLING_FREQ_44100 0x20
#define LDAC_SAMPLING_FREQ_48000 0x10
#define LDAC_SAMPLING_FREQ_88200 0x08
#define LDAC_SAMPLING_FREQ_96000 0x04
// 配置LDAC支持的采样率
extern void bt_set_a2dp_ldac_sampling_freq(u8 a2dp_ldac_sampling_freq);
#define LE_AUDIO_CLASS BIT(14)
//LHDC_V5 采样率
#define LHDC_V5_SAMPLING_FREQ_192000 0x01
#define LHDC_V5_SAMPLING_FREQ_96000 0x04
#define LHDC_V5_SAMPLING_FREQ_48000 0x10
#define LHDC_V5_SAMPLING_FREQ_44100 0x20
// 配置LDAC支持的采样率
extern void bt_set_a2dp_lhdc_v5_sampling_freq(u8 a2dp_lhdc_v5_sampling_freq);
/*提供接口修改设备类型信息,修改什么的类型,会影响到手机显示的图标*/
extern void bt_change_hci_class_type(u32 class);
/*设备信息值举例*/
#define BD_CLASS_WEARABLE_HEADSET 0x240404/*ios10.2 display headset icon*/
#define BD_CLASS_HANDS_FREE 0x240408/*ios10.2 display bluetooth icon*/
#define BD_CLASS_MICROPHONE 0x240410
#define BD_CLASS_LOUDSPEAKER 0x240414
#define BD_CLASS_HEADPHONES 0x240418
#define BD_CLASS_CAR_AUDIO 0x240420 /*car audio类型苹果手机可以自动弹出确认框*/
#define BD_CLASS_HIFI_AUDIO 0x240428
#define BD_CLASS_PAN_DEV 0X020118
#define BD_CLASS_MOUSE 0x002580
#define BD_CLASS_KEYBOARD 0x002540
#define BD_CLASS_KEYBOARD_MOUSE 0x0025C0
#define BD_CLASS_REMOTE_CONTROL 0x00254C
#define BD_CLASS_TRANSFER_HEALTH 0x10091C
/************用户自定义HID的一些接口*******************/
typedef struct __hid_sdp_info {
u16 vid_private;
u16 pid_private;
u16 ver_private;
u8 sub_class;
u8 country_code;
bool virtual_cable;
bool reconnect_initiate;
bool sdp_disable;
bool battery_power;
bool remote_wake;
bool normally_connectable;
bool boot_device;
u16 version;
u16 parser_version;
u16 profile_version;
u16 supervision_timeout;
u16 language;
u16 bt_string_offset;
u16 descriptor_len;
u8 *descriptor;
char *service_name;
char *service_description;
char *provide_name;
void (*sdp_request_respone_callback)(u8 type);
u8 *extra_buf;
u8 extra_len;
} hid_sdp_info_t;
typedef struct {
u16 chl_id;
u16 data_len;
u8 *data_ptr;
} hid_s_param_t;
extern u16 bt_sdp_create_diy_device_ID_service(u8 *buffer, u16 buffer_size);
extern u16 bt_sdp_create_diy_hid_service(u8 *buffer, u16 buffer_size, const u8 *hid_descriptor, u16 hid_descriptor_size);
/************用户自定义HID的一些接口 end*******************/
/*该接口会直接操作VM,可以读取蓝牙记录列表中的蓝牙地址信息
* mac_addr: 是用来保存多个地址信息的buffer,
* conn_device_num 是期望读取最大个数(支持1-9)
* id: 一般设备是0。发射器和独立的HID模式是1
*/
u8 bt_restore_remote_device_info_opt(bd_addr_t *mac_addr, u8 conn_device_num, u8 id);
/*remote dev type*/
/*0:unknow,1-android,2:apple_inc,0x03-xiaomi*/
enum {
REMOTE_DEV_UNKNOWN = 0,
REMOTE_DEV_ANDROID ,
REMOTE_DEV_IOS ,
REMOTE_DEV_XIAOMI ,
REMOTE_DEV_DONGLE_SPEAK = 0xfa ,
REMOTE_DEV_TWS_SHARE = 0xFB ,
};
/*这个接口会直接访问VM,根据地址获取已经记录好的设备厂商
*读操作时op_flag和value参数都传0。返回值参考上面的枚举
* */
u8 bt_remote_dev_company_ioctrl(bd_addr_t dev_addr, u8 op_flag, u8 value);
/*模式切换相关的接口*/
/*蓝牙协议栈初始化*/
int btstack_init();
/*退出蓝牙函数*/
int btstack_exit();
/*后台的恢复接口*/
void btstack_resume();//background resume
/*后台时退出蓝牙的处理接口*/
int btstack_suspend();
/*查询地址是不是杰理配套的蓝牙dongle*/
int btstack_get_dev_type_for_addr(u8 *addr);
/*查询当前有没有杰理配套的蓝牙dongle连接*/
bool bt_check_is_have_dongle_dev_conn();
bool bt_check_is_have_tws_share_dev_conn();
u8 *get_tws_share_dev_addr();
int btstack_get_dongle_speak_status(void *device);
int btstack_get_dev_type_tws_share_for_addr(u8 *addr);
/*一拖二的一些状态获取接口和操作接口*/
/*获取的值上限是bt_set_auto_conn_device_num接口配置的值,一般用于做回连策略*/
int btstack_get_num_of_remote_device_recorded();
/*根据记录的蓝牙库conn地址去操作*/
/*根据地址获取该地址对应的conn结构体地址*/
void *btstack_get_conn_device(u8 *addr);
/*获取当前有多少个已经连接的设备*/
int btstack_get_conn_devices(void *devices[], int max_num);
/*根据记录的conn结构体地址获取对应设备的地址*/
u8 *btstack_get_device_mac_addr(void *device);
/*根据记录的conn结构体地址获取对应设备的a2dp播放状态*/
int btstack_get_device_a2dp_state(void *device);
/*根据记录的conn结构体地址操作命令,命令列表也是USER_CMD_TYPE的枚举值
* 这个接口只使用那些不需要参数的命令,需要的参数的不用这个*/
int btstack_device_control(void *device, int cmd);
/*根据记录的conn结构体地址获取对应设备的连接链路信息*/
int btstack_get_device_channel_state(void *device);
/*根据记录的conn结构体地址获取对应设备的电话状态*/
int btstack_bt_get_call_status(void *device);
/*根据记录的conn结构体地址获取对应设备的esco状态*/
int btstack_get_call_esco_status(void *device);
/*根据记录的conn结构体地址去断开对应的设备*/
void btstack_device_detach(void *device);
//记录是自动断开A2DP的地址,回连检查的时候区分手机断开的情况
void bt_stack_save_a2dp_auto_discon_addr(u8 *addr, u8 pause_music_flag);
//检查是自动断开的再回连
bool bt_stack_check_a2dp_auto_discon_addr(u8 *addr);
/*获取正在处于来电状态的设备数目*/
u8 bt_stack_get_incoming_call_num();
/*根据地址获取设备是否支持来电铃声*/
u8 btstack_get_inband_ringtone_flag_for_addr(u8 *addr);
/*根据地址配置ESCO的状态*/
void bt_api_esco_status(u8 *addr, u8 status);
/*可以获取传入地址之外的另一个设备地址信息,没有返回NULL*/
u8 *btstack_get_other_dev_addr(u8 *addr);
/*上电会根据配置读取连接过的设备地址,保持在一个数组
* 这个接口根据数组位置获取地址出来,返回真表示获取成功,addr是获取到的地址值*/
bool btstack_get_remote_addr(u8 *addr, u8 index);
//跟bt_get_curr_channel_state作用一样,支持按地址查询
u16 bt_get_curr_channel_state_for_addr(u8 *addr);
//跟bt_get_connect_status一样,支持按地址查询
u16 bt_get_connect_state_for_addr(u8 *addr);
//或取蓝牙的RSSI
extern s8 get_rssi_api(s8 *phone_rssi, s8 *tws_rssi);
//pdg自定义l2cap协议的一个例子
extern void pbg_profile_init(u16 psm);
extern void pbg_event_handler_register(void (*handler)(u8 packet_type, u16 channel, u8 *packet, u16 size));
//根据地址刷新一下连接信息的时间戳,第2个参数用get_remote_dev_info_index或取
void updata_last_link_key(bd_addr_t bd_addr, u8 id);
u8 get_remote_dev_info_index();
extern int bt_a2dp_source_init(void *buf, u16 len, int deal_flag);
void lmp_negotiate_esco_parm(u8 en);
u8 *get_cur_connect_phone_mac_addr(void);
bool is_have_dongle_dev_conn();
extern u8 get_inband_ringtone_flag_for_addr(u8 *addr);
u8 *get_other_dev_addr(u8 *addr);
extern void make_rand_num(u8 *buf);
#endif