嵌入式Linux添加对蓝牙的支持
嵌入式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
工具中的指定的路径来确定。
自启相关服务
自启相关服务,主要是dbus
和bluetoothd
守护进程,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中添加蓝牙功能的整个流程,里面一些具体细节不做过多的介绍。