1. 前期准备工作和移植环境搭建
1.1 移植环境的搭建
-
Ubuntu14.04(当然也可以用其他Ubuntu版本),作为源码编译环境,而且已经安装了交叉编译工具链;
-
用官方提供的内核源码,编译得到内核源码树(因为编译驱动需要内核源码的一些支持);
-
开发板可以通过nfs方式挂载到Ubuntu(编译后得到的.ko文件需要通过这种形式传到开发板中)。挂载命令:
mount -t nfs -o nolock,nfsvers=3 192.168.1.33:/home/lbh/nfs /mnt
192.168.1.33这个IP地址是我ubuntu的IP;而且nfs的共享目录每个人安装的也不一样,根据自己的ubuntu环境来设置。
1.2 移植前准备工作
-
获取官方的MT7601驱动源码:DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2
-
确认USB WIFI模块是否正常
把USB WIFI模块插入开发板中,然后使用lsusb命令查看系统是否识别到了这个模块,如果打印出如下的信息:
Bus 001 Device 003: ID 148f:7601
2. 驱动源码的修改和编译
2.1 确认USB WIFI驱动源码的vid、pid是否和设备模块的一样
源码包中 ./common/rtusb_dev_id.c
文件中有定义 vid、pid 参数。在文件的37行可以找到 vid、pid 的定义,代码如下。可以看到有定义 {USB_DEVICE(0x148f,0x7601)} 这个参数,是和WIFI模块一样的vid、pid。
/* module table */
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 */
{USB_DEVICE(0x148f,0x760b)},
#endif /* MT7601U */
{ }/* Terminating entry */
};
2.2 修改驱动源码的Makefile文件
-
确认驱动源码运行的目标平台
在Makefile文件的49行:PLATFORM = SMDK 需要定义,表示运行在三星平台上。
-
内核源码树路径和编译工具链路径修改
在275行有定义三星平台下的内核源码树路径和编译工具链的路径,修改为如下和自己开发环境相匹配的路径。
ifeq ($(PLATFORM),SMDK) #LINUX_SRC = /home/bhushan/itcenter/may28/linux-2.6-samsung #CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux- LINUX_SRC = /root/kernel/jiuding-kernel CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi- endif
-
修改WIFI网卡名称(也可以使用源码默认的名称)
常用的无线网卡名称有:rax、wlanx
对于mt7601驱动源码,要修改WIFI网卡名称,是在 ./include/rtmp_def.h 文件中的1601行有定义这个名称。
#define INF_MAIN_DEV_NAME “ra”
#define INF_MBSSID_DEV_NAME “ra”
-
添加wpa_supplicant支持
./os/linux/config.mk 这个文件中有一个宏定义配置支持这个功能的。在24行配置为y即可。
# Support Wpa_Supplicant # i.e. wpa_supplicant -Dralink HAS_WPA_SUPPLICANT=y
-
编译生成.ko驱动文件
编译生成的.ko文件就在./os/linux目录下。
3. mt7601驱动模块的安装和路由器端的基本概念
-
驱动模块安装
把编译好的.ko文件,通过nfs共享文件夹形式传输到开发板上,在开发板上执行 insmod 命令安装.ko文件即可。
-
确认 WIFI 驱动是否运行
安装完后使用
ifconfig -a
可以显示出所有的网卡名称,可以看到安装的WIFI网卡名称为 “ra0”。不过此时还不能使用
ifup ra0
命令打开这个无线网卡,因为还需要做一些配置文件才能打开。 -
iwconfig命令介绍
这个是linux下配置无线网卡的一个命令工具,不过这个命令集已经很老了,有些特性不支持,所以现在很少用。
-
路由器端的基本概念
- 路由器的WAN、LAN
- 无线参数:SSID(就是别人能看到的无线网络名称)、频段、模式
- 安全类型:WEP、WPA、WPA2
- 安全选项
- 加密算法
- PSK密码
4. 配置WIFI网卡
4.1 把相关配置文件复制到开发板
-
把源码目录下的 RT2870STA.dat 这个文件复制到开发板的
/etc/Wireless/RT2870STA
目录下(没有这几个目录的话,就自己新建)。注意:这个配置文件一定是要放在这个路径下的,不然会报错说找不到这个文件。 -
打开
/etc/wpa_supplicant.conf
这个配置文件(这个配置文件是 wpa_supplicant 这个命令工具本身的配置文件,和WIFI网卡无关),写入如下内容:ctrl_interface=/var/run/wpa_supplicant ap_scan=1 network={ key_mgmt=WPA-PSK # 使用什么密码方式。我试过配置为WPA2-PSK方式,但是连接不了手机热点 ssid="redmi" # 要接入的路由器WIFI名称,实验的时候我把手机作为AP psk="12345678" # WIFI密码 }
-
打开WIFI网卡。输入如下命令:
ifconfig ra0 up
我使用过
ifup ra0
命令,但是提示没有这个命令(不知道为什么)。
4.2 WIFI网卡相关配置
4.2.1 手工配置
-
连接路由器WIFI或者手机热点:
wpa_supplicant -B -c /etc/wpa_supplicant.conf -i ra0
因为我身边没有路由器,所以我是开手机热点进行连接的。
-
查看开发板WIFI连接状态:
wpa_cli -i ra0 status
-
手动指定WIFI的IP地址:
ifconfig ra0 192.168.43.100
指定了IP地址之后,开发板就可以和手机ping通了。不过一定要注意把开发板的有线网卡关闭了,不然就是默认使用有线网卡的。
-
配置网关:
但是此时还不能ping通外网的,因为还没有配置网关。配置网关命令如下:
route add default gw 192.168.43.1 dev ra0
配置网关后,此时就可以ping通外网了。比如:ping 8.8.8.8
-
配置DNS:
配置好网关之后,我们还是不能ping通 www.baidu.com 这类网站,因为还没有配置DNS服务器(就是把网站转换为一个对应的IP地址的服务器)。配置DNS如下:
-
打开 /etc/resolv.conf 这个文件
vi /etc/resolv.conf
-
在配置文件中写入 nameserver 192.168.43.1 这条语句即可。当然我们也可以配置为其他的DNS服务器。比如谷歌的 8.8.8.8 ;比如国内运营商的114.114.114.114
配置完DNS后,此时就可以ping通百度的域名、淘宝的域名等等了。
-
4.2.2 修改interfaces文件实现IP地址动态分配
打开 /etc/network/interfaces
这个文件,然后接着添加一下内容:
auto ra0
iface ra0 inet dhcp #指定动态分配IP地址,如果是动态分配IP,那么DNS服务器也会自动分配
#iface ra0 inet static
address 192.168.43.100 #如果是动态分配,那么这一句指定IP地址就不起作用
netmask 255.255.255.0
gateway 192.168.43.1
补充记录:上面这个配置内容,我一开始测试是可以实现IP地址自动分配的。但是后来又试了几次之后又不行了,我找了很久也找不到问题在哪。感觉应该是我后来不小心改了什么文件或者参数造成的,一时间这里不知道怎么回事。
4.3 修改启动文件实现开机即连接了WIFI
可以修改 /etc/init.d/rcS
的启动配置文件,从而实现开机就能连接上WIFI。不过九鼎科技提供的 rootfs 是在这个目录下建立一个个的子配置文件,然后rcS文件读入这些子配置文件,从而实现开机配置某些功能的需求。所以这里我也建立一个S44WIFI的子文件(名字S开头即可,然后随便取)。然后输入以下内容:(注意要修改文件权限有可执行权限)
# 安装WIFI驱动
insmod /home/mt7601Usta.ko
# 启动WIFI网卡
ifconfig ra0 up
# 连接路由器或者手机热点
wpa_supplicant -B -c /etc/wpa_supplicant.conf -i ra0
# 重启WIFI网卡
ifconfig ra0 down
ifconfig ra0 up
一开始我使用interfaces文件来动态分配IP地址,是可以的。但是不知道为什么后来又不行了,搞了很久不知道什么情况。所以上述的开机自动连接WIFI,然后动态分配IP没有实现。不过可以用下面的内容,实现开机指定一个IP地址连接WIFI,如下:
insmod /home/mt7601Usta.ko
ifconfig ra0 up
wpa_supplicant -B -c /etc/wpa_supplicant.conf -i ra0
# 指定WIFI网卡的IP
ifconfig ra0 192.168.43.100
# 配置网关
route add default gw 192.168.43.1 dev ra0
# 配置DNS服务
echo "nameserver 192.168.43.1" > /etc/resolv.conf
上面这份命令测试可以实现开机指定一个IP,然后实现连接 www.baidu.com 网址。