usbwifi网卡mt7601u驱动配置

目录结构说明

一、环境说明

1、环境介绍

2、确认usbwifi网卡信息

3、相关驱动

二、配置编译驱动

0、编译前检查host配置

1、通过menuconfig配置7601驱动

2、执行make编译

三、测试驱动

1、挂载mt7601u驱动

2、 出现问题排查

四、安装wifi配置工具

1、wifi配置工具介绍

2、通过buildroot配置wpa_supplicant工具

五、wpa_supplicant工具使用

一、环境说明

1、环境介绍

   首先这里我们需要安装一些基础的编译环境,安装tftp服务器,安装nfs服务器等,这里我们可以参考文章《orangpione利用usb共享网络(RNDIS)实现tftp加载内核挂载到NFS根文件系统》中的环境准备章节,自行安装相关服务,在这里不展开。后续的开发是基于tftp和nfs传输的条件下进行,如果没有实现相关传输,也可以通过烧录sd卡的形式进行。

2、确认usbwifi模块信息

  1. 确认usbwifi网卡的相关产品信息,我们可以通过把网卡插入windowns,且驱动后查询相关驱动信息。这里我们主要是为了获取usb设备的VID和PID,如下图,可知USBWiFi的VID是0x148f,而PID是0x7601


windows驱动

   PID/VID唯一标识一个设备,HardwareID是为了给系统识别的 ,他是根据PID/VID而生成的。这个与序列号没什么关系,序列号一般都是厂家固化到芯片中的信息而已。GUID只是为了标志你安装的设备是属于一个什么类当中,这个类可以显示再设备管理器中。比如:你可以定义一个类,当然这个类有与系统中任何类都不同的GUID,然后选择一个图标和类名,就可以同网卡等其他设备一起显示在设备管理器下的根目录中了
  根据USB规范的规定,所有的USB设备都有供应商ID(VID)和产品识别码(PID),主机通过不同的VID和PID来区别不同的设备,VID和PID都是两个字节长,其中,供应商ID(VID)由供应商向USB执行论坛申请,每个供应商的VID是唯一的,PID由供应商自行决定,理论上来说,不同的产品、相同产品的不同型号、相同型号的不同设计的产品最好采用不同的PID,以便区别相同厂家的不同设备。
  VID和PID通常情况下有两种存储方式,第一种是主控生产商的VID和PID,存储在主控的bootcode中;第二种是设备生产商的VID和PID,该VID和PID存储在主控外部的非易失性存储设备中(EEPROM或Flash)的设备固件中,当USB设备连接主机时,如果固件中有设备生产商的VID和PID,会将该VID和PID报告给主机,而忽略主控生产商的VID和PID。所以理论上一个USB存储设备的VID应该是设备生产商的VID,而不是主控生产商的VID,这两个VID应该是不同的(主控生产商自己生产的设备除外)。
  由于VID和PID重复并不会对产品的使用带来严重影响,很多USB设备生产商(山寨厂居多)为了方便,并不会向USB执行论坛申请自己的VID,而是依然沿用主控生产商的VID或随便向产品写入VID和PID;同时,正规厂家只需要申请VID,PID由厂家自行确定,所以存在相同型号的产品,可能采用了不同的主控(商业需要,很正常),而他们的PID是一样的,基于上述原因通过VID和PID就不能准确识别USB设备的主控型号,这个问题大家在使用USB设备的过程中需要注意。

3、相关驱动

  1. 确定我们的设备是mt7601u后,我们先到官网了解相关信息,官网地址https://www.mediatek.com/products/broadbandWifi/mt7601u,其中可以看到里面有linux下的驱动,官方给出的驱动源码连接为https://d86o2zu8ugzlg.cloudfront.net/mediatek-craft/drivers/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2,官方的驱动源码看起来有点老了,是2013年9月13日的包,我们需要再确认下有没有新的驱动更新,毕竟现在内核都5.7了。
  2. 在github仓库中找到https://github.com/kuba-moo/mt7601u
    有新的mt7601驱动,而且按照其描述信息,已经支持到内核4.2了,但是还不是最新的驱动,找了好多资料但是后面没有找到更新的相关信息了。
  3. 很偶然的情况下,在kernel的源码make menuconfig搜索7601的时候发现,内核本身竟然已经支持有mt7601u的驱动了,直接配置好,后续开始编译

