当前使用的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芯片组的蓝牙适配器。

hci0 command 0xfc20 tx timeout(Realtek 8761B Chipset, Bluetooth 5.0)的更多相关文章

  1. org.openqa.selenium.WebDriverException: f.QueryInterface is not a function Command duration or timeout:

    今天偶遇一个问题,运行项目时,发现这个问题: org.openqa.selenium.WebDriverException: f.QueryInterface is not a functionCom ...

  2. error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\x86_amd64\\cl.exe' failed with exit status 2

    安装mysql是出现这个错误. python3.和python2.两个的版本不一样,所以安装的东西也不一样:MySQLdb 安装mysql的连接包.工具安装 Python3.x版本:Pip insta ...

  3. RealTek WiFi 模块 RTL8710AF RTL8711AF RTL8711AM RTL8195AM

    瑞昱 8710 是一个完整且自成体系的 WiFi 网络解决方案, 能够独立运行,也可以作为从机搭载于其他主机 MCU 运行. 瑞昱 8710 在搭载应用并作为设备中唯⼀的应⽤处理器时,能够直接从外接闪 ...

  4. driver.startActivity 启动app出现 An unknown server-side error occurred while processing the command

    driver.startActivity("com.xxx.module.xxx", "com.xxx.module.xxx.hibox.ui.entry.EntryAc ...

  5. 0406-服务注册与发现-客户端feign-使用、配置、日志、timeout

    官方地址:https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#spring-cloud-f ...

  6. arcmap Command

    The information in this document is useful if you are trying to programmatically find a built-in com ...

  7. 大熊君说说JS与设计模式之------命令模式Command

    一,总体概要 1,笔者浅谈 日常生活中,我们在看电视的时候,通过遥控器选择我们喜欢的频道时,此时我们就是客户端的角色,遥控器的按钮相当于客户请求,而具体执行的对象就是命令对象, 命令模式把一个请求或者 ...

  8. TCPDUMP Command Examples

    tcpdump command is also called as packet analyzer. tcpdump command will work on most flavors of unix ...

  9. How to install IIS 7.5 on Windows 7 using the Command Line

    原文 How to install IIS 7.5 on Windows 7 using the Command Line On Windows Vista, to install IIS 7.0 f ...

  10. mysql source 报错 Unknown command '\'' 解决办法

    系统:Windows2008 R2 source 导入数据总是报错. ERROR:Unknown command '\''.ERROR:Unknown command '\"'.ERROR ...

随机推荐

  1. 写一段python下载商品图片的代码

    以下是一个简单的Python代码示例,用于下载商品图片: import requests import os def download_image(url, save_path): response ...

  2. Power AutoMate: 变量专栏

    背景 本篇对Power AutoMate的变量功能进行记录与讲解 设置变量 拖拽功能块并赋值 测试一些数据类型 测试中发现与程序中的类型,并没有什么差别 截断数字 对浮点数进行一些操作 选择需要操作的 ...

  3. 26种source-map看花了眼?别急,理解这几个全弄懂

    上一篇 webpack处理模块化源码 的文章中提到了 "source map",这一篇来详细说说. 有什么作用 source map 用于映射编译后的代码与源码,这样如果编译后的代 ...

  4. [golang]使用logrus自定义日志模块

    简介 logrus是一个第三方日志库,性能虽不如zap和zerolog,但方便易用灵活.logrus完全兼容标准的log库,还支持文本.JSON两种日志输出格式. 特点 相较于标准库,logrus有更 ...

  5. 《CUDA编程:基础与实践》读书笔记(1):CUDA编程基础

    1. GPU简介 GPU与CPU的主要区别在于: CPU拥有少数几个快速的计算核心,而GPU拥有成百上千个不那么快速的计算核心. CPU中有更多的晶体管用于数据缓存和流程控制,而GPU中有更多的晶体管 ...

  6. 定义一个函数,传入一个字典和一个元组,将字典的值(key不变)和元组的值交换,返回交换后的字典和元组

    知识点:zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表. li=[3,4,5] t=(7,8,9) print(list(zip(li,t ...

  7. 行行AI人才直播第16期:【无界AI首席研究员】刘秋衫《AI创新设计:AIGC赋能设计行业的新思维》

    在这一轮生成式AI浪潮中,设计行业是受波及最为广泛的一个行业.这是设计师们始料未及的事情,至少在此之前,人们认为以设计.艺术为首的创意产业是最难被AI改变的产业之一.而生成式AI的出现,与其说是一次冲 ...

  8. 两种方式,轻松实现ChatGPT联网

    两种方式效果: 方式一:浏览器搜索内嵌插件 方式二:官方聊天页内嵌插件 首先,要有一个谷歌浏览器,然后再安装一个叫ChatGPT for Google,直接在谷歌里搜一下就能找,也可以Chrome应用 ...

  9. C++ ASIO 实现异步套接字管理

    Boost ASIO(Asynchronous I/O)是一个用于异步I/O操作的C++库,该框架提供了一种方便的方式来处理网络通信.多线程编程和异步操作.特别适用于网络应用程序的开发,从基本的网络通 ...

  10. Android 调试桥 (adb) 使用教程/示例

    sidebar: auto Android 调试桥 (adb) Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信.adb 命令可用于执行各种设备操作,例如安装和调试 ...