为Deepin Linux启用蓝牙支持

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为Deepin Linux启用蓝牙支持相关的知识,希望对你有一定的参考价值。

参考技术A

自从安装了Deepin Linux,并 采用自己编译的内核 后,笔者的ThinkPad X200笔记本体验可谓是上升了一个非常重要的层次。后来有一天,笔者想用蓝牙耳机听音乐,然而在使用过程中发现,这台笔记本虽然自带蓝牙,屏幕下的蓝牙指示灯一直点亮着,系统中却看不到与蓝牙有关的设置选项。

出现这样的问题,多半就是因为系统中对蓝牙的支持没有启用,主要包括系统组件和内核两个层面。下面把我的经验总结如下。

默认地,Deepin并没有在系统中装上蓝牙组件,须用户手动安装。在终端中运行:

其中, bluetooth 是Linux蓝牙的核心组件,而 blueman 则是基于GTK+的一个全功能蓝牙管理器。把它们一齐装上,即可为Deepin启用全面的蓝牙支持。

笔者本以为安装了蓝牙组件后,蓝牙功能就能正常使用(因为之前在解决WLAN问题时,WLAN驱动未配置的情况下无线网卡灯是不会亮的,然而蓝牙灯始终会常亮),但是当打开蓝牙管理器时,竟然报错,提示蓝牙服务未启动。这不得不让我想到,内核中的蓝牙支持是否没有启用。

果不其然。在内核源码目录下运行 make menuconfig ,打开内核配置界面,依次对内核进行以下配置。

内核中的蓝牙选项位于【Network Settings】 --> 【Bluetooth subsystem support】。先选中【Bluetooth subsystem support】,然后按”Y“,勾选它。

【Bluetooth subsystem support】中有子菜单,按回车进入,如下所示:

其中有几个选项,控制特定类型蓝牙设备协议的支持,一般全部启用。它们包括:

最为重要的一步,就是将蓝牙适配器驱动编译入内核当中。 进入最下方子菜单【Bluetooth device drivers】,如下所示:

菜单中根据接口和特定型号设备,列出了相应的支持选项,有些选项在勾选后还会展开新的选项。典型的接口有USB、SDIO、UART,按需要勾选。

笔者X200笔记本的蓝牙适配器是Broadcom BCM2045B,走的是USB通道,因此先勾选【HCI USB driver】,随后会在该项下面出现三个新的选项,再进一步勾选【Broadcom protocol support】。不过,在得知适配器信息之前,笔者拿捏蓝牙适配器可能也走了UART通道,所以也将【HCI UART driver】勾上,再进一步勾选下面的【Intel AG6XX protocol support】。但实际使用时发现,X200的蓝牙适配器的确走的是USB而非UART。若不能确定自己的蓝牙适配器类型,可以一并选上,也不占用太多空间。

上述配置完成后,按左右方向键选择”Save“,保存内核配置,然后选”Exit“退出。使用下面的命令重新编译内核并安装:

重启后,蓝牙功能即被激活。

在内核中启用蓝牙支持,并在系统中安装蓝牙组件后,Deepin发生了翻天覆地的变化。Deepin下蓝牙的体验非常出色。

Blueman管理器默认开机启动,会在托盘区域出现一个蓝牙图标,在其中可以很方便地管理蓝牙设备。

在Blueman管理器中可以搜索到各种蓝牙设备,包括各种手机、电脑,以及笔者的蓝牙耳机。与蓝牙耳机配对后,Deepin即刻将声音通过蓝牙进行播放,无需再进行进一步的配置,尤其方便。此外,Blueman还有其他有趣的玩法,比如文件传输、浏览设备文件,其中对设备文件的浏览功能与当年的MTK功能机类似。

以X200为代表的ThinkPad早期机型有一项设计非常出彩,就是它屏幕下的灯条,系统运行状态一目了然。其中正包括了蓝牙指示灯,当有数据传输时(如正使用蓝牙音频),指示灯会闪烁,如此就能知道蓝牙设备是否正常工作。可谓匠心。

要想让使用Deepin的笔记本支持蓝牙,需要做两项工作——

由此,Deepin下设备的价值就能被进一步挖掘,体验自会更上一层楼。

