前段时间搞了一下RT73与wpa_supplicant,调通了,无论是什么加密方式和认证类型,RT73都可以良好的工作。可又由于RT73停产了,被迫要使用RT3070。刚开始我以为应该和RT73差不多,果不其然,用法十分接近,但是也有一点点区别的。
1.首先RT73使用的是rausb0表示的,而RT3070使用ra0表示。
2.RT3070的驱动差不多是RT73的两倍多。
3.另外,在使用wpa_supplicant上也有点小区别,主要是wpa_supplicant版本的问题。
下面,我就说一下我的使用过程,希望可以帮助到大家!
首先是驱动的编译,从网上下了好多RT3070的驱动,都没交叉编译过去,只有2009_1106_RT3070_Linux_STA_V2.1.1.0.bz2这一版本的编译过去了,呵呵!
交叉编译过程:
1.tar -jxvf 2009_1106_RT3070_Linux_STA_V2.1.1.0.bz2
2. cd 2009_1106_RT3070_Linux_STA_V2.1.1.0
3.vi makefile
- #PLATFORM: Target platform
- #PLATFORM = PC
- PLATFORM = 5VT
- #PLATFORM = IKANOS_V160
- #PLATFORM = IKANOS_V180
- #PLATFORM = SIGMA
- #PLATFORM = SIGMA_8622
- #PLATFORM = INIC
- #PLATFORM = STAR
- #PLATFORM = IXP
- #PLATFORM = INF_TWINPASS
- #PLATFORM = INF_DANUBE
- #PLATFORM = BRCM_6358
- #PLATFORM = INF_AMAZON_SE
- #PLATFORM = CAVM_OCTEON
- #PLATFORM = CMPC
- #PLATFORM = RALINK_2880
- ifeq ($(PLATFORM),5VT)
- LINUX_SRC = /home/Hi3511_VSSDK_V1.1.2.2/pub/kbuild-FULL_REL
- CROSS_COMPILE = arm-hismall-linux-
- endif
4.cd os/linux
5.vi config.mk
- #ifdef WPA_SUPPLICANT_SUPPORT
- # Support Wpa_Supplicant
- HAS_WPA_SUPPLICANT=y
- #endif // WPA_SUPPLICANT_SUPPORT //
- #ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
- # Support Native WpaSupplicant for Network Maganger
- HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
- #endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
6.cd ../../common
vi rtusb_io.c:
- if (ret < 0) {
- //DBGPRINT(RT_DEBUG_OFF, ("#/n"));
- RTMPusecDelay(5000);
- }
否则,加载驱动后会一直打印"#",很烦!!!!!
7.cd ../../..
8.make
这时,应该就编译通过了。在2009_1106_RT3070_Linux_STA_V2.1.1.0/os/linux目录下生成了rt3070sta.ko,也就是RT3070的驱动了。
9.把RT2870STA.dat拷贝到/etc/Wireless/RT2870STA目录下
加载驱动过程
insmod rt3070sta.ko
看一下打印消息:
- rtusb init --->
- === pAd = ca901000, size = 465920 ===
- <-- RTMPAllocAdapterBlock, Status=0
- usbcore: registered new driver rt2870
iwconfig看一下
- ra0 RT2870 Wireless ESSID:""
- Mode:Auto Frequency=2.412 GHz
- Link Quality=10/100 Signal level:-256 dBm Noise level:-143 dBm
- Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
- Tx excessive retries:0 Invalid misc:0 Missed beacon:0
注意wireless_tools之前要移植到开发板上!
其他工作:
把RT2870STA.dat文件复制到/etc/Wireless/RT2870STA 目录下
mkdir -p /etc/Wireless/RT2870STA //创建多层目录。
cp /mnt/rt5370/RT2870STA.dat /etc/Wireless/RT2870STA
ifconfig ra0 up
启动网卡后,会不断出现错误:BIRIdx(1): RXDMALen not multiple of 4.[43507], BulkInBufLen = 416)
修改./MODULE/include/iface/rtmp_usb.h问题就能够解决掉。
#define RXBULKAGGRE_SIZE 12 该为8
在雷凌的官网下载linux版本的rt3070驱动2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO.bz2,解压后的目录名称太长,所以可以对其做修改方便使用,然后进入到目录中
tar –jxf 2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO.bz2
mv 2011_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 Network Maganger
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
Makefile也要进行修改,芯片类型改为3070,默认的PLATFORM为PC,那么将后面的ifeq($(PLATFORM),PC)下的内核源码路径指定为上述的交叉编译过的内核源码目录,交叉编译工具指定为arm-linux-,当然之前应该把交叉工具链安装好,这里不再详述。
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/$(shell uname -r)/kernel/drivers/net/wireless/
CROSS_COMPILE = /usr/local/FriendlyARM/toolschain/4.5.1/bin/arm-linux-
endif
然后如果直接make,会报如下错误:
/home/cabbage/Desktop/rt3070/os/linux/../../chips/rtmp_chip.c: In function '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]: Leaving directory `/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参数是必须的,否则在加载驱动的时候会报找不到版本信息的错误。