正点原子Linux 移植USB Wifi模块MT7601U驱动(上)

目录

    • 下载驱动
    • MT7601驱动文件中重要的几个文件
        • 1.README_STA_usb
        • 2.sta_ate_iwpriv_usage.txt
        • 3.config.mk
        • 4.Makefile
    • 移植过程
    • 编译驱动成ko文件
    • 复制到根文件系统里
    • 驱动加载失败常见原因
      • A. DMA缓存大小不够
      • B. RT2870STA.dat文件没配置好
  • 模块加载测试
    • 开启无线网卡并设置IP地址

参考文章 https://blog.csdn.net/rjszcb/article/details/142443415

下载驱动

正点原子出厂适配的USB Wifi模块是RTL8188EUS,这个芯片的的驱动Linux 4.1.15的内核已经自带了,但是MT7601U的驱动要Linux 4.1.19及以后的版本才增加。所以需要手动移植这个驱动,才能正常识别MT7601U这个Wifi模块。

首先要去官网上下载驱动 DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2
在这里插入图片描述

解压后有如下文件:

ate    common   iwpriv_usage.txt  Makefile  mgmt  phy        README_STA_usb     RT2870STA.dat  sta_ate_iwpriv_usage.txt
chips  include  mac               mcu       os    rate_ctrl  RT2870STACard.dat  sta            tools

MT7601驱动文件中重要的几个文件

MT7601U这个驱动文件涵盖了很多配置选项,除了默认的配置外,还有很多选项可以在驱动文件里设置,如果没有特殊要求选择默认的设计即可。

1.README_STA_usb

这个文件非常重要,解释了整个驱动文件如何使用。这个文件里把自己称为RT2870,可能是MT7601U与RT2870是共用驱动的。

下面这段支持linux 2.4和linux 2.6内核,实测linux 4.1.15内核也可以支持。可能是复制了之前RT2870的13年前的老驱动。

Supporting Kernel:
===================
linux kernel 2.4 and 2.6 series. 
Tested in Redhat 7.3 or later.

构建指南这部分是README的核心,要仔细阅读

Build Instructions:  
====================1> $tar -xvzf DPB_RT2870_Linux_STA_x.x.x.x.tgzgo to "./DPB_RT2870_Linux_STA_x.x.x.x" directory.2> In Makefileset the "MODE = STA" in Makefile and chose the TARGET to Linux by set "TARGET = LINUX"define the linux kernel source include file path LINUX_SRCmodify to meet your need.3> In os/linux/config.mk define the GCC and LD of the target machinedefine the compiler flags CFLAGSmodify to meet your need.** Build for being controlled by NetworkManager or wpa_supplicant wext functionsPlease set 'HAS_WPA_SUPPLICANT=y' and 'HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y'.=> #>cd wpa_supplicant-x.x=> #>./wpa_supplicant -Dwext -ira0 -c wpa_supplicant.conf -d** Build for being controlled by WpaSupplicant with Ralink DriverPlease set 'HAS_WPA_SUPPLICANT=y' and 'HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n'.=> #>cd wpa_supplicant-0.5.7=> #>./wpa_supplicant -Dralink -ira0 -c wpa_supplicant.conf -d4> $make# compile driver source code# To fix "error: too few arguments to function ˉiwe_stream_add_event"=> $patch -i os/linux/sta_ioctl.c.patch os/linux/sta_ioctl.c5> $cp RT2870STA.dat  /etc/Wireless/RT2870STA/RT2870STA.dat6> load driver, go to "os/linux/" directory.#[kernel 2.4]#    $/sbin/insmod rt2870sta.o#    $/sbin/ifconfig ra0 inet YOUR_IP up#[kernel 2.6]#    $/sbin/insmod rt2870sta.ko#    $/sbin/ifconfig ra0 inet YOUR_IP up7> unload driver    $/sbin/ifconfig ra0 down$/sbin/rmmod rt2870sta
  1. 先解压文件;
  2. 设置Makefile 里的MODE = STA(就是设置为站点模式),TARGET = LINUX(设置为LINUX编译),然后把LINUX_SRC改为自己要编译的内核目录。
  3. 设置config.mk里GCC和LD用的交叉编译器,也就是在Makefile里配置CROSS_COMPILE为自己用的交叉编译器。CFLAGS是一个一个环境变量用于指定在编译 C 语言源代码时传递给编译器的选项或标志,比如优化级别、调试信息的生成、预处理器宏的定义等。
    如果要驱动程序被 NetworkManager 或 wpa_supplicant 的 wext 函数控制,需要设置宏(HAS_WPA_SUPPLICANT=y 和 HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y)
  4. 编译程序时,如果有错误提示iwe_stream_add_event函数在调用时提供的参数太少,就要用"=> $patch -i os/linux/sta_ioctl.c.patch os/linux/sta_ioctl.c"这条命令来打个补丁。-i选项告诉patch命令要应用的补丁文件的名称。
  5. 把RT2870STA.dat复制到根目录底下的/etc/Wireless/RT2870STA/RT2870STA.dat
  6. 编译完成的modules文件在os/linux/这个目录下。

