NimBLE 源码分析
NimBLE 是一个开源的蓝牙 5.1 协议栈,包含主机与控制器。采用 Apache-2.0 License 开源协议,这意味着你可以免费学习并使用它。源码地址:https://github.com/apache/mynewt-nimble
(一)NimBLE 源码目录结构
1 | ├─apps |
目录 | 作用 |
---|---|
apps | nimble 的应用参考实现 |
docs | 文档 |
ext | 扩展库,比如 nimble 使用了 tinycrypt 加密库 |
nimble/controller | 蓝牙协议栈中的 controller 源码。 (主要为链路层) |
nimble/drivers | 驱动不同芯片的底层 API 。(PHY 层) |
nimble/host | 蓝牙协议栈中的 host 层 源码。 |
nimble/transport | 蓝牙协议栈中的 hci 层 源码 |
porting | nimble 移植到不同 OS 的移植文件 |
NimBLE 的移植有两种情况,一种是移植到其他软件操作系统上;另一种是移植到其他硬件芯片平台上。
操作系统移植
如果你是关注如何将 NimBLE 移植到其他软件操作系统平台上的话,可以看 nimble_npl.h
这个头文件,这个头文件声明了 NimBLE 需要操作系统提供的移植 API ,如: 事件;互斥量;信号量;系统时间;临界区访问;等需要操作系统提供的机制。 nimble_npl.h
头文件里的函数实现,一般是放在 ./porting
目录下。以下是需要实现的移植 api 注释说明:
1 | /* 通用 */ |
芯片平台移植
如果你是关注如何将 NimBle 移植到不同硬件芯片平台的话,那么需要关注的内容有如下两点:
- 控制器部分:需要将
ble_phy.h
与ble_hw.h
这两个头文件声明的函数实现,这部分的代码应该对应的是低功耗蓝牙协议栈的 PHY 层。 - 主机控制器接口:需要将
ble_hci_trans.h
中声明的函数实现,这部分的代码对应的是低功耗蓝牙协议栈的 HCI 层。
蓝牙协议栈是分层的,根据不同芯片厂家对蓝牙 ip 的开放程度,nimble 也可以做到不同层次的适配,比如不开放控制器层的代码,只适配 hci 层的代码。
芯片平台的移植,需要有芯片原厂的蓝牙基带底层一手资料,这里我无法了解每个移植 api 的准确意义,为免误人子弟,就不再对这些 api 进行注释描述了。。。
(二)NimBLE 启动流程
NimBLE 的启动流程以 rt-thread 的 nimble 软件包为例,分为两部分,下面是我画的流程图:
第一部分是系统一上电就会完成的启动流程,最终会将整个蓝牙硬件初始化完成,并启动一个专门负责链路层的任务。链路层的任务会接收链路层的事件队列,并执行每个事件对应的回调函数。
1 | /** |
第二部分是 NimBLE 应用启动的标准流程,最终会完成这个蓝牙协议栈的属性配置,并启动一个专门负责 host 层的任务。host 层的任务同样也是接收事件队列,并执行每个事件对应的回调函数。
1 | void |