AC63_BT_SDK/apps/hid/config/lib_profile_config.c
2025-02-18 15:40:42 +08:00

302 lines
9.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "system/includes.h"
#include "app_config.h"
#include "btcontroller_config.h"
#include "btstack/bt_profile_config.h"
#include "bt_common.h"
#include "btstack/avctp_user.h"
#define LOG_TAG "[BT-CFG]"
#define LOG_ERROR_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#include "debug.h"
typedef struct {
// linked list - assert: first field
void *offset_item;
// data is contained in same memory
u32 service_record_handle;
u8 *service_record;
} service_record_item_t;
extern const u8 sdp_hfp_service_data[];
/* extern const u8 sdp_pnp_service_data_for_hid[]; */
extern const u8 sdp_pnp_service_data[];
extern const u8 sdp_spp_service_data[];
extern service_record_item_t sdp_record_item_begin[];
extern service_record_item_t sdp_record_item_end[];
#define SDP_RECORD_HANDLER_REGISTER(handler) \
const service_record_item_t handler \
sec(.sdp_record_item)
#if TCFG_USER_BLE_ENABLE
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
const int config_stack_modules = (BT_BTSTACK_LE_ADV) | BT_BTSTACK_CLASSIC;
#elif (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_MESH)
const int config_stack_modules = BT_BTSTACK_LE;
#else
#if (TCFG_USER_EDR_ENABLE)
const int config_stack_modules = BT_BTSTACK_LE | BT_BTSTACK_CLASSIC;
#else
const int config_stack_modules = BT_BTSTACK_LE;
#endif
#endif
#else
#if (TCFG_USER_EDR_ENABLE)
const int config_stack_modules = BT_BTSTACK_CLASSIC;
#else
const int config_stack_modules = 0;
#endif
#endif
//定义的产品信息,for test
#define PNP_VID_SOURCE 0x02
#define PNP_VID 0x05ac //0x05d6
#define PNP_PID 0x022C //
#define PNP_PID_VERSION 0x011b //1.1.11
/* static const u8 sdp_pnp_service_data_hid[] = { */
/* 0x36, 0x00, 0x5a, 0x09, 0x00, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0a, 0x09, 0x00, 0x01, 0x35, 0x03, */
/* 0x19, 0x12, 0x00, 0x09, 0x00, 0x04, 0x35, 0x0d, 0x35, 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x01, */
/* 0x35, 0x03, 0x19, 0x00, 0x01, 0x09, 0x00, 0x05, 0x35, 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x09, */
/* 0x35, 0x08, 0x35, 0x06, 0x19, 0x12, 0x00, 0x09, 0x01, 0x00, 0x09, 0x02, 0x00, 0x09, 0x01, 0x03, */
/* 0x09, 0x02, 0x01, 0x09, PNP_VID >> 8, PNP_VID & 0xFF, 0x09, 0x02, 0x02, 0x09, PNP_PID >> 8, PNP_PID & 0xFF, */
/* 0x09, 0x02, 0x03, 0x09, */
/* PNP_PID_VERSION >> 8, PNP_PID_VERSION & 0xFF, 0x09, 0x02, 0x04, 0x28, 0x01, 0x09, 0x02, 0x05, 0x09, */
/* PNP_VID_SOURCE >> 8, PNP_VID_SOURCE & 0xFF, 0x00, 0x00 */
/* }; */
static const u8 sdp_pnp_service_data_hid[] = {
0x36, 0x00, 0xA1, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x01, 0x09, 0x00, 0x01, 0x35, 0x03,
0x19, 0x12, 0x00, 0x09, 0x00, 0x04, 0x35, 0x0D, 0x35, 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x01,
0x35, 0x03, 0x19, 0x00, 0x01, 0x09, 0x00, 0x06, 0x35, 0x09, 0x09, 0x65, 0x6E, 0x09, 0x00, 0x6A,
0x09, 0x01, 0x00, 0x09, 0x00, 0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x12, 0x00, 0x09, 0x01, 0x00,
0x09, 0x01, 0x00, 0x25, 0x2F, 0x42, 0x72, 0x6F, 0x61, 0x64, 0x63, 0x6F, 0x6D, 0x20, 0x42, 0x6C,
0x75, 0x65, 0x74, 0x6F, 0x6F, 0x74, 0x68, 0x20, 0x57, 0x69, 0x72, 0x65, 0x6C, 0x65, 0x73, 0x73,
0x20, 0x4B, 0x65, 0x79, 0x62, 0x6F, 0x61, 0x72, 0x64, 0x20, 0x50, 0x6E, 0x50, 0x20, 0x53, 0x65,
0x72, 0x76, 0x65, 0x72, 0x09, 0x01, 0x01, 0x25, 0x08, 0x4B, 0x65, 0x79, 0x62, 0x6F, 0x61, 0x72,
0x64, 0x09, 0x02, 0x00, 0x09, 0x01, 0x03, 0x09, 0x02, 0x01, 0x09, PNP_VID >> 8, PNP_VID & 0xFF, 0x09, 0x02, 0x02,
0x09, PNP_PID >> 8, PNP_PID & 0xFF, 0x09, 0x02, 0x03, 0x09, PNP_PID_VERSION >> 8, PNP_PID_VERSION & 0xFF, 0x09, 0x02, 0x04, 0x28, 0x01, 0x09, 0x02,
0x05, 0x09, PNP_VID_SOURCE >> 8, PNP_VID_SOURCE & 0xFF, 0x00, 0x00, 0x00
};
/*重定义下面hid信息结构信息用于提供给库里面接口SDP生成hid_service服务使用*/
/*用到结构体的两个接口:sdp_create_diy_device_ID_service 和 sdp_create_diy_hid_service*/
static const hid_sdp_info_t hid_sdp_info_config = {
.vid_private = PNP_VID,
.pid_private = PNP_PID,
.ver_private = PNP_PID_VERSION,
.sub_class = 0x80,
.country_code = 0x21,
.virtual_cable = 0x01,
.reconnect_initiate = 0x01,
.sdp_disable = 0x00,
.battery_power = 0x01,
.remote_wake = 0x01,
.normally_connectable = 0x01,
.boot_device = 0x01,
.version = 0x0100,
.parser_version = 0x0111,
.profile_version = 0x0100,
.supervision_timeout = 0x1f40,
.language = 0x0409,
.bt_string_offset = 0x0100,
.descriptor_len = 0,
.descriptor = NULL,
.service_name = "JL_HID",
.service_description = "hid key",
.provide_name = "JIELI",
.sdp_request_respone_callback = NULL,
.extra_buf = NULL,
.extra_len = 0,
};
#define NEW_SDP_PNP_DATA_VER 1 //for 兼容性
#if (USER_SUPPORT_PROFILE_HID==1)
u8 sdp_make_pnp_service_data[0x60];
SDP_RECORD_HANDLER_REGISTER(pnp_sdp_record_item) = {
#if NEW_SDP_PNP_DATA_VER
.service_record = (u8 *)sdp_pnp_service_data_hid,
#else
.service_record = (u8 *)sdp_make_pnp_service_data,
#endif
.service_record_handle = 0x1000A,
};
#else
SDP_RECORD_HANDLER_REGISTER(pnp_sdp_record_item) = {
.service_record = (u8 *)sdp_pnp_service_data,
.service_record_handle = 0x1000A,
};
#endif
#if (USER_SUPPORT_PROFILE_HID==1)
u8 hid_profile_support = 1;
u8 sdp_make_hid_service_data[0x200];
SDP_RECORD_HANDLER_REGISTER(hid_sdp_record_item) = {
.service_record = (u8 *)sdp_make_hid_service_data,
.service_record_handle = 0x00010006,
};
#endif
#if (USER_SUPPORT_PROFILE_MAP==1)
extern const u8 sdp_map_mce_service_data[];
u8 map_profile_support = 1;
SDP_RECORD_HANDLER_REGISTER(map_sdp_record_item) = {
.service_record = (u8 *)sdp_map_mce_service_data,
.service_record_handle = 0x00010009,
};
#endif
#if (USER_SUPPORT_PROFILE_HFP==1)
u8 hfp_profile_support = 1;
const u8 more_hfp_cmd_support = 1;
SDP_RECORD_HANDLER_REGISTER(hfp_sdp_record_item) = {
.service_record = (u8 *)sdp_hfp_service_data,
.service_record_handle = 0x00010003,
};
#else
const u8 more_hfp_cmd_support = 0;
#endif
void hid_sdp_init(const u8 *hid_descriptor, u16 size)
{
#if (USER_SUPPORT_PROFILE_HID==1)
int real_size;
/*reset info config,在生成sdp数组接口前配置*/
sdp_diy_set_config_hid_info(&hid_sdp_info_config);
#if (NEW_SDP_PNP_DATA_VER == 0)
real_size = sdp_create_diy_device_ID_service(sdp_make_pnp_service_data, sizeof(sdp_make_pnp_service_data));
printf("dy_device_id_service(%d):", real_size);
#endif
/* put_buf(sdp_make_pnp_service_data,real_size); */
real_size = sdp_create_diy_hid_service(sdp_make_hid_service_data, sizeof(sdp_make_hid_service_data), hid_descriptor, size);
printf("dy_hid_service(%d):", real_size);
/* put_buf(sdp_make_hid_service_data,real_size); */
#endif
}
/*注意hid_conn_depend_on_dev_company置2之后默认不断开HID连接 */
const u8 hid_conn_depend_on_dev_company = 2;
const u8 sdp_get_remote_pnp_info = 0;
#if ((TCFG_USER_BLE_ENABLE) && (TCFG_BLE_DEMO_SELECT != DEF_BLE_DEMO_ADV))
u8 app_le_pool[900] sec(.btstack_pool) ALIGNED(4);
#endif
#if(TCFG_USER_EDR_ENABLE)
/* #if (defined CONFIG_CPU_BD29) || (defined CONFIG_CPU_BD19) */
#if (defined CONFIG_TRANSFER_ENABLE)
u8 app_bredr_pool[672] sec(.btstack_pool) ALIGNED(4);
u8 app_bredr_profile[692] sec(.btstack_pool) ALIGNED(4);
#else
u8 app_bredr_pool[1468] sec(.btstack_pool) ALIGNED(4);
u8 app_bredr_profile[1048] sec(.btstack_pool) ALIGNED(4);
#endif //endif
#else
u8 app_bredr_pool[0] sec(.btstack_pool) ALIGNED(4);
u8 app_bredr_profile[0] sec(.btstack_pool) ALIGNED(4);
#endif
#if(TCFG_USER_EDR_ENABLE ||TCFG_USER_BLE_ENABLE)
u8 app_l2cap_pool[70] sec(.btstack_pool) ALIGNED(4);
#else
u8 app_l2cap_pool[0] sec(.btstack_pool) ALIGNED(4);
#endif
u8 *get_bredr_pool_addr(void)
{
u16 len = 0;
if (STACK_MODULES_IS_SUPPORT(BT_BTSTACK_CLASSIC)) {
len = get_bredr_pool_len();
printf("bredr pool len %d\n", len);
if (len > sizeof(app_bredr_pool)) {
ASSERT(0, "bredr_pool is small\n");
}
return &app_bredr_pool;
}
return NULL;
}
u8 *get_le_pool_addr(void)
{
u16 len = 0;
#if ((TCFG_USER_BLE_ENABLE) && (TCFG_BLE_DEMO_SELECT != DEF_BLE_DEMO_ADV))
if (STACK_MODULES_IS_SUPPORT(BT_BTSTACK_LE)) {
len = get_le_pool_len();
printf("le pool len %d\n", len);
if (len > sizeof(app_le_pool)) {
ASSERT(0, "le_pool is small\n");
}
return &app_le_pool;
}
#endif
return NULL;
}
u8 *get_l2cap_stack_addr(void)
{
u16 len = 0;
if (STACK_MODULES_IS_SUPPORT(BT_BTSTACK_CLASSIC) || STACK_MODULES_IS_SUPPORT(BT_BTSTACK_LE)) {
len = get_l2cap_stack_len();
printf("l2cap stack len %d\n", len);
if (len > sizeof(app_l2cap_pool)) {
ASSERT(0, "l2cap pool is small\n");
}
return &app_l2cap_pool;
} else {
return NULL;
}
}
u8 *get_profile_pool_addr(void)
{
u16 len = 0;
if (STACK_MODULES_IS_SUPPORT(BT_BTSTACK_CLASSIC)) {
len = get_profile_pool_len();
printf("bredr profile pool len %d\n", len);
if (len > sizeof(app_bredr_profile)) {
ASSERT(0, "bredr_profile is small\n");
}
return &app_bredr_profile;
}
return NULL;
}
const u8 a2dp_mutual_support = 0;
const u8 more_addr_reconnect_support = 0;
const u8 more_avctp_cmd_support = 0;
const u8 hci_inquiry_support = 0;
const u8 btstack_emitter_support = 0; /*定义用于优化代码编译*/
const u8 adt_profile_support = 0;
const u8 pbg_support_enable = 0;
/*u8 l2cap_debug_enable = 0xf0;
u8 rfcomm_debug_enable = 0xf;
u8 profile_debug_enable = 0xff;
u8 ble_debug_enable = 0xff;
u8 btstack_tws_debug_enable = 0xf;*/