RK3308 解决无蓝牙设备的问题
一、问题描述
我们项目在开发智能音箱的过程中分别采购了 ROC-RK3308-CC 和 Amlogic 420 开发板,这两块开发板默认情况下执行 hciconfig 均无法枚举出开发板中的蓝牙设备信息。
- 问题现象截图
- ROC-RK3308-CC 使用正基生产的 AP6236 芯片,该芯片集成了蓝牙和WIFI功能
- Amlogic 420 使用正基生产的 AP6356S 芯片,该芯片集成了蓝牙和WIFI功能
二、解决流程
确认蓝牙设备是否被禁用
查看无线设备模型文件
# ls /sys/class/rfkill rfkill0 rfkill1 rfkill2
查看无线设备电源状态
# rfkill list 0: bt-dev: Bluetooth Soft blocked: no Hard blocked: no 1: phy0: Wireless LAN Soft blocked: no Hard blocked: no 2: brcmfmac-wifi: Wireless LAN Soft blocked: no Hard blocked: no
确保蓝牙设备已打开
判断蓝牙设备是否已阻断
# 已处于软阻断 Soft blocked: blocked # 已处于硬阻断 Hard blocked: blocked
启禁用软阻断
# 启用软阻断 rfkill block 0 # 取消软阻断 rfkill unblock 0
查询串口名称及波特率
查看设备有哪些串口设备
# ls -l /dev/ttyS* crw-rw---- 1 root root 244, 0 Jan 1 00:00 /dev/ttyS0 crw-rw---- 1 root root 244, 1 Jan 1 00:00 /dev/ttyS1
查看串口波特率
# stty -F /dev/ttyS0 speed 2000000 baud; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -brkint -icrnl -imaxbel -opost -isig -icanon -iexten -echo
查找蓝牙固件
不确定蓝牙固件位于何处
# 搜索后比较同名文件是否一致缩小试探范围 find / -name *.hcd /etc/bluetooth/BCM4354.hcd /etc/bluetooth/BCM4359C0SR2.hcd /rom/etc/bluetooth/BCM4354.hcd /rom/etc/bluetooth/BCM4359C0SR2.hcd
已确认开发板蓝牙固件路径
# Rockchip RK3308 开发板的 AP6236 蓝牙WIFI芯片 /system/etc/firmware/BCM4343B0.hcd # Amlogic 420 开发板的 AP6356S 蓝牙WIFI芯片 /etc/bluetooth/BCM4354.hcd
加载蓝牙固件
确保开发板中存在蓝牙固件引导程序
# 如果不存在需下载 brcm_patchram_plus.c 源码编译 find -name brcm_patchram_plus
- 确认蓝牙使用的串口号(ttyS4,如果busybox中无法看到类似信息则直接按枚举法尝试)
加载蓝牙固件并设置波特率
# ROC-RK3308-CC(默认存在 brcm_patchram_plus1 文件) brcm_patchram_plus1 --bd_addr_rand --enable_hci --no2bytes --use_baudrate_for_download --tosleep 200000 --baudrate 1500000 --patchram /system/etc/firmware/BCM4343B0.hcd /dev/ttyS4 & # Amlogic(默认不存在 brcm_patchram_plus,需手动编译) brcm_patchram_plus --enable_hci --no2bytes --tosleep 200000 --baudrate 2000000 --patchram /etc/bluetooth/BCM4354.hcd /dev/ttyS1 &
验证蓝牙状态
hciconfig 命令可发现蓝牙设备
/ # hciconfig hci0: Type: Primary Bus: UART BD Address: B0:F1:EC:3D:FD:31 ACL MTU: 1021:8 SCO MTU: 64:1 DOWN RX bytes:668 acl:0 sco:0 events:34 errors:0 TX bytes:423 acl:0 sco:0 commands:34 errors:0
三、工具介绍
1. rfkill
rfkill 是 Linux 内核中的一个子系统,提供一个接口用于查询、锁定并取消锁定计算机系统中的无线电设备。无线电设备包括Wi-Fi、蓝牙和3G设备,这些设备消耗电源,在不使用时可通过取消激活的方式降低功耗。
锁定状态分类
- 软锁定(Soft blocked):可被软件重新激活的状态
- 硬锁定(Hard blocked):软件无法重新激活的状态
常用命令
# 查看所有无线设备状态 rfkill list # 软锁定或取消锁定设备 rfkill block 0 rfkill unblock 0 # 软锁定一类设备 rfkill block wifi # 软锁定所有设备 rfkill block all
2. stty
stty 命令主要功能是改变和打印终端设置,此处用词命令查看串口波特率。
常用命令
# 查看 ttyS0 串口信息 stty -F /dev/ttyS0 -a
3. hciconfig
hciconfig 命令可查看蓝牙适配器信息,并及进行简单的设置。
常用命令
# 查看可用的蓝牙设备 hciconfig # 软件层打开/关闭设备 hciconfig hci0 up hciconfig 0 down
4. brcm_patchram_plus
brcm_patchram_plus 用于加载蓝牙固件并实现与特定串口的绑定。
常用命令
# ROC-RK3308-CC AP6236 brcm_patchram_plus1 --bd_addr_rand --enable_hci --no2bytes --use_baudrate_for_download --tosleep 200000 --baudrate 1500000 --patchram /system/etc/firmware/BCM4343B0.hcd /dev/ttyS4 & # Amlogic 420 AP6356S brcm_patchram_plus --enable_hci --no2bytes --tosleep 200000 --baudrate 2000000 --patchram /etc/bluetooth/BCM4354.hcd /dev/ttyS1 &
四、解决 ROC-RK3308-CC
依赖环境
BusyBox
1、Target packages->rkwifibt 选中,且 wifi chip support 选中 'AP6236' 2、System tools->rfkill 选中
解决步骤
蓝牙芯片上电
# 查看蓝牙芯片状态,此时为软阻断(关闭)状态 / # rfkill list 0: bt_default: Bluetooth Soft blocked: yes Hard blocked: no 1: phy0: Wireless LAN Soft blocked: no Hard blocked: no 2: brcmfmac-wifi: Wireless LAN Soft blocked: no Hard blocked: no # 取消软阻断 / # rfkill unblock 0 # 再次查看当前状态 / # rfkill list 0: bt_default: Bluetooth Soft blocked: no Hard blocked: no 1: phy0: Wireless LAN Soft blocked: no Hard blocked: no 2: brcmfmac-wifi: Wireless LAN Soft blocked: no Hard blocked: no
加载蓝牙固件
brcm_patchram_plus1 --bd_addr_rand --enable_hci --no2bytes --use_baudrate_for_download --tosleep 200000 --baudrate 1500000 --patchram /system/etc/firmware/BCM4343B0.hcd /dev/ttyS4 &
验证蓝牙已可用
# 此时可发现蓝牙设备 / # hciconfig hci0: Type: Primary Bus: UART BD Address: BC:71:BE:60:26:44 ACL MTU: 1021:7 SCO MTU: 64:1 DOWN RX bytes:694 acl:0 sco:0 events:36 errors:0 TX bytes:431 acl:0 sco:0 commands:36 errors:0 # 启动蓝牙设备 / # hciconfig 0 up # 蓝牙设备软件层已可正常工作 / # hciconfig hci0: Type: Primary Bus: UART BD Address: BC:71:BE:60:26:44 ACL MTU: 1021:7 SCO MTU: 64:1 UP RUNNING RX bytes:1388 acl:0 sco:0 events:72 errors:0 TX bytes:862 acl:0 sco:0 commands:72 errors:0
五、解决 Amlogic 420
依赖环境
BusyBox
1、System tools->rfkill 选中
brcm_patchram_plus
1、gcc 交叉编译 brcm_patchram_plus.c 源码并将生成的 brcm_patchram_plus 上传至 /usr/bin 目录。 2、通过 chmod +x /usr/bin/brcm_patchram_plus 命令添加可执行权限
解决步骤
结束 bsa_server 进程
# 查看是否存在 bsa_server 进程 / # ps | grep bsa_server 2327 root /usr/bin/bsa_server -r 13 -lpm -all=0 -pp /etc/bluetooth -d /dev/ ttyS1 # 该进程存在时下面的操作会无效 / # kill 2327
加载蓝牙固件
# 保险起见执行下列语句,实测有时查看 ttyS0 端口波特率为 115200,执行后可保证为 2000000 echo 1 > /sys/class/rfkill/rfkill0/state # 加载固件(brcm_patchram_plus 名称取决于你上传文件时的文件名) brcm_patchram_plus --enable_hci --no2bytes --tosleep 200000 --baudrate 2000000 --patchram /etc/bluetooth/BCM4354.hcd /dev/ttyS1 &
验证蓝牙已可用
# 此时可发现蓝牙设备 / # hciconfig hci0: Type: Primary Bus: UART BD Address: BC:71:BE:60:26:44 ACL MTU: 1021:7 SCO MTU: 64:1 DOWN RX bytes:694 acl:0 sco:0 events:36 errors:0 TX bytes:431 acl:0 sco:0 commands:36 errors:0 # 启动蓝牙设备 / # hciconfig 0 up # 蓝牙设备软件层已可正常工作 / # hciconfig hci0: Type: Primary Bus: UART BD Address: BC:71:BE:60:26:44 ACL MTU: 1021:7 SCO MTU: 64:1 UP RUNNING RX bytes:1388 acl:0 sco:0 events:72 errors:0 TX bytes:862 acl:0 sco:0 commands:72 errors:0
参考链接
相关推荐
SeetyST 2020-08-13
chinaycheng 2020-05-06
greenpepper 2020-04-29
seek 2020-01-05
seek 2019-12-29
海豚的成长日记 2019-11-07
毕健 2011-10-14
JetHuang 2019-09-20
greenpepper 2020-05-01
浅梦墨汐 2018-09-17
乐观生活持续创新 2018-04-21
SeetyST 2017-02-06
毕健 2016-10-23
makeprogress 2016-06-29
乐观生活持续创新 2016-01-21
海豚的成长日记 2019-07-29