2.sta_ate_iwpriv_usage.txt

这个文件是iwpriv命令的介绍,但开头就提醒:如果您不熟悉硬件知识,建议不要随意修改硬件的默认值。因为不当的修改可能会导致硬件损坏或系统不稳定。

ATE Test Command Format for station driver****** IMPORTANT ******
If you are not familiar with hardware, it is recommanded not to modify hardware default value.
It may damage hardware.
3.config.mk

这个文件下主要是配置项,我暂时保持全部默认

4.Makefile

Makefile别看文件很长,其实是把各种配置都写进去了,如果按默认配置来,可以浓缩成下面这样:

# 配置Wifi模式、Target、Chipset和OSABL
WIFI_MODE = STA
TARGET = LINUX
CHIPSET = MT7601U
OSABL = NO# 提取Chipset中的MODULE信息
MODULE = $(word 1, $(CHIPSET))# RT28xx目录
RT28xx_DIR = $(shell pwd)# 包含Linux配置
include $(RT28xx_DIR)/os/linux/config.mk# 源码目录
RTMP_SRC_DIR = $(RT28xx_DIR)/RT$(MODULE)# 导出变量
export WIFI_MODE RT28xx_DIR RT28xx_MODE LINUX_SRC CROSS_COMPILE CROSS_COMPILE_INCLUDE PLATFORM RELEASE CHIPSET MODULE RTMP_SRC_DIR TARGET HAS_WOW_SUPPORT OSABL# 定义phony目标
.PHONY: all build_tools clean# 构建目标
all: build_tools $(TARGET)# 构建工具
build_tools:$(MAKE) -C tools$(RT28xx_DIR)/tools/bin2h# Linux目标
LINUX:cp -f os/linux/Makefile.6 $(RT28xx_DIR)/os/linux/Makefile$(MAKE) -C $(RT28xx_DIR)/os/linux/# 清理目标
clean:
ifeq ($(TARGET), LINUX)cp -f os/linux/Makefile.clean os/linux/Makefile$(MAKE) -C os/linux cleanrm -rf os/linux/Makefile
endif

这一句 $(MAKE) -C $(RT28xx_DIR)/os/linux/ 表明最后的编译其实是编译os/linux/ 下的Makefile文件。
打开os/linux/Makefile才能看到具体的编译过程:

include $(RT28xx_DIR)/os/linux/config.mkobj_wsc :=
obj_vht :=
obj_cmm := \../../common/crypt_md5.o\../../common/crypt_sha2.o\../../common/crypt_hmac.o\../../common/crypt_aes.o\../../common/crypt_arc4.o\../../common/mlme.o\
# 后面还有很长,不列举

最终的Makefile会调用config.mk里的配置项,然后根据配置选择要加载的文件进行编译。


移植过程

获取USB Wifi的厂商ID和产品ID,插入MT7601U后有如下显示:

[  259.833929] usb 1-1.1: New USB device found, idVendor=148f, idProduct=7601
[  259.840211] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  259.847456] usb 1-1.1: Product: 802.11 n WLAN
[  259.852241] usb 1-1.1: Manufacturer: MediaTek
[  259.856163] usb 1-1.1: SerialNumber: 1.0

通过lsusb也能查看到:

Bus 001 Device 003: ID 148f:7601

厂商ID为148f,产品ID为7601,这个后面会用到。

