USB WIFI 腾达811M无线网卡 -RT5370移植

时间:2021-12-06 15:04:29

自己挖的坑,哭着也要填平!!!


软件环境:虚拟机ubuntu12.04

硬件环境:腾达811M无线网卡

   OK6410:   512m  sdram  2g  nandflash   运行官方提供的3.0.1内核linux      wpa_supplicant版本0.7.3(官方内核自带)

RT5370驱动下载:http://download.csdn.net/detail/andylauren/9581594


        先说一下为什么我要移植RT5370,因为4年前买了一个腾达811M的usb网卡,但是在windows下面需要安装一个官方的驱动,而且觉得驱动界面不是很友好,后来在街上扫码送了个360wifi,从此腾达的网卡就被搁置了。后来学习了嵌入式,一直就想做一个不用网线的开发设备,于是就想做个带wifi的,买了个二手的ok6410开发板,还买了一个sdio的无线网卡,但是说起来飞凌家的模块做的真是不太完善,开发板上有个带缺口的座,但是模块上的母座却是没有反正,只依靠一个小小的1脚标记区分正反面,可能是我在某次使用的时候插反了,导致这个sdio无线模块连接不稳定。于是就想起了腾达网卡,想能不能把他插上去当做网卡使用,答案一定是肯定的,但是我作为一个初学者,这个问题绝对是巨大的挑战。后来经过不懈的努力终于成功了!我的腾达在开发板上正常工作,能够上网,能够挂载nfs,下面就按照我从开始到最终移植的过程说一下,并把我在移植的过程中遇到的问题也说明一下,希望能够对后人有帮助。


首先我们来看下网卡的外观

USB  WIFI  腾达811M无线网卡 -RT5370移植  

就是这样的,在这个时候是不知道腾达811M使用的是什么网卡芯片,然后我把它拆开了,看到里面的芯片写着RT5370N


然后我就开始着手找RT5370驱动的移植资料,其中http://blog.csdn.net/lanyang123456/article/details/7370805   这篇博文对我的帮助很大,也建议先看一下这篇博文。

然后我们下载RT5370驱动的源码,下载地址在我这篇博客开始的地方。首先把rar文件中的文件夹解压到linux目录中,

修改驱动源码根目录下的Makefile

PLATFORM=SMDK

ifeq ($(PLATFORM),SMDK)
LINUX_SRC = /home/linux/sys/linux-3.0.1/(内核源码路径,内核需要被编译过)
CROSS_COMPILE = /home/linux/sys/arm-gcc-4.3.2/bin/arm-linux-(交叉编译工具链路径)
endif


这个时候就可以进行make了,不会报错,但是使用的时候是无法连接无线路由的。

这个地方花费了我大量的时间,而且在这种情况下运行wpa_supplicant只会提示失败,并且不停的尝试重新连接。

Trying to associate with a8:57:4e:0d:76:e6 (SSID='CMCC-PUB' freq=2412 MHz)
ioctl[SIOCSIWGENIE]: Operation not supported
Association request to the driver failed
Authentication with a8:57:4e:0d:76:e6 timed out.

下面我来说一下如何解决这个问题,需要更改./os/linux/config.mk文件中的几个配置选项,如下

# Support AP-Client function
HAS_APCLI=y

# Support Wpa_Supplicant
HAS_WPA_SUPPLICANT=y

# Support Native WpaSupplicant for Network Maganger
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y

需要将这三项选为y。

现在编译出来的驱动文件仍然是无法使用的,在开发板上运行的时候会提示如下错误

  rt5370sta: module license 'unspecified' taints kernel.
  Disabling lock debugging due to kernel taint
  rt5370sta: Unknown symbol usb_alloc_urb (err 0)
  rt5370sta: Unknown symbol usb_free_urb (err 0)
  rt5370sta: Unknown symbol usb_alloc_coherent (err 0)
  rt5370sta: Unknown symbol usb_register_driver (err 0)
  rt5370sta: Unknown symbol usb_put_dev (err 0)
  rt5370sta: Unknown symbol usb_get_dev (err 0)
  rt5370sta: Unknown symbol usb_submit_urb (err 0)
  rt5370sta: Unknown symbol usb_free_coherent (err 0)
  rt5370sta: Unknown symbol usb_control_msg (err 0)
  rt5370sta: Unknown symbol usb_deregister (err 0)
  rt5370sta: Unknown symbol usb_kill_urb (err 0)
  insmod: error inserting 'rt5370sta.ko': -1 Unknown symbol in module

第一句话指出这个模块对内核是有污染的,其实就是没有声明使用GPL协议,需要更改os/linux下的usb_main_dev.c文件,在开头的地方写上

MODULE_LICENSE("GPL"); 

然后make

  LD [M]  /home/linux/16021/RT5370_RT5372_Linux_STA_V2.5.0.1/2011_0225_RT5370_RT5372_Linux_STA_V2.5.0.1_DPO/os/linux/rt5370sta.ko

