4.3.22. 蓝牙驱动调试指南
X5 EVB 开发板
使用 RTL8852BS 模组,支持 Wi-Fi 和 Bluetooth 功能。 RTL8852BS 模组
的 Wi-Fi 功能 调试 请 参考 Wi-Fi驱动 调试 。指南 蓝牙
模块接口 为UART接口,支持 的 协议 分为 H4/Three-wire(H5)。
4.3.22.1. 概述
本章
主要 讲述 Bluetooth 的 适配 和 使用 方法,以 RealTek(瑞昱)系列 的 UART Bluetooth RTL8852BS 为例。 主要
内容 包含: 原理图 确认、内核 配置、DTS 配置 和 Bluetooth 使用 以及 常见问题。
4.3.22.2. RealTek RTL8852BS 移植
原理图确认
X5 RTL8852BS 的

RTL8852BS Bluetooth 模组
供电:模组
有 两路 供电,其中 VDD_3V3为主电源, VDD_1V8为 IO 上拉电源。 使能:要
能 正常 工作,需要 BT_REG_ON给高电平,目前 硬件 上电 上拉为 高电平,故 设备树 中 不 需要 配置。 时钟:40MHz 的
时钟 输入 模组 可以 内部 生成,不 需要 外部 单独 输入 该 信号。 通信:模组 Bluetooth 的
通信 通过 UART ,其中 UART_TXDUART_RXD为 UART 的 2 条数据线。
1.EVB为了
内核配置
进入build目录./xbuild.sh boot menuconfig 进行
配置命令
执行 ./xbuild.sh boot menuconfig 会Save菜单项
配置选项
1.配置CONFIG_BT=m

2.配置CONFIG_CRYPTO_ECDH=y

3.配置CONFIG_BT_HCIUART=m

4.配置CONFIG_RFKILL=m

5.配置BT_HCIUART_H4=y

DTS 配置
确认 DTS 配置
确认 RTL8852BS Bluetooth 使用
根据
原理图 连接 和 设备树 pinmux-func.dtsi可知,管脚LSIO_SPI4_SCLK对应的 管脚 复用 配置 为 pinctrl_uart5。pinctrl_uart5: uart5grp { horizon,pins = < LSIO_SPI4_SCLK LSIO_PINMUX_2 BIT_OFFSET0 MUX_ALT2 &pconf_drv_pu_ds2_1v8 LSIO_SPI4_SSN LSIO_PINMUX_2 BIT_OFFSET2 MUX_ALT2 &pconf_drv_pu_ds2_1v8 >; };
进一步
查看 x5.dtsi文件中 pinctrl_uart5节点的 配置,确认 其 使用 的 控制器 为 serial@341a0000,标签为 uart5。uart5: serial@341a0000 { compatible = "snps,dw-apb-uart"; status = "disabled"; reg = <0x341a0000 0x10000>; reg-shift = <2>; clocks = <&hpsclks X5_LSIO_UART5_CLK>, <&hpsclks X5_LSIO_UART5_PCLK>; clock-names = "clk","apb_pclk"; interrupt-parent = <&gic>; interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>; resets = <&socrst LSIO_UART5_RESET>; broken-auto-flow-control; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_uart5>; dw-uart,dma-cyclic; };
想
让 控制器 serial@341a0000正常工作,只 需 将 板级 DTS 配置 中 引用 &uart5 标签,配置status = “okay”;即可。 &uart5 { status = "okay"; };
编译烧录
保存
配置 后,需要 重新 编译 ./mk_boot.sh编译内核 镜像, fastboot.exe flash boot boot.img烧录 boot.img 。然后
使用 adb 将 hci_uart.ko、bluetooth.ko、btrtl.ko和rfkill.ko上传到 文件系统,adb的 使用 请 参考 使用 adb。
驱动加载调试
1. 确认管脚复用配置
进入
系统 后,使用 hb_gpioinfo命令检查 原理图 管脚 LSIO_SPI4_SCLK和LSIO_SPI4_SSN的复用 配置 是否 正确。 确认
结果显示 为 uart5grp功能,配置无误。 以下
是 hb_gpioinfo命令的 部分 输出 示例:
gpiochip4 - 32 lines: @34120000.gpio: @379-410
[Number] [Mode] [Status] [GpioName] [PinName] [PinNum] [PinFunc]
line 0: unnamed input LSIO_UART7_RX 379 lsio_gpio0_0
line 1: unnamed input LSIO_UART7_TX 380 lsio_gpio0_1
......
line 28: unnamed input LSIO_SPI4_SCLK 407 uart5grp
line 29: unnamed input LSIO_SPI4_SSN 408 uart5grp
2. 加载驱动
使用 insmod 分别
加载 RTL8852BS Bluetooth 所 需 的 驱动。 使用
insmod rfkill.ko加载无线 设备 的 管理 模块。 使用
insmod bluetooth.ko加载蓝牙 核心 协议 栈 模块。 使用
insmod btrtl.ko加载 Realtek 蓝牙固件 加载 模块,用于 初始化 Realtek 蓝牙 芯片 的 固件。 使用
insmod hci_uart.ko加载 HCI UART 驱动模块,支持 通过 串口 与 蓝牙 硬件 通信。
初始化程序编译和固件配置
程序编译
对于
1.修改 Makefile 中
的 工具链 CROSS_COMPILE 指定 X5使用 的 工具链。 git diff Makefile diff --git a/Makefile b/Makefile index 207f808..d24dcf6 100755 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ CFLAGS := -Wall -g +CROSS_COMPILE := /opt/arm-gnu-toolchain-11.3.rel1-x86_64-aarch64-none-linux-gnu//bin/aarch64-none-linux-gnu-
2.蓝牙
模块 初始化 过程 需要 加载 固件 文件,对于 UART 接口 的 可 在 rtb_fwc.c 中 定义 固件 文件 所在 的 目录。 默认 路径 如下: #define FIRMWARE_DIRECTORY "/lib/firmware/rtlbt/" #define BT_CONFIG_DIRECTORY "/lib/firmware/rtlbt/"
3.执行 make 编译
后 生成 rtk_hciattach可执行程序。4.将
交叉 编译 生成 的 rtk_hciattach使用 adb 将上 传到 板端 文件系统 /usr/bin/。5.从
厂商 获取 的 蓝牙 固件 和 配置 rtl8852bs_config、rtl8852bs_fw使用 adb 将上 传到 板端 文件系统 /lib/firmware/rtlbt/。
1.对于 Realtek 厂商
4.3.22.3. FCS960K 移植
原理图及编译烧录
参考Wi-Fi 驱动
调试 中FCS960K移植指南 一节,了解 原理图、内核 配置、DT 配置 和 编译 烧录 等 相关 内容
初始化程序
FCS960K 蓝牙
hciattach -s 1500000 /dev/ttyS5 any 1500000 noflow
4.3.22.4. Bluetooth 使用
状态确认
FCS960K 和 RTL8852BS 蓝牙/etc/init.d/bt_init.sh脚本
在
需要
/usr/bin/rtk_hciattach
/usr/bin/hciattach
需要
/lib/firmware/rtlbt/rtl8852bs_config
/lib/firmware/rtlbt/rtl8852bs_fw
需要
/usr/bin/dbus-daemon
/usr/bin/bluetoothctl
/usr/bin/hciattach
/usr/bin/hcitool
/bin/hciconfig
/usr/bin/hcitool
执行cd /lib/modules/$(uname -r)跳转
kernel/drivers/bluetooth/btrtl.ko
kernel/drivers/bluetooth/hci_uart.ko
kernel/net/rfkill/rfkill.ko
kernel/net/bluetooth/bluetooth.ko
初始化
执行
/etc/init.d/bt_init.sh可以完成 蓝牙 的 初始化。
配对连接
以下bluetoothctl 交互
1. 进入蓝牙配置界面
执行
bluetoothctl进入交互 模式,系统 将 显示 蓝牙 控制器 的 MAC 地址 及其 当前 状态(通常 为 可 配对 状态)。 执行
show命令查看 蓝牙 详细信息,重点 关注 powered和discoverable状态。
2. 启用蓝牙功能
执行
power on命令启用 蓝牙 功能。 
3. 设置蓝牙为可发现状态
执行
discoverable on命令,使蓝牙 设备 可 被 附近 设备 发现。 
此时,使用
手机 或 电脑 扫描 蓝牙 设备,即可 发现 名为 BlueZ 5.64 的 蓝牙 设备。 
4. 扫描附近蓝牙设备
执行
scan on命令开启 主动 扫描,系统 将 周期性 显示 附近 蓝牙 设备。 执行
scan off命令关闭 扫描,并 汇总 显示 已 发现 的 设备。 

