基于s3c2440平台rt3070芯片工作在station模式

—————————————————————————————————————————————
主机操作系统:Centos 6.5
交叉编译器环境:arm-linux-gcc-4.5.4
开发板平台: FL2440
Linux内核版本: linux-3.0
开发模块:无线网卡 RT3070.
作者:hulu<1334528355@qq.com>

—————————————————————————————————————————————
笔者友情提醒:本文章是在fl2440开发板已经成功移植linux-3.0内核,和可读写的文件系统之上开发的,本次开发使用的是ubifs文件系统格式,且fl2440的DM9000网卡驱动和usb驱动已经成功移植,若还没成功移植DM9000网卡驱动和usb驱动的朋友请参考本人博客驱动开发部分。

实现RT3070无线网卡STA模式并使开发板接入Wifi上网
RT3070的工作模式分为 STA(station)模式、SoftAP(Access Point)模式两种:
STA模式:笔记本上无线网卡模式,用来连接到无线路由器上上网。通俗点说,就是客户端模式(笔记本)
AP模式:即作为无线路由器,提供其他用户接入 (路由器)

所以我们的驱动有两种,分别支持无来线网卡工作在STA模式和AP模式。因为linux3.0以上的内核中已经含有了RT3070的通用mac80211驱动框架,所以我首先直接基于此并借助wpa_suppicant软件来实现Wifi的STA模式。

一、配置Linux内核支持wireless无线上网

[*] Networking support —>
-*- Wireless —>

<*> cfg80211 - wireless configuration API
[ ] nl80211 testmode command
[ ] enable developer warnings
[ ] cfg80211 regulatory debugging
[*] enable powersave by default
[ ] cfg80211 DebugFS entries
[*] cfg80211 wireless extensions compatibility
[*] Wireless extensions sysfs files
{*} Common routines for IEEE802.11 drivers

[ ] lib80211 debugging messages
<*> Generic IEEE 802.11 Networking Stack (mac80211)
Default rate control algorithm (Minstrel) —>
[ ] Enable mac80211 mesh networking (pre-802.11s) support
[ ] Export mac80211 internals in DebugFS
[ ] Select mac80211 debugging features —>
Device Drivers —>
Generic Driver Options —>
(/sbin/hotplug) path to uevent helper

[ ] Maintain a devtmpfs filesystem to mount at /dev
[ ] Select only drivers that don’t need compile-time external firmware
[ ] Prevent firmware from being built
-*- Userspace firmware loading support
[*] Include in-kernel firmware blobs in kernel binary

() External firmware blobs to build into the kernel binary
[ ] Driver Core verbose debug messages
[ ] Managed device resources verbose debug messages
[*] Network device support —>
[*] Wireless LAN —>

<*> Ralink driver support —>
< > Ralink rt2500 (USB) support
< > Ralink rt2501/rt73 (USB) support
<*> Ralink rt27xx/rt28xx/rt30xx (USB) support
[ ] rt2800usb - Include support for rt33xx devices
[ ] rt2800usb - Include support for rt35xx devices (EXPERIMENTAL)
[ ] rt2800usb - Include support for rt53xx devices (EXPERIMENTAL)
[ ] rt2800usb - Include support for unknown (USB) devices
[*] Ralink debug output

注明:

a、cfg80211:
cfg80211 is the Linux 802.11 configuration API. cfg80211 replaces Wireless-Extensions. nl80211 is used to configure a cfg80211 device and is used for kernel <–> userspace communication. Wireless extensions is now in maintenance mode, no new features will be added to it, we’ll only fix bugs for it. cfg80211 is now feature-par complete with wireless-extensions, it actually has a lot more features that are simply not available and will never be available through wireless extensions. When implementing a cfg80211 driver wireless extensions support is still provided automatically for you through cfg80211 through CONFIG_CFG80211_WEXT. Distributions no longer needing wireless extensions can remove this and are encouraged to do so. cfg80211 also provides full regulatory support, this is done through wireless-regdb and the usage of CRDA.
All new Linux wireless drivers should be written targeting either cfg80211 for fullmac devices or mac80211 for softmac devices.
(摘自:http://wireless.kernel.org/en/developers/Documentation/cfg80211

b、Minstrel:
minstrel is a mac80211 rate control algorithm ported over from MadWifi which supports multiple rate retries and claimed to be one of the best, if not the best, rate control algorithm.
(自:http://wireless.kernel.org/en/developers/Documentation/mac80211/RateControl/minstrel/

c、hotplug
这里是支持热插拔。

d、Firmware
固件的目的是初始化,() External firmware blobs to build into the kernel binary这一选项可以加入固件路径。

e、[*] Ralink debug output
这个选项选了后容易出现下面的警告。
cfg80211: Calling CRDA to update world regulatory domain

二:插入RT3070无线网卡并加载新内核启动
1内核信息打印部分

usb 1-1.4: new full speed USB device number 5 using s3c2410-ohci
usb 1-1.4: New USB device found, idVendor=13d3, idProduct=3273
usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1.4: Product: 802.11 n WLAN
usb 1-1.4: Manufacturer: Ralink
usb 1-1.4: SerialNumber: 1.0
phy1 -> rt2x00_set_chip: Info - Chipset detected - rt: 3070, rf: 0005, rev: 0201.

2 使用lsusb命令查看:

~ >: lsusb
Bus 001 Device 001: ID 1d6b:0001
Bus 001 Device 002: ID 05e3:0606
Bus 001 Device 003: ID 148f:3070
~ >:

3 如果是热插拔的话会,在插入的那一刻,串口会打印如下信息:

~ >: usb 1-1.1: new full speed USB device number 3 using s3c2410-ohci
usb 1-1.1: New USB device found, idVendor=148f, idProduct=2070
usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1.1: Product: 802.11 g WLAN
usb 1-1.1: Manufacturer: Ralink
usb 1-1.1: SerialNumber: 1.0

4 ifconfig查看网卡信息

~ >: ifconfig wlan0
wlan0 Link encap:Ethernet HWaddr 00:24:25:50:95:F3
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)

我们可以看到
第一行:连接类型:Ethernet(以太网)HWaddr(硬件mac地址)
第三行:MULTICAST(支持组播)MTU:1500(最大传输单元):1500字节
第四、五行:接收、发送数据包情况统计
第七行:接收、发送数据字节数统计信息。

4 使能RT3070无线网卡模块

~>: ifconfig wlan0 up
phy0 -> rt2x00lib_request_firmware: Info - Loading firmware file ‘rt2870.bin’.
phy0 -> rt2x00lib_request_firmware: Error - Failed to request Firmware.
ifconfig: SIOCSIFFLAGS: No such file or directory

按照上的错误信息我们可以知道缺少了 rt2870.bin,因为RT3070的驱动还需要rt2870.bin这个系统固件(firmware)。
解决办法:Linux内核官方站点下载rt2870.bin这个系统固件
git clone git://git.kernel.org/pub/scm/linux/kernel/git/dwmw2/linux-firmware.git
将下载好的固件 RT2870.bin并放入开发板的/lib文件下新创建的firmware目录中就可以解决

~>:ifconfig wlan0 up
phy2 -> rt2x00lib_request_firmware: Info - Loading firmware file ‘rt2870.bin’.
phy2 -> rt2x00lib_request_firmware: Info - Firmware detected - version: 0.29.
phy2 -> rt2x00mac_conf_tx: Info - Configured TX queue 0 - CWmin: 3, CWmax: 4, Aifs: 2, TXop: 102.
phy2 -> rt2x00mac_conf_tx: Info - Configured TX queue 1 - CWmin: 4, CWmax: 5, Aifs: 2, TXop: 188.
phy2 -> rt2x00mac_conf_tx: Info - Configured TX queue 2 - CWmin: 5, CWmax: 10, Aifs: 3, TXop: 0.
phy2 -> rt2x00mac_conf_tx: Info - Configured TX queue 3 - CWmin: 5, CWmax: 10, Aifs: 7, TXop: 0.

三、无线网络配置工具Wireless tools和Wpa_supplicant以及Openssl移植
——————————————————————————————————————————————————————————————————————————-
目前可以使用wireless-tools或wpa_supplicant工具来配置无线网络。但要注意对无线网络的配置是全局性的,而非针对具体的接口。wpa_supplicant是一个较好的选择,但缺点是它不支持所有的驱动。另外,wpa_supplicant目前只能连接到那些你已经配置好ESSID的无线网络。而wireless-tools支持几乎所有的无线网卡和驱动,但它不能连接到那些只支持WPA的AP。
—————————————————————————————————————————————————————————————————————————–
1. Wireless tools移植

1.1资源下载
wireless_tools.29.tar.gz
http://download.csdn.net/detail/u010944778/8916883

1.2解压

[hulu@centos6 openssl-0.9.8i]$ tar zxvf wireless_tools.29.tar.gz

[hulu@centos6 openssl-0.9.8i]$ cd wireless_tools.29

1.3修改Makefile

11 ## Compiler to use (modify this for cross compile).
12 CC = /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
13 ## Other tools you need to modify for cross compile (static lib only).
14 AR = /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ar
15 RANLIB = /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ranlib

1.4编译

[hulu@centos6 openssl-0.9.8i]$make
这里写图片描述
1.5拷贝
将生成的命令工具:ifrename、iwevent、wgetid、iwspy、iwlist、iwconfig、iwpriv,拷贝到目标板的/bin下,将libiw.so.29 拷贝到目标板的/lib下,并分别赋予权限chmod 777 iw* libiw.so.29

2.Openssl工具移植
—————————————————————————————————————————————————————————————————————————–
现在的wifi网络肯定都是加密的。而大多都是WPA加密,所以wpa_supplicant对我们来说除了配置无线网络的需求之外,它更主要是用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证的。而要加密就要使用到相关的加密算法,常用的密钥等,所以我们要先移植Openssl工具再移植wpa-supplicant。因为后面编译wpa_supplicant要依赖openssl中的lib和include
—————————————————————————————————————————————————————————————————————————-

2.1、下载openssl驱动源码
Openssl-0.9.8i
http://download.csdn.net/detail/u010944778/8918317

2.2解压后创建指定的安装目录

[hulu@centos6 openssl-0.9.8i]$ mkdir install

2.3修改Makefile

29 INSTALLTOP=/home/hulu/fl2440/wifi/openssl-0.9.8i/install//指定ssl的安装目录
32 OPENSSLDIR=/home/hulu/fl2440/wifi/openssl-0.9.8i/install/ 
62 CC= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
69 AR= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ar $(ARFLAGS) r
70 RANLIB= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ranlib

2.4编译

~> make clean
~> ./config–prefix=/home/hulu/fl2440/wifi/openssl-0.9.8i/install
~> sudo make & make install

并拷贝libcrypto.a 、libcrypto.so.0.9.8 、libssl.a 、libssl.so.0.9.8到开发板的/lib下

3.wpa_supplicant驱动移植

3.1、下载wpa_supplicant源码
wpa_supplicant-0.7.3.tar.gz
http://download.csdn.net/detail/u010944778/8918325

3.2、解压后修改.config配置文件

[hulu@centos6 wpa_supplicant-0.7.3]$ ls COPYING;
patches ; README ; src ; wpa_supplicant
[hulu@centos6
wpa_supplican]$ cd wpa_supplicant/

[hulu@centos6 wpa_supplicant-0.7.3]$ cp defconfig .config

[hulu@centos6 wpa_supplicant-0.7.3]$ vim .config

修改如下:

27 #CC=/opt/brcm/hndtools-mipsel-uclibc/bin/mipsel-uclibc-gcc
28CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc -L/home/hulu/fl2440/wifi/openssl-0.9.8i/install/lib
29 #CFLAGS += -Os
30 CFLAGS += -I/home/hulu/fl2440/wifi/openssl-0.9.8i/install/include
31 #CPPFLAGS += -I../src/include -I../../src/router/openssl/include
32 #LIBS += -L/opt/brcm/hndtools-mipsel-uclibc-0.9.19/lib -lssl
33 LIBS += -L/home/hulu/fl2440/wifi/openssl-0.9.8i/install/lib

3.3、编译

[hulu@centos6 wpa_supplicant]$ make
然后将wpa_cli,wpa_supplicant,wpa_passphrase拷贝到开发板的/bin目录下,并修改可执行权限

四、启动RT3070无线模块连接路由器
4.1配置无线网络
————————————————————————————————————————————————————————————————————————
上面我们说过,我们既可以通过wireless tools工具提供的命令iwconfig等来配置无线网络,也可以通过wpa_supplicant来配置.我这里采用wpa_supplicant来配置。
—————————————————————————————————————————————————————————————————————————————
4.1.1 使用wpa_passphrase创建wpa_supplicant的配置文件
以下命令均在开发板上进行操作:

~> /apps/wireless/sta # wpa_passphrase Freescale 123456 >>wpa_supplicant.conf
~>/apps/wireless/sta # cat wpa_supplicant.conf

~>/apps/wireless/Sta # vi wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
network={
ssid=”Freescale” //已知要连接的路由器的名字
key_mgmt=WPA-PSK //采用WPA-PSK加密模式
proto=WPA
pairwise=TKIP CCMP
group=TKIP CCMP
psk=”123456” //路由器密码
//#psk=20a17fe2e0482c0db4e4dcf6c4494cebbd88ae4f166015115ca83ce9022b8cd2
}
pairwise = TKIP CCMP和group =TKIP CCMP表示自动匹配加密算法CCMP或TKIP;

4.1.2启动RT3070并配置RT3070无线网卡参数
我们依旧利用wpa_supplicant工具来配置

在开发板执行:

~>wpa_supplicant -B -d -Dwext-iwlan0-c/apps/wireless/sta/wpa_supplicant.conf
-d :增加调试信息
-B:后台守护进程
-c:指定配置文件
-Dwext:wext为驱动名称
-iwlan0 :wlan0为网络接口名称
这里写图片描述
成功连上如上目标无线网络。

静态配置无线网卡IP和子网掩码和网关

~>:ifconfig wlan0 192.168.0.120 broatcast 192.168.0.255 netmask255.255.255.0 up
~>route add default gw 192.168.0.1
这里写图片描述
这里写图片描述

4.1.3 测试
先关闭eth0

~>: ifconfig eth0 down
如果你想上外网,那么就要给开发板添加DNS域名解析服务!
在开发板的/etc/目录下创建一个resolv.conf的文件,因为在内核启动的时候内核会在resolv.conf文件中找dns

~>: vi resolv.conf
nameserver 4.2.2.2
nameserver 8.8.8.8

先测试一下 ping一下DNS 4.2.2.2
这里写图片描述
再ping一下www.baidu.com
这里写图片描述

至此利用wpa_supplicant配置无线网卡,静态设置wlan0 IP地址和网关,并实现ping通无线路由器,ping通外网。

———————————————————————————————————————————————————————————————————————-
以上都是静态指定wlan0的IP联网的,如果板子自己去动态随机获取IP联网,这样可以不用给wlan0指定IP。接下我们来完成这个功能。
—————————————————————————————————————————————————————————————————————————-
实现DHCP自动获取IP地址

注意:系统已经实现DNS,即在开发板的/etc/目录下存在resolv.conf 文件,要支持动态获取IP的话,你需要在linux内核中和制作文件系统的busybox的menuconfig选中必要的选项
内核部分

Networking --->
    Networking support   
    Networking options ---> 
           Packet socket                 //添加.配置CONFIG_PACKET
          [ * ]     IP: DHCP support         //添加
          [ * ] Network packet filtering (replaces ipchains) --->  //添加,后面子选项可不选,配置CONFIG_NETFILTER
说明:若没选<* > Packet socket, [ * ] Network packet filtering (replaces ipchains)  --->选项,在执行udhcpc命令时出现如下错误:
#  udhcpc -f 
   udhcpc (v1.13.2) started
   eth0: link up, 100Mbps, full-duplex, lpa 0x41E1
   udhcpc: socket: Address family not supported by protocol

busybox部分

Networking Utilities  --->
   udhcp Server/Client  --->
        [*] udhcp Server (udhcpd)                            
        [*] udhcp Client (udhcpc)       //生成udhcpc命令                               
        [ ] Lease display utility (dumpleases)                        
        [ ]   Log udhcp messages to syslog (instead of stdout)        
        [ ]   Compile udhcp with noisy debugging messages
    Networking Utilities --->
     [*] udhcp client for DHCPv6 (udhcpc6)                                            
     [*] udhcp server (udhcpd)  //生成udhcpc命令    

编译,并将新的文件系统和内核放到开发板上
从Busybox的examples/udhcp/下copy simple.script文件到开发板/usr/share/udhcpc/下,并重命名为default.script,然后更改文件default.script的权限,chmod 777 default.script。
注意:如果你没有在开发板上修改权限的话,是不能获取ip的,错误可能是这样的

~>: udhcpc -i wlan0 udhcpc
Sending discover…
Sending select for 192.168.1.110…
Lease of 192.168.1.110 obtained,
lease time 7200

启动rt3070,尝试动态获取IP

~>: wpa_supplicant -B -d -Dwext -iwlan0–c/apps/wireless/sta/wpa_supplicant.conf
~>: udhcpc -i wlan0 //-i 指定网卡wlan0
这里写图片描述
~> route
这里写图片描述
~>ping www.baidu.com
这里写图片描述

以上就是基于fl2440实现rt3070sta模式,有不足之处还请各位指出,欢迎阅读!!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值