嵌入式Linux添加对蓝牙的支持

背景

之前简单介绍了下Linux中蓝牙的整个框架:
https://notes.z-dd.online/2021/09/06/Linux%E4%B9%8B%E8%93%9D%E7%89%99%E7%9B%B8%E5%85%B3%E4%BB%A3%E7%A0%81%E6%B5%85%E6%9E%90/

今天简单介绍下在嵌入式Linux中添加对蓝牙的支持。

kernel内核部分

内核部分主要分2部分:模组驱动和核内蓝牙协议栈

这里以支持串口蓝牙RTL8723DS为例。

核内蓝牙协议栈

在内核中添加Bluetooth子系统支持,只需打开相关配置即可,比如:

CONFIG_BT=y
CONFIG_BT_BREDR=y
CONFIG_BT_RFCOMM=y
CONFIG_BT_RFCOMM_TTY=y
CONFIG_BT_BNEP=y
CONFIG_BT_BNEP_MC_FILTER=y
CONFIG_BT_BNEP_PROTO_FILTER=y
CONFIG_BT_HIDP=y
CONFIG_BT_LE=y

有关特性配置,根据自己的需求添加,比如BLE,BREDR,RFCOMM等

模组驱动

串口蓝牙驱动一般分两个部分:驱动和hciattach工具

  • 编译驱动模块:比如这里的 hci_uart.ko
  • 编译hciattach工具:比如这里的 rtk_hciattach

hciattach 是一个用于初始化蓝牙芯片并将其连接到主机的工具。它属于 BlueZ 蓝牙协议栈的一部分,主要用于配置串行接口(如 UART)上的蓝牙控制器,并启动 HCI(Host Controller Interface)层通信。通过 hciattach,你可以指定蓝牙设备的类型、波特率以及其他必要的参数,以便让操作系统能够正确识别和操作蓝牙硬件。

##文件系统部分

这部分主要包括协议栈bluez及相关依赖服务,如Dbus
这里使用buildroot来构建,比手动逐个编译简单许多,只需要打开蓝牙相关配置,比如:

BR2_SYSTEM_ENABLE_NLS=y
BR2_PACKAGE_BLUEZ_TOOLS=y
BR2_PACKAGE_BLUEZ5_UTILS=y
BR2_PACKAGE_BLUEZ5_UTILS_CLIENT=y
BR2_PACKAGE_BLUEZ5_UTILS_TOOLS=y
BR2_PACKAGE_BLUEZ5_UTILS_DEPRECATED=y
BR2_PACKAGE_BLUEZ5_UTILS_EXPERIMENTAL=y
BR2_PACKAGE_BLUEZ_ALSA=y

具体也是根据自己的需要打开相关配置即可。

使用及测试

确认电源管理及rfkill

确认下使能休眠引脚(如这里的BT_REG_ON)及复位引脚。
有些时候使用rfkill来控制蓝牙的启用和禁用,这里不做过多的介绍。

确认固件及配置

确认固件及配置目录,并放到对应位置。
这里默认目录为:/lib/firmware/rtlbt,可根据hciattach工具中的指定的路径来确定。

自启相关服务

自启相关服务,主要是dbusbluetoothd守护进程,buildroot编译后一般默认已配置好,确认下就好:

#dbus:
dbus-daemon --system --print-pid --print-address
#核外bluez协议栈守护进程
/usr/libexec/bluetooth/bluetoothd -n -d &

加载驱动模块

加载相关驱动模块,并配置启动串口蓝牙控制器(串口蓝牙特有):

#加载内核协议栈等,如果已经build-in内核则不需要加载
insmod bluetooth.ko

#加载模块驱动模块
insmod hci_uart.ko

#配置串口蓝牙控制器,并启动 HCI 层通信
./rtk_hciattach -n -s 115200 ttyS0 rtk_h5 &

启动及测试

# hciconfig,使能HCI接口
hciconfig hci0 up

#进行简单测试,比如开启ble广播
hciconfig hci0 leadv

后面可以使用hcitool、或bluetoothctl、或btmgmt等工具进行测试。
也可以通过代码去实现相关功能。

总结

这里主要简单理下了在嵌入式Linux中添加蓝牙功能的整个流程,里面一些具体细节不做过多的介绍。

参考