树梅派Buildroot 蓝牙配置——与ESP32通过SPP通讯
硬件背景
树莓派 4B 使用 CYW43455 芯片,这是一颗 WiFi + 蓝牙二合一芯片:
- WiFi 通过 SDIO 连接,驱动为
brcmfmac - 蓝牙 通过 UART 连接,驱动为
hci_uart+ Broadcom 协议
RPi 4B 有两个 UART:PL011(ttyAMA0)和 mini-UART(ttyS0)。默认情况下 PL011 用于蓝牙,但我们通常使用 miniuart-bt overlay 将蓝牙切换到 mini-UART,把更稳定的 PL011 留给串口控制台。
请在执行完毕 基础配置 之后再进行本博客配置
第一步:menuconfig 配置
进入buildroot源码根目录
make menuconfig
需要启用以下包:
固件
Target packages → Hardware handling → Firmware
[*] brcmfmac-sdio-firmware-rpi (WiFi + 蓝牙固件)
[*] Install Bluetooth firmware ← 关键!
[*] linux-firmware
[*] Broadcom bcm43xxx
bluez5-utils(蓝牙协议栈)
Target packages → Networking applications → bluez5-utils
[*] Enable bluez5-utils
[*] Install CLI client (提供 bluetoothctl)
[*] Install tools (提供 btattach, hcitool 等)
[*] Install deprecated tools (提供 rfcomm — 必须!)
⚠️ 踩坑注意:
rfcomm命令在 deprecated tools 里。启用后如果configure仍然是--disable-deprecated,需要执行make bluez5_utils-dirclean && make强制重新 configure。
第二步:config.txt(无需手动编辑)
raspberrypi4_64_defconfig 默认的 config_4_64bit.txt 已经包含:
dtoverlay=miniuart-bt
arm_64bit=1
miniuart-bt overlay 的作用是将蓝牙切换到 mini-UART(ttyS0),释放 PL011(ttyAMA0)给串口控制台。
第三步:内核模块
蓝牙需要 hci_uart 内核模块。Buildroot 默认的内核配置中它是 =m(模块),不会自动加载(mdev 不像 udev 那样能自动加载模块)。
方案一:init 脚本加载(推荐)
在 /etc/init.d/S99wifi 中添加 modprobe hci_uart,或通过 rootfs overlay:
#!/bin/sh
case "$1" in
start)
printf "Starting WiFi: "
modprobe hci_uart
modprobe brcmfmac
for i in $(seq 1 20); do
[ -d /sys/class/net/wlan0 ] && break
sleep 0.5
done
wpa_supplicant -B -iwlan0 -c/etc/wpa_supplicant.conf
sleep 3
udhcpc -iwlan0
[ $? = 0 ] && echo "OK" || echo "FAIL"
;;
stop)
printf "Stopping WiFi: "
killall wpa_supplicant
echo "OK"
;;
restart|reload)
"$0" stop
"$0" start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?
方案二:手动加载
modprobe hci_uart
验证:
hciconfig -a
# 应该看到 hci0 设备
方案三:编译进内核
在 kernel config 中将 CONFIG_BT_HCIUART=y(而非 =m),一劳永逸。
第四步:蓝牙服务
bluez5-utils 安装后会自动添加 /etc/init.d/S40bluetoothd,开机自启 bluetoothd。无需手动操作。
第五步:配对设备
bluetoothctl
# 在 bluetoothctl 交互式终端中:
[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# scan on
[bluetooth]# pair XX:XX:XX:XX:XX:XX
[bluetooth]# trust XX:XX:XX:XX:XX:XX # 可选,用于自动重连
[bluetooth]# connect XX:XX:XX:XX:XX:XX
[bluetooth]# exit
第六步:SPP / RFCOMM 连接
如果你的蓝牙设备使用串口协议(SPP),需要创建 RFCOMM 设备:
# 绑定 ESP32 的 MAC 地址到 /dev/rfcomm0
rfcomm bind 0 XX:XX:XX:XX:XX:XX (换成自己的蓝牙Mac号)
# 验证
ls -la /dev/rfcomm0
然后就可以像读写串口一样使用 /dev/rfcomm0:
./esp32-spp-reader /dev/rfcomm0
释放 RFCOMM 设备:
rfcomm release 0
总结
| 步骤 | 内容 |
|---|---|
| buildroot 配置 | bluez5-utils + deprecated tools + BT firmware |
| config.txt | dtoverlay=miniuart-bt |
| 内核模块 | modprobe hci_uart |
| 服务 | bluetoothd |
| 配对 | bluetoothctl → power on → pair → trust |
| SPP | rfcomm bind 0 <MAC> → /dev/rfcomm0 |

浙公网安备 33010602011771号