5. 配对其他蓝牙设备
然后
执行
pair [targetMAC]命令启动 配对,根据 提示 输入 yes,并在 对 端 设备 上 确认 配对。 
配对
成功 后,可 执行 trust [targetMAC]命令,使设备 在 下次 连接 时 自动 配对。 
6. 测试蓝牙设备连接
使用
l2ping命令测试 蓝牙 设备 的 网络连接。 
总结
通过
4.3.22.5. 常见问题
执行 /etc/init.d/bt_init.sh 进行 RTL8852BS 蓝牙初始化时失败
1.驱动未加载导致的蓝牙初始化失败
现象:蓝牙
串行 协议(HCI UART)在 初始化 时 失败。 Realtek Bluetooth ERROR: Can't set line discipline 22, Invalid argument Realtek Bluetooth ERROR: Can't initialize devicce 22, Invalid argument
分析:没有
加载 驱动hci_uart驱动。 解决
方法 :使用modprobe hci_uart加载驱动 后,然后 再 执行 /etc/init.d/bt_init.sh进行蓝牙 初始化。
2.固件使用错误导致的蓝牙初始化失败
现象:蓝牙
设备 在 进行 数据传输 时 出现 了 顺序 错误 或 数据包 丢失。 Realtek Bluetooth :Enable host hw flow control Realtek Bluetooth :h5_hci_reset: Issue hci reset cmd Realtek Bluetooth ERROR: Out-of-order packet arrived, got(7)expected(0) Realtek Bluetooth ERROR: Out-of-order packet arrived, got(7)expected(0)
分析:使用
了 开启 蓝牙 硬件 流控 的 固件,但是 硬件 设计 上 没有 接流控。 解决
方法 :向厂商 获取 不 开启 流控 的 固件 即可,然后 再 执行 /etc/init.d/bt_init.sh进行蓝牙 初始化。
蓝牙默认名字及修改方法
ubuntu 文件系统
中 使用 的 默认 名字 是 ubuntu,buildroot 文件系统中 使用 的 默认 的 名字 是 BlueZ X.YZ,X.YZ 对 BLUEZ的版本号。 修改
蓝牙 默认 名字 时 修改 配置文件 /etc/bluetooth/main.conf中的 [General] 对应 的Name字 段 即可。 [General] Name = hobot