出现这句话说明编译成功。

将/os/linux/目录下的rt5370sta.ko拷贝到开发板上,并将驱动根目录下的RT2870STA.dat拷贝到开发板的/etc/Wireless/RT2870STA/目录下,前提是需要自己手动创建/etc/Wireless/RT2870STA/目录

# mkdir /etc/Wireless/RT2870STA/ -p

将这两个文件拷贝到开发板上之后,需要修改wpa_supplicant的wpa_supplicant.conf文件,这个文件在开发板的/etc/wpa_supplicant.conf路径下。

这里说一下wpa_supplicant

wpa_supplicant主要是用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证的,由于linux本身并不支持WPA的加密,所以需要移植wpa_supplicant来使wifi能够连接WPA加密的无线路由上,简单的说,wpa_supplicant就是WiFi驱动和用户的中转站外加对协议和加密认证的支持。由于ok6410的3.0.1内核已经移植好了wpa_supplicant的0.7.3版本,所以对于wpa_supplicant的移植这里就不做讲解。

接着说wpa_supplicant.conf文件的内容,这里的问题我也是解决了很久。官方给的例程是这样的

ctrl_interface=/var/run/wpa_supplicant

network={
ssid="max" //填写无线网络的的用户名
key_mgmt=WPA-PSK
proto=WPA
pairwise=TKIP
group=TKIP
psk="1234567890" //填写密码
}

我使用这个模板出现了skip WPA IE - PTK cipher mismatch这个问题,在找到路由之后,提示密码错误,后来查看了路由器发现原来密码也有几种加密方式。TKIP和AES两种,上面的写法就是被固定为TKIP方式,TKIP方式的带宽很低,所以现在都采用的是AES方式加密,在wpa_supplicant中AES加密方式对应的是CCMP,也就是需要把TKIP改为CCMP,这个我没有验证过,我使用的是下面的方法,不声明使用的是哪种加密方式,让wpa_supplicant去自适应。

ctrl_interface=/var/run/wpa_supplicant


update_config=1

network={
     ssid="mingzi"
     key_mgmt=WPA-PSK
     psk="mimamimamima"
}       

我使用这个配置成功的连接了AES加密方式 的路由器。


然后我们将驱动加载进内核

insmod rt5370sta.ko

然后可以使用

wpa_supplicant -ira0 -Dwext -c/etc/wpa_supplicant.conf -dd &
wpa_supplicant -ira0 -Dwext -c/etc/wpa_supplicant.conf &

这两条指令中的任意一个,-dd的会输出更过的信息。

在出现

Trying to associate with a8:57:4e:0d:76:e6 (SSID='CMCC-PUB' freq=2412 MHz)
ioctl[SIOCSIWGENIE]: Operation not supported
Association request to the driver failed
Associated with a8:57:4e:0d:76:e6
WPA: Key negotiation completed with a8:57:4e:0d:76:e6 [PTK=CCMP GTK=CCMP]
CTRL-EVENT-CONNECTED - Connection to a8:57:4e:0d:76:e6 completed (auth) [id=0 id_str=]

后并且无线网卡的灯也亮了起来说明已经可以正常使用了,这时候需要禁用有线网卡eth0。如果使用的是nfs挂载的文件系统建议最后禁用有线网卡,因为一旦禁用就没有文件系统了,开发板就没办法操作了。

ifconfig eth0 down

这时候无线网卡还没有ip,可以使用静态分配的方式

ifconfig ra0 192.168.1.20

如果路由器支持动态分配也可以使用动态分配

udhcpc -i ra0

之后会返回

udhcpc (v1.13.3) started
Sending discover...
Sending select for 192.168.1.104...
Lease of 192.168.1.104 obtained, lease time 7200
deleting routers
route: SIOCDELRT: No such process
adding dns 10.10.0.1
adding dns 124.207.160.106

表示分配IP成功,到这里我们的腾达无线网卡就已经可以正常使用了,想做什么都可以,完全和有线是一样的。

下面是我的终端显示的信息

root@FORLINX6410:/# insmod rt5370sta.ko 
root@FORLINX6410:/# wpa_supplicant -ira0 -Dwext -c/etc/wpa_supplicant.conf &
root@FORLINX6410:/#
root@FORLINX6410:/#
root@FORLINX6410:/#
root@FORLINX6410:/# Trying to associate with a8:57:4e:0d:76:e6 (SSID='CMCC-PUB' freq=2412 MHz)
ioctl[SIOCSIWGENIE]: Operation not supported
Association request to the driver failed
Associated with a8:57:4e:0d:76:e6
WPA: Key negotiation completed with a8:57:4e:0d:76:e6 [PTK=CCMP GTK=CCMP]
CTRL-EVENT-CONNECTED - Connection to a8:57:4e:0d:76:e6 completed (auth) [id=0 id_str=]

