参考文章:
http://blog.sina.com.cn/s/blog_5d534d2201016t4j.html
http://bbs.csdn.net/topics/390152921
移植环境:
主机操作系统:Ubuntu 10.04 LTS 32-bit
目标机:T MS320DM368 Linux 2.6.32
交叉编译环境:arm-none-linux-gnueabi-gcc
无线模块:雷凌Ralink - rt3070
操作步骤:
1. 编译arm版本的内核源码
找到内核源码压缩包,对内核的无线模块进行配置。
make menuconfig
进入内核配置界面,内核配置中需要做的修改如下:
[*] Networkingsupport --->
[*] Wireless --->
<*> cfg80211-wireless configuration API
[*] Wirelessextensionssysfs files
<*> GenericIEEE802.11 Networking Stack(mac80211)
Device Drivers --->
[*]Networkdevicesupport --->
[*] WirelessLAN --->
<*> IEEE802.11for Host AP (Prism2/2.5/3 andWEP/TKIP/CCMP)
[*] Supportdownloadingfirmware images withHost AP driver
[*] Supportfornon-volatile firmwaredownload
<M> Ralinkdriversupport --->
<M> Ralinkrt27xx/rt28xx/rt30xx(USB) support(这个选项可能没有,但是也不妨碍)
然后make,编译通过后会在arch/arm/boot/目录下生成可烧写入开发板的zImage内核镜像。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2、编译rt3070模块的驱动
在雷凌的官网下载linux版本的rt3070驱动2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO.bz2,解压后的目录名称太长,所以可以对其做修改方便使用,然后进入到目录中
tar –jxvf 2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO.bz2
mv2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO rt3070
cd rt3070
目录中的README_STA_usb文件介绍了编译和加载驱动的一些信息。需要对os/linux/目录下的conf.mk文件进行修改,这里只贴出要修改的部分:
vim os/linux/config.mk
# Support Wpa_Supplicant
HAS_WPA_SUPPLICANT=y
# Support Native WpaSupplicant for NetworkMaganger
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
Makefile也要进行修改,芯片类型改为3070,默认的PLATFORM为PC,那么将后面的ifeq($(PLATFORM),PC)下的内核源码路径指定为上述的交叉编译过的内核源码目录,交叉编译工具指定为/opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-gcc当然之前应该把交叉工具链安装好,这里不再详述。
vim Makefile
ifeq ($(CHIPSET),)
CHIPSET = 3070
endif
……
ifeq ($(PLATFORM),PC)
# Linux 2.6
LINUX_SRC = /usr/src/kernels/linux-2.6.38(内核的路径)
# Linux 2.4 Change to your local setting
#LINUX_SRC = /usr/src/linux-2.4
LINUX_SRC_MODULE = /lib/modules/$(shelluname-r)/kernel/drivers/net/wireless/(无线模块路径)
CROSS_COMPILE =/opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-
endif
然后如果直接make,会报如下错误:
/home/cabbage/Desktop/rt3070/os/linux/../../chips/rtmp_chip.c:Infunction 'RtmpChipOpsHook':
/home/cabbage/Desktop/rt3070/os/linux/../../chips/rtmp_chip.c:470:error:implicit declaration of function 'RT33xx_Init'
make[2]:***[/home/cabbage/Desktop/rt3070/os/linux/../../chips/rtmp_chip.o] Error 1
make[1]:***[_module_/home/cabbage/Desktop/rt3070/os/linux] Error 2
make[1]: Leavingdirectory`/usr/src/kernels/linux-2.6.38'
make: ***[LINUX] Error 2
在网上查到似乎是因为改变了CHIPSET所导致的错误。修改chips/目录下的rtmp_chip.c文件,定位到470行,修改后如下:
#ifdef RT30xx
if(IS_RT30xx(pAd))
{
if(IS_RT3390(pAd))
; //RT33xx_Init(pAd);
else
RT30xx_Init(pAd);
}
#endif /* RT30xx */
然后再make,编译通过后会在os/linux/下生成rt3070sta.ko,这就是模块的驱动。 但是这里我出现了一个问题,查看rt3070sta.ko这个文件的大小,居然达到了12m,这是不合理的,原因应该是包含了大量调试信息,用arm-linux-strip可将它的大小裁剪为750k左右。
#arm-linux-strip -S rt3070sta.ko
其中-S参数是必须的,否则在加载驱动的时候会报找不到版本信息的错误。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3.烧写内核和加载驱动模块
将之前编译好的内核zImage镜像烧写到dm368开发板中(将内核镜像拷贝到启动卡sd卡中),将rt3070sta.ko和驱动源码目录下的RT2870STA.dat两个文件通过tftp下载到目标板中(tftp –gl xxx 192.168.1.161),RT2870STA.dat放入/etc/Wireless/RT2870STA/目录下,rt3070sta.ko放入任意合适的目录,我放在了/usr/share/ti/dvsdk-demo/下。
mkdir –p /etc/Wireless/RT2870STA/
cp RT2870STA.dat / etc/Wireless/RT2870STA/
cp rt3070sta.ko /usr/share/ti/dvsdk-demo/
加载驱动模块
insmod /usr/rt3070sta.ko
rtusb init rt2870 --->
=== pAd = d1502000, size = 513400 ===
<-- RTMPAllocTxRxRingMemory,Status=0
<-- RTMPAllocAdapterBlock,Status=0
usbcore: registered new interfacedriverrt2870
然后可以通过ifconfig–a可以看到系统已经正确识别网卡,名称为ra0。
ifconfig –a
ra0 Linkencap:Ethernet HWaddr00:00:00:00:00:00
BROADCASTMULTICAST MTU:1500 Metric:1
RXpackets:0 errors:0 dropped:0 overruns:0 frame:0
TXpackets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0txqueuelen:1000
RXbytes:0 (0.0 B) TX bytes:0(0.0 B)
然后启动网卡,有如下信息输出,此时网卡已经可以正常工作了。
#ifconfig ra0 up
(Efuse for 3062/3562/3572)Size=0x2d[2d0-2fc]
RTMP_TimerListAdd: add timer objd1549ba8!
RTMP_TimerListAdd: add timer objd1549bd8!
RTMP_TimerListAdd: add timer objd1549c08!
RTMP_TimerListAdd: add timer objd1549b78!
RTMP_TimerListAdd: add timer objd1549ae8!
RTMP_TimerListAdd: add timer objd1549b18!
RTMP_TimerListAdd: add timer objd151471c!
RTMP_TimerListAdd: add timer objd1503edc!
RTMP_TimerListAdd: add timer objd1503f14!
RTMP_TimerListAdd: add timer objd15147c0!
RTMP_TimerListAdd: add timer objd15146bc!
RTMP_TimerListAdd: add timer objd151478c!
-->RTUSBVenderReset
<--RTUSBVenderReset
Key1Str is Invalid key length(0) orType(0)
Key2Str is Invalid key length(0) orType(0)
Key3Str is Invalid key length(0) orType(0)
Key4Str is Invalid key length(0) orType(0)
1. Phy Mode = 5
2. Phy Mode = 5
NVM is Efuse and its size=2d[2d0-2fc]
phy mode> Error! The chip doesnotsupport 5G band 5!
RTMPSetPhyMode: channel is out ofrange, usefirst channel=1
(Efuse for 3062/3562/3572)Size=0x2d[2d0-2fc]
3. Phy Mode = 9
AntCfgInit: primary/secondary ant 0/1
MCS Set = ff 00 00 00 01
<==== rt28xx_init, Status=0
0x1300 = 00064300
至此网卡驱动移植成功。但是如果需要让网卡连接入目前常见的WPA加密的网络,还需要移植wpa_supplicant工具。
另外还有一个名为wireless_tools的辅助工具,可以用它来检索在网卡所在的环境中存在的无线网络,如果对于要连接入的无线网络的ssid和相关信息已经清楚,可以不用移植,不过这个工具的移植很简单。
4、移植wireless_tools
源码下载地址:http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/wireless_tools.29.tar.gz
tar zxvf wireless_tools.29.tar.gz
cd wireless_tools.29
vim Makefile
PREFIX = /usr/local/wirelesstool (生成文件的路径)
CC = /opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-gcc
AR = /opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-ar
RANLIB = /opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-ranlib
make
make install
在/usr/local/wirelesstool/lib目录下找到libiw.so.29,下载到开发板的/lib/目录下;/usr/local/wirelesstool/sbin目录下找到iwpriv、iwconfig、iwlist, iwevent, iwspy等命令,下载到开发板的/usr/sbin目录下。这时就应该可以使用这些命令通过网卡搜索到环境中的无线网络。
ifconfig ra0 up
iwlist ra0 scan
Cell 06 - Address: 38:83:45:E5:CB:3E
Protocol:802.11b/g/n
ESSID:"idart-wlan311"
Mode:Managed
Frequency:2.437GHz(Channel 6)
Quality=100/100 Signallevel=-43 dBm Noise level=-92 dBm
Encryptionkey:on
BitRates:22.5 Mb/s
IE:WPA Version 1
GroupCipher : CCMP
PairwiseCiphers (1) :CCMP
AuthenticationSuites(1) : PSK
IE:IEEE 802.11i/WPA2Version 1
GroupCipher : CCMP
PairwiseCiphers (1) :CCMP
AuthenticationSuites(1) : PSK
IE:Unknown:DD0E0050F204104A0001101044000102
Cell07 - Address: 58:66:BA:EE:DB:40
Protocol:802.11b/g/n
ESSID:"ChinaNet"
Mode:Managed
Frequency:2.437GHz(Channel 6)
Quality=42/100 Signallevel=-73 dBm Noise level=-76 dBm
Encryptionkey:off
BitRates:54 Mb/s
Cell08 - Address: 58:66:BA:EE:DB:41
Protocol:802.11b/g/n
ESSID:"SYSUWLAN"
Mode:Managed
Frequency:2.437GHz(Channel 6)
Quality=37/100 Signallevel=-75 dBm Noise level=-78 dBm
Encryptionkey:off
BitRates:54 Mb/s
至此wireliss_tools移植成功。
5. openssl移植
openss版本:openssl-1.0.0d
openss为wpa_supplicant驱动移植做准备
openssl下载地址:
http://www.openssl.org/source/
ftp://ftp.openssl.org/source/old/0.9.x/
makefile修改 (-为去掉设置, +为新加的设置)
#vimakefile
INSTALLTOP=/usr/local/ssl
OPENSSLDIR=/usr/local/ssl
……
CC= /opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-gcc
AR= /opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-ar $(ARFLAGS) r
RANLIB= /opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-ranlib
#make
#makeinstall
在/usr/local/ssl目录下安装了ssl库
拷贝下面文件驱动到目标系统/usr/lib/
libssl.so.1.0.0
libcrypto.so.1.0.0
openssl 移植完成,下面可以做wpa_supplicant驱动移植
6.移植wpa_supplicant
版本:wpa_supplicant-0.7.3
移植wpa_supplicant前确保Openssl已经移植好了。
源码下载地址:
http://hostap.epitest.fi/wpa_supplicant/
配置修改,编译
#cpdefconfig .config
#vi.config
增加这几行
CFLAGS+= -I/usr/local/ssl/include
LIBS +=-L/usr/local/ssl/lib
CC = /opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-gcc
-L /usr/local/ssl/lib/
#make
需要先编译安装openssl库,确保两个编译都使用统一工具arm-linux-gcc
不一致会出现这样的问题:
/usr/bin/ld:skipping incompatible /usr/local/ssl/lib/libssl.so when searching for -lssl
/usr/bin/ld:skipping incompatible /usr/local/ssl/lib/libssl.a when searching for -lssl
/usr/bin/ld:cannot find -lssl
/usr/bin/ld:skipping incompatible /usr/local/ssl/lib/libcrypto.so when searching for-lcrypto
/usr/bin/ld:skipping incompatible /usr/local/ssl/lib/libcrypto.a when searching for-lcrypto
/usr/bin/ld:cannot find -lcrypto
collect2:ld returned 1 exit status
make:*** [wpa_supplicant] Error 1
这样只要把openssl和wpa_supplicant两个用同一个编译工具编译即可。
7.产品板使用
把wpa_supplicant.conf拷贝到/xxx目录下 (xxx目录自定,我是放在目录下/etc)
按加密方式分3种,以下3个配置文件均测试正常,然后把文件末尾提供的一些example全部删除,否则在使用wpa_supplicant时会报一些类型无法识别的错误。
# 无密码 wpa_supplicant.conf内容:
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="XXXXXX"
key_mgmt=NONE
}
# WEP密码 wpa_supplicant.conf内容:
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="XXXXXX"
key_mgmt=NONE
wep_key0="XXXXXX"
wep_tx_keyidx= 0
}
# WPA密码 wpa_supplicant.conf内容:
#WPA-PSK/TKIP
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="MMLABN16"
key_mgmt=WPA-PSKWPA-EAP IEEE8021X NONE
proto=WPARSN
pairwise=TKIPCCMP
group=TKIPCCMP WEP104 WEP40
psk="MMLAB406"
}
最后进行测试,测试之前要关闭有线网卡eth0,原因是如果不关闭的话在之后添加默认路由时会被设置为有线网卡的默认路由,这个应该有别的解决方法,不过我没有仔细去查。
ifconfig eth0 down
ifconfig ra0 up
ifconfig ra0 192.168.1.248netmask255.255.255.0
route add default gw 192.168.1.1
wpa_supplicant -B -ira0-c/etc/wpa_supplicant.conf –Dwext
===>rt_ioctl_giwscan. 28(28)BSSreturned, data->length = 3351
==>rt_ioctl_siwfreq::SIOCSIWFREQ(Channel=6)
RTMP_TimerListAdd: add timer objd15785c4!
以下是详细测试过程
wpa_supplicant拷贝到/xxx/目录下(我是放在根目录下/)
我的方法:wpa_supplicant-Dwext -iwlan0 -c/wpa_supplicant.conf
参考方法:
//无桥方式
wpa_supplicant-B -ira0 -c /etc/wpa_supplicant.conf -Dwext (xxx为前面wpa_supplicant.conf目录, 我是在/etc目录下)
//有桥接方式(bridge-utils)
wpa_supplicant-B -b br0 -ira0 -c /xxx/wpa_supplicant.conf -Dwext
如果运行时出现:
socket(PF_PACKET):Address family not supported by protocol
原因
内核不支持RAWsocket,编译内核时把CONFIG_PACKET选项打开,
CONFIG_PACKET= y
If weuse CONFIG_PACKET=m instead of CONFIG_PACKET=y we'd need to
includeaf_packet.ko into the initramfs for netboot installation.
手动加载af_packet.ko
#insmodaf_packet.ko
显示
NET:Registered protocol family 17
加载正常
运行#wpa_supplicant
#wpa_supplicant-B -ira0 -c /etc/wpa_supplicant.conf -Dwext
(Efusefor 3062/3562/3572) Size=0x2d [2d0-2fc]
RTMP_TimerListAdd:add timer obj d1b3c620!
RTMP_TimerListAdd:add timer obj d1b3c650!
RTMP_TimerListAdd:add timer obj d1b3c680!
RTMP_TimerListAdd:add timer obj d1b3c5f0!
RTMP_TimerListAdd:add timer obj d1b3c560!
RTMP_TimerListAdd:add timer obj d1b3c590!
RTMP_TimerListAdd:add timer obj d1b06b94!
RTMP_TimerListAdd:add timer obj d1af5f54!
RTMP_TimerListAdd:add timer obj d1af5f8c!
RTMP_TimerListAdd:add timer obj d1b06c38!
RTMP_TimerListAdd:add timer obj d1b06b34!
RTMP_TimerListAdd:add timer obj d1b06c04!
-->RTUSBVenderReset
<--RTUSBVenderReset
Key1Stris Invalid key length(0) or Type(0)
Key2Stris Invalid key length(0) or Type(0)
Key3Stris Invalid key length(0) or Type(0)
Key4Stris Invalid key length(0) or Type(0)
1. PhyMode = 5
2. PhyMode = 5
phymode> Error! The chip does not support 5G band 5!
RTMPSetPhyMode:channel is out of range, use first channel=1
(Efusefor 3062/3562/3572) Size=0x2d [2d0-2fc]
3. PhyMode = 9
MCS Set= ff 00 00 00 01
<====rt28xx_init, Status=0
0x1300 =00064300
运行正常
查看状态:
#iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
ra0 Ralink STA ESSID:"MMLABN16" Nickname:"RT2870STA"
Mode:Managed Frequency=2.437 GHz Access Point: BC:AE:C5:C4:9A:5E
BitRate=135 Mb/s
RTSthr:off Fragment thr:off
Encryptionkey:40C3-43C1-AB81-351A-CD3A-226F-6CDD-8FC9 Security mode
:open
LinkQuality=73/100 Signal level:-63 dBm Noise level:-90 dBm
Rxinvalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Txexcessive retries:0 Invalid misc:0 Missed beacon:0
设置ip
#ifconfigra0 192.168.1.191 netmask 255.255.255.0
设置完一会,等网络连接好就可以了。
启动6410自带的无线,启动后关闭自带的无线。此时ra0无线就可以正常使用。
[root@FriendlyARM/]# ping 192.168.1.1
PING192.168.1.1 (192.168.1.1): 56 data bytes
64 bytesfrom 192.168.1.1: seq=0 ttl=64 time=1063.262 ms
64 bytesfrom 192.168.1.1: seq=1 ttl=64 time=468.672 ms
64 bytesfrom 192.168.1.1: seq=2 ttl=64 time=379.596 ms
64 bytesfrom 192.168.1.1: seq=3 ttl=64 time=361.608 ms