This commit is contained in:
lmx
2025-10-29 13:10:02 +08:00
commit 49a07fa419
2284 changed files with 642060 additions and 0 deletions

View File

@ -0,0 +1,53 @@
#ifndef A2DP_MEDIA_CODEC_H
#define A2DP_MEDIA_CODEC_H
#include "generic/typedef.h"
#define seqn_after(a, b) ((s16)((s16)(b) - (s16)(a)) < 0)
#define seqn_before(a, b) seqn_after(b, a)
extern int a2dp_media_get_packet(u8 **frame);
extern int a2dp_media_try_get_packet(u8 **frame);
extern int a2dp_media_get_remain_buffer_size();
extern int a2dp_media_get_remain_play_time(u8 include_tws);
extern int a2dp_media_get_total_data_len();
extern int a2dp_media_get_packet_num();
extern int a2dp_media_clear_packet_before_seqn(u16 seqn_number);
extern void *a2dp_media_fetch_packet(int *len, void *prev_packet);
extern void *a2dp_media_fetch_packet_and_wait(int *len, void *prev_packet, int msec);
extern void a2dp_media_free_packet(void *_packet);
extern int a2dp_media_channel_exist(void);
extern int a2dp_media_is_clearing_frame(void);
extern int a2dp_media_get_codec_type();
extern u32 a2dp_media_dump_rx_time(u8 *frame);
#endif

View File

