开源蓝牙协议栈-Zephyr Bluetooth

关于Zephyr的介绍,参考:

https://blog.csdn.net/2201_75889983/article/details/129366754
Zephyr最初是由Wind River公司开发的一个微内核,在2016年的时候成为Linux基金会维护的一个项目,发展至今,已经成为了一个功能齐全的嵌入式OS。平台现在支持ARM、RISC-V、X86、Xtensa等等处理器平台,拥有原生的BLE协议栈、完整的Net协议栈,包括TCP/IP与应用层协议,为嵌入式应用的开发提供了有力的支持。

Zephyr它不仅仅维护了一个RTOS内核,还维护一些编译链、libc、 IDE插件、HEL层驱动等,几乎每一个模块都有相关的文档。正是因为拥有详细的文档,Zephyr才能源源不断的吸引人来进行尝试与开发,以至于系统不断的被完善,进入开源项目的一个良性循环。

可见,Zephyr是一个功能较为完善的RTOS。不过我们这篇文章并不是介绍RTOS是怎么用的,而只是介绍该操作系统中集成好的一个蓝牙协议栈,也就是Zephyr Bluetooth,简称zblue.(注意和bluez区分开,别搞混了)
为了能找到zblue的源码,我们就需要先找到Zephyr的源码,然后从里面找出bluetooth协议栈的模块。

提供Zephyr官网:https://www.zephyrproject.org/

跳转这里可找到源码路径:

这里有Zephyr的中文在线文档:

https://zephyr-doc.readthedocs.io/zh-cn/latest/introduction/introducing_zephyr.html

目录结构

其中,源码树结构参看这部分文档:

在Zephyr中有一个子系统目录subsys,这里面就放着蓝牙的协议栈。

具体涉及哪些文件,参考:

https://blog.csdn.net/szxhcljyjsjdff/article/details/136067081

源码树层次

subsys/bluetooth/host

这里是host stack。处理HCI命令和事件地方,L2CAP,ATT,SMP等核心协议也在这里

subsys/bluetooth/controller

蓝牙控制器实现。实现HCI的控制器端,链路层以及对无线电收发器的访问

include/bluetooth/

公共API头文件。这些是应用程序需要包含的头文件,以便使用蓝牙功能

drivers/bluetooth

HCI传输层驱动。每个HCI传输层都需要自己的驱动程序。(三线uart或者5线uart,usb,spi等)

samples/bluetooth

蓝牙实例代码。

test/bluetooth

测试应用程序。这些应用程序用于验证蓝牙堆栈的功能。

doc/guides/bluetooth

额外的文档,比如PICS文档

基本就这几个相关的目录。

zephyr主要支持BLE,对BR/EDR仅提供有限的支持,所以,我们主要使用zblue来实现BLE功能。

zblue简介

接下来,就介绍下zblue的基本情况。

参考:https://blog.csdn.net/wenbo13579/article/details/128042591

一般蓝牙协议栈分为Host和Controller两个部分,根据是否包含BR/EDR还是LE,分为如下形式。

Controller层,主要是封装了硬件的原始操作,虽然Controller要实现的操作和硬件行为强相关,不可避免代码差异大。但是Spec有明确规定HCI接口,大家都有一个标准可以遵循,API相对统一,从A切换B其实只要有HCI接口就能方便的使用。Host和Controller之间通过HCI连接。

Host层,Spec只是规定了行为并没有规定接口,那就是天马行空,各家方案的API差异很大,学习成本较高,并且迁移成本也高,而且文档基本上都是靠代码、例程来学习,有些API还不是很友好。

HCI,主机控制器接口,就是Host和Controller之间的interface,因此叫HCI.

现行的开源Host协议栈还是比较多的,下面做一个简单的介绍:

从上述可以看出,除了btstack在设计之处就是为了方便Porting存在的,其他方案都是捆绑了自己的OS。

这块其实做的比较好的还是btstack,不过其商业是收费的,文档这块其实也不太多,同时其是极简实现的方案,所以使用体验上并不是很舒服,数据缓存之类都需要在应用层做。本文就不做过多叙述了。

zblue蓝牙协议栈为Zephyr的结构,总体结构如下图所示。

如上图所示,系统主要分为5个部分,代码结构如下所示:

chipset:各家厂商在使用之前需要进行一些配置,有些是因为芯片是rom化版本,需要加载patch,有些要配置RF参数,有些要配置蓝牙地址等。

example:各种蓝牙例程,基本是照搬zephyr的来,当然会加入一些新的case。

platform:移植时重点关注的部分,蓝牙协议栈运行需要用到一些平台资源,不同平台有不同实现方式,主要包括log、timer、storage_kv和HCI接口的实现。

porting:程序的主入口,这些会将platform/chipset和协议栈接口进行绑定,并启动example,最后对协议栈进行调度。

src:zephyr的蓝牙协议栈部分,具体实现蓝牙协议栈的具体细节。

更多使用细节可参考test、samples以及doc目录。

相关推荐
小狮子安度因26 分钟前
边缘智能-大模型架构初探
linux·网络
晨春计29 分钟前
【git】
android·linux·git
Flying_Fish_roe42 分钟前
linux-软件包管理-包管理工具(RedHat/CentOS 系)
linux·运维·centos
Splashtop高性能远程控制软件44 分钟前
centos远程桌面连接windows
linux·windows·centos·远程控制·远程桌面
LN花开富贵1 小时前
stm32g431rbt6芯片中VREF+是什么?在电路中怎么设计?
笔记·stm32·单片机·嵌入式硬件·学习
CV金科1 小时前
蓝桥杯—STM32G431RBT6按键的多方式使用(包含软件消抖方法精讲)从原理层面到实际应用(一)
stm32·单片机·嵌入式硬件·蓝桥杯
tang&1 小时前
【Linux】进程概念
linux
luckyluckypolar1 小时前
STM32——输入捕获
stm32·单片机·嵌入式硬件·物联网
hai405871 小时前
单片机(Microcontroller)原理及应用
单片机·嵌入式硬件
苏少朋1 小时前
Docker安装 ▎Docker详细讲解 ▎数据卷挂载 ▎Nginx安装理解
linux·nginx·docker·容器