1.修改DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/common/rtusb_dev_id.c存放的是USB设备的ID信息,可以看到已经定义了MT7601U的厂商ID和设备ID。
在这里插入图片描述

2.修改主目录底下的Makefile文件,原来的驱动PLATFORM = PC,需要注释掉改为PLATFORM = SMDK,SMDK是三星的Linux开发板,正点原子Linux开发板和这个最接近。

#PLATFORM: Target platform
PLATFORM = PC
#PLATFORM = 5VT
#PLATFORM = IKANOS_V160
#PLATFORM = IKANOS_V180
#PLATFORM = SIGMA
#PLATFORM = SIGMA_8622
#PLATFORM = INIC
#PLATFORM = STAR
#PLATFORM = IXP
#PLATFORM = INF_TWINPASS
#PLATFORM = INF_DANUBE
#PLATFORM = INF_AR9
#PLATFORM = INF_VR9
#PLATFORM = BRCM_6358
#PLATFORM = INF_AMAZON_SE
#PLATFORM = CAVM_OCTEON
#PLATFORM = CMPC
#PLATFORM = RALINK_2880
#PLATFORM = RALINK_3052
#PLATFORM = SMDK
...

3.继续修改Makefile

ifeq ($(PLATFORM),SMDK)
LINUX_SRC = /home/alientek/linux/gitstore/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek
CROSS_COMPILE = arm-linux-gnueabihf-
endif

4.修改DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/include/rtmp_def.h,把无线网名称从ra改为wlan

#define INF_MAIN_DEV_NAME               "wlan"
#define INF_MBSSID_DEV_NAME             "wlan"

5.修改config.mk,添加wpa_supplicant支持,“HAS_WPA_SUPPLICANT=y”。

编译驱动成ko文件

编程后的 mt7601Usta.ko 文件在/os/linux/目录下

复制到根文件系统里

mt7601Usta.ko复制到开发板根目录的/lib/modules/4.1.15/里,
RT2870STA.dat复制到/etc/Wireless/RT2870STA/里。
然后insmod 或者 modprobe mt7601Usta.ko

驱动加载失败常见原因

A. DMA缓存大小不够

因为linux 的DMA块设置的太小加载失败。
有两种方法,一种是改bootloader里的参数,增加coherent_pool=2M,如下:

setenv bootargs 'console=ttymxc4,115200 coherent_pool=2M root=/dev/mmcblk1p2 rootwait rw'

另一种是改内核,修改内核里的dma-mapping.c文件
在这里插入图片描述
改为

#define DEFAULT_DMA_COHERENT_POOL_SIZE	SZ_2M

改其他大小也可以,在这个文件里找一个合适的大小
在这里插入图片描述

B. RT2870STA.dat文件没配置好

如果出现 rt28xx_open return fail! 表明配置文件没设置好,重新拷贝DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/etc/Wireless/RT2870STA/RT2870STA.dat这个文件到/etc/Wireless/RT2870STA/中

模块加载测试

如果使用过depmod命令,会在/lib/modules/4.1.15/ 下产生这样一个文件 modules.alias。

alias usb:v148Fp760Bd*dc*dsc*dp*ic*isc*ip*in* mt7601Usta
alias usb:v148Fp7601d*dc*dsc*dp*ic*isc*ip*in* mt7601Usta
alias usb:v148Fp6370d*dc*dsc*dp*ic*isc*ip*in* mt7601Usta
alias usb:v148Fp7650d*dc*dsc*dp*ic*isc*ip*in* mt7601Usta

这个格式为 usb:v<vendor_id>p<product_id>ddcdscdpiciscipin <module_name>,只要检查到usb有对应vendor_id和对应product_id的USB设备插入,就会自动调用<module_name>,也就是wifi 模块mt7601Usta.ko

