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