This commit is contained in:
huxi
2025-12-03 11:12:34 +08:00
parent c23ae4f24c
commit bc195654bf
8163 changed files with 3799544 additions and 92 deletions
+90
View File
@@ -0,0 +1,90 @@
#ifndef A2DP_MEDIA_CODEC_H
#define A2DP_MEDIA_CODEC_H
#include "generic/typedef.h"
#include "classic/hci_lmp.h"
#ifndef A2DP_CODEC_SBC
#define A2DP_CODEC_SBC 0x00
#define A2DP_CODEC_MPEG12 0x01
#define A2DP_CODEC_MPEG24 0x02
#define A2DP_CODEC_ATRAC 0x03
#define A2DP_CODEC_NON_A2DP 0xFF
#define A2DP_CODEC_LDAC 0xB
#define A2DP_CODEC_LHDC 0xE
#define A2DP_CODEC_LHDC_V5 0xC
#endif
#define seqn_after(a, b) ((s16)((s16)(b) - (s16)(a)) < 0)
#define seqn_before(a, b) seqn_after(b, a)
void *a2dp_open_media_file(u8 *addr);
void a2dp_media_close(u8 *addr);
void a2dp_close_media_file(void *file);
void a2dp_media_start_play(void *_file);
void a2dp_media_stop_play(void *_file);
int a2dp_media_set_rx_notify(void *_file, void *priv, void (*notify)(void *));
extern int a2dp_media_get_packet(void *_file, struct a2dp_media_frame *frame);
extern int a2dp_media_try_get_packet(void *_file, struct a2dp_media_frame *frame);
extern void a2dp_media_put_packet(void *_file, void *packet);
extern int a2dp_media_get_remain_buffer_size();
extern int a2dp_media_get_remain_play_time(void *_file, u8 include_tws);
extern int a2dp_media_get_total_data_len(void *_file);
extern int a2dp_media_get_packet_num(void *_file);
extern int a2dp_media_clear_packet_before_seqn(void *_file, u16 seqn_number);
extern void *a2dp_media_fetch_packet(void *_file, int *len, void *prev_packet);
extern void *a2dp_media_fetch_packet_and_wait(void *_file, int *len, void *prev_packet, int msec);
extern void a2dp_media_free_packet(void *_file, void *_packet);
extern int a2dp_media_channel_exist(void *_file);
extern int a2dp_media_is_clearing_frame(void *_file);
extern int a2dp_media_get_codec_type(void *_file);
extern int a2dp_media_get_sample_rate(void *_file);
extern int a2dp_media_get_bit_wide(void *_file);
extern int a2dp_media_get_codec_version(void *_file);
extern int a2dp_media_get_rtp_header_len(u8 coding_type, u8 *buf, int len);
extern int sbc_frame_length(u8 data, u8 bitpool);
extern void a2dp_media_mute(u8 *addr);
extern bool a2dp_media_unmute(u8 *addr);
extern bool a2dp_media_is_mute(u8 *addr);
extern int aac_energy_check(u8 *packet, u16 size);
extern void aac_decoder_energy_det_close();
void a2dp_media_update_delay_report_time(void *_file, u16 time);
#endif
+865
View File
@@ -0,0 +1,865 @@
#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
+611
View File
@@ -0,0 +1,611 @@
#ifndef _BLUETOOTH_H_
#define _BLUETOOTH_H_
#include "typedef.h"
//LE
#include "le/ble_data_types.h"
#include "le/ble_api.h"
#include "le/le_user.h"
#include "le/att.h"
#include "le/gatt.h"
#include "le/sm.h"
#define ISO_SDU_DTAT_LENGTH 0x032c //812byte
#define ISO_PDU_DTAT_LENGTH 251 //251byte
#define ISO_PDU_INTERVAL_M_S 0x4e20 //20ms
#define ISO_PDU_INTERVAL_S_M 0x4e20 //20ms
#define HCI_ISO_DATA_PACKET 0x05
//Classic
//Common
#include "btstack_event.h"
#define HCI_COMMAND_DATA_PACKET 0x01
#define HCI_ACL_DATA_PACKET 0x02
#define HCI_SCO_DATA_PACKET 0x03
#define HCI_EVENT_PACKET 0x04
// OGFs
#define OGF_LINK_CONTROL 0x01
#define OGF_LINK_POLICY 0x02
#define OGF_CONTROLLER_BASEBAND 0x03
#define OGF_INFORMATIONAL_PARAMETERS 0x04
#define OGF_STATUS_PARAMETERS 0x05
#define OGF_TESTING 0x06
#define OGF_LE_CONTROLLER 0x08
#define OGF_VENDOR_LE_CONTROLLER 0x3e
#define OGF_VENDOR 0x3f
// Events from host controller to host
/**
* @format 1
* @param status
*/
#define HCI_EVENT_INQUIRY_COMPLETE 0x01
/**
* @format 1B11132
* @param num_responses
* @param bd_addr
* @param page_scan_repetition_mode
* @param reserved1
* @param reserved2
* @param class_of_device
* @param clock_offset
*/
#define HCI_EVENT_INQUIRY_RESULT 0x02
/**
* @format 12B11
* @param status
* @param connection_handle
* @param bd_addr
* @param link_type
* @param encryption_enabled
*/
#define HCI_EVENT_CONNECTION_COMPLETE 0x03
/**
* @format B31
* @param bd_addr
* @param class_of_device
* @param link_type
*/
#define HCI_EVENT_CONNECTION_REQUEST 0x04
/**
* @format 121
* @param status
* @param connection_handle
* @param reason
*/
#define HCI_EVENT_DISCONNECTION_COMPLETE 0x05
/**
* @format 12
* @param status
* @param connection_handle
*/
#define HCI_EVENT_AUTHENTICATION_COMPLETE 0x06
/**
* @format 1BN
* @param status
* @param bd_addr
* @param remote_name
*/
#define HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE 0x07
/**
* @format 121
* @param status
* @param connection_handle
* @param encryption_enabled
*/
#define HCI_EVENT_ENCRYPTION_CHANGE 0x08
/**
* @format 12
* @param status
* @param connection_handle
*/
#define HCI_EVENT_CHANGE_CONNECTION_LINK_KEY_COMPLETE 0x09
/**
* @format 121
* @param status
* @param connection_handle
* @param key_flag
*/
#define HCI_EVENT_MASTER_LINK_KEY_COMPLETE 0x0A
#define HCI_EVENT_READ_REMOTE_SUPPORTED_FEATURES_COMPLETE 0x0B
#define HCI_EVENT_READ_REMOTE_VERSION_INFORMATION_COMPLETE 0x0C
#define HCI_EVENT_QOS_SETUP_COMPLETE 0x0D
/**
* @format 12R
* @param num_hci_command_packets
* @param command_opcode
* @param return_parameters
*/
#define HCI_EVENT_COMMAND_COMPLETE 0x0E
/**
* @format 112
* @param status
* @param num_hci_command_packets
* @param command_opcode
*/
#define HCI_EVENT_COMMAND_STATUS 0x0F
/**
* @format 1
* @param hardware_code
*/
#define HCI_EVENT_HARDWARE_ERROR 0x10
#define HCI_EVENT_FLUSH_OCCURRED 0x11
/**
* @format 1B1
* @param status
* @param bd_addr
* @param role
*/
#define HCI_EVENT_ROLE_CHANGE 0x12
// TODO: number_of_handles 1, connection_handle[H*i], hc_num_of_completed_packets[2*i]
#define HCI_EVENT_NUMBER_OF_COMPLETED_PACKETS 0x13
/**
* @format 1H12
* @param status
* @param handle
* @param mode
* @param interval
*/
#define HCI_EVENT_MODE_CHANGE_EVENT 0x14
// TODO: num_keys, bd_addr[B*i], link_key[16 octets * i]
#define HCI_EVENT_RETURN_LINK_KEYS 0x15
/**
* @format B
* @param bd_addr
*/
#define HCI_EVENT_PIN_CODE_REQUEST 0x16
/**
* @format B
* @param bd_addr
*/
#define HCI_EVENT_LINK_KEY_REQUEST 0x17
// TODO: bd_addr B, link_key 16octets, key_type 1
#define HCI_EVENT_LINK_KEY_NOTIFICATION 0x18
/**
* @format 1
* @param link_type
*/
#define HCI_EVENT_DATA_BUFFER_OVERFLOW 0x1A
/**
* @format H1
* @param handle
* @param lmp_max_slots
*/
#define HCI_EVENT_MAX_SLOTS_CHANGED 0x1B
/**
* @format 1H2
* @param status
* @param handle
* @param clock_offset
*/
#define HCI_EVENT_READ_CLOCK_OFFSET_COMPLETE 0x1C
/**
* @format 1H2
* @param status
* @param handle
* @param packet_types
* @pnote packet_type is in plural to avoid clash with Java binding Packet.getPacketType()
*/
#define HCI_EVENT_CONNECTION_PACKET_TYPE_CHANGED 0x1D
#define HCI_EVENT_PAGE_SCAN_REPETITION_MODE_CHANGE 0x20
/**
* @format 1B11321
* @param num_responses
* @param bd_addr
* @param page_scan_repetition_mode
* @param reserved
* @param class_of_device
* @param clock_offset
* @param rssi
*/
#define HCI_EVENT_INQUIRY_RESULT_WITH_RSSI 0x22
#define HCI_EVENT_READ_REMOTE_EXTERNED_FEATURES_COMPLETE 0x23
/**
* @format 1HB111221
* @param status
* @param handle
* @param bd_addr
* @param link_type
* @param transmission_interval
* @param retransmission_interval
* @param rx_packet_length
* @param tx_packet_length
* @param air_mode
*/
#define HCI_EVENT_SYNCHRONOUS_CONNECTION_COMPLETE 0x2C
// TODO: serialize extended_inquiry_response and provide parser
/**
* @format 1B11321
* @param num_responses
* @param bd_addr
* @param page_scan_repetition_mode
* @param reserved
* @param class_of_device
* @param clock_offset
* @param rssi
*/
#define HCI_EVENT_EXTENDED_INQUIRY_RESPONSE 0x2F
#define HCI_EVENT_EXTENDED_INQUIRY_RESULT 0x2F
/**
* @format 1H
* @param status
* @param handle
*/
#define HCI_EVENT_ENCRYPTION_KEY_REFRESH_COMPLETE 0x30
#define HCI_EVENT_IO_CAPABILITY_REQUEST 0x31
#define HCI_EVENT_IO_CAPABILITY_RESPONSE 0x32
/**
* @format B4
* @param bd_addr
* @param numeric_value
*/
#define HCI_EVENT_USER_CONFIRMATION_REQUEST 0x33
/**
* @format B
* @param bd_addr
*/
#define HCI_EVENT_USER_PASSKEY_REQUEST 0x34
/**
* @format B
* @param bd_addr
*/
#define HCI_EVENT_REMOTE_OOB_DATA_REQUEST 0x35
/**
* @format 1B
* @param status
* @param bd_addr
*/
#define HCI_EVENT_SIMPLE_PAIRING_COMPLETE 0x36
#define HCI_EVENT_LINK_SUPPERVISION_TIMEOUT_CHANGE_EVENT 0x38
#define HCI_EVENT_USER_PRESSKEY_NOTIFICATION 0x3B
#define HCI_EVENT_REMOTE_KEYPRESS_NOTIFICATION 0x3C
#define HCI_EVENT_REMOTE_SUPPORTED_FEATURES_NOTIFICATION 0x3D
#define HCI_EVENT_LE_META 0x3E
// last used HCI_EVENT in 2.1 is 0x3d
// last used HCI_EVENT in 4.1 is 0x57
#define HCI_EVENT_VENDOR_CONNECTION_COMPLETE 0xEF
//event definition for new vendor sub event
#define HCI_EVENT_VENDOR_META 0xF5
#define HCI_SUBEVENT_VENDOR_TEST_MODE_CFG 0x01
#define HCI_EVENT_VENDOR_DONGGLE_SPEAK_MIC 0xF4
#define HCI_EVENT_VENDOR_FRE_OFFSET_TRIM 0xF6
#define HCI_EVENT_VENDOR_ENCRY_COMPLETE 0xF7
#define HCI_EVENT_VENDOR_NO_RECONN_ADDR 0xF8
#define HCI_EVENT_VENDOR_SETUP_COMPLETE 0xF9
#define HCI_EVENT_VENDOR_DUT 0xFA
#define HCI_EVENT_VENDOR_OSC_INTERNAL 0xFB
#define HCI_EVENT_VENDOR_FAST_TEST 0xFC
#define HCI_EVENT_VENDOR_REMOTE_UPDATE 0xFD
#define HCI_EVENT_VENDOR_REMOTE_TEST 0xFE
#define HCI_EVENT_VENDOR_SPECIFIC 0xFF
#define BTSTACK_EVENT_HCI_CONNECTIONS_DELETE 0x6D
/**
* @format 11H11B2221
* @param subevent_code
* @param status
* @param connection_handle
* @param role
* @param peer_address_type
* @param peer_address
* @param conn_interval
* @param conn_latency
* @param supervision_timeout
* @param master_clock_accuracy
*/
#define HCI_SUBEVENT_LE_CONNECTION_COMPLETE 0x01
// array of advertisements, not handled by event accessor generator
#define HCI_SUBEVENT_LE_ADVERTISING_REPORT 0x02
/**
* @format 11H222
* @param subevent_code
* @param status
* @param connection_handle
* @param conn_interval
* @param conn_latency
* @param supervision_timeout
*/
#define HCI_SUBEVENT_LE_CONNECTION_UPDATE_COMPLETE 0x03
/**
* @format 1HD2
* @param subevent_code
* @param connection_handle
* @param random_number
* @param encryption_diversifier
*/
#define HCI_SUBEVENT_LE_READ_REMOTE_USED_FEATURES_COMPLETE 0x04
/**
* @format 1HD2
* @param subevent_code
* @param connection_handle
* @param random_number
* @param encryption_diversifier
*/
#define HCI_SUBEVENT_LE_LONG_TERM_KEY_REQUEST 0x05
/**
* @format 1H2222
* @param subevent_code
* @param connection_handle
* @param interval_min
* @param interval_max
* @param latency
* @param timeout
*/
#define HCI_SUBEVENT_LE_REMOTE_CONNECTION_PARAMETER_REQUEST 0x06
/**
* @format 1H2222
* @param subevent_code
* @param connection_handle
* @param max_tx_octets
* @param max_tx_time
* @param max_rx_octets
* @param max_rx_time
*/
#define HCI_SUBEVENT_LE_DATA_LENGTH_CHANGE 0x07
/**
* @format 11QQ
* @param subevent_code
* @param status
* @param dhkey_x x coordinate of P256 public key
* @param dhkey_y y coordinate of P256 public key
*/
#define HCI_SUBEVENT_LE_READ_LOCAL_P256_PUBLIC_KEY_COMPLETE 0x08
/**
* @format 11Q
* @param subevent_code
* @param status
* @param dhkey Diffie-Hellman key
*/
#define HCI_SUBEVENT_LE_GENERATE_DHKEY_COMPLETE 0x09
/**
* @format 11H11BBB2221
* @param subevent_code
* @param status
* @param connection_handle
* @param role
* @param peer_address_type
* @param perr_addresss
* @param local_resolvable_private_addres
* @param peer_resolvable_private_addres
* @param conn_interval
* @param conn_latency
* @param supervision_timeout
* @param master_clock_accuracy
*/
#define HCI_SUBEVENT_LE_ENHANCED_CONNECTION_COMPLETE 0x0A
// array of advertisements, not handled by event accessor generator
#define HCI_SUBEVENT_LE_DIRECT_ADVERTISING_REPORT 0x0B
/**
* @format 11211
* @param subevent_code
* @param status
* @param connection_handle
* @param TX_PHY
* @param RX_PHY
*/
#define HCI_SUBEVENT_LE_PHY_UPDATE_COMPLETE 0x0C
// array of advertisements, not handled by event accessor generator
#define HCI_SUBEVENT_LE_EXTENDED_ADVERTISING_REPORT 0x0D
#define HCI_SUBEVENT_LE_PERIODIC_ADVERTISING_SYNC_ESTABLISHED 0x0E
/**
* @format 1211111B
* @param subevent_code
* @param sync_handle
* @param tx_power
* @param rssi
* @param unused
* @param data_status
* @param data_length
* @param data
*/
#define HCI_SUBEVENT_LE_PERIODIC_ADVERTISING_REPORT 0x0F
/**
* @format 2
* @param sync_handle
*/
#define HCI_SUBEVENT_LE_PERIODIC_ADVERTISING_SYNC_LOST 0x10
/**
* @format
*/
#define HCI_SUBEVENT_LE_SCAN_TIMEOUT 0x11
/**
* @format 1121
* @param subevent_code
* @param status
* @param advertising_handle
* @param connection_handle
* @param num_completed_extended_advertising_events
*/
#define HCI_SUBEVENT_LE_ADVERTISING_SET_TERMINATED 0x12
/**
* @format 1116
* @param subevent_code
* @param advertising_handle
* @param scanner_address_type
* @param scanner_address
*/
#define HCI_SUBEVENT_LE_SCAN_REQUEST_RECEIVED 0x13
/**
* @format 21
* @param subevent_code
* @param connection_handle
* @param channel_selection_algorithm
*/
#define HCI_SUBEVENT_LE_CHANNEL_SELECTION_ALGORITHM 0x14
#define HCI_SUBEVENT_LE_VENDOR_INTERVAL_COMPLETE 0xF0
/**
* @format
*/
#define HCI_EVENT_ANCS_META 0xEA
#define HCI_EVENT_AMS_META 0xF2
typedef enum {
AMS_RemoteCommandIDPlay = 0,
AMS_RemoteCommandIDPause,
AMS_RemoteCommandIDTogglePlayPause,
AMS_RemoteCommandIDNextTrack,
AMS_RemoteCommandIDPreviousTrack,
AMS_RemoteCommandIDVolumeUp,
AMS_RemoteCommandIDVolumeDown,
AMS_RemoteCommandIDAdvanceRepeatMode,
AMS_RemoteCommandIDAdvanceShuffleMode,
AMS_RemoteCommandIDSkipForward,
AMS_RemoteCommandIDSkipBackward,
AMS_RemoteCommandIDLikeTrack,
AMS_RemoteCommandIDDislikeTrack,
AMS_RemoteCommandIDBookmarkTrack,
} ams_request_cmd_e;
bool ams_send_request_command(ams_request_cmd_e cmd_id);
/*
config_map:
bit0--IDPlayer,bit1--IDQueue,bit2--IDTrack
*/
#define AMS_IDPlayer_ENABLE BIT(0)
#define AMS_IDQueue_ENABLE BIT(1)
#define AMS_IDTrack_ENABLE BIT(2)
bool ams_entity_attribute_config(int config_map);
/**
* compact HCI Command packet description
*/
typedef struct {
uint16_t opcode;
const char *format;
} hci_cmd_t;
int hci_send_cmd(const hci_cmd_t *cmd, ...);
extern const hci_cmd_t hci_reset;
extern const hci_cmd_t hci_read_bd_addr;
extern const hci_cmd_t hci_read_local_supported_features;
extern const hci_cmd_t hci_read_buffer_size;
extern const hci_cmd_t hci_read_local_supported_commands;
extern const hci_cmd_t hci_read_local_version_information;
extern const hci_cmd_t hci_read_le_host_supported;
extern const hci_cmd_t hci_read_local_name;
extern const hci_cmd_t hci_write_class_of_device;
extern const hci_cmd_t hci_write_local_name;
extern const hci_cmd_t hci_write_scan_enable;
extern const hci_cmd_t hci_set_event_mask;
extern const hci_cmd_t hci_le_add_device_to_white_list;
extern const hci_cmd_t hci_le_clear_white_list;
extern const hci_cmd_t hci_le_connection_update;
extern const hci_cmd_t hci_le_create_connection;
extern const hci_cmd_t hci_le_create_connection_cancel;
extern const hci_cmd_t hci_le_encrypt;
extern const hci_cmd_t hci_le_generate_dhkey;
extern const hci_cmd_t hci_le_long_term_key_negative_reply;
extern const hci_cmd_t hci_le_long_term_key_request_reply;
extern const hci_cmd_t hci_le_rand;
extern const hci_cmd_t hci_le_read_advertising_channel_tx_power;
extern const hci_cmd_t hci_le_read_buffer_size;
extern const hci_cmd_t hci_le_read_channel_map;
extern const hci_cmd_t hci_le_read_local_p256_public_key;
extern const hci_cmd_t hci_le_read_maximum_data_length;
extern const hci_cmd_t hci_le_read_remote_used_features;
extern const hci_cmd_t hci_le_read_suggested_default_data_length;
extern const hci_cmd_t hci_le_read_supported_features;
extern const hci_cmd_t hci_le_read_supported_states;
extern const hci_cmd_t hci_le_read_white_list_size;
extern const hci_cmd_t hci_le_receiver_test;
extern const hci_cmd_t hci_le_remove_device_from_white_list;
extern const hci_cmd_t hci_le_set_advertise_enable;
extern const hci_cmd_t hci_le_set_advertising_data;
extern const hci_cmd_t hci_le_set_advertising_parameters;
extern const hci_cmd_t hci_le_set_data_length;
extern const hci_cmd_t hci_le_set_event_mask;
extern const hci_cmd_t hci_le_set_host_channel_classification;
extern const hci_cmd_t hci_le_set_random_address;
extern const hci_cmd_t hci_le_set_scan_enable;
extern const hci_cmd_t hci_le_set_scan_parameters;
extern const hci_cmd_t hci_le_set_scan_response_data;
extern const hci_cmd_t hci_le_start_encryption;
extern const hci_cmd_t hci_le_test_end;
extern const hci_cmd_t hci_le_transmitter_test;
extern const hci_cmd_t hci_le_write_suggested_default_data_length;
extern const hci_cmd_t hci_le_set_phy;
extern const hci_cmd_t hci_le_set_ext_advertising_parameters;
extern const hci_cmd_t hci_le_set_ext_advertising_data;
extern const hci_cmd_t hci_le_set_ext_advertise_enable;
extern const hci_cmd_t hci_le_set_ext_scan_parameters;
extern const hci_cmd_t hci_le_set_ext_scan_enable;
enum VENDOR_REMOTE_TEST_VALUE {
VENDOR_TEST_DISCONNECTED = 0,
VENDOR_TEST_LEGACY_CONNECTED_BY_BT_CLASSIC,
VENDOR_TEST_LEGACY_CONNECTED_BY_BLE,
VENDOR_TEST_CONNECTED_WITH_TWS,
VENDOR_TEST_BLE_DISCONNECTED,
};
#endif
File diff suppressed because it is too large Load Diff
+115
View File
@@ -0,0 +1,115 @@
SECTIONS
{
.data : ALIGN(4)
{
btstack_data_start = .;
*(.bt_stack_data)
*(.ble_db_data)
*(.ble_sm_data)
*(.ble_att_data)
*(.ble_gatt_data)
*(.fmna_stack_data)
*(.fmna_plaform_data)
*(.fmna_crypto_data)
/*mesh*/
BTSTACK_LE_HOST_MESH_DATA_START = .;
. = (. +3) & ~ 3;
_net_buf_pool_list = .;
*(._net_buf_pool.static.*)
*(.ble_mesh_data)
*(.ble_mesh_tinycrypt_data)
BTSTACK_LE_HOST_MESH_DATA_SIZE = ABSOLUTE(. - BTSTACK_LE_HOST_MESH_DATA_START);
btstack_data_end = .;
} > ram0
.bss (NOLOAD) :ALIGN(4)
{
btstack_bss_start = .;
*(.bt_stack_bss)
*(.ble_db_bss)
*(.ble_sm_bss)
*(.ble_att_bss)
*(.ble_gatt_bss)
*(.btstack_pool)
*(.fmna_stack_bss)
*(.fmna_plaform_bss)
*(.fmna_crypto_bss)
/*mesh*/
BTSTACK_LE_HOST_MESH_BSS_START = .;
*(.ble_mesh_bss)
*(.ble_mesh_tinycrypt_bss)
BTSTACK_LE_HOST_MESH_BSS_SIZE = ABSOLUTE(. - BTSTACK_LE_HOST_MESH_BSS_START);
btstack_bss_end = .;
} > ram0
.text : ALIGN(4)
{
btstack_code_start = .;
. = ALIGN(4);
a2dp_source_media_codec_begin = .;
KEEP(*(.a2dp_source_media_codec))
a2dp_source_media_codec_end = .;
a2dp_sink_media_probe_begin = .;
KEEP(*(.a2dp_sink_media_probe))
a2dp_sink_media_probe_end = .;
a2dp_sink_media_codec_begin = .;
KEEP(*(.a2dp_sink_media_codec))
a2dp_sink_media_codec_end = .;
a2dp_event_handler_begin = .;
KEEP(*(.a2dp_event_handler))
a2dp_event_handler_end = .;
sdp_record_item_begin = .;
KEEP(*(.sdp_record_item))
sdp_record_item_end = .;
bt_sleep_begin = .;
KEEP(*(.bt_sleep))
bt_sleep_end = .;
*(.bt_stack_const)
*(.bt_stack_code)
*(.ble_db_const)
*(.ble_db_code)
*(.ble_sm_const)
*(.ble_sm_code)
*(.ble_att_const)
*(.ble_att_code)
*(.ble_gatt_const)
*(.ble_gatt_code)
*(.fmna_stack_const)
*(.fmna_stack_code)
*(.fmna_plaform_const)
*(.fmna_plaform_code)
*(.fmna_crypto_const)
*(.fmna_crypto_code)
/*mesh*/
BTSTACK_LE_HOST_MESH_CODE_START = .;
*(.ble_mesh_code)
*(.ble_mesh_tinycrypt_code)
*(.ble_mesh_const)
*(.ble_mesh_tinycrypt_const)
BTSTACK_LE_HOST_MESH_CODE_SIZE = ABSOLUTE(. - BTSTACK_LE_HOST_MESH_CODE_START);
btstack_code_end = .;
. = ALIGN(4);
} > code0
}
BTSTACK_LE_HOST_MESH_RAM_TOTAL = BTSTACK_LE_HOST_MESH_DATA_SIZE + BTSTACK_LE_HOST_MESH_BSS_SIZE;
BTSTACK_LE_HOST_MESH_FLASH_TOTAL = BTSTACK_LE_HOST_MESH_CODE_SIZE;
BTSTACK_CODE_SIZE = (btstack_code_end - btstack_code_start) + (btstack_data_end - btstack_data_start);
+9
View File
@@ -0,0 +1,9 @@
#ifndef BTSTACK_TASK_H
#define BTSTACK_TASK_H
int btstack_init();
int btstack_exit();
void ble_bqb_test_thread_init(void);
#endif
+46
View File
@@ -0,0 +1,46 @@
#ifndef _BTSTACK_TYPEDEF_H_
#define _BTSTACK_TYPEDEF_H_
#include "typedef.h"
#define BT_BTSTACK_CLASSIC BIT(0)
#define BT_BTSTACK_LE_ADV BIT(1)
#define BT_BTSTACK_LE BIT(2)
extern const int config_stack_modules;
#define STACK_MODULES_IS_SUPPORT(x) (config_stack_modules & (x))
#define BD_ADDR_LEN 6
#define SYNC_TIMEOUT_MS(x) {(x / 10) & 0xff, (x / 10) >> 8}
#define ALIGN_2BYTE(size) (((size)+1)&0xfffffffe)
#define BYTE_LEN(x...) sizeof((u8 []) {x})
#define MS_TO_SLOT(x) (x * 8 / 5)
#define UINT24_TO_BYTE(x) \
{ \
(uint8_t)(x), \
(uint8_t)((x) >> 8), \
(uint8_t)((x) >> 16) \
}
typedef uint8_t bd_addr_t[BD_ADDR_LEN];
typedef uint16_t hci_con_handle_t;
typedef int (*sm_stack_packet_handler_t)(uint8_t packet_type, uint8_t *packet, uint16_t size);
typedef void (*btstack_packet_handler_t)(u8 packet_type, u16 channel, u8 *packet, u16 size);
typedef void (*ble_cbk_handler_t)(void);
void reverse_bd_addr(const bd_addr_t src, bd_addr_t dest);
void reverse_bytes(const u8 *src, u8 *dst, u32 len);
uint16_t little_endian_read_16(const uint8_t *buffer, int pos);
uint32_t little_endian_read_24(const uint8_t *buffer, int pos);
uint32_t little_endian_read_32(const uint8_t *buffer, int pos);
#endif
+152
View File
@@ -0,0 +1,152 @@
/*********************************************************************************************
* Filename : att.h
* Description :
* Author : minxian
* Email : liminxian@zh-jieli.com
* Last modifiled : 2020-07-01 16:33
* Copyright:(c)JIELI 2011-2020 @ , All Rights Reserved.
*********************************************************************************************/
#ifndef _BT_ATT_H_
#define _BT_ATT_H_
#include "typedef.h"
#include "btstack/btstack_typedef.h"
#if defined __cplusplus
extern "C" {
#endif
// Minimum/default MTU
#define ATT_DEFAULT_MTU 23
#define ATT_EVENT_MTU_EXCHANGE_COMPLETE 0xB5
#define ATT_EVENT_HANDLE_VALUE_INDICATION_COMPLETE 0xB6
#define ATT_EVENT_CAN_SEND_NOW 0xB7
#define ATT_TRANSACTION_MODE_NONE 0x0
#define ATT_TRANSACTION_MODE_ACTIVE 0x1
#define ATT_TRANSACTION_MODE_EXECUTE 0x2
#define ATT_TRANSACTION_MODE_CANCEL 0x3
#define ATT_TRANSACTION_MODE_VALIDATE 0x4
#define ATT_PROPERTY_BROADCAST 0x01
#define ATT_PROPERTY_READ 0x02
#define ATT_PROPERTY_WRITE_WITHOUT_RESPONSE 0x04
#define ATT_PROPERTY_WRITE 0x08
#define ATT_PROPERTY_NOTIFY 0x10
#define ATT_PROPERTY_INDICATE 0x20
typedef enum {
ATT_OP_AUTO_READ_CCC = 0, //server端 检查对方使能通知CCC来控制 notify or indicate发送
ATT_OP_NOTIFY = 1, //server端 默认notify方式发送,不检查使能通知CCC (不需要对方回应答包,没有流控)
ATT_OP_INDICATE = 2, //server端 默认INDICATE方式发送,不检查使能通知CCC (需要对方回应答包,有流控)
ATT_OP_READ, //client端 单次读, 用于获取<=MTU 的数据包 (需要对方回应答包,有流控)
ATT_OP_READ_LONG, //client端 多次读,用于支持获取>MTU 的数据包 (需要对方回应答包,有流控)
ATT_OP_WRITE, //client端 写发送 (需要对方回应答包,有流控)
ATT_OP_WRITE_WITHOUT_RESPOND,//client端 写发送 (不需要对方回应答包,没有流控)
//add here
ATT_OP_CMD_MAX = 15,
} att_op_type_e;
//------
typedef struct {
uint16_t start_group_handle;//
uint16_t end_group_handle;
uint16_t uuid16; //为0则是 uuid128
uint8_t uuid128[16];
} service_report_t; //==le_service_t
typedef struct {
uint16_t start_handle;
uint16_t value_handle; //属性操作handle
uint16_t end_handle;
uint16_t properties; //属性对应 ATT_PROPERTY_XXX
uint16_t uuid16; //为0则是 uuid128
uint8_t uuid128[16];
} charact_report_t; //==le_characteristic_t
typedef struct {
u16 packet_type; //数据包类型(notify,indicate,read_respone,...)
u16 value_handle; //属性操作handle
u16 value_offset; //包偏移
u16 blob_length; //包长度
u8 *blob; //包内容
u16 conn_handle; //连接handle
} att_data_report_t;
typedef struct {
service_report_t services;
charact_report_t characteristic;
u16 service_index;
u16 characteristic_index;
} search_result_t;
typedef struct {
u16 handle;//descriptor's handle
u16 uuid16;//为0则是 uuid128
u8 uuid128[16];
} charact_descriptor_t;
void att_ccc_config_init(void);
void att_set_ccc_config(uint16_t handle, uint16_t cfg);
uint16_t att_get_ccc_config(uint16_t handle);
void att_server_set_exchange_mtu(u16 con_handle);
void att_set_db(uint8_t const *db);//change profile_data
//多机接口
// 获取空闲的conn_handle存储索引
int get_att_handle_idle(void);
// 根据 conn_handle 获取存储索引
u8 get_att_handle_index(u16 conn_handle);
//初始化 CCC管理
void multi_att_ccc_config_init(void);
//设置CCC
void multi_att_set_ccc_config(uint16_t conn_handle, uint16_t att_handle, uint16_t cfg);
//获取CCC的值
uint16_t multi_att_get_ccc_config(uint16_t conn_handle, uint16_t att_handle);
//断开, 清链路CCC
int multi_att_clear_ccc_config(uint16_t conn_handle);
// ATT Client Read Callback for Dynamic Data
// - if buffer == NULL, don't copy data, just return size of value
// - if buffer != NULL, copy data and return number bytes copied
// @param con_handle of hci le connection
// @param attribute_handle to be read
// @param offset defines start of attribute value
// @param buffer
// @param buffer_size
typedef uint16_t (*att_read_callback_t)(uint16_t con_handle, uint16_t attribute_handle, uint16_t offset, uint8_t *buffer, uint16_t buffer_size);
// ATT Client Write Callback for Dynamic Data
// @param con_handle of hci le connection
// @param attribute_handle to be written
// @param transaction - ATT_TRANSACTION_MODE_NONE for regular writes, ATT_TRANSACTION_MODE_ACTIVE for prepared writes and ATT_TRANSACTION_MODE_EXECUTE
// @param offset into the value - used for queued writes and long attributes
// @param buffer
// @param buffer_size
// @param signature used for signed write commmands
// @returns 0 if write was ok, ATT_ERROR_PREPARE_QUEUE_FULL if no space in queue, ATT_ERROR_INVALID_OFFSET if offset is larger than max buffer
typedef int (*att_write_callback_t)(uint16_t con_handle, uint16_t attribute_handle, uint16_t transaction_mode, uint16_t offset, uint8_t *buffer, uint16_t buffer_size);
void ble_att_server_setup_init(const u8 *profile_db, att_read_callback_t read_cbk, att_write_callback_t write_cbk);
void att_server_request_can_send_now_event(hci_con_handle_t con_handle);
int att_server_notify(hci_con_handle_t con_handle, uint16_t attribute_handle, uint8_t *value, uint16_t value_len);
int att_server_indicate(hci_con_handle_t con_handle, uint16_t attribute_handle, uint8_t *value, uint16_t value_len);
extern void att_server_init(uint8_t const *db, att_read_callback_t read_callback, att_write_callback_t write_callback);
extern void att_server_register_packet_handler(btstack_packet_handler_t handler);
#endif
File diff suppressed because it is too large Load Diff
+77
View File
@@ -0,0 +1,77 @@
/*********************************************************************************************
* Filename : bluetooth_data_types.h
* Description :
* Author :
*********************************************************************************************/
/**
*/
#ifndef __BLUETOOTH_DATA_TYPES_H
#define __BLUETOOTH_DATA_TYPES_H
#define BLUETOOTH_DATA_TYPE_FLAGS 0x01 // Flags
#define BLUETOOTH_DATA_TYPE_INCOMPLETE_LIST_OF_16_BIT_SERVICE_CLASS_UUIDS 0x02 // Incomplete List of 16-bit Service Class UUIDs
#define BLUETOOTH_DATA_TYPE_COMPLETE_LIST_OF_16_BIT_SERVICE_CLASS_UUIDS 0x03 // Complete List of 16-bit Service Class UUIDs
#define BLUETOOTH_DATA_TYPE_INCOMPLETE_LIST_OF_32_BIT_SERVICE_CLASS_UUIDS 0x04 // Incomplete List of 32-bit Service Class UUIDs
#define BLUETOOTH_DATA_TYPE_COMPLETE_LIST_OF_32_BIT_SERVICE_CLASS_UUIDS 0x05 // Complete List of 32-bit Service Class UUIDs
#define BLUETOOTH_DATA_TYPE_INCOMPLETE_LIST_OF_128_BIT_SERVICE_CLASS_UUIDS 0x06 // Incomplete List of 128-bit Service Class UUIDs
#define BLUETOOTH_DATA_TYPE_COMPLETE_LIST_OF_128_BIT_SERVICE_CLASS_UUIDS 0x07 // Complete List of 128-bit Service Class UUIDs
#define BLUETOOTH_DATA_TYPE_SHORTENED_LOCAL_NAME 0x08 // Shortened Local Name
#define BLUETOOTH_DATA_TYPE_COMPLETE_LOCAL_NAME 0x09 // Complete Local Name
#define BLUETOOTH_DATA_TYPE_TX_POWER_LEVEL 0x0A // Tx Power Level
#define BLUETOOTH_DATA_TYPE_CLASS_OF_DEVICE 0x0D // Class of Device
#define BLUETOOTH_DATA_TYPE_SIMPLE_PAIRING_HASH_C 0x0E // Simple Pairing Hash C
#define BLUETOOTH_DATA_TYPE_SIMPLE_PAIRING_HASH_C_192 0x0E // Simple Pairing Hash C-192
#define BLUETOOTH_DATA_TYPE_SIMPLE_PAIRING_RANDOMIZER_R 0x0F // Simple Pairing Randomizer R
#define BLUETOOTH_DATA_TYPE_SIMPLE_PAIRING_RANDOMIZER_R_192 0x0F // Simple Pairing Randomizer R-192
#define BLUETOOTH_DATA_TYPE_DEVICE_ID 0x10 // Device ID
#define BLUETOOTH_DATA_TYPE_SECURITY_MANAGER_TK_VALUE 0x10 // Security Manager TK Value
#define BLUETOOTH_DATA_TYPE_SECURITY_MANAGER_OUT_OF_BAND_FLAGS 0x11 // Security Manager Out of Band Flags
#define BLUETOOTH_DATA_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE 0x12 // Slave Connection Interval Range
#define BLUETOOTH_DATA_TYPE_LIST_OF_16_BIT_SERVICE_SOLICITATION_UUIDS 0x14 // List of 16-bit Service Solicitation UUIDs
#define BLUETOOTH_DATA_TYPE_LIST_OF_32_BIT_SERVICE_SOLICITATION_UUIDS 0x1F // List of 32-bit Service Solicitation UUIDs
#define BLUETOOTH_DATA_TYPE_LIST_OF_128_BIT_SERVICE_SOLICITATION_UUIDS 0x15 // List of 128-bit Service Solicitation UUIDs
#define BLUETOOTH_DATA_TYPE_SERVICE_DATA 0x16 // Service Data
#define BLUETOOTH_DATA_TYPE_SERVICE_DATA_16_BIT_UUID 0x16 // Service Data - 16-bit UUID
#define BLUETOOTH_DATA_TYPE_SERVICE_DATA_32_BIT_UUID 0x20 // Service Data - 32-bit UUID
#define BLUETOOTH_DATA_TYPE_SERVICE_DATA_128_BIT_UUID 0x21 // Service Data - 128-bit UUID
#define BLUETOOTH_DATA_TYPE_LE_SECURE_CONNECTIONS_CONFIRMATION_VALUE 0x22 // LE Secure Connections Confirmation Value
#define BLUETOOTH_DATA_TYPE_LE_SECURE_CONNECTIONS_RANDOM_VALUE 0x23 // LE Secure Connections Random Value
#define BLUETOOTH_DATA_TYPE_URI 0x24 // URI
#define BLUETOOTH_DATA_TYPE_INDOOR_POSITIONING 0x25 // Indoor Positioning
#define BLUETOOTH_DATA_TYPE_TRANSPORT_DISCOVERY_DATA 0x26 // Transport Discovery Data
#define BLUETOOTH_DATA_TYPE_PUBLIC_TARGET_ADDRESS 0x17 // Public Target Address
#define BLUETOOTH_DATA_TYPE_RANDOM_TARGET_ADDRESS 0x18 // Random Target Address
#define BLUETOOTH_DATA_TYPE_APPEARANCE 0x19 // Appearance
#define BLUETOOTH_DATA_TYPE_ADVERTISING_INTERVAL 0x1A // Advertising Interval
#define BLUETOOTH_DATA_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS 0x1B // LE Bluetooth Device Address
#define BLUETOOTH_DATA_TYPE_LE_ROLE 0x1C // LE Role
#define BLUETOOTH_DATA_TYPE_SIMPLE_PAIRING_HASH_C_256 0x1D // Simple Pairing Hash C-256
#define BLUETOOTH_DATA_TYPE_SIMPLE_PAIRING_RANDOMIZER_R_256 0x1E // Simple Pairing Randomizer R-256
#define BLUETOOTH_DATA_TYPE_LIST_OF_32_BIT_SERVICE_SOLICITATION_UUIDS 0x1F // List of 32-bit Service Solicitation UUIDs
#define BLUETOOTH_DATA_TYPE_SERVICE_DATA_32_BIT_UUID 0x20 // Service Data - 32-bit UUID
#define BLUETOOTH_DATA_TYPE_SERVICE_DATA_128_BIT_UUID 0x21 // Service Data - 128-bit UUID
#define BLUETOOTH_DATA_TYPE_LE_SECURE_CONNECTIONS_CONFIRMATION_VALUE 0x22 // LE Secure Connections Confirmation Value
#define BLUETOOTH_DATA_TYPE_LE_SECURE_CONNECTIONS_RANDOM_VALUE 0x23 // LE Secure Connections Random Value
#define BLUETOOTH_DATA_TYPE_URI 0x24 // URI
#define BLUETOOTH_DATA_TYPE_INDOOR_POSITIONING 0x25 // Indoor Positioning
#define BLUETOOTH_DATA_TYPE_TRANSPORT_DISCOVERY_DATA 0x26 // Transport Discovery Data
#define BLUETOOTH_DATA_TYPE_LE_SUPPORTED_FEATURES 0x27 // LE Supported Features
#define BLUETOOTH_DATA_TYPE_CHANNEL_MAP_UPDATE_INDICATION 0x28 // Channel Map Update Indication
#define BLUETOOTH_DATA_TYPE_PB_ADV 0x29 // PB-ADV
#define BLUETOOTH_DATA_TYPE_MESH_MESSAGE 0x2A // Mesh Message
#define BLUETOOTH_DATA_TYPE_MESH_BEACON 0x2B // Mesh Beacon
#define BLUETOOTH_DATA_TYPE_BIGINFO 0x2C // BIGInfo
#define BLUETOOTH_DATA_TYPE_BROADCAST_CODE 0x2D // Broadcast_Code
#define BLUETOOTH_DATA_TYPE_RESOLVABLE_SET_IDENTIFIER 0x2E // Resolvable Set Identifier
#define BLUETOOTH_DATA_TYPE_ADVERTISING_INTERVAL_LONG 0x2F // Advertising Interval long
#define BLUETOOTH_DATA_TYPE_BROADCAST_NAME 0x30 // Broadcast_Name
#define BLUETOOTH_DATA_TYPE_ENCRYPTED_ADVERTISING_DATA 0x31 // Encrypted Advertising Data
#define BLUETOOTH_DATA_TYPE_PERIODIC_ADVERTISING_RESPONSE_TIMING_INFO 0x32 // Periodic Advertising Response Timing Information
#define BLUETOOTH_DATA_TYPE_3D_INFORMATION_DATA 0x3D // 3D Information Data
#define BLUETOOTH_DATA_TYPE_MANUFACTURER_SPECIFIC_DATA 0xFF // Manufacturer Specific Data
#endif
+58
View File
@@ -0,0 +1,58 @@
/*********************************************************************************************
* Filename : btstack_event.h
* Description :
* Author : Minxian
* Email : liminxian@zh-jieli.com
* Last modifiled : 2020-07-01 16:23
* Copyright:(c)JIELI 2011-2020 @ , All Rights Reserved.
*********************************************************************************************/
#ifndef __BT_GATT_H
#define __BT_GATT_H
#include "typedef.h"
typedef struct {
uint16_t start_group_handle;
uint16_t end_group_handle;
uint16_t uuid16;
uint8_t uuid128[16];
} le_service_t, gatt_client_service_t;
typedef struct {
uint16_t start_handle;
uint16_t value_handle;
uint16_t end_handle;
uint16_t properties;
uint16_t uuid16;
uint8_t uuid128[16];
} le_characteristic_t, gatt_client_characteristic_t;
typedef struct {
uint16_t handle;
uint16_t uuid16;
uint8_t uuid128[16];
} gatt_client_characteristic_descriptor_t;
void gatt_client_deserialize_service(const uint8_t *packet, int offset, gatt_client_service_t *service);
void gatt_client_deserialize_characteristic(const uint8_t *packet, int offset, gatt_client_characteristic_t *characteristic);
void gatt_client_deserialize_characteristic_descriptor(const uint8_t *packet, int offset, gatt_client_characteristic_descriptor_t *descriptor);
uint8_t gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t offset);
uint8_t gatt_client_read_value_of_characteristic_using_value_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t value_handle);
uint8_t gatt_client_write_value_of_characteristic_without_response(hci_con_handle_t con_handle, uint16_t value_handle, uint16_t value_length, uint8_t *value);
uint8_t gatt_client_write_value_of_characteristic(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t value_handle, uint16_t value_length, uint8_t *data);
void gatt_client_request_can_send_now_event(hci_con_handle_t con_handle);
#endif
+222
View File
@@ -0,0 +1,222 @@
/*********************************************************************************************
* Filename : le_counter.h
* Description :
* Author : Bingquan
* Email : bingquan_cai@zh-jieli.com
* Last modifiled : 2017-01-17 15:17
* Copyright:(c)JIELI 2011-2016 @ , All Rights Reserved.
*********************************************************************************************/
#ifndef __LE_COMMON_DEFINE_H_
#define __LE_COMMON_DEFINE_H_
#include "typedef.h"
#include <stdint.h>
#include "btstack/bluetooth.h"
//--------------------------------------------
#define ADV_SET_1M_PHY 1
#define ADV_SET_2M_PHY 2
#define ADV_SET_CODED_PHY 3
#define SCAN_SET_1M_PHY BIT(0)
#define SCAN_SET_2M_PHY BIT(1)
#define SCAN_SET_CODED_PHY BIT(2)
#define INIT_SET_1M_PHY BIT(0)
#define INIT_SET_2M_PHY BIT(1)
#define INIT_SET_CODED_PHY BIT(2)
#define CONN_SET_1M_PHY BIT(0)
#define CONN_SET_2M_PHY BIT(1)
#define CONN_SET_CODED_PHY BIT(2)
#define CONN_SET_PHY_OPTIONS_NONE 0
#define CONN_SET_PHY_OPTIONS_S2 1
#define CONN_SET_PHY_OPTIONS_S8 2
struct conn_param_t {
u16 interval;
u16 latency;
u16 timeout;
};
// #define NOTIFY_TYPE 1
// #define INDICATION_TYPE 2
// Minimum/default MTU
#define ATT_CTRL_BLOCK_SIZE (188) //note: fixed,libs use
#define ATT_PACKET_HEAD_SIZE (6) //note: fixed,libs use
/*adv type*/
enum {
ADV_IND = 0, /*Connectable and scannable undirected advertising*/
ADV_DIRECT_IND, /*Connectable high duty cycle directed advertising */
ADV_SCAN_IND, /*Scannable undirected advertising*/
ADV_NONCONN_IND, /*Non connectable undirected advertising*/
ADV_DIRECT_IND_LOW, /*Connectable low duty cycle directed advertising*/
};
/*adv channel*/
#define ADV_CHANNEL_37 BIT(0)
#define ADV_CHANNEL_38 BIT(1)
#define ADV_CHANNEL_39 BIT(2)
#define ADV_CHANNEL_ALL (ADV_CHANNEL_37 | ADV_CHANNEL_38 | ADV_CHANNEL_39)
/*scan type*/
enum {
SCAN_PASSIVE = 0,
SCAN_ACTIVE,
};
/*advertising report,event type*/
#define EVENT_ADV_IND ADV_IND
#define EVENT_ADV_DIRECT_IND ADV_DIRECT_IND
#define EVENT_ADV_SCAN_IND ADV_SCAN_IND
#define EVENT_ADV_NONCONN_IND ADV_NONCONN_IND
#define EVENT_SCAN_RSP (4)
#define EVENT_DEFAULT_REPORT_BITMAP (0x1f)
/*flags*/
#define FLAGS_LIMITED_DISCOVERABLE_MODE BIT(0)
#define FLAGS_GENERAL_DISCOVERABLE_MODE BIT(1)
#define FLAGS_EDR_NOT_SUPPORTED BIT(2)
#define FLAGS_LE_AND_EDR_SAME_CONTROLLER BIT(3)
#define FLAGS_LE_AND_EDR_SAME_HOST BIT(4)
/*eir packet_type*/
typedef enum {
HCI_EIR_DATATYPE_FLAGS = 0x01,
HCI_EIR_DATATYPE_MORE_16BIT_SERVICE_UUIDS = 0x02,
HCI_EIR_DATATYPE_COMPLETE_16BIT_SERVICE_UUIDS = 0x03,
HCI_EIR_DATATYPE_MORE_32BIT_SERVICE_UUIDS = 0x04,
HCI_EIR_DATATYPE_COMPLETE_32BIT_SERVICE_UUIDS = 0x05,
HCI_EIR_DATATYPE_MORE_128BIT_SERVICE_UUIDS = 0x06,
HCI_EIR_DATATYPE_COMPLETE_128BIT_SERVICE_UUIDS = 0x07,
HCI_EIR_DATATYPE_SHORTENED_LOCAL_NAME = 0x08,
HCI_EIR_DATATYPE_COMPLETE_LOCAL_NAME = 0x09,
HCI_EIR_DATATYPE_TX_POWER_LEVEL = 0x0A,
HCI_EIR_DATATYPE_CLASS_OF_DEVICE = 0x0D,
HCI_EIR_DATATYPE_SIMPLE_PAIRING_HASH_C = 0x0E,
HCI_EIR_DATATYPE_SIMPLE_PAIRING_RANDOMIZER_R = 0x0F,
HCI_EIR_DATATYPE_SECURITY_MANAGER_TK_VALUE = 0x10,
HCI_EIR_DATATYPE_SECURITY_MANAGER_OOB_FLAGS = 0x11,
HCI_EIR_DATATYPE_SLAVE_CONNECTION_INTERVAL_RANGE = 0x12,
HCI_EIR_DATATYPE_16BIT_SERVICE_SOLICITATION_UUIDS = 0x14,
HCI_EIR_DATATYPE_128BIT_SERVICE_SOLICITATION_UUIDS = 0x15,
HCI_EIR_DATATYPE_SERVICE_DATA = 0x16,
HCI_EIR_DATATYPE_APPEARANCE_DATA = 0x19,
HCI_EIR_DATATYPE_ADVERTISING_INTERVAL = 0X1A,
HCI_EIR_DATATYPE_LE_BLUETOOTH_DEVICE_ADDRESS = 0X1B,
HCI_EIR_DATATYPE_LE_ROLE = 0X1C,
HCI_EIR_DATATYPE_SIMPLE_PAIRING_HASH_C256 = 0X1D,
HCI_EIR_DATATYPE_SIMPLE_PAIRING_RANDOMIZER_R256 = 0X1E,
HCI_EIR_DATATYPE_LIST_OF_32BIT_SERVICE_SOLICITATION_UUIDS = 0X1F,
HCI_EIR_DATATYPE_SERVICE_DATA_32BIT_UUID = 0X20,
HCI_EIR_DATATYPE_SERVICE_DATA_128BIT_UUID = 0X21,
HCI_EIR_DATATYPE_LE_SECURE_CONNECTIONS_CONFIRMATION_VALUE = 0X22,
HCI_EIR_DATATYPE_LE_SECURE_CONNECTIONS_RANDOM_VALUE = 0X23,
HCI_EIR_DATATYPE_URI = 0X24,
HCI_EIR_DATATYPE_INDOOR_POSITIONING = 0X25,
HCI_EIR_DATATYPE_TRANSPORT_DISCOVERY_DATA = 0X26,
HCI_EIR_DATATYPE_LE_SUPPORTED_FEATURES = 0X27,
HCI_EIR_DATATYPE_CHANNEL_MAP_UPDATE_INDICATION = 0X28,
HCI_EIR_DATATYPE_BIGINFO = 0X2C,
HCI_EIR_DATATYPE_BROADCAST_CODE = 0X2D,
HCI_EIR_DATATYPE_RESOLVABLE_SET_IDENTIFIER = 0X2E,
HCI_EIR_DATATYPE_ADVERTISING_INTERVAL_LONG = 0X2F,
HCI_EIR_DATATYPE_BROADCAST_NAME = 0X30,
HCI_EIR_DATATYPE_3D_INFORMATION_DATA = 0X3D,
HCI_EIR_DATATYPE_MANUFACTURER_SPECIFIC_DATA = 0xFF
} HCI_EIR_datatype_t;
//按(长度 + 类型 + 内容)这样的格,组合填入广播包数据
static inline u8 make_eir_packet_data(u8 *buf, u16 offset, u8 data_type, u8 *data, u8 data_len)
{
if (ADV_RSP_PACKET_MAX - offset < data_len + 2) {
return offset + data_len + 2;
}
buf[0] = data_len + 1;
buf[1] = data_type;
memcpy(buf + 2, data, data_len);
return data_len + 2;
}
//按(长度 + 类型 + 内容)这样的格,组合填入广播包数据
static inline u8 make_eir_packet_val(u8 *buf, u16 offset, u8 data_type, u32 val, u8 val_size)
{
if (ADV_RSP_PACKET_MAX - offset < val_size + 2) {
return offset + val_size + 2;
}
buf[0] = val_size + 1;
buf[1] = data_type;
memcpy(buf + 2, &val, val_size);
return val_size + 2;
}
#define BLE_APPEARANCE_UNKNOWN 0 /**< Unknown. */
#define BLE_APPEARANCE_GENERIC_PHONE 64 /* Generic Phone. */
#define BLE_APPEARANCE_GENERIC_COMPUTER 128 /* Generic Computer. */
#define BLE_APPEARANCE_GENERIC_WATCH 192 /* Generic Watch. */
#define BLE_APPEARANCE_WATCH_SPORTS_WATCH 193 /* Watch: Sports Watch. */
#define BLE_APPEARANCE_GENERIC_CLOCK 256 /* Generic Clock. */
#define BLE_APPEARANCE_GENERIC_DISPLAY 320 /* Generic Display. */
#define BLE_APPEARANCE_GENERIC_REMOTE_CONTROL 384 /* Generic Remote Control. */
#define BLE_APPEARANCE_GENERIC_EYE_GLASSES 448 /* Generic Eye-glasses. */
#define BLE_APPEARANCE_GENERIC_TAG 512 /* Generic Tag. */
#define BLE_APPEARANCE_GENERIC_KEYRING 576 /* Generic Keyring. */
#define BLE_APPEARANCE_GENERIC_MEDIA_PLAYER 640 /* Generic Media Player. */
#define BLE_APPEARANCE_GENERIC_BARCODE_SCANNER 704 /* Generic Barcode Scanner. */
#define BLE_APPEARANCE_GENERIC_THERMOMETER 768 /* Generic Thermometer. */
#define BLE_APPEARANCE_THERMOMETER_EAR 769 /* Thermometer: Ear. */
#define BLE_APPEARANCE_GENERIC_HEART_RATE_SENSOR 832 /* Generic Heart rate Sensor. */
#define BLE_APPEARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT 833 /* Heart Rate Sensor: Heart Rate Belt. */
#define BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE 896 /* Generic Blood Pressure. */
#define BLE_APPEARANCE_BLOOD_PRESSURE_ARM 897 /* Blood Pressure: Arm. */
#define BLE_APPEARANCE_BLOOD_PRESSURE_WRIST 898 /* Blood Pressure: Wrist. */
#define BLE_APPEARANCE_GENERIC_HID 960 /* Human Interface Device (HID). */
#define BLE_APPEARANCE_HID_KEYBOARD 961 /* Keyboard (HID Subtype). */
#define BLE_APPEARANCE_HID_MOUSE 962 /* Mouse (HID Subtype). */
#define BLE_APPEARANCE_HID_JOYSTICK 963 /* Joystick (HID Subtype). */
#define BLE_APPEARANCE_HID_GAMEPAD 964 /* Gamepad (HID Subtype). */
#define BLE_APPEARANCE_HID_DIGITIZERSUBTYPE 965 /* Digitizer Tablet (HID Subtype). */
#define BLE_APPEARANCE_HID_CARD_READER 966 /* Card Reader (HID Subtype). */
#define BLE_APPEARANCE_HID_DIGITAL_PEN 967 /* Digital Pen (HID Subtype). */
#define BLE_APPEARANCE_HID_BARCODE 968 /* Barcode Scanner (HID Subtype). */
#define BLE_APPEARANCE_GENERIC_GLUCOSE_METER 1024 /* Generic Glucose Meter. */
#define BLE_APPEARANCE_GENERIC_RUNNING_WALKING_SENSOR 1088 /* Generic Running Walking Sensor. */
#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_IN_SHOE 1089 /* Running Walking Sensor: In-Shoe. */
#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_SHOE 1090 /* Running Walking Sensor: On-Shoe. */
#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_HIP 1091 /* Running Walking Sensor: On-Hip. */
#define BLE_APPEARANCE_GENERIC_CYCLING 1152 /* Generic Cycling. */
#define BLE_APPEARANCE_CYCLING_CYCLING_COMPUTER 1153 /* Cycling: Cycling Computer. */
#define BLE_APPEARANCE_CYCLING_SPEED_SENSOR 1154 /* Cycling: Speed Sensor. */
#define BLE_APPEARANCE_CYCLING_CADENCE_SENSOR 1155 /* Cycling: Cadence Sensor. */
#define BLE_APPEARANCE_CYCLING_POWER_SENSOR 1156 /* Cycling: Power Sensor. */
#define BLE_APPEARANCE_CYCLING_SPEED_CADENCE_SENSOR 1157 /* Cycling: Speed and Cadence Sensor. */
#define BLE_APPEARANCE_GENERIC_PULSE_OXIMETER 3136 /* Generic Pulse Oximeter. */
#define BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP 3137 /* Fingertip (Pulse Oximeter subtype). */
#define BLE_APPEARANCE_PULSE_OXIMETER_WRIST_WORN 3138 /* Wrist Worn(Pulse Oximeter subtype). */
#define BLE_APPEARANCE_GENERIC_WEIGHT_SCALE 3200 /* Generic Weight Scale. */
#define BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS_ACT 5184 /* Generic Outdoor Sports Activity. */
#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_DISP 5185 /* Location Display Device (Outdoor Sports Activity subtype). */
#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_DISP 5186 /* Location and Navigation Display Device (Outdoor Sports Activity subtype). */
#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_POD 5187 /* Location Pod (Outdoor Sports Activity subtype). */
#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_POD 5188 /* Location and Navigation Pod (Outdoor Sports Activity subtype). */
extern void le_l2cap_register_packet_handler(void (*handler)(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size));
#endif
+140
View File
@@ -0,0 +1,140 @@
#ifndef _LE_USER_H_
#define _LE_USER_H_
#include "typedef.h"
#include "btstack/btstack_typedef.h"
#include "ble_api.h"
#if defined __cplusplus
extern "C" {
#endif
#define BT_NAME_LEN_MAX 29
#define ADV_RSP_PACKET_MAX 31
// hci con handles (12 bit): 0x0000..0x0fff
#define HCI_CON_HANDLE_INVALID 0xffff
#define BTSTACK_EVENT_STATE 0x60
#define L2CAP_EVENT_CONNECTION_PARAMETER_UPDATE_RESPONSE 0x77
#define SM_EVENT_NUMERIC_COMPARISON_REQUEST 0xD6
#define SM_EVENT_JUST_WORKS_REQUEST 0xD0
#define SM_EVENT_JUST_WORKS_CANCEL 0xD1
#define SM_EVENT_PASSKEY_DISPLAY_NUMBER 0xD2
#define SM_EVENT_PASSKEY_DISPLAY_CANCEL 0xD3
#define SM_EVENT_PASSKEY_INPUT_NUMBER 0xD4
#define SM_EVENT_PASSKEY_INPUT_CANCEL 0xD5
#define SM_EVENT_PAIR_PROCESS 0xDF
//0xdf 's sub
#define SM_EVENT_PAIR_SUB_RECONNECT_START 0x01
#define SM_EVENT_PAIR_SUB_PIN_KEY_MISS 0x02
#define SM_EVENT_PAIR_SUB_PAIR_FAIL 0x03
#define SM_EVENT_PAIR_SUB_PAIR_TIMEOUT 0x04
#define SM_EVENT_PAIR_SUB_ENCRYPTION_FAIL 0x05
#define SM_EVENT_PAIR_SUB_SEND_DISCONN 0x0f
#define SM_EVENT_PAIR_SUB_ADD_LIST_SUCCESS 0x10
#define SM_EVENT_PAIR_SUB_ADD_LIST_FAILED 0x11
#define GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NONE 0
#define GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION 1
#define GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_INDICATION 2
#define GATT_EVENT_NOTIFICATION 0xA7
#define GATT_EVENT_INDICATION 0xA8
#define GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT 0xA5
#define GATT_EVENT_LONG_CHARACTERISTIC_VALUE_QUERY_RESULT 0xA6
// #define GATT_EVENT_SERVICE_QUERY_RESULT 0xA1
// #define GATT_EVENT_CHARACTERISTIC_QUERY_RESULT 0xA2
#define GATT_EVENT_QUERY_COMPLETE 0xA0
#define GAP_EVENT_ADVERTISING_REPORT 0xE2
// Authentication requirement flags
#define SM_AUTHREQ_NO_BONDING 0x00
#define SM_AUTHREQ_BONDING 0x01
#define SM_AUTHREQ_MITM_PROTECTION 0x04
#define SM_AUTHREQ_SECURE_CONNECTION 0x08
#define SM_AUTHREQ_KEYPRESS 0x10
#define SM_AUTHREQ_CT2 0x20
#define L2CAP_EVENT_CONNECTION_PARAMETER_UPDATE_RESPONSE 0x77
#define BT_OP_SUCCESS 0x00
#define BT_ERR_ADVERTISING_TIMEOUT 0x3C
//--------------------------------------------
struct ble_server_operation_t {
int(*adv_enable)(void *priv, u32 enable);
int(*disconnect)(void *priv);
int(*get_buffer_vaild)(void *priv);
int(*send_data)(void *priv, void *buf, u16 len);
int(*regist_wakeup_send)(void *priv, void *cbk);
int(*regist_recieve_cbk)(void *priv, void *cbk);
int(*regist_state_cbk)(void *priv, void *cbk);
int(*latency_enable)(void *priv, u32 enable);
};
void ble_get_server_operation_table(struct ble_server_operation_t **interface_pt);
//--------------------------------------------
struct ble_client_operation_t {
int(*scan_enable)(void *priv, u32 enable);
int(*disconnect)(void *priv);
int(*get_buffer_vaild)(void *priv);
int(*write_data)(void *priv, void *buf, u16 len);
int(*read_do)(void *priv);
int(*regist_wakeup_send)(void *priv, void *cbk);
int(*regist_recieve_cbk)(void *priv, void *cbk);
int(*regist_state_cbk)(void *priv, void *cbk);
int (*init_config)(void *priv, void *cfg);
int (*opt_comm_send)(u16 handle, u8 *data, u16 len, u8 att_op_type);
int (*set_force_search)(u8 onoff, s8 rssi);
int (*create_connect)(u8 *addr, u8 addr_type, u8 mode);
int (*create_connect_cannel)(void);
int (*get_work_state)(void);
int (*opt_comm_send_ext)(u16 conn_handle, u16 handle, u8 *data, u16 len, u8 att_op_type);
};
struct ble_client_operation_t *ble_get_client_operation_table(void);
static inline uint32_t ble_min(uint32_t a, uint32_t b)
{
return a < b ? a : b;
}
//---------------------------------------------------------------------------------------------------
//----------------------------------------
//----------------------------------------
extern int get_ble_btstack_state(void);
extern int get_indicate_state(void);
extern u8 get_ble_local_name(u8 *name_buf);
extern u8 get_ble_local_name_len();
extern void hci_event_callback_set(void(*cbk_ph)(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size));
extern void ll_hci_connection_updata(u8 *data);
#endif
+69
View File
@@ -0,0 +1,69 @@
/*********************************************************************************************
* Filename : sm.h
* Description :
* Author : Minxian
* Email : liminxian@zh-jieli.com
* Last modifiled : 2020-07-01 16:36
* Copyright:(c)JIELI 2011-2020 @ , All Rights Reserved.
*********************************************************************************************/
#ifndef _BT_SM_H_
#define _BT_SM_H_
#include "typedef.h"
// IO Capability Values
typedef enum {
IO_CAPABILITY_DISPLAY_ONLY = 0,
IO_CAPABILITY_DISPLAY_YES_NO,
IO_CAPABILITY_KEYBOARD_ONLY,
IO_CAPABILITY_NO_INPUT_NO_OUTPUT,
IO_CAPABILITY_KEYBOARD_DISPLAY, // not used by secure simple pairing
} io_capability_t;
void ble_sm_setup_init(io_capability_t io_type, u8 auth_req, uint8_t min_key_size, u8 security_en);
void ble_cbk_handler_register(btstack_packet_handler_t packet_cbk, sm_stack_packet_handler_t sm_cbk);
void sm_just_works_confirm(hci_con_handle_t con_handle);
void sm_init(void);
/*接口同时设置master 和 slave的配置*/
void sm_set_io_capabilities(io_capability_t io_capability);
/*接口只设置master配置*/
void sm_set_master_io_capabilities(io_capability_t io_capability);
/*接口同时设置master 和 slave的配置*/
void sm_set_authentication_requirements(uint8_t auth_req);
/*接口只设置master配置*/
void sm_set_master_authentication_requirements(uint8_t auth_req);
void sm_set_encryption_key_size_range(uint8_t min_size, uint8_t max_size);
void sm_set_request_security(int enable);
void sm_event_callback_set(void(*cbk_sm_ph)(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size));
//配从机默认发请求加密命令
void sm_set_request_security(int enable);
//配主机默认发加密请求命令
void sm_set_master_request_pair(int enable);
//指定链接发加密请求命令
bool sm_api_request_pairing(hci_con_handle_t con_handle);
//设置回连出现key missing后,流程重新发起加密
void sm_set_master_pair_redo(int enable);
//设置回连时,延时发起加密流程的时间,可用于兼容一些设备连接
void sm_set_master_reconnect_enc_delay(u16 delay_ms);
void sm_passkey_input(hci_con_handle_t con_handle, uint32_t passkey);
#endif
+239
View File
@@ -0,0 +1,239 @@
#ifndef _3TH_PROTOCOL_EVENT_H
#define _3TH_PROTOCOL_EVENT_H
//该文件只定义库里面和库外面都需要用得的第三方APP协议的消息和状态
#include<string.h>
#include <stdint.h>
#include "typedef.h"
#define DEMO_HANDLER_ID 0x300 /*作为一个使用的例子,同时也可作为客户自己添加协议的ID*/
#define GMA_HANDLER_ID 0x400 /*阿里天猫协议接口ID*/
#define MMA_HANDLER_ID 0x500 /*小米MMA协议接口ID*/
#define DMA_HANDLER_ID 0x600 /*百度DMA协议接口ID*/
#define TME_HANDLER_ID 0x700 /*腾讯酷狗TME协议接口ID*/
#define AMA_HANDLER_ID 0x800 /*亚马逊的AMA协议接口ID*/
#define REALME_HANDLER_ID 0x900 /*oppo真我的协议接口ID*/
#define GFPS_HANDLER_ID 0xA00 /*谷歌快对的协议接口ID*/
//app protocol公共消息
enum {
APP_PROTOCOL_COMMON_NOTICE = 0,
APP_PROTOCOL_CONNECTING, /*保留,暂未使用*/
APP_PROTOCOL_CONNECTED_BLE, /*APP通过BLE连接成功状态更新*/
APP_PROTOCOL_CONNECTED_SPP, /*APP通过SPP连接成功状态更新*/
APP_PROTOCOL_DISCONNECT, /*APP连接断开状态更新*/
APP_PROTOCOL_AUTH_PASS, /*连接认证通过标识更新*/
APP_PROTOCOL_SPEECH_ENCODER_TYPE,
APP_PROTOCOL_SPEECH_START, /*语音识别功能启动状态*/
APP_PROTOCOL_SPEECH_STOP, /*语音识别功能停止状态*/
APP_PROTOCOL_SET_VOLUME, /*app配置音量*/
APP_PROTOCOL_GET_VOLUME, /*app读取音量*/
APP_PROTOCOL_GET_AUX_STATUS, /*保留,暂未使用*/
APP_PROTOCOL_LIB_TWS_DATA_SYNC, /*需要更新给另一端tws数据*/
APP_PROTOCOL_GET_TWS_CHANNEL, /*库里面获取是左声道还是右声道*/
APP_PROTOCOL_COMMON_NOTICE_END = 0x14F,
};
//OTA消息
enum {
APP_PROTOCOL_OTA_COMMON_NOTICE = APP_PROTOCOL_COMMON_NOTICE_END + 1,
APP_PROTOCOL_OTA_CHECK,
APP_PROTOCOL_OTA_GET_APP_VERSION,
APP_PROTOCOL_OTA_CHECK_CRC,
APP_PROTOCOL_OTA_BEGIN,
APP_PROTOCOL_OTA_TRANS_DATA,
APP_PROTOCOL_OTA_PERCENT,
APP_PROTOCOL_OTA_END,
APP_PROTOCOL_OTA_SUCCESS,
APP_PROTOCOL_OTA_FAIL,
APP_PROTOCOL_OTA_CANCLE,
APP_PROTOCOL_OTA_REBOOT,
APP_PROTOCOL_OTA_COMMON_NOTICE_END = 0x1FF,
};
//GMA私有消息
enum {
APP_PROTOCOL_GMA_NOTICE_BEGIN = GMA_HANDLER_ID,
APP_PROTOCOL_GMA_FMTX_SETFRE, /*样机支持FM功能的APP配置fm参数*/
APP_PROTOCOL_GMA_FMTX_GETFRE, /*app获取当前的fm配置参数*/
APP_PROTOCOL_GMA_NOTICE_END = GMA_HANDLER_ID + 0xFF,
};
//MMA私有消息
enum {
APP_PROTOCOL_MMA_NOTICE = MMA_HANDLER_ID,
APP_PROTOCOL_MMA_SAVE_INFO, //库里面不直接访问VM接口,有些信息保存外面做
APP_PROTOCOL_MMA_READ_INFO,
APP_PROTOCOL_MMA_SAVE_ADV_COUNTER,
APP_PROTOCOL_MMA_READ_ADV_COUNTER,
APP_PROTOCOL_MMA_MANUFACTURER_DATA, //小米广播包的数据,
APP_PROTOCOL_MMA_FD2D_SERVICE_DATA, //小米广播包的数据,
APP_PROTOCOL_MMA_SAVE_ACCOUNT_KEY,
APP_PROTOCOL_MMA_READ_ACCOUNT_KEY,
APP_PROTOCOL_MMA_NOTICE_END = MMA_HANDLER_ID + 0xFF,
};
//DMA私有消息
enum {
APP_PROTOCOL_DMA_NOTICE = DMA_HANDLER_ID,
APP_PROTOCOL_DMA_SAVE_RAND, //库里面不直接访问VM接口,有些信息保存外面做
APP_PROTOCOL_DMA_READ_RAND,
APP_PROTOCOL_DMA_TWS_SNED_RAND,
APP_PROTOCOL_DMA_TTS_TYPE,
APP_PROTOCOL_DMA_SAVE_OTA_INFO, //库里面不直接访问VM接口,有些信息保存外面做
APP_PROTOCOL_DMA_READ_OTA_INFO,
APP_PROTOCOL_DMA_NOTICE_END = DMA_HANDLER_ID + 0xFF,
};
//REALME私有消息
enum {
APP_PROTOCOL_REALME_FEATURE_SWITCH = REALME_HANDLER_ID,
APP_PROTOCOL_REALME_FIND_MODE_SET,
APP_PROTOCOL_REALME_KEY_FUNC_SET,
APP_PROTOCOL_REALME_FREE_MUSIC_SET,
APP_PROTOCOL_REALME_NOISE_INFO,
APP_PROTOCOL_REALME_COMPACTNESS_DETECT,
APP_PROTOCOL_REALME_EQ_SET,
APP_PROTOCOL_REALME_HIGH_VOL_GAIN_SET,
APP_PROTOCOL_REALME_RELATE_DEVICE_INFO,
APP_PROTOCOL_REALME_UTC_TIME_SYNC,
APP_PROTOCOL_REALME_POWER_OFF_TIME_SET,
APP_PROTOCOL_REALME_MULTI_CONN_INFO,
APP_PROTOCOL_REALME_BASS_ENGINE_VALUE_SET,
APP_PROTOCOL_REALME_RESTORE_FACTORY,
APP_PROTOCOL_REALME_UPGRADE_OFFSET_SAVE,
APP_PROTOCOL_REALME_UPGRADE_OFFSET_READ,
APP_PROTOCOL_REALME_UPGRADE_OFFSET_CLEAR,
APP_PROTOCOL_REALME_UPGRADE_FIRMWARE_ID,
APP_PROTOCOL_REALME_UPGRADE_START,
APP_PROTOCOL_REALME_UPGRADE_END,
APP_PROTOCOL_REALME_UPGRADE_REBOOT,
APP_PROTOCOL_REALME_UPGRADE_SYNC,
APP_PROTOCOL_REALME_UPGRADE_ABORT,
APP_PROTOCOL_REALME_DEBUG_START,
APP_PROTOCOL_REALME_DEBUG_GET,
APP_PROTOCOL_REALME_DEBUG_STOP,
APP_PROTOCOL_REALME_DEBUG_DIAGNOSTIC,
APP_PROTOCOL_REALME_DEBUG_SET_PARAM,
};
#define REALME_MAX_KEY_NUM 10
struct __realme_special_id {
char product_id[4];
char *protocol_version;
uint8_t protocol_version_len;
char *version;
uint8_t version_len;
};
struct __realme_key_func {
uint8_t key_info[REALME_MAX_KEY_NUM][4];
uint8_t key_num;
};
struct __realme_nofity_flag {
bool battery_notify_flag;
bool earbuds_notify_flag;
bool noise_notify_flag;
bool compactness_notify_flag;
bool game_mode_notify_flag;
bool multi_conn_notify_flag;
bool user_ui_notify_flag;
bool conn_dev_notify_flag;
bool exception_info_notify_flag;
bool buried_point_notify_flag;
};
#define REALME_FEATURE_MAX_NUM (40)
struct __realme_info {
// vm
uint8_t feature_state[REALME_FEATURE_MAX_NUM];
uint8_t auto_power_off_time;
uint8_t eq_id;
uint8_t high_vol_gain_level;
uint8_t noise_info[2]; //
char min_bass_engine;
char max_bass_engine;
char cur_bass_engine;
struct __realme_key_func key_func;
struct __realme_nofity_flag notify_flag;
// const
// uint32_t realme_capabilities;
// uint16_t vid;
// uint8_t realme_color_id;
// uint8_t device_id_type; // 0:非 TWS 设备 1:TWS 设备
// struct __realme_special_id special_id;
// update
// uint8_t left_ear_status;
// uint8_t right_ear_status;
// uint8_t box_status;
// uint8_t left_ear_compactness;
// uint8_t right_ear_compactness;
// uint8_t left_ear_vol;
// uint8_t right_ear_vol;
// uint8_t audio_code;
// uint32_t time_stamp;
};
// GFPS私有消息
enum {
APP_PROTOCOL_GFPS_RING_STOP_ALL = GFPS_HANDLER_ID,
APP_PROTOCOL_GFPS_RING_RIGHT,
APP_PROTOCOL_GFPS_RING_LEFT,
APP_PROTOCOL_GFPS_RING_ALL,
APP_PROTOCOL_GFPS_HEARABLE_CONTROLS,
};
//APP_PROTOCOL获取电量的类型
#define APP_PROTOCOL_BAT_T_CHARGE_FLAG 0
#define APP_PROTOCOL_BAT_T_MAIN 1
#define APP_PROTOCOL_BAT_T_BOX 2
#define APP_PROTOCOL_BAT_T_TWS_LEFT 3
#define APP_PROTOCOL_BAT_T_TWS_RIGHT 4
#define APP_PROTOCOL_BAT_T_TWS_SIBLING 5
#define APP_PROTOCOL_BAT_T_LOW_POWER 6
#define APP_PROTOCOL_BAT_T_MAX 8
typedef struct _ota_frame_info_t {
u16 max_pkt_len;
u16 frame_crc;
u32 frame_size;
} ota_frame_info;
//*****//
typedef enum {
USER_NOTIFY_STATE_CONNECTED = 0, /**< 手机APP与设备建立连接 */
USER_NOTIFY_STATE_DISCONNECTED, /**< 手机APP与设备的连接断开 */
USER_NOTIFY_STATE_MOBILE_CONNECTED, /**< 手机与设备建立BT连接(A2DP、HFP、AVRCP */
USER_NOTIFY_STATE_MOBILE_DISCONNECTED, /**< 手机与设备BT连接(A2DP、HFP、AVRCP)断开 */
USER_NOTIFY_STATE_SEND_PREPARE_DONE, /**< 设备端进入可向手机发送数据的状态 */
USER_NOTIFY_STATE_TWS_CONNECT, /**< TWS类设备两端连接成功 */
USER_NOTIFY_STATE_TWS_DISCONNECT, /**< TWS类设备两端断开连接 */
USER_NOTIFY_STATE_BOX_OPEN, /**< 盒仓开启 */
USER_NOTIFY_STATE_BOX_CLOSE, /**< 盒仓关闭 */
USER_NOTIFY_STATE_ROLE_SWITCH_START, /**< TWS类设备开始进入主从切换流程 */
USER_NOTIFY_STATE_ROLE_SWITCH_FINISH, /**< TWS类设备主从切换完成 */
USER_NOTIFY_STATE_ROLE_SWITCH_REQUEST, /**< TWS类设备向APP发起主从切换请求 */
USER_NOTIFY_STATE_DOUBLE_CLICK, /**< 设备双击按键 */
USER_NOTIFY_STATE_KEYWORD_DETECTED, /**< 设备语音唤醒 */
USER_NOTIFY_STATE_BATTERY_LEVEL_UPDATE, /**< 通知耳机电量更新 */
USER_NOTIFY_STATE_ONE_CLICK, /**< 设备单击按键 */
} USER_NOTIFY_STATE;
typedef enum {
/*尽量返回简单的1或者0*/
CHECK_STATUS_TWS_MASTER,
CHECK_STATUS_TWS_SLAVE,
CHECK_STATUS_TWS_PAIR_STA, /*1是tws已经配对了,0是未配对*/
CHECK_STATUS_TWS_SIDE, /*0是单耳,1是左耳,2是右耳*/
CHECK_STATUS_TWS_REV,
CHECK_STATUS_TWS_REV1,
} CHECK_STATUS;
#endif
@@ -0,0 +1,146 @@
#ifndef __APP_PRO_LIBS_API_H__
#define __APP_PRO_LIBS_API_H__
#include "typedef.h"
///***************************************///
//GMA的函数接口汇集,begin
int gma_prev_init(void);
int gma_opus_voice_mic_send(uint8_t *voice_buf, uint16_t voice_len);
/*gma的总初始化函数**/
int gma_all_init(void);
/*gma的总的释放函数**/
int gma_all_exit(void);
int gma_connect_success(void);
void gma_set_active_ali_para(void *addr);
/*TWS的公共地址配置*/
void gma_set_sibling_mac_para(void *mac);
int gma_ble_adv_enable(u8 enable);
int gma_ble_ibeacon_adv(u8 enable);
//gma接收的数据处理函数
int gma_rx_loop(void);
/*gma命令和数据发送处理*/
int tm_data_send_process_thread(void);
int gma_start_voice_recognition(int flag);
int gma_disconnect(void *addr);
void gma_message_callback_register(int (*handler)(int id, int opcode, u8 *data, u32 len));
void gma_is_tws_master_callback_register(bool (*handler)(void));
void gma_tx_resume_register(void (*handler)(void));
void gma_rx_resume_register(void (*handler)(void));
/*注册电量的获取回调函数*/
void gma_get_battery_callback_register(bool (*handler)(u8 battery_type, u8 *value));
//ota interface
int gma_ota_requset_next_packet(void *priv, u32 offset, u16 len);
void gma_replay_ota_result(u8 result);
int tws_ota_get_data_from_sibling(u8 opcode, u8 *data, u8 len);
u8 tws_ota_control(int type, ...);
void tws_ota_app_event_deal(u8 evevt);
//gma apis ends
///***************************************///
//DMA apis begin
extern int dueros_process();
extern int dma_all_init(void);
extern int dma_all_exit(void);
extern void dma_message_callback_register(int (*handler)(int id, int opcode, u8 *data, u32 len));
extern void dma_check_status_callback_register(int (*handler)(int state_flag));
extern void dma_tx_resume_register(void (*handler)(void));
extern void dma_rx_resume_register(void (*handler)(void));
extern int dma_ble_adv_enable(u8 enable);
extern int dma_speech_data_send(u8 *buf, u16 len);
extern int dueros_send_process(void);
extern void dma_set_product_id_key(void *data);
extern int dma_pair_state();
extern int dma_start_voice_recognition(int en);
extern void dueros_dma_manufacturer_info_init();
extern int dma_disconnect(void *addr);
extern int dma_update_tws_state_to_lib(int state);
extern void dma_get_battery_callback_register(bool (*handler)(u8 battery_type, u8 *value));
extern void dma_set_pid(u32 pid);
extern int dma_tws_data_deal(u8 *data, int len);
//DMA apis ends
///***************************************///
//TME apis begins
extern void tme_get_battery_callback_register(bool (*handler)(u8 battery_type, u8 *value));
extern void tme_message_callback_register(int (*handler)(int id, int opcode, u8 *data, u32 len));
extern void tme_is_tws_master_callback_register(bool (*handler)(void));
extern void tme_tx_resume_register(void (*handler)(void));
extern void tme_rx_resume_register(void (*handler)(void));
extern int TME_protocol_process();
extern int tme_all_init(void);
extern int tme_all_exit(void);
/* extern u16 tme_speech_data_send(buf, len); */
extern int tme_ble_adv_enable(u8 enable);
extern int TME_send_packet_process(void);
extern void TME_recieve_packet_parse_process(void);
extern int tme_connect_success(void);
extern int tme_send_voice_data(u8 *buf, u16 len);
extern int tme_start_voice_recognition(int flag);
extern void tme_set_configuration_info(void *addr);
extern int tme_protocol_disconnect(void *priv);
extern void tme_set_pid(u32 pid);
extern void tme_set_bid(u32 bid);
extern u32 TME_request_ota_data(void *priv, u32 offset, u16 len);
extern void TME_notify_file_size(u32 file_size);
//TME api ends
///***************************************///
//MMA api begins
extern void mma_all_init(void);
extern void mma_all_exit(void);
extern void mma_ble_adv_enable(u8 enable);
extern int XM_speech_data_send(u8 *buf, u16 len);
extern bool XM_protocal_auth_pass(void);
extern int mma_start_voice_recognition(int ctrl);
extern void mma_message_callback_register(int (*handler)(int id, int opcode, u8 *data, u32 len));
extern void mma_is_tws_master_callback_register(bool (*handler)(void));
extern void mma_tx_resume_register(void (*handler)(void));
extern void mma_rx_resume_register(void (*handler)(void));
extern void mma_set_verdor_id(u16 pid);
extern void mma_set_product_id(u16 pid);
extern void mma_set_local_version(u16 version);
extern int mma_protocol_loop_process();
extern u32 mma_request_ota_data(void *priv, u32 offset, u16 len);
extern int mma_notify_file_size(u32 size);
extern u32 mma_report_ota_status(u8 state);
extern int mma_disconnect(void *addr);
extern void mma_tws_data_deal(u8 *data, int len);
extern void mma_get_battery_callback_register(bool (*handler)(u8 battery_type, u8 *value));
//MMA API END
///***************************************///
//GFPS apis begins
extern int gfps_all_init();
extern int gfps_all_exit();
extern int gfps_disconnect(void *addr);
extern int gfps_ble_adv_enable(u8 enable);
extern void gfps_set_model_id(uint8_t *model_id);
extern void gfps_set_anti_spoofing_public_key(char *public_key);
extern void gfps_set_anti_spoofing_private_key(char *private_key);
extern void gfps_get_battery_callback_register(bool (*handler)(u8 battery_type, u8 *value));
extern void gfps_message_callback_register(int (*handler)(int id, int opcode, u8 *data, u32 len));
extern void gfps_set_pair_mode(void *priv);
extern void gfps_battery_update(void);
extern void gfps_personalized_name_set(u8 *data, u8 len);
extern void gfps_is_tws_master_callback_register(bool (*handler)(void));
extern int gfps_tws_data_deal(u8 *data, int len);
extern int gfps_update_tws_state_to_lib(int state);
extern void gfps_factory_reset(void);
extern void gfps_set_battery_ui_enable(uint8_t enable);
extern void update_channel_map_do_in_irq_flag_set(uint8_t en);
//GFPS API END
#endif /* __APP_PRO_LIBS_API_H__ */
@@ -0,0 +1,160 @@
#ifndef _APP_BLE_SPP_API_H_
#define _APP_BLE_SPP_API_H_
#include "system/includes.h"
#include "btstack/bluetooth.h"
#include "btstack/avctp_user.h"
#include "list.h"
#include "timer.h"
#include "spp_user.h"
#include "btstack/le/le_common_define.h"
#include "btcontroller_modules.h"
#include "btstack/btstack_typedef.h"
/**********************************************
adv_type
**********************************************/
#define APP_ADV_IND (0) /*Connectable and scannable undirected advertising*/
#define APP_ADV_DIRECT_IND (1) /*Connectable high duty cycle directed advertising */
#define APP_ADV_SCAN_IND (2) /*Scannable undirected advertising*/
#define APP_ADV_NONCONN_IND (3) /*Non connectable undirected advertising*/
#define APP_ADV_DIRECT_IND_LOW (4) /*Connectable low duty cycle directed advertising*/
/**********************************************
adv_channel
**********************************************/
#define APP_ADV_CHANNEL_37 (BIT(0))
#define APP_ADV_CHANNEL_38 (BIT(1))
#define APP_ADV_CHANNEL_39 (BIT(2))
#define APP_ADV_CHANNEL_ALL (BIT(0)|BIT(1)|BIT(2))
extern int app_ble_set_adv_param(void *_hdl, u32 adv_interval, u8 adv_type, u8 adv_channel);
/**********************************************
ble adv
**********************************************/
extern int app_ble_adv_data_set(void *_hdl, u8 *data, u8 length);
extern int app_ble_rsp_data_set(void *_hdl, u8 *data, u8 length);
extern int app_ble_adv_enable(void *_hdl, u8 en);
// ble adv 5.0
extern int app_ble_adv_data_set_5_0(void *_hdl, le_set_ext_adv_data_t *param);
extern int app_ble_rsp_data_set_5_0(void *_hdl, le_set_ext_adv_data_t *param);
extern int app_ble_set_adv_param_5_0(void *_hdl, le_set_ext_adv_param_t *param);
extern int app_ble_adv_enable_5_0(void *_hdl, le_set_ext_adv_en_t *param);
extern int app_ble_set_mac_addr(void *_hdl, void *addr);
extern int app_ble_adv_address_type_set(void *_hdl, u8 address_type);
extern int app_ble_adv_skip(void *_hdl, u8 skip_cnt);
extern int app_ble_adv_state_get(void *_hdl);
/**********************************************
ble callback
**********************************************/
typedef void (*app_ble_packet_handler_t)(void *_hdl, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
typedef uint16_t (*app_ble_att_read_callback_t)(void *_hdl, uint16_t con_handle, uint16_t attribute_handle, uint16_t offset, uint8_t *buffer, uint16_t buffer_size);
typedef int (*app_ble_att_write_callback_t)(void *_hdl, uint16_t con_handle, uint16_t attribute_handle, uint16_t transaction_mode, uint16_t offset, uint8_t *buffer, uint16_t buffer_size);
typedef void (*app_ble_sm_event_callback_t)(void *_hdl, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
extern int app_ble_att_read_callback_register(void *_hdl, app_ble_att_read_callback_t read_callback);
extern int app_ble_att_write_callback_register(void *_hdl, app_ble_att_write_callback_t write_callback);
extern int app_ble_att_server_packet_handler_register(void *_hdl, app_ble_packet_handler_t handler);
extern int app_ble_hci_event_callback_register(void *_hdl, app_ble_packet_handler_t handler);
extern int app_ble_l2cap_packet_handler_register(void *_hdl, app_ble_packet_handler_t handler);
extern int app_ble_sm_event_callback_register(void *_hdl, app_ble_sm_event_callback_t callback);
extern int app_ble_att_client_status(void *_hdl, u8 *addr);
/**********************************************
ble module
**********************************************/
extern int app_ble_init(void);
extern int app_ble_exit(void);
extern void *app_ble_hdl_alloc(void);
extern int app_ble_hdl_free(void *_hdl);
extern int app_ble_sm_init(io_capability_t io_type, u8 auth_req, uint8_t min_key_size, u8 security_en);
extern int app_ble_profile_set(void *_hdl, const uint8_t *db);
extern int app_ble_set_filter_con_handle(void *_hdl, u16 con_handle);
extern int app_ble_disconnect(void *_hdl);
extern ble_cmd_ret_e app_ble_att_send_data(void *_hdl, u16 att_handle, u8 *data, u16 len, att_op_type_e att_op_type);
extern int app_ble_check_hdl_vaild(void *_hdl);
extern u16 app_ble_get_hdl_con_handle(void *_hdl);
extern int app_ble_att_vaild_len_get(void *_hdl);
extern int app_ble_no_profile_flag_set(void *_hdl, u8 flag);
extern int app_ble_set_ancs_connection_flag(void *_hdl, u8 flag);
extern u8 *app_ble_adv_addr_get(void *_hdl);
extern u8 *app_ble_local_mac_addr_get(void *_hdl);
extern u8 *app_ble_remote_mac_addr_get(void *_hdl);
extern int app_ble_common_core_data_size(void);
extern int app_ble_common_core_data_get(u8 *data);
extern int app_ble_common_core_data_set(u8 *data);
extern int app_ble_hdl_core_data_size(void);
extern int app_ble_hdl_core_data_get(void *_hdl, u8 *data);
extern int app_ble_hdl_core_data_set(void *_hdl, u8 *data);
extern int app_ble_adv_handle_get(void *_hdl);
// 如果BLE句柄设置了UUID,可以直接一次性同步所有设置了UUID的BLE句柄
extern int app_ble_hdl_uuid_set(void *_hdl, u32 uuid);
extern int app_ble_all_sync_data_size(void);
extern int app_ble_all_sync_data_get(u8 *sync_buf);
extern int app_ble_all_sync_data_set(u8 *sync_buf, int buf_len);
/**********************************************
spp module
**********************************************/
extern int app_spp_init(void);
extern int app_spp_exit(void);
extern void *app_spp_hdl_alloc(u8 local_id);
extern int app_spp_hdl_free(void *_hdl);
extern int app_spp_data_send(void *_hdl, u8 *buf, u16 len);
extern int app_spp_set_filter_remote_addr(void *_hdl, u8 *remote_addr);
extern int app_spp_clean_filter_remote_addr(void *_hdl);
extern int app_spp_disconnect(void *_hdl);
extern int app_spp_check_hdl_vaild(void *_hdl);
extern u8 *app_spp_get_hdl_remote_addr(void *_hdl);
extern int app_spp_hdl_core_data_size(void);
extern int app_spp_hdl_core_data_get(void *_hdl, u8 *data);
extern int app_spp_hdl_core_data_set(void *_hdl, u8 *data);
// 如果SPP句柄设置了UUID,可以直接一次性同步所有设置了UUID的BLE句柄
extern int app_spp_hdl_uuid_set(void *_hdl, u32 uuid);
extern int app_spp_all_sync_data_size(void);
extern int app_spp_all_sync_data_get(u8 *sync_buf);
extern int app_spp_all_sync_data_set(u8 *sync_buf, int buf_len);
/**********************************************
spp callback
**********************************************/
typedef void (*app_spp_recieve_callback_t)(void *hdl, void *remote_addr, u8 *buf, u16 len);
typedef void (*app_spp_state_callback_t)(void *hdl, void *remote_addr, u8 state);
typedef void (*app_spp_send_wakeup_callback_t)(void *hdl);
extern int app_spp_recieve_callback_register(void *_hdl, app_spp_recieve_callback_t callback);
extern int app_spp_state_callback_register(void *_hdl, app_spp_state_callback_t callback);
extern int app_spp_wakeup_callback_register(void *_hdl, app_spp_send_wakeup_callback_t callback);
extern int app_ble_att_handle_enable(void *_hdl, uint16_t start_handle, uint16_t end_handle, uint8_t enable);
extern int app_ble_att_handle_clear(void *_hdl);
/**********************************************
common
**********************************************/
#define APP_BLE_CONNECTION_COMPLETE (0x01)
#define APP_BLE_DISCONNECTION_COMPLETE (0x02)
#define APP_SPP_CONNECTION_COMPLETE (0x81)
#define APP_SPP_DISCONNECTION_COMPLETE (0x82)
typedef void (*app_state_update_callback_t)(void *_hdl, uint8_t state, uint8_t *packet, uint16_t size);
extern int app_ble_state_update_callback_regitster(app_state_update_callback_t callback);
extern int app_spp_state_update_callback_regitster(app_state_update_callback_t callback);
#endif // _APP_BLE_SPP_API_H_
+43
View File
@@ -0,0 +1,43 @@
#ifndef __BLE_USER_H__
#define __BLE_USER_H__
#include "typedef.h"
typedef enum {
BLE_ST_NULL = 0,
BLE_ST_INIT_OK, //协议栈初始化ok
BLE_ST_IDLE, //关闭广播或扫描状态
BLE_ST_CONNECT, //链路刚连上
BLE_ST_SEND_DISCONN, //发送断开命令,等待链路断开
BLE_ST_DISCONN, //链路断开状态
BLE_ST_CONNECT_FAIL, //连接失败
BLE_ST_CONNECTION_UPDATE_OK,//更新连接参数完成
BLE_ST_ADV = 0x20, //设备处于广播状态
BLE_ST_NOTIFY_IDICATE, //设备已连上,允许发数(已被主机使能通知)
BLE_ST_SCAN = 0x40, //设备处于搜索状态
BLE_ST_CREATE_CONN, //发起设备连接
BLE_ST_SEND_CREATE_CONN_CANNEL, //取消发起设备连接
BLE_ST_SEARCH_COMPLETE, //链路连上,已搜索完profile,可以发送数据操作
BLE_ST_SEND_STACK_EXIT = 0x60, //发送退出协议栈命令,等待完成
BLE_ST_STACK_EXIT_COMPLETE, //协议栈退出成功
} ble_state_e;
enum {
APP_BLE_NO_ERROR = 0,
APP_BLE_BUFF_FULL, //buffer 满,会丢弃当前发送的数据包
APP_BLE_BUFF_ERROR, //
APP_BLE_OPERATION_ERROR, //操作错误
APP_BLE_IS_DISCONN, //链路已断开
APP_BLE_NO_WRITE_CCC, //主机没有 write Client Characteristic Configuration
};
struct BLE_CONFIG_VAR {
ble_state_e JL_ble_status;
struct ble_server_operation_t *rcsp_ble;
};
#endif//__BLE_USER_H__
+14
View File
@@ -0,0 +1,14 @@
#ifndef __SPP_CONFIG_H__
#define __SPP_CONFIG_H__
#include "typedef.h"
bool bt_3th_spp_fw_ready(void *priv);
s32 bt_3th_spp_send(void *priv, void *data, u16 len);
void bt_3th_spp_callback_set(void (*resume)(void), void (*recieve)(void *, void *, u16), void (*status)(u8));
u8 bt_3th_get_jl_spp_status(void);
int bt_3th_spp_data_send(void *priv, u8 *buf, u16 len);
void bt_3th_spp_init(void);
void bt_3th_spp_get_operation_table(void);
#endif//__SPP_CONFIG_H__
+37
View File
@@ -0,0 +1,37 @@
#ifndef __SPP_USER_H__
#define __SPP_USER_H__
#include "typedef.h"
extern void (*spp_state_cbk)(u8 state);
extern void (*spp_recieve_cbk)(void *priv, u8 *buf, u16 len);
extern void user_spp_data_handler_in_lib(u8 packet_type, u16 ch, u8 *packet, u16 size);
struct spp_operation_t {
int(*disconnect)(void *priv);
int(*send_data)(void *priv, void *buf, u16 len);
int(*regist_wakeup_send)(void *priv, void *cbk);
int(*regist_recieve_cbk)(void *priv, void *cbk);
int(*regist_state_cbk)(void *priv, void *cbk);
int(*busy_state)(void);
};
enum {
SPP_USER_ERR_NONE = 0x0,
SPP_USER_ERR_SEND_BUFF_BUSY,
SPP_USER_ERR_SEND_OVER_LIMIT,
SPP_USER_ERR_SEND_FAIL,
};
enum {
SPP_USER_ST_NULL = 0x0,
SPP_USER_ST_CONNECT,
SPP_USER_ST_DISCONN,
SPP_USER_ST_WAIT_DISC,
SPP_USER_ST_CONNECT_OTA,
SPP_USER_ST_DISCONN_OTA,
};
void spp_get_operation_table(struct spp_operation_t **interface_pt);
#endif//__SPP_USER_H__
+261
View File
@@ -0,0 +1,261 @@
// binary representation
// attribute size in bytes (16), flags(16), handle (16), uuid (16/128), value(...)
#ifndef _FMNA_API_H
#define _FMNA_API_H
#include <stdint.h>
#include "btstack/bluetooth.h"
#define ret_code_t int
#define fmna_ret_code_t int
//ret_code & fmna_ret_code_t return,list result
#define FMY_SUCCESS 0 ///< Successful command
#define FMY_ERROR_INTERNAL 1 ///< Internal Error
#define FMY_ERROR_INVALID_STATE 2 ///< Invalid state, operation disallowed in this state
#define FMY_ERROR_INVALID_LENGTH 3 ///< Invalid Length
#define FMY_ERROR_INVALID_DATA 4 ///< Invalid Data
#define FMY_ERROR_NULL 5 ///< Null Pointer
#define FMY_ERROR_NO_MEM 6 ///< No memory
#define FMY_ERROR_WRITE_FLASH 7 ///<
typedef enum {
FMNA_SM_BOOT = 0,
FMNA_SM_PAIR,
FMNA_SM_SEPARATED,
FMNA_SM_NEARBY,
FMNA_SM_CONNECTING,
FMNA_SM_FMNA_PAIR,
FMNA_SM_FMNA_PAIR_COMPLETE,
FMNA_SM_CONNECTED,
FMNA_SM_DISCONNECTING,
FMNA_SM_NOCHANGE,
FMNA_SM_UNPAIR,
} FMNA_SM_State_t;
typedef enum {
FMNA_SM_EVENT_BOOT = 0,
FMNA_SM_EVENT_NEARBY_SEPARATED_TIMEOUT,
FMNA_SM_EVENT_KEY_ROTATE,
FMNA_SM_EVENT_BONDED,
FMNA_SM_EVENT_UNBONDED,
FMNA_SM_EVENT_CONNECTED,
FMNA_SM_EVENT_DISCONNECTED,
FMNA_SM_EVENT_NEARBY,
FMNA_SM_EVENT_SEPARATED,
FMNA_SM_EVENT_PAIR,
FMNA_SM_EVENT_SOUND_START,
FMNA_SM_EVENT_SOUND_STOP,
FMNA_SM_EVENT_SOUND_COMPLETE,
FMNA_SM_EVENT_LOST_UT_SPEAKER_START,
FMNA_SM_EVENT_FMNA_PAIRING_INITIATE,
FMNA_SM_EVENT_FMNA_PAIRING_FINALIZE,
FMNA_SM_EVENT_FMNA_PAIRING_COMPLETE,
FMNA_SM_EVENT_FMNA_PAIRING_MFITOKEN,
FMNA_SM_EVENT_MOTION_DETECTED,
FMNA_SM_EVENT_DEBUG_RESET_INTO_SEPARATED,
FMNA_SM_EVENT_CALL_FUNC_HANDLER = 0x80,
} FMNA_SM_Event_t;
typedef enum {
BAT_STATE_FULL = 0,
BAT_STATE_MEDIUM,
BAT_STATE_LOW,
BAT_STATE_CRITICALLY_LOW,//5.1.4,stop advertising
} fmna_bat_state_level_t;
typedef enum {
FMNA_ADV_MODE_FAST = 0,
FMNA_ADV_MODE_SLOW,
} FMNA_ADV_Mode_t;
typedef enum {
FMNA_SOUND_INIT = 0,
FMNA_SOUND_START,
FMNA_SOUND_STOP,
} FMNA_SOUND_OP_t;
enum {
FMNA_OTA_OP_SUCC = 0,
FMNA_OTA_OP_NO_SPACE,
FMNA_OTA_OP_INIT_FAIL,
FMNA_OTA_OP_WRITE_FAIL,
FMNA_OTA_OP_CRC_FAIL,
FMNA_OTA_OP_MALLOC_FAIL,
FMNA_OTA_OP_PKT_NUM_ERR,
FMNA_OTA_OP_LEN_ERR,
FMNA_OTA_OP_OTHER_ERR,
};
typedef enum {
FMNA_UARP_OTA_REQ = 1,
FMNA_UARP_OTA_FILE_INFO,
FMNA_UARP_OTA_DATA,
FMNA_UARP_OTA_END,
FMNA_UARP_OTA_DISCONNECT,
} uarp_cmd_type_t;
/*
0 = Powered
1 = Non-rechargeable battery
2 = Rechargeable battery
*/
typedef enum {
FMNA_BAT_POWERED = 0,
FMNA_BAT_NON_RECHARGEABLE,
FMNA_BAT_RECHARGEABLE,
} FMNA_battery_level_t;
struct fmna_event {
u8 event;
u8 args[3];
u32 value;
void *event_data;
void *handler;
};
//Accessory category
#define FMY_CATEGORY_Finder 1
#define FMY_CATEGORY_Other 128
#define FMY_CATEGORY_Luggage 129
#define FMY_CATEGORY_Backpack 130
#define FMY_CATEGORY_Jacket 131
#define FMY_CATEGORY_Coat 132
#define FMY_CATEGORY_Shoes 133
#define FMY_CATEGORY_Bike 134
#define FMY_CATEGORY_Scooter 135
#define FMY_CATEGORY_Stroller 136
#define FMY_CATEGORY_Wheelchair 137
#define FMY_CATEGORY_Boat 138
#define FMY_CATEGORY_Helmet 139
#define FMY_CATEGORY_Skateboard 140
#define FMY_CATEGORY_Skis 141
#define FMY_CATEGORY_Snowboard 142
#define FMY_CATEGORY_Surfboard 143
#define FMY_CATEGORY_Camera 144
#define FMY_CATEGORY_Laptop 145
#define FMY_CATEGORY_Watch 146
#define FMY_CATEGORY_Flash_drive 147
#define FMY_CATEGORY_Drone 148
#define FMY_CATEGORY_Headphones 149
#define FMY_CATEGORY_Earphones 150
#define FMY_CATEGORY_Inhaler 151
#define FMY_CATEGORY_Sunglasses 152
#define FMY_CATEGORY_Handbag 153
#define FMY_CATEGORY_Wallet 154
#define FMY_CATEGORY_Umbrella 155
#define FMY_CATEGORY_Water_bottle 156
#define FMY_CATEGORY_Tools_or_tool_box 157
#define FMY_CATEGORY_Keys 158
#define FMY_CATEGORY_Smart_case 159
#define FMY_CATEGORY_Remote 160
#define FMY_CATEGORY_Hat 161
#define FMY_CATEGORY_Motorbike 162
#define FMY_CATEGORY_Consumer_electronic_device 163
#define FMY_CATEGORY_Apparel 164
#define FMY_CATEGORY_Transportation_device 165
#define FMY_CATEGORY_Sports_equipment 166
#define FMY_CATEGORY_Personal_item 167
//Accessory capability
#define FMY_CAPABILITY_SUPPORTS_PLAY_SOUND BIT(0) //Supports play sound
#define FMY_CAPABILITY_SUPPORTS_MOTION_DETECTOR_UT BIT(1) //Supports motion detector UT
#define FMY_CAPABILITY_SUPPORTS_SN_LOOKUP_BY_NFC BIT(2) //Supports serial number lookup by NFC
#define FMY_CAPABILITY_SUPPORTS_SN_LOOKUP_BY_BLE BIT(3) //Supports serial number lookup by BLE
#define FMY_CAPABILITY_SUPPORTS_FW_UPDATE_SERVICE BIT(4) //Supports firmware update service
//uuid,mac type
#define STATIC_ADV_ADDR_TYPE_MASK (0x03 << 6)
#define FMY_UUID_SERVICE 0xFD44
#define APPLE_VENDOR_ID 0x004C
typedef struct {
uint16_t pairing_control_point_handle;
uint16_t owner_cfg_control_point_handle;
uint16_t non_owner_control_point_handle;
uint16_t owner_info_porint_handle;
uint16_t debug_control_point_handle;
uint16_t firmware_update_handle;
} fmna_att_handle_t;
typedef struct {
int (*evnet_post_msg)(u8 priv_event, void *evt_data, u32 value, void *handler);
int (*set_adv_data)(uint8_t fmna_state, uint8_t *fmna_payload, uint8_t size);
int (*set_adv_mode)(uint8_t mode);
int (*set_adv_enable)(uint8_t enable);
int (*get_mac)(uint8_t *mac);
int (*set_mac)(uint8_t *mac);
int (*att_send_data)(uint16_t conn_handle, uint16_t att_handle, uint8_t *data, uint16_t len, att_op_type_e op_type);
int (*get_battery_level)(void);
int (*call_disconnect)(uint16_t conn_handle, uint8_t reason);
int (*sound_control)(FMNA_SOUND_OP_t op);
int (*uarp_ota_process)(uarp_cmd_type_t cmd_type, uint8_t *recv_data, uint32_t recv_len);
int (*sensor_init)(void);
int (*sensor_deinit)(void);
bool (*motion_deteted)(void);
uint16_t (*state_callback)(FMNA_SM_State_t fmy_state, const char *state_string);
bool (*check_capability)(u8 cap);
} fmna_app_api_t;
typedef struct {
//读取信息时,指针为0则不获取对应项信息
uint8_t *serial_number;//16byte
uint8_t *uuid;//16byte
uint8_t *token;//1024byte
} fmna_input_cfg_t;
//--------------------------------------------------------------------------------
void fmna_gatt_set_att_handle_table(const fmna_att_handle_t *att_table);
void fmna_gatt_platform_connect(uint16_t conn_handle);
void fmna_state_machine_event_handle(void *event);
fmna_ret_code_t fmna_gatt_config_char_write_handler(uint16_t conn_handle, uint16_t uuid, uint16_t length, uint8_t const *data);
fmna_ret_code_t fmna_gatt_pairing_char_authorized_write_handler(uint16_t conn_handle, uint16_t uuid, uint16_t length, uint8_t const *data);
fmna_ret_code_t fmna_gatt_nonown_char_write_handler(uint16_t conn_handle, uint16_t uuid, uint16_t length, uint8_t const *data);
fmna_ret_code_t fmna_gatt_paired_owner_char_write_handler(uint16_t conn_handle, uint16_t uuid, uint16_t length, uint8_t const *data);
fmna_ret_code_t fmna_gatt_debug_char_write_handler(uint16_t conn_handle, uint16_t uuid, uint16_t length, uint8_t const *data);
fmna_ret_code_t fmna_gatt_uarp_char_write_handler(uint16_t conn_handle, uint16_t uuid, uint16_t length, uint8_t const *data);
void fmna_debug_control_point_rx_handler(uint16_t conn_handle, uint8_t const *data, uint16_t length) ;
void fmna_save_mac_vm_id(uint16_t vm_id);
void fmna_set_app_api(fmna_app_api_t *api_table);
bool fmna_connection_is_fmna_paired(void);
uint8_t fmna_get_current_state(void);
void fmna_gatt_set_mtu_size(uint16_t conn_handle, uint16_t mtu_size);
const uint8_t *fmna_get_product_data(void);
uint32_t fmna_version_get_fw_version(void);
uint8_t *fmna_version_get_network_version(void);
void fmna_set_accessory_category(const uint8_t *accessory_category);
const uint8_t *fmna_get_accessory_category(void);
uint32_t fmna_pm_peer_count(void);
void fmna_version_init(uint16_t major_number, uint8_t minor_number, uint8_t revision_number);
void fmna_paired_serialnumber_lookup_enable(uint8_t enable);
int fmna_get_paired_serialnumber_lookup_state(void);
void fmna_connection_connected_handler(uint16_t conn_handle, uint16_t conn_interval);
void fmna_connection_conn_param_update_handler(uint16_t conn_handle, uint16_t conn_interval);
void fmna_connection_disconnected_handler(uint16_t conn_handle, uint8_t disconnect_reason);
void fmna_connection_encryption_change_complete(uint16_t conn_handle, bool is_sucess);
int fmna_connection_pair_request_check(uint16_t conn_handle);
void fmna_connection_set_sys_max_connections(uint8_t max_connections);
void fmna_config_user_vm_rang(uint16_t vm_start_id, uint16_t vm_end_id);
void fmna_connection_disconnect_all(void);
void fmna_gatt_platform_recieve_indication_response(uint16_t conn_handle, uint16_t att_handle);
void fmna_plaform_reset_config(void);
void fmna_set_product_data(const uint8_t *data);
int fmna_Base64Decode(char *inStr, char *outHex, int outBufLen);
int uuid_str_to_hex(const char *uuid_str, uint8_t *out_buf);
void fmna_user_cfg_set_patch(const char *path);
ret_code_t fmna_user_cfg_open(void);
ret_code_t fmna_user_cfg_close(void);
ret_code_t fmna_user_cfg_write(fmna_input_cfg_t *input_cfg);
ret_code_t fmna_user_cfg_read(fmna_input_cfg_t *cfg);
ret_code_t fmna_set_crypto_enc_key_config(const char *server_enc_key, const char *signature_vf_key);
bool fmna_user_cfg_is_exist(void);
#endif
+107
View File
@@ -0,0 +1,107 @@
#ifndef _JL_RCSP_LIB_API_H_
#define _JL_RCSP_LIB_API_H_
#include "typedef.h"
#include "uart.h"
#define USE_LITTLE_ENDIAN 0
#define USE_BIG_ENDIAN 1
#define USE_ENDIAN_TYPE USE_LITTLE_ENDIAN
#define AI_LICENCE_LEN 16
enum {
TULING = 0,
DEEPBRAIN,
};
#pragma pack(1)
struct _AI_platform {
u8 platform;
u8 license[AI_LICENCE_LEN];
};
#pragma pack()
#pragma pack(1)
typedef struct _rcsp_auth_hdl {
u16 ble_con_handle;
u8 spp_remote_addr[6];
bool rcsp_auth_flag; // 是否认证成功
} JL_rcsp_auth_hdl;
#pragma pack()
u16 app_htons(u16 n);
u16 app_ntohs(u16 n);
u32 app_htonl(u32 n);
u32 app_ntohl(u32 n);
void JL_rcsp_auth_init(int (*send)(u16, u8 *, u8 *, u16, uint16_t, u8), u8 *link_key, u8 *addr);
void JL_rcsp_auth_reset(void);
/**
* @brief 判断buf是否是rcsp协议头
*
* @param buf
* @param len
*/
bool rcsp_protocol_head_check(u8 *buf, u16 len);
/**
* @brief 设备断开ble/spp时调用,重置重置认证情况
*
* @param ble_con_handle ble的con_handle句柄
* @param spp_remote_addr spp:mac_addr
*/
void JL_rcsp_reset_bthdl_auth(u16 ble_con_handle, u8 *spp_remote_addr);
/**
* @brief 获取设备是否rcsp验证
*
* @param ble_con_handle ble的con_handle句柄
* @param spp_remote_addr spp:mac_addr
*/
bool JL_rcsp_get_auth_flag_with_bthdl(u16 ble_con_handle, u8 *spp_remote_addr);
u8 JL_rcsp_get_auth_flag(void);
void JL_rcsp_set_auth_flag(u8 auth_flag);
/**
* @brief rcsp验证函数
*
* @param ble_con_handle ble的con_handle句柄
* @param spp_remote_addr spp:mac_addr
* @param buffer 手机发过来的验证数据
* @param len buffer 's length
*/
void JL_rcsp_auth_recieve(u16 ble_con_handle, u8 *spp_remote_addr, u8 *buffer, u16 len);
u8 get_rcsp_version(void);
/**
* @brief 设置设备rcsp验证情况
*
* @param hdl 第一个连接设备的认证情况
* @param hdl1 第二个连接设备的认证情况
*/
void JL_rcsp_set_auth_hdl(JL_rcsp_auth_hdl *hdl, JL_rcsp_auth_hdl *hdl1);
/**
* @brief 获取设备是否rcsp验证
*
* @param hdl 第一个连接设备的认证情况
* @param hdl1 第二个连接设备的认证情况
*/
void JL_rcsp_get_auth_hdl(JL_rcsp_auth_hdl *hdl, JL_rcsp_auth_hdl *hdl1);
/**
* @brief 设备连接认证/断开连接后lib会调用这个函数,
* 应用层需要调用JL_rcsp_get_auth_hdl获取手机的认证状态,
* 并把手机的认证情况同步到tws对端
*/
void JL_rcsp_auth_flag_tws_sync(void);
#endif //_JL_RCSP_LIB_H_
+15
View File
@@ -0,0 +1,15 @@
#ifndef __JL_RCSP_ATTR_H__
#define __JL_RCSP_ATTR_H__
#include "typedef.h"
typedef u32(*attr_get_func)(void *priv, u8 attr, u8 *buf, u16 buf_size, u32 offset);
typedef void (*attr_set_func)(void *priv, u8 attr, u8 *data, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
u16 add_one_attr_huge(u8 *buf, u16 max_len, u8 offset, u8 type, u8 *data, u16 size);
u8 add_one_attr(u8 *buf, u16 max_len, u8 offset, u8 type, u8 *data, u8 size);
u8 add_one_attr_ex(u8 *buf, u16 max_len, u8 offset, u8 type, u8 *data, u8 size, u8 att_size);
u8 add_one_attr_continue(u8 *buf, u16 max_len, u8 offset, u8 type, u8 *data, u8 size);
u32 attr_get(void *priv, u8 *buf, u16 buf_size, const attr_get_func *func_tab, u8 attr_max, u32 mask);
void attr_set(void *priv, u8 *data, u16 len, const attr_set_func *func_tab, u8 attr_max, u16 ble_con_handle, u8 *spp_remote_addr);
#endif//__JL_RCSP_ATTR_H__
+122
View File
@@ -0,0 +1,122 @@
#ifndef __JL_PACKET_H__
#define __JL_PACKET_H__
#include "typedef.h"
#include "generic/list.h"
#define READ_BIG_U16(a) ((*((u8*)(a)) <<8) + *((u8*)(a)+1))
#define READ_BIG_U32(a) ((*((u8*)(a)) <<24) + (*((u8*)(a)+1)<<16) + (*((u8*)(a)+2)<<8) + *((u8*)(a)+3))
#define READ_LIT_U16(a) (*((u8*)(a)) + (*((u8*)(a)+1)<<8))
#define READ_LIT_U32(a) (*((u8*)(a)) + (*((u8*)(a)+1)<<8) + (*((u8*)(a)+2)<<16) + (*((u8*)(a)+3)<<24))
#define WRITE_BIG_U16(a,src) {*((u8*)(a)+0) = (u8)(src>>8); *((u8*)(a)+1) = (u8)(src&0xff); }
#define WRITE_BIG_U32(a,src) {*((u8*)(a)+0) = (u8)((src)>>24); *((u8*)(a)+1) = (u8)(((src)>>16)&0xff);*((u8*)(a)+2) = (u8)(((src)>>8)&0xff);*((u8*)(a)+3) = (u8)((src)&0xff);}
#define WRITE_LIT_U16(a,src) {*((u8*)(a)+1) = (u8)(src>>8); *((u8*)(a)+0) = (u8)(src&0xff); }
#define WRITE_LIT_U32(a,src) {*((u8*)(a)+3) = (u8)((src)>>24); *((u8*)(a)+2) = (u8)(((src)>>16)&0xff);*((u8*)(a)+1) = (u8)(((src)>>8)&0xff);*((u8*)(a)+0) = (u8)((src)&0xff);}
#pragma pack(1)
typedef union __HEAD_BIT {
struct {
u16 _OpCode: 8; //OpCode val
u16 _app_type : 3; //app_type
u16 _unsed : 3; //unsed
u16 _resp : 1; //request for response
u16 _type : 1; //command or response
} _i;
u16 _t;
} HEAD_BIT;
struct __JL_PACKET {
u8 tag[3];
HEAD_BIT head;
u16 length;
u8 data[0];
};
#pragma pack()
typedef struct __JL_PACKET JL_PACKET;
typedef struct __JL_QUEUE {
struct list_head head;
u32 total_size;
u32 max_size;
} JL_QUEUE;
typedef struct __JL_PACKET_ENTRY {
struct list_head entry;
u16 packet_size;
u8 packet[0];
} JL_PACKET_ENTRY;
struct __JL_PACKET_CONTROL {
JL_PACKET packet;
JL_QUEUE queue;
u8 *packet_buf;
u32 packet_offset;
u32 packet_remain;
};
typedef struct __JL_PACKET_CONTROL JL_PACKET_CONTROL;
#define JL_PACK_START_TAG0 (0xfe)
#define JL_PACK_START_TAG1 (0xdc)
#define JL_PACK_START_TAG2 (0xba)
#define JL_PACK_END_TAG (0xef)
#define JL_ONE_PACKET_LEN(n) (sizeof(JL_PACKET) + n + 1)
#ifdef JL_RCSP_UBOOT_LIB
#define JL_MTU_RESV (540L)
#define JL_MTU_SEND (128L)
#define JL_RECIEVE_BUF_SIZE ((JL_MTU_RESV + sizeof(JL_PACKET))*2)
#define JL_CMD_POOL_SIZE (JL_MTU_SEND)
#define JL_RESP_POOL_SIZE (JL_MTU_SEND*2)
#define JL_WAIT_RESP_POOL_SIZE (JL_MTU_SEND)
#else
#define JL_MTU_RESV (540L)
#define JL_MTU_SEND (128L)
#define JL_RECIEVE_BUF_SIZE (JL_MTU_RESV + sizeof(JL_PACKET) + 128)
#define JL_CMD_POOL_SIZE (JL_MTU_SEND*4)
#define JL_RESP_POOL_SIZE (JL_MTU_SEND*2)
#define JL_WAIT_RESP_POOL_SIZE (JL_MTU_SEND*2)
#endif
void set_jl_rcsp_recieve_buf_size(u16 size);
u16 rcsp_packet_write_alloc_len(void);
u32 rcsp_packet_need_buf_size(void);
u32 rcsp_packet_buf_init(u8 *buf, u32 len, u8 *buf1, u32 len1);
u16 JL_packet_get_rx_max_mtu(void);
u16 JL_packet_get_tx_max_mtu(void);
u16 JL_packet_set_mtu(u16 mtu);
void JL_packet_recieve(void *buf, u16 len, u8 buf_index);
void JL_packet_clear_all_data(void);
bool JL_packet_find(u8 **r_buf, JL_PACKET **packet, u8 buf_index);
void JL_packet_init(void);
void JL_packet_clear(void);
void JL_packet_packing(
JL_PACKET *packet,
u8 OpCode,
u8 type,
u8 request_rsp,
u8 *extra_param,
u16 extra_len,
u8 *data,
u16 len);
void set_jl_mtu_resv(u16 jl_mtu_resv_var);
void set_jl_mtu_send(u16 jl_mtu_send_var);
extern u16 jl_mtu_resv;
extern u16 jl_mtu_send;
extern u16 jl_recieve_buf_size;
extern u16 jl_cmd_pool_size;
extern u16 jl_rcsp_pool_size;
extern u16 jl_wait_rcsp_pool_size;
#endif//__JL_PACKET_H__
@@ -0,0 +1,105 @@
#ifndef __JL_PROTOCOL_H__
#define __JL_PROTOCOL_H__
#include "typedef.h"
#include "JL_rcsp_packet.h"
enum {
JL_NOT_NEED_RESPOND = 0,
JL_NEED_RESPOND,
};
typedef enum __JL_ERR {
JL_ERR_NONE = 0x0,
JL_ERR_SEND_DATA_OVER_LIMIT,
JL_ERR_SEND_BUSY,
JL_ERR_SEND_NOT_READY,
JL_ERR_EXIT,
JL_ERR_SLAVE_SEND,
JL_ERR_MAX,
} JL_ERR;
typedef enum __JL_PRO_STATUS {
JL_PRO_STATUS_SUCCESS = 0x0,
JL_PRO_STATUS_FAIL,
JL_PRO_STATUS_UNKOWN_CMD,
JL_PRO_STATUS_BUSY,
JL_PRO_STATUS_NO_RESPONSE,
JL_PRO_STATUS_CRC_ERR,
JL_PRO_STATUS_ALL_DATA_CRC_ERR,
JL_PRO_STATUS_PARAM_ERR,
JL_PRO_STATUS_RESP_DATA_OVER_LIMIT,
} JL_PRO_STATUS;
///*< JL_CMD、JL_CMD_response、JL_DATA、JL_DATA_response packet send functions>*/
JL_ERR JL_CMD_send(u8 OpCode, u8 *data, u16 len, u8 request_rsp, u16 ble_con_handle, u8 *spp_remote_addr);
JL_ERR JL_CMD_response_send(u8 OpCode, u8 status, u8 sn, u8 *data, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
JL_ERR JL_DATA_send(u8 OpCode, u8 CMD_OpCode, u8 *data, u16 len, u8 request_rsp, u16 ble_con_handle, u8 *spp_remote_addr);
JL_ERR JL_DATA_response_send(u8 OpCode, u8 status, u8 sn, u8 CMD_OpCode, u8 *data, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
///*<JL_CMD、JL_CMD_response、JL_DATA、JL_DATA_response recieve>*/
typedef struct __JL_PRO_CB {
/*send function callback, SPP or ble*/
void *priv;
// bool (*fw_ready)(void *priv);
// s32(*fw_send)(void *priv, void *buf, u16 len);
/*JL_CMD、JL_CMD_response、JL_DATA、JL_DATA_response packet recieve callback*/
void (*CMD_resp)(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
void (*DATA_resp)(void *priv, u8 OpCode_SN, u8 CMD_OpCode, u8 *data, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
void (*CMD_no_resp)(void *priv, u8 OpCode, u8 *data, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
void (*DATA_no_resp)(void *priv, u8 CMD_OpCode, u8 *data, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
void (*CMD_recieve_resp)(void *priv, u8 OpCode, u8 status, u8 *data, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
void (*DATA_recieve_resp)(void *priv, u8 status, u8 CMD_OpCode, u8 *data, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
u8(*wait_resp_timeout)(void *priv, u8 OpCode, u8 counter);
// void (*auth_pass_callback)(void *priv);
} JL_PRO_CB;
#pragma pack(1)
typedef struct _rcsp_bound_hdl {
u16 ble_con_handle;
u8 spp_remote_addr[6];
} JL_rcsp_bound_hdl;
#pragma pack()
// 一拖二设备标识与底层buf的绑定
void rcsp_protocol_bound(u16 ble_con_handle, u8 *spp_remote_addr);
// 一拖二设备标识与底层buf的解除绑定
void rcsp_protocol_reset_bound(u16 ble_con_handle, u8 *spp_remote_addr);
/**
* @brief 设置协议绑定信息
*
* @param hdl 第一个连接设备的协议绑定信息
* @param hdl1 第二个连接设备的协议绑定信息
*/
void rcsp_protocol_set_bound_hdl(JL_rcsp_bound_hdl *hdl, JL_rcsp_bound_hdl *hdl1);
/**
* @brief 获取协议绑定信息
*
* @param hdl 第一个连接设备的协议绑定信息
* @param hdl1 第二个连接设备的协议绑定信息
*/
void rcsp_protocol_get_bound_hdl(JL_rcsp_bound_hdl *hdl, JL_rcsp_bound_hdl *hdl1);
extern u32 rcsp_protocol_need_buf_size(void);
extern void JL_protocol_init(u8 *buf, u32 len);
extern void JL_protocol_exit(void);
extern void JL_protocol_dev_switch(const JL_PRO_CB *cb);
extern void JL_protocol_data_recieve(void *priv, void *buf, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
extern void JL_protocol_resume(void);
extern bool rcsp_send_list_is_empty(void);
extern void JL_send_packet_process(void);
extern void JL_recieve_packet_parse_process(void);
#endif//__JL_PROTOCOL_H__
@@ -0,0 +1,167 @@
#ifndef _BTSTACK_RCSP_USER_H_
#define _BTSTACK_RCSP_USER_H_
#include "typedef.h"
#include "JL_rcsp_api.h"
#include "JL_rcsp_packet.h"
#include "JL_rcsp_protocol.h"
#include "btstack/le/att.h"
extern void *rcsp_server_ble_hdl; // ble连接handle
extern void *rcsp_server_ble_hdl1; // ble连接handlercsp双连的时候有效
/**
* @brief rcsp ble/spp handle初始化
*/
void bt_rcsp_interface_init(const uint8_t *rcsp_profile_data);
/**
* @brief rcsp ble/spp handle退出并销毁
*/
void bt_rcsp_interface_exit(void);
/**
* @brief 获取rcsp已连接设备数目
*
* @result 返回连接的手机设备数
*/
u8 bt_rcsp_device_conn_num(void);
/**
* @brief 获取当前已连接ble数目
*
* @result 返回连接的ble手机设备数
*/
u8 bt_rcsp_ble_conn_num(void);
/**
* @brief 获取当前已连接spp数目
*
* @result 返回连接的spp手机设备数
*/
u8 bt_rcsp_spp_conn_num(void);
/**
* @brief 在连接或断开的时候,设置rcsp蓝牙连接信息
*
* @param con_handle ble连接或断开时输入
* @param remote_addr spp连接或断开时输入
* @param isconn true:连接;false:断开
*/
void bt_rcsp_set_conn_info(u16 con_handle, void *remote_addr, bool isconn);
/**
* @brief 用于tws同步,从机接收到主机的tws数据后同步到本地
*
* @param bt handle数据
* @param bt handle数据长度
*/
void rcsp_interface_set_bt_hdl_with_tws_data(u8 *recieve_buf, u16 recieve_len);
/**
* @brief rcsp用户自定义ble广播名字
*/
// _WEAK_ const char *rcsp_ble_name()
/**
* @brief 用于外部接收ble/spp自定义数据使用
*
* @param ble_con_hdl ble发送句柄
* @param remote_addr spp发送地址
* @param buf 接收数据
* @param len 接收数据的长度
* @param att_handle ble_con_hdl有值时,ble的特征值,一般是用户自定义的特征
*/
// _WEAK_ void bt_rcsp_custom_recieve_callback(u16 ble_con_hdl, void *remote_addr, u8 *buf, u16 len, uint16_t att_handle)
/**
* @brief 用于发送ble/spp自定义数据使用
*
* @param ble_con_hdl ble发送句柄
* @param remote_addr spp发送地址 注:当ble_con_hdl与remote_addr都不填时,给所有的设备都发数据
* @param buf 发送的数据
* @param len 发送的数据长度
* @param att_handle ble_con_hdl有值时,可填用户自定义的特征, 为0是rcsp的特征值
* @param att_op_type 参考att_op_type_e枚举的排序
*/
void bt_rcsp_custom_data_send(u16 ble_con_hdl, u8 *remote_addr, u8 *buf, u16 len, uint16_t att_handle, att_op_type_e att_op_type);
/**
* @brief 用于rcsp接收ble/spp数据使用
*
* @param hdl ble/spp发送句柄
* @param remote_addr spp发送地址
* @param buf 接收数据
* @param len 接收数据的长度
*/
void bt_rcsp_recieve_callback(void *hdl, void *remote_addr, u8 *buf, u16 len);
/**
* @brief 设置rcsp的ble的默认发送特征
*
* @param att_handle ble_con_hdl有值时,可填用户自定义的特征, 为0是rcsp的特征值
* @param att_op_type 参考att_op_type_e枚举的排序,为0是rcsp的特征值
*/
void bt_rcsp_set_default_send_att_msg(uint16_t att_handle, att_op_type_e att_op_type);
/**
* @brief 用于发送rcsp的数据使用
*
* @param ble_con_hdl ble发送句柄
* @param remote_addr spp发送地址 注:当ble_con_hdl与remote_addr都不填时,给所有的设备都发数据
* @param buf 发送的数据
* @param len 发送的数据长度
* @param att_handle ble_con_hdl有值时,可填用户自定义的特征, 为0是rcsp的特征值,或者是bt_rcsp_set_default_send_att_msg设置的
* @param att_op_type 参考att_op_type_e枚举的排序,为0是rcsp默认配置,或者是bt_rcsp_set_default_send_att_msg设置的
*/
int bt_rcsp_data_send(u16 ble_con_hdl, u8 *remote_addr, u8 *buf, u16 len, uint16_t att_handle, u8 att_op_type);
/**
* @brief 获取当前ble连接设备的mac地址
*/
u8 *rcsp_get_ble_hdl_remote_mac_addr(u16 ble_con_handle);
/**
* @brief 获取tws同步的bt handle的总buf大小
*/
u16 rcsp_interface_tws_sync_buf_size();
/**
* @brief rcsp主机同步bt handle数据给从机
*
* @param send_buf 外部malloc的一个指针,size根据rcsp_interface_tws_sync_buf_size获取
*/
void rcsp_interface_tws_sync_buf_content(u8 *send_buf);
/**
* @brief tws同步rcsp bt_handle信息,用于tws同步ble句柄信息
* 已实现于rcsp_bt_manage.c
*/
// _WEAK_ void rcsp_interface_bt_handle_tws_sync(void)
/**
* @brief 用于外部自定义att_read_callback的使用
*
* @param hdl ble的结构体句柄
* @param connection_handle ble的连接句柄
* @param att_handle ble特征值
* @param offset
* @param buffer 读特征的数据
* @param buffer_size 读特征的数据长度
*/
// _WEAK_ uint16_t bt_rcsp_custom_att_read_callback(void *hdl, hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t offset, uint8_t *buffer, uint16_t buffer_size)
/**
* @brief 用于外部自定义att_write_callback的使用
*
* @param hdl ble的结构体句柄
* @param connection_handle ble的连接句柄
* @param att_handle ble特征值
* @param transaction_mode
* @param offset
* @param buffer 写特征的数据
* @param buffer_size 写特征的数据长度
*/
// _WEAK_ void bt_rcsp_custom_att_write_callback(void *hdl, hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t transaction_mode, uint16_t offset, uint8_t *buffer, uint16_t buffer_size)
#endif // _BTSTACK_RCSP_USER_H_
@@ -0,0 +1,50 @@
#ifndef __SCREEN_EAR_INTERFACE_H__
#define __SCREEN_EAR_INTERFACE_H__
#include "typedef.h"
/*-------------------CMD start----------------------*/
#define CUSTOM_ALL_INFO_CMD 0xff // 所有信息
#define CUSTOM_BT_CONNECT_STATE_CMD 0x1 // bt连接状态
#define CUSTOM_BLE_CONNECT_STATE_CMD 0x2 // ble连接状态
#define CUSTOM_BLE_BATTERY_STATE_CMD 0x3 // 电量信息
#define CUSTOM_BLE_VOLUMEN_CMD 0x4 // 音量信息
#define CUSTOM_BLE_TIME_DATE_CMD 0x5 // 时间信息
#define CUSTOM_EQ_DATE_CMD 0x6 // EQ信息
#define CUSTOM_ANC_DATE_CMD 0x7 // ANC信息
#define CUSTOM_CALL_STATE_CMD 0x8 // 通话状态获取
#define CUSTOM_PHONE_CALL_INFO_CMD 0x9 // 通话号码信息
#define CUSTOM_BLE_VOL_CONTROL_CMD 0x32 // 音量控制
#define CUSTOM_BLE_MUSIC_STATE_CONTROL_CMD 0x33 // 音乐状态控制
#define CUSTOM_BLE_ANC_MODE_CONTROL_CMD 0x34 // ANC 模式控制
#define CUSTOM_BLE_EQ_MODE_CONTROL_CMD 0x35 // EQ 模式控制
#define CUSTOM_BLE_PLAY_MODE_CONTROL_CMD 0x36 // 设置播放模式
#define CUSTOM_BLE_ALARM_CLOCK_CONTROL_CMD 0x37 // 播放闹钟
#define CUSTOM_BLE_FINE_EARPHONE_CMD 0x38 // 查找手机
#define CUSTOM_BLE_FLASHLIGHT_CONTROL_CMD 0x39 // 手电筒
#define CUSTOM_BLE_SWITCH_LANGUAGE 0x40 //切换语言 1中文,2英文
#define CUSTOM_BLE_CONTRAL_CALL 0x41 //控制接听挂断 1接听 2挂断
#define CUSTOM_BLE_USER_ADD_CMD 0X42 //用户自定义命令
#define CUSTOM_BLE_CONTRAL_DOUYIN 0X43 //控制抖音操作
#define CUSTOM_BLE_CONTRAL_PHOTO 0X44 //控制拍照操作
#define CUSTOM_EDR_CONTRAL_CONN 0X45 // 控制edr连接
#define CUSTOM_EDR_SYNC_INFO 0X46 // 同步经典蓝牙信息
#define CUSTOM_EDR_SIRI_CTRL 0X47 // 语音助手设置
#define CUSTOM_BLE_CONTRAL_PHONEOUT 0X48 // 拨出电话
#define CUSTOM_BLE_CONTRAL_KEY 0X49 // 按键同步设置
#define CUSTOM_SLEEP_CTRL_CMD 0x4A // 屏幕亮灭状态
#define CUSTOM_EDR_CLEAR_COMP 0x4B // br等待仓连接
/*-------------------CMD end----------------------*/
typedef void (*screen_app_receive_handle)(u8 cmd, u8 *data, u8 len);
typedef int (*screen_app_operation_send_handle)(u8 *data, u16 len);
void register_receive_handle(screen_app_receive_handle callback);
void register_send_handle(screen_app_operation_send_handle callback);
void custom_ble_client_write_no_respond(u8 cmd, u8 *data, u8 len);
int ble_notify_recv_data_handler(uint8_t *buffer, uint16_t buffer_size);
#endif