http://blog.sina.com.cn/s/blog_4c796ed20100hpwq.html
一 模块的交叉编译
为实现rtl8192su驱动模块,在arm+linux(2.6.18内核montavista)环境下的应用,需要对模块进行交叉编译,编译器为arm_v5t_le-gcc.
原驱动信息如下:
RTL8192SU Linux driver
驱动目录下主要有以下文件:
各个文件的内容和功能可参考目录下的readme.txt文件,实现交叉编译主要更改两个Makefile文件,主要修改开始部分的宏变量。
原文件开始部分的宏变量为:
LINUX_KSRC_MODULE = /lib/modules/$(shell uname-r)/kernel/drivers/net/wireless/
RTL819x_DIR = $(shell pwd)
KVER
KSRC = /lib/modules/$(KVER)/build
RTL819x_FIRM_DIR = $(RTL819x_DIR)/firmware
HAL_SUB_DIR = rtl8192u
MODULE_FILE = $(RTL819x_DIR)/ieee80211/Module.symvers
更改为:
LINUX_KSRC_MODULE=/opt/mv_pro_5.0/montavista/pro/devkit/lsp/ti-davinci/linux-2.6.18_pro500/drivers/net/wireless/
RTL819x_DIR = $(shell pwd)
KVER
KSRC =/opt/mv_pro_5.0/montavista/pro/devkit/lsp/ti-davinci/linux-2.6.18_pro500
RTL819x_FIRM_DIR = $(RTL819x_DIR)/firmware
HAL_SUB_DIR = rtl8192u
MODULE_FILE = $(RTL819x_DIR)/ieee80211/Module.symvers
红色字体为需要修改的宏变量,KSRC需更改为target系统内核源码目录,LINUX_KSRC_MODULE更改为内核源码驱动目录下的wireless目录。
2.
原文件开始部分如下:
NIC_SELECT = RTL8192SU
CC = gcc
KVER
MODDESTDIR :=/lib/modules/$(KVER)/kernel/drivers/net/wireless/
ifneq ($(shell uname -r|cut -d. -f1,2), 2.4)
EXTRA_CFLAGS +=-I$(TOPDIR)/drivers/net/wireless
EXTRA_CFLAGS += -std=gnu89
EXTRA_CFLAGS += -O2
EXTRA_CFLAGS += -mhard-float -DCONFIG_FORCE_HARD_FLOAT=y
修改为:
NIC_SELECT = RTL8192SU
CC = arm_v5t_le-gcc
KVER
MODDESTDIR :=/opt/mv_pro_5.0/montavista/pro/devkit/lsp/ti-davinci/linux-2.6.18_pro500/drivers/net/wireless/
ifneq ($(shell uname -r|cut -d. -f1,2), 2.4)
EXTRA_CFLAGS +=-I$(TOPDIR)/drivers/net/wireless
EXTRA_CFLAGS += -std=gnu89
EXTRA_CFLAGS += -O2
#EXTRA_CFLAGS += -mhard-float-DCONFIG_FORCE_HARD_FLOAT=y
EXTRA_CFLAGS +=
最主要的就是红色字体部分,CC指明编译器,此项不更改会出现:
然后进入驱动目录下执行以下命令进行编译:
# make ARCH=arm CROSS_COMPILE=arm_v5t_le-
进行编译或是将ARCH 和CROSS_COMPILE宏变量写入Makefile。
执行编译后会出现提示些语法错误(不同编译器版本,语法错误不同,根据提示进行更改)常见:
编译成功后会在驱动目录下出现:r8192s_usb.ko和一些.O文件。
接下来可以在加载该模块,操作如下:
然后可以依据readme.txt文件做进一步的操作。
二.模块在arm+linux环境下的使用
tar –zxvf wpa_supplicant-0.5.10.tar.gz
然后进入目录
cd wpa_supplicant-0.5.10
编译make
拷贝wpa_cli和wpa_supplicant到/usr/local/bin其中wpa_cli清除以前的默认配置。
接下来需要创建或是更改驱动目录下的脚本步骤如下:
1.
#DHCP client
DEVICE=wlan0
BOOTPROTO=dhcp
ONBOOT=yes
2.
原文件内容:
#!/bin/bash
var0=`ps aux|awk '/dhclient wlan0/'|awk'$11!="awk"{print $2}'`
kill $var0
cp ifcfg-wlan0 /etc/sysconfig/network-scripts/
dhclient wlan0
var1=`ifconfig wlan0 |awk '/inet/{print $2}'|awk-F: '{print $2}'`
rm -f/etc/sysconfig/network-scripts/ifcfg-wlan0
echo "get ip: $var1"
更改后:
#!/bin/bash
var0=`ps aux|awk '/dhclient wlan0/'|awk'$11!="awk"{print $2}'`
kill $var0
cp ifcfg-wlan0 /etc/network/
dhcpcd wlan0
var1=`ifconfig wlan0 |awk '/inet/{print $2}'|awk-F: '{print $2}'`
rm -f /etc/network/
echo "get ip: $var1"
注释:红色部分为更改的部分,因为montavistalinux下文件系统里目录etc下没有sysconfig/network-scripts目录,其脚本在/etc/network目录下.原dhclient命令在pc上的redhat等linux下是支持此命令的,在montavista下是用dhcpcd来实现这一功能的,所以要用此命令替代dhclient。
3.
wpa1.conf是wpa_supplicant的配置文件,在执行脚本./runwpa时候将用到此配置文件。这个文件很简单,是用来描述一个个网络的,网络配置通常如下:
network={
ssid="fusion"
scan_ssid=1
key_mgmt=WPA-PSK
proto=WPA
pairwise=TKIP
group=TKIP
psk="my-wlan-passwd"
id_str="fusion"
}
注释:对每个网络都是这么一段,这里面 ssid 是无线路由器设置的 SSID,后面 key_mgment, proto, group这几个字段指定了 WPA/TKIP 方式,而 psk 指定的就是我的密钥,这几个对于不同的认证方式有所不同,scan_ssid=1是用来对付设置不广播网络SSID的路由器的,我的路由器就是这么配置的,呵呵,理由自然是增强一层安全性了。
实验室中此文件配置如下:
ctrl_interface=/var/run/wpa_supplicant
network={
要是想支持多个网络可一配置多段network。
设置好以上内容后可以按一下步骤调试,进行上网,本方法中将很多iwlist,ifconfig,iwconfig等操作放到了脚本里进行,也可以自己手动一步一步进行配置用这些命令来实现上网,具体请查阅相关资料。(进入终端后可以先执行routedel default命令将默认的eth0去掉,这样在执行一下步骤后,wlan0为成为默认的然后通过wlan0来连接)
1.
应检测到:
Bus *** Device ***:ID 0bda:8172 Realtek Semiconductor Corp
2.
root@192.168.0.102:/wifi/armwifi/rtl8192su_linux_2.6.0003.0825.2009#./wlan0up
cp: cannot create regular file `/etc/acpi/events': No such fileor directory
Linux kernel driver for RTL8192 based WLAN cards
Copyright (c) 2007-2008, Realsil Wlan
usbcore: registered new driver rtl819xSU
new high speed USB device using musb_hdrc and address 2
usb 1-1: configuration #1 chosen from 1 choice
==>ep_num:4, in_ep_num:1, out_ep_num:3
==>RtInPipes:3
==>RtOutPipes:4
==>txqueue_to_outpipemap for BK, BE, VI, VO,HCCA, TXCMD, MGNT, HIGH, BEACON:
1
CustomerID = 0x
BoardType = 0x 1
RF_Type = 0x 0
Dot11d_Init()
此时输入iwconfig命令应该能看到wlan0的信息:
iwconfig
lo
eth0
tunl0
wlan0
3.
root@192.168.0.102:/wifi/armwifi/rtl8192su_linux_2.6.0003.0825.2009#./runwpa&
[1] 1014
root@192.168.0.102:/wifi/armwifi/rtl8192su_linux_2.6.0003.0825.2009#
Using FW_SOURCE_HEADER_FILE
rtl8192SU_HalUsbRxAggr8192SUsb: Enable RxAggregation +++++
rtl8192SU_adapter_start-8064: RCR = 8377f00e
rtl8192SU_adapter_start-8067: RCR = 8777f00e
rtl8192_phy_QueryRFReg(): rf_pathmap=3 eRFPath=0
rtl8192_phy_QueryRFReg(): rf_pathmap=3 eRFPath=1
===>ieee80211_start_scan_rsl()
===>ieee80211_start_scan_rsl()
====================>haha:IPSEnter()
===>MgntActSet_RF_State(): StateToSet(2)
Trying to associ
ate with 00:25:8
6:23:a9:06 (SSID
='supervideo' fr===>MgntActSet_RF_State():StateToSet(0)
eq=2437 MHz)
ioctl[SIOCSIWFREQ]: Operation not
supported
=====>rtl8192SU_link_change 1
<=====rtl8192SU_link_change 2
Linking with supervideo,channel:6, qos:1, myHT:1, networkHT:1,mode:10 cur_net.f
lags:0x40e
============>HTIOTActIsForcedRTSCTS(), 0
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!IOTAction = 00004600
===>ieee80211_associate_procedure_wq(),chan:6
==========>HTSetConnectBwMode():pHTInfo->bCurBW40MHz:0
=================>ieee80211_authentication_req():auth->algorithmis 0
=====>rtl8192SU_link_change 1
Linking with supervideo,channel:6, qos:1, myHT:1, networkHT:1,mode:10 cur_net.f
lags:0x40e
============>HTIOTActIsForcedRTSCTS(), 0
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!IOTAction = 00004600
====================>rx ADDBAREQ from:00:25:86:23:a9:06
=====>to send ADDBARSP
<=====rtl8192SU_link_change 2
===>ieee80211_associate_procedure_wq(),chan:6
==========>HTSetConnectBwMode():pHTInfo->bCurBW40MHz:0
Association request to the driver failed
CTRL-EVENT-DISCONNECTED - Disconnect event - remove keys
CTRL-EVENT-D=================>ieee80211_authentication_req():auth->algorithmis
0
ISCONNECTED - Disconnect event - remove keys
Associated successfully
====================>rx ADDBAREQ from:00:25:86:23:a9:06
=====>to send ADDBARSP
============>normal associate
Using G rates:108
Successfully associated, ht enabled
==========>HTSetConnectBwMode():pHTInfo->bCurBW40MHz:1
Associated with 00:25:86:23:a9:06
!!!!!!!!!!!!!!!!!!!!!!!!!!!IOTRaFunc = 00000000
=====>rtl8192SU_link_change 1
=============>ARFR0+rate_index*4:0x100ff015
<=====rtl8192SU_link_change 2
EAPOL TranslateHeader(), pTcb->DataRate = 0x2
EAPOL TranslateHeader(), pTcb->DataRate = 0x2
alg name:CCMP
dm_check_edca_turbo():iot peer is 0x5:atheros,bssid:00:25:86:23:a9:06
========>dm_check_edca_turbo()down link
alg name:TKIP
EAPOL TranslateHeader(), pTcb->DataRate = 0x2
WPA: Key negotiation completed with 00:25:86:23:a9:06 [PTK=CCMPGTK=TKIP]
CTRL-EVENT-CONNECTED - Connection to 00:25:86:23:a9:06 completed(auth) [id=0 id
_str=]
========>dm_check_edca_turbo()up link
========>dm_check_edca_turbo()down link
alg name:TKIP
EAPOL TranslateHeader(), pTcb->DataRate = 0x2
4.
root@192.168.0.102:/wifi/armwifi/rtl8192su_linux_2.6.0003.0825.2009#./wlan0dhcp
./wlan0dhcp
kill: usage: kill [-s sigspec | -n signum | -sigspec] [pid |job]... or kill -l
[sigspec]
===>DHCP Protocol start tx DHCP pkt src port:68,dest port:67!!
=====>to send ADDBAREQ!!!!!
====================>rx ADDBARSP from:00:25:86:23:a9:06
========>dm_check_edca_turbo()up link
========>dm_check_edca_turbo()down link
========>dm_check_edca_turbo()up link
========>dm_check_edca_turbo()down link
=====>to send ADDBAREQ!!!!!
====================>rx ADDBARSP from:00:25:86:23:a9:06
dhcpcd.exe: interface wlan0 has been configured with oldIP=192.168.0.104
rm: cannot remove `/etc/network/': Is a directory
get ip: 192.168.0.104
此时执行route命令查看路由显示如下:
root@192.168.0.102:/wifi/armwifi/rtl8192su_linux_2.6.0003.0825.2009#route
Kernel IP routing table
Destination
192.168.0.0
192.168.0.0
default
表明已经通过wlan0连接到了网络。可以进行上网了,ping www.baidu.com等也应能ping通。
root@192.168.0.102:/wifi/armwifi/rtl8192su_linux_2.6.0003.0825.2009#ping www.ba
idu.com
PING www.a.shifen.com (119.75.213.50) 56(84) bytes of data.
64 bytes from 119.75.213.50: icmp_seq=1 ttl=54 time=31.8 ms
64 bytes from 119.75.213.50: icmp_seq=2 ttl=54 time=35.4 ms
64 bytes from 119.75.213.50: icmp_seq=3 ttl=54 time=32.6 ms
5.执行./wlan0down关掉wlan0卸载驱动模块
=====>rtl8192SU_link_change 1
<=====rtl8192SU_link_change 2
CTRL-EVENT-DISCONNECTED - Disconnect event - remove keys
备注:
可以用bwm-ng进一步验证。后台运行ping命令,运行bwm-ng会显示wlan0口有数据发送和接收到。
另外在执行runwpa脚本前可以执行iwlistwlan0命令来查看当前环境下可用的无线网络。如想接入某个网络可以可以更改wpa1.conf文件不过前提是得知道密钥^-^.本人实验室中能够检测到无线网络如下:
# iwlist wlan0 scan
wlan0
联系客服