分享

RTL8192SU_WIFI驱动模块的交叉编译以及arm+linux环境下的应用

 XeonGate 2015-08-06

http://blog.sina.com.cn/s/blog_4c796ed20100hpwq.html

模块的交叉编译

为实现rtl8192su驱动模块,在arm+linux(2.6.18内核montavista)环境下的应用,需要对模块进行交叉编译,编译器为arm_v5t_le-gcc.

原驱动信息如下:

RTL8192SU Linux driver

   --This driver supports RealTek rtl8192SU USB Wireless LAN NIC

     for

     2.6 kernel:

     Fedora Core 2/3/4/5, Debian 3.1, Mandrake 10.2/Mandriva 2006,

     SUSE 9.3/10.1/10.2, Gentoo 3.1, Ubuntu 7.10/8.04, etc.

     2.4 kernel:

     Redhat 9.0/9.1

驱动目录下主要有以下文件:

 

各个文件的内容和功能可参考目录下的readme.txt文件,实现交叉编译主要更改两个Makefile文件,主要修改开始部分的宏变量。

1.   修改当前驱动目录下的Makefile文件:
RTL8192SU_WIFI驱动模块的交叉编译以及arm+linux环境

原文件开始部分的宏变量为:

 

 

LINUX_KSRC_MODULE = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless/

RTL819x_DIR = $(shell pwd)

KVER  = $(shell uname -r)

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  = linux-2.6.18_pro500

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.  修改/HAL/rtl8192u目录下的Makfile

原文件开始部分如下:

NIC_SELECT = RTL8192SU

CC = gcc

KVER  := $(shell uname -r)

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  := linux-2.6.18_pro500

 

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 +=  -DCONFIG_FORCE_HARD_FLOAT=y

最主要的就是红色字体部分,CC指明编译器,此项不更改会出现:

   CC1:错误 无法识别的命令行选项“-m****”等错误。

   去掉-mhard-float,因为编译器默认选项里是-msoft-float,两者不能同时选。同时选会出现冲突。

然后进入驱动目录下执行以下命令进行编译:

# make ARCH=arm CROSS_COMPILE=arm_v5t_le-

进行编译或是将ARCH 和CROSS_COMPILE宏变量写入Makefile。

执行编译后会出现提示些语法错误(不同编译器版本,语法错误不同,根据提示进行更改)常见:

   /ieee80211/ieee80211.h文件的第57行flase,true,bool重定义。注释掉typedef那行即可。

   备注:其他的语法错误可能会有一些隐形声明函数类型等错误,只需更改函数声明顺序即可(此编译器未出现)。

编译成功后会在驱动目录下出现:r8192s_usb.ko和一些.O文件。

接下来可以在加载该模块,操作如下:

RTL8192SU_WIFI驱动模块的交叉编译以及arm+linux环境

 

 

然后可以依据readme.txt文件做进一步的操作。

二.模块在arm+linux环境下的使用

   首先应该配置内核选项选中对WIFI或是802.11x的支持。

   WPA_supplicant 是 WPA/WPA2 认证的客户端,同时也适用于 WEAP,对有线、无线网络都可以使用。在驱动目录下解压wpa_supplicant-0.5.10.tar.gz

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.  在驱动目录下创建ifcfg-wlan0文件内容如下:

#DHCP client

DEVICE=wlan0

BOOTPROTO=dhcp

ONBOOT=yes

2.  更改wlan0dhcp脚本内容

原文件内容:

#!/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

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={

                        ssid="supervideo"   #无线网路的名称

                        proto=WPA WPA2

                        key_mgmt=WPA-PSK

                        pairwise=CCMP TKIP

                        group=CCMP TKIP

                        psk="supersuper"     #密钥

                        priority=2

         }

要是想支持多个网络可一配置多段network。

设置好以上内容后可以按一下步骤调试,进行上网,本方法中将很多iwlist,ifconfig,iwconfig等操作放到了脚本里进行,也可以自己手动一步一步进行配置用这些命令来实现上网,具体请查阅相关资料。(进入终端后可以先执行route del default命令将默认的eth0去掉,这样在执行一下步骤后,wlan0为成为默认的然后通过wlan0来连接)