@ -0,0 +1,733 @@
#ifndef __AVCTP_USER_H__
#define __AVCTP_USER_H__
#include "typedef.h"
#include "btstack_typedef.h"
///***注意:该文件的枚举与库编译密切相关,主要是给用户提供调用所用。用户不能自己在中间添加值。*/
////----user (command) codes----////
typedef enum {
/*
使用user_send_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;
user_send_cmd_prepare(USER_CTRL_HFP_CALL_SET_VOLUME,1, &vol);
例子B、USER_CTRL_DIAL_NUMBER 参数要用数组先存起来param_len是号码长度param可传参数数组指针
user_val->income_phone_num已经存好号码
user_send_cmd_prepare(USER_CTRL_DIAL_NUMBER,user_val->phone_num_len,user_val->income_phone_num);
*/
//链路操作部分
//回连,使用的是VM的地址一般按键操作不使用该接口
USER_CTRL_START_CONNECTION,
//通过地址去连接,如果知道地址想去连接使用该接口
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_PAUSE_MUSIC,
//连接或断开SCO或esco,选择这个命令会自动判断要断开还是连接sco
USER_CTRL_SCO_LINK,
//连接SCO或esco
USER_CTRL_CONN_SCO,
//断开sco或esco
USER_CTRL_DISCONN_SCO,
//断开SDP一般按键操作不使用该接口
USER_CTRL_DISCONN_SDP_MASTER,
//关闭蓝牙可发现
USER_CTRL_WRITE_SCAN_DISABLE,
//打开蓝牙可发现
USER_CTRL_WRITE_SCAN_ENABLE,
// USER_CTRL_WRITE_SCAN_ENABLE_KEY ,
//关闭蓝牙可连接
USER_CTRL_WRITE_CONN_DISABLE,
//打开蓝牙可连接
USER_CTRL_WRITE_CONN_ENABLE,
// USER_CTRL_WRITE_CONN_ENABLE_KEY ,
//控制蓝牙搜索,需要搜索附件设备做功能的连续说明情况在补充完善功能
USER_CTRL_SEARCH_DEVICE,
//取消搜索
USER_CTRL_INQUIRY_CANCEL,
//取消配对
USER_CTRL_PAGE_CANCEL,
///进入sniff模式一般按键操作不使用该接口
USER_CTRL_SNIFF_IN,
USER_CTRL_SNIFF_EXIT,
USER_CTRL_ALL_SNIFF_EXIT,
//hfp链路部分
//控制打电话音量注意可能有些手机进度条有变化音量大小没变化同步要设置样机DAC音量
/*跟电话音量操作有关的操作最终都执行回调函数call_vol_change*/
USER_CTRL_HFP_CMD_BEGIN, /* 接口扩展用来做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';
user_send_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_DIAL_NUMBER命令有参数参数要用数组先存起来
param_len是号码长度param可传参数数组指针*/
USER_CTRL_DIAL_NUMBER,
//发送电量 /**要连接上HFP才有用*/
USER_CTRL_SEND_BATTERY,
//*控制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_ANSWER3, //可以发完USER_CTRL_HFP_THREE_WAY_ANSWER2,又发ANSWER3自己看看效果
//拒听
USER_CTRL_HFP_THREE_WAY_REJECT, //拒绝后台来电
USER_CTRL_HFP_DISCONNECT, //断开HFP连接
USER_CTRL_HFP_CMD_END,
//音乐控制部分
USER_CTRL_AVCTP_CMD_BEGIN,
//音乐播放
USER_CTRL_AVCTP_OPID_PLAY,
//音乐暂停
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,
//同步音量接口
USER_CTRL_AVCTP_OPID_SEND_VOL,
// //AVCTP断开是音乐控制链路一般不使用
USER_CTRL_AVCTP_DISCONNECT,
// //AVCTP连接是音乐控制链路一般不使用
USER_CTRL_AVCTP_CONN,
USER_CTRL_AVCTP_CMD_END,
//高级音频部分
USER_CTRL_A2DP_CMD_BEGIN,
//有判断条件的,回连过程连接高级音频,避免手机连也自动发起连接,一般按键操作不使用该接口
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_END,
//蓝牙关闭
USER_CTRL_POWER_OFF,
//蓝牙开启
USER_CTRL_POWER_ON,
///*hid操作定义*/
USER_CTRL_HID_CMD_BEGIN,
//按键连接
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 ,
USER_CTRL_HID_SEND_DATA ,
USER_CTRL_HID_CMD_END,
/**有TWS命名的都不用了*/
/*对箱操作命令*/
USER_CTRL_TWS_CMD_BEGIN,
USER_CTRL_SYNC_TRAIN,
USER_CTRL_SYNC_TRAIN_SCAN,
USER_CTRL_MONITOR,
USER_CTRL_TWS_CONNEC_VIA_ADDR,
USER_CTRL_TWS_COTROL_CDM,
//清除对箱连接信息
USER_CTRL_TWS_CLEAR_INFO,
//断开对箱连接
USER_CTRL_TWS_DISCONNECTION_HCI,
//发起对箱连接
USER_CTRL_TWS_START_CONNECTION,
USER_CTRL_TWS_SYNC_CDM,
USER_CTRL_TWS_SYNC_SBC_CDM,
USER_CTRL_TWS_RESTART_SBC_CDM,
USER_CTRL_SYNC_TRAIN_CANCEL,
USER_CTRL_SYNC_TRAIN_SCAN_CANCEL,
USER_CTRL_TWS_SYNC_CDM_FUN,
USER_CTRL_TWS_LINEIN_START,
USER_CTRL_TWS_LINEIN_CLOSE,
USER_CTRL_TWS_CMD_END,
///蓝牙串口发送命令
USER_CTRL_SPP_CMD_BEGIN,
/**USER_CTRL_SPP_SEND_DATA命令有参数参数会先存起来
param_len是数据长度param发送数据指针
返回0,表示准备成功会PENDing发完才返回
3表示上一包数据没发完*/
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_CMD_END,
///pbg发送命令
USER_CTRL_PBG_CMD_BEGIN,
USER_CTRL_PBG_SEND_DATA,//len <= 512
USER_CTRL_PBG_TRY_SEND_DATA,//
USER_CTRL_PBG_CMD_END,
///adt 发送命令
USER_CTRL_ADT_CMD_BEGIN,
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,
//电话本功能读取通话记录的前n条
USER_CTRL_PBAP_READ_PART,
//电话本功能读全部记录
USER_CTRL_PBAP_READ_ALL,
//电话本功能中断读取记录
USER_CTRL_PBAP_STOP_READING,
USER_CTRL_PBAP_CMD_END,
//蓝牙其他操作
// //删除最新的一个设备记忆
// USER_CTRL_DEL_LAST_REMOTE_INFO ,
// //删除所有设备记忆
USER_CTRL_DEL_ALL_REMOTE_INFO,
USER_CTRL_TEST_KEY,
USER_CTRL_SEND_USER_INFO,
USER_CTRL_KEYPRESS,
USER_CTRL_PAIR,
USER_CTRL_AFH_CHANNEL,
USER_CTRL_HALF_SEC_LOOP_CREATE,
USER_CTRL_HALF_SEC_LOOP_DEL,
/**音量同步接口自动选择通过HID还是AVRCP来发送*/
USER_CTRL_CMD_SYNC_VOL_INC,
/**音量同步接口自动选择通过HID还是AVRCP来发送*/
USER_CTRL_CMD_SYNC_VOL_DEC,
/*单独HID和普通蓝牙模式的切换接口,音箱SDK才有完整流程*/
USER_CTRL_CMD_CHANGE_PROFILE_MODE,
USER_CTRL_CMD_RESERVE_INDEX4,
USER_CTRL_CMD_RESUME_STACK,
//获取当前音乐的一些信息
USER_CTRL_AVCTP_OPID_GET_MUSIC_INFO,
//MAP功能发送命令
USER_CTRL_MAP_CMD_BEGIN,
//MAP读取时间
USER_CTRL_MAP_READ_TIME,
//MAP读取未读短信
USER_CTRL_MAP_READ_INDOX,
//MAP读取已读短信
USER_CTRL_MAP_READ_OUTDOX,
//MAP读取已发读短信
USER_CTRL_MAP_READ_SENT,
//MAP读取删除短信
USER_CTRL_MAP_READ_DELETED,
//MAP读取草稿箱短信
USER_CTRL_MAP_READ_DRAFT,
//MAP停止读取
USER_CTRL_MAP_STOP_READING,
USER_CTRL_MAP_CMD_END,
//不看协议栈的状态去调一次exit关机的时候可能消息被阻塞住推上来导致SNIFF无法退出影响后续的关机流程
USER_CTRL_ALL_SNIFF_EXIT_BY_POWEROFF,
// 一拖二通话操作
USER_CTRL_MULTI_HFP_CMD_BEGIN,
// 设备间通话切换
USER_CTRL_MULTI_ESCO_SWITCH,
// 挂断打断设备通话
USER_CTRL_MULTI_HFP_CALL_HANGUP_BREAK,
//挂断当前通话,接听来电设备
USER_CTRL_MULTI_HFP_CALL_HANGUP_BREAK_ACTIVE,
//前台设备三方通话,挂断当前并接听
USER_CTRL_MULTI_HFP_THREE_WAY_ANSWER1,
//前台设备三方通话,保留当前并接听
USER_CTRL_MULTI_HFP_THREE_WAY_ANSWER2,
// 被打断设备三方通话,挂断当前接通来电
USER_CTRL_MULTI_HFP_THREE_WAY_ANSWER1_BREAK,
// 被打断设备三方通话,挂断当前接通来电并切换到耳机通话
USER_CTRL_MULTI_HFP_THREE_WAY_ANSWER1_BREAK_SWITCH,
// 被打断设备三方通话,保留当前接通来电
USER_CTRL_MULTI_HFP_THREE_WAY_ANSWER2_BREAK,
// 被打断设备三方通话,保留当前接通来电并切换到耳机通话
USER_CTRL_MULTI_HFP_THREE_WAY_ANSWER2_BREAK_SWITCH,
// 被打断设备三方通话,拒绝后台来电
USER_CTRL_MULTI_HFP_THREE_WAY_ANSWER3_BREAK,
USER_CTRL_MULTI_HFP_CMD_END,
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, /*获取手机的厂商*/
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, /*最后拨打电话的类型,只区分打入和打出两种状态*/
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_AVRCP_INCOME_OPID, /*收到远端设备发过来的AVRCP命令*/
BT_STATUS_HFP_SERVICE_LEVEL_CONNECTION_OK,
BT_STATUS_CONN_A2DP_CH,
BT_STATUS_CONN_HFP_CH,
BT_STATUS_INQUIRY_TIMEOUT,
/*下面是1个持续的状态是get_stereo_bt_connect_status获取*/
/*下面是6个持续的状态是get_bt_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_BROADCAST_STATE,/*braoadcaset中*/
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_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; //音乐状态
#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 MAP_CH 0x8000
struct sniff_ctrl_config_t {
u16 sniff_max_interval;
u16 sniff_mix_interval;
u16 sniff_attemp;
u16 sniff_timeout;
u8 sniff_addr[6];
};
extern u32 user_send_cmd_prepare(USER_CMD_TYPE cmd, u16 param_len, u8 *param);
extern int user_send_at_cmd_prepare(u8 *data, u16 len);
/**发射器操作的几个接口*/
extern u32 user_emitter_cmd_prepare(USER_CMD_TYPE cmd, u16 param_len, u8 *param);
u8 get_emitter_connect_status(void);
u16 get_emitter_curr_channel_state();
u8 get_emitter_a2dp_status(void);
/*
u16 get_curr_channel_state(); 与 channel 判断区分
主动获取当前链路的连接状态,可以用来判断有哪些链路连接上了
*/
extern u16 get_curr_channel_state();
/*
u8 get_call_status(); 与BT_CALL_IND_STA 枚举的值判断
用于获取当前蓝牙电话的状态
*/
extern u8 get_call_status();
extern void user_cmd_ctrl_init(void *var);
/******当前连接的设备是jl测试盒**********/
extern bool get_remote_test_flag();
extern void set_remote_test_flag(u8 own_remote_test);
extern void bt_fast_test_handle_register(void (*handle)(void));
extern void bt_dut_test_handle_register(void (*handle)(u8));
extern void inquiry_result_handle_register(void (*handle)(char *name, u8 name_len, u8 *addr, u32 dev_class, char rssi));
/*个性化参数设置*/
/*用户调试设置地址6个byte*/
extern void __set_bt_mac_addr(u8 *addr);
/*用户调试设置name,最长32个字符*/
extern void __set_host_name(const char *name, u8 len);
/*用户调试设置pin code*/
extern void __set_pin_code(const char *code);
/*该接口用于设置上电回连需要依次搜索设备的个数。*/
extern void __set_auto_conn_device_num(u8 num);
/*//回连的超时设置。ms单位。但是对手机发起的连接是没作用的*/
extern void __set_super_timeout_value(u16 time);
/*外部设置支持什么协议*/
extern void bt_cfg_default_init(u8 support);
/*设置电量显示发送更新的周期时间为0表示关闭电量显示功能*/
extern void __bt_set_update_battery_time(u8 time);
/*给用户设置蓝牙支持连接的个数,主要用于控制控制可发现可连接和回连流程*/
extern void __set_user_ctrl_conn_num(u8 num);
/*提供接口外部设置要保留hfp不要蓝牙通话*/
extern void __set_disable_sco_flag(bool flag);
/*提供接口外部设置简易配对参数*/
extern void __set_simple_pair_param(u8 io_cap, u8 oob_data, u8 mitm);
/*有些自选接口用来实现个性化功能流程,回调函数注册,记得常来看看哟*/
extern void get_battery_value_register(int (*handle)(void)); /*电量发送时获取电量等级的接口注册*/
extern void music_vol_change_handle_register(void (*handle)(int vol), int (*handle2)(void)); /*手机更样机音乐模式的音量同步*/
extern void read_remote_name_handle_register(void (*handle)(u8 status, u8 *addr, u8 *name)); /*获取到名字后的回调函数接口注册函数*/
extern void spp_data_deal_handle_register(void (*handler)(u8 packet_type, u16 channel, u8 *packet, u16 size)); /*支持串口功能的数据处理接口*/
extern void discon_complete_handle_register(void (*handle)(u8 *addr, int reason)); /*断开或者连接上会调用的函数,给客户反馈信息*/
extern void update_bt_current_status(u8 *addr, u8 new_status, u8 conn_status);
extern u8 get_bt_connect_status(void);
extern u8 a2dp_get_status(void);
/*//回连的超时设置。ms单位。但是对手机发起的连接是没作用的*/
extern void __set_super_timeout_value(u16 time);
/*//回连page的超时设置。ms单位*/
extern void __set_page_timeout_value(u16 time);
/*获取的值上限是bt_set_auto_conn_device_num接口配置的值,一般用于做回连策略*/
extern int btstack_get_num_of_remote_device_recorded();
/*上电自动搜索设备的个数*/
extern u8 get_current_poweron_memory_search_index(u8 *temp_mac_addr);
extern void clear_current_poweron_memory_search_index(u8 inc);
extern void __set_user_background_goback(u8 en);
extern bool user_sniff_check_req(u8 sniff_cnt_time);
extern int tws_updata_phone_wait_con_addr(u8 *addr);
extern int tws_updata_internal_addr(u8 *internal_addr_local, u8 *internal_addr_remote);
extern void bt_discon_complete_handle(u8 *addr, int reason);
/*这个接口只用来判断回连或者开可发现可连接的状态*/
extern bool is_1t2_connection(void);
/*用来获取蓝牙连接的设备个数不包含page状态的计数*/
extern u8 get_total_connect_dev(void);
/*可以通过地址查询HFP的状态*/
extern u8 is_bt_conn_hfp_hangup(u8 *addr);
extern void infor_2_user_handle_register(int (*handle)(u8 *info, u16 len), u8 *buffer_ptr);
/*音乐的ID3信息返回接口注册函数*/
extern void bt_music_info_handle_register(void (*handler)(u8 type, u32 time, u8 *info, u16 len));
/*用户层不需要用了*/
extern void set_bt_vm_interface(u32 vm_index, void *interface);
extern void bredr_stack_init(void);
/*sniff 的计数查询*/
extern bool bt_api_conn_mode_check(u8 enable, u8 *addr);
extern u8 bt_api_enter_sniff_status_check(u16 time_cnt, u8 *addr);
extern void user_cmd_timer_init();
extern void remove_user_cmd_timer();
//get_auto_connect_state有时效性一般不用。可以用消息BT_STATUS_RECONN_OR_CONN
extern u8 get_auto_connect_state(u8 *addr);
//判断SCO/esco有没有正在使用,两个接口一样的
extern u8 get_esco_coder_busy_flag();
extern bool get_esco_busy_flag();
/*有可能低层刚开始走了连接,但是上层还没有消息,不维护蓝牙的不要随便用*/
extern u8 hci_standard_connect_check(void);
/*设置一个标识给库里面说明正在退出蓝牙*/
extern void set_stack_exiting(u8 exit);
/*根据规则生产BLE的随机地址*/
extern void lib_make_ble_address(u8 *ble_address, u8 *edr_address);
/*查询最后一个VM记录的地址进行回连*/
extern u8 connect_last_device_from_vm();
/*配置协议栈支持HID功能为了兼容以前的HID独立模式音箱SDK有使用流程*/
extern void __bt_set_hid_independent_flag(bool flag);
extern int btstack_exit();
/*能量检测之后有一些判断流程要走,非蓝牙开发不用*/
extern int sbc_energy_check(u8 *packet, u16 size);
extern int aac_energy_check(u8 *packet, u16 size);
/**发射器和接收器按键切换的时候要申请和释放资源**/
extern int a2dp_source_init(void *buf, u16 len, int deal_flag);
/**发射器和接收器按键切换的时候要申请和释放资源**/
extern int hfp_ag_buf_init(void *buf, int size, int deal_flag);
/*配置蓝牙协议栈处于发射器流程*/
extern void __set_emitter_enable_flag(u8 flag);
/*用户使用USER_CTRL_INQUIRY_CANCEL就行下面的用户层不直接使用*/
extern void hci_cancel_inquiry();
/*发射器启动还是暂停数据发送的接口会发start和suspend命令*/
extern void __emitter_send_media_toggle(u8 *addr, u8 toggle);
/*查询当前有没有a2dp source发射器的音频发送链路在连接状态*/
extern u8 is_a2dp_source_dev_null();
/*选择用哪一块VM存储信息非蓝牙维护人员不用*/
extern u8 get_remote_dev_info_index();
extern u8 check_tws_le_aa(void);
extern void tws_api_set_connect_aa(int);
extern void tws_le_acc_generation_init(void);
extern void tws_api_clear_connect_aa();
extern void clear_sniff_cnt(void);
/**删除VM记录的最后一个设备信息*/
extern u8 delete_last_device_from_vm();
#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
#define BD_CLASS_HIFI_AUDIO 0x240428
#define BD_CLASS_PHONEBOOK 0x340404
#define BD_CLASS_PAN_DEV 0X020118
#define BD_CLASS_SMART_PHONE 0x5A020C//0x40020C
#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
//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 __set_a2dp_ldac_sampling_freq(u8 a2dp_ldac_sampling_freq);
/*修改什么的类型,会影响到手机显示的图标*/
extern void __change_hci_class_type(u32 class);
/*配置通话使用16k的msbc还是8k的cvsd*/
extern void __set_support_msbc_flag(bool flag);
/*配置协议栈使用支持AAC的信息*/
extern void __set_support_aac_flag(bool flag);
/*设置1拖2时电话是否抢断标识*/
extern void __set_hfp_switch(u8 switch_en);
/*
*设置1拖2时电话是否恢复标识
*通话结束的时候,如果还有手机在通话,自动切到蓝牙端
*/
extern void __set_hfp_restore(u8 restore_en);
/*当前设备被打断时是否自动暂停*/
extern void __set_auto_pause_flag(u8 flag);
/*当前设备被打断时是否自动暂停*/
extern void __set_auto_pause_flag(u8 flag);
/*高级音频设置标志是否允许后者打断前者*/
extern void __set_music_break_in_flag(u8 flag);
/*高级音频打断检测数据包阈值设置*/
extern void __set_a2dp_sound_detect_counter(u8 sound_come, u8 sound_go);
/*pan的控制接口和发数接口,
addr指定就按指定的查找NULL就默认正在使用那个
cmd 下面定义的宏用户可以使用
param 传参数需要的值或者data包的长度
data 传的是要发数据的包指针
*/
#define USER_PAN_CMD_SEND_DATA 0xff
int user_pan_send_cmd(u8 *addr, u32 cmd, u32 param, u8 *data);
enum {
BD_ESCO_IDLE = 0, /*当前没有设备通话中*/
BD_ESCO_BUSY_CURRENT, /*当前地址对应的设备通话中*/
BD_ESCO_BUSY_OTHER, /*通话中的设备非当前地址*/
};
enum {
BD_GET_SECOND_ACTIVE = 0, /*获取当前设备的三方通话状态*/
BD_GET_SECOND_BREAK, /*获取后台设备的三方通话状态*/
};
extern u8 check_esco_state_via_addr(u8 *addr);
/*判断是否主动回连*/
extern u8 get_auto_connect_state(u8 *addr);
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 sdp_create_diy_device_ID_service(u8 *buffer, u16 buffer_size);
extern u16 sdp_create_diy_hid_service(u8 *buffer, u16 buffer_size, const u8 *hid_descriptor, u16 hid_descriptor_size);
u8 get_remote_vol_sync(void);
void set_start_search_spp_device(u8 spp);
u8 restore_remote_device_info_opt(bd_addr_t *mac_addr, u8 conn_device_num, u8 id);
u8 restore_remote_device_info_profile(bd_addr_t *mac_addr, u8 device_num, u8 id, u8 profile);
/*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 ,
};
u8 remote_dev_company_ioctrl(bd_addr_t dev_addr, u8 op_flag, u8 value);
u8 hci_standard_link_check(void);
//获取当前是否有conn处于sniff状态
bool bt_api_get_sniff_state();
#endif

View File

@ -0,0 +1,582 @@
#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_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
/**
* 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,
};
#endif

View File

@ -0,0 +1,38 @@
/*********************************************************************************************
* Filename : bt_profile_config.h
* Description :
* Author : Tongai
* Email : laotongai@zh-jieli.com
* Last modifiled : 2020-07-01 16:31
* Copyright:(c)JIELI 2011-2019 @ , All Rights Reserved.
*********************************************************************************************/
#ifndef BT_PROFILE_H
#define BT_PROFILE_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))
extern u8 app_bredr_pool[];
extern u8 app_le_pool[];
extern u8 app_l2cap_pool[];
extern u8 app_bredr_profile[];
extern u16 get_bredr_pool_len(void);
extern u16 get_le_pool_len(void);
extern u16 get_l2cap_stack_len(void);
extern u16 get_profile_pool_len(void);
#endif

View File

@ -0,0 +1,38 @@
#ifndef BTSTACK_ERROR_H
#define BTSTACK_ERROR_H
#define ERROR_CODE_SUCCESS 0x00
#define ERROR_CODE_PAGE_TIMEOUT 0x04
#define ERROR_CODE_AUTHENTICATION_FAILURE 0x05
#define ERROR_CODE_PIN_OR_KEY_MISSING 0x06
#define ERROR_CODE_CONNECTION_TIMEOUT 0x08
#define ERROR_CODE_SYNCHRONOUS_CONNECTION_LIMIT_TO_A_DEVICE_EXCEEDED 0x0A
#define ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS 0x0B
#define ERROR_CODE_CONNECTION_REJECTED_DUE_TO_LIMITED_RESOURCES 0x0D
#define ERROR_CODE_CONNECTION_REJECTED_DUE_TO_UNACCEPTABLE_BD_ADDR 0x0F
#define ERROR_CODE_CONNECTION_ACCEPT_TIMEOUT_EXCEEDED 0x10
#define ERROR_CODE_REMOTE_USER_TERMINATED_CONNECTION 0x13
#define ERROR_CODE_CONNECTION_TERMINATED_BY_LOCAL_HOST 0x16
#define CUSTOM_BB_AUTO_CANCEL_PAGE 0xFD //// app cancle page
#define BB_CANCEL_PAGE 0xFE //// bb cancle page
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,103 @@
SECTIONS
{
.data : ALIGN(4)
{
btstack_data_start = .;
*(.bt_stack_data)
*(.ble_db_data)
*(.ble_sm_data)
*(.ble_att_data)
*(.ble_gatt_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)
/*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)
/*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);

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

View File

@ -0,0 +1,26 @@
#ifndef _BTSTACK_TYPEDEF_H_
#define _BTSTACK_TYPEDEF_H_
#include "typedef.h"
#define BD_ADDR_LEN 6
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

View File

@ -0,0 +1,65 @@
#ifndef __FRAME_QUEQUE_H
#define __FRAME_QUEQUE_H
#include<string.h>
#include <stdint.h>
#include "typedef.h"
typedef unsigned char WORD8;
typedef unsigned short int WORD16;
typedef unsigned int WORD32;
typedef unsigned long long WORD64;
typedef signed char SWORD8;
typedef signed short int SWORD16;
typedef signed int SWORD32;
typedef signed long long SWORD64;
typedef unsigned char uint8_t;
#define FRAME_QUEQUE_MUTEX_ID semlock_t
#define FRAME_QUEQUE_MUTEX_DEF semlock_t
#define FRAME_QUEQUE_MUTEX_P(mutex_id) frame_mute_p(mutex_id)
#define FRAME_QUEQUE_MUTEX_V(mutex_id) frame_mute_v(mutex_id)
typedef enum {
APP_DUEROS_VER,
APP_DUEROS_SEND,
APP_TWS_BLE_SLAVE_SPEECH_START,
APP_SPEECH_START_FROM_TWS,
APP_SPEECH_STOP_FROM_TWS,
APP_TWS_DUEROS_RAND_SET,
APP_TWS_BLE_DUEROS_CONNECT,
APP_TWS_BLE_DUEROS_DISCONNECT,
} APP_CMD_TYPE ;
typedef struct {
int counter;
} semlock_t;
typedef struct send_frame {
void *buffer;
WORD32 len;
struct send_frame *next;
} _GNU_PACKED_ SEND_FRAME;
typedef struct __frame_queque {
SEND_FRAME *head;
SEND_FRAME *tail;
unsigned int depth;
FRAME_QUEQUE_MUTEX_ID mutex;
} _GNU_PACKED_ FRAME_QUEQUE;
int frame_queque_is_empty(FRAME_QUEQUE *queque);
int frame_push_queque(FRAME_QUEQUE *queque, SEND_FRAME *frame);
SEND_FRAME *frame_pop_queque(FRAME_QUEQUE *queque);
SEND_FRAME *frame_pop_queque_alloc(FRAME_QUEQUE *queque);
int frame_queque_clear(FRAME_QUEQUE *queque);
int frame_queque_init(FRAME_QUEQUE *queque);
void run_loop_register_for_app();
void app_remove_stack_run(void);
#endif

View File

@ -0,0 +1,147 @@
/*********************************************************************************************
* 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
//多机接口
//初始化 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

View File

@ -0,0 +1,57 @@
/*********************************************************************************************
* 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_3D_INFORMATION_DATA 0x3D // 3D Information Data
#define BLUETOOTH_DATA_TYPE_MANUFACTURER_SPECIFIC_DATA 0xFF // Manufacturer Specific Data
#endif

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

View File

@ -0,0 +1,201 @@
/*********************************************************************************************
* 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_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

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

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

View File

@ -0,0 +1,136 @@
#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 GFPS_HANDLER_ID 0x900 /*谷歌快对的协议接口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_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_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,
};
// 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,
};
#define GFP_TWS_ENABLE 1
//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

View File

@ -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的总初始化函数**/
void gma_all_init(void);
/*gma的总的释放函数**/
void gma_all_exit(void);
bool gma_connect_success(void);
void gma_set_active_ali_para(void *addr);
/*TWS的公共地址配置*/
void gma_set_sibling_mac_para(void *mac);
void gma_ble_adv_enable(u8 enable);
void 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 opcode, u8 *data, u32 len));
void gma_is_tws_master_callback_register(bool (*handler)(void));
void gma_tx_resume_register(bool (*handler)(void));
void gma_rx_resume_register(bool (*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(bool (*handler)(void));
extern void dma_rx_resume_register(bool (*handler)(void));
extern void dma_ble_adv_enable(u8 enable);
extern u16 dma_speech_data_send(u8 *buf, u16 len);
extern int dueros_send_process(void);
extern void dma_set_product_id_key(void *data);
extern bool dma_pair_state();
extern int dma_start_voice_recognition(u8 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 void 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, const u8 *data, u32 len));
extern void tme_is_tws_master_callback_register(bool (*handler)(void));
extern void tme_tx_resume_register(bool (*handler)(void));
extern void tme_rx_resume_register(bool (*handler)(void));
extern void TME_protocol_process(void *parm);
extern int tme_all_init(void);
extern int tme_all_exit(void);
/* extern u16 tme_speech_data_send(buf, len); */
extern void tme_ble_adv_enable(u8 enable);
extern void TME_send_packet_process(void);
extern void TME_recieve_packet_parse_process(void);
extern bool tme_connect_success(void);
extern int tme_send_voice_data(void *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);
extern int gfps_ble_adv_enable(int 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);
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 void 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__ */

View File

@ -0,0 +1,15 @@
#ifndef __BLE_CONFIG_H__
#define __BLE_CONFIG_H__
#include "typedef.h"
#include "ble_user.h"
bool bt_3th_ble_ready(void *priv);
s32 bt_3th_ble_send(void *priv, void *data, u16 len);
void bt_3th_ble_callback_set(void (*resume)(void), void (*recieve)(void *, void *, u16), void (*status)(void *, ble_state_e));
void bt_3th_ble_status_callback(void *priv, ble_state_e status);
int bt_3th_ble_data_send(void *priv, u8 *buf, u16 len);
void bt_3th_ble_get_operation_table(void);
ble_state_e bt_3th_get_jl_ble_status(void);
#endif//__BLE_CONFG_H__

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__

View File

@ -0,0 +1,72 @@
#ifndef __BTSTACK_3TH_PROTOCAL_H__
#define __BTSTACK_3TH_PROTOCAL_H__
#include "spp_config.h"
#include "ble_config.h"
#include "JL_rcsp_api.h"
#include "JL_rcsp_protocol.h"
#include "JL_rcsp_packet.h"
#include "attr.h"
#define APP_TYPE_RCSP 0x01
#define APP_TYPE_DUEROS 0x02
#define APP_TYPE_BTSTACK 0xFF
#define BT_CONFIG_BLE BIT(0)
#define BT_CONFIG_SPP BIT(1)
typedef enum {
BT_3TH_EVENT_COMMON_INIT,
BT_3TH_EVENT_COMMON_BLE_STATUS,
BT_3TH_EVENT_COMMON_SPP_STATUS,
BT_3TH_EVENT_RCSP_DEV_SELECT = 100,
BT_3TH_EVENT_DUEROS_CONNECT = 200,
} BT_3TH_EVENT_TYPE;
enum {
RCSP_BLE,
RCSP_SPP,
};
typedef struct __BT_3TH_USER_CB {
int type;
int bt_config;
JL_PRO_CB bt_3th_handler;
void (*BT_3TH_event_handler)(u16 opcode, u8 *packet, int size);
void (*BT_3TH_data_handler)(u8 *packet, int size);
int (*BT_3TH_spp_state_specific)(u8 type);
} BT_3TH_USER_CB;
typedef struct __BT_3TH_PROTOCOL_CB {
int type;
void (*BT_3TH_type_dev_select)(u8 type);
void (*resume)(void);
void (*recieve)(void *, void *, u16);
} BT_3TH_PROTOCOL_CB;
int btstack_3th_protocol_user_init(BT_3TH_USER_CB *protocol_callback);
int btstack_3th_protocol_lib_init(BT_3TH_PROTOCOL_CB *protocol_lib_callback);
JL_PRO_CB *bt_3th_get_spp_callback(void);
void bt_3th_set_spp_callback_priv(void *priv);
JL_PRO_CB *bt_3th_get_ble_callback(void);
void bt_3th_set_ble_callback_priv(void *priv);
void bt_3th_dev_type_spp(void);
void bt_3th_type_dev_select(u8 type);
u8 bt_3th_get_cur_bt_channel_sel(void);
void bt_3th_spp_state_handle(u8 type);
void bt_3th_event_send_to_user(u16 opcode, u8 *packet, int size);
void bt_3th_data_send_to_user(u8 *packet, int size);
#endif// __BTSTACK_3TH_PROTOCAL_H__

View File

@ -0,0 +1,15 @@
#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);
void bt_3th_spp_status_callback(u8 status);
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__

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(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__

View File

@ -0,0 +1,43 @@
#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()
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)(void *, u8 *, u16), u8 *link_key, u8 *addr);
void JL_rcsp_auth_reset(void);
u8 JL_rcsp_get_auth_flag(void);
void JL_rcsp_set_auth_flag(u8 auth_flag);
void JL_rcsp_auth_recieve(u8 *buffer, u16 len);
u8 get_rcsp_version(void);
void get_ai_platform(struct _AI_platform *p, u8 platform);
void smart_auth_res_pass(void);
#endif //_JL_RCSP_LIB_H_

View File

@ -0,0 +1,102 @@
#ifndef __JL_PACKET_H__
#define __JL_PACKET_H__
#include "typedef.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 _unsed : 6; //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;
#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);
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);
u32 JL_pack_data_read_all(void *buf, u16 len);
void JL_packet_clear_all_data(void);
bool JL_packet_find(u8 *r_buf, JL_PACKET **packet);
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__

