feat: 添加杰理 JL7016 SOC 代码生成模板

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-19 16:05:36 +08:00
co-authored by Cursor
parent 0eda925f58
commit 16bffd16b2
914 changed files with 254709 additions and 45 deletions
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,206 @@
// binary representation
// attribute size in bytes (16), flags(16), handle (16), uuid (16/128), value(...)
#ifndef _LE_TRANS_DATA_H
#define _LE_TRANS_DATA_H
#include <stdint.h>
#include "app_config.h"
//
// gatt profile include file, generated by jieli gatt_inc_generator.exe
//
static const uint8_t profile_data[] = {
//////////////////////////////////////////////////////
//
// 0x0001 PRIMARY_SERVICE 1800
//
//////////////////////////////////////////////////////
0x0a, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28, 0x00, 0x18,
/* CHARACTERISTIC, 2a00, READ | WRITE | DYNAMIC, */
// 0x0002 CHARACTERISTIC 2a00 READ | WRITE | DYNAMIC
0x0d, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28, 0x0a, 0x03, 0x00, 0x00, 0x2a,
// 0x0003 VALUE 2a00 READ | WRITE | DYNAMIC
0x08, 0x00, 0x0a, 0x01, 0x03, 0x00, 0x00, 0x2a,
//////////////////////////////////////////////////////
//
// 0x0004 PRIMARY_SERVICE ae30
//
//////////////////////////////////////////////////////
0x0a, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28, 0x30, 0xae,
/* CHARACTERISTIC, ae01, WRITE_WITHOUT_RESPONSE | DYNAMIC, */
// 0x0005 CHARACTERISTIC ae01 WRITE_WITHOUT_RESPONSE | DYNAMIC
0x0d, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28, 0x04, 0x06, 0x00, 0x01, 0xae,
// 0x0006 VALUE ae01 WRITE_WITHOUT_RESPONSE | DYNAMIC
0x08, 0x00, 0x04, 0x01, 0x06, 0x00, 0x01, 0xae,
/* CHARACTERISTIC, ae02, NOTIFY, */
// 0x0007 CHARACTERISTIC ae02 NOTIFY
0x0d, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28, 0x10, 0x08, 0x00, 0x02, 0xae,
// 0x0008 VALUE ae02 NOTIFY
0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x02, 0xae,
// 0x0009 CLIENT_CHARACTERISTIC_CONFIGURATION
0x0a, 0x00, 0x0a, 0x01, 0x09, 0x00, 0x02, 0x29, 0x00, 0x00,
/* CHARACTERISTIC, ae03, WRITE_WITHOUT_RESPONSE | DYNAMIC, */
// 0x000a CHARACTERISTIC ae03 WRITE_WITHOUT_RESPONSE | DYNAMIC
0x0d, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x03, 0x28, 0x04, 0x0b, 0x00, 0x03, 0xae,
// 0x000b VALUE ae03 WRITE_WITHOUT_RESPONSE | DYNAMIC
0x08, 0x00, 0x04, 0x01, 0x0b, 0x00, 0x03, 0xae,
/* CHARACTERISTIC, ae04, NOTIFY, */
// 0x000c CHARACTERISTIC ae04 NOTIFY
0x0d, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x03, 0x28, 0x10, 0x0d, 0x00, 0x04, 0xae,
// 0x000d VALUE ae04 NOTIFY
0x08, 0x00, 0x10, 0x00, 0x0d, 0x00, 0x04, 0xae,
// 0x000e CLIENT_CHARACTERISTIC_CONFIGURATION
0x0a, 0x00, 0x0a, 0x01, 0x0e, 0x00, 0x02, 0x29, 0x00, 0x00,
/* CHARACTERISTIC, ae05, INDICATE, */
// 0x000f CHARACTERISTIC ae05 INDICATE
0x0d, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x03, 0x28, 0x20, 0x10, 0x00, 0x05, 0xae,
// 0x0010 VALUE ae05 INDICATE
0x08, 0x00, 0x20, 0x00, 0x10, 0x00, 0x05, 0xae,
// 0x0011 CLIENT_CHARACTERISTIC_CONFIGURATION
0x0a, 0x00, 0x0a, 0x01, 0x11, 0x00, 0x02, 0x29, 0x00, 0x00,
/* CHARACTERISTIC, ae10, READ | WRITE | DYNAMIC, */
// 0x0012 CHARACTERISTIC ae10 READ | WRITE | DYNAMIC
0x0d, 0x00, 0x02, 0x00, 0x12, 0x00, 0x03, 0x28, 0x0a, 0x13, 0x00, 0x10, 0xae,
// 0x0013 VALUE ae10 READ | WRITE | DYNAMIC
0x08, 0x00, 0x0a, 0x01, 0x13, 0x00, 0x10, 0xae,
#if 0
//for uuid128,sample
// PRIMARY_SERVICE, 0000F530-1212-EFDE-1523-785FEABCD123
// CHARACTERISTIC, 0000F531-1212-EFDE-1523-785FEABCD123, NOTIFY,
// CHARACTERISTIC, 0000F532-1212-EFDE-1523-785FEABCD123, WRITE_WITHOUT_RESPONSE | DYNAMIC,
//////////////////////////////////////////////////////
//
// 0x0014 PRIMARY_SERVICE 0000F530-1212-EFDE-1523-785FEABCD123
//
//////////////////////////////////////////////////////
0x18, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x28, 0x23, 0xd1, 0xbc, 0xea, 0x5f, 0x78, 0x23, 0x15, 0xde, 0xef, 0x12, 0x12, 0x30, 0xf5, 0x00, 0x00,
/* CHARACTERISTIC, 0000F531-1212-EFDE-1523-785FEABCD123, NOTIFY, */
// 0x0015 CHARACTERISTIC 0000F531-1212-EFDE-1523-785FEABCD123 NOTIFY
0x1b, 0x00, 0x02, 0x00, 0x15, 0x00, 0x03, 0x28, 0x10, 0x16, 0x00, 0x23, 0xd1, 0xbc, 0xea, 0x5f, 0x78, 0x23, 0x15, 0xde, 0xef, 0x12, 0x12, 0x31, 0xf5, 0x00, 0x00,
// 0x0016 VALUE 0000F531-1212-EFDE-1523-785FEABCD123 NOTIFY
0x16, 0x00, 0x10, 0x02, 0x16, 0x00, 0x23, 0xd1, 0xbc, 0xea, 0x5f, 0x78, 0x23, 0x15, 0xde, 0xef, 0x12, 0x12, 0x31, 0xf5, 0x00, 0x00,
// 0x0017 CLIENT_CHARACTERISTIC_CONFIGURATION
0x0a, 0x00, 0x0a, 0x01, 0x17, 0x00, 0x02, 0x29, 0x00, 0x00,
/* CHARACTERISTIC, 0000F532-1212-EFDE-1523-785FEABCD123, WRITE_WITHOUT_RESPONSE | DYNAMIC, */
// 0x0018 CHARACTERISTIC 0000F532-1212-EFDE-1523-785FEABCD123 WRITE_WITHOUT_RESPONSE | DYNAMIC
0x1b, 0x00, 0x02, 0x00, 0x18, 0x00, 0x03, 0x28, 0x04, 0x19, 0x00, 0x23, 0xd1, 0xbc, 0xea, 0x5f, 0x78, 0x23, 0x15, 0xde, 0xef, 0x12, 0x12, 0x32, 0xf5, 0x00, 0x00,
// 0x0019 VALUE 0000F532-1212-EFDE-1523-785FEABCD123 WRITE_WITHOUT_RESPONSE | DYNAMIC
0x16, 0x00, 0x04, 0x03, 0x19, 0x00, 0x23, 0xd1, 0xbc, 0xea, 0x5f, 0x78, 0x23, 0x15, 0xde, 0xef, 0x12, 0x12, 0x32, 0xf5, 0x00, 0x00,
#endif
//////////////////////////////////////////////////////
//
// 0x0014 PRIMARY_SERVICE 1812
//
//////////////////////////////////////////////////////
// 0x0a, 0x00, 0x02, 0x00, 0x34, 0x00, 0x00, 0x28, 0x12, 0x18,//ios app can't disconn
#if 0// authentication
//
10, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x28, 0x0A, 0x18, //primary service declaration
13, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x03, 0x28, 0x02, 0x1C, 0x00, 0x50, 0x2A, //characteristic declaration
15, 0x00, 0x02, 0x04, 0x1C, 0x00, 0x50, 0x2A, 0x02, 0x8A, 0x24, 0x66, 0x82, 0x34, 0x36, //PnP ID
#endif
//////////////////////////////////////////////////////
//
// 0x0040 PRIMARY_SERVICE ae3a
//
//////////////////////////////////////////////////////
0x0a, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x28, 0x3a, 0xae,
/* CHARACTERISTIC, ae3b, WRITE_WITHOUT_RESPONSE | DYNAMIC, */
// 0x0041 CHARACTERISTIC ae3b WRITE_WITHOUT_RESPONSE | DYNAMIC
0x0d, 0x00, 0x02, 0x00, 0x41, 0x00, 0x03, 0x28, 0x04, 0x42, 0x00, 0x3b, 0xae,
// 0x0042 VALUE ae3b WRITE_WITHOUT_RESPONSE | DYNAMIC
0x08, 0x00, 0x04, 0x01, 0x42, 0x00, 0x3b, 0xae,
/* CHARACTERISTIC, ae3c, NOTIFY, */
// 0x0043 CHARACTERISTIC ae3c NOTIFY
0x0d, 0x00, 0x02, 0x00, 0x43, 0x00, 0x03, 0x28, 0x10, 0x44, 0x00, 0x3c, 0xae,
// 0x0044 VALUE ae3c NOTIFY
0x08, 0x00, 0x10, 0x00, 0x44, 0x00, 0x3c, 0xae,
// 0x0045 CLIENT_CHARACTERISTIC_CONFIGURATION
0x0a, 0x00, 0x0a, 0x01, 0x45, 0x00, 0x02, 0x29, 0x00, 0x00,
//////////////////////////////////////////////////////
//
// 0x0046 PRIMARY_SERVICE 1801
//
//////////////////////////////////////////////////////
0x0a, 0x00, 0x02, 0x00, 0x46, 0x00, 0x00, 0x28, 0x01, 0x18,
/* CHARACTERISTIC, 2a05, INDICATE, */
// 0x0047 CHARACTERISTIC 2a05 INDICATE
0x0d, 0x00, 0x02, 0x00, 0x47, 0x00, 0x03, 0x28, 0x20, 0x48, 0x00, 0x05, 0x2a,
// 0x0048 VALUE 2a05 INDICATE
0x08, 0x00, 0x20, 0x00, 0x48, 0x00, 0x05, 0x2a,
// 0x0049 CLIENT_CHARACTERISTIC_CONFIGURATION
0x0a, 0x00, 0x0a, 0x01, 0x49, 0x00, 0x02, 0x29, 0x00, 0x00,
#if RCSP_BTMATE_EN
//////////////////////////////////////////////////////
//
// 0x0004 PRIMARY_SERVICE ae00
//
//////////////////////////////////////////////////////
0x0a, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x28, 0x00, 0xae,
/* CHARACTERISTIC, ae01, WRITE_WITHOUT_RESPONSE | DYNAMIC, */
// 0x0040 CHARACTERISTIC ae01 WRITE_WITHOUT_RESPONSE | DYNAMIC
0x0d, 0x00, 0x02, 0x00, 0x81, 0x00, 0x03, 0x28, 0x04, 0x82, 0x00, 0x01, 0xae,
// 0x0041 VALUE ae01 WRITE_WITHOUT_RESPONSE | DYNAMIC
0x08, 0x00, 0x04, 0x01, 0x82, 0x00, 0x01, 0xae,
/* CHARACTERISTIC, ae02, NOTIFY, */
// 0x0042 CHARACTERISTIC ae02 NOTIFY
0x0d, 0x00, 0x02, 0x00, 0x83, 0x00, 0x03, 0x28, 0x10, 0x84, 0x00, 0x02, 0xae,
// 0x0043 VALUE ae02 NOTIFY
0x08, 0x00, 0x10, 0x00, 0x84, 0x00, 0x02, 0xae,
// 0x0044 CLIENT_CHARACTERISTIC_CONFIGURATION
0x0a, 0x00, 0x0a, 0x01, 0x85, 0x00, 0x02, 0x29, 0x00, 0x00,
#endif
// END
0x00, 0x00,
};
//
// characteristics <--> handles
//
#if RCSP_BTMATE_EN
#define ATT_CHARACTERISTIC_ae01_02_VALUE_HANDLE 0x0082
#define ATT_CHARACTERISTIC_ae02_02_VALUE_HANDLE 0x0084
#define ATT_CHARACTERISTIC_ae02_02_CLIENT_CONFIGURATION_HANDLE 0x0085
#endif
#define ATT_CHARACTERISTIC_2a00_01_VALUE_HANDLE 0x0003
#define ATT_CHARACTERISTIC_ae01_01_VALUE_HANDLE 0x0006
#define ATT_CHARACTERISTIC_ae02_01_VALUE_HANDLE 0x0008
#define ATT_CHARACTERISTIC_ae02_01_CLIENT_CONFIGURATION_HANDLE 0x0009
#define ATT_CHARACTERISTIC_ae03_01_VALUE_HANDLE 0x000b
#define ATT_CHARACTERISTIC_ae04_01_VALUE_HANDLE 0x000d
#define ATT_CHARACTERISTIC_ae04_01_CLIENT_CONFIGURATION_HANDLE 0x000e
#define ATT_CHARACTERISTIC_ae05_01_VALUE_HANDLE 0x0010
#define ATT_CHARACTERISTIC_ae05_01_CLIENT_CONFIGURATION_HANDLE 0x0011
#define ATT_CHARACTERISTIC_ae10_01_VALUE_HANDLE 0x0013
#define ATT_CHARACTERISTIC_ae3b_01_VALUE_HANDLE 0x0042
#define ATT_CHARACTERISTIC_ae3c_01_VALUE_HANDLE 0x0044
#define ATT_CHARACTERISTIC_ae3c_01_CLIENT_CONFIGURATION_HANDLE 0x0045
#define ATT_CHARACTERISTIC_2a05_01_VALUE_HANDLE 0x0048
#define ATT_CHARACTERISTIC_2a05_01_CLIENT_CONFIGURATION_HANDLE 0x0049
#endif
@@ -0,0 +1,227 @@
#include "app_config.h"
#include "app_action.h"
#include "system/includes.h"
#include "spp_user.h"
#include "string.h"
#include "circular_buf.h"
#include "spp_trans_data.h"
#include "bt_common.h"
#include "btstack/avctp_user.h"
#if 0
extern void printf_buf(u8 *buf, u32 len);
#define log_info printf
#define log_info_hexdump printf_buf
#else
#define log_info(...)
#define log_info_hexdump(...)
#endif
#define TEST_SPP_DATA_RATE 0
/* #define DEBUG_ENABLE */
/* #include "debug_log.h" */
#include "spp_trans_data.h"
#if TRANS_DATA_EN || TRANS_MULTI_SPP_EN || TUYA_TRANS_EN || TUYA_DEMO_EN
#if TEST_SPP_DATA_RATE
#define SPP_TIMER_MS (100)
static u32 test_data_count;
static u32 spp_timer_handle = 0;
static u32 spp_test_start;
#endif
/*
打开流控使能后,确定配置接口 transport_spp_flow_cfg 被调用初始化配置
然后使用过程 通过接口 transport_spp_flow_enable 来控制流控开关
*/
#define SPP_DATA_RECIEVT_FLOW 0//流控功能使能
//流控速度控制,可以不用更改
#define FLOW_SEND_CREDITS_NUM 1 //控制命令中 控制可接收的数据包个数,发送给对方的,range(1~32)
#define FLOW_SEND_CREDITS_TRIGGER_NUM 1 //触发更新控制命令的阈值,range(1 to <= FLOW_SEND_CREDITS_NUM)
void rfcomm_change_credits_setting(u16 init_credits, u8 base);
int rfcomm_send_cretits_by_profile(u16 rfcomm_cid, u16 credit, u8 auto_flag);
static struct spp_operation_t *spp_api = NULL;
static u8 spp_state;
static u16 spp_channel;
int transport_spp_send_data(u8 *data, u16 len)
{
if (spp_api) {
log_info("spp_api_tx(%d) \n", len);
/* log_info_hexdump(data, len); */
clear_sniff_cnt();
return spp_api->send_data(NULL, data, len);
}
return SPP_USER_ERR_SEND_FAIL;
}
int transport_spp_send_data_check(u16 len)
{
if (spp_api) {
if (spp_api->busy_state()) {
return 0;
}
}
return 1;
}
static void transport_spp_state_cbk(u8 state)
{
spp_state = state;
switch (state) {
case SPP_USER_ST_CONNECT:
log_info("SPP_USER_ST_CONNECT ~~~\n");
break;
case SPP_USER_ST_DISCONN:
log_info("SPP_USER_ST_DISCONN ~~~\n");
spp_channel = 0;
break;
default:
break;
}
}
static void transport_spp_send_wakeup(void)
{
putchar('W');
}
static void transport_spp_recieve_cbk(void *priv, u8 *buf, u16 len)
{
spp_channel = (u16)priv;
log_info("spp_api_rx(%d) \n", len);
log_info_hexdump(buf, len);
clear_sniff_cnt();
#if TEST_SPP_DATA_RATE
if ((buf[0] == 'A') && (buf[1] == 'F')) {
spp_test_start = 1;//start
} else if ((buf[0] == 'A') && (buf[1] == 'A')) {
spp_test_start = 0;//stop
}
#endif
//loop send data for test
if (transport_spp_send_data_check(len)) {
transport_spp_send_data(buf, len);
}
}
#if TEST_SPP_DATA_RATE
static void test_spp_send_data(void)
{
u16 send_len = 250;
if (transport_spp_send_data_check(send_len)) {
test_data_count += send_len;
transport_spp_send_data(&test_data_count, send_len);
}
}
static void test_timer_handler(void)
{
static u32 t_count = 0;
if (SPP_USER_ST_CONNECT != spp_state) {
test_data_count = 0;
spp_test_start = 0;
return;
}
if (spp_test_start) {
test_spp_send_data();
}
if (++t_count < (1000 / SPP_TIMER_MS)) {
return;
}
t_count = 0;
if (test_data_count) {
log_info("\n-spp_data_rate: %d bps-\n", test_data_count * 8);
test_data_count = 0;
}
}
#endif
void transport_spp_init(void)
{
log_info("transport_spp_init\n");
log_info("spp_file: %s", __FILE__);
#if (USER_SUPPORT_PROFILE_SPP==1)
spp_state = 0;
spp_get_operation_table(&spp_api);
spp_api->regist_recieve_cbk(0, transport_spp_recieve_cbk);
spp_api->regist_state_cbk(0, transport_spp_state_cbk);
spp_api->regist_wakeup_send(NULL, transport_spp_send_wakeup);
#endif
#if TEST_SPP_DATA_RATE
spp_timer_handle = sys_timer_add(NULL, test_timer_handler, SPP_TIMER_MS);
#endif
}
void transport_spp_disconnect(void)
{
if (SPP_USER_ST_CONNECT == spp_state) {
log_info("transport_spp_disconnect\n");
user_send_cmd_prepare(USER_CTRL_SPP_DISCONNECT, 0, NULL);
}
}
static void timer_spp_flow_test(void)
{
static u8 sw = 0;
if (spp_channel) {
sw = !sw;
transport_spp_flow_enable(sw);
}
}
//配置流控制的参数,蓝牙协议栈初始化前调用配置
void transport_spp_flow_cfg(void)
{
#if SPP_DATA_RECIEVT_FLOW
rfcomm_change_credits_setting(FLOW_SEND_CREDITS_NUM, FLOW_SEND_CREDITS_TRIGGER_NUM);
//for test
/* sys_timer_add(0,timer_spp_flow_test,2000); */
#endif
}
//流控使能 EN: 1-停止收数 or 0-继续收数
int transport_spp_flow_enable(u8 en)
{
int ret = -1;
u16 credits = FLOW_SEND_CREDITS_NUM;
#if SPP_DATA_RECIEVT_FLOW
if (spp_channel) {
if (en) {
credits = 0;
}
ret = rfcomm_send_cretits_by_profile(spp_channel, credits, !en);
}
#endif
log_info("transport_spp_flow_enable:%02x,%d,%d\n", spp_channel, en, ret);
return ret;
}
#endif
@@ -0,0 +1,9 @@
#ifndef __SPP_TRANS_DATA_H__
#define __SPP_TRANS_DATA_H__
#include "typedef.h"
#include "bt_common.h"
void transport_spp_init(void);
#endif//__RCSP_SPP_USER_H__