AC63_BT_SDK/apps/hid/config/lib_profile_config.c

302 lines
9.6 KiB
C
Raw Normal View History

2025-02-18 15:40:42 +08:00
#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;*/