fl2440添加rt3070wifi模块--关于sta模式

//

主机操作系统:CentOS6.7

终端调试:SecureCRT6.0

内核:linux-3.0

开发板:fl2440

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

//

目的:实现RT3070无线网卡STA模式并使开发板接入Wifi上网
RT3070的工作模式分为 STA(station)模式、SoftAP(Access Point)模式两种。
STA模式:STA就是站点,每一个连接到无线网络中的终端(如笔记本电脑、 PDA及其它可以联网的用户设备)都可称为一个站点。
AP模式:AP也就是无线接入点,是一个无线网络的创建者,是网络的中心节点。一般家庭或办公室使用的无线路由器就是一个AP。
所以我们的驱动有两种,分别支持无来线网卡工作在STA模式和AP模式。因为linux3.0以上的内核中已经含有了RT3070的通用驱动框架mac80211,所以直接基于此并借助wpa_suppicant软件来实现(使能)Wifi的STA模式。
1.需要的文件:
https://hewlettpackard.github.io/wireless-tools/wireless_tools.29.tar.gz
ftp://ftp.openssl.org/source/openssl-1.0.0t.tar.gz
http://w1.fi/releases/wpa_supplicant-0.7.3.tar.gz
https://coding.net/u/sfantree/p/self_use_OSS/git/raw/master/source/rt2870.bin

2.配置linux内核支持无线上网
[*] Networking support  --->
-*-   Wireless  --->
<*>   cfg80211 - wireless configuration API
                [*]     enable powersave by default
                [*]     cfg80211 wireless extensions compatibility
                [*]   Wireless extensions sysfs files
                [*]   Common routines for IEEE802.11 drivers
                <*>   Generic IEEE 802.11 Networking Stack (mac80211)

Device Drivers  --->
        Generic Driver Options  --->
               [*]   Include in-kernel firmware blobs in kernel binary 
[*] Network device support  --->
        [*]   Wireless LAN  --->
               <*>   IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP)                    
                [*]     Support downloading firmware images with Host AP driver                   
                [*]       Support for non-volatile firmware download
          <*>   Ralink driver support  ---> 
                                 <*>   Ralink rt27xx/rt28xx/rt30xx (USB) support
                                        [*]   Ralink debug output
##注意M选项的一定要改成*,即按y选取。M代表模块化(module),即要通过insmod加载.ko文件,*代表编译进内核.
如果M选项没改成*,就会出现错误usb 1-1.1: device descriptor read/64, error -62



3.加载没配置支持无线上网的内核,插上rt3070时的情况
>: usb 1-1.1: new full speed USB device number 3 using s3c2410-ohci
>: lsusb 
Bus 001 Device 001: ID 1d6b:0001
Bus 001 Device 002: ID 05e3:0606
Bus 001 Device 003: ID 148f:3070
>: ifconfig wlan0
ifconfig: wlan0: error fetching interface information: Device not found

//因为没添加设备驱动,自然找不到设备

4.配置后的内核,插上rt3070时的情况:
>: usb 1-1.1: USB disconnect, device number 4
usb 1-1.1: new full speed USB device number 4 using s3c2410-ohci
phy1 -> rt2x00_set_chip: Info - Chipset detected - rt: 3070, rf: 0005, rev: 0201.
>: lsusb
Bus 001 Device 001: ID 1d6b:0001
Bus 001 Device 002: ID 05e3:0606
Bus 001 Device 004: ID 148f:3070
>: ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr 00:22:C0:2F:E7:7A  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
//添加设备驱动后,设备与驱动相互匹配,因此可以查看到设备信息,但是还不能够使能,原因是缺少固件.

5.无线网络配置工具wireless tools的移植,以及   openssl和wpa_supplicant的移植(注意先要移植openssl,再移植wpa_supplicant,因为后者依赖于前者的生成库文件)
目前可以使用wireless-tools或wpa_supplicant工具来配置无线网络。但要注意对无线网络的配置是全局性的,而非针对具体的接口,所以wpa_supplicant是一个较好的选择,但缺点是它不支持所有的驱动。另外,wpa_supplicant目前只能连接到那些你已经配置好ESSID的无线网络。而wireless-tools支持几乎所有的无线网卡和驱动,但它不能连接到那些只支持WPA的AP。现在大部分路由器都使用wpa加密,所以使用iwconfig无论怎么设置都无法连接到路由器AP上,除非路由器设置了WEP加密或者不设置密码。


