写点什么

Linux 驱动开发:USB 无线 wifi 驱动开发 (MT7601)、完成 WIFI 管理工具安装

作者:DS小龙哥
  • 2022-10-22
    湖北
  • 本文字数:11650 字

    阅读完需:约 38 分钟

开发环境说明

内核版本:3.5.0


交叉编译器:arm-linux-gcc-4.5.1


PC 宿主机:红帽 REDHAT

一、移植 WIFI 驱动

当前采用的 WIFI 是 360 随身 WIFI,这款随身 WIFI 所用的网卡芯片是 Ralink(雷凌科技) 的解决方案(在上篇文章里也有详细介绍),芯片型号为 MT7601。 如果在 PC 计算机上使用这款随身 WIFI 那自然是简单,官网下载个驱动安装插上就能使用。 如果是在嵌入式平台,自动的平台上使用,官网就没有现成的驱动下载了,这种情况下就需要针对 WIFI 编写驱动。当然,从 0 开始写确实困难,不过这款芯片官方提供了 linux 下的驱动源码,这就好办了。只需要下载下来,编译就能使用了。


接下来这篇文章会详细介绍 WIFI 驱动从哪里下载,下载下来如何修改进行编译安装测试,并交叉编译对应的 WIFI 工具,最终完成 WIFI 的基本使用,完成 IP 地址动态分配,热点连接,热点扫描、热点信息查看等等。

1.1 下载 WIFI 驱动

下载链接:http://mediatek.com/zh-CN/downloads1/downloads/




直接下载链接


http://s3.amazonaws.com/mtk.cfs/Downloads/linux/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2


1.2 配置编译驱动

将下载的驱动压缩包拷贝到虚拟机,解压。(为了好分类,最好单独创建一个文件夹存放)

1.2.1 解压

[root@XiaoLong 360_WIFI]# tar xvf DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2
复制代码



1.2.2 修改运行环境

进入到解压的目录下,修改顶层 Makefile,驱动默认的运行环境为 X86,需要注释掉。


[root@XiaoLong DPO_MT7601U_LinuxSTA_3.0.0.4_20130913]# gedit Makefile +30第 30 行加上注释:#PLATFORM = PC 第 49 行取消注释:LATFORM = SMDK
复制代码


1.2.3 修改编译环境

[root@XiaoLong DPO_MT7601U_LinuxSTA_3.0.0.4_20130913]# gedit Makefile +275ifeq ($(PLATFORM),SMDK)
LINUX_SRC = /work/linux3.5/linux-3.5 内核路径 CROSS_COMPILE = arm-linux- 交叉编译器 endif
复制代码


1.2.4 查看 USB 的 ID

USB 芯片的 ID,需要用作匹配作用!相当于平台设备的驱动端与设备端一样,插入了 USB 之后,USB 控制器需要对插入的 USB 进行访问,确认是否是 WIFI 芯片。确定的凭证就是 ID 号


查看 USB ID 的方法:


在虚拟机环境下,输入 lsusb 先查看已经存在的 USB 设备:



查看之后,再插入 360WIFI,再次输入 lsusb 查看存在的 USB 设备。


注意: 默认 360WIFI 会被 windows 挂载,需要手动点击虚拟机右下脚的 USB 图标将 360WIFI 挂载进来。



挂载进来之后,查看的结果:



由上面可以看出,360WIFI 的设备 ID 分别是:148f 和 760b。

1.2.5 添加 USB ID

添加 USB 的 ID 需要修改 common 目录下的 rtusb_dev_id.c 文件,该文件里有一个存放 ID 的结构体,我们需要将上一步得到的 360WIFI 的 ID 添加到结构体中。


[root@XiaoLong DPO_MT7601U_LinuxSTA_3.0.0.4_20130913]# cd common/
[root@XiaoLong common]# gedit rtusb_dev_id.c +37
复制代码


添加的格式:


{USB_DEVICE(0x148f,0x760b)}, //添加 360wifi 的设备 ID
复制代码


1.2.6 去除调试信息

为什么去除调试信息呢?因为在终端调试代码的时候,驱动会不断的向终端打印信息,导致没法敲打命令,所以需要将其注释掉。去除调试信息需要进入到 include/os/目录下,修改 rt_linux.h 文件的 1558 行。


