This commit is contained in:
huxi
2025-12-03 11:12:34 +08:00
parent c23ae4f24c
commit bc195654bf
8163 changed files with 3799544 additions and 92 deletions
+239
View File
@@ -0,0 +1,239 @@
#ifndef _3TH_PROTOCOL_EVENT_H
#define _3TH_PROTOCOL_EVENT_H
//该文件只定义库里面和库外面都需要用得的第三方APP协议的消息和状态
#include<string.h>
#include <stdint.h>
#include "typedef.h"
#define DEMO_HANDLER_ID 0x300 /*作为一个使用的例子,同时也可作为客户自己添加协议的ID*/
#define GMA_HANDLER_ID 0x400 /*阿里天猫协议接口ID*/
#define MMA_HANDLER_ID 0x500 /*小米MMA协议接口ID*/
#define DMA_HANDLER_ID 0x600 /*百度DMA协议接口ID*/
#define TME_HANDLER_ID 0x700 /*腾讯酷狗TME协议接口ID*/
#define AMA_HANDLER_ID 0x800 /*亚马逊的AMA协议接口ID*/
#define REALME_HANDLER_ID 0x900 /*oppo真我的协议接口ID*/
#define GFPS_HANDLER_ID 0xA00 /*谷歌快对的协议接口ID*/
//app protocol公共消息
enum {
APP_PROTOCOL_COMMON_NOTICE = 0,
APP_PROTOCOL_CONNECTING, /*保留,暂未使用*/
APP_PROTOCOL_CONNECTED_BLE, /*APP通过BLE连接成功状态更新*/
APP_PROTOCOL_CONNECTED_SPP, /*APP通过SPP连接成功状态更新*/
APP_PROTOCOL_DISCONNECT, /*APP连接断开状态更新*/
APP_PROTOCOL_AUTH_PASS, /*连接认证通过标识更新*/
APP_PROTOCOL_SPEECH_ENCODER_TYPE,
APP_PROTOCOL_SPEECH_START, /*语音识别功能启动状态*/
APP_PROTOCOL_SPEECH_STOP, /*语音识别功能停止状态*/
APP_PROTOCOL_SET_VOLUME, /*app配置音量*/
APP_PROTOCOL_GET_VOLUME, /*app读取音量*/
APP_PROTOCOL_GET_AUX_STATUS, /*保留,暂未使用*/
APP_PROTOCOL_LIB_TWS_DATA_SYNC, /*需要更新给另一端tws数据*/
APP_PROTOCOL_GET_TWS_CHANNEL, /*库里面获取是左声道还是右声道*/
APP_PROTOCOL_COMMON_NOTICE_END = 0x14F,
};
//OTA消息
enum {
APP_PROTOCOL_OTA_COMMON_NOTICE = APP_PROTOCOL_COMMON_NOTICE_END + 1,
APP_PROTOCOL_OTA_CHECK,
APP_PROTOCOL_OTA_GET_APP_VERSION,
APP_PROTOCOL_OTA_CHECK_CRC,
APP_PROTOCOL_OTA_BEGIN,
APP_PROTOCOL_OTA_TRANS_DATA,
APP_PROTOCOL_OTA_PERCENT,
APP_PROTOCOL_OTA_END,
APP_PROTOCOL_OTA_SUCCESS,
APP_PROTOCOL_OTA_FAIL,
APP_PROTOCOL_OTA_CANCLE,
APP_PROTOCOL_OTA_REBOOT,
APP_PROTOCOL_OTA_COMMON_NOTICE_END = 0x1FF,
};
//GMA私有消息
enum {
APP_PROTOCOL_GMA_NOTICE_BEGIN = GMA_HANDLER_ID,
APP_PROTOCOL_GMA_FMTX_SETFRE, /*样机支持FM功能的APP配置fm参数*/
APP_PROTOCOL_GMA_FMTX_GETFRE, /*app获取当前的fm配置参数*/
APP_PROTOCOL_GMA_NOTICE_END = GMA_HANDLER_ID + 0xFF,
};
//MMA私有消息
enum {
APP_PROTOCOL_MMA_NOTICE = MMA_HANDLER_ID,
APP_PROTOCOL_MMA_SAVE_INFO, //库里面不直接访问VM接口,有些信息保存外面做
APP_PROTOCOL_MMA_READ_INFO,
APP_PROTOCOL_MMA_SAVE_ADV_COUNTER,
APP_PROTOCOL_MMA_READ_ADV_COUNTER,
APP_PROTOCOL_MMA_MANUFACTURER_DATA, //小米广播包的数据,
APP_PROTOCOL_MMA_FD2D_SERVICE_DATA, //小米广播包的数据,
APP_PROTOCOL_MMA_SAVE_ACCOUNT_KEY,
APP_PROTOCOL_MMA_READ_ACCOUNT_KEY,
APP_PROTOCOL_MMA_NOTICE_END = MMA_HANDLER_ID + 0xFF,
};
//DMA私有消息
enum {
APP_PROTOCOL_DMA_NOTICE = DMA_HANDLER_ID,
APP_PROTOCOL_DMA_SAVE_RAND, //库里面不直接访问VM接口,有些信息保存外面做
APP_PROTOCOL_DMA_READ_RAND,
APP_PROTOCOL_DMA_TWS_SNED_RAND,
APP_PROTOCOL_DMA_TTS_TYPE,
APP_PROTOCOL_DMA_SAVE_OTA_INFO, //库里面不直接访问VM接口,有些信息保存外面做
APP_PROTOCOL_DMA_READ_OTA_INFO,
APP_PROTOCOL_DMA_NOTICE_END = DMA_HANDLER_ID + 0xFF,
};
//REALME私有消息
enum {
APP_PROTOCOL_REALME_FEATURE_SWITCH = REALME_HANDLER_ID,
APP_PROTOCOL_REALME_FIND_MODE_SET,
APP_PROTOCOL_REALME_KEY_FUNC_SET,
APP_PROTOCOL_REALME_FREE_MUSIC_SET,
APP_PROTOCOL_REALME_NOISE_INFO,
APP_PROTOCOL_REALME_COMPACTNESS_DETECT,
APP_PROTOCOL_REALME_EQ_SET,
APP_PROTOCOL_REALME_HIGH_VOL_GAIN_SET,
APP_PROTOCOL_REALME_RELATE_DEVICE_INFO,
APP_PROTOCOL_REALME_UTC_TIME_SYNC,
APP_PROTOCOL_REALME_POWER_OFF_TIME_SET,
APP_PROTOCOL_REALME_MULTI_CONN_INFO,
APP_PROTOCOL_REALME_BASS_ENGINE_VALUE_SET,
APP_PROTOCOL_REALME_RESTORE_FACTORY,
APP_PROTOCOL_REALME_UPGRADE_OFFSET_SAVE,
APP_PROTOCOL_REALME_UPGRADE_OFFSET_READ,
APP_PROTOCOL_REALME_UPGRADE_OFFSET_CLEAR,
APP_PROTOCOL_REALME_UPGRADE_FIRMWARE_ID,
APP_PROTOCOL_REALME_UPGRADE_START,
APP_PROTOCOL_REALME_UPGRADE_END,
APP_PROTOCOL_REALME_UPGRADE_REBOOT,
APP_PROTOCOL_REALME_UPGRADE_SYNC,
APP_PROTOCOL_REALME_UPGRADE_ABORT,
APP_PROTOCOL_REALME_DEBUG_START,
APP_PROTOCOL_REALME_DEBUG_GET,
APP_PROTOCOL_REALME_DEBUG_STOP,
APP_PROTOCOL_REALME_DEBUG_DIAGNOSTIC,
APP_PROTOCOL_REALME_DEBUG_SET_PARAM,
};
#define REALME_MAX_KEY_NUM 10
struct __realme_special_id {
char product_id[4];
char *protocol_version;
uint8_t protocol_version_len;
char *version;
uint8_t version_len;
};
struct __realme_key_func {
uint8_t key_info[REALME_MAX_KEY_NUM][4];
uint8_t key_num;
};
struct __realme_nofity_flag {
bool battery_notify_flag;
bool earbuds_notify_flag;
bool noise_notify_flag;
bool compactness_notify_flag;
bool game_mode_notify_flag;
bool multi_conn_notify_flag;
bool user_ui_notify_flag;
bool conn_dev_notify_flag;
bool exception_info_notify_flag;
bool buried_point_notify_flag;
};
#define REALME_FEATURE_MAX_NUM (40)
struct __realme_info {
// vm
uint8_t feature_state[REALME_FEATURE_MAX_NUM];
uint8_t auto_power_off_time;
uint8_t eq_id;
uint8_t high_vol_gain_level;
uint8_t noise_info[2]; //
char min_bass_engine;
char max_bass_engine;
char cur_bass_engine;
struct __realme_key_func key_func;
struct __realme_nofity_flag notify_flag;
// const
// uint32_t realme_capabilities;
// uint16_t vid;
// uint8_t realme_color_id;
// uint8_t device_id_type; // 0:非 TWS 设备 1:TWS 设备
// struct __realme_special_id special_id;
// update
// uint8_t left_ear_status;
// uint8_t right_ear_status;
// uint8_t box_status;
// uint8_t left_ear_compactness;
// uint8_t right_ear_compactness;
// uint8_t left_ear_vol;
// uint8_t right_ear_vol;
// uint8_t audio_code;
// uint32_t time_stamp;
};
// GFPS私有消息
enum {
APP_PROTOCOL_GFPS_RING_STOP_ALL = GFPS_HANDLER_ID,
APP_PROTOCOL_GFPS_RING_RIGHT,
APP_PROTOCOL_GFPS_RING_LEFT,
APP_PROTOCOL_GFPS_RING_ALL,
APP_PROTOCOL_GFPS_HEARABLE_CONTROLS,
};
//APP_PROTOCOL获取电量的类型
#define APP_PROTOCOL_BAT_T_CHARGE_FLAG 0
#define APP_PROTOCOL_BAT_T_MAIN 1
#define APP_PROTOCOL_BAT_T_BOX 2
#define APP_PROTOCOL_BAT_T_TWS_LEFT 3
#define APP_PROTOCOL_BAT_T_TWS_RIGHT 4
#define APP_PROTOCOL_BAT_T_TWS_SIBLING 5
#define APP_PROTOCOL_BAT_T_LOW_POWER 6
#define APP_PROTOCOL_BAT_T_MAX 8
typedef struct _ota_frame_info_t {
u16 max_pkt_len;
u16 frame_crc;
u32 frame_size;
} ota_frame_info;
//*****//
typedef enum {
USER_NOTIFY_STATE_CONNECTED = 0, /**< 手机APP与设备建立连接 */
USER_NOTIFY_STATE_DISCONNECTED, /**< 手机APP与设备的连接断开 */
USER_NOTIFY_STATE_MOBILE_CONNECTED, /**< 手机与设备建立BT连接(A2DP、HFP、AVRCP */
USER_NOTIFY_STATE_MOBILE_DISCONNECTED, /**< 手机与设备BT连接(A2DP、HFP、AVRCP)断开 */
USER_NOTIFY_STATE_SEND_PREPARE_DONE, /**< 设备端进入可向手机发送数据的状态 */
USER_NOTIFY_STATE_TWS_CONNECT, /**< TWS类设备两端连接成功 */
USER_NOTIFY_STATE_TWS_DISCONNECT, /**< TWS类设备两端断开连接 */
USER_NOTIFY_STATE_BOX_OPEN, /**< 盒仓开启 */
USER_NOTIFY_STATE_BOX_CLOSE, /**< 盒仓关闭 */
USER_NOTIFY_STATE_ROLE_SWITCH_START, /**< TWS类设备开始进入主从切换流程 */
USER_NOTIFY_STATE_ROLE_SWITCH_FINISH, /**< TWS类设备主从切换完成 */
USER_NOTIFY_STATE_ROLE_SWITCH_REQUEST, /**< TWS类设备向APP发起主从切换请求 */
USER_NOTIFY_STATE_DOUBLE_CLICK, /**< 设备双击按键 */
USER_NOTIFY_STATE_KEYWORD_DETECTED, /**< 设备语音唤醒 */
USER_NOTIFY_STATE_BATTERY_LEVEL_UPDATE, /**< 通知耳机电量更新 */
USER_NOTIFY_STATE_ONE_CLICK, /**< 设备单击按键 */
} USER_NOTIFY_STATE;
typedef enum {
/*尽量返回简单的1或者0*/
CHECK_STATUS_TWS_MASTER,
CHECK_STATUS_TWS_SLAVE,
CHECK_STATUS_TWS_PAIR_STA, /*1是tws已经配对了,0是未配对*/
CHECK_STATUS_TWS_SIDE, /*0是单耳,1是左耳,2是右耳*/
CHECK_STATUS_TWS_REV,
CHECK_STATUS_TWS_REV1,
} CHECK_STATUS;
#endif
@@ -0,0 +1,146 @@
#ifndef __APP_PRO_LIBS_API_H__
#define __APP_PRO_LIBS_API_H__
#include "typedef.h"
///***************************************///
//GMA的函数接口汇集,begin
int gma_prev_init(void);
int gma_opus_voice_mic_send(uint8_t *voice_buf, uint16_t voice_len);
/*gma的总初始化函数**/
int gma_all_init(void);
/*gma的总的释放函数**/
int gma_all_exit(void);
int gma_connect_success(void);
void gma_set_active_ali_para(void *addr);
/*TWS的公共地址配置*/
void gma_set_sibling_mac_para(void *mac);
int gma_ble_adv_enable(u8 enable);
int gma_ble_ibeacon_adv(u8 enable);
//gma接收的数据处理函数
int gma_rx_loop(void);
/*gma命令和数据发送处理*/
int tm_data_send_process_thread(void);
int gma_start_voice_recognition(int flag);
int gma_disconnect(void *addr);
void gma_message_callback_register(int (*handler)(int id, int opcode, u8 *data, u32 len));
void gma_is_tws_master_callback_register(bool (*handler)(void));
void gma_tx_resume_register(void (*handler)(void));
void gma_rx_resume_register(void (*handler)(void));
/*注册电量的获取回调函数*/
void gma_get_battery_callback_register(bool (*handler)(u8 battery_type, u8 *value));
//ota interface
int gma_ota_requset_next_packet(void *priv, u32 offset, u16 len);
void gma_replay_ota_result(u8 result);
int tws_ota_get_data_from_sibling(u8 opcode, u8 *data, u8 len);
u8 tws_ota_control(int type, ...);
void tws_ota_app_event_deal(u8 evevt);
//gma apis ends
///***************************************///
//DMA apis begin
extern int dueros_process();
extern int dma_all_init(void);
extern int dma_all_exit(void);
extern void dma_message_callback_register(int (*handler)(int id, int opcode, u8 *data, u32 len));
extern void dma_check_status_callback_register(int (*handler)(int state_flag));
extern void dma_tx_resume_register(void (*handler)(void));
extern void dma_rx_resume_register(void (*handler)(void));
extern int dma_ble_adv_enable(u8 enable);
extern int dma_speech_data_send(u8 *buf, u16 len);
extern int dueros_send_process(void);
extern void dma_set_product_id_key(void *data);
extern int dma_pair_state();
extern int dma_start_voice_recognition(int en);
extern void dueros_dma_manufacturer_info_init();
extern int dma_disconnect(void *addr);
extern int dma_update_tws_state_to_lib(int state);
extern void dma_get_battery_callback_register(bool (*handler)(u8 battery_type, u8 *value));
extern void dma_set_pid(u32 pid);
extern int dma_tws_data_deal(u8 *data, int len);
//DMA apis ends
///***************************************///
//TME apis begins
extern void tme_get_battery_callback_register(bool (*handler)(u8 battery_type, u8 *value));
extern void tme_message_callback_register(int (*handler)(int id, int opcode, u8 *data, u32 len));
extern void tme_is_tws_master_callback_register(bool (*handler)(void));
extern void tme_tx_resume_register(void (*handler)(void));
extern void tme_rx_resume_register(void (*handler)(void));
extern int TME_protocol_process();
extern int tme_all_init(void);
extern int tme_all_exit(void);
/* extern u16 tme_speech_data_send(buf, len); */
extern int tme_ble_adv_enable(u8 enable);
extern int TME_send_packet_process(void);
extern void TME_recieve_packet_parse_process(void);
extern int tme_connect_success(void);
extern int tme_send_voice_data(u8 *buf, u16 len);
extern int tme_start_voice_recognition(int flag);
extern void tme_set_configuration_info(void *addr);
extern int tme_protocol_disconnect(void *priv);
extern void tme_set_pid(u32 pid);
extern void tme_set_bid(u32 bid);
extern u32 TME_request_ota_data(void *priv, u32 offset, u16 len);
extern void TME_notify_file_size(u32 file_size);
//TME api ends
///***************************************///
//MMA api begins
extern void mma_all_init(void);
extern void mma_all_exit(void);
extern void mma_ble_adv_enable(u8 enable);
extern int XM_speech_data_send(u8 *buf, u16 len);
extern bool XM_protocal_auth_pass(void);
extern int mma_start_voice_recognition(int ctrl);
extern void mma_message_callback_register(int (*handler)(int id, int opcode, u8 *data, u32 len));
extern void mma_is_tws_master_callback_register(bool (*handler)(void));
extern void mma_tx_resume_register(void (*handler)(void));
extern void mma_rx_resume_register(void (*handler)(void));
extern void mma_set_verdor_id(u16 pid);
extern void mma_set_product_id(u16 pid);
extern void mma_set_local_version(u16 version);
extern int mma_protocol_loop_process();
extern u32 mma_request_ota_data(void *priv, u32 offset, u16 len);
extern int mma_notify_file_size(u32 size);
extern u32 mma_report_ota_status(u8 state);
extern int mma_disconnect(void *addr);
extern void mma_tws_data_deal(u8 *data, int len);
extern void mma_get_battery_callback_register(bool (*handler)(u8 battery_type, u8 *value));
//MMA API END
///***************************************///
//GFPS apis begins
extern int gfps_all_init();
extern int gfps_all_exit();
extern int gfps_disconnect(void *addr);
extern int gfps_ble_adv_enable(u8 enable);
extern void gfps_set_model_id(uint8_t *model_id);
extern void gfps_set_anti_spoofing_public_key(char *public_key);
extern void gfps_set_anti_spoofing_private_key(char *private_key);
extern void gfps_get_battery_callback_register(bool (*handler)(u8 battery_type, u8 *value));
extern void gfps_message_callback_register(int (*handler)(int id, int opcode, u8 *data, u32 len));
extern void gfps_set_pair_mode(void *priv);
extern void gfps_battery_update(void);
extern void gfps_personalized_name_set(u8 *data, u8 len);
extern void gfps_is_tws_master_callback_register(bool (*handler)(void));
extern int gfps_tws_data_deal(u8 *data, int len);
extern int gfps_update_tws_state_to_lib(int state);
extern void gfps_factory_reset(void);
extern void gfps_set_battery_ui_enable(uint8_t enable);
extern void update_channel_map_do_in_irq_flag_set(uint8_t en);
//GFPS API END
#endif /* __APP_PRO_LIBS_API_H__ */
@@ -0,0 +1,160 @@
#ifndef _APP_BLE_SPP_API_H_
#define _APP_BLE_SPP_API_H_
#include "system/includes.h"
#include "btstack/bluetooth.h"
#include "btstack/avctp_user.h"
#include "list.h"
#include "timer.h"
#include "spp_user.h"
#include "btstack/le/le_common_define.h"
#include "btcontroller_modules.h"
#include "btstack/btstack_typedef.h"
/**********************************************
adv_type
**********************************************/
#define APP_ADV_IND (0) /*Connectable and scannable undirected advertising*/
#define APP_ADV_DIRECT_IND (1) /*Connectable high duty cycle directed advertising */
#define APP_ADV_SCAN_IND (2) /*Scannable undirected advertising*/
#define APP_ADV_NONCONN_IND (3) /*Non connectable undirected advertising*/
#define APP_ADV_DIRECT_IND_LOW (4) /*Connectable low duty cycle directed advertising*/
/**********************************************
adv_channel
**********************************************/
#define APP_ADV_CHANNEL_37 (BIT(0))
#define APP_ADV_CHANNEL_38 (BIT(1))
#define APP_ADV_CHANNEL_39 (BIT(2))
#define APP_ADV_CHANNEL_ALL (BIT(0)|BIT(1)|BIT(2))
extern int app_ble_set_adv_param(void *_hdl, u32 adv_interval, u8 adv_type, u8 adv_channel);
/**********************************************
ble adv
**********************************************/
extern int app_ble_adv_data_set(void *_hdl, u8 *data, u8 length);
extern int app_ble_rsp_data_set(void *_hdl, u8 *data, u8 length);
extern int app_ble_adv_enable(void *_hdl, u8 en);
// ble adv 5.0
extern int app_ble_adv_data_set_5_0(void *_hdl, le_set_ext_adv_data_t *param);
extern int app_ble_rsp_data_set_5_0(void *_hdl, le_set_ext_adv_data_t *param);
extern int app_ble_set_adv_param_5_0(void *_hdl, le_set_ext_adv_param_t *param);
extern int app_ble_adv_enable_5_0(void *_hdl, le_set_ext_adv_en_t *param);
extern int app_ble_set_mac_addr(void *_hdl, void *addr);
extern int app_ble_adv_address_type_set(void *_hdl, u8 address_type);
extern int app_ble_adv_skip(void *_hdl, u8 skip_cnt);
extern int app_ble_adv_state_get(void *_hdl);
/**********************************************
ble callback
**********************************************/
typedef void (*app_ble_packet_handler_t)(void *_hdl, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
typedef uint16_t (*app_ble_att_read_callback_t)(void *_hdl, uint16_t con_handle, uint16_t attribute_handle, uint16_t offset, uint8_t *buffer, uint16_t buffer_size);
typedef int (*app_ble_att_write_callback_t)(void *_hdl, uint16_t con_handle, uint16_t attribute_handle, uint16_t transaction_mode, uint16_t offset, uint8_t *buffer, uint16_t buffer_size);
typedef void (*app_ble_sm_event_callback_t)(void *_hdl, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
extern int app_ble_att_read_callback_register(void *_hdl, app_ble_att_read_callback_t read_callback);
extern int app_ble_att_write_callback_register(void *_hdl, app_ble_att_write_callback_t write_callback);
extern int app_ble_att_server_packet_handler_register(void *_hdl, app_ble_packet_handler_t handler);
extern int app_ble_hci_event_callback_register(void *_hdl, app_ble_packet_handler_t handler);
extern int app_ble_l2cap_packet_handler_register(void *_hdl, app_ble_packet_handler_t handler);
extern int app_ble_sm_event_callback_register(void *_hdl, app_ble_sm_event_callback_t callback);
extern int app_ble_att_client_status(void *_hdl, u8 *addr);
/**********************************************
ble module
**********************************************/
extern int app_ble_init(void);
extern int app_ble_exit(void);
extern void *app_ble_hdl_alloc(void);
extern int app_ble_hdl_free(void *_hdl);
extern int app_ble_sm_init(io_capability_t io_type, u8 auth_req, uint8_t min_key_size, u8 security_en);
extern int app_ble_profile_set(void *_hdl, const uint8_t *db);
extern int app_ble_set_filter_con_handle(void *_hdl, u16 con_handle);
extern int app_ble_disconnect(void *_hdl);
extern ble_cmd_ret_e app_ble_att_send_data(void *_hdl, u16 att_handle, u8 *data, u16 len, att_op_type_e att_op_type);
extern int app_ble_check_hdl_vaild(void *_hdl);
extern u16 app_ble_get_hdl_con_handle(void *_hdl);
extern int app_ble_att_vaild_len_get(void *_hdl);
extern int app_ble_no_profile_flag_set(void *_hdl, u8 flag);
extern int app_ble_set_ancs_connection_flag(void *_hdl, u8 flag);
extern u8 *app_ble_adv_addr_get(void *_hdl);
extern u8 *app_ble_local_mac_addr_get(void *_hdl);
extern u8 *app_ble_remote_mac_addr_get(void *_hdl);
extern int app_ble_common_core_data_size(void);
extern int app_ble_common_core_data_get(u8 *data);
extern int app_ble_common_core_data_set(u8 *data);
extern int app_ble_hdl_core_data_size(void);
extern int app_ble_hdl_core_data_get(void *_hdl, u8 *data);
extern int app_ble_hdl_core_data_set(void *_hdl, u8 *data);
extern int app_ble_adv_handle_get(void *_hdl);
// 如果BLE句柄设置了UUID,可以直接一次性同步所有设置了UUID的BLE句柄
extern int app_ble_hdl_uuid_set(void *_hdl, u32 uuid);
extern int app_ble_all_sync_data_size(void);
extern int app_ble_all_sync_data_get(u8 *sync_buf);
extern int app_ble_all_sync_data_set(u8 *sync_buf, int buf_len);
/**********************************************
spp module
**********************************************/
extern int app_spp_init(void);
extern int app_spp_exit(void);
extern void *app_spp_hdl_alloc(u8 local_id);
extern int app_spp_hdl_free(void *_hdl);
extern int app_spp_data_send(void *_hdl, u8 *buf, u16 len);
extern int app_spp_set_filter_remote_addr(void *_hdl, u8 *remote_addr);
extern int app_spp_clean_filter_remote_addr(void *_hdl);
extern int app_spp_disconnect(void *_hdl);
extern int app_spp_check_hdl_vaild(void *_hdl);
extern u8 *app_spp_get_hdl_remote_addr(void *_hdl);
extern int app_spp_hdl_core_data_size(void);
extern int app_spp_hdl_core_data_get(void *_hdl, u8 *data);
extern int app_spp_hdl_core_data_set(void *_hdl, u8 *data);
// 如果SPP句柄设置了UUID,可以直接一次性同步所有设置了UUID的BLE句柄
extern int app_spp_hdl_uuid_set(void *_hdl, u32 uuid);
extern int app_spp_all_sync_data_size(void);
extern int app_spp_all_sync_data_get(u8 *sync_buf);
extern int app_spp_all_sync_data_set(u8 *sync_buf, int buf_len);
/**********************************************
spp callback
**********************************************/
typedef void (*app_spp_recieve_callback_t)(void *hdl, void *remote_addr, u8 *buf, u16 len);
typedef void (*app_spp_state_callback_t)(void *hdl, void *remote_addr, u8 state);
typedef void (*app_spp_send_wakeup_callback_t)(void *hdl);
extern int app_spp_recieve_callback_register(void *_hdl, app_spp_recieve_callback_t callback);
extern int app_spp_state_callback_register(void *_hdl, app_spp_state_callback_t callback);
extern int app_spp_wakeup_callback_register(void *_hdl, app_spp_send_wakeup_callback_t callback);
extern int app_ble_att_handle_enable(void *_hdl, uint16_t start_handle, uint16_t end_handle, uint8_t enable);
extern int app_ble_att_handle_clear(void *_hdl);
/**********************************************
common
**********************************************/
#define APP_BLE_CONNECTION_COMPLETE (0x01)
#define APP_BLE_DISCONNECTION_COMPLETE (0x02)
#define APP_SPP_CONNECTION_COMPLETE (0x81)
#define APP_SPP_DISCONNECTION_COMPLETE (0x82)
typedef void (*app_state_update_callback_t)(void *_hdl, uint8_t state, uint8_t *packet, uint16_t size);
extern int app_ble_state_update_callback_regitster(app_state_update_callback_t callback);
extern int app_spp_state_update_callback_regitster(app_state_update_callback_t callback);
#endif // _APP_BLE_SPP_API_H_
+43
View File
@@ -0,0 +1,43 @@
#ifndef __BLE_USER_H__
#define __BLE_USER_H__
#include "typedef.h"
typedef enum {
BLE_ST_NULL = 0,
BLE_ST_INIT_OK, //协议栈初始化ok
BLE_ST_IDLE, //关闭广播或扫描状态
BLE_ST_CONNECT, //链路刚连上
BLE_ST_SEND_DISCONN, //发送断开命令,等待链路断开
BLE_ST_DISCONN, //链路断开状态
BLE_ST_CONNECT_FAIL, //连接失败
BLE_ST_CONNECTION_UPDATE_OK,//更新连接参数完成
BLE_ST_ADV = 0x20, //设备处于广播状态
BLE_ST_NOTIFY_IDICATE, //设备已连上,允许发数(已被主机使能通知)
BLE_ST_SCAN = 0x40, //设备处于搜索状态
BLE_ST_CREATE_CONN, //发起设备连接
BLE_ST_SEND_CREATE_CONN_CANNEL, //取消发起设备连接
BLE_ST_SEARCH_COMPLETE, //链路连上,已搜索完profile,可以发送数据操作
BLE_ST_SEND_STACK_EXIT = 0x60, //发送退出协议栈命令,等待完成
BLE_ST_STACK_EXIT_COMPLETE, //协议栈退出成功
} ble_state_e;
enum {
APP_BLE_NO_ERROR = 0,
APP_BLE_BUFF_FULL, //buffer 满,会丢弃当前发送的数据包
APP_BLE_BUFF_ERROR, //
APP_BLE_OPERATION_ERROR, //操作错误
APP_BLE_IS_DISCONN, //链路已断开
APP_BLE_NO_WRITE_CCC, //主机没有 write Client Characteristic Configuration
};
struct BLE_CONFIG_VAR {
ble_state_e JL_ble_status;
struct ble_server_operation_t *rcsp_ble;
};
#endif//__BLE_USER_H__
+14
View File
@@ -0,0 +1,14 @@
#ifndef __SPP_CONFIG_H__
#define __SPP_CONFIG_H__
#include "typedef.h"
bool bt_3th_spp_fw_ready(void *priv);
s32 bt_3th_spp_send(void *priv, void *data, u16 len);
void bt_3th_spp_callback_set(void (*resume)(void), void (*recieve)(void *, void *, u16), void (*status)(u8));
u8 bt_3th_get_jl_spp_status(void);
int bt_3th_spp_data_send(void *priv, u8 *buf, u16 len);
void bt_3th_spp_init(void);
void bt_3th_spp_get_operation_table(void);
#endif//__SPP_CONFIG_H__
+37
View File
@@ -0,0 +1,37 @@
#ifndef __SPP_USER_H__
#define __SPP_USER_H__
#include "typedef.h"
extern void (*spp_state_cbk)(u8 state);
extern void (*spp_recieve_cbk)(void *priv, u8 *buf, u16 len);
extern void user_spp_data_handler_in_lib(u8 packet_type, u16 ch, u8 *packet, u16 size);
struct spp_operation_t {
int(*disconnect)(void *priv);
int(*send_data)(void *priv, void *buf, u16 len);
int(*regist_wakeup_send)(void *priv, void *cbk);
int(*regist_recieve_cbk)(void *priv, void *cbk);
int(*regist_state_cbk)(void *priv, void *cbk);
int(*busy_state)(void);
};
enum {
SPP_USER_ERR_NONE = 0x0,
SPP_USER_ERR_SEND_BUFF_BUSY,
SPP_USER_ERR_SEND_OVER_LIMIT,
SPP_USER_ERR_SEND_FAIL,
};
enum {
SPP_USER_ST_NULL = 0x0,
SPP_USER_ST_CONNECT,
SPP_USER_ST_DISCONN,
SPP_USER_ST_WAIT_DISC,
SPP_USER_ST_CONNECT_OTA,
SPP_USER_ST_DISCONN_OTA,
};
void spp_get_operation_table(struct spp_operation_t **interface_pt);
#endif//__SPP_USER_H__
+261
View File
@@ -0,0 +1,261 @@
// binary representation
// attribute size in bytes (16), flags(16), handle (16), uuid (16/128), value(...)
#ifndef _FMNA_API_H
#define _FMNA_API_H
#include <stdint.h>
#include "btstack/bluetooth.h"
#define ret_code_t int
#define fmna_ret_code_t int
//ret_code & fmna_ret_code_t return,list result
#define FMY_SUCCESS 0 ///< Successful command
#define FMY_ERROR_INTERNAL 1 ///< Internal Error
#define FMY_ERROR_INVALID_STATE 2 ///< Invalid state, operation disallowed in this state
#define FMY_ERROR_INVALID_LENGTH 3 ///< Invalid Length
#define FMY_ERROR_INVALID_DATA 4 ///< Invalid Data
#define FMY_ERROR_NULL 5 ///< Null Pointer
#define FMY_ERROR_NO_MEM 6 ///< No memory
#define FMY_ERROR_WRITE_FLASH 7 ///<
typedef enum {
FMNA_SM_BOOT = 0,
FMNA_SM_PAIR,
FMNA_SM_SEPARATED,
FMNA_SM_NEARBY,
FMNA_SM_CONNECTING,
FMNA_SM_FMNA_PAIR,
FMNA_SM_FMNA_PAIR_COMPLETE,
FMNA_SM_CONNECTED,
FMNA_SM_DISCONNECTING,
FMNA_SM_NOCHANGE,
FMNA_SM_UNPAIR,
} FMNA_SM_State_t;
typedef enum {
FMNA_SM_EVENT_BOOT = 0,
FMNA_SM_EVENT_NEARBY_SEPARATED_TIMEOUT,
FMNA_SM_EVENT_KEY_ROTATE,
FMNA_SM_EVENT_BONDED,
FMNA_SM_EVENT_UNBONDED,
FMNA_SM_EVENT_CONNECTED,
FMNA_SM_EVENT_DISCONNECTED,
FMNA_SM_EVENT_NEARBY,
FMNA_SM_EVENT_SEPARATED,
FMNA_SM_EVENT_PAIR,
FMNA_SM_EVENT_SOUND_START,
FMNA_SM_EVENT_SOUND_STOP,
FMNA_SM_EVENT_SOUND_COMPLETE,
FMNA_SM_EVENT_LOST_UT_SPEAKER_START,
FMNA_SM_EVENT_FMNA_PAIRING_INITIATE,
FMNA_SM_EVENT_FMNA_PAIRING_FINALIZE,
FMNA_SM_EVENT_FMNA_PAIRING_COMPLETE,
FMNA_SM_EVENT_FMNA_PAIRING_MFITOKEN,
FMNA_SM_EVENT_MOTION_DETECTED,
FMNA_SM_EVENT_DEBUG_RESET_INTO_SEPARATED,
FMNA_SM_EVENT_CALL_FUNC_HANDLER = 0x80,
} FMNA_SM_Event_t;
typedef enum {
BAT_STATE_FULL = 0,
BAT_STATE_MEDIUM,
BAT_STATE_LOW,
BAT_STATE_CRITICALLY_LOW,//5.1.4,stop advertising
} fmna_bat_state_level_t;
typedef enum {
FMNA_ADV_MODE_FAST = 0,
FMNA_ADV_MODE_SLOW,
} FMNA_ADV_Mode_t;
typedef enum {
FMNA_SOUND_INIT = 0,
FMNA_SOUND_START,
FMNA_SOUND_STOP,
} FMNA_SOUND_OP_t;
enum {
FMNA_OTA_OP_SUCC = 0,
FMNA_OTA_OP_NO_SPACE,
FMNA_OTA_OP_INIT_FAIL,
FMNA_OTA_OP_WRITE_FAIL,
FMNA_OTA_OP_CRC_FAIL,
FMNA_OTA_OP_MALLOC_FAIL,
FMNA_OTA_OP_PKT_NUM_ERR,
FMNA_OTA_OP_LEN_ERR,
FMNA_OTA_OP_OTHER_ERR,
};
typedef enum {
FMNA_UARP_OTA_REQ = 1,
FMNA_UARP_OTA_FILE_INFO,
FMNA_UARP_OTA_DATA,
FMNA_UARP_OTA_END,
FMNA_UARP_OTA_DISCONNECT,
} uarp_cmd_type_t;
/*
0 = Powered
1 = Non-rechargeable battery
2 = Rechargeable battery
*/
typedef enum {
FMNA_BAT_POWERED = 0,
FMNA_BAT_NON_RECHARGEABLE,
FMNA_BAT_RECHARGEABLE,
} FMNA_battery_level_t;
struct fmna_event {
u8 event;
u8 args[3];
u32 value;
void *event_data;
void *handler;
};
//Accessory category
#define FMY_CATEGORY_Finder 1
#define FMY_CATEGORY_Other 128
#define FMY_CATEGORY_Luggage 129
#define FMY_CATEGORY_Backpack 130
#define FMY_CATEGORY_Jacket 131
#define FMY_CATEGORY_Coat 132
#define FMY_CATEGORY_Shoes 133
#define FMY_CATEGORY_Bike 134
#define FMY_CATEGORY_Scooter 135
#define FMY_CATEGORY_Stroller 136
#define FMY_CATEGORY_Wheelchair 137
#define FMY_CATEGORY_Boat 138
#define FMY_CATEGORY_Helmet 139
#define FMY_CATEGORY_Skateboard 140
#define FMY_CATEGORY_Skis 141
#define FMY_CATEGORY_Snowboard 142
#define FMY_CATEGORY_Surfboard 143
#define FMY_CATEGORY_Camera 144
#define FMY_CATEGORY_Laptop 145
#define FMY_CATEGORY_Watch 146
#define FMY_CATEGORY_Flash_drive 147
#define FMY_CATEGORY_Drone 148
#define FMY_CATEGORY_Headphones 149
#define FMY_CATEGORY_Earphones 150
#define FMY_CATEGORY_Inhaler 151
#define FMY_CATEGORY_Sunglasses 152
#define FMY_CATEGORY_Handbag 153
#define FMY_CATEGORY_Wallet 154
#define FMY_CATEGORY_Umbrella 155
#define FMY_CATEGORY_Water_bottle 156
#define FMY_CATEGORY_Tools_or_tool_box 157
#define FMY_CATEGORY_Keys 158
#define FMY_CATEGORY_Smart_case 159
#define FMY_CATEGORY_Remote 160
#define FMY_CATEGORY_Hat 161
#define FMY_CATEGORY_Motorbike 162
#define FMY_CATEGORY_Consumer_electronic_device 163
#define FMY_CATEGORY_Apparel 164
#define FMY_CATEGORY_Transportation_device 165
#define FMY_CATEGORY_Sports_equipment 166
#define FMY_CATEGORY_Personal_item 167
//Accessory capability
#define FMY_CAPABILITY_SUPPORTS_PLAY_SOUND BIT(0) //Supports play sound
#define FMY_CAPABILITY_SUPPORTS_MOTION_DETECTOR_UT BIT(1) //Supports motion detector UT
#define FMY_CAPABILITY_SUPPORTS_SN_LOOKUP_BY_NFC BIT(2) //Supports serial number lookup by NFC
#define FMY_CAPABILITY_SUPPORTS_SN_LOOKUP_BY_BLE BIT(3) //Supports serial number lookup by BLE
#define FMY_CAPABILITY_SUPPORTS_FW_UPDATE_SERVICE BIT(4) //Supports firmware update service
//uuid,mac type
#define STATIC_ADV_ADDR_TYPE_MASK (0x03 << 6)
#define FMY_UUID_SERVICE 0xFD44
#define APPLE_VENDOR_ID 0x004C
typedef struct {
uint16_t pairing_control_point_handle;
uint16_t owner_cfg_control_point_handle;
uint16_t non_owner_control_point_handle;
uint16_t owner_info_porint_handle;
uint16_t debug_control_point_handle;
uint16_t firmware_update_handle;
} fmna_att_handle_t;
typedef struct {
int (*evnet_post_msg)(u8 priv_event, void *evt_data, u32 value, void *handler);
int (*set_adv_data)(uint8_t fmna_state, uint8_t *fmna_payload, uint8_t size);
int (*set_adv_mode)(uint8_t mode);
int (*set_adv_enable)(uint8_t enable);
int (*get_mac)(uint8_t *mac);
int (*set_mac)(uint8_t *mac);
int (*att_send_data)(uint16_t conn_handle, uint16_t att_handle, uint8_t *data, uint16_t len, att_op_type_e op_type);
int (*get_battery_level)(void);
int (*call_disconnect)(uint16_t conn_handle, uint8_t reason);
int (*sound_control)(FMNA_SOUND_OP_t op);
int (*uarp_ota_process)(uarp_cmd_type_t cmd_type, uint8_t *recv_data, uint32_t recv_len);
int (*sensor_init)(void);
int (*sensor_deinit)(void);
bool (*motion_deteted)(void);
uint16_t (*state_callback)(FMNA_SM_State_t fmy_state, const char *state_string);
bool (*check_capability)(u8 cap);
} fmna_app_api_t;
typedef struct {
//读取信息时,指针为0则不获取对应项信息
uint8_t *serial_number;//16byte
uint8_t *uuid;//16byte
uint8_t *token;//1024byte
} fmna_input_cfg_t;
//--------------------------------------------------------------------------------
void fmna_gatt_set_att_handle_table(const fmna_att_handle_t *att_table);
void fmna_gatt_platform_connect(uint16_t conn_handle);
void fmna_state_machine_event_handle(void *event);
fmna_ret_code_t fmna_gatt_config_char_write_handler(uint16_t conn_handle, uint16_t uuid, uint16_t length, uint8_t const *data);
fmna_ret_code_t fmna_gatt_pairing_char_authorized_write_handler(uint16_t conn_handle, uint16_t uuid, uint16_t length, uint8_t const *data);
fmna_ret_code_t fmna_gatt_nonown_char_write_handler(uint16_t conn_handle, uint16_t uuid, uint16_t length, uint8_t const *data);
fmna_ret_code_t fmna_gatt_paired_owner_char_write_handler(uint16_t conn_handle, uint16_t uuid, uint16_t length, uint8_t const *data);
fmna_ret_code_t fmna_gatt_debug_char_write_handler(uint16_t conn_handle, uint16_t uuid, uint16_t length, uint8_t const *data);
fmna_ret_code_t fmna_gatt_uarp_char_write_handler(uint16_t conn_handle, uint16_t uuid, uint16_t length, uint8_t const *data);
void fmna_debug_control_point_rx_handler(uint16_t conn_handle, uint8_t const *data, uint16_t length) ;
void fmna_save_mac_vm_id(uint16_t vm_id);
void fmna_set_app_api(fmna_app_api_t *api_table);
bool fmna_connection_is_fmna_paired(void);
uint8_t fmna_get_current_state(void);
void fmna_gatt_set_mtu_size(uint16_t conn_handle, uint16_t mtu_size);
const uint8_t *fmna_get_product_data(void);
uint32_t fmna_version_get_fw_version(void);
uint8_t *fmna_version_get_network_version(void);
void fmna_set_accessory_category(const uint8_t *accessory_category);
const uint8_t *fmna_get_accessory_category(void);
uint32_t fmna_pm_peer_count(void);
void fmna_version_init(uint16_t major_number, uint8_t minor_number, uint8_t revision_number);
void fmna_paired_serialnumber_lookup_enable(uint8_t enable);
int fmna_get_paired_serialnumber_lookup_state(void);
void fmna_connection_connected_handler(uint16_t conn_handle, uint16_t conn_interval);
void fmna_connection_conn_param_update_handler(uint16_t conn_handle, uint16_t conn_interval);
void fmna_connection_disconnected_handler(uint16_t conn_handle, uint8_t disconnect_reason);
void fmna_connection_encryption_change_complete(uint16_t conn_handle, bool is_sucess);
int fmna_connection_pair_request_check(uint16_t conn_handle);
void fmna_connection_set_sys_max_connections(uint8_t max_connections);
void fmna_config_user_vm_rang(uint16_t vm_start_id, uint16_t vm_end_id);
void fmna_connection_disconnect_all(void);
void fmna_gatt_platform_recieve_indication_response(uint16_t conn_handle, uint16_t att_handle);
void fmna_plaform_reset_config(void);
void fmna_set_product_data(const uint8_t *data);
int fmna_Base64Decode(char *inStr, char *outHex, int outBufLen);
int uuid_str_to_hex(const char *uuid_str, uint8_t *out_buf);
void fmna_user_cfg_set_patch(const char *path);
ret_code_t fmna_user_cfg_open(void);
ret_code_t fmna_user_cfg_close(void);
ret_code_t fmna_user_cfg_write(fmna_input_cfg_t *input_cfg);
ret_code_t fmna_user_cfg_read(fmna_input_cfg_t *cfg);
ret_code_t fmna_set_crypto_enc_key_config(const char *server_enc_key, const char *signature_vf_key);
bool fmna_user_cfg_is_exist(void);
#endif
+107
View File
@@ -0,0 +1,107 @@
#ifndef _JL_RCSP_LIB_API_H_
#define _JL_RCSP_LIB_API_H_
#include "typedef.h"
#include "uart.h"
#define USE_LITTLE_ENDIAN 0
#define USE_BIG_ENDIAN 1
#define USE_ENDIAN_TYPE USE_LITTLE_ENDIAN
#define AI_LICENCE_LEN 16
enum {
TULING = 0,
DEEPBRAIN,
};
#pragma pack(1)
struct _AI_platform {
u8 platform;
u8 license[AI_LICENCE_LEN];
};
#pragma pack()
#pragma pack(1)
typedef struct _rcsp_auth_hdl {
u16 ble_con_handle;
u8 spp_remote_addr[6];
bool rcsp_auth_flag; // 是否认证成功
} JL_rcsp_auth_hdl;
#pragma pack()
u16 app_htons(u16 n);
u16 app_ntohs(u16 n);
u32 app_htonl(u32 n);
u32 app_ntohl(u32 n);
void JL_rcsp_auth_init(int (*send)(u16, u8 *, u8 *, u16, uint16_t, u8), u8 *link_key, u8 *addr);
void JL_rcsp_auth_reset(void);
/**
* @brief 判断buf是否是rcsp协议头
*
* @param buf
* @param len
*/
bool rcsp_protocol_head_check(u8 *buf, u16 len);
/**
* @brief 设备断开ble/spp时调用,重置重置认证情况
*
* @param ble_con_handle ble的con_handle句柄
* @param spp_remote_addr spp:mac_addr
*/
void JL_rcsp_reset_bthdl_auth(u16 ble_con_handle, u8 *spp_remote_addr);
/**
* @brief 获取设备是否rcsp验证
*
* @param ble_con_handle ble的con_handle句柄
* @param spp_remote_addr spp:mac_addr
*/
bool JL_rcsp_get_auth_flag_with_bthdl(u16 ble_con_handle, u8 *spp_remote_addr);
u8 JL_rcsp_get_auth_flag(void);
void JL_rcsp_set_auth_flag(u8 auth_flag);
/**
* @brief rcsp验证函数
*
* @param ble_con_handle ble的con_handle句柄
* @param spp_remote_addr spp:mac_addr
* @param buffer 手机发过来的验证数据
* @param len buffer 's length
*/
void JL_rcsp_auth_recieve(u16 ble_con_handle, u8 *spp_remote_addr, u8 *buffer, u16 len);
u8 get_rcsp_version(void);
/**
* @brief 设置设备rcsp验证情况
*
* @param hdl 第一个连接设备的认证情况
* @param hdl1 第二个连接设备的认证情况
*/
void JL_rcsp_set_auth_hdl(JL_rcsp_auth_hdl *hdl, JL_rcsp_auth_hdl *hdl1);
/**
* @brief 获取设备是否rcsp验证
*
* @param hdl 第一个连接设备的认证情况
* @param hdl1 第二个连接设备的认证情况
*/
void JL_rcsp_get_auth_hdl(JL_rcsp_auth_hdl *hdl, JL_rcsp_auth_hdl *hdl1);
/**
* @brief 设备连接认证/断开连接后lib会调用这个函数,
* 应用层需要调用JL_rcsp_get_auth_hdl获取手机的认证状态,
* 并把手机的认证情况同步到tws对端
*/
void JL_rcsp_auth_flag_tws_sync(void);
#endif //_JL_RCSP_LIB_H_
+15
View File
@@ -0,0 +1,15 @@
#ifndef __JL_RCSP_ATTR_H__
#define __JL_RCSP_ATTR_H__
#include "typedef.h"
typedef u32(*attr_get_func)(void *priv, u8 attr, u8 *buf, u16 buf_size, u32 offset);
typedef void (*attr_set_func)(void *priv, u8 attr, u8 *data, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
u16 add_one_attr_huge(u8 *buf, u16 max_len, u8 offset, u8 type, u8 *data, u16 size);
u8 add_one_attr(u8 *buf, u16 max_len, u8 offset, u8 type, u8 *data, u8 size);
u8 add_one_attr_ex(u8 *buf, u16 max_len, u8 offset, u8 type, u8 *data, u8 size, u8 att_size);
u8 add_one_attr_continue(u8 *buf, u16 max_len, u8 offset, u8 type, u8 *data, u8 size);
u32 attr_get(void *priv, u8 *buf, u16 buf_size, const attr_get_func *func_tab, u8 attr_max, u32 mask);
void attr_set(void *priv, u8 *data, u16 len, const attr_set_func *func_tab, u8 attr_max, u16 ble_con_handle, u8 *spp_remote_addr);
#endif//__JL_RCSP_ATTR_H__
+122
View File
@@ -0,0 +1,122 @@
#ifndef __JL_PACKET_H__
#define __JL_PACKET_H__
#include "typedef.h"
#include "generic/list.h"
#define READ_BIG_U16(a) ((*((u8*)(a)) <<8) + *((u8*)(a)+1))
#define READ_BIG_U32(a) ((*((u8*)(a)) <<24) + (*((u8*)(a)+1)<<16) + (*((u8*)(a)+2)<<8) + *((u8*)(a)+3))
#define READ_LIT_U16(a) (*((u8*)(a)) + (*((u8*)(a)+1)<<8))
#define READ_LIT_U32(a) (*((u8*)(a)) + (*((u8*)(a)+1)<<8) + (*((u8*)(a)+2)<<16) + (*((u8*)(a)+3)<<24))
#define WRITE_BIG_U16(a,src) {*((u8*)(a)+0) = (u8)(src>>8); *((u8*)(a)+1) = (u8)(src&0xff); }
#define WRITE_BIG_U32(a,src) {*((u8*)(a)+0) = (u8)((src)>>24); *((u8*)(a)+1) = (u8)(((src)>>16)&0xff);*((u8*)(a)+2) = (u8)(((src)>>8)&0xff);*((u8*)(a)+3) = (u8)((src)&0xff);}
#define WRITE_LIT_U16(a,src) {*((u8*)(a)+1) = (u8)(src>>8); *((u8*)(a)+0) = (u8)(src&0xff); }
#define WRITE_LIT_U32(a,src) {*((u8*)(a)+3) = (u8)((src)>>24); *((u8*)(a)+2) = (u8)(((src)>>16)&0xff);*((u8*)(a)+1) = (u8)(((src)>>8)&0xff);*((u8*)(a)+0) = (u8)((src)&0xff);}
#pragma pack(1)
typedef union __HEAD_BIT {
struct {
u16 _OpCode: 8; //OpCode val
u16 _app_type : 3; //app_type
u16 _unsed : 3; //unsed
u16 _resp : 1; //request for response
u16 _type : 1; //command or response
} _i;
u16 _t;
} HEAD_BIT;
struct __JL_PACKET {
u8 tag[3];
HEAD_BIT head;
u16 length;
u8 data[0];
};
#pragma pack()
typedef struct __JL_PACKET JL_PACKET;
typedef struct __JL_QUEUE {
struct list_head head;
u32 total_size;
u32 max_size;
} JL_QUEUE;
typedef struct __JL_PACKET_ENTRY {
struct list_head entry;
u16 packet_size;
u8 packet[0];
} JL_PACKET_ENTRY;
struct __JL_PACKET_CONTROL {
JL_PACKET packet;
JL_QUEUE queue;
u8 *packet_buf;
u32 packet_offset;
u32 packet_remain;
};
typedef struct __JL_PACKET_CONTROL JL_PACKET_CONTROL;
#define JL_PACK_START_TAG0 (0xfe)
#define JL_PACK_START_TAG1 (0xdc)
#define JL_PACK_START_TAG2 (0xba)
#define JL_PACK_END_TAG (0xef)
#define JL_ONE_PACKET_LEN(n) (sizeof(JL_PACKET) + n + 1)
#ifdef JL_RCSP_UBOOT_LIB
#define JL_MTU_RESV (540L)
#define JL_MTU_SEND (128L)
#define JL_RECIEVE_BUF_SIZE ((JL_MTU_RESV + sizeof(JL_PACKET))*2)
#define JL_CMD_POOL_SIZE (JL_MTU_SEND)
#define JL_RESP_POOL_SIZE (JL_MTU_SEND*2)
#define JL_WAIT_RESP_POOL_SIZE (JL_MTU_SEND)
#else
#define JL_MTU_RESV (540L)
#define JL_MTU_SEND (128L)
#define JL_RECIEVE_BUF_SIZE (JL_MTU_RESV + sizeof(JL_PACKET) + 128)
#define JL_CMD_POOL_SIZE (JL_MTU_SEND*4)
#define JL_RESP_POOL_SIZE (JL_MTU_SEND*2)
#define JL_WAIT_RESP_POOL_SIZE (JL_MTU_SEND*2)
#endif
void set_jl_rcsp_recieve_buf_size(u16 size);
u16 rcsp_packet_write_alloc_len(void);
u32 rcsp_packet_need_buf_size(void);
u32 rcsp_packet_buf_init(u8 *buf, u32 len, u8 *buf1, u32 len1);
u16 JL_packet_get_rx_max_mtu(void);
u16 JL_packet_get_tx_max_mtu(void);
u16 JL_packet_set_mtu(u16 mtu);
void JL_packet_recieve(void *buf, u16 len, u8 buf_index);
void JL_packet_clear_all_data(void);
bool JL_packet_find(u8 **r_buf, JL_PACKET **packet, u8 buf_index);
void JL_packet_init(void);
void JL_packet_clear(void);
void JL_packet_packing(
JL_PACKET *packet,
u8 OpCode,
u8 type,
u8 request_rsp,
u8 *extra_param,
u16 extra_len,
u8 *data,
u16 len);
void set_jl_mtu_resv(u16 jl_mtu_resv_var);
void set_jl_mtu_send(u16 jl_mtu_send_var);
extern u16 jl_mtu_resv;
extern u16 jl_mtu_send;
extern u16 jl_recieve_buf_size;
extern u16 jl_cmd_pool_size;
extern u16 jl_rcsp_pool_size;
extern u16 jl_wait_rcsp_pool_size;
#endif//__JL_PACKET_H__
@@ -0,0 +1,105 @@
#ifndef __JL_PROTOCOL_H__
#define __JL_PROTOCOL_H__
#include "typedef.h"
#include "JL_rcsp_packet.h"
enum {
JL_NOT_NEED_RESPOND = 0,
JL_NEED_RESPOND,
};
typedef enum __JL_ERR {
JL_ERR_NONE = 0x0,
JL_ERR_SEND_DATA_OVER_LIMIT,
JL_ERR_SEND_BUSY,
JL_ERR_SEND_NOT_READY,
JL_ERR_EXIT,
JL_ERR_SLAVE_SEND,
JL_ERR_MAX,
} JL_ERR;
typedef enum __JL_PRO_STATUS {
JL_PRO_STATUS_SUCCESS = 0x0,
JL_PRO_STATUS_FAIL,
JL_PRO_STATUS_UNKOWN_CMD,
JL_PRO_STATUS_BUSY,
JL_PRO_STATUS_NO_RESPONSE,
JL_PRO_STATUS_CRC_ERR,
JL_PRO_STATUS_ALL_DATA_CRC_ERR,
JL_PRO_STATUS_PARAM_ERR,
JL_PRO_STATUS_RESP_DATA_OVER_LIMIT,
} JL_PRO_STATUS;
///*< JL_CMD、JL_CMD_response、JL_DATA、JL_DATA_response packet send functions>*/
JL_ERR JL_CMD_send(u8 OpCode, u8 *data, u16 len, u8 request_rsp, u16 ble_con_handle, u8 *spp_remote_addr);
JL_ERR JL_CMD_response_send(u8 OpCode, u8 status, u8 sn, u8 *data, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
JL_ERR JL_DATA_send(u8 OpCode, u8 CMD_OpCode, u8 *data, u16 len, u8 request_rsp, u16 ble_con_handle, u8 *spp_remote_addr);
JL_ERR JL_DATA_response_send(u8 OpCode, u8 status, u8 sn, u8 CMD_OpCode, u8 *data, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
///*<JL_CMD、JL_CMD_response、JL_DATA、JL_DATA_response recieve>*/
typedef struct __JL_PRO_CB {
/*send function callback, SPP or ble*/
void *priv;
// bool (*fw_ready)(void *priv);
// s32(*fw_send)(void *priv, void *buf, u16 len);
/*JL_CMD、JL_CMD_response、JL_DATA、JL_DATA_response packet recieve callback*/
void (*CMD_resp)(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
void (*DATA_resp)(void *priv, u8 OpCode_SN, u8 CMD_OpCode, u8 *data, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
void (*CMD_no_resp)(void *priv, u8 OpCode, u8 *data, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
void (*DATA_no_resp)(void *priv, u8 CMD_OpCode, u8 *data, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
void (*CMD_recieve_resp)(void *priv, u8 OpCode, u8 status, u8 *data, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
void (*DATA_recieve_resp)(void *priv, u8 status, u8 CMD_OpCode, u8 *data, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
u8(*wait_resp_timeout)(void *priv, u8 OpCode, u8 counter);
// void (*auth_pass_callback)(void *priv);
} JL_PRO_CB;
#pragma pack(1)
typedef struct _rcsp_bound_hdl {
u16 ble_con_handle;
u8 spp_remote_addr[6];
} JL_rcsp_bound_hdl;
#pragma pack()
// 一拖二设备标识与底层buf的绑定
void rcsp_protocol_bound(u16 ble_con_handle, u8 *spp_remote_addr);
// 一拖二设备标识与底层buf的解除绑定
void rcsp_protocol_reset_bound(u16 ble_con_handle, u8 *spp_remote_addr);
/**
* @brief 设置协议绑定信息
*
* @param hdl 第一个连接设备的协议绑定信息
* @param hdl1 第二个连接设备的协议绑定信息
*/
void rcsp_protocol_set_bound_hdl(JL_rcsp_bound_hdl *hdl, JL_rcsp_bound_hdl *hdl1);
/**
* @brief 获取协议绑定信息
*
* @param hdl 第一个连接设备的协议绑定信息
* @param hdl1 第二个连接设备的协议绑定信息
*/
void rcsp_protocol_get_bound_hdl(JL_rcsp_bound_hdl *hdl, JL_rcsp_bound_hdl *hdl1);
extern u32 rcsp_protocol_need_buf_size(void);
extern void JL_protocol_init(u8 *buf, u32 len);
extern void JL_protocol_exit(void);
extern void JL_protocol_dev_switch(const JL_PRO_CB *cb);
extern void JL_protocol_data_recieve(void *priv, void *buf, u16 len, u16 ble_con_handle, u8 *spp_remote_addr);
extern void JL_protocol_resume(void);
extern bool rcsp_send_list_is_empty(void);
extern void JL_send_packet_process(void);
extern void JL_recieve_packet_parse_process(void);
#endif//__JL_PROTOCOL_H__
@@ -0,0 +1,167 @@
#ifndef _BTSTACK_RCSP_USER_H_
#define _BTSTACK_RCSP_USER_H_
#include "typedef.h"
#include "JL_rcsp_api.h"
#include "JL_rcsp_packet.h"
#include "JL_rcsp_protocol.h"
#include "btstack/le/att.h"
extern void *rcsp_server_ble_hdl; // ble连接handle
extern void *rcsp_server_ble_hdl1; // ble连接handlercsp双连的时候有效
/**
* @brief rcsp ble/spp handle初始化
*/
void bt_rcsp_interface_init(const uint8_t *rcsp_profile_data);
/**
* @brief rcsp ble/spp handle退出并销毁
*/
void bt_rcsp_interface_exit(void);
/**
* @brief 获取rcsp已连接设备数目
*
* @result 返回连接的手机设备数
*/
u8 bt_rcsp_device_conn_num(void);
/**
* @brief 获取当前已连接ble数目
*
* @result 返回连接的ble手机设备数
*/
u8 bt_rcsp_ble_conn_num(void);
/**
* @brief 获取当前已连接spp数目
*
* @result 返回连接的spp手机设备数
*/
u8 bt_rcsp_spp_conn_num(void);
/**
* @brief 在连接或断开的时候,设置rcsp蓝牙连接信息
*
* @param con_handle ble连接或断开时输入
* @param remote_addr spp连接或断开时输入
* @param isconn true:连接;false:断开
*/
void bt_rcsp_set_conn_info(u16 con_handle, void *remote_addr, bool isconn);
/**
* @brief 用于tws同步,从机接收到主机的tws数据后同步到本地
*
* @param bt handle数据
* @param bt handle数据长度
*/
void rcsp_interface_set_bt_hdl_with_tws_data(u8 *recieve_buf, u16 recieve_len);
/**
* @brief rcsp用户自定义ble广播名字
*/
// _WEAK_ const char *rcsp_ble_name()
/**
* @brief 用于外部接收ble/spp自定义数据使用
*
* @param ble_con_hdl ble发送句柄
* @param remote_addr spp发送地址
* @param buf 接收数据
* @param len 接收数据的长度
* @param att_handle ble_con_hdl有值时,ble的特征值,一般是用户自定义的特征
*/
// _WEAK_ void bt_rcsp_custom_recieve_callback(u16 ble_con_hdl, void *remote_addr, u8 *buf, u16 len, uint16_t att_handle)
/**
* @brief 用于发送ble/spp自定义数据使用
*
* @param ble_con_hdl ble发送句柄
* @param remote_addr spp发送地址 注:当ble_con_hdl与remote_addr都不填时,给所有的设备都发数据
* @param buf 发送的数据
* @param len 发送的数据长度
* @param att_handle ble_con_hdl有值时,可填用户自定义的特征, 为0是rcsp的特征值
* @param att_op_type 参考att_op_type_e枚举的排序
*/
void bt_rcsp_custom_data_send(u16 ble_con_hdl, u8 *remote_addr, u8 *buf, u16 len, uint16_t att_handle, att_op_type_e att_op_type);
/**
* @brief 用于rcsp接收ble/spp数据使用
*
* @param hdl ble/spp发送句柄
* @param remote_addr spp发送地址
* @param buf 接收数据
* @param len 接收数据的长度
*/
void bt_rcsp_recieve_callback(void *hdl, void *remote_addr, u8 *buf, u16 len);
/**
* @brief 设置rcsp的ble的默认发送特征
*
* @param att_handle ble_con_hdl有值时,可填用户自定义的特征, 为0是rcsp的特征值
* @param att_op_type 参考att_op_type_e枚举的排序,为0是rcsp的特征值
*/
void bt_rcsp_set_default_send_att_msg(uint16_t att_handle, att_op_type_e att_op_type);
/**
* @brief 用于发送rcsp的数据使用
*
* @param ble_con_hdl ble发送句柄
* @param remote_addr spp发送地址 注:当ble_con_hdl与remote_addr都不填时,给所有的设备都发数据
* @param buf 发送的数据
* @param len 发送的数据长度
* @param att_handle ble_con_hdl有值时,可填用户自定义的特征, 为0是rcsp的特征值,或者是bt_rcsp_set_default_send_att_msg设置的
* @param att_op_type 参考att_op_type_e枚举的排序,为0是rcsp默认配置,或者是bt_rcsp_set_default_send_att_msg设置的
*/
int bt_rcsp_data_send(u16 ble_con_hdl, u8 *remote_addr, u8 *buf, u16 len, uint16_t att_handle, u8 att_op_type);
/**
* @brief 获取当前ble连接设备的mac地址
*/
u8 *rcsp_get_ble_hdl_remote_mac_addr(u16 ble_con_handle);
/**
* @brief 获取tws同步的bt handle的总buf大小
*/
u16 rcsp_interface_tws_sync_buf_size();
/**
* @brief rcsp主机同步bt handle数据给从机
*
* @param send_buf 外部malloc的一个指针,size根据rcsp_interface_tws_sync_buf_size获取
*/
void rcsp_interface_tws_sync_buf_content(u8 *send_buf);
/**
* @brief tws同步rcsp bt_handle信息,用于tws同步ble句柄信息
* 已实现于rcsp_bt_manage.c
*/
// _WEAK_ void rcsp_interface_bt_handle_tws_sync(void)
/**
* @brief 用于外部自定义att_read_callback的使用
*
* @param hdl ble的结构体句柄
* @param connection_handle ble的连接句柄
* @param att_handle ble特征值
* @param offset
* @param buffer 读特征的数据
* @param buffer_size 读特征的数据长度
*/
// _WEAK_ uint16_t bt_rcsp_custom_att_read_callback(void *hdl, hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t offset, uint8_t *buffer, uint16_t buffer_size)
/**
* @brief 用于外部自定义att_write_callback的使用
*
* @param hdl ble的结构体句柄
* @param connection_handle ble的连接句柄
* @param att_handle ble特征值
* @param transaction_mode
* @param offset
* @param buffer 写特征的数据
* @param buffer_size 写特征的数据长度
*/
// _WEAK_ void bt_rcsp_custom_att_write_callback(void *hdl, hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t transaction_mode, uint16_t offset, uint8_t *buffer, uint16_t buffer_size)
#endif // _BTSTACK_RCSP_USER_H_
@@ -0,0 +1,50 @@
#ifndef __SCREEN_EAR_INTERFACE_H__
#define __SCREEN_EAR_INTERFACE_H__
#include "typedef.h"
/*-------------------CMD start----------------------*/
#define CUSTOM_ALL_INFO_CMD 0xff // 所有信息
#define CUSTOM_BT_CONNECT_STATE_CMD 0x1 // bt连接状态
#define CUSTOM_BLE_CONNECT_STATE_CMD 0x2 // ble连接状态
#define CUSTOM_BLE_BATTERY_STATE_CMD 0x3 // 电量信息
#define CUSTOM_BLE_VOLUMEN_CMD 0x4 // 音量信息
#define CUSTOM_BLE_TIME_DATE_CMD 0x5 // 时间信息
#define CUSTOM_EQ_DATE_CMD 0x6 // EQ信息
#define CUSTOM_ANC_DATE_CMD 0x7 // ANC信息
#define CUSTOM_CALL_STATE_CMD 0x8 // 通话状态获取
#define CUSTOM_PHONE_CALL_INFO_CMD 0x9 // 通话号码信息
#define CUSTOM_BLE_VOL_CONTROL_CMD 0x32 // 音量控制
#define CUSTOM_BLE_MUSIC_STATE_CONTROL_CMD 0x33 // 音乐状态控制
#define CUSTOM_BLE_ANC_MODE_CONTROL_CMD 0x34 // ANC 模式控制
#define CUSTOM_BLE_EQ_MODE_CONTROL_CMD 0x35 // EQ 模式控制
#define CUSTOM_BLE_PLAY_MODE_CONTROL_CMD 0x36 // 设置播放模式
#define CUSTOM_BLE_ALARM_CLOCK_CONTROL_CMD 0x37 // 播放闹钟
#define CUSTOM_BLE_FINE_EARPHONE_CMD 0x38 // 查找手机
#define CUSTOM_BLE_FLASHLIGHT_CONTROL_CMD 0x39 // 手电筒
#define CUSTOM_BLE_SWITCH_LANGUAGE 0x40 //切换语言 1中文,2英文
#define CUSTOM_BLE_CONTRAL_CALL 0x41 //控制接听挂断 1接听 2挂断
#define CUSTOM_BLE_USER_ADD_CMD 0X42 //用户自定义命令
#define CUSTOM_BLE_CONTRAL_DOUYIN 0X43 //控制抖音操作
#define CUSTOM_BLE_CONTRAL_PHOTO 0X44 //控制拍照操作
#define CUSTOM_EDR_CONTRAL_CONN 0X45 // 控制edr连接
#define CUSTOM_EDR_SYNC_INFO 0X46 // 同步经典蓝牙信息
#define CUSTOM_EDR_SIRI_CTRL 0X47 // 语音助手设置
#define CUSTOM_BLE_CONTRAL_PHONEOUT 0X48 // 拨出电话
#define CUSTOM_BLE_CONTRAL_KEY 0X49 // 按键同步设置
#define CUSTOM_SLEEP_CTRL_CMD 0x4A // 屏幕亮灭状态
#define CUSTOM_EDR_CLEAR_COMP 0x4B // br等待仓连接
/*-------------------CMD end----------------------*/
typedef void (*screen_app_receive_handle)(u8 cmd, u8 *data, u8 len);
typedef int (*screen_app_operation_send_handle)(u8 *data, u16 len);
void register_receive_handle(screen_app_receive_handle callback);
void register_send_handle(screen_app_operation_send_handle callback);
void custom_ble_client_write_no_respond(u8 cmd, u8 *data, u8 len);
int ble_notify_recv_data_handler(uint8_t *buffer, uint16_t buffer_size);
#endif