#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传0,param传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