[root@XiaoLong DPO_MT7601U_LinuxSTA_3.0.0.4_20130913]# cd include/os/
[root@XiaoLong os]# gedit rt_linux.h +1558
复制代码


#include "os/rt_os.h"
#undef DBGPRINT //添加这两句话 去除调试打印输出
#define DBGPRINT(...)
#endif /* __RT_LINUX_H__ */
复制代码


1.2.7 编译源码

修改完之后,编译源码,生成驱动文件。 (需要在解压的顶层目录下输入 make) 编译成功后,会在 os/linux/目录下生成 mt7601Usta.ko 文件。


1.2.8 修改 U-BOOT 启动代码

启动 u-bootd 的时候先进入 U-BOOT 命令行,设置 UBOOT 环境变量,在之前的环境变量后加一句 coherent_pool=2M。


coherent_pool=2M 表示设置 DMA 的缓冲区大小。如果不设置 DMA 缓冲区大小,装载 360WIFI 驱动的时候会报错。


设置 UBOOT 环境变量代码如下:(注意:下边代码是一行,不能有换行符出现)


set bootargs root=/dev/nfs nfsroot=192.168.18.3:/work/nfs_root ip=192.168.18.123:192.168.18.3:192.168.18.1:255.255.255.0::eth0:off console=ttySAC0,115200 lcd=s70 coherent_pool=2M init=/linuxrc
复制代码


1.2.9 测试 WIFI 驱动

将生成的 mt7601Usta.ko 驱动文件拷贝到开发板目录下,安装。安装成功之后,将 360WIFI 插入到开发板的 USB 口中,观察弹出的测试信息。


[root@XiaoLong /360_WIFI]# insmod mt7601Usta.ko
复制代码



如果识别成功,会出现以下的提示信息:


1.3.0 拷贝 WIFI 启动配置文件

将 RT2870STA.dat 拷贝至开发板 /etc/Wireless/RT2870STA/目录下。


(没有目录就创建一个); mkdir /etc/Wireless/RT2870STA


二、移植 WIFI 配置工具

2.1 移植 wireless_tools

Wireless tools for Linux 是一个 Linux 命令行工具包,用来设置支持 Linux Wireless Extension 的无线设备。Wireless tools for Linux 和 Linux Wireless Extension 由 Jean Tourrilhes 在维护,由 Hewlett-Packard(HP 惠普)赞助。


大多数基于 Linux 内核的操作系统都包含 Wireless tools。在许多 GNU/Linux 发行版中,都缺省安装这个工具包,即使是没有自动安装,也能很容易地找到其二进制代码安装包。


Wireless Extension (WE)是一组通用的 API,能在用户空间对通用 Wireless LANs 进行配置和统计。它的好处在于仅通过一组单一的工具就能对各种各样的 Wireless LANs 进行管理,不过它们是什么类型,只要其驱动支持 Wireless Extension 就行;另一个好处就是不用重启驱动或 Linux 就能改变这些参数。


Wireless Tools (WT)就是用来操作 Wireless Extensions 的工具集,它们使用字符界面,虽然粗糙,但支持所有 Wireless Extension。虽然还有很多其他管理 Wireless Extensions 的工具,但 Wireless Tools 是参考实现,它包括以下工具:


iwconfig:设置基本无线参数


iwlist:扫描、列出频率,比特率,密钥等


iwspy:获取每个节点链接的质量(只能查阅与之相连的节点)


iwpriv:操作 Wireless Extensions 特定驱动


ifrename: 基于各种静态标准命名接口


大多数 Linux 发行版本都在其网络初始化脚本中集成 Wireless Extension,以便启动时配置无线接口。他们还将 Wireless Tools 作为其标准封装包。

2.1.1 下载地址

下载地址:


http://www.labs.hpe.com/personal/Jean_Tourrilhes/Linux/wireless_tools.29.tar.gz


2.1.2 解压配置

(1)解压


[root@xiaolong 360wifi]# tar xvf wireless_tools.29.tar.gz
[root@xiaolong 360wifi]# cd wireless_tools.29
复制代码


(2)修改 Makefile


[root@xiaolong wireless_tools.29]# gedit Makefile 大约 12 行和 14 行
12 CC = arm-linux-gcc
14​ R = arm-linux-ar
复制代码


(3)​ 编译


[root@xiaolong wireless_tools.29]# make
复制代码



(4) 拷贝文件


