零. 概述
本文章主要讲下双模蓝牙协议栈的代码结构以及常用的一些配置选项
一. 声明
本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:
第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。
第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等
第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(LMP)等
第四篇:传统蓝牙host介绍,主要介绍传统蓝牙的协议栈,比如HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等一系列的协议吧。
第五篇:低功耗蓝牙controller介绍,主要介绍低功耗蓝牙芯片,包括物理层(PHY),链路层(LL)
第六篇:低功耗蓝牙host介绍,低功耗蓝牙协议栈的介绍,包括HCI,L2CAP,ATT,GATT,SM等
第七篇:蓝牙芯片介绍,主要介绍一些蓝牙芯片的初始化流程,基于HCI vendor command的扩展
第八篇:附录,主要介绍以上常用名词的介绍以及一些特殊流程的介绍等。
另外,开发板如下所示,对于想学习蓝牙协议栈的最好人手一套。以便更好的学习蓝牙协议栈,相信我,学完这一套视频你将拥有修改任何协议栈的能力(比如Linux下的bluez,Android下的bluedroid)。
-------------------------------------------------------------------------------------------------------------------------
CSDN学院链接(进入选择你想要学习的课程):https://edu.csdn.net/lecturer/5352?spm=1002.2001.3001.4144
蓝牙交流扣扣群:970324688
Github代码:https://github.com/sj15712795029/bluetooth_stack
入手开发板:https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.18.5aeb41f973iStr&id=622836061708
蓝牙学习目录:https://blog.csdn.net/XiaoXiaoPengBo/article/details/107727900
--------------------------------------------------------------------------------------------------------------------------
二. 代码结构
备注:我们在新的代码中增加了mcu_bt_tool文件夹,这个是用上位机控制我们STM32开发版的
三.代码配置选项
3.1 Debug日志开启关闭
#define BT_DEBUG printf
#define BT_PBUF_TRACE_LEVEL 1
#define BT_MEMORY_TRACE_LEVEL 1
#define BT_SNOOP_TRACE_LEVEL 1
#define BT_TRANSPORT_TRACE_LEVEL 3
#define BT_VENDOR_TRACE_LEVEL 3
#define BT_HCI_TRACE_LEVEL 3
#define BT_L2CAP_TRACE_LEVEL 3
#define BT_SDP_TRACE_LEVEL 3
#define BT_RFCOMM_TRACE_LEVEL 3
#define BT_HFP_TRACE_LEVEL 3
#define BT_HSP_TRACE_LEVEL 3
#define BT_OBEX_TRACE_LEVEL 3
#define BT_PBAP_TRACE_LEVEL 3
#define BT_MAP_TRACE_LEVEL 3
#define BT_DID_TRACE_LEVEL 3
#define BT_SPP_TRACE_LEVEL 3
#define BT_AVDTP_TRACE_LEVEL 3
#define BT_AVCTP_TRACE_LEVEL 3
#define BT_A2DP_TRACE_LEVEL 3
#define BT_AVRCP_TRACE_LEVEL 3
此部分的代码对应的设置为0,那么就是realease版本(不带任何log),如果设置为1,也只打印error log,如果设置为2,那么打印error log + warning log,如果设置为3,那么所有的log都打印,并且每个开关都会对应于特定的协议,可以只选择开某一个协议的log,实现原理大概贴下
Bt_debug.h的等级有如下定义
#define BT_TRACE_LEVEL_NONE 0
#define BT_TRACE_LEVEL_ERROR 1
#define BT_TRACE_LEVEL_WARNING 2
#define BT_TRACE_LEVEL_DEBUG 3
我们以btsnoop打印原理来看下:
只有我们配置的等级高于特定的等级,才会打印出log
#define BT_SNOOP_TRACE_ERROR(fmt,...) \
{ \
if (BT_SNOOP_TRACE_LEVEL >= BT_TRACE_LEVEL_ERROR) \
BT_DEBUG(fmt,##__VA_ARGS__); \
}
#define BT_SNOOP_TRACE_WARNING(fmt,...) \
{ \
if (BT_SNOOP_TRACE_LEVEL >= BT_TRACE_LEVEL_WARNING) \
BT_DEBUG(fmt,##__VA_ARGS__); \
}
#define BT_SNOOP_TRACE_DEBUG(fmt,...) \
{ \
if (BT_SNOOP_TRACE_LEVEL >= BT_TRACE_LEVEL_DEBUG) \
BT_DEBUG(fmt,##__VA_ARGS__); \
}
使用方式如下:
3.2 蓝牙Profile功能开启关闭,开关如下:
#define PROFILE_DID_ENABLE 0
#define PROFILE_HFP_ENABLE 1
#define PROFILE_SPP_ENABLE 0
#define PROFILE_PBAP_ENABLE 0
#define PROFILE_A2DP_ENABLE 0
#define PROFILE_AVRCP_ENABLE 0
暂时没做全,后续会增加classical,ble的功能以及更多的profile功能
3.3 其他配置选项
① 开启Btsnoop功能,注意只能在Linux project下使用
② 配置Transport功能,分为H2,H4,H5,BSP
③ SSP配对模式的使能
④ SSP配对模式的选项
⑤ 蓝牙Class of device的配置
⑥ 蓝牙本地名称的配置
⑦ 蓝牙base on pincode的配对码