二、配置编译驱动

0、编译前检查host配置

如果没有host驱动部分,很多usb外设都不能工作,lsusb没有任何反应

Support for Host-side USB--->CONFIG_USB=y 
Inventra Highspeed Dual Role Controller--->CONFIG_USB_MUSB_HDRC
    --->MUSB Mode Selection (Dual Role mode)
        --->Dual Role mode--->CONFIG_USB_MUSB_DUAL_ROLE

1、通过menuconfig配置7601驱动

  1. 在内核源码目录执行make menuconfig(前提已经配置了相关的arch和gcc),进入搜索界面搜索7601,发现7601的相关相关配置路径为Device Drivers--->Network device support--->Wireless LAN--->MediaTek devices--->MediaTek MT7601U (USB) support
    搜索7601

    7601u
  2. 在配置7601模块时发现,还需要配置mac80211和cfg80211驱动模块,其配置路径为Networking support--->Wireless下的cfg80211 - wireless configuration API 和Generic IEEE 802.11 Networking Stack (mac80211)
    80211

2、执行make编译

  1. 执行make modules -j4编译,或者通过make M=drivers modules -j4编译net目录下的modules,编译完成后,会在源码的下面位置出现ko文件
net/wireless/cfg80211.ko
net/mac80211/mac80211.ko
drivers/net/wireless/mediatek/mt7601u/mt7601u.ko
  1. 通过执行make modules_install INSTALL_MOD_PATH=rootfs,把模块安装到指定的目录中去,赚了我们安装到我们的nfs根文件系统中,INSTALL_MOD_PATH指定安装目录。安装后可以到我们指定的安装目录下查看是否有上面的ko文件,具体目录如下
lib/modules/5.7.7/kernel/net/wireless/cfg80211.ko
lib/modules/5.7.7/kernel/net/mac80211/mac80211.ko
lib/modules/5.7.7/kernel/drivers/net/wireless/mediatek/mt7601u/mt7601u.ko
  1. 由于我这里是直接安装到,nfs根文件系统中,这里我们只需要更新zImage和dtb文件到tftp服务目录下,然后重启开发板,就可以直接进入系统,进行模块的加载测试了。(用nfs开发比较方便可以省去烧录的步骤,哈哈哈)

三、测试驱动

1、挂载mt7601u驱动

  1. 在开发板登录系统,通过命令modprobe -l | grep mt7601查看是否存在mt7601的内核依赖关系
  2. 通过命令modprobe mt7601u加载7601的usbwifi驱动
  3. 插入usbwifi模块,会显示如下信息,显然这里出错了,但是为什么呢
[   92.490546] usb 3-1: reset high-speed USB device number 2 using ehci-platform
[   92.693611] mt7601u 3-1:1.0: ASIC revision: 76010001 MAC revision: 76010500
[   92.702041] mt7601u 3-1:1.0: Direct firmware load for mt7601u.bin failed with error -2
[   92.710670] mt7601u: probe of 3-1:1.0 failed with error -2

2、 出现问题排查

  1. 出现问题后,谷歌一番后,发现这个问题其实是由于,开发板的文件系统缺少mt7606u.bin文件导致的,这里参考https://github.com/kuba-moo/mt7601u,我们从官方的源码的src/mcu/bin把其MT7601.bin文件拷贝到我们开发板的nfs系统的/lib/firmware目录下,并重命名问mt7601u.bin文件
“Download the vendor driver (see section below) and copy file MT7601U.bin to /lib/firmware”   
 cp src/mcu/bin/MT7601.bin /lib/firmware/mt7601u.bin
  1. 在虚拟机拷贝完后,因为nfs系统,我们可以直接到开发板先通过命令,modprobe -r mt7601u移除之前的mt7601u模块
  2. 我们再次重新加载modprobe mt7601u模块,如无意外可以输出下面的信息,这里提示failed to load regulatory.db这个数据库,但是发现对于驱动没有影响,我就忽略了
[ 5998.967033] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[ 5998.976850] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[ 5998.985609] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
[ 5998.994261] cfg80211: failed to load regulatory.db
[ 5999.007632] usbcore: registered new interface driver mt7601u
  1. 通过ifconfig -a查看网卡接口,这里可以看到wlan0,有的可能是ra0,则表示驱动成功