root@FORLINX6410:/#
root@FORLINX6410:/#
root@FORLINX6410:/#
root@FORLINX6410:/#
root@FORLINX6410:/# ifconfig
eth0 Link encap:Ethernet HWaddr 08:90:00:A0:90:90
inet addr:192.168.1.232 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:21757 errors:0 dropped:0 overruns:0 frame:0
TX packets:9230 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:27797014 (26.5 MiB) TX bytes:1513652 (1.4 MiB)
Interrupt:108 Base address:0xc000

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

ra0 Link encap:Ethernet HWaddr C8:3A:35:CF:42:62
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:3 overruns:65015 frame:65015
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:164689 (160.8 KiB) TX bytes:2226 (2.1 KiB)

root@FORLINX6410:/# udhcpc -i ra0
udhcpc (v1.13.3) started
Sending discover...
Sending select for 192.168.1.104...
Lease of 192.168.1.104 obtained, lease time 7200
deleting routers
route: SIOCDELRT: No such process
adding dns 10.10.0.1
adding dns 124.207.160.106
root@FORLINX6410:/# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1): 56 data bytes
64 bytes from 192.168.1.1: seq=0 ttl=64 time=5.951 ms
64 bytes from 192.168.1.1: seq=1 ttl=64 time=0.505 ms
^C
--- 192.168.1.1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.505/3.228/5.951 ms
root@FORLINX6410:/#
到这里就结束了,下载再提供一个开机自启动的脚本文件

#!/bin/sh 

insmod rt5370sta.ko&&wpa_supplicant -ira0 -Dwext -c/etc/wpa_supplicant.conf &
sleep 40&&udhcpc -i ra0&&ifconfig eth0 down

这个脚本是在最后才关闭有线网卡,所以即使使用nfs挂载根文件系统也可以。其中有一个sleep 40是等待无线驱动加载和无线网卡连接路由的时间,这个需要根据自己的实际情况去更改。

其他错误解决:

/os/linux/sta_ioctl.c:2225: error: unknown field 'private' specified in initializer

/os/linux/sta_ioctl.c:2226: error: unknown field 'num_private' specified in initializer

/os/linux/sta_ioctl.c:2228: error: unknown field 'num_private_args' specified in initializer

问题原因:是因为在配置内核的时候,没有选择支持802.11的无线设备驱动。

解决办法:重新配置编译指定的Linux Kernel,make menuconfig

Device Drivers  ---> 

[*] Network device support  ---> 

[*]   Wireless LAN  --->  

 <*>   IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP)   

重新编译内核,并开发板也要重新下载内核,然后驱动也要重新编译,要保持和编译过的kernel移植,包括编译器版本。


Ralink雷凌rt3070驱动的ARM平台移植问题&lt;error: unknown field ‘private’ specified in initializer&gt;

../os/linux/sta_ioctl.c:2227: error: unknown field 'private' specified in initializer
../os/linux/sta_ioctl.c:2227: warning: initialization from incompatible pointer type
../os/linux/sta_ioctl.c:2228: error: unknown field 'num_private' specified in initializer
../os/linux/sta_ioctl.c:2228: warning: excess elements in struct initializer
../os/linux/sta_ioctl.c:2228: warning: (near initialization for 'rt28xx_iw_handler_def')
../os/linux/sta_ioctl.c:2229: error: unknown field 'private_args' specified in initializer
../os/linux/sta_ioctl.c:2229: warning: excess elements in struct initializer
../os/linux/sta_ioctl.c:2229: warning: (near initialization for 'rt28xx_iw_handler_def')
../os/linux/sta_ioctl.c:2230: error: unknown field 'num_private_args' specified in initializer
../os/linux/sta_ioctl.c:2230: warning: excess elements in struct initializer
../os/linux/sta_ioctl.c:2230: warning: (near initialization for 'rt28xx_iw_handler_def')
make[2]: *** [/home/littlemo/iData/lierda/EA/USB2WiFi/USB-WIFI-RT3070-WPA-V1.0/src/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.o] ?? 1
make[1]: *** [_module_/home/littlemo/iData/lierda/EA/USB2WiFi/USB-WIFI-RT3070-WPA-V1.0/src/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/os/linux] 错误 2
make[1]:正在离开目录 `/home/littlemo/iData/kernelLinux/arm-linux-2.6.33'
make: *** [LINUX] 错误 2

       Platform:           Ubuntu 13.04

       ARM Kernel:    2.6.33

       CrossCompile:4.3.33



       问题原因:是因为在配置Makefile时,我们指定的内核在配置时不支持802.11的无线设备驱动。


       解决办法:重新配置编译指定的Linux Kernel,将Device Drivers==>Network deivce support==>Wireless LAN==><*> USB ZD1201 based Wireless device support,编译即可