首页 > 其他分享 >hci0 command 0xfc20 tx timeout(Realtek 8761B Chipset, Bluetooth 5.0)

hci0 command 0xfc20 tx timeout(Realtek 8761B Chipset, Bluetooth 5.0)

时间:2023-11-14 19:11:50浏览次数:37  
标签:5.0 btrtl usb tx Realtek Bluetooth 1.2 Device NEW

当前使用的Linux内核版本: 4.4.189

插上USB Bluetooth 5.0 Adapter后,dmesg显示如下log:

[  240.348480] usb 3-1.2: new full-speed USB device number 6 using ehci-platform
[  240.437834] usb 3-1.2: New USB device found, idVendor=0bda, idProduct=8771
[  240.438541] usb 3-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  240.439311] usb 3-1.2: Product: Bluetooth Radio
[  240.439730] usb 3-1.2: Manufacturer: Realtek
[  240.440124] usb 3-1.2: SerialNumber: 00E04C239987
[  240.447374] Bluetooth: hci0: rtl: examining hci_ver=0a hci_rev=000b lmp_ver=0a lmp_subver=8761
[  240.448393] Bluetooth: hci0: rtl: loading rtl_bt/rtl8761a_fw.bin
[  240.451607] Bluetooth: hci0: rom_version status=0 version=1
[  242.616194] Bluetooth: hci0 command 0xfc20 tx timeout
[  250.612377] Bluetooth: hci0: download fw command failed (-110)

由于蓝牙适配器的芯片组较新,为Realtek RTL8761B,4.4版本的内核并不支持这个型号的蓝牙适配器,所以驱动报错。

解决办法:

1. 把较高内核版本的驱动移植到4.4.189上来:

这里我们选择 kernel4.17.19 版本的驱动,可以从这个仓库获取驱动源码: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 

Realtek USB bluetooth适配器的驱动文件为:

  1. drivers/bluetooth/btrtl.h
  2. drivers/bluetooth/btrtl.c 

用上述btrtl.c和btrtl.h替换掉 kernel4.4.189 版本里对应的文件。

注意:这里也可以移植更高内核版本的驱动,比如 kernel5.4 版本的驱动。但是有个缺点,选择的驱动版本的跨度越大需要修改的地方就越多。

2. 修改4.17.19内核版本Realtek bluetooth驱动源码:                     

修改 drivers/bluetooth/btrtl.c  和  drivers/bluetooth/btrtl.h 

这里我做了一个修改后的patch:support_RTL8761B_chipset_from_kernel4.4_to_kernel4.17.patch, patch内容如下:

diff --git a/kernel/drivers/bluetooth/btrtl.c b/kernel/drivers/bluetooth/btrtl.c
index 437f080..bd00d25 100644
--- a/kernel/drivers/bluetooth/btrtl.c
+++ b/kernel/drivers/bluetooth/btrtl.c
@@ -32,7 +32,7 @@
 #define RTL_ROM_LMP_8723A      0x1200
 #define RTL_ROM_LMP_8723B      0x8723
 #define RTL_ROM_LMP_8821A      0x8821
-#define RTL_ROM_LMP_8761A      0x8761
+#define RTL_ROM_LMP_8761B      0x8761
 #define RTL_ROM_LMP_8822B      0x8822
 
 #define IC_MATCH_FL_LMPSUBV    (1 << 0)
@@ -76,11 +76,11 @@ static const struct id_table ic_id_table[] = {
          .fw_name  = "rtl_bt/rtl8821c_fw.bin",
          .cfg_name = "rtl_bt/rtl8821c_config.bin" },
 
