为WiFi Mesh设备增加蓝牙通信功能

1. 概述

我司WiFi Mesh板卡为客户提供了OpenWRT开发环境,在之前的软件版本中,均不支持蓝牙功能。近日有客户提出了蓝牙功能的需求,我司研发人员编写了这份文档,供用户参考。本文档基于OpenWRT 17.01即LEDE版本,对应的内核版本为4.4.194,其余版本的OpenWRT版本与之类似,使用的WiFi Mesh板卡型号为ERS-HP,使用的蓝牙模块采用了Realtek RTL8761BU芯片,通信接口为USB。

2. 操作过程

1)  搭建开发环境,可参照我司《固件编译指导》,本文档不再赘述。

2)  获取OpenWRT代码,假定工作目录为/home/lics/data/code,输入以下命令:

git clone https://github.com/openwrt/openwrt.git ‘openwrt_1701’
cd openwrt_1701
git checkout lede-17.01
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig

Target Profile选择Atheros DB120 reference board,保存后开始编译

make V=s -j9

3)  编译完成后,进入build_dir/target-mips_24kc_musl-1.1.16/linux-ar71xx_generic/linux-4.4.194/drivers/bluetooth目录,将Realtek官方提供的源代码(.c和.h文件)复制到当前目录,输入以下命令(20230526_LINUX_BT_DRIVER是Realtek官方代码存放的目录):

cp /home/lics/data/code/20230526_LINUX_BT_DRIVER/usb/bluetooth_usb_driver/*.c .
cp /home/lics/data/code/20230526_LINUX_BT_DRIVER/usb/bluetooth_usb_driver/*.h .

3)  修改Kconfig文件,将以下内容添加至Kconfig文件的倒数第2行

config BT_HCIBTUSB_RTLBTUSB
        tristate "Realtek HCI USB driver support"
        depends on USB
        help
          Realtek Bluetooth HCI USB driver.
          This driver is required if you want to use Realtek Bluetooth
          device with USB interface.
          Say Y here to compile support for Bluetooth USB devices into
          the kernel or say M to compile it as module (rtk_btusb).

如下图

修改Makefile文件,将以下内容添加至Makefile的最后一行

obj-$(CONFIG_BT_HCIBTUSB_RTLBTUSB) := rtk_btusb.o
rtk_btusb-objs := rtk_bt.o rtk_misc.o rtk_coex.o

如下图

将rtl8761bu_config及rtl8761bu_fw复制到target/linux/ar71xx/base-files/lib/firmware/中

cd target/linux/ar71xx/base-files/lib/firmware
cp /home/lics/data/code/20230526_LINUX_BT_DRIVER/rtkbt-firmware/lib/firmware/rtl8761bu_* .

4)  回到代码的根目录,即openwrt_1701,调整内核配置

make kernel_menuconfig

勾选Device Drivers  --->USB support  ---><*>   Support for Host-side USB,如下图

请务必执行此操作,否则无法勾选Realtek官方驱动。

[*] Networking support  ---> <*>   Bluetooth subsystem support,按如下方式勾选

Bluetooth device drivers,按如下方式勾选

Device Drivers  ---> Generic Driver Options,勾选

<*> Userspace firmware loading support及[*]   Include in-kernel firmware blobs in kernel binary,如下图

5)  调整OpenWRT系统配置,

make menuconfig

Utilities  ---> <*> bluez-daemon. Bluetooth daemon,按如下方式勾选依赖包会自动勾选,如下图

再次编译。

3. 实际验证

将编译得到的固件下载至我司WiFi Mesh板卡中,并妥善连接蓝牙模块,系统启动过程中可以,观察到如下信息

[    5.196410] rtk_btusb: btusb_open hdev->promisc ==0
[    5.201434] rtk_btusb: chip type value: 0x74
[    5.223029] rtk_btusb: config filename rtl8761bu_config
[    5.229004] rtk_btusb: no bdaddr file /opt/bdaddr
[    5.233813] rtk_btusb: Origin cfg len 14
[    5.237874] rtk_btusb: New cfg len 14
[    5.243358] rtk_btusb: This is not 8723a, use new patch style!
[    5.619030] rtk_btusb: chip type value: 0x74
[    5.623380] rtk_btusb: btusb_open set HCI UP RUNNING

系统启动完成后,依次输入以下命令

hciconfig hci0 up
hciconfig
hcitool lescan

即可看到蓝牙模块可以扫描到周围的蓝牙设备,如下图。