本文描述如何将MT7601 WiFi模块移植到IMX6Q开发板上,分析移植过程中碰到的问题,分析错误原因,提供解决办法。
一、MT7601实物图
二、验证开发板和USB MT7601硬件是否正常
步骤1:将MT7601插入到IMX6Q开发板上
步骤2:在串口终端敲入命令lsusb
如下图所示,表示硬件上正常。
三、开发环境及准备资料
开发环境:ubuntu 14.04
准备资料
1)MT7601源码:DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2
2)工具:wireless_tools.29.tar.gz、libnl-3.4.0.tar.gz、openssl-1.0.1.tar.gz、wpa_supplicant-2.7.tar.gz
四、移植源码
1)将MT7601源码拷贝到共享文件夹,并解压
2)驱动源码修改及编译
A. 确认USB的VID和PID
源码路径:
/share/mt7601_wifi/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/common/rtusb_dev_id.c
B. 确认或修改网卡名称
源码路径:
/share/mt7601_wifi/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/include/rtmp_def.h
C.确认添加支持wpa_supplicant
源码路径:
/share/mt7601_wifi/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/os/linux/config.mk
D.修改Makefile
路径:
/share/mt7601_wifi/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/Makefile
其中LINUX_SRC是内核源码树、CROSS_COMPILE是交叉编译工具链前缀
E. 编译并生成驱动模块
命令:make clean && make –j2
编译中出错:
问题原因:我们指定的内核在配置时不支持802.11的无线设备驱动,这是因为前期在做裁剪的时候,将wireless部分不参与编译。
解决办法:
使能wireless部分参与编译,重新生成config文件,再编译Linux内核。
编译MT7601源码得到驱动安装文件:
路径:/share/mt7601_wifi/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/os/linux
文件:mt7601Usta.ko
F.将mt7601Usta.ko拷贝到rootfs文件
命令:cp ./mt7601Usta.ko /imx6q-c/rootfs-qt4/driver-test -f
五、移植iwconfig
A. 下载iwconfig源码
网址:
http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/wireless_tools.29.tar.gz
B. 将iwconfig源码拷贝到共享文件夹,并解压
C. 修改Makefile,指定交叉编译工具链和安装路径
修改前:
修改后:
C. 编译并安装
命令:make && make install
D. 检验时候安装成功
在rootfs下,输入相关命令,出现下图提示表示iwconfig工具已成功移植到rootfs。
六、移植wpa_supplicant
A. 下载wpa_supplicant源码
网址:
B. 将wap_supplicant-2.7.tar.gz拷贝到共享文件夹并解压
C. 进入到wpa_supplicant目录,并生成.config
D. 修改Makefile
修改前:
修改后:
E. 编译
命令:make
出现错误提示:
分析错误:找不到libnl-3.0.pc库文件、找不到openssl/ssl.h头文件
分析原因:可能在wpa_supplicant安装的过程中是要依赖其他库
解决办法:
1)将错误信息贴到浏览器进行搜索,查找解决办法
2)查看README文本,安装相匹配的版本
结论:在安装wpa_supplicant时是要先安装libnl、openssl,然后再修改Makefile,指定安装时加载的库文件和头文件。
七、移植libnl
A. 下载libnl源码
网址:
https://github.com/thom311/libnl/releases/download/libnl3_4_0/libnl-3.4.0.tar.gz
B. 将libnl-3.4.0.tar.gz拷贝到共享文件夹并解压
C. 进入到libnl-3.4.0目录进行配置
命令:
sudo ./configure --host=arm-linux --prefix=/share/mt7601_wifi/libnl_install --enable-static --enable-shared CC=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-linux-gcc
出现错误:
解决办法:
步骤1: 根据提示安装flex: sudo apt-get install flex
步骤2:再次进行配置
配置成功标志:
D. 编译并安装
命令:make && make install
E. 进入到安装目录 libnl_install
八、移植openssl
A. 下载源码
网址:
B. 将openssl-1.0.1.tar.gz拷贝到共享文件夹并解压
C. 进入到openssl-1.0.1目录修改Makefile
步骤1:修改安装目录
修改前:
修改后:
步骤2:修改交叉编译工具链
修改前:
修改后:
D. 编译和安装
命令:make && make install
出现错误:在编译完成后,进行安装时出现了错误。
分析原因:在安装docs出错了
解决办法:1)分析源码,解决安装出错的问题
2)由于我们不需要看openssl的手册,只是利用安装后的一些lib文件在编译wap_supplicant时使用。
选择第二种方法,修改Makefile,避开安装man手册。
修改Makefile:
修改前:
修改后:
E. 进入到安装目录:openssl_install
九、接着移植wpa_supplicant
F. 修改Makefile
修改前:
修改后:
G. 编译
命令:make
还是出现错误。
解决办法:
查找命令:find -name “libnl-3.0.pc”
添加环境变量:
export PKG_CONFIG_PATH="/share/mt7601_wifi/libnl_install/lib/pkgconfig:$PKG_CONFIG_PATH"
重新编译:在源码目录下生产一些工具文件:如 wpa_cli、wpa_passphrase、wpa_supplicant
H. 将工具wpa_cli、wpa_passphrase、wpa_supplicant拷贝到rootfs中
I. 在开发板控制台上验证wpa_supplicant工具
出现错误:
分析错误:在运行wpa_supplicant指令时找不到动态库。
通过查看wpa_supplicant是一个动态链接文件,在运行时依赖动态库。
解决办法:移植动态库 libnl-3.so.200, 从libnl_install/lib下移植到开发板rootfs中。
步骤1:在rootfs中创建文件夹usr/local/mt7601/lib用于存放mt7601库文件
/share/imx6q-c/filesystem/qt4/rootfs/usr/local/mt7601/lib
步骤2:添加到rootfs环境变量
修改/etc/qt_env_profile.sh
步骤3:拷贝libnl-3.so.200、libnl-genl-3.so.200到usr/local/mt7601/lib
步骤4:验证wpa_supplicant
表明成功移植wpa_supplicant。
十、在开发板上验证MT7601
步骤1:将MT7601模块插入到开发板的USB口上
步骤2:安装驱动程序
命令:insmod mt7601Usta.ko
步骤3:开启无线网卡
命令:ifconfig ra0 up
出现了错误。
错误分析:找不到/etc/Wireless/RT2870STA/RT2870STA.dat文件。
解决办法:查找RT2870STA.dat所在位置,将其拷贝到/etc/Wireless/RT2870STA目录下。
可知RT2870STA.dat在MT源码目录下。
再次启动无线网卡,成功启动,提示如下:
步骤4:连接无线网络
命令:wpa_supplicant -B -c /etc/wpa_supplicant.conf -i ra0
出现错误:
错误分析:找不到 /etc/wpa_supplicant.conf文件
解决办法:在/etc目录下创建wpa_supplicant.conf,并输入以下内容。
ctrl_interface=/var/run/wpa_supplicant
network={
key_mgmt=WPA-PSK
ssid="vip-01"
psk="12345678"
}
从wpa_supplicant.conf的内容可知,要在/var目录下要有run文件夹,于是创建目录/var/run。
再次连接无线网络。
出现错误:
解决办法:指定是Linux wireless extensions
wpa_supplicant -B -i ra0 -c /etc/wpa_supplicant.conf -Dwext
成功连接提示。
步骤5:查看连接状态
命令:wpa_cli -i ra0 status
成功连接上热点。
当前状态就是:wifi网卡已经启动并且连接上路由器了,但是本地没有ip地址
步骤6:设置ra0 IP地址
命令:ifconfig ra0 192.168.0.10
步骤7:ping网关
命令:ping 192.168.0.1
步骤8:ping 外网IP
命令:ping 8.8.8.8
不能ping通外网IP。
分析原因:需要配置网关
命令:route add default gw 192.168.0.1 dev ra0
步骤9:ping外网
命令:ping www.taobao.com
不能ping通,需要配置dns
修改/etc/resolv.conf
十一、设置开机自启动Wifi模块
步骤1:在/share/imx6q-c/filesystem/qt4/rootfs/etc/rc.d目录下创建rc.network文件
步骤2:修改rc.network内容为如下所示:
步骤3:修改/share/imx6q-c/filesystem/qt4/rootfs/etc/rc.d/rcS文件,使用rc.network文件被执行
步骤4:添加或修改/etc/network/interfaces文件
步骤5:修改interfaces文件为如下所示:
步骤6:确保配置了DNS,查看/etv/ resolv.conf
步骤7:以上是在ubuntu14.04中进行修改的,将修改后的rootfs 打包成rootfs.qt4.tar.bz2并烧录到开发板上,启机进行验证。
步骤8:使用烧录工具Mfgtools-Rel-13.01.00_ER_MX6Q_UPDATER进行烧录
步骤9:进行测试验证
动态分配得到的IP
ping 192.168.0.1
ping 8.8.8.8
ping www.taobao.com
通过以上验证,已成功移植MT7601 WIFI模块到IMX6Q开发板,并可以正常使用。
总结:
- 要具备linux下的开发基础,VI工具以及一些常用命令的使用,如:
ls、cd、pwd、mkdir、mv、cp、rm、find、grep、which、chmod、tar等
2. Linux下移植模块,一般流程:
源码下载、配置、交叉编译、部署安装、测试
3.测试过程中遇到问题与解决
1)ra0的配置和上网前,一定要先关掉eth0(ifconfig eth0 down),否则你ping或者设置等等都是默认使用的eth0而不是ra0。
2) 当我们wifi网卡连接上路由器后,想要ping通路由器(网关),必须本地wifi网卡有一个和网关同一网段的ip地址才可以。这个本地的ip地址可以dhcp分配,也可以手工配置一个。
3) 本地有了ip地址,并且wifi网卡通过wpa_supplicant配置连上路由器后,就能ping通网关了。但是这时还不能ping通外网,因为本地还没有添加网关配置。添加网关配置有两种方法:通过route命令动态添加,或者通过/etc/network/interfaces文件添加。
4) 添加网关后就能ping通外网IP了,但是还ping不通www.taobao.com等域名,因为还没有DNS。需要修改/etv/ resolv.conf文件。