新闻详情

新闻详情

首页 / 资讯中心 / 详情

Ubuntu 20.04修复MT7922蓝牙失踪:HWE内核与固件升级全攻略

发布时间:2026/9/14 14:30:23来源:尧图网络
Ubuntu 20.04修复MT7922蓝牙失踪:HWE内核与固件升级全攻略
1. 一觉醒来蓝牙丢了MT7922在20.04上的经典故障现场如果你的笔记本装的是联发科MT7922无线网卡又恰好把系统装成了Ubuntu 20.04那你大概率会在某次开机后遭遇这样的场景右上角状态栏的蓝牙图标是灰的点开只有一个“蓝牙已关闭”的开关怎么拨都拨不亮或者更干脆一点系统设置里根本找不到蓝牙这个选项好像这台机器压根没装过蓝牙硬件。别急着骂系统也别急着敲售后电话。这个问题我在同事的笔记本上帮人排查过好几回最终根因几乎都指向同一处Ubuntu 20.04自带的默认内核版本太老撑不起MT7922这颗新网卡的蓝牙功能。MT7922是一颗Wi-Fi 6E与蓝牙5.2二合一的无线模块大量出现在2021年下半年之后的联想、华硕、惠普中高端笔记本上。它的Wi-Fi部分在Linux下还算争气驱动代码已经并入了内核主线但蓝牙部分依赖的固件文件、内核模块接口和BlueZ协议栈版本对20.04这种“老系统”非常不友好。如果你用的发行版是Ubuntu 22.04或更新版本大概率开箱即用但如果你因为某些项目依赖、公司统一镜像、课程环境要求必须在20.04上工作那这篇文章就是给你准备的。我手头这台机器是联想小新Pro 16 2022款网卡型号是MT7922设备ID为0x7933系统是从20.04.6的官方ISO全新安装的。下面所有排查步骤和修复命令都是我在这台机器上实际执行过的你可以直接照抄。顺便说一句这个问题的排查思路同样适用于MT7921、MT7961以及部分使用Realtek芯片组蓝牙硬件走USB通道的机型核心方法是一样的先确认设备有没有被系统识别再判断是缺驱动、缺固件还是服务挂了。2. 逐层扒皮从桌面图标到内核日志四步定位驱动链路遇到“蓝牙打不开”第一反应别急着卸载重装bluez或者找第三方工具。Linux下的蓝牙是一个典型的“硬件→内核驱动→固件→用户态服务→图形界面”五层链路任何一层出问题表现都是“开关打不开”或者“扫描不到设备”。我的习惯是从用户态往底层逐层排查而不是上来就翻内核日志这样能最快区分是配置问题还是硬件问题。2.1 第一层蓝牙服务与射频开关状态先把服务状态和射频开关情况摸清楚。在终端里依次执行systemctl status bluetooth正常情况下输出里应该有active (running)如果显示inactive或failed先启动它sudo systemctl enable --now bluetooth然后再看射频开关。Linux下蓝牙和Wi-Fi的射频开关统一由rfkill管理某些笔记本的硬开关或者软件开关会在系统启动时把蓝牙锁住rfkill list重点关注蓝牙对应的条目是yes还是no。如果是yes执行rfkill unblock bluetooth很多网上教程到这里就结束了说“解锁完就能用”。但MT7922的问题恰恰不在这两层——服务正常、射频开关也解开了蓝牙依然无法开启。这时候就需要往下看硬件层面了。2.2 第二层蓝牙设备有没有被USB/PCI总线识别MT7922的Wi-Fi部分走PCIe通道蓝牙部分走USB通道网卡内部把蓝牙控制器以USB设备的形式暴露给系统。所以查看蓝牙是否被系统识别要用lsusblsusb在输出里找类似这样的一行Bus 003 Device 002: ID 0489:e0d9 Foxconn / Hon Hai Wireless_Device这个0489:e0d9就是MT7922蓝牙模块的设备ID。如果你执行lsusb之后压根看不到任何蓝牙/无线相关设备或者设备前面的状态不是正常输出而是报错那基本可以确认是内核没有正确枚举到这块硬件。我在这台小新Pro 16上执行lsusb时第一次输出的结果是设备存在但dmesg里疯狂报错。这就是典型的“硬件在但驱动没起来”的状态。还有一种情况是设备ID显示为0489:e0d8那是MT7921的蓝牙设备ID排查思路完全一致。2.3 第三层内核日志中的固件加载失败如果前面两层都正常但蓝牙还是打不开那就要看内核日志了。这一步是整个排查链路的重点也是最容易出答案的地方sudo dmesg | grep -i bluetooth或者更宽泛一点sudo dmesg | grep -i mt792在我这台机器上输出里出现了非常经典的三行报错Bluetooth: hci0: Failed to load firmware file /lib/firmware/mediatek/BTMT7922A.bin Bluetooth: hci0: send pit bt hw cfg failed Bluetooth: hci0: Failed to open Intel firmware file第一行是关键——内核的btusb驱动确实加载了也识别到了蓝牙控制器但在加载固件文件时失败了。MT7922的蓝牙固件路径是/lib/firmware/mediatek/BTMT7922A.bin这个文件应该由linux-firmware软件包提供。Ubuntu 20.04自带的linux-firmware版本太旧压根就没有为MT7922准备这个文件。第二行“send pit bt hw cfg failed”是MT7922特有的报错它意味着蓝牙芯片在初始化时无法完成硬件配置握手本质原因同样是后端的固件没有加载成功芯片处于一种半死不活的状态。第三行虽然是Intel固件报错但经常和前面的错误一起出现因为btusb驱动是通用的它会尝试加载通用的固件初始化流程遇到不支持的芯片就报错。2.4 第四层内核模块是否被正确加载再看一眼内核模块的状态确认驱动代码确实在运行lsmod | grep btusb如果这个模块存在说明内核里已经有蓝牙USB驱动了。但如果你的内核版本是20.04初始的5.4.x那大概率模块是有的但驱动代码里缺少对MT7922的识别逻辑——这就是为什么必须升级内核。到这里排查结论就很清晰了蓝牙打不开的直接原因是固件文件缺失根本原因是内核和固件包都太老导致mt7922的蓝牙半驱动状态。下一步就是动手修。3. 动手修复HWE内核与固件包的正确打开方式问题定位到“内核太老 固件缺失”之后解决方案其实就两件事升级内核到支持MT7922的新版本再补齐对应的固件文件。但这两件事里都藏着不少坑我逐一展开说。3.1 先升级到HWE内核为什么不能用默认内核Ubuntu 20.04发布时自带的默认内核是5.4这个版本对MT7922的支持约等于零。MT7922的蓝牙驱动代码在drivers/bluetooth/btusb.c和drivers/net/wireless/mediatek/mt76中是2021年下半年才逐步合并进Linux内核主线的5.4内核根本不可能认识这颗芯片。LTS版本的好处在于Ubuntu官方提供了一路叫HWEHardware Enablement的内核专门给老系统提供新硬件支持。20.04的HWE内核一路从5.8升到5.15而5.15内核已经完整支持MT7922的蓝牙功能所以对我们来说是够用的。安装HWE内核sudo apt update sudo apt install --install-recommends linux-generic-hwe-20.04--install-recommends这个参数不能省否则可能不会顺便装上HWE对应的linux-firmware等推荐包。安装完成后重启sudo reboot重启后确认内核版本uname -r正常情况下应该能看到5.15.0-xx-generic这样的版本号。如果显示的还是5.4多半是GRUB默认启动项没切过来稍后我会在第5节说怎么处理。3.2 升级linux-firmware固件文件从哪来内核换了但如果固件文件还是旧的蓝牙依然起不来。Ubuntu 20.04的软件源里的linux-firmware版本停留在2020年左右里面没有MT7922的蓝牙固件。我实际操作中发现单纯执行sudo apt install linux-firmware并不能解决问题因为20.04源里这个包本身就是旧的。正确的做法是安装HWE内核时附带的固件包——如果你在上一节用了--install-recommendslinux-firmware大概率已经被升级了。确认一下固件文件是否存在ls -l /lib/firmware/mediatek/在这个目录下找找有没有BTMT7922A.bin或者mt7922*开头的文件。我当时执行完HWE内核安装后发现目录里确实出现了BTMT7922A.bin但文件大小只有几十字节明显是占位文件。这时候需要手动从上游获取正确的固件。稳妥的做法是从kernel.org的linux-firmware仓库拉取cd /tmp git clone --depth 1 https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git sudo cp linux-firmware/mediatek/BTMT7922A.bin /lib/firmware/mediatek/ sudo cp linux-firmware/mediatek/WIFI_MT7922.bin /lib/firmware/mediatek/注意WIFI_MT7922.bin是MT7922的Wi-Fi固件虽然本文讨论的是蓝牙问题但Wi-Fi固件缺失也会导致网卡整体异常既然都拉固件了干脆一并补齐。如果你不想用git clone拉全量仓库毕竟这个仓库挺大的可以只下载需要的文件wget https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/mediatek/BTMT7922A.bin -O /tmp/BTMT7922A.bin sudo cp /tmp/BTMT7922A.bin /lib/firmware/mediatek/下载完看一眼文件大小正常应该在100KB到200KB之间如果只有几十字节十有八九下载到的是placeholder或者LFS指针文件。3.3 重启并验证蓝牙终于亮了固件放到位之后重启系统然后再次执行rfkill list systemctl status bluetooth lsusb sudo dmesg | grep -i bluetooth如果一切正常rfkill list里蓝牙对应的Soft blocked和Hard blocked都应该是nobluetooth服务是active (running)dmesg里不会再出现Failed to load firmware的报错取而代之的是类似这样的成功日志Bluetooth: hci0: Firmware file mediatek/BTMT7922A.bin loaded Bluetooth: BNEP (Ethernet Emulation) filtering registered到这一步托盘区的蓝牙图标应该已经能点亮了系统设置里的蓝牙开关也可以正常拨动了。连接蓝牙耳机、蓝牙鼠标的功能都能用了。4. 修好之后的连环坑自动连接、休眠唤醒与USB假死如果你只用到“蓝牙能打开”这一步那上面的内容就够了。但实际使用中修好固件只是起点。我在后续日常使用里又踩了几个坑每一个都值得单独拎出来说因为它们几乎都是MT7922的已知毛病。4.1 蓝牙鼠标/键盘休眠后连接不上现象笔记本合盖休眠再打开盖子蓝牙鼠标一直在“已配对”状态但就是连不上必须手动断开再重新连接甚至要重启蓝牙服务。根因MT7922的蓝牙控制器在系统休眠时被置入了低功耗模式恢复时USB设备没有及时重新初始化。这个问题在Windows下也存在联想的驱动更新说明里专门提过“改善休眠后的蓝牙连接稳定性”Linux下表现得更加明显。解决思路是让蓝牙USB设备在系统唤醒后强制重置。我用的方案是创建一个systemd服务在唤醒时对蓝牙USB设备执行一次解绑/重绑操作sudo nano /usr/local/bin/reset-bluetooth.sh内容如下#!/bin/bash # Reset MT7922 bluetooth USB device after resume usb_device0489:e0d9 bus$(lsusb | grep $usb_device | awk {print $2}) device$(lsusb | grep $usb_device | awk {print $4} | tr -d :) if [ -n $bus ] [ -n $device ]; then echo Resetting bluetooth device on bus $bus device $device # Unbind and rebind the USB device echo -n usb$bus-$device /sys/bus/usb/drivers/usb/unbind 2/dev/null sleep 1 echo -n usb$bus-$device /sys/bus/usb/drivers/usb/bind 2/dev/null fi注意usb$bus-$device这个路径的拼法有时候会因USB拓扑结构而有差异如果你发现unbind失败可以先用lsusb -t看一下蓝牙设备在USB树里的具体路径再调整脚本里的设备标识。然后创建对应服务sudo chmod x /usr/local/bin/reset-bluetooth.shsudo nano /etc/systemd/system/bluetooth-resume.service[Unit] DescriptionReset Bluetooth USB device after resume Aftersuspend.target Afterhibernate.target [Service] Typeoneshot ExecStart/usr/local/bin/reset-bluetooth.sh [Install] WantedBysuspend.target WantedByhibernate.target启用服务sudo systemctl enable bluetooth-resume.service这个脚本不是100%能解决所有休眠问题但至少在我这台机器上休眠唤醒后的蓝牙连接成功率从“看运气”变成了“基本都能秒连”。4.2 USB自动挂起导致蓝牙随机中断现象用蓝牙耳机听歌时不时出现断流要么声音卡顿要么直接断开过几秒又自动连回来。根因MT7922的蓝牙走的是USB通道Linux的USB子系统有个功能叫autosuspend当USB设备一段时间没有活动时系统会把设备挂起以省电。MT7922的蓝牙固件和Linux的USB自动挂起机制配合得不好挂起之后唤醒不及时就表现为中断和卡顿。解决方法是禁用蓝牙USB设备的自动挂起。先找到设备对应的USB编号lsusb -t找到0489:e0d9那一行记住它在USB总线上的端口路径然后用udev规则禁用autosuspendsudo nano /etc/udev/rules.d/50-bluetooth-mt7922.rules内容ACTIONadd, SUBSYSTEMusb, ATTR{idVendor}0489, ATTR{idProduct}e0d9, ATTR{power/control}on重新加载udev规则sudo udevadm control --reload-rules sudo udevadm trigger这个规则的意思是这个USB设备插上的时候把它的电源控制策略设置为on也就是永远不自动挂起。4.3 为什么设置里偶尔又看不到蓝牙了现象开机正常用了三四个小时突然蓝牙图标消失或者设备列表里看不到任何蓝牙外设。根因这个坑和rtw88/rtw89系列网卡出现的问题是同一类的——网卡内部状态机遇到异常事件比如Wi-Fi切换信道时的射频干扰、USB传输错误堆积就会崩掉。MT7922的蓝牙固件偶尔会因为内部错误进入死锁状态表现出来就是设备直接从USB总线上消失。遇到这种情况直接重启蓝牙模块通常能解决sudo modprobe -r btusb sudo modprobe btusb如果modprobe无法卸载模块提示被占用可以先把蓝牙服务停掉sudo systemctl stop bluetooth sudo modprobe -r btusb sudo modprobe btusb sudo systemctl start bluetooth实测下来这个组合拳能恢复90%以上的“蓝牙消失”问题。4.4 顺便处理一下Wi-Fi和蓝牙的互相干扰用2.4GHz频段Wi-Fi的时候蓝牙耳机经常出现杂音或者卡顿这是2.4G频段共存的老问题。MT7922有内部的共存机制但有时候在Linux下没有被正确启用。这个问题的完整配置比较复杂需要用到iw命令设置Wi-Fi的共存参数。但对于大多数用户我建议优先把路由器/AP的2.4G频宽从40MHz改成20MHz这能显著减少对蓝牙的干扰。如果家里路由器支持5GHz尽量让笔记本连5GHz频段蓝牙走2.4GHz这样基本互不干扰。5. 写给同型号网卡用户排查清单与终极建议整个排查过程走下来我把所有关键步骤整理成了一份清单方便遇到同样问题的朋友对照排查可以按顺序逐项执行避免走弯路。排查项命令/操作正常结果异常处理蓝牙服务状态systemctl status bluetoothactive (running)启用并启动服务射频锁定状态rfkill list蓝牙无blockrfkill unblock bluetooth硬件识别lsusb能看到0489:e0d9检查内核版本内核版本uname -r5.15.x安装HWE内核固件是否存在ls -l /lib/firmware/mediatek/BTMT7922A.bin文件大小正常手动下载固件内核日志dmesg | grep -i bluetooth无Failed to load检查固件路径和权限5.1 升级完HWE内核重启后还是5.4GRUB启动项设置安装HWE内核后重启发现内核版本没变这个问题我一开始也遇到过。原因是GRUB默认启动了旧内核。查看当前GRUB的默认启动项grep -E GRUB_DEFAULT|GRUB_DISABLE_OS_PROBER /etc/default/grub如果GRUB_DEFAULT不是0而是saved那GRUB会沿用上次启动的内核不会自动切到新装的。解决办法sudo sed -i s/GRUB_DEFAULT.*/GRUB_DEFAULT0/ /etc/default/grub sudo update-grub然后重启即可。如果想确认新内核有没有装进GRUB菜单可以执行grep menuentry /boot/grub/grub.cfg | grep 5.15看到5.15开头的菜单项就说明装好了。5.2 有些机器还需要额外装无线网卡驱动组件MT7922在部分OEM机型上会出现“Wi-Fi能用但蓝牙完全无法识别”的情况尤其是联想的一些机器。这是因为联想定制了网卡的硬件配置需要额外的配置包。我在ThinkPad X1 Carbon Gen 10同样使用MT7922上排查时发现安装了linux-modules-extra-5.15.0-xx-generic之后蓝牙才被正确识别。所以如果你的Ubuntu 20.04是最小化安装可能需要手动补上sudo apt install linux-modules-extra-5.15.0-79-generic注意这里的版本号要和你uname -r看到的实际内核版本保持一致。5.3 关于MT7921和MT7922的一点区别MT7921是Wi-Fi 6版本MT7922是Wi-Fi 6E版本。两者的蓝牙部分都走USB固件文件路径都在/lib/firmware/mediatek/下但文件不同。MT7921的蓝牙固件是BTMT7921A.bin。如果你用的是MT7921但下载了7922的固件不会造成系统错误但蓝牙也是起不来的。判断自己到底是哪个型号用lspci看Wi-Fi部分lspci | grep -i network看到Device 7933就是MT7922看到Device 7961就是MT7921。5.4 终极建议能用20.04就换内核不能换就换系统从我个人实际使用体验来看修好之后的MT7922在Ubuntu 20.04上虽然能正常工作但和Windows下的稳定性相比仍然有差距尤其体现在休眠唤醒和USB电源管理上。如果你的20.04不是被工作环境锁死的我的建议是只做开发、不涉及特殊硬件依赖直接用Ubuntu 22.04内核5.19MT7922的蓝牙开箱即用。必须留在20.04务必升级到HWE 5.15内核并保持linux-firmware从官方仓库拉取最新版本。虚拟机里跑Ubuntu 20.04调试蓝牙虚拟机里的蓝牙功能依赖宿主机把蓝牙设备直通给虚拟机不是Ubuntu本身的问题别在虚拟机里折腾驱动。我在实际排查中还发现一个很有用的操作修复完成后可以用bluetoothctl快速验证蓝牙控制器状态bluetoothctl进入交互界面后输入power on scan on如果能看到Discovery started并且能扫描到附近的蓝牙设备说明整条链路都通了。这时候哪怕GNOME设置界面显示异常也不用慌了至少底层是好的。最后说一句实在话在Linux上折腾MT7922这件事最磨人的其实不是技术难度而是“以为修好了结果重启又犯”的挫败感。但只要把内核、固件、电源管理这三个点都照顾到这颗网卡在Ubuntu 20.04上完全能做到日常稳定使用。万一你在某一步卡住了照着上面的排查清单逐项过一遍基本都能找到问题所在。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

