真的太清晰了,全网最权威的Linux蓝牙Bluez的介绍

 零. 前言

由于Bluez的介绍文档有限,以及对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求,加上网络上其实没有一个完整的介绍Bluez系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度,学习曲线也相对较陡,所以我有了这个想法,专门对Bluez做一个系统性的介绍,尽可能的涵盖所有内容。

-------------------------------------------------------------------------------------------------------------------------

蓝牙视频教程(跟韦东山老师合作), 其中专题22就是专门针对Bluez做的系统介绍

https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.20.5aeb41f98e267j&id=693788592796

--------------------------------------------------------------------------------------------------------------------------

一. Linux蓝牙整体结构介绍

我们首先来看下架构图,一共分为三块内容:

  • User space(绿色部分)
  • Kernel space(蓝牙部分)
  • Controller(黄色部分)

二. User Space部分

其中user space部分包括几块:

  • APP:上层应用程序
  • Pluseaudio/pipewire:Bluez的plugin
  • Bluetoothd: 蓝牙守护进程
  • Bluez tool跟Bluez lib

1. app程序

app程序这个不用说,就是应用程序,你可以使用BR/EDR/LE的api,那么这个API是什么呢?这个就是bluetoothd守护进程提供的API,APP跟bluetoothd主要通过DBUS来通信,至于DBUS的技术,可以参照我其他文章。

2. Pluseaudio/pipewire/ofono等插件

最典型的组件是pluseaudio/pipewire/ofono等,这几个基本是同样的作用,都是上层的profile协议的实现(HFP/A2DP).

这块是有历史的,以前的协议实现,比如A2DP,是用bluealsa,在Bluez 5.0版本以前是默认包含在Bluez中的,但是随着Bluez的发展,慢慢把这些插件分离出来,bluetoothd只是提供profile的注册函数,由插件来实现协议以及audio playback/capture的部分。

a. ofono插件介绍

oFono是一个开源的电话通信框架,主要用于Linux系统。它由诺基亚(Nokia)开发,旨在为移动设备提供统一的电话功能接口。oFono的设计目标是使得各种设备(如智能手机、平板电脑等)能够在不同的硬件和软件环境下,方便地实现电话和短信等功能。

oFono的核心功能包括:

  • 电话呼叫:管理电话呼叫的发起、接听和挂断等操作。
  • 短信功能:发送和接收SMS消息。
  • 网络管理:处理网络连接的建立和断开。
  • SIM卡管理:管理SIM卡的状态和信息。
  • 电话本:访问和管理电话联系人信息。

oFono的优势在于其模块化的设计,使得它可以与不同的硬件和软件环境兼容。此外,它支持多种通信协议和标准,如GSM、3G、4G等,使得它可以在不同的网络环境下稳定运行。

oFono通常与其他开源项目(如GObject和D-Bus)一起使用,以便在Linux系统上实现完整的通信功能。它也常与图形用户界面(GUI)工具和应用程序结合使用,为最终用户提供直观的操作界面。

对于蓝牙Bluez来说主要是实现了HFP协议

b. pluseaudio插件介绍

PulseAudio 是一个先进的开源音频服务器,广泛用于 Linux 操作系统,也支持其他类 Unix 操作系统和 Windows。它被设计用来管理系统中不同应用程序之间的音频流,并提供各种音频处理功能。