拷贝 libiw.so.29 文件到目标系统 rootfs/usr/lib/目录



拷贝用到的几个程序到目标板 rootfs/usr/lib/bin/目录
iwpriv、iwconfig、iwlist, iwevent, iwspy



至此 wireless_tools 移植完成



有可能出现的错误:
在到产品板上还可能出现 can't resolve symbol '__ctype_b_loc' 错误



去掉 iwlib.h 中这一行重新编译即可
#include <ctype.h>
复制代码

2.1.3 工具使用方法

1. 启动网卡:
ifconfig ra0 up
2. 关闭网卡:
ifconfig ra0 down
3. 扫描周围的 wifi 信息:
iwlist ra0 scan
4. 查看无线网卡的信息(比如:网卡名称,已经连接上的 WIFI 等):
iwconfig
5. 我们经常会用到的主要是 iwlist、iwconfig、 iwpriv(没有全部测试过)
命令行:(连接不需要验证密码的热点)
iwlist mlan0 scan //搜索热点信息
ap iwconfig mlan0 essid “linksys” //连接热点
udhcpc -i mlan0 //获得动态 IP
命令行:(连接需要验证密码的热点)
iwlist mlan0 scan //搜索热点信息
ap iwconfig mlan0 key xxxxxxxxxx //输入验证密码
iwconfig mlan0 key open //密码验证功能打开
iwconfig mlan0 essid “linksys” //连接热点
udhcpc –i mlan0 //获得动态 IP
复制代码

3.1 移植 wap_supplicant 工具

目前可以使用 wireless-tools 或 wpa_supplicant 工具来配置无线网络。请记住重要的一点是,对无线网络的配置是全局性的,而非针对具体的接口。


wpa_supplicant 是一个较好的选择,但缺点是它不支持所有的驱动。请浏览 wpa_supplicant 网站获得它所支持的驱动列表。另外,wpa_supplicant 目前只能连接到那些你已经配置好 ESSID 的无线网络,它可以让您连接到那些使用 WPA 的 AP。wireless-tools 支持几乎所有的无线网卡和驱动,但它不能连接到那些只支持 WPA 的 AP。


关于 WPA:


WPA 是 WiFi Protected Access 的缩写,中文含义为“WiFi 网络安全存取”。WPA 是一种基于标准的可互操作的 WLAN 安全性增强解决方案,可大大增强现有以及未来无线局域网络的数据保护和访问控制水平。


wpa_supplicant 是一个开源项目,已经被移植到 Linux,Windows 以及很多嵌入式系统上。它是 WPA 的应用层认证客户端,负责完成认证相关的登录、加密等工作。


wpa_supplicant 是一个 独立运行的 守护进程,其核心是一个消息循环,在消息循环中处理 WPA 状态机、控制命令、驱动事件、配置信息等。


经过编译后的 wpa_supplicant 源程序可以看到两个主要的可执行工具:wpa_supplicant 和 wpa_cli。wpa_supplicant 是核心程序,它和 wpa_cli 的关系就是服务和客户端的关:


后台运行 wpa_supplicant,使用 wpa_cli 来搜索、设置、和连接网络。

3.1.1 wap_supplicant 简介

在 Linux 移植 iw 工具的时候,我们讲过 iw 支持两种“认证/加密”的方式,这两种方式分别为:open 与 wep。但是现在很多的无线加密方法都是以 wpa 与 wpa2(AES)方式加密的。那么这里就出现了 iw 工具不能再 wpa 与 wpa2 的无线加密上使用。因此接下来移植一个 wpa_supplicant 的工具:这个工具支持上面介绍到的四种方式:


1​ open
2​ WEP
3​ WPA(TKJP)
4​ WAP2(AES)
复制代码

3.1.2 移植 libopenssl 库

OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。


OpenSSL 被曝出现严重安全漏洞后,发现多数通过 SSL 协议加密的网站使用名为 OpenSSL 的开源软件包。OpenSSL 漏洞不仅影响以 https 开头的网站,黑客还可利用此漏洞直接对个人电脑发起“心脏出血”(Heartbleed)攻击。据分析,Windows 上有大量软件使用了存在漏洞的 OpenSSL 代码库,可能被黑客攻击抓取用户电脑上的内存数据。


下载链接:http://distfiles.macports.org/openssl/



 1.​ 将下载的 openssl-1.0.2e.tar.gz 压缩包拷贝至虚拟机解压。