MATLAB实现MIMO-OFDM误码率仿真:4QAM/16QAM/64QAM对比与调试 2026/9/14 15:21:57

MATLAB实现MIMO-OFDM误码率仿真:4QAM/16QAM/64QAM对比与调试

简介:面向MIMO-OFDM通信系统学习与研究者的Matlab源码包,聚焦4QAM、16QAM与64QAM三种调制方式下的误码率对比,适用于无线通信课程设计、毕业设计或科研入门阶段的算法验证。资源共59个文件,包含58个.m脚本和1个readme说明&#xf…

阅读更多 →
ESP32-P4原生USB Host驱动HID鼠标实战指南 2026/9/14 15:21:57

ESP32-P4原生USB Host驱动HID鼠标实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
企业级Java架构设计:DDD与微服务实战解析 2026/9/14 15:21:57

企业级Java架构设计:DDD与微服务实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
用myBuilder脚手架搭建企业级Spring Boot项目:从课设到实战 2026/9/14 15:21:57

用myBuilder脚手架搭建企业级Spring Boot项目:从课设到实战

最近在带实验室项目时用了myBuilder这个脚手架工具,明显感觉到学生从“会写接口”到“理解企业级开发流程”之间的距离被压缩了一大截。很多同学在学校里课程设计做得风生水起,数据库表画了一堆,接口也调通了,可真到了企业面试和实…

阅读更多 →
nano编辑器完全指南:Linux服务器高效文本编辑与配置实战 2026/9/14 15:21:56

nano编辑器完全指南:Linux服务器高效文本编辑与配置实战

在服务器上摸爬滚打了这么多年,如果说 vim 是那种你得先苦修一遍“指法”才能谈效率的编辑器,那 nano 就是那个“拿起就能用、放下也不心疼”的老朋友。很多人一听 nano 就觉得是新手玩具,实际在嵌入式调试、Docker 容器里改配置、或者远程 S…

阅读更多 →
TDD实战:用Jest与JUnit构建高并发秒杀系统的对比与踩坑 2026/9/14 15:18:56

TDD实战:用Jest与JUnit构建高并发秒杀系统的对比与踩坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