PulseAudio 的主要功能和特点:

  • 音频流管理
    • PulseAudio 允许多个音频流同时在系统中播放和录制,用户可以独立控制每个音频流的音量、平衡和其他音效。
    • 它支持将音频流从一个设备路由到另一个设备。例如,可以将音频从内置扬声器切换到外接耳机或蓝牙音箱。
  • 设备支持
    • PulseAudio 支持多种音频设备,包括内置声卡、USB 音频设备、蓝牙耳机和网络音频设备(例如通过 Wi-Fi 连接的音箱)。
    • 通过 PulseAudio 的插件机制,可以扩展对新设备类型的支持。
  • 音频处理
    • PulseAudio 提供了各种音效处理功能,包括均衡器、回声消除、音量调节、混音等。
    • 它可以自动调整音量以避免音频失真,并支持高级音频调节功能,如延迟补偿和声道映射。
  • 网络音频
    • PulseAudio 允许音频流通过网络传输,使得多个设备可以共享音频资源。例如,可以将计算机的音频流传输到另一台计算机或网络音箱上。
    • 它支持 RTP(实时传输协议)用于流媒体传输,允许在不同设备之间同步播放音频。
  • 模块化架构
    • PulseAudio 具有高度模块化的架构,允许用户根据需求加载和卸载功能模块。这使得 PulseAudio 能够适应广泛的使用场景,从简单的家庭音频配置到复杂的多媒体工作站。
    • 常见模块包括音量控制、声道混合、蓝牙支持、网络音频支持等。
  • 蓝牙支持
    • PulseAudio 支持与蓝牙设备(如耳机、音箱)的连接,并能够处理 A2DP(高级音频分配配置文件)和 HFP(免提配置文件)音频流。
    • 在蓝牙音频处理中,PulseAudio 与 BlueZ 紧密集成,以实现稳定的蓝牙音频传输。
  • 兼容性
    • PulseAudio 与许多音频框架兼容,如 ALSA(Advanced Linux Sound Architecture)和 OSS(Open Sound System),这使得它能够在大多数 Linux 发行版中无缝集成。
    • 它提供了一套标准化的 API,使得开发者能够轻松构建跨平台的音频应用程序。

使用场景:

  • 桌面环境:PulseAudio 广泛用于 Linux 桌面环境,提供音频流管理、设备切换和音效处理等功能,用户可以轻松调整音频设置。
  • 多媒体中心:在家庭影院或多媒体中心,PulseAudio 可以用来管理多个音频输出设备,并支持同步播放和网络音频传输。
  • 专业音频制作:虽然 PulseAudio 主要面向桌面用户,但它也被用作专业音频制作环境中的桥梁,管理音频输入和输出设备。

总的来说,PulseAudio 是一个功能强大且灵活的音频服务器,为用户提供了丰富的音频管理和处理功能。尽管它可能在某些配置上需要较多的设置,但其强大的功能和广泛的设备支持使其成为许多 Linux 用户的首选音频解决方案。

但是pluseaudio实现的HFP并不完善

c. pipewire插件介绍

PipeWire 是一个新兴的多媒体服务器,旨在统一和改进 Linux 系统上的音频和视频处理。它最初由 Red Hat 开发,目的是替代现有的音频系统(如 PulseAudio)和视频处理系统(如 JACK、GStreamer),并在一个框架下统一管理音频和视频流。

PipeWire 的主要功能和特点:

  • 统一的音频和视频处理
    • PipeWire 不仅处理音频流,还处理视频流,这使得它成为一个更通用的多媒体处理框架。它可以用于音频播放、录制、视频捕获和处理。
    • 通过统一的处理方式,PipeWire 能够在多个应用程序和设备之间共享音频和视频资源。
  • 低延迟
    • PipeWire 被设计成具有极低的延迟,使其非常适合实时音频处理和专业音频工作流。这使得它成为 JACK(用于专业音频制作的低延迟音频服务器)的一个潜在替代品,同时保留了 PulseAudio 的易用性。
  • 兼容性和替代性
    • PipeWire 兼容 PulseAudio 和 JACK,用户可以使用 PipeWire 作为这两个系统的替代品,而不需要对现有应用进行大规模修改。它可以直接与现有的应用程序一起工作,因为它提供了兼容层。
    • 这意味着使用 PipeWire 可以无缝替代 PulseAudio 和 JACK,而不必牺牲功能性或性能。
  • 安全性和权限管理
    • PipeWire 提供了先进的权限管理系统,可以细粒度地控制应用程序对音频和视频设备的访问。这对于需要高安全性或特定权限管理的系统非常有用。
    • 例如,在沙盒化的应用环境中,PipeWire 可以确保应用只能访问它们被允许使用的音频和视频设备。
  • 模块化和可扩展性
    • PipeWire 具有高度模块化的设计,允许开发者通过加载和配置不同的模块来扩展其功能。它支持各种插件,可以轻松集成不同的音频和视频处理模块。
    • 这使得 PipeWire 非常灵活,能够适应不同的使用场景,从简单的桌面音频播放到复杂的多媒体制作环境。
  • 蓝牙支持
    • PipeWire 提供了对蓝牙音频的支持,并且在音频质量和延迟方面提供了改进。它能够处理 A2DP、HFP 和 HSP 等蓝牙音频协议,使蓝牙耳机和音箱能够以高质量和低延迟的方式工作。
    • 相比于 PulseAudio,PipeWire 在蓝牙音频传输的稳定性和音质方面有所提升。
  • 应用场景
    • 桌面音频:在桌面环境中,PipeWire 可以用作 PulseAudio 的替代品,提供更好的音频质量和更低的延迟。
    • 专业音频制作:在需要低延迟和高可靠性的音频制作环境中,PipeWire 可以替代 JACK,并提供与其相同的功能和性能。
    • 视频处理:PipeWire 还能够管理和处理视频流,适用于需要同时处理音频和视频的多媒体应用程序。