完全用Deepin Linux娱乐工作学习-- 无线网卡及蓝牙设备驱动篇

1、异常说明

        在前面木子已经讲到了关于显卡驱动及CPU微码补丁更新,今天木子要讲的是关于适配蓝牙及无线网卡设备的驱动问题,它不仅仅适用于新驱动的安装,也适用于驱动异常的修复。默认情况下木子的笔记本安装Deepin Linux后是自带驱动的,只是在折腾的过程中出现异常,所以有了需要修复驱动的过程,下面木子就简单和大家分享一下关于无线网卡和蓝牙设备驱动的那些事情。注:木子的无线网卡和蓝牙设备是在同一个模块上的。
        今天发生了一件很奇怪的事情,木子的笔记本启动后发现蓝牙鼠标不可能了,查看控制中心对应的蓝牙管理按钮没有了,让木子很奇怪。重启笔记本也不行,于是开始排除问题,并修复蓝牙设备驱动,在使用的过程中,木子不仅仅出现过蓝牙设备异常的问题,同样也出现过无线网卡设备异常的问题,但木子都是使用相同的方法修复的,在出现异常的情况下,你会发现在控制中心会不存在蓝牙或无线网卡图标的情况。如下图所示:

技术分享图片

2、排错过程

1)检测蓝牙服务

首先检测蓝牙服务是否正常启动,检测发现服务是正常启动的,重启服务无法生效。
systemctl status bluetooth
● bluetooth.service - Bluetooth service
Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2018-04-13 14:08:38 CST; 30min ago
Docs: man:bluetoothd(8)
Main PID: 829 (bluetoothd)
Status: "Running"
Tasks: 1 (limit: 4915)
CGroup: /system.slice/bluetooth.service
└─829 /usr/lib/bluetooth/bluetoothd

2)检测内核加载模块

查看系统内核加载模块,蓝牙模块是有加载的。
lsmod | grep blue
bluetooth             634880  13 btrtl,hci_uart,btintel,btqca,bnep,btbcm,btusb
ecdh_generic           24576  1 bluetooth
rfkill                 28672  8 bluetooth,dell_laptop,cfg80211
crc16                  16384  2 bluetooth,ext4

3)检测软硬开关

        查看系统是否开启软或硬开关,关闭了蓝牙模块,rfkill是Linux内核提供的一个子接口,用于进行 Wi-Fi、 蓝牙、3G和4G设备的开关控制的,结果发现根本没有蓝牙设备。
sudo rfkill list
0: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
        看这情况是没有加载模块成功了。于是想通过modprobe btusb加载一下模块看是否OK,发现加载以后还是不行,卸载内核蓝牙模块rmmod bluetooth再重载蓝牙模块到内核insmod bluetooth也不行。

4)开机日志检测

于是开始检索日志信息,dmesg是用来检测系统开机时的信息的。
dmesg | egrep -i 'blue|firm'
[   14.374064] Bluetooth: HCI UART protocol Marvell registered
[   14.741564] request_firmware: ath10k/pre-cal-pci-0000:02:00.0.bin
[   14.741954] ath10k_pci 0000:02:00.0: firmware: failed to load ath10k/pre-cal-pci-0000:02:00.0.bin (-2)
[   14.741958] ath10k_pci 0000:02:00.0: Direct firmware load for ath10k/pre-cal-pci-0000:02:00.0.bin failed with error -2
[   14.741961] request_firmware: ath10k/cal-pci-0000:02:00.0.bin
[   14.741970] ath10k_pci 0000:02:00.0: firmware: failed to load ath10k/cal-pci-0000:02:00.0.bin (-2)
[   14.741972] ath10k_pci 0000:02:00.0: Direct firmware load for ath10k/cal-pci-0000:02:00.0.bin failed with error -2
[   14.741974] request_firmware: ath10k/QCA6174/hw3.0/firmware-6.bin
[   14.742930] ath10k_pci 0000:02:00.0: firmware: direct-loading firmware ath10k/QCA6174/hw3.0/firmware-6.bin
[   14.743438] ath10k_pci 0000:02:00.0: firmware ver WLAN.RM.4.4-00022-QCARMSWPZ-2 api 6 features wowlan,ignore-otp crc32 4d458559
[   14.807142] request_firmware: ath10k/QCA6174/hw3.0/board-2.bin
[   14.807740] ath10k_pci 0000:02:00.0: firmware: direct-loading firmware ath10k/QCA6174/hw3.0/board-2.bin
[   55.479518] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[   55.479519] Bluetooth: BNEP filters: protocol multicast
[   55.479521] Bluetooth: BNEP socket layer initialized
        在日志中木子发现了两条错误信息,这两条错误信息很显然在系统启动的时候,驱动加载就有问题了。到找了问题,解决问题就简单了。