wlan0     Link encap:Ethernet  HWaddr 20:0D:B0:1D:56:D0  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B

四、安装wifi配置工具

1、wifi配置工具介绍

  wpa_supplicant本是开源项目源码,被谷歌修改后加入Android移动平台,它主要是用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证的,而实际上的工作内容是通过socket(不管是wpa_supplicant与上层还是wpa_supplicant与驱动都采用socket通讯)与驱动交互上报数据给用户,而用户可以通过socket发送命令给wpa_supplicant调动驱动来对WiFi芯片操作。 简单的说,wpa_supplicant就是WiFi驱动和用户的中转站外加对协议和加密认证的支持。
  目前可以使用wireless-tools 或wpa_supplicant工具来配置无线网络。请记住重要的一点是,对无线网络的配置是全局性的,而非针对具体的接口。
  wpa_supplicant是一个较好的选择,但缺点是它不支持所有的驱动。请浏览wpa_supplicant网站获得它所支持的驱动列表。另外,wpa_supplicant目前只能连接到那些你已经配置好ESSID的无线网络。wireless-tools支持几乎所有的无线网卡和驱动,但它不能连接到那些只支持WPA的AP。
  经过编译后的wpa_supplicant源程序可以看到两个主要的可执行工具:wpa_supplicant和wpa_cli。wpa_supplicant是核心程序,它和wpa_cli的关系就是服务和客户端的关系:后台运行wpa_supplicant,使用wpa_cli来搜索、设置、和连接网络。

2、通过buildroot配置wpa_supplicant工具

  1. 通过build配置wpa_supplicant,比较简单,因为所有的依赖以及要处理的都由buildroot帮忙处理了,我们只需要配置好wpa_supplicant功能即可。
  2. 执行命令./build.sh menuconfig(这里的脚本是之前章节定义好的),配置wpa_supplicant功能开启
    路径为:```Target packages--->Networking applications--->wpa_supplicant,配置如图(同时配置了wpa_cli)
    wpa_supplicant
  3. 执行命令./build.sh -j4,编译wpa_supplicant,由于buildroot会直接编译出wpa_supplicant的可这行文件,并拷贝到根文件目录(也是我的nfs根目录),其文件具体路径为build/wpa_supplicant-2.9/wpa_supplicant/wpa_supplicant,在跟文件系统的目录在/usr/sbin/wpa_supplicant
  4. 由于开发板挂载的nfs根文件系统就是buildroot编译的根文件系统,所以可以直接在开发板上输入wpa用tap补全出wpa_supplicant,则说明wpa_supplicant安装完成。
  5. 如果喜欢编译源码的朋友可以参考https://www.cnblogs.com/y4247464/p/13373143.html进行wpa_supplicant的编译,可以通过http://w1.fi/releases/wpa_supplicant-2.9.tar.gz下载2.9版本或者其他版本的wpa_supplicant

五、wpa_supplicant工具使用

  1. vi /etc/wpa_supplicant.conf,修改wpa_supplicant配置文件,主要配置账号密码和加密方式
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1

network={
  ssid="ssid"
  psk="passwd"
  proto=WPA
  key_mgmt=WPA-PSK
}
  1. 通过命令ifconfig wlan0 up启动wifi网口
  2. 通过命令wpa_supplicant -B -c /etc/wpa_supplicant.conf -i wlan0启动wpa_supplicant 工具,出现类似授权信息
[   45.102774] wlan0: authenticate with 60:3a:7c:56:92:d3
[   45.175326] wlan0: send auth to 60:3a:7c:56:92:d3 (try 1/3)
[   45.182540] wlan0: authenticated
[   45.190692] wlan0: associate with 60:3a:7c:56:92:d3 (try 1/3)
[   45.202769] wlan0: RX AssocResp from 60:3a:7c:56:92:d3 (capab=0x1411 status=0 aid=4)
[   45.243124] wlan0: associated
  1. 通过命令wpa_cli -iwlan0 status,查看wlan相关的信息
bssid=60:3a:7c:56:92:d3
freq=2462
ssid=TP-LINK_104
id=0
mode=station
wifi_generation=4
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA-PSK
wpa_state=COMPLETED
address=20:0d:b0:1d:56:d0
uuid=5ed4ac07-94e1-5153-8b79-5fd575d8c183

你可能感兴趣的:(usbwifi网卡mt7601u驱动配置)