结论:

PipeWire 是一个强大的多媒体处理框架,结合了低延迟、高性能和多功能性,统一了音频和视频的处理。它的设计使其能够无缝替代现有的音频和视频处理系统,如 PulseAudio 和 JACK,同时提供更好的兼容性、扩展性和安全性。因此,它正迅速成为 Linux 上的主流多媒体解决方案。

d. 插件总结

ⅰ. 采用情况

PipeWire 已经被越来越多的 Linux 发行版采用,特别是在桌面环境中,许多发行版已经默认使用 PipeWire 取代 PulseAudio 和 JACK。例如,Fedora / Arch Linux / ubuntu 2204后都已经在其默认安装中切换到使用 PipeWire。其他的慢慢淡化出来!

ⅱ. 协议支持情况

ofono实现了hfp, pluseaudio实现了a2dp以及简化版的hfp,pipewire不仅仅实现了a2dp跟hfp,还实现了le audio

ⅲ. 编解码情况

不管从hfp的nbs/wbs,还是a2dp的各种codec来说,pipewire表现的更优秀,支持的更多,并且pipewire还支持了Le audio的LC3 codec,虽然大部分的codec都不是pipewire本身的实现,但是从组件来说,他有调用各个codec的 lib的接口,所以从编解码的情况来看pipewire来说,无疑是表现更优秀的!

综上:有条件一定上pipewire

3. Bluetoothd: 蓝牙守护进程

bluetoothd是整个蓝牙的守护进程,app调用的api都是通过dbus跟bluetoothd通信,bluetoothd本身是bluez user lib的一部分,编译的时候会同步编译出来bluetoothd. 另外bluetoothd有两种启动方式:

在蓝牙初始化成功后,蓝牙会起来service服务,这个服务核心目的就是启动bluetoothd守护进程

bluetoothd有两种启动方式:

  • 手动运行
  • 加到systemd中自动启动

a. 手动运行

/usr/libexec/bluetooth/bluetoothd -n -d &

bluetoothd的使用方式如下:


       This manual page documents briefly the bluetoothd daemon, which manages all the Bluetooth devices. bluetoothd can also provide a number of services via the D-Bus
       message bus system.

