当前位置: 首页 > web >正文

Ubuntu 24.04 适配联发科 mt7902 pcie wifi 网卡驱动实践

简介

在之前台式机组装的过程中选择了主板自带wifi 蓝牙的方案

这个在windows下工作正常,但是在ubuntu环境下没有驱动

网卡型号,联发科 mt7902 wifi6,挂在pcie总线上

所以本篇博客来解决没有驱动的这个问题

windows 驱动分析

在windows设备管理器查看一下设备管理器,寻找与此网卡相关的信息

观察到windows的驱动基于一个mtkihvx.dll vwifibus.sys文件和驱动文件夹下的一些列文件组成

分析驱动文件夹下的文件:

C:\Windows\System32\DriverStore\FileRepository\mtkwl6ex.inf_amd64_0e232ab4dd14868b

其中hdr.bin我理解是对不同型号的网卡的phy相关mcu的配置差异

RAM CODE应该是网卡内置ram需要加载的一些代码段之类的

WikiDevi 查询硬件信息

WikiDevi 是一个专注于计算机硬件信息的网站。

该网站收集了大量关于各类硬件的详细信息,包括 Broadcom SoC 系列、MediaTek 芯片等相关资料。用户可以在上面查询到不同硬件的具体参数、固件信息等内容,对于了解硬件底层信息、进行硬件相关的研究或开发,以及解决硬件相关问题等都有一定的帮助。

其中找到mt7902相关资料

PCI ID details

  • MediaTek MT7902 Reference Design - WikiDevi.Wi-Cat.RU

  • Windows driver inf contents as sources from link in firmware/acer.url

刚好最近在学习pcie,把这个wifi网卡的详细信息打印出来,分析一下,在ubuntu上面

Firmware

Initial firmware source is the acer website URL for the mt7902 windows driver. This needs to be clarified, as it's proprietary.

DKMS 简介

DKMS(Dynamic Kernel Module Support,动态内核模块支持)是一个用于管理 Linux 内核模块的工具,主要作用是在系统内核更新时,自动重新编译和安装依赖于特定内核版本的驱动程序(内核模块),避免因内核升级导致驱动失效。

核心功能

  1. 自动适配内核更新 当 Linux 系统升级内核后,依赖旧内核编译的驱动模块会失效。DKMS 能检测到内核变化,自动重新编译对应的驱动模块并安装到新内核中,无需用户手动操作。

  2. 统一管理驱动模块 集中管理第三方驱动(如显卡、网卡、虚拟机工具等),支持模块的安装、卸载、升级和版本切换,简化驱动维护流程。

  3. 跨内核版本兼容 允许同一驱动在多个内核版本中使用,尤其适合需要频繁测试不同内核的场景(如开发者或服务器环境)。

ubuntu 驱动寻找

除了去google,bing,gpt去问,也要学会直接在github搜索,找出收藏最多的进行分析

方案一:Ndiswrapper 解决方案 ×

linux下无线网卡解决方案之Ndiswrapper终极使用指南 - dartagnan - 博客园

ndiswrapper 是一个用于在 Linux 系统中运行 Windows 平台网卡驱动程序的工具。它的核心功能是为 Linux 内核提供一个兼容层,让原本为 Windows 系统开发的 NDIS(Network Driver Interface Specification,网络驱动程序接口规范)驱动能够在 Linux 环境中被识别和使用。

ndiswrapper 包含两个主要部分:

  1. 内核模块:负责将 Linux 内核的网络接口调用转换为 Windows NDIS 规范的调用,让 Windows 驱动能够理解并响应 Linux 系统的指令。

  2. 用户空间工具:用于安装、配置和管理 Windows 驱动文件(通常是 .inf.sys 文件),并将驱动与 ndiswrapper 内核模块关联起来。

安装 ndiswrapper 工具:sudo apt install ndiswrapper-common ndiswrapper-utils-1.9

年久失修,不玩了,拉取源码编译安装也是各种问题,好像2020年就不怎么支持了,内核版本太老了

方案二:keepsoftware 解决 ×

https://github.com/keepsoftware/mt7902-dkms

进去一看就是未完工的状态,有点坑人,这都能骗star

方案三:samveen 解决 ×

https://github.com/samveen/mt7902-dkms

使用指南


