一、移植准备
- 基本概念
移植之前首先搞清两个概念 :AP和STA,并且在下载wifi驱动源码时注意是STA还是 AP。
Wifi模块包括两种形式的拓扑结构:Infra(基础网)和Adhoc(自组网)。
- AP:也就是无线接入点,是一个无线网络创建者,是网络的中心节点。由AP组建,众 多 STA加入的无线网络就是Infra(基础网)。这种网络以AP为中心,网络中所有的通 信 都通过AP来转发。
- STA:连接到无线网络的站点。由两个及以上STA组建,网络中无AP的无线网络叫做 Adhoc(自组网)。所有的STA都可以直接进行通信。
下面我们的移植是以STA为例。
2.注意事项
在移植之前另一个要他特别注意的就是,网卡选择,市面上的无线网卡驱动(如TP-link)大多是不开源的,所以在选择一款无线网卡时一定要注意它是否有对应的驱动,驱动可以在github上找,如果找不到或者怕折腾就按照我下面的步骤,选择MTK原厂的驱动。原厂驱动支持的无线网卡:我是测过的是360二代,mt7601u,是支持的。TP-link不支持,360三代也不支持。
原厂驱动在官网可以下载:http://www.mediatek.com/。也可以在CSDN上下载http://download.csdn.net/detail/pchl33/7424755,需要3C币貌似....。
二、移植步骤
1.从官网http://www.mediatek.com/zh-CN/downloads/mt7601u-usb/下载驱动文件(国内可能比较慢),并copy到工作路径,然后解压,进去源码路径。
2.修改makefile文件
①注释第30行,取消PC平台。
②取消注释第49行,SMDK代表 三星开发板平台。
③第275行,修改linux源码路径以及指定交叉编译器。
注意此处linux内核源码一定要是经过编译的,不然会报错,android与Qt的Kernel源码是一样的,编译方法也相似只需修改配置文件在这里不详细说明如何编译Kernel。
3.打开include/rtmp_def.h,修改1604 和1605 行为下面。
4.打开common/rtusb_dev_id.c修改第42行,添加usb网卡的产品id和设备ID。关于如何查看网卡的id,插上网卡,在命令行中输入lsusb,可以看到设备的id,找到网卡的即可。并仿照其他的格式,在下图添加属于你的无线网卡的id就可以了。
5.查看“os/linux/config.mk”文件,确保“config.mk”文件中WPA_SUPPLICANT配置 如下图所示。
6.在DPO_MT7601U_LinuxSTA_3.0.0.4_20130913目录下执行以下命令编译源码,分别 输入“make clean”,“make -j2”命令。编译成功后如下图,生成可mt7601u.ko。
7.将“/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/os/linux/mt7601Usta.ko”拷贝到 开发板任意位置(建议跟RT2870STA放在一起)。在开发板的根文件系统中创建目录/etc/Wireless/RT2870STA/ ,将源码目录中的 RT2870STA.dat拷贝到刚才创建的etc/Wireless/RT2870STA/目录中。
8.插上无线网卡看到打印如下
9.加载驱动程序“mt7601Usta.ko”,如下图。命令:insmod mt7601Usta.ko
10 关闭以太网0,打开wlan0.
11 iwlist wlan0 scan查看附近无线网络。
可以开cell10 中看到ESSID = “hhw”的wifi,这是我自己用手机开的一个热点wifi.我们可以看到它的各项信息。包括MAC地址,协议,频段为2.4GHZ,采用WPA2加密(这个信息很重要,后面会用到)。
12得知wifi的相关信息后,我们开始准备连接wifi.修改/etc/wpa_supplicant.conf文件中的内容。根据上一步得到的信息配置无线网络。关于wpa_supplicant.conf如何写,可以百度参考官方历程,我这里只简单配置一下。
ctrl_interface=/var/run/wpa_supplicant
update_config=1
network={
proto=RSN
key_mgmt=WPA-PSK
ssid="hhw"
#psk="19951105"
psk=3bd7469add2a9b69f39f8a852e2cc6ad99ebae5d99d16ad502c4999172a9200a
}
关于上面的配置简单介绍一下:
Network里面是具体配置,SSID为wifi名字,可以通过wpa_passphrase工具来添加,也可以手动编写。
但是wpa2加密的psk(密码)必须通过wpa_passphrase来生成。
proto WPA2必须选择RSN,WPA 选WPA;
key_mgmt为WPA-PSK。
wpa_passphrase格式如下。
wpa_passphrase <yourAPssid> <yourpassphrase> > /etc/wpa_supplicant/wpa_supplicant.conf
13.执行命令wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf 执行命令udhcpc -i wlan0获取动态IP网关DNS。 到此,就可以ping通www.baidu.com了。
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf:
udhcpc -i wlan0:
Ping baidu.com:
14.可以看到,系统会不停打印一些消息,会影响我们输入命令,因此需要用如下命令设置一下
系统打印等级:
echo "4 4 1 7" >/proc/sys/kernel/printk
三:自动配置
以上就完成了所有的配置过程,但是每次我们连接wifi都需要完成以下几个步骤:
1.挂载驱动 #insmod mt7601Usta
2.关闭以太网0 #ifconfig eth0 down
3.打开wlan0 #ifconfig wlan0 up
4.加载配置文件 #wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf
5.动态分配IP #udhcpc -i wlan0
这样很麻烦,所以我们可以把这几个命令写入etc/init.d/rcS文件中。这样每次开机就会自动执行以上配置命令。
可以看到rcS脚本中的代码片段如上。我们只需增加一个脚本(关于如何编写shell脚本自行百度,这里只简单介绍一下)mt7601,然后添加到图中wifi setting 位置下的这个路径 /etc/init.d/mt7601
添加路径完成后,可以把eh0的启动脚本屏蔽,不屏蔽也没关系,因为我们的自动配置脚本会关闭eth0。
mt7601 Shell脚本内容如下
#!/bin/sh
echo “starting wifi driver......”
insmod /lib/modules/mt7601/mt7601Usta.ko
sleep 1
ifconfig eth0 down
sleep 1
ifconfig wlan0 up
sleep 1
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf
sleep 15
udhcpc -i wlan0
这样我们重启的时候就会发现wifi自动连上了,虽然很方便但是如果重启时无线网卡没有插入,那么会像下面一样报错。
以上就是所有过程,AP模式的编译和STA相似,就是配置有区别,有时间在更新。