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" 注释:红色部分为更改的部分,因为montavista linux下文件系统里目录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" }
实验室中此文件配置如下: ctrl_interface=/var/run/wpa_supplicant network={
要是想支持多个网络可一配置多段network。 设置好以上内容后可以按一下步骤调试,进行上网,本方法中将很多iwlist,ifconfig,iwconfig等操作放到了脚本里进行,也可以自己手动一步一步进行配置用这些命令来实现上网,具体请查阅相关资料。(进入终端后可以先执行route del 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 file or 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->algorithm is 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->algorithm is 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=CCMP GTK=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 old IP=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脚本前可以执行iwlist wlan0命令来查看当前环境下可用的无线网络。如想接入某个网络可以可以更改wpa1.conf文件不过前提是得知道密钥^-^.本人实验室中能够检测到无线网络如下: # iwlist wlan0 scan
wlan0
|
|