# (One time setup) Clone this repo into /usr/src/mt7902:
sudo git clone https://github.com/samveen/mt7902-dkms /usr/src/mt7902
# Create a link to the source dir with a version number(easier versioned driver updates):
sudo ln -s /usr/src/mt7902 /usr/src/mt7902-0.0.1
# Register the module with DKMS(for a specific kernel version, add -k $KVER):
sudo dkms add --verbose -m mt7902 -v 0.0.1
# Build and install the module(for a specific kernel version, add -k $KVER):
sudo dkms build --verbose -m mt7902 -v 0.0.1
sudo dkms install --verbose -m mt7902 -v 0.0.1
# Check status:
sudo dkms status --verbose -m mt7902 -v 0.0.1
# Get rid of this setup in case it's a pain:
sudo dkms uninstall --verbose -m mt7902 -v 0.0.1
sudo dkms remove --verbose -m mt7902 -v 0.0.1 --all
sudo rm -fR /usr/src/mt7902\*
# Firmware download/install - Downloaded from Acer website and installed into /lib/firmware/mediatek/
cd firmware
sudo bash -x get-firmware.sh
# Update source
cd /usr/src/mt7902 && sudo git pull

cd /usr/src/mt7902 && sudo git pull

实际操作

开始编译驱动

修复编译错误

错误1:修复kernel版本迭代导致的api参数变化

错误2:找不到init dummy net dev的api定义

去社区探索了一番,发现linux6.13到linux6.14版本对网卡进行了升级

Making sure you're not a bot!

本来内嵌的net_device结构体变成了内链的,静态分配变成了动态alloc的,相关逻辑都得fix一下,这里只放一部分修改,本来通过containerof宏反向找到外面结构体的方法也要用priv指针法双向链接了等等

终于编译成功了

设置这里还是没有蹦出来无线网卡

pcie那边枚举成功,并且成功匹配驱动

获取mcu的反馈好像超时了

感觉问题太多了,可能是我兼容linux内核的修改还不够多

于是卸载掉了

方案四:OnlineLearningTutorials 解决 ×

https://github.com/OnlineLearningTutorials/mt7902_temp

所以说,github要看更新频率太老的就不行,这个最近更新过的看看

安装固件,zst是一种压缩格式

赶往7902目录进行编译,又复现了老路

看起来适配6.14内核是一个长期活,需要下次再更新一波博客,慢慢解决适配问题了

http://www.xdnf.cn/news/17558.html

相关文章:

  • 联邦学习之------VT合谋
  • 计算机网络:路由聚合的注意事项有哪些?
  • 【嵌入式】Linux的常用操作命令(2)
  • 米哈游笔试——求强势顶点的个数
  • [概率 DP]808. 分汤
  • 第4章 程序段的反复执行2 while语句P128练习题(题及答案)
  • pytorch llm 计算flops和参数量
  • Gltf 模型 加载到 Cesium 的坐标轴映射浅谈
  • 深入理解C++构造函数与初始化列表
  • Python训练营打卡Day27-类的定义和方法
  • AudioLLM
  • 专题二_滑动窗口_找到字符串中所有字母异位词
  • 第二十天:数论度量
  • 前端Web在Vue中的知识详解
  • 数据溢出ERROR L107:ADDRESS SPACE OVERFLOW
  • 11. 为什么要用static关键字
  • 【C++】string 的特性和使用
  • Python(13) -- 面向对象
  • 【面试场景题】通过LinkedHashMap来实现LRU与LFU
  • Java+Vue打造的采购招投标一体化管理系统,涵盖招标、投标、开标、评标全流程,功能完备,附完整可二次开发的源码
  • 标准IO实现
  • Effective C++ 条款32:确定你的public继承塑模出 is-a 关系
  • AWT 基本组件深入浅出:Button/Label/TextField/Checkbox/Choice/List 全面实战与性能优化
  • 2025-08-09 李沐深度学习14——经典卷积神经网络 (2)
  • MySQL相关概念和易错知识点(4)(分组查询、连接查询、合并查询、子查询)
  • Mysql笔记-系统变量\用户变量管理
  • 【LLM实战|langchain】langchain基础
  • toRef和toRefs
  • 智慧城管复杂人流场景下识别准确率↑32%:陌讯多模态感知引擎实战解析
  • Easysearch 冷热架构实战