[root@XiaoLong 360_WIFI]# tar xvf openssl-1.0.2e.tar.gz
2.​ 配置编译安装的路径
[root@XiaoLong openssl-1.0.2e]# ./config shared no-asm --prefix=$PWD/tmp
--prefix=$PWD/tmp 表示编译安装的路径为当前目录下的 tmp

3.​ 修改顶层 Makefile
[root@XiaoLong openssl-1.0.2e]# gedit Makefile +62

62 CC= arm-linux-gcc
AR= arm-linux-ar $(ARFLAGS) r
RANLIB= arm-linux-ranlib
NM= arm-linux-nm
75​ AKEDEPPROG= arm-linux-gcc
复制代码




 4.​ 编译
[root@XiaoLong openssl-1.0.2e]# make
复制代码



5.​ 安装
[root@XiaoLong openssl-1.0.2e]# make DESTDIR=$PWD/tmp install
复制代码

3.1.3 拷贝生成的文件

(1)将安装目录下(tmp/include)的头文件拷贝到交叉编译器的 include 目录下


 [root@XiaoLong openssl-1.0.2e]# cp tmp/include/* /work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/include/ -rf 
复制代码


(2) 将编译生成 lib 库拷贝一份到开发板根文件系统 lib 目录下


[root@XiaoLong tmp]# pwd
/work/360_WIFI/openssl-1.0.2e/tmp
[root@XiaoLong tmp]# ls bin include lib openssl-1.0.2e.tmp.tar ssl
[root@XiaoLong tmp]# cp lib/* /work/nfs_root/lib/ -rf -d
复制代码


(3) 将编译生成的 lib 库拷贝到交叉编译器的 lib 目录下


