RK3308 解决无蓝牙设备的问题

一、问题描述

我们项目在开发智能音箱的过程中分别采购了 ROC-RK3308-CC 和 Amlogic 420 开发板,这两块开发板默认情况下执行 hciconfig 均无法枚举出开发板中的蓝牙设备信息。
  • 问题现象截图
    RK3308 解决无蓝牙设备的问题
  • ROC-RK3308-CC 使用正基生产的 AP6236 芯片,该芯片集成了蓝牙和WIFI功能
  • Amlogic 420 使用正基生产的 AP6356S 芯片,该芯片集成了蓝牙和WIFI功能

二、解决流程

  1. 确认蓝牙设备是否被禁用

    • 查看无线设备模型文件

      # 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
  2. 确保蓝牙设备已打开

    • 判断蓝牙设备是否已阻断

      # 已处于软阻断
      Soft blocked: blocked
      
      # 已处于硬阻断
      Hard blocked: blocked
    • 启禁用软阻断

      # 启用软阻断
      rfkill block 0
      
      # 取消软阻断
      rfkill unblock 0
  3. 查询串口名称及波特率

    • 查看设备有哪些串口设备

      # 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
  4. 查找蓝牙固件

    • 不确定蓝牙固件位于何处

      # 搜索后比较同名文件是否一致缩小试探范围
      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
  5. 加载蓝牙固件

    • 确保开发板中存在蓝牙固件引导程序

      # 如果不存在需下载 brcm_patchram_plus.c 源码编译
      find -name brcm_patchram_plus
    • 确认蓝牙使用的串口号(ttyS4,如果busybox中无法看到类似信息则直接按枚举法尝试)
      RK3308 解决无蓝牙设备的问题
    • 加载蓝牙固件并设置波特率

      # 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 &
  6. 验证蓝牙状态

    • 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 选中
  • 解决步骤

    1. 蓝牙芯片上电

      # 查看蓝牙芯片状态,此时为软阻断(关闭)状态
      / # 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
    2. 加载蓝牙固件

      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 &
    3. 验证蓝牙已可用

      # 此时可发现蓝牙设备
      / # 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 命令添加可执行权限
  • 解决步骤

    1. 结束 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
    2. 加载蓝牙固件

      # 保险起见执行下列语句,实测有时查看 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 &
    3. 验证蓝牙已可用

      # 此时可发现蓝牙设备
      / # 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

参考链接

相关推荐