-       /* 8761A */
-       { IC_MATCH_FL_LMPSUBV, RTL_ROM_LMP_8761A, 0x0,
+       /* 8761B */
+       { IC_MATCH_FL_LMPSUBV, RTL_ROM_LMP_8761B, 0x0,
          .config_needed = false,
-         .fw_name  = "rtl_bt/rtl8761a_fw.bin",
-         .cfg_name = "rtl_bt/rtl8761a_config.bin" },
+         .fw_name  = "rtl_bt/rtl8761b_fw.bin",
+         .cfg_name = "rtl_bt/rtl8761b_config.bin" },
 
        /* 8822B */
        { IC_INFO(RTL_ROM_LMP_8822B, 0xb),
@@ -140,10 +140,10 @@ static int rtlbt_parse_firmware(struct hci_dev *hdev, u16 lmp_subver,
                { RTL_ROM_LMP_8723A, 0 },
                { RTL_ROM_LMP_8723B, 1 },
                { RTL_ROM_LMP_8821A, 2 },
-               { RTL_ROM_LMP_8761A, 3 },
                { RTL_ROM_LMP_8822B, 8 },
                { RTL_ROM_LMP_8723B, 9 },       /* 8723D */
                { RTL_ROM_LMP_8821A, 10 },      /* 8821C */
+               { RTL_ROM_LMP_8761B, 14 },  /* 8761BU */
        };
 
        ret = rtl_read_rom_version(hdev, &rom_version);
@@ -514,7 +514,7 @@ int btrtl_setup_realtek(struct hci_dev *hdev)
                return btrtl_setup_rtl8723a(hdev);
        case RTL_ROM_LMP_8723B:
        case RTL_ROM_LMP_8821A:
-       case RTL_ROM_LMP_8761A:
+       case RTL_ROM_LMP_8761B:
        case RTL_ROM_LMP_8822B:
                return btrtl_setup_rtl8723b(hdev, hci_rev, lmp_subver);
        default:

内核编译选项:

 

 重新编译内核和更新内核,内核重新启动后,插入RTL8761B chipset蓝牙适配器,dmesg打印log如下:

[   13.340498] usb 4-1.2: new full-speed USB device number 4 using ehci-platform
[   13.428053] usb 4-1.2: New USB device found, idVendor=0bda, idProduct=8771
[   13.428738] usb 4-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[   13.429457] usb 4-1.2: Product: Bluetooth Radio
[   13.429875] usb 4-1.2: Manufacturer: Realtek
[   13.430296] usb 4-1.2: SerialNumber: 00E04C239987
[   13.437530] Bluetooth: hci1: rtl: examining hci_ver=0a hci_rev=000b lmp_ver=0a lmp_subver=8761
[   13.438361] Bluetooth: hci1: rtl: loading rtl_bt/rtl8761b_config.bin
[   13.441437] Bluetooth: hci1: rtl: loading rtl_bt/rtl8761b_fw.bin
[   13.443434] Bluetooth: hci1: rom_version status=0 version=1
[   13.444009] Bluetooth: hci1: cfg_sz 14, total size 11678

上述使用的固件版本rtl8761b_config.bin和rtl8761b_fw.bin可以用此仓库获得: git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git ,或者从ubuntu20.04(kernel版本>= 5.4)的/lib/firmware/rtl_bt/目录下拷贝来直接用。

如果bluetoothd程序已经启动了的话,执行 hciconfig 结果如下:

# hciconfig
hci0:   Type: Primary  Bus: USB
        BD Address: E8:EA:6A:8C:20:ED  ACL MTU: 1021:6  SCO MTU: 255:12
        UP RUNNING
        RX bytes:12651 acl:0 sco:0 events:414 errors:0
        TX bytes:14146 acl:0 sco:0 commands:101 errors:0

执行 bluetoothctl scan on 进行扫描,结果如下:

# bluetoothctl scan on
Discovery started
[CHG] Controller E8:EA:6A:8C:20:ED Discovering: yes
[NEW] Device 52:FB:49:66:89:C0 52-FB-49-66-89-C0
[NEW] Device 4D:A3:E2:E0:D1:8A 4D-A3-E2-E0-D1-8A
[NEW] Device 5C:73:91:E3:7C:23 5C-73-91-E3-7C-23
[NEW] Device 7A:AC:FF:A1:12:49 7A-AC-FF-A1-12-49
[NEW] Device 52:EE:DB:DF:78:F1 52-EE-DB-DF-78-F1
[NEW] Device 67:6A:97:56:84:F2 67-6A-97-56-84-F2
[NEW] Device 42:B8:EB:55:82:D8 42-B8-EB-55-82-D8
[NEW] Device C8:28:32:8F:C9:96 C8-28-32-8F-C9-96
[NEW] Device 50:B3:3E:9A:94:2E 50-B3-3E-9A-94-2E
[NEW] Device 63:E1:C1:03:78:FB 63-E1-C1-03-78-FB
[NEW] Device 63:B5:8F:19:01:3E 63-B5-8F-19-01-3E
[NEW] Device 63:7E:AA:D0:47:1E 63-7E-AA-D0-47-1E
[NEW] Device 46:3C:37:25:5E:EE 46-3C-37-25-5E-EE
[NEW] Device 44:28:A3:BE:B3:A1 MI RC
[NEW] Device 47:C0:B7:D4:A8:9F 47-C0-B7-D4-A8-9F
[NEW] Device 70:28:24:F1:24:7B 70-28-24-F1-24-7B
[NEW] Device 63:F8:74:A3:4A:39 63-F8-74-A3-4A-39
[NEW] Device 5B:6E:56:B5:4F:F1 5B-6E-56-B5-4F-F1
[NEW] Device 47:B7:9C:97:E0:30 47-B7-9C-97-E0-30
[NEW] Device 4D:94:FC:E5:F8:29 4D-94-FC-E5-F8-29
[NEW] Device 68:94:22:61:95:9D 68-94-22-61-95-9D
[NEW] Device 78:35:4A:C5:99:2A 78-35-4A-C5-99-2A

从上面的扫描结果来看,蓝牙适配器已经能正常工作了。

至此,从kernel4.4到kernel.4.17版本的内核,都可以使用上述修改过的驱动来支持RTL8761B芯片组的蓝牙适配器。

 

标签:5.0,btrtl,usb,tx,Realtek,Bluetooth,1.2,Device,NEW
From: https://www.cnblogs.com/wanglouxiaozi/p/17832303.html

相关文章

  • 【WCH蓝牙系列芯片】-基于CH32V208开发板—串口USART_FLAG_TXE & USART_FLAG_TC
    -------------------------------------------------------------------------------------------------------------------------------------USART模块支持多种中断源,这里说明一下USART_FLAG_TXE和USART_FLAG_TC对应的关系。USART_FLAG_TXE--------------发送数据寄存器空表......
  • JavaScript - js生成 txt 文件
    JavaScript-js生成txt文件/***方法定义*/functiondownload(filename,text){varelement=document.createElement('a');element.style.display='none';varcontent=encodeURIComponent(text);element.setAttribute('href&#......
  • Python requirements.txt安装用法介绍
    一、什么是requirements.txt文件在Python项目开发中,通常需要安装多个Python包。当我们在新的项目中启动一个虚拟环境,并且想要在新的虚拟环境中安装之前的依赖包时,就可以使用requirements.txt文件来完成。这个文件包含了所有需要安装的依赖包和其版本号。requirements.txt文件可以在......
  • cmake编译介绍--cmakelist.txt
    1.cmake编译简介 单个文件编译C/C++时:gccmain.c/g++main.cpp 多代码文件时:MakeFile,解决多文件编译难问题,运行make命令编译自动完成 cmake编译引入:根据一定的规则自动生成MakeFile的,也是有语法(cmake还是依赖make编译)。自动管理makefile文件,写起来也更方便、没有makefile......
  • 快速生成项目依赖包requirement.txt
    方式一#这个方法会导出所有的包不管项目用没用上pipinstallrequests#在虚拟环境中安装完所有项目依赖库后使用freeze命令将项目所依赖的所有第三方库导出到一个文件中可使用以下命令将依赖库导出到一个名为requirements.txt的文件中pipfreeze>requirements.txt#......
  • 【5.0】Go语言基础之包的使用
    【一】包的作用为了便于组织代码,同一种类型的代码,写在同一个包下,便于管理【二】定义包的步骤【1】新建一个文件夹【2】内部有很多go文件【3】go文件的第一行声明包名在每个go文件的第一行,都要声明包名,并且包名必须一致packageuser【4】在一个文件夹下只能有一个包(......
  • [20231109]bash shell快捷键alt+number的问题.txt
    [20231109]bashshell快捷键alt+number的问题.txt--//前一阵子,我想实现12行合并1行的输出,理论讲要使用paste命令加入12个-.输入命令时候要数输入了多少-.我知道bashshell有一--//个快捷键alt+number可以产生连续输入某个字符,但是我一直不知道如何关掉这个功能.有时候误触发这......
  • [20231105]降序索引的疑问.txt
    [20231105]降序索引的疑问.txt--//我们生产系统有一套系统我以前维护过,出现一个奇葩现象,建立一堆降序索引,实际上完全没有必要,最后我改了许多索引为普通索引.--//由于可能后续维护或者可能是我遗漏了(当然还有可能索引太大我没有修改),还是有一些索引没改过来.--//我讲过降序索......
  • [20231103]rename IDL_UB1$后使用bbed的恢复3.txt
    [20231103]renameIDL_UB1$后使用bbed的恢复3.txt--//上午解决renameIDL_UB1$后使用bbed的恢复问题,就是涉及到的5个索引4个需要修改,其中一个因为NULL值的缘故,不需要修改。--//主要原因是rename是delete再insertobj$,反过来思考,如果修改时长度等长,我仅仅需要name等于原来的字符......
  • 什么是DNS,A记录,子域名,CNAME别名,MX记录,TXT记录,SRV 记录,TTL值
    DNSDNS,DomainNameSystem或者DomainNameService(域名系统或者域名服务)。域名系统为Internet上的主机分配域名地址和IP地址。由于网络中的计算机都必须有个IP地址,来识别,互相之间才能通信,但让我们记住一大串的IP地址来访问网站显然是不可能的,所以用户使用域名地址,而DNS系统的......