5.1 wireless tools的移植(在这个sta模式中,用不用都无所谓,因为主要用wpa_supplicant来配置


tar zxvf wireless_tools.29.tar.gz
cd wireless_tools.29
vim Makefile
 

[html]  view plain  copy
  1. <span style="font-size:18px;"> 7 ifndef PREFIX  
  2.   8   PREFIX = /home/luminqi/fl2440/3rdparty/wirelesstool  
  3.   9 endif  
  4.  10   
  5.  11 ## Compiler to use (modify this for cross compile).  
  6.  12 CC = /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc  
  7.  13 ## Other tools you need to modify for cross compile (static lib only).  
  8.  14 AR = /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ar  
  9.  15 RANLIB = /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ranlibspan>  

make
make install
移植动态库文件到开发板的/lib
/home/luminqi/fl2440/3rdparty/wirelesstool/lib/libiw.so.29
移植命令工具到开发板的/bin
/home/luminqi/fl2440/3rdparty/wirelesstool/sbin/iwconfig(还有iwevent iwgetid iwlist iwpriv iwspy)


5.2 openssl移植(直接解压缩得到的Makefile不能编译成功,估计太旧,因此要重新配置Makefile,查看README,里面说明Unix类的安装说明在INSTALL文件里)

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


tar zxvf openssl-1.0.0t.tar.gz
cd openssl-1.0.0t
./config no-asm shared --prefix=/home/luminqi/fl2440/3rdparty/openssl  

/*no-asm 是在交叉编译过程中不使用汇编代码代码加速编译.原因是它的汇编代码对arm格式不支持.shared 生成动态链接库*/

vim Makefile

[html]  view plain  copy
  1. <span style="font-size:18px;">CC= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc  
  2. /*必须删掉"CFLAG=......"中的"-m64",因为,我的CentOS是x86-64,则默认的是x86-64体系,即使设置了交叉编译环境,还是会默认这个体系.*/  
  3. AR= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ar $(ARFLAGS) r  
  4. RANLIB= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ranlib  
  5. NM= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-nmspan>  

make
make install

//openssl移植

参考链接:http://blog.csdn.net/miaodichiyou/article/details/50385049


将下面两个动态库文件移植到开发板/lib下
/home/luminqi/fl2440/3rdparty/openssl/lib/libcrypto.so.1.0.0
/home/luminqi/fl2440/3rdparty/openssl/lib/libssl.so.1.0.0


5.3 wpa_supplicant移植(同样查看README)

//wpa_supplicant就是WiFi驱动和用户的中转站外加对协议和加密认证的支持

tar zxvf wpa_supplicant-0.7.3.tar.gz
cd wpa_supplicant-0.7.3
cd wpa_supplicant
cp defconfig .config

vim .config

[html]  view plain  copy
  1. 25 #### sveasoft (e.g., for Linksys WRT54G) ######################################  
  2. 26 #CC=mipsel-uclibc-gcc  
  3. 27 #CC=/opt/brcm/hndtools-mipsel-uclibc/bin/mipsel-uclibc-gcc  
  4. 28 #CFLAGS += -Os  
  5. 29 #CPPFLAGS += -I../src/include -I../../src/router/openssl/include  
  6. 30 #LIBS += -L/opt/brcm/hndtools-mipsel-uclibc-0.9.19/lib -lssl  
  7. 31 ###############################################################################  
  8. 32 CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc  -L/luminqi/fl2440/3rdparty/openssl/lib/  
  9. 33 CFLAGS += -I/home/luminqi/fl2440/3rdparty/openssl/include/  
  10. 34 LIBS += -L/home/luminqi/fl2440/3rdparty/openssl/lib  
make
这里可以不用make install,直接在解压缩目录下查找文件.
移植下列命令工具到开发板的/bin
/home/luminqi/rt3070/sta/wpa_supplicant-0.7.3/wpa_supplicant/ wpa_cli
/home/luminqi/rt3070/sta/wpa_supplicant-0.7.3/wpa_supplicant/ wpa_passphrase
/home/luminqi/rt3070/sta/wpa_supplicant-0.7.3/wpa_supplicant/ wpa_supplicant

wpa_supplicant是核心程序,它和wpa_cli的关系就是服务和客户端的关系:后台运行wpa_supplicant,使用wpa_cli来搜索、设置、和连接网络。

一般的无线接入点可以用wpa_passphrase来自动生成




6.加载固件rt2870.bin,初始化rt3070无线网卡并使能
通常情况下,load firmware的动作是通过用户空间的hotplug handler,也就是/proc/sys/kernel/hotplug里设定的执行档来完成。我们可以在/etc/init.d/rcS里将/proc/sys/kernel/hotplug设定为/sbin/mdev,即busybox的mdev模块。首先rt3070设备向内核请求加载rt2870.bin,然后内核向用户空间(文件系统)发出通知,mdev在收到来自内核的请求加载rt2870.bin这个firmware的消息后,就会会在/lib/firmware目录下寻找rt2870.bin如果能找到就加载到内存中,再由驱动传输到rt3070芯片。传输完成后rt3070芯片进行初始化,初始化完成之后就可以使能.

##内核产生hotplug事件找firmware都是到/lib/firmware这个路径 ,这是固定的;rt2870.bin也不能够修改名称,因为rt3070设备只认识这个文件##

##谈谈个人对rt2870.bin这个固件的理解:因为Linux-3.0没有具体的rt3070驱动,只有基本构架的驱动,而基本构架的驱动只是做了一小部分初始化rt3070设备的工作,因此需要固件来继续完成所有的初始化工作.废话到此为止,下面是相关步骤:

1)文件系统的/etc/init.d/rcS最后加:"echo /sbin/mdev > /proc/sys/kernel/hotplug" 这样一句,可通过vi打开并写入。
2)加载rt2870.bin到开发板的/lib/firmware目录下(没有firmware则创建),tftp -gr rt2870.bin 192.168.1.2(Windows有线网卡IP)
3)ifconfig wlan0 up