[root@XiaoLong openssl-1.0.2e]#
cp tmp/lib/* /work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/ -rf -d
复制代码


3.1.4 移植 wpa_supplicant : 可用于上述 4 种"认证/加密"的库

下载链接:http://w1.fi/wpa_supplicant/


(1)将下载好的压缩包拷贝至虚拟机解压


[root@XiaoLong 360_WIFI]# tar xvf wpa_supplicant-2.5.tar.gz
复制代码


(2) 加载配置文件


[root@XiaoLong wpa_supplicant-2.5]# cd wpa_supplicant/
[root@XiaoLong wpa_supplicant]# cp defconfig .config
复制代码


(3)修改配置文件


[root@XiaoLong wpa_supplicant]# gedit .config

增加以下代码:
CC=arm-linux-gcc
CFLAGS += -I/work/360_WIFI/openssl-1.0.2e/tmp/include
LIBS +=-L/work/360_WIFI/openssl-1.0.2e/tmp/lib
CFLAGS += -I /work/360_WIFI/libnl-3.2.25/tmp/include/libnl3
LIBS += -L /work/360_WIFI/libnl-3.2.25/tmp/lib
CONFIG_LIBNL32=y
复制代码




(4)编译


[root@XiaoLong wpa_supplicant]# make
复制代码



(5)安装


[root@XiaoLong wpa_supplicant]#make DESTDIR=$PWD/tmp install
复制代码


(6)拷贝生成的可执行文件到开发板的 sbin 目录下--路径 /tmp/usr/local/sbin


[root@XiaoLong sbin]# pwd
/work/360_WIFI/wpa_supplicant-2.5/wpa_supplicant/tmp/usr/local/sbin
[root@XiaoLong sbin]# cp ./* /work/nfs_root/sbin/
复制代码


(7)​ 拷贝生成的可执行文件到开发板的 bin 目录下


[root@XiaoLong sbin]# ls wpa_cli wpa_passphrase wpa_supplicant
[root@XiaoLong sbin]# cp ./* /work/nfs_root/bin/
复制代码

4.1 测试使用 WIFI 步骤

4.1.1 创建密码配置文件

在开发板根文件系统/etc/目录创建 wpa_supplicant.conf 文件 ,输入以下内容:
# WPA-PSK/TKIP
ctrl_interface=/var/run/wap_supplicant ap_scan=1 update_config=1
network={
ssid="208"
key_mgmt=WPA-PSK
proto=WPA
pairwise=TKIP CCMP
group=TKIP CCMP #
priority=2
psk="www.linux.com"
}
复制代码

4.1.2 创建网卡控制接口

在开发板终端输入:


[root@XiaoLong /]#mkdir /var/run/wap_supplicant -p
复制代码

4.1.3 插入 360wifi 测试

 将 360WIFI 插入开板 USB 口,安装 WIFI 驱动:
[root@XiaoLong /driver/360wifi]# insmod mt7601Usta.ko
[ 47.260000] rtusb init rt2870 --->
[ 47.260000] usbcore: registered new interface driver rt2870
[ 94.105000] usb 1-2.2: new high-speed USB device number 7 using s5p-ehci
[ 94.220000] usb 1-2.2: New USB device found, idVendor=148f, idProduct=760b
[ 94.220000] usb 1-2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 94.220000] usb 1-2.2: Product: 802.11 n WLAN
[ 94.220000] usb 1-2.2: Manufacturer: MediaTek
[ 94.220000] usb 1-2.2: SerialNumber: 1.0
[ 94.225000] <-- RTMPAllocTxRxRingMemory, Status=0
[ 94.230000] <-- RTMPAllocAdapterBlock, Status=0
[ 94.235000] BULK IN MaxPacketSize = 512 [ 94.235000] EP address = 0x84
[ 94.240000] BULK IN MaxPacketSize = 512
[ 94.245000] EP address = 0x85
[ 94.245000] BULK OUT MaxPacketSize = 512 [ 94.250000] EP address = 0x 8
[ 94.255000] BULK OUT MaxPacketSize = 512 [ 94.255000] EP address = 0x 4
[ 94.260000] BULK OUT MaxPacketSize = 512 [ 94.265000] EP address = 0x 5
[ 94.265000] BULK OUT MaxPacketSize = 512 [ 94.270000] EP address = 0x 6
[ 94.275000] BULK OUT MaxPacketSize = 512
[ 94.280000] EP address = 0x 7
[ 94.280000] BULK OUT MaxPacketSize = 512
[ 94.285000] EP address = 0x 9
查看识别成功的网卡:
[root@XiaoLong /driver/360wifi]# iwconfig lo no wireless extensions.
ra0 Ralink STA sit0 no wireless extensions.
eth0 no wireless extensions.
ip6tnl0 no wireless extensions.
复制代码

4.1.4 启动网卡

[root@XiaoLong /]# wpa_supplicant -Dwext -ira0 -c /etc/wpa_supplicant.conf -B
[ 257.765000] Current MAC: =00:87:46:19:8f:eb
[ 257.780000] NICReadEEPROMParameters: RxPath = 1, TxPath = 1
[ 257.790000] 20MHz BW, 2.4G band-03030505, Adata = 03030505, Gdata = 03030505 [ 257.790000] 20MHz BW, 2.4G band-00000004, Adata = 00000004, Gdata = 00000004
[ 257.795000] 20MHz BW, 2.4G band-00000002, Adata = 00000002, Gdata = 00000002
[ 257.800000] 20MHz BW, 2.4G band-00000002, Adata = 00000002, Gdata = 00000002
[ 257.800000] 20MHz BW, 2.4G band-ffff0002, Adata = ffff0002, Gdata = ffff0002
[ 258.020000] BuildChannel # 1 :: Pwr0 = 16, Pwr1 =0, Flags = 0
BuildChannel # 2 :: Pwr0 = 16, Pwr1 =0, Flags = 0
BuildChannel # 3 :: Pwr0 = 16, Pwr1 =0, Flags = 0
BuildChannel # 4 :: Pwr0 = 16, Pwr1 =0, Flags = 0
BuildChannel # 5 :: Pwr0 = 17, Pwr1 =0, Flags = 0
BuildChannel # 6 :: Pwr0 = 17, Pwr1 =0, Flags = 0
BuildChannel # 7 :: Pwr0 = 17, Pwr1 =0, Flags = 0
BuildChannel # 8 :: Pwr0 = 17, Pwr1 =0, Flags = 0
BuildChannel # 9 :: Pwr0 = 17, Pwr1 =0, Flags = 0
BuildChannel # 10 :: Pwr0 = 18, Pwr1 =0, Flags = 0
BuildChannel # 11 :: Pwr0 = 18, Pwr1 =0, Flags = 0
BuildChannel # 12 :: Pwr0 = 18, Pwr1 =0, Flags = 0
BuildChannel # 13 :: Pwr0 = 18, Pwr1 =0, Flags = 0
BuildChannel # 14 :: Pwr0 = 18, Pwr1 =0, Flags = 0
<==== rt28xx_init, Status=0
[ 258.075000] 0x1300 = 00064300
[root@XiaoLong /]# [ 260.380000] RSN_IE: f0b15003, len = 24
[ 260.380000] 0x0000 : dd 16 00 50 f2 01 01 00 00 50 f2 04 01 00 00 50
[ 260.380000] 0x0010 : f2 04 01 00 00 50 f2 02
[ 260.545000] Key = 71:62:76:2d:90:f1:7d:e4:76:57:c0:c7:e4:a8:fa:a8
[ 260.545000] Rx MIC Key = 00:00:00:00:00:00:00:00 [ 260.545000] Tx MIC Key = 00:00:00:00:00:00:00:00
出现上面红色部分的提示表示连接路由器成功!!
复制代码

4.1.5 查看连接成功的 WIFI 信息

[root@XiaoLong /]# iwconfig lo no wireless extensions.
ra0 Ralink STA ESSID:"208" Nickname:"MT7601STA" 连接模式是 STA,连接上的路由器名称是 208
Mode:Managed Frequency=2.437 GHz Access Point: D0:C7:C0:D4:84:12
Bit Rate=135 Mb/s
RTS thr:off Fragment thr:off
Encryption key:7162-762D-90F1-7DE4-7657-C0C7-E4A8-FAA8 [3] Security mode:restricted Security mode:open
Link Quality=100/100 Signal level:-27 dBm Noise level:-27 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
4.1.6 配置网卡地址信息
① [root@XiaoLong /]# ifconfig ra0 192.168.18.123 broadcast 192.168.18.255 netmask 255.255.0.0 up



② [root@XiaoLong /]# ifconfig ra0
Link encap:Ethernet HWaddr 00:87:46:19:8F:EB inet addr:192.168.18.123 Bcast:192.168.255.255 Mask:255.255.0.0 配置成功 inet6 addr: fe80::287:46ff:fe19:8feb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:124367 errors:0 dropped:0 overruns:0 frame:0 TX packets:175 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000
RX bytes:26249317 (25.0 MiB) TX bytes:10673 (10.4 KiB)
复制代码

4.1.6 配置网卡地址信息

① [root@XiaoLong /]# ifconfig ra0 192.168.18.123 broadcast 192.168.18.255 netmask 255.255.0.0 up



② [root@XiaoLong /]# ifconfig ra0
Link encap:Ethernet HWaddr 00:87:46:19:8F:EB inet addr:192.168.18.123 Bcast:192.168.255.255 Mask:255.255.0.0 配置成功 inet6 addr: fe80::287:46ff:fe19:8feb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:124367 errors:0 dropped:0 overruns:0 frame:0 TX packets:175 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000
RX bytes:26249317 (25.0 MiB) TX bytes:10673 (10.4 KiB)
复制代码

4.1.7 配置网关信息

[root@XiaoLong /]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 0.0.0.0 255.255.0.0 U 0 0 0 ra0
复制代码


查看路由表信息:


[root@XiaoLong /]# iproute
192.168.0.0/16 dev ra0 src 192.168.18.123
复制代码


如果没有无线网卡的网关信息,需要自己添加一个:


[root@XiaoLong /]# route add default gw 192.168.18.1
复制代码

4.1.8 ping 外网 IP 测试

前提是当前连接的 WIFI 可以连接互联网。


202.108.22.5 是百度的 IP 地址。


[root@XiaoLong /]# ping 202.108.22.5
PING 202.108.22.5 (202.108.22.5): 56 data bytes
64 bytes from 202.108.22.5: seq=0 ttl=51 time=51.431 ms
64 bytes from 202.108.22.5: seq=1 ttl=51 time=44.511 ms
64 bytes from 202.108.22.5: seq=2 ttl=51 time=95.936 ms 64 bytes from 202.108.22.5: seq=3 ttl=51 time=46.402 ms
复制代码

4.1.9 实现 ping 域名

在/etc/目录下创建一个 resolv.conf 文件,输入 DNS 地址,如下:


nameserver 192.168.1.1 nameserver 202.96.134.33
复制代码


说明:一般写本地网关就可以了,也就是保留 nameserver 192.168.1.1


也可以直接在串口终端使用命令创建并且写入内容。如下:


[root@XiaoLong /]# echo nameserver 192.168.1.1 >> /etc/resolv.conf
[root@XiaoLong /]# echo nameserver 202.96.134.33 >> /etc/resolv.conf
复制代码


开发板中要想 ping 通外网 IP,需要设置默认网关,这个网关必须要和所连接的路由器设置的网关相同(resolv.conf 文件内容一般可以自动获取,不用手动填)。


ping 百度示例:


[root@XiaoLong /]# ping www.baidu.com
[ 2742.105000] CmdThread : CMDTHREAD_SET_ASIC_WCID : WCID = 1, SetTid = 400000, DeleteTid = ffffffff.
[ 2742.105000] 1-MACValue= d4c0c7d0,
[ 2742.105000] 2-MACValue= 411284,
PING www.baidu.com (119.75.218.70): 56 data bytes
64 bytes from 119.75.218.70: seq=0 ttl=51 time=55.509 ms 64 bytes from 119.75.218.70: seq=1 ttl=51 time=53.253 ms 64 bytes from 119.75.218.70: seq=2 ttl=51 time=62.990 ms
64 bytes from 119.75.218.70: seq=3 ttl=51 time=44.665 ms
复制代码

4.2.0 自动获取 IP 地址

使用 busybox 的 udhcpc 工具。一般默认的配置都是选中的,为了确保成功,还是需要去确认一下。


1. 首先配置 linux 内核使其支持 DHCP,以及 socket:
[*] Networking support ---><*> Packet socket
[*] IP: DHCP support
[*] Network packet filtering framework (Netfilter) --->
2. 配置 busybox:
Networking Utilities ---> udhcp Server/Client --->
[ * ] udhcp Server (udhcpd) udhcp Client (udhcpc)
[ * ] Lease display utility (dumpleases)
[ * ] Log udhcp messages to syslog (instead of stdout)
[ * ] Compile udhcp with noisy debugging messages
3. 编译安装 busybox
make
make install
4. 编译完并安装 busybox 后,将 busybox 源码目录下的 example/udhcpc/simple.script 脚本文件 cp 到根文件系统的/usr/share/udhcpc/default.script 文件中。
如果没有目录先创建目录:
[root@XiaoLong /]#mkdir /usr/share/udhcpc -p
5. 自动获取 IP:
[root@XiaoLong /]# udhcpc -i ra0 udhcpc (v1.23.2) started
Setting IP address 0.0.0.0 on ra0 Sending discover...
Sending select for 192.168.1.10...
Lease of 192.168.1.10 obtained, lease time 7200
Setting IP address 192.168.1.10 on ra0 Deleting routers
route: SIOCDELRT: No such process
Adding router 192.168.1.1 获取的 IP 地址
Recreating /etc/resolv.conf 自动更新 resolv.conf 文件
Adding DNS server 211.162.66.66
Adding DNS server 211.162.77.77
6. 查看获取到的 IP:
[root@XiaoLong /]# ifconfig ra0
Link encap:Ethernet HWaddr 00:87:46:19:8F:EB inet addr:192.168.1.10 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::287:46ff:fe19:8feb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:260636 errors:0 dropped:0 overruns:0 frame:0 TX packets:528 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000
RX bytes:55031927 (52.4 MiB) TX bytes:33119 (32.3 KiB)
7. ping 百度测试:
复制代码



自动获取 IP 也可以使用第三方其他工具(一般使用 busybox 自带的即可):


下载 DHCP 源码,编译后得到 dhclient 工具,实现 DHCP client.


(1) 下载源码:http://gd.tuwien.ac.at/infosys/servers/isc/dhcp/ ,选中 dhcp-3.1.3.tar.gz;


(2) 解压 tar -zxvf dhcp-3.1.3.tar.gz,然后进入./dhcp-3.1.3/,运行配置./configure,之后生成 work.linux-2.2 文件夹, 进入 work.linux-2.2/client/,输入 make "CC=arm-linux-gcc -static",将编译生成 dhclient。


(3) 拷贝生成的 dhclient 到 mini2440 开发板上,为方便使用,可以放在/usr/bin/下;拷贝另外两个配置文件到开发板,分别是 /dhcp-3.1.3/client/dhclient.conf 和/dhcp-3.1.3/client/scripts/linux 到开发板的/sbin/目录下。并改名后一个文件为 dhclient-script ,并修改该文件的第一行 #! /bin/bash 为 #! /bin/sh ,保存后,修改权限 chmod +x /sbin/dhclient-script。


(4) 为 eth0 或者 wlan0 配置 dhcp 服务,输入 dhclient eth0 或者 dhclient wlan0 即可.

4.2.1 开机自动加载连接路由器

可以将以下代码加载到 etc/profile 文件里或者是/etc/rcS 文件里,开机自动执行。


insmod mt7601Usta.ko #安装驱动
wpa_supplicant -Dwext -ira0 -c /etc/wpa_supplicant.conf -B #启动网卡
udhcpc -i ra0 #自动获取 IP 地址--busybox 自带的工具
复制代码

5.1 其他工具移植方法

5.1.1 安装 flex 工具库

系统自带的 flex 库版本太低,需要升级!


Flex 是一个高效、免费的开源框架,可用于构建具有表现力的 Web 应用程序,这些应用程序利用 Adobe Flash Player 和 Adobe AIR, 可以实现跨浏览器、桌面和操作系统。虽然只能使用 Flex 框架构建 Flex 应用程序,但 Adobe Flash Builder(之前称为 Adobe Flex Builder?)软件可以通过智能编码、交互式遍历调试以及可视设计用户界面布局等功能加快开发。


下载链接:http://sourceforge.net/projects/flex/files/




将下载的压缩文件拷贝至虚拟机,解压,配置,编译安装。


[root@XiaoLong 360_WIFI]# tar xvf flex-2.6.0.tar.bz2
[root@XiaoLong 360_WIFI]# cd flex-2.6.0
[root@XiaoLong flex-2.6.0]# ./configure
[root@XiaoLong flex-2.6.0]# make && make install
复制代码




5.1.2 安装 bison

下载链接:http://ftp.gnu.org/gnu/bison/


GNU bison 是属于 GNU 项目的一个语法分析器生成器。


GNU Bison 是一种通用目的的分析器生成器。它将 LALR(1)上下文无关文法的描述转化成分析该文法的 C 程序。 一旦你精通 Bison,你可以用它生成从简单的桌面计算器到复杂的程序设计语言等等许多语言的分析器。



将下载好的 bison-3.0 .tar.gz 压缩包拷贝到虚拟机解压,解压后,进入到解压后的目录,配置,编译,安装。


[root@XiaoLong bison-3.0]# ./configure
[root@XiaoLong bison-3.0]# make && make install
复制代码





5.1.3 安装 libnl 库

libnl 套件是 netlink 库提供 api 的集合协议基于 Linux 内核的接口。


Netlink IPC 机制主要是在内核和用户空间之间提供接口。 它被设计为一个更灵活的 ioctl 的继任者,主要提供网络相关的内核配置和监控接口。


下载链接:http://www.infradead.org/~tgr/libnl/



将下载后的 libnl-3.2.25.tar.gz 压缩包拷贝到虚拟机,解压,配置,编译,安装。


 [root@XiaoLong work]# tar xvf libnl-3.2.25.tar.gz
[root@XiaoLong libnl-3.2.25]# ./configure --host=arm-linux --prefix=$PWD/tmp
--prefix=$PWD/tmp :表示指定编译安装的路径 ---安装路径为当前目录的tmp文件夹
--host=arm-linux :指定编译器[root@XiaoLong libnl-3.2.25]# make && make install
复制代码






5.1.4 拷贝依赖库

Libnl 库安装成功之后,在 tmp 目录下会生成 lib 目录。


1将lib目录下的文件拷贝一份到系统交叉编译路径下的lib目录里
2将lib目录下的文件拷贝一份到开发板的根文件系统lib目录里
3将libnl库下include目录下的文件,拷贝一份到交叉编译器的include目录
[root@XiaoLong libnl-3.2.25]# cp tmp/lib/* /work/nfs_root/lib/ -rf -d
[root@XiaoLong libnl-3.2.25]#
cp tmp/include/* /work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/include/ -rf

[root@XiaoLong libnl-3.2.25]#
cp tmp/lib/* /work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/ -rf -d
复制代码


发布于: 刚刚阅读数: 4
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022-01-06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
Linux 驱动开发:USB无线wifi驱动开发(MT7601)、完成WIFI管理工具安装_10月月更_DS小龙哥_InfoQ写作社区