1.    连接设备在终端执行命令lsusb 应能检测到设备(不是wlan0)

应检测到:

Bus *** Device ***:ID 0bda:8172 Realtek Semiconductor Corp

2.    进入到驱动目录下执行脚本wlan0up(命令格式#./wlan0up)来加载驱动模块显示信息如下:

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  13

==>txqueue_to_outpipemap for BK, BE, VI, VO, HCCA, TXCMD, MGNT, HIGH, BEACON:

2

CustomerID = 0x   0

BoardType = 0x 1

RF_Type = 0x 0

Dot11d_Init()

此时输入iwconfig命令应该能看到wlan0的信息:

iwconfig

lo        no wireless extensions.

 

eth0      no wireless extensions.

 

tunl0     no wireless extensions.

 

wlan0     802.11bg  Mode:Managed  Access Point: Not-Associated

          Bit Rate:0 kb/s

          Retry min limit:7   RTS thr:off   Fragment thr:off

          Encryption key:off

          Power Management:off

          Link Quality=0/100  Signal level=-256 dBm  Noise level=-256 dBm

          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0

          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

3.    后台执行runwpa脚本:输入命令./runwpa&显示信息如下:

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.    执行命令./wlan0dhcp获得IP和网关等:

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     Gateway         Genmask         Flags Metric Ref    Use Iface

192.168.0.0                  255.255.255.0               0 wlan0

192.168.0.0                  255.255.255.0               0 eth0

default         192.168.0.2     0.0.0.0         UG             0 wlan0

表明已经通过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卸载驱动模块

    /wlan0down

 

=====>rtl8192SU_link_change 1

<=====rtl8192SU_link_change 2

CTRL-EVENT-DISCONNECTED - Disconnect event - remove keys

   目前有些问题,执行到此后,终端不能在输入其他命令了,ps显示某些进程还在进行,用killall ***命令后也不能完全退出到终端可以输入命令,后台运行此脚本也一样。在pc下就可以?????

备注:

可以用bwm-ng进一步验证。后台运行ping命令,运行bwm-ng会显示wlan0口有数据发送和接收到。

另外在执行runwpa脚本前可以执行iwlist wlan0命令来查看当前环境下可用的无线网络。如想接入某个网络可以可以更改wpa1.conf文件不过前提是得知道密钥^-^.本人实验室中能够检测到无线网络如下:

# iwlist wlan0 scan

wlan0     Scan completed :

          Cell 01 - Address: 00:25:86:23:A9:06

                    ESSID:"supervideo"

                    Protocol:IEEE802.11N-24G

                    Mode:Master

                    Channel:6

                    Encryption key:on

                    Bit Rates:300 Mb/s

                    Extra: Rates (Mb/s): 1 2 5.5 11 6 9 12 18 24 36 48 54

                    Quality:30  Signal level:0  Noise level:171

                    IE: WPA Version 1

                        Group Cipher : WEP-40

                        Pairwise Ciphers (2) : TKIP WEP-40

                        Authentication Suites (1) : PSK

                    Extra: Last beacon: 3ms ago

          Cell 02 - Address: 00:15:E9:DF:A9:51

                    ESSID:"dlink"

                    Protocol:IEEE802.11bg

                    Mode:Master

                    Channel:6

                    Encryption key:off

                    Bit Rates:54 Mb/s

                    Extra: Rates (Mb/s): 1 2 5.5 6 9 11 12 18 24 36 48 54

                    Quality=30/100  Signal level=-95 dBm  Noise level=-85 dBm

                    Extra: Last beacon: 53ms ago

          Cell 03 - Address: 00:23:89:4A:7D:70

                    ESSID:"CMCC"

                    Protocol:IEEE802.11bg

                    Mode:Master

                    Channel:11

                    Encryption key:off

                    Bit Rates:54 Mb/s

                    Extra: Rates (Mb/s): 1 2 5.5 6 9 11 12 18 24 36 48 54

                    Quality:30  Signal level:0  Noise level:171

                    Extra: Last beacon: 5ms ago

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多