7.制作连接WiFi的配置文件wpa_supplicant.conf,并通过此文件连接WiFi.
>: cd /apps/etc/wireless(没有此路径则创建相关目录,不一定要将此配置文件放在这里)
>: wpa_passphrase ssid psk >> wpa_supplicant.conf  (注意ssid是wifi的名称,psk是wifi密码)
>: vi wpa_supplicant.conf

作如下修改:

[html]  view plain  copy
  1. # WPA-PSK/TKIP    
  2. # wpa_supplicant -Dwext -iwlan0 -c/apps/etc/wireless/wpa_supplicant.conf   
  3. ctrl_interface=/var/run/wpa_supplicant    
  4. network={                                                                       
  5.         ssid="super318"                                                   
  6.         key_mgmt=WPA-PSK        //认证密钥管理协议                                                
  7.         proto=WPA                                                               
  8.         pairwise=TKIP CCMP        //加密方式  TKIP和CCMP是两种数据加密算法,在WPA和WPA2中都可以使用           #psk="5423874a"                                                      
  9.         psk=1acfb6ae7be84ad7d7a040b7d5423874ae8fb1f29aac239037c680a59d93214d    
  10. }  

>: ifconfig eth0 down  (禁用eth0,不禁用就会默认eth0连接WiFi,会出错)
>: wpa_supplicant -Dwext -iwlan0 -c/apps/etc/wireless/wpa_supplicant.conf &    //连接WiFi
[html]  view plain  copy
  1. >: Trying to associate with c8:e7:d8:1d:1a:e8 (SSID='super318' freq=2412 MHz)  
  2. phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 2 - CWmin: 4, CWmax: 10, Aifs: 3, TXop: 0.  
  3. phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 3 - CWmin: 4, CWmax: 10, Aifs: 7, TXop: 0.  
  4. phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 1 - CWmin: 3, CWmax: 4, Aifs: 2, TXop: 94.  
  5. phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 0 - CWmin: 2, CWmax: 3, Aifs: 2, TXop: 47.  
  6. Associated with c8:e7:d8:1d:1a:e8  
  7. WPA: Key negotiation completed with c8:e7:d8:1d:1a:e8 [PTK=CCMP GTK=CCMP]  
  8. CTRL-EVENT-CONNECTED - Connection to c8:e7:d8:1d:1a:e8 completed (auth) [id=0 id_str=]  
-Dwext:wext是驱动名称,wext(Wireless Extensions无线扩展接口)

-iwlan0 :wlan0,网络接口名称

-c:指定配置文件的路径

7.1 手动设置无线网卡IP和子网掩码,实现ping通局域网内(同一网段)的ip
>: ifconfig wlan0 192.168.1.100 netmask 255.255.255.0     (注意要和WiFi的IP在同一网段,我这里WiFi是192.168.1.1)


>: ping 192.168.1.1   (wifi的ip)
PING 192.168.1.1 (192.168.1.1): 56 data bytes
64 bytes from 192.168.1.1: seq=2 ttl=64 time=83.188 ms
64 bytes from 192.168.1.1: seq=1 ttl=64 time=1089.456 ms
64 bytes from 192.168.1.1: seq=0 ttl=64 time=2095.726 ms
64 bytes from 192.168.1.1: seq=3 ttl=64 time=43.601 ms
64 bytes from 192.168.1.1: seq=4 ttl=64 time=43.651 ms
64 bytes from 192.168.1.1: seq=5 ttl=64 time=47.849 ms