OPTIONS
       -v, --version
              Print bluetoothd version and exit.

       -h, --help
              Print bluetoothd options and exit.

       -n, --nodetach
              Enable logging in foreground. Directs log output to the controlling terminal in addition to syslog.

       -f, --configfile
              Specifies an explicit config file path instead of relying on the default path(/etc/bluetooth/main.conf) for the config file.

       -d, --debug=<file1>:<file2>:...
              Sets how much information bluetoothd sends to the log destination (usually syslog's "daemon" facility). If the file options are  omitted,  then  debugging
              information  from  all the source files are printed. If file options are present, then only debug prints from that source file are printed. The option can
              be a pattern containing "*" and "?" characters.

              Example: --debug=src/adapter.c:src/agent.c

       -p, --plugin=<plugin1>,<plugin2>,..
              Load these plugins only. The option can be a pattern containing  "*" and "?" characters.

       -P, --noplugin=<plugin1>,<plugin2>,..
              Never load these plugins. The option can be a pattern containing "*" and "?"  characters.

       -C, --compat
              Provide deprecated command line interfaces.

       -E, --experimental
              Enable experimental interfaces. Those interfaces are not guaranteed to be compatible or present in future releases.

       -K, --kernel=<uuid1>,<uuid2>,...
              Enable Kernel experimental features. Kernel experimental features are considered unstable and may be removed from future kernel releases.

FILES
       /etc/bluetooth/main.conf
              Location of the global configuration file.

RESOURCES
       http://www.bluez.org

REPORTING BUGS
       linux-bluetooth@vger.kernel.org

AUTHOR
       Marcel Holtmann, Philipp Matthias Hahn, Fredrik Noring

COPYRIGHT
       Free use of this software is granted under ther terms of the GNU Lesser General Public Licenses (LGPL).

BlueZ  

b. 系统自动启动

ubuntu可以通过make/make install bluez就会自动生成服务,也可以自己手动创建

/lib/systemd/system/bluetooth.service

[Unit]
Description=Bluetooth service 
Documentation=man:bluetoothd(8) 
ConditionPathIsDirectory=/sys/class/bluetooth 

[Service]
Type=dbus 
BusName=org.bluez
ExecStart=/usr/libexec/bluetooth/bluetoothd 
NotifyAccess=main 
#WatchdogSec=10
#Restart=on-failure
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
LimitNPROC=1

# Filesystem lockdown
ProtectHome=true
ProtectSystem=strict
PrivateTmp=true
ProtectKernelTunables=true
ProtectControlGroups=true
StateDirectory=bluetooth
StateDirectoryMode=0700
ConfigurationDirectory=bluetooth
ConfigurationDirectoryMode=0555

# Execute Mappings
MemoryDenyWriteExecute=true

# Privilege escalation
NoNewPrivileges=true

# Real-time
RestrictRealtime=true

[Install]
WantedBy=bluetooth.target
Alias=dbus-org.bluez.service

可以看到这里面有三个部分,分别为[Unit][Service][Install]

  • [Unit]: 这个部分包含有关服务单元的信息,比如描述、文档链接和条件等。它是 systemd 单元的通用部分,用于描述系统中的各种单元,包括服务单元。
  • [Service]: 这个部分包含有关服务的配置信息,如服务类型、启动命令、资源限制等。大多数与服务的运行相关的配置都在这个部分。
  • [Install]: 这个部分定义了服务单元如何与系统中的其他单元进行关联。通常包括 WantedBy 和 Alias 等字段,用于指定服务单元应该在哪个 target 下启用,以及为服务提供别名。

这些部分以方括号包裹,表示它们是 systemd 服务文件的不同段落。每个部分包含一系列的设置和指令,用于配置和描述服务的各个方面。这样的结构化配置使得 systemd 非常灵活,能够支持复杂的服务配置和管理。

  • Unit 部分:
    • Description: 服务的描述信息,简要说明服务的作用。
    • Documentation: 提供关于服务的文档,通常是 man 页面的引用。
    • ConditionPathIsDirectory: 指定服务启动的条件,仅当 /sys/class/bluetooth 目录存在时才启动。
  • Service 部分:
    • Type: 指定服务的类型,这里是 dbus,表示 Bluetooth 服务是通过 D-Bus 进行通信的。
    • BusName: 用于指定服务的 D-Bus 名称。
    • ExecStart: 启动服务的命令,这里是 /usr/libexec/bluetooth/bluetoothd。
    • NotifyAccess: 指定哪些主体可以使用 sd_notify() 来通知服务状态变化,这里设置为 main,表示只有主进程可以通知。
    • CapabilityBoundingSet: 限制服务进程的能力集。
    • LimitNPROC: 限制服务进程的最大进程数。
    • ProtectHome, ProtectSystem: 启用对文件系统的保护,限制对用户家目录和系统文件的访问。
    • PrivateTmp: 使服务有一个私有的 /tmp 和 /var/tmp 目录,这样服务中创建的临时文件不会影响其他进程。
    • ProtectKernelTunables, ProtectControlGroups: 进一步加强对内核参数和控制组的保护。
    • StateDirectory, StateDirectoryMode, ConfigurationDirectory, ConfigurationDirectoryMode: 指定服务的状态和配置目录的路径和权限。
    • MemoryDenyWriteExecute: 防止服务将内存区域标记为可写和可执行。
    • NoNewPrivileges: 防止服务通过调用 setuid 或 setgid 改变其特权。
    • RestrictRealtime: 限制服务对实时调度的访问。
  • Install 部分:
    • WantedBy: 指定在哪个 target 下启用服务,这里是 bluetooth.target。
    • Alias: 为 D-Bus 服务设置别名。

这个服务文件的设置是为了提高 Bluetooth 服务的安全性和稳定性。在 systemd 系统中,systemd 将使用此服务文件来启动和管理 bluetoothd 进程。

你可能会好奇,bluetoothd启动时机是什么呢?至少我在看的时候有这个疑惑

你如果去观察他的自动开机的启动时机,可以用cyw/bcm手动敲hciattach之前跟之后查看,发现bluetoothd其实是在hciattach之后启动的,通过上面也可以看到/sys/class/bluetooth 目录存在时才启动,

但是内核在什么事件创建这个class呢?这个就牵扯到linux驱动框架class_create 函数的作用了,可以看下内核代码:

af_bluetooth.c中的代码

subsys_initcall(bt_init);
module_exit(bt_exit);
static int __init bt_init(void)
{
	....
	err = bt_sysfs_init();
	...
}
int __init bt_sysfs_init(void)
{
	bt_class = class_create(THIS_MODULE, "bluetooth");

	return PTR_ERR_OR_ZERO(bt_class);
}

在这里创建了bluetooth class,也就是在fs中创建了/sys/class/bluetooth,这时候bluetoothd就开始启动了

另外,如果你选择系统启动,有以下命令可以操作:

启用服务,使其在系统启动时自动启动。

sudo systemctl enable bluetooth.service

启动蓝牙服务

sudo systemctl start bluetooth.service

检查服务状态:

sudo systemctl status bluetooth.service

4. Bluez tool跟Bluez lib

a. Bluez tool

bluez整个有很多工具,用于验证或者使用各个功能,具体有下工具,我们先有个大体的介绍,后面介绍各个工具的时候,我们再详细分析。

ⅰ. hciattach

语法:

hciattach [OPTIONS] <tty> <type|id> [speed] [flow] [sleep] [bdaddr]

hciattach [选项] <设备> <类型> [速率] [流控制]

这里是参数的说明:

  • 设备:这是串行设备或蓝牙HCI设备的路径。例如,对于基于UART(串行)接口的蓝牙控制器,它可能是/dev/ttyS0,而对于内置的HCI设备,它可能是/dev/hci0。
  • 类型:这指定您要附加的蓝牙HCI设备的类型。该值取决于您使用的硬件或通信接口类型。常见类型有uart用于UART(串行)接口,bcm43xx用于Broadcom芯片组的控制器,ath3k用于Atheros AR3011芯片组的控制器等。可用的类型可能因系统配置和驱动程序而异。
  • 速率:(可选)这指定HCI设备进行通信的速率(波特率)。如果未提供,它可能默认为特定类型HCI设备通常使用的速率。
  • 流控制:(可选)这指定要使用的硬件流控制,可能是none、rtscts或xoob。

可以用命令行来查询下怎么使用

man hciattach

ⅱ. btattach

语法

btattach [options] <device> <type> [speed] [flow]

这里是参数的说明:

  • device:这是串行设备或蓝牙HCI设备的路径。例如,对于基于UART(串行)接口的蓝牙控制器,它可能是/dev/ttyS0,而对于内置的HCI设备,它可能是/dev/hci0。
  • type:这指定您要附加的蓝牙HCI设备的类型。该值取决于您使用的硬件或通信接口类型。常见类型有uart用于UART(串行)接口,bcm用于Broadcom芯片组的控制器,ath3k用于Atheros AR3011芯片组的控制器等。可用的类型可能因系统配置和驱动程序而异。
  • speed:(可选)这指定HCI设备进行通信的速率(波特率)。如果未提供,它可能默认为特定类型HCI设备通常使用的速率。
  • flow:(可选)这指定要使用的硬件流控制,可能是none、rtscts或xoob。

要使用btattach,您需要超级用户(root)权限,因此您可能需要使用sudo来运行它。

例如,以下命令将附加一个基于UART接口的蓝牙控制器:

sudo btattach /dev/ttyS0 -P bcm

可以用命令行来查询下怎么使用

man hciattach

ⅲ. hciconfig

hciconfig 是一个命令行工具,用于配置和管理蓝牙设备的设置。它通常用于 Linux 系统上,特别是使用 BlueZ 蓝牙协议栈的系统。需要注意的是,截至我的最后更新日期(2021年9月),BlueZ 可能已经更新或改变,因此一些细节可能有所不同。建议查阅您当前系统的文档或运行 man hciconfig 命令来查看最新的用法和选项。

以下是 hciconfig 的一般用法:

hciconfig [hciX] [command]

  • hciX: 这是蓝牙 HCI 设备的标识符,其中 X 是一个数字,例如 hci0、hci1 等。如果不指定 hciX,hciconfig 默认将操作的是第一个蓝牙 HCI 设备,即 hci0。
  • command: 这是要执行的命令选项,用于配置或管理蓝牙设备。

一些常见的 hciconfig 命令可以用man hciconfig查看

ⅳ. bluetoothctl

bluetoothctl 是 Linux 上用于与蓝牙设备交互的命令行工具,它是 BlueZ 蓝牙协议栈的一部分。通过 bluetoothctl,您可以扫描蓝牙设备、连接到设备、管理配对关系以及配置蓝牙适配器等。

下面是 bluetoothctl 的一般用法:

获取对端设备信息

bluetoothctl info

获取本地controller的信息

bluetoothctl show

ⅴ. btmon

btmon 是一个 Linux 命令行工具,用于监视蓝牙数据流量。它是 BlueZ 蓝牙协议栈的一部分,可用于调试和分析蓝牙设备之间的通信,就是类似于btsnoop工具,抓取host跟controller之前的通信数据。

可以用命令行来查询下怎么使用

man btmon

其中一个比较好用的功能是btmon -E ip地址,可以把hci数据injection到ellisys中

ⅵ. btmgmt

btmgmt 是 Linux 上的一个命令行工具,用于管理蓝牙控制器和蓝牙适配器的设置。它是 BlueZ 蓝牙协议栈的一部分。btmgmt有以下用法

ⅶ. l2ping

l2ping 是一个 Linux 命令行工具,用于测试蓝牙设备之间的 L2CAP 连接。L2CAP(Logical Link Control and Adaptation Protocol)是蓝牙协议栈中用于提供数据传输的层

语法

l2ping [OPTIONS] bd_addr

ⅷ. hcitool

可以发送自定义hci command

hcitool cmd <OGF> <OCF> <Command_Params>

比如我要发:67,FC,03,01,60,00

sudo hcitool cmd 3f 67 01 60 00

ⅸ. 其他工具

bluez还有很多特定的工具,比如gatttool/sdptool/obexctl

b. bluez lib

bluez lib就是整个蓝牙profile的核心代码,主要上面承接bluetoothd,下面跟kernel space的协议进行socket通信。

bluez5.66源码分析

├── android 适配android的代码

├── attrib 包含gatttool源码以及gatt attribute相关的代码,gatttool程序入口为gatttool.c

├── btio 通过标准socket接口与kernel通信

├── client bluetoothctl源码,程序入口main.c

├── doc Bluez api doc

├── ell

├── emulator

├── gdbus bluez自带gdbus库源码

├── gobex bluez自带的gobex库源码

├── lib libbluetooth.so源码,提供bluez API,用来支持第三方应用

├── mesh mesh相关的代码

├── monitor

├── obexd obexd服务的源码,程序入口src/main.c

├── peripheral ble gatt相关的代码

├── plugins bluez插件源码

├── profiles bluez蓝牙上层协议

├── src bluetoothd源码,程序入口main.c

├── test bluez测试脚本

├── tools bluez工具集

└── unit PTS相关的代码

5. bluez编译

由于每个开发板或者电脑的编译链或者工具不同,所以肯定报错肯定有所差异,编译bluez的难点在于依赖的编译,所以我就针对我的电脑来说明下。

git clone git://git.kernel.org/pub/scm/bluetooth/bluez.git
git clone git://git.kernel.org/pub/scm/libs/ell/ell.git
cd bluez

git checkout 5.66

./bootstrap-configure --disable-android --disable-midi --disable-tools --disable-mesh --disable-btpclient --disable-hid2hci

make

make install

三. Kernel Space部分

内核部分一共分为两个部分,分别为 driver/bluetooth以及net/bluetooth,这里面会引用linux的一些头文件include/net/bluetooth

1. driver/bluetooth

这部分的内核代码,你可以参照任意一个kernel版本,包含但是不局限于我们公版使用的内核代码,我就贴下一个开源的查看linux代码的链接吧:

bluetooth - drivers/bluetooth - Linux source code (v6.10.5) - Bootlin

这部分就是整个蓝牙的驱动,包含两个部分:

  • 各个厂商的驱动,比如博通的,高通的,瑞昱的,intel,marvell, nxp的等等
  • 蓝牙协议栈的transport层,包括uart的h4/h5/bcsp, sdio, usb等

我们来截图下文件,后面我们介绍特定的功能再来介绍下蓝牙的驱动

2. net/bluetooth

这部分的内核代码,你可以参照任意一个kernel版本,包含但是不局限于我们公版使用的内核代码,我就贴下一个开源的查看linux代码的链接吧:

bluetooth - net/bluetooth - Linux source code (v6.10.5) - Bootlin

部分就是整个蓝牙的protocol,包含bnep/cmtp/hid/rfcomm/l2cap/hci等

我们来截图下文件,后面我们介绍特定的功能再来介绍下蓝牙的内核

四. Controller部分

这个部分我们来介绍下跟controller相关的几个硬件interface.BT power/Transport/PCM/Wakeup

1. BT power

这个主要是芯片的一个普通的GPIO引脚,对于芯片是input的GPIO,作用主要是使能芯片的蓝牙功能,有的芯片的引脚叫做bt enable,有的芯片这个引脚叫做bt reset,有的叫做reg on,都是一样的作用,我们来看下硬件接线。

然后硬件做好后,主控端需要有驱动+应用来控制这个GPIO。

驱动可以是RFKILL也可以是GPIO,当然不同的驱动对于应用控制这个GPIO的方法也是不同的,我们后面具体介绍.

2. Transport的硬件接口

这个主要是Transport依赖的硬件接口部分,有UART/USB/SDIO等,我们来以UART来举例,硬件接线图如下:

硬件接好后,就需要特定的驱动,来用于协议栈跟芯片之间透过驱动来通信

3. PCM硬件接口

PCM硬件接口一般用于HFP的voice语音传输的,硬件接口如下:

注意PCM是硬件的接口,也有人叫做I2S硬件接口,都可以的哈!

但是注意的是:在硬件接口的基础上,传输的格式可以为PCM/I2S软件的format,PCM还分为short frame跟long frame。至于SF PCM/LF PCM/I2S的波形你们可以查看下具体的协议。然后软件音频还有很多参数需要调,比如说谁做master等

注意:这些软件格式以及参数必须主控跟芯片端的配置完全相同,这样才不会有杂音或者无声音。

4. wakeup

wakeup严格来说应该分为两个方向:

  • bt wakeup host
  • host wakeup bt

其中bt wakeup host对于芯片来说是output的GPIO,作用看名字已经非常明显了·,就是主控在休眠的时候,蓝牙可以唤醒主控,比较常见的应用就是比如我们说的遥控器唤醒机顶盒,游戏手柄唤醒游戏机等。

其中host wakeup bt,也可以叫做bt sleep,为什么这么说呢,这个说起来各个家的芯片又不同了,有的芯片在没有数据交互后, 芯片过一段时间自动进入休眠,但是有的芯片做的还没有这么智能,所以只能拉出来host wakeup bt的引脚来让主控来控制芯片的休眠还是醒过来,所以对于芯片来说这个引脚就是input的gpio, 比如拉低是让芯片休眠,拉高把芯片从休眠中"打醒"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wireless_Link

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值