5)重装驱动

        重装蓝牙驱动,这里要说明的一点是,很多笔记本都是网卡与蓝牙模块一起的,这时候如果没有办法看到蓝牙模块不知道是什么型号,可以通过查看无线模块型号,然后将整个无线模块的驱动更换(其中就包括了蓝牙模块驱动),这样应该就解决问题了。
#查看无线模块型号
lspci | grep Wireless
02:00.0 Network controller: Qualcomm Atheros QCA6174 802.11ac Wireless Network Adapter (rev 32)
在这里木子可以看到对应的型号是qca6174
#下载对应驱动

下载最新的固件并解压缩内容:
https://codeload.github.com/kvalo/ath10k-firmware/zip/master技术分享图片
#进入无线驱动目录(不同的无线模块会不一样,但是都在/lib/firmwareh目录下)
cd /lib/firmware/ath10k
#删除原有驱动
rm -rf QCA6174
#复制最新驱动进去
cp -rf /home/liwenbin/Downloads/ath10k-firmware-master/QCA6174 ./
#进入对应目录,重命名驱动模块名称。
cd QCA6174/hw3.0
mv firmware-4.bin_WLAN.RM.2.0-00180-QCARMSWPZ-1 firmware-4.bin
然后关机、重新开机,即可识别蓝牙模块了,这时候蓝牙设备就可以正常工作了。
这时候木子们再查看对应模块已经存在了。
0: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
1: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
        通过对比木子发现,之前的蓝牙模块里面少加载了hidp和rfcomm两个协议。而rfcomm协议就是蓝牙设备的通讯协议,hidp就是基本支持协议。
lsmod | grep blue
bluetooth             634880  48 btrtl,hidp,hci_uart,btintel,btqca,bnep,btbcm,rfcomm,btusb
ecdh_generic           24576  1 bluetooth
rfkill                 28672  8 bluetooth,dell_laptop,cfg80211
crc16                  16384  2 bluetooth,ext4

3、节能控制

        刚刚讲到一个关于rfkill的命令,其实通过这个命令可以在必要的时候关闭无线或蓝牙设备,来节约设备用电,以软关闭蓝牙模块为例:
#关闭蓝牙模块
rfkill block 0 #0为设备ID号
#检测是否关闭
rfkill list
0: hci0: Bluetooth
Soft blocked: yes
Hard blocked: no
1: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
#开启蓝牙模块
rfkill unblock 0
#检测是否开启
rfkill list
0: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
1: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no

4、写在最后

        每一台笔记本的无线网卡或蓝牙模块的设备厂商都不一样,但是解决问题的思路和方法是一样的,只是驱动不同而已。木子这里提供三家常用网卡生产厂商的驱动Broadcom、Killer、Realtek的。
Broadcom:https://github.com/winterheart/broadcom-bt-firmware
Killer:https://codeload.github.com/kvalo/ath10k-firmware/zip/master
Realtek:https://github.com/lwfinger/rtlwifi_new
同样Broadcom驱动存放在/lib/firmware目录下brcm中。
对于realtek会有所不同,可以将对应的驱动下载,然后执行以下命令:
make
sudo make install
sudo modprobe rtl8192de

以上是关于为Deepin Linux启用蓝牙支持的主要内容,如果未能解决你的问题,请参考以下文章

需要为 Android 6.0 上的蓝牙低功耗扫描启用位置

linux操作系统(ubuntu)下蓝牙不可用

Linux到Android蓝牙网络共享(PAN)

如何在不使用本机代码的情况下要求用户在 NativeScript 上启用蓝牙

Flutter 应用需要检查蓝牙和位置是不是启用

科尔多瓦蓝牙插件启用,扫描和连接蓝牙