老规矩上笔记链接:
文档:项目4.基于MTK的7601 WIFI网卡在X210上...
链接:http://note.youdao.com/noteshare?id=5f494ebf7bf8d7b0a505449b5191a955&sub=3DE1E8BBCA75401897955BD3772C8AF3
总结:
所需资源:
涉及技术:
①、在官方的已经配置好的rootfs上配置USB WIFI
②、在自己定制的rootfs中移植USB WIFI
一.项目各项材料的准备和确认
1.1、MTK7601
联发科的低成本wifi解决方案。
1.2、无线网卡的配置和使用
(1)常用无线网卡工具介绍:iwconfig、iwlist、iwpriv、wpa_supplicant
(2)常见WIFI加密格式介绍和路由器端查看:WEP、WPA
(3)wpa_supplicant使用详解
(4)配置本地IP地址、网关、dns等并确认外网连接
1.3、确认环境
(可参考十六.linux开发之Kernel移植——内核的配置和编译原理)
首先要拿到开发板提供的官方linux+QT4.8镜像,这个内核之前我们做了很多修改(改了屏幕参数和更换触摸屏驱动),根文件系统则使用九鼎bsp提供的根文件
刷机:将官方linux+QT4.8镜像刷进开发板,具体刷机参考裸机篇
启动开发板,在终端中检查,输入ifconfig
如果开发板地址不是192.168.1.10,则使用ifconfig eth0 192.168.1.10设置
1.4 最后将ubuntu的nfs文件夹挂载到开发板文件系统中的opt文件夹下:
挂载测试
mount -t nfs -o nolock 192.168.1.141:/root/porting_x210/rootfs/rootfs /opt |
/这样就把rootfs文件夹 以 NFS的方式挂载到了/opt下。
//在opt中的操作就是在rootfs中的操作。
//注意最好不要挂载在/mnt目录下。最好在opt或者tmp下
//用了mnt就会导致共享文件夹不能使用。
1.5、网卡驱动源码确认
(1)DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2
1.6、USB WIFI网卡硬件确认
Bus 001 Device 003: ID 148f:7601
VID和PID主要功能就是用来识别设备,并挂接相应的驱动。
二..驱动源码修改及编译
在开发板跟文件系统中创建一个文件夹mt7601_wifi, 用于移植wifi
先make clean 清除
2.1、确认USB的VID和PID
(1)源码包中rtusb_dev_id.c文件,添加如下源码
vi DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/common/rtusb_dev_id.c
USB_DEVICE_ID rtusb_dev_id[] = {#ifdef RT6570{USB_DEVICE(0x148f,0x6570)}, /* Ralink 6570 */#endif /* RT6570 */{USB_DEVICE(0x148f, 0x7650)}, /* MT7650 */#ifdef MT7601U{USB_DEVICE(0x148f,0x6370)}, /* Ralink 6370 */{USB_DEVICE(0x148f,0x7601)}, /* MT 6370 */ // 我们的模块就是这个#endif /* MT7601U */{ }/* Terminating entry */};
2.2、修改Makefile
//linux内核源码树
2.3、修改网卡名字(可选)
(1)常用无线网卡名称:rax、wlanx
(2)修改include/rtmp_def.h文件
#define INF_MAIN_DEV_NAME "ra"
#define INF_MBSSID_DEV_NAME "ra"
2.4、添加wpa_supplicant支持
确保config.mk文件中WPA_SUPPLICANT=y
.
2.5、编译生成驱动模块
(1)清理&编译
make clean && make -j2
生成os/linux/mt7601Usta.ko就是驱动模块
modinfo命令用于显示kernel模块的信息
将生成的mt7601Usta.ko文件拷贝到我们的开发板根文件系统中的home目录下
三...USB WIFI网卡驱动源码简单分析
在windows下建立source insight工程,用来分析驱动源码
第一步:拿到一个新的驱动源码如何入手分析???
直接搜索module_init(模块入口)
继续跟踪rtusb_init函数中的usb_register,根据前面我们驱动学习,可以知道,这里是注册usb的driver,函数内部我们根本没必要深究,只需要研究rtusb_driver这个变量即可。
继续跟踪rtusb_driver,发现定义了两个,其中适合我们内核版本的是下面这一个:
这里肯定要定义这个宏MT7601U,但我们搜索了整个工程,发现没有该宏定义
猜想可能在linux下的Makefile中脚本文件可能有定义,故在linux网卡驱动源码目录下使用grep搜索该宏定义,找到了 ,故上面的条件成立。
我们这里继续跟踪一下ANDROID_SUPPORT这个宏,看看在哪里定义的,但我们搜索了整个工程,发现没有该宏定义,则猜想可能和上面一样
使用grep搜索该宏定义
四.WIFI网卡的配置过程1
上面我们已经将生成的mt7601Usta.ko文件拷贝到我们的开发板根文件系统中的home目录下
insmod xxx 装载ko文件,发现打印了很多信息,那怎么看出我们的驱动装载成功没有
使用ifconfig -a,查看信息,其中ra0就是我们的网卡设备文件
fconfig ra0 up用来打开这个网卡驱动(因为我们还没有对网卡进行配置,肯定是上不了网的)
4.1、iwconfig工具集的介绍和使用演示
如果使用iwconfig显示-sh: iwconfig: not found
参考这里解决:https://blog.csdn.net/zjf30366/article/details/84975180
需要的文件:
(1)linux下专用来配置无线网络的一些命令集
(2)因为iwconfig本身有一定限制,只支持一定的加密格式,在我们这里不用
五.WIFI网卡的配置过程
5.1、wpa_supplicant配置文件
如果你的系统中的没有wpa_supplicant的支持,即
如果使用wpa_supplicant 显示-sh: iwconfig: not found
参考这里移植wpa_supplicant解决,https://blog.csdn.net/zgrjkflmkyc/article/details/46122551
需要的文件:
移植成功后的终端使用wpa_
使用supplicant 命令如下:
(1)wpa_supplicant简介
(2)/etc/Wireless/RT2870STA/RT2870STA.dat
使用mkdir -p /etc/Wireless/RT2870STA 创建RT2870STA文件夹
其中配置文件RT2870STA.dat在之前的驱动源码里面有,在源码的根目录中。将RT2870STA.dat文件拷贝到/etc/Wireless/RT2870STA/文件夹中。
(3)修改 /etc/wpa_supplicant.conf文件
ctrl_interface=/var/run/wpa_supplicant network={ ssid="aliya" scan_ssid=1 key_mgmt=WPA-EAP WPA-PSK IEEE8021X NONE pairwise=TKIP CCMP group=CCMP TKIP WEP104 WEP40 psk="as5201314" }
其中key_mgmt是加密方式
ssid和psk则是wifi的账号和密码
5.2、网卡配置命令序列(依次输入以下命令)
① 、insmod mt7601Usta.ko //安装驱动程序
②、ifconfig ra0 up //开启无线网卡
③ 、wpa_supplicant -B -c /etc/wpa_supplicant.conf -i ra0 //连接无线网络连接手机热点,一直重复执行下面的连接操作,始终没有连接
解决方法:将手机热点AP要设置为2.4g才行,5g无法识别。
④ 、wpa_cli -i ra0 status //查看连接状态 出现以下,说明我们连接上了。
但还是不能上网,因为我们的ra0现在并没有IP地址,肯定是ping不通的
⑤ 、ifconfig ra0 192.168.43.200 //手动配置ip,同一网段
(因为手机wifi热点的ip是固定的192.168.43.1,故我们设置为同一网段)
配置网关,让RA0网卡能访问外网
方法①:使用如下命令
route add default gw 192.168.43.1 dev ra0 //配置网关ping 192.168.43.1 //ping 网关ping 8.8.8.8 //ping 外网
添加DNS域名解析(让能ping通baidu等域名)
vi /etc/resolv.conf // 添加一下内容,配置dns
nameserver 192.168.43.1
ping www.baidu.com //能ping通了。
注意:
1、ra0的配置和上网前,一定要先关掉eth0(ifconfig eth0 down),否则你ping或者设置等等都是默认使用的eth0而不是ra0.
2、当我们wifi网卡连接上路由器后,想要ping通路由器(网关),必须本地wifi网卡有一个和网关同一网段的ip地址才可以。这个本地的ip地址可以dhcp分配,也可以手工配置一个。
3、本地有了ip地址,并且wifi网卡通过wpa_supplicant配置连上路由器后,就能ping通网关了。但是这时还不能ping通外网,因为本地还没有添加网关配置。添加网关配置有2种方法:通过route命令动态添加,或者通过/etc/network/interfaces文件添加。
4、添加网关后就能ping通外网IP了,但是还ping不通www.baidu.com等域名,因为还没有dns。
六.WIFI网卡的配置过程3
方法②:通过静态配置方法
使用interfaces文件静态配置
(1)还是之前的操作,先让RA0连接到热点wifi
insmod mt7601Usta.ko //安装驱动程序
ifconfig ra0 up //开启无线网卡
mkdir /var/run//创建这个文件夹,用于存放wpa_supplicant.conf文件 不然去执行连接无线网络, 会有问题
wpa_supplicant -B -c /etc/wpa_supplicant.conf -i ra0 //连接无线网络
wpa_cli -i ra0 status //查看连接状态
(2)interface文件
第一步,编辑好interface文件
vi /etc/network/interfaces
# Configure Loopback auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp auto ra0 iface ra0 inet static address 192.168.43.20 #ra0网卡的ip,必须与热点wifi同一网段 netmask 255.255.255.0 gateway 192.168.43.1 #gateway网管用来ping外网
第二步,使interface文件生效(重启网卡),方法是先ifdown ra0然后ifup ra0
添加DNS域名解析(让能ping通baidu等域名)
vi /etc/resolv.conf // 添加一下内容,配置dns
nameserver 192.168.43.1
ping www.baidu.com //能ping通了。
总结:使用/etc/network/interfaces文件其实就是替代了手工配置时的ifconfig分配本地ip地址,和route添加网关这两步。
6.2、使用dhcp动态分配IP
(1)原理:路由器中有个dhcp服务器,本地有dhcp客户端
(2)前导步骤
insmod mt7601Usta.ko //安装驱动程序
ifconfig ra0 up //开启无线网卡
wpa_supplicant -B -c /etc/wpa_supplicant.conf -i ra0 //连接无线网络
wpa_cli -i ra0 status //查看连接状态
(3)当前状态就是:wifi网卡已经启动并且连接上路由器了,但是本地没有ip地址,所以没法ping通路由器。怎么办?我们这里使用dhcp分配一个本地ip。
方法1:命令行使用udhcpc命令来分配
意思是使用本地的ra0网卡的dhcp客户端
udhcpc -i ra0
方法2:使用interface文件选择dhcp模式然后重启网卡
vi /etc/network/interfaces
# Configure Loopback auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp auto ra0 iface ra0 inet dhcp address 192.168.43.20 #ra0网卡的ip,必须与热点wifi同一网段 netmask 255.255.255.0 gateway 192.168.43.1 #gateway网管用来ping外网
第二步,使interface文件生效(重启网卡),方法是先ifdown ra0然后ifup ra0
6.3、让开发板开机自动连上路由器上网
改/etc/init.d/rcS及其相关文件
在/etc/init.d/目录下新建S41wifi文件,添加一下信息。并将该文件赋值权限 chmod 777 S41wifi
mkdir /var/run insmod /home/mt7601Usta.ko ifconfig eth0 down ifconfig ra0 up wpa_supplicant -B -c /etc/wpa_supplicant.conf -i ra0 wpa_cli -i ra0 status ifdown ra0 ifup ra0
保证我们使用的interface文件里面是选择dhcp模式
然后重启开发板,在终端中看见系统启动开始就有RA0网卡的一系列部署信息,启动完毕后,ifconfig&&ping 都能完成,说明实现了。
七.在自己定制的rootfs中移植网卡
9.1、确认自己制作的rootfs并启动
(1)busybox交叉编译
(2)启动后直接nfs方式挂载文件夹形式的rootfs,测试ok后再做成镜像烧录
(3)挂载参数bootargs:
set bootcmd 'tftp 30008000 zImage; bootm 30008000'
setenv bootargs root=/dev/nfs nfsroot=192.168.1.141:/root/porting_x210/rootfs/rootfs ip=192.168.1.10:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200 |
一定记得save保存,然后重启开发板,应该就可以正常挂载根文件系统。
我们拷贝到tftp目录下的的linux系统目录为:/root/x210v3_bsp/kernel
拷贝zimage镜像到TFTP目录下,开发板重新启动,tftp方式自动更新系统。
root@wwj:~/x210v3_bsp/kernel# cp arch/arm/boot/zImage /tftpboot/ -f
9.2、需要的工具集确认
(1)iwconfig工具集:另外移植的,不是busybox中的
(2)dhcp工具集:是busybox中集成的,确认busybox的menuconfig中配置支持了这个
(3)wpa_supplicant工具集:另外移植的,不是busybox中的
9.3、交叉编译iwconfig
如果使用iwconfig显示-sh: iwconfig: not found
参考这里解决:https://blog.csdn.net/zjf30366/article/details/84975180
需要的文件:
使iwconfig等命令可以使用
八.移植wpa_supplicant并制作镜像1_2
8.1、交叉编译wpa_supplicant
(1)下载wpa_supplicant源码并配置编译。参考http://blog.csdn.net/hktkfly6/article/details/48949863
(2)下载配套版本的openssl并配置编译
(3)去掉配置NL相关的选项省去移植libnl。参考:http://www.cnblogs.com/helloworldtoyou/p/6145995.html
这里,默认我们的rootfs已经支持wpa_supplicant功能了
(1)还是之前的操作,先让RA0连接到热点wifi
insmod mt7601Usta.ko //安装驱动程序
ifconfig ra0 up //开启无线网卡
wpa_supplicant -B -c /etc/wpa_supplicant.conf -i ra0 //连接无线网络
出现问题: 当执行wpa_supplicant -B -c /etc/wpa_supplicant.conf -i ra0 显示rt28xx_close时。,解决方法如下
wpa_cli -i ra0 status //查看连接状态
这个错误来源于etc/wpa_supplicant.conf文件中的第一行内容
ctrl_interface=/var/run/wpa_supplicant network={ ssid="aliya" scan_ssid=1 key_mgmt=WPA-EAP WPA-PSK IEEE8021X NONE pairwise=TKIP CCMP group=CCMP TKIP WEP104 WEP40 psk="as5201314" }
我们的/var/目录下并没有run这个目录,故需要创建这个目录,然后重新执行连接无线网络。
ok 从新执行连接wifi的命令,可以了
和之前的WIFI网卡的配置过程一样,配置后,这里能ping通了。
让开发板开机自动连上路由器上网(和上面的配置过程一样)
改/etc/init.d/rcS及其相关文件
在/etc/init.d/目录下新建S41wifi文件,添加一下信息。并将该文件赋值权限 chmod 777 S41wifi
mkdir /var/run insmod /home/mt7601Usta.ko ifconfig eth0 down ifconfig ra0 up wpa_supplicant -B -c /etc/wpa_supplicant.conf -i ra0 wpa_cli -i ra0 status ifdown ra0 ifup ra0
保证我们使用的interface文件里面是选择dhcp模式
然后重启开发板,在终端中看见系统启动开始就有RA0网卡的一系列部署信息,启动完毕后,ifconfig&&ping 都能完成,说明实现了。
补充:ra0的配置和上网前,一定要先关掉eth0(ifconfig eth0 down),否则你ping或者设置等等都是默认使用的eth0而不是ra0.(但我们使用了NFS挂载跟文件系统,如果关闭eth0,则终端的跟文件系统会直接奔溃了,那怎么解决:制作ext2镜像并刷机测试)
九、制作ext2镜像并刷机测试
参考笔记一样的过程:二十.Linux开发之根文件系统构建及过程详解中的
==》十二、制作ext2格式的镜像并烧录启动
具体过程就不详细赘述了。镜像文件我也分享在这,可以直接使用:
这个镜像文件包括了让开发板开机MTK7601网卡自动连上路由器上网等配置
具体怎么配置的在上面我们使用九鼎官方的QT系统也做过,过程一样。
这里需要注意的是,在制作镜像的过程中 ,将S41wifi文件添加信息之后,要在rcS文件中以下做修改,然后再打包生成镜像烧录,因为镜像重启之后,只保存最初的状态和文件,所以,需要在制作镜像之前把这些步骤弄完成。
然后重启开发板,不用任何设置(在开机启动中就可以看见已经在配置我们的mtk7601网卡信息了),直接能ping通外网及其百度等域名,说明我们的基于MTK的USB WIFI网卡在X210上的移植和使用就搞定了。