View File

@ -0,0 +1,217 @@
#ifndef __JL_PROTOCOL_H__
#define __JL_PROTOCOL_H__
#include "typedef.h"
#include "JL_rcsp_packet.h"
#define ATTR_TYPE_PROTOCOL_VERSION (0)
#define ATTR_TYPE_SYS_INFO (1)
#define ATTR_TYPE_EDR_ADDR (2)
#define ATTR_TYPE_PLATFORM (3)
#define ATTR_TYPE_FUNCTION_INFO (4)
#define ATTR_TYPE_DEV_VERSION (5)
#define ATTR_TYPE_SDK_TYPE (6)
#define ATTR_TYPE_UBOOT_VERSION (7)
#define ATTR_TYPE_DOUBLE_PARITION (8)
#define ATTR_TYPE_UPDATE_STATUS (9)
#define ATTR_TYPE_DEV_VID_PID (10)
#define ATTR_TYPE_DEV_AUTHKEY (11)
#define ATTR_TYPE_DEV_PROCODE (12)
#define ATTR_TYPE_DEV_MAX_MTU (13)
#define ATTR_TEYP_BLE_ADDR (17)
#define ATTR_TYPE_MD5_GAME_SUPPORT (19)
#define COMMON_INFO_ATTR_BATTERY (0)
#define COMMON_INFO_ATTR_VOL (1)
#define COMMON_INFO_ATTR_DEV (2)
#define COMMON_INFO_ATTR_ERR_REPORT (3)
#define COMMON_INFO_ATTR_EQ (4)
#define COMMON_INFO_ATTR_FILE_BROWSE_TYPE (5)
#define COMMON_INFO_ATTR_FUN_TYPE (6)
#define COMMON_INFO_ATTR_LIGHT (7)
#define COMMON_INFO_ATTR_FMTX (8)
#define COMMON_INFO_ATTR_HIGH_LOW_SET (11)
#define COMMON_INFO_ATTR_PRE_FETCH_ALL_EQ_INFO (12)
#define COMMON_INFO_ATTR_ANC_VOICE (13)
#define COMMON_INFO_ATTR_FETCH_ALL_ANC_VOICE (14)
#define COMMON_INFO_ATTR_PHONE_SCO_STATE_INFO (15)
#define COMMON_INFO_ATTR_ASSISTED_HEARING (20)
#define COMMON_INFO_ATTR_ADAPTIVE_NOISE_REDUCTION (21)
#define COMMON_INFO_ATTR_AI_NO_PICK (22)
#define COMMON_INFO_ATTR_SCENE_NOISE_REDUCTION (23)
#define COMMON_INFO_ATTR_WIND_NOISE_DETECTION (24)
#define COMMON_INFO_ATTR_VOICE_ENHANCEMENT_MODE (25)
#define BT_INFO_ATTR_MUSIC_TITLE (0)
#define BT_INFO_ATTR_MUSIC_ARTIST (1)
#define BT_INFO_ATTR_MUSIC_ALBUM (2)
#define BT_INFO_ATTR_MUSIC_NUMBER (3)
#define BT_INFO_ATTR_MUSIC_TOTAL (4)
#define BT_INFO_ATTR_MUSIC_GENRE (5)
#define BT_INFO_ATTR_MUSIC_TIME (6)
#define BT_INFO_ATTR_MUSIC_STATE (7)
#define BT_INFO_ATTR_MUSIC_CURR_TIME (8)
#define BT_INFO_ATTR_01 (0)
#define MUSIC_INFO_ATTR_STATUS (0)
#define MUSIC_INFO_ATTR_FILE_NAME (1)
#define MUSIC_INFO_ATTR_FILE_PLAY_MODE (2)
#define RTC_INFO_ATTR_RTC_TIME (0)
#define RTC_INFO_ATTR_RTC_ALRAM (1)
#define LINEIN_INFO_ATTR_STATUS (0)
/***************************************/
/* 注意:不能在这个枚举里加代码 */
/* 注意:不能在这个枚举里加代码 */
/* 注意:不能在这个枚举里加代码 */
/***************************************/
enum {
JL_OPCODE_DATA = 0x01,
JL_OPCODE_GET_TARGET_FEATURE_MAP = 0x02,
JL_OPCODE_GET_TARGET_FEATURE = 0x03,
// JL_OPCODE_SWITCH_DEVICE = 0x04,
JL_OPCODE_DISCONNECT_EDR = 0x06,
JL_OPCODE_SYS_INFO_GET = 0x07,
JL_OPCODE_SYS_INFO_SET = 0x08,
JL_OPCODE_SYS_INFO_AUTO_UPDATE = 0x09,
JL_OPCODE_CALL_REQUEST = 0xa,
JL_OPCODE_SWITCH_DEVICE = 0x0b,
JL_OPCODE_FILE_BROWSE_REQUEST_START = 0x0C,
JL_OPCODE_FILE_BROWSE_REQUEST_STOP = 0x0D,
JL_OPCODE_FUNCTION_CMD = 0x0E,
JL_OPCODE_SYS_OPEN_BT_SCAN = 0x12,
JL_OPCODE_SYS_UPDATE_BT_STATUS = 0X13,
JL_OPCODE_SYS_STOP_BT_SCAN = 0X14,
JL_OPCODE_SYS_BT_CONNECT_SPEC = 0X15,
JL_OPCODE_SYS_EMITTER_BT_CONNECT_STATUS = 0XD3, // 临时调整, 被遗忘的指令
JL_OPCODE_SYS_FIND_DEVICE = 0X19,
JL_OPCODE_EXTRA_FLASH_OPT = 0X1A,
//文件传输相关命令
JL_OPCODE_FILE_TRANSFER_START = 0X1B,
JL_OPCODE_FILE_TRANSFER_END = 0X1C,
JL_OPCODE_FILE_TRANSFER = 0X1D,
JL_OPCODE_FILE_TRANSFER_CANCEL = 0X1E,
JL_OPCODE_FILE_DELETE = 0X1F,
JL_OPCODE_FILE_RENAME = 0X20,
JL_OPCODE_ACTION_PREPARE = 0X21,//APP操作预处理
JL_OPCODE_DEVICE_FORMAT = 0X22,//设备格式化
JL_OPCODE_ONE_FILE_DELETE = 0x23,//删除一个文件
JL_OPCODE_ONE_FILE_TRANS_BACK = 0x24,//回传一个文件
JL_OPCODE_ALARM_EXTRA = 0x25,
JL_OPCODE_FILE_BLUK_TRANSFER = 0x26,//批量大文件前准备
JL_OPCODE_DEVICE_PARM_EXTRA = 0x27,//设备操作,如文件传输、文件删除、设备格式化参数扩展
JL_OPCODE_SIMPLE_FILE_TRANS = 0x28,
JL_OPCODE_SPORTS_DATA_INFO_GET = 0xA0,
JL_OPCODE_SPORTS_DATA_INFO_SET = 0xA1,
JL_OPCODE_SPORTS_DATA_INFO_AUTO_UPDATE = 0xA2,
JL_OPCODE_SENSOR_LOG_DATA_AUTO_UPDATE = 0xA3,
JL_OPCODE_SENSOR_NFC_FUNCTION_OPT = 0xA4,
JL_OPCODE_SPORTS_DATA_INFO_OPT = 0xA5,
JL_OPCODE_SPORTS_DATA_SYNC = 0xA6,
JL_OPCODE_NOTIFY_MTU = 0xD1,
JL_OPCODE_GET_MD5 = 0xD4,
JL_OPCODE_LOW_LATENCY_PARAM = 0xD5,
JL_OPTCODE_EXTRA_FLASH_INFO = 0XD6,
JL_OPCODE_CUSTOMER_USER = 0xFF,
};
/***************************************/
/***************************************/
enum {
JL_NOT_NEED_RESPOND = 0,
JL_NEED_RESPOND,
};
enum {
JL_AUTH_NOTPASS = 0,
JL_AUTH_PASS,
};
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;
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);
JL_ERR JL_CMD_response_send(u8 OpCode, u8 status, u8 sn, u8 *data, u16 len);
JL_ERR JL_DATA_send(u8 OpCode, u8 CMD_OpCode, u8 *data, u16 len, u8 request_rsp);
JL_ERR JL_DATA_response_send(u8 OpCode, u8 status, u8 sn, u8 CMD_OpCode, u8 *data, u16 len);
///*<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);
void (*DATA_resp)(void *priv, u8 OpCode_SN, u8 CMD_OpCode, u8 *data, u16 len);
void (*CMD_no_resp)(void *priv, u8 OpCode, u8 *data, u16 len);
void (*DATA_no_resp)(void *priv, u8 CMD_OpCode, u8 *data, u16 len);
void (*CMD_recieve_resp)(void *priv, u8 OpCode, u8 status, u8 *data, u16 len);
void (*DATA_recieve_resp)(void *priv, u8 status, u8 CMD_OpCode, u8 *data, u16 len);
u8(*wait_resp_timeout)(void *priv, u8 OpCode, u8 counter);
void (*auth_pass_callback)(void *priv);
} JL_PRO_CB;
extern u32 rcsp_fw_ready(void);
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);
extern void JL_protocol_resume(void);
extern void JL_protocol_process(void);
extern void set_auth_pass(u8 auth_pass);
extern void JL_set_cur_tick(u16 tick);
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__

View File

@ -0,0 +1,15 @@
#ifndef __ATTR_H__
#define __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 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);
#endif//__ATTR_H__