--- 192.168.1.1 ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max = 43.601/567.245/2095.726 ms


>: ping 192.168.1.105    (Windows的无线网卡ip,前提是关掉防火墙和360)
PING 192.168.1.105 (192.168.1.105): 56 data bytes
64 bytes from 192.168.1.105: seq=0 ttl=128 time=48.168 ms
64 bytes from 192.168.1.105: seq=1 ttl=128 time=45.469 ms
64 bytes from 192.168.1.105: seq=2 ttl=128 time=47.548 ms
64 bytes from 192.168.1.105: seq=3 ttl=128 time=45.971 ms
64 bytes from 192.168.1.105: seq=4 ttl=128 time=52.497 ms


--- 192.168.1.105 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 45.469/47.930/52.497 ms




7.2 添加域名和网关实现ping通外网
在开发板目录/etc/创建一个resolv.conf的文件,因为在内核启动的时候内核会在resolv.conf文件中找DNS
>: vi resolv.conf

[html]  view plain  copy
  1. <span style="font-size:18px;">#search localdomain  
  2. nameserver 4.2.2.2  
  3. nameserver 8.8.8.8span>  

添加网关后试试
>: route add default gw 192.168.1.1
>: ping www.baidu.com
PING www.baidu.com (115.239.211.112): 56 data bytes
64 bytes from 115.239.211.112: seq=0 ttl=48 time=609.658 ms
64 bytes from 115.239.211.112: seq=1 ttl=48 time=326.596 ms
64 bytes from 115.239.211.112: seq=2 ttl=48 time=404.329 ms
64 bytes from 115.239.211.112: seq=3 ttl=48 time=268.019 ms
64 bytes from 115.239.211.112: seq=4 ttl=48 time=281.682 ms 



--- www.baidu.com ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 268.019/378.056/609.658 ms


8.自动(DHCP)设置无线网卡,包括无线网卡IP和子网掩码以及网关
1)内核部分,

[html]  view plain  copy
  1. <span style="font-size:18px;">Networking --->  
  2.     Networking support     
  3.     Networking options --->   
  4.            Packet socket                 //添加.配置CONFIG_PACKET  
  5.           [ * ]     IP: DHCP support         //添加动态获取IP  
  6.           [ * ] Network packet filtering (replaces ipchains)span>  

当然修改之后要重新移植内核

2)busybox部分

进入busybox,make menuconfig

[html]  view plain  copy
  1. <span style="font-size:18px;">[*]udhcp server(udhcpd)  
  2. [*]udhcp client(udhcpc)都选上  
  3. udhcpd就是终端设备作为DHCP服务器 ;udhcpc就是终端设备作为DHCP客户端  
  4. Networking Utilities --->                                              
  5.  [*] udhcp server (udhcpd)  //生成udhcpc命令 span>  

从busybox的examples/udhcp/下copy好simple.script文件到开发板/usr/share/udhcpc/下,并重命名为default.script.注意更改default.script的权限!

注:(busybox里面默认的目录文件是/usr/share/udhcpc/default.script)

>: chmod a+x default.script
>: wpa_supplicant -Dwext -iwlan0 -c/apps/etc/wireless/wpa_supplicant.conf &

3)动态获取IP地址:
>: udhcpc -i wlan0
udhcpc (v1.20.2) started
Setting IP address 0.0.0.0 on wlan0
Sending discover...
Sending select for 192.168.1.110...
Lease of 192.168.1.110 obtained, lease time 7200
Setting IP address 192.168.1.110 on wlan0
Deleting routers
route: SIOCDELRT: No such process
Adding router 192.168.1.1
Recreating /etc/resolv.conf
 Adding DNS server 210.42.144.100
 Adding DNS server 210.42.159.2

之后同样ping 192.168.1.1 ping 192.168.1.105 ping www.baidu.com验证即可

大致流程:

(用户空间)插上rt3070设备-->(内核空间)找到相关驱动(因为内核里并没有具体的rt3070驱动)与之匹配 -->/sbin/mdev加载固件(rt2870.bin)到内存,并传输到设备上,完成rt3070设备初始化-->(用户空间)使能网卡-->(用户空间)通过wpa_supplicant配置无线网卡-->无线网卡网卡可以正常工作.

你可能感兴趣的:(WiFi模块--ralink,rt3070)