开启无线网卡并设置IP地址

  1. 使用命令“ifconfig wlan0 up”开启无线网卡

  2. 然后在/etc/wpa_supplicant.conf文件里配置要连接的wifi账号和密码。

  3. 最后使用wpa_supplicant -D wext -c /etc/wpa_supplicant.conf -i wlan0 &或 wpa_supplicant -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf & 运行区别在于wext和nl80211。-D wext中的wext代表“Wireless Extensions”(无线扩展)。这是Linux内核中一套用于支持无线LAN设备的API集合。wext是较老的无线驱动接口,它提供了一套标准的接口用于配置和控制无线设备,包括扫描可用的网络、连接到网络、设置加密等。
    然而随着Linux内核的发展,更现代和更强大的接口如nl80211(通过-D nl80211指定)已经成为主流。nl80211是Linux内核中用于无线网络的新API,它提供了更丰富的功能和更好的性能。如果无线驱动支持nl80211,可以尝试改成nl80211,如果运行起来有问题改回wext。

  4. 出现CTRL-EVENT-CONNECTED后表示连接成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/8157.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux相关概念和易错知识点(26)(命名管道、共享内存)

目录 1.命名管道 &#xff08;1&#xff09;匿名管道 -> 命名管道 ①匿名管道 ②命名管道 &#xff08;2&#xff09;命名管道的使用 ①创建和删除命名管道文件 ②命名管道文件的特性 ③命名管道和匿名管道的区别 &#xff08;3&#xff09;用命名管道实现进程间通信…

【时时三省】(C语言基础)对比一组函数

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 对比一组函数 比如对比一下scanf fscanf sscanf和printf fprintf sprintf scanf 针对标准输入的格式化的输入语句 其实它针对的是stdin fscanf 针对所有输入流的格式化的输入语句 它是针对s…

Leecode刷题C语言之组合总和②

执行结果:通过 执行用时和内存消耗如下&#xff1a; int** ans; int* ansColumnSizes; int ansSize;int* sequence; int sequenceSize;int** freq; int freqSize;void dfs(int pos, int rest) {if (rest 0) {int* tmp malloc(sizeof(int) * sequenceSize);memcpy(tmp, seque…

汽车网络信息安全-ISO/SAE 21434解析(下)

目录 第十二~十四章 - 后开发阶段 1. 十二章节 - 生产 2. 十三章节 - 运营与维护 网络安全事件响应 更新 3. 十四章节 - 结束网络安全支持和停用 结束网络安全支持 报废 第十五章 - TARA分析方法 1. 概述 2. 资产识别 3. 威胁场景识别 4. 影响评级 5. 攻击路径分…

[java] java基础-字符串篇

目录 API String 创建字符串对象的两种方式&#xff1a; Java的内存模型 字符串常量池&#xff08;串池&#xff09;存放地址 两种构造方法的内存分析 String的常用方法 号比较的是什么 字符串比较&#xff08;比较字符串的数据值&#xff09; 遍历字符串 StringBui…

Unity中关于实现 管道水流+瀑布流动+大肠蠕动效果笔记

Unity中关于实现 管道水流瀑布流动大肠蠕动效果笔记 效果展示&#xff1a; 参考资料及链接&#xff1a; 1、如何在 Unity 中创建水效果 - 水弯曲教程 https://www.youtube.com/watch?v3CcWus6d_B8 关于补充个人技能中&#xff1a;顶点噪波影响网格着色器配合粒子实现水特效 …

Couchbase UI: Indexes

在Couchbase中&#xff0c;索引的这些指标可以帮助你评估索引的性能和状态。下面是每个指标的详细解释&#xff0c;以及如何判断索引的有效性&#xff1a; 1. Index Name&#xff08;索引名称&#xff09; 描述&#xff1a;每个索引都有一个唯一的名称。这个名称通常会包括表…

redis的分片集群模式

redis的分片集群模式 1 主从哨兵集群的问题和分片集群特点 主从哨兵集群可应对高并发写和高可用性&#xff0c;但是还有2个问题没有解决&#xff1a; &#xff08;1&#xff09;海量数据存储 &#xff08;2&#xff09;高并发写的问题 使用分片集群可解决&#xff0c;分片集群…

第一届“启航杯”网络安全挑战赛WP

misc PvzHE 去这个文件夹 有一张图片 QHCTF{300cef31-68d9-4b72-b49d-a7802da481a5} QHCTF For Year 2025 攻防世界有一样的 080714212829302316092230 对应Q 以此类推 QHCTF{FUN} 请找出拍摄地所在位置 柳城 顺丰 forensics win01 这个软件 云沙盒分析一下 md5 ad4…

