在蓝牙协议栈开发过程中,有时需要预先知道 LLCP。本文将介绍如何利用 Trace 机制实现 LLCP 预览功能。
实现原理
打开 TracePLATFORM_TRACE_ID_LLCP类型,Controller 会在接收到 LLCP 时通过 Trace 回调函数导出数据。 我们可以在回调函数里截获PLATFORM_TRACE_ID_LLCP,并预览数据。这个的“预览”包含两层含义:
Controller 尚未处理该 PDU(Controller 将于 Trace 回调完成后处理 PDU);
只可读取 PDU 内容,不可修改。
让我们详细介绍实现方法。
1.Trace数据结构
PLATFORM_TRACE_ID_LLCPTrace 类型使用的头信息结构如下:
#pragmapack (push, 1)
typedefstruct
{
uint32_tA;
uint32_tB;
uint8_t id;
uint8_t tag;
}header_t;
#pragmapack (pop)
这个结构使用#pragmapack (push, 1)指令确保内存对齐。
2.Trace回调处理
假设cb_trace_read_llcp函数为 Trace 回调函数,在函数开头添加代码截获接收到的 LLCP:
staticuint32_tcb_trace_read_llcp(constplatform_evt_trace_t*Trace,void*ctx)
{
if(Trace->len1 ==sizeof(header_t))
{
constheader_t*p = (constheader_t*)Trace->data1;
if((p->id == PLATFORM_TRACE_ID_LLCP) && (p->tag &1))
{
constuint8_t*p8 = (constuint8_t*)Trace->data2;
llcp_preview(p->tag >>1, p8[0], p8 +1, Trace->len2 -1);
}
}
// ...
return0;
}
3.PUD预览显示
llcp_preview函数负责预览 LLCP。下面的参考代码打印了关于 LLCP 的完整信息:
连接句柄(handle)
操作码(op_code)
控制数据
staticvoidllcp_preview(hci_con_handle_thandle,uint8_top_code,constuint8_t*ctr_data,intctr_data_len)
{
platform_printf("LLCP[%d] OP %02x: ", handle, op_code);
printf_hexdump(ctr_data, ctr_data_len);
platform_printf("
");
}
特殊用法
目前 SDK 未提供设置公司 ID 的接口,暂时可以通过直接修改LLCP_VERSION_IND内容的方法修改公司 ID(修改这个值不影响 Controller 的行为和流程。) 在下面的代码里,公司 ID 被修改为0xABCD,小版本号被修改为0x1234。
#pragmapack (push, 1)
typedefstruct
{
uint8_t version;
uint16_tcompany_id;
uint16_tsubversion;
}llcp_version_ind_t;
#pragmapack (pop)
staticuint32_tcb_trace_read_llcp(constplatform_evt_trace_t*trace,void*ctx)
{
if(trace->len1 ==sizeof(header_t))
{
constheader_t*p = (constheader_t*)trace->data1;
// 判断是否为发送方向的 LLCP
if((p->id == PLATFORM_TRACE_ID_LLCP) && (0== (p->tag &1)))
{
constuint8_t*p8 = (constuint8_t*)trace->data2;
constuint16_tcon_handle = p->tag >>1;
constuint8_t op_code = p8[0];
constintctrl_data_len = trace->len2 -1;
uint8_t* ctrl_data = (uint8_t*)p8 +1;
// 判断是否为 LLCP_VERSION_IND
if((op_code ==0x0c) && (ctrl_data_len ==sizeof(llcp_version_ind_t)))
{
llcp_version_ind_t*ver_ind = (llcp_version_ind_t*)(ctrl_data);
ver_ind->company_id =0xABCD;
ver_ind->subversion =0x1234;
}
}
}
// ...
return0;
}
总结
利用 Trace 机制实现的 PDU 预览功能,能帮助开发者实时监控 LLCP 通信,实现必要功能。
温馨提示:不要忘记设置PLATFORM_CFG_TRACE_MASK,其中要包含PLATFORM_TRACE_ID_LLCP。
-
蓝牙
+关注
关注
117文章
6197浏览量
177281 -
Trace
+关注
关注
0文章
20浏览量
10907 -
PDU
+关注
关注
0文章
99浏览量
17569 -
回调函数
+关注
关注
0文章
93浏览量
12103
原文标题:《软件设计指南》之四-基于 Trace 实现 LLPC预览功能
文章出处:【微信号:INGCHIPS_OFFICIAL,微信公众号:桃芯科技】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
请问STM32H7是否支持Trace功能?
程序的TRACE需求及功能
IAR EWARM的SWO Trace调试功能
使用IAR ETM Trace调试功能的要求
如何使用SEGGER J-Trace Pro流模式实现指令跟踪功能?
Trace32的高级功能特性
Trace辅助工具实现代码分析与实时覆盖率统计

如何利用Trace机制实现LLCP预览功能
评论