在藍牙協議棧開發過程中,有時需要預先知道 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。
-
藍牙
+關注
關注
119文章
6313瀏覽量
178690 -
Trace
+關注
關注
0文章
20瀏覽量
11021 -
PDU
+關注
關注
0文章
101瀏覽量
17745 -
回調函數
+關注
關注
0文章
95瀏覽量
12195
原文標題:《軟件設計指南》之四-基于 Trace 實現 LLPC預覽功能
文章出處:【微信號:INGCHIPS_OFFICIAL,微信公眾號:桃芯科技】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
請問STM32H7是否支持Trace功能?
程序的TRACE需求及功能
IAR EWARM的SWO Trace調試功能
使用IAR ETM Trace調試功能的要求
如何使用SEGGER J-Trace Pro流模式實現指令跟蹤功能?
Trace32的高級功能特性
Trace輔助工具實現代碼分析與實時覆蓋率統計
如何利用Trace機制實現LLCP預覽功能
評論