ThreadLocal概述、解决SimpleDateFormat出现的异常、内存泄漏、弱引用、remove方法

①. ThreadLocal简介 ①. ThreadLocal是什么 ①. ThreadLocal本地线程变量,线程自带的变量副本(实现了每一个线程副本都有一个专属的本地变量,主要解决的就是让每一个线程绑定自己的值,自己用自己的,不跟别人争抢。通过使用get()和set()方法,获取默认值或将其值更改为当前线程…

蓝桥杯模拟算法:多项式输出

P1067 [NOIP2009 普及组] 多项式输出 - 洛谷 | 计算机科学教育新生态 这道题是一道模拟题&#xff0c;我们需要分情况讨论&#xff0c;我们需要做一下分类讨论 #include <iostream> #include <cstdlib> using namespace std;int main() {int n;cin >> n;for…

LLM - 大模型 ScallingLaws 的设计 100B 预训练方案(PLM) 教程(5)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145356022 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Scalin…

深度解析:基于Vue 3的教育管理系统架构设计与优化实践

一、项目架构分析 1. 技术栈全景 项目采用 Vue 3 TypeScript Tailwind CSS 技术组合&#xff0c;体现了现代前端开发的三大趋势&#xff1a; 响应式编程&#xff1a;通过Vue 3的Composition API实现细粒度响应 类型安全&#xff1a;约60%的组件采用TypeScript编写 原子化…

计算机组成原理(2)王道学习笔记

数据的表示和运算 提问&#xff1a;1.数据如何在计算机中表示&#xff1f; 2.运算器如何实现数据的算术、逻辑运算&#xff1f; 十进制计数法 古印度人发明了阿拉伯数字&#xff1a;0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#…

(详细)Springboot 整合动态多数据源 这里有mysql(分为master 和 slave) 和oracle,根据不同路径适配不同数据源

文章目录 Springboot 整合多动态数据源 这里有mysql&#xff08;分为master 和 slave&#xff09; 和oracle1. 引入相关的依赖2. 创建相关配置文件3. 在相关目录下进行编码&#xff0c;不同路径会使用不同数据源 Springboot 整合多动态数据源 这里有mysql&#xff08;分为maste…

AI如何帮助解决生活中的琐碎难题?

引言&#xff1a;AI已经融入我们的日常生活 你有没有遇到过这样的情况——早上匆忙出门却忘了带钥匙&#xff0c;到了公司才想起昨天的会议资料没有打印&#xff0c;或者下班回家还在纠结晚饭吃什么&#xff1f;这些看似微不足道的小事&#xff0c;往往让人疲惫不堪。而如今&a…

一分钟搭建promehteus+grafana+alertmanager监控平台

为什么要自己搭建一个监控平台 平时进行后端开发&#xff0c;特别是微服务的后端可开发&#xff0c;一定少不了对接监控平台&#xff0c;但是平时进行一些小功能的测试又没有必要每次都手动安装那么多软件进行一个小功能的测试&#xff0c;这里我使用docker-compose搭建了一个…

深入MapReduce——计算模型设计

引入 通过引入篇&#xff0c;我们可以总结&#xff0c;MapReduce针对海量数据计算核心痛点的解法如下&#xff1a; 统一编程模型&#xff0c;降低用户使用门槛分而治之&#xff0c;利用了并行处理提高计算效率移动计算&#xff0c;减少硬件瓶颈的限制 优秀的设计&#xff0c…

前端【10】jQuery DOM 操作

目录 jquery捕获查取 获得内容 - text()、html() 以及 val() 获取属性 - attr() ​编辑 jQuery 修改/设置内容和属性 设置内容 - text()、html() 以及 val() 设置属性 - attr() jQuery添加元素 jQuery - 删除元素 前端【9】初识jQuery&#xff1a;让JavaScript变得更简…

进程控制的学习

目录 1.进程创建 1.1 fork函数 1.2 fork函数返回值 1.3 写时拷贝 1.4 fork 常规用法 1.5 fork 调用失败的原因 2. 进程终止 2.1 进程退出场景 2.2 进程常见退出方法 2.2.1 从main 返回 2.2.2 echo $&#xff1f; 查看进程退出码 2.2.2.1 我们如何得到退出码代表的含…