基于arm/Linux平台USB无线网卡的wifi驱动移植

来源:互联网 发布:网络搜索找人 编辑:程序博客网 时间:2024/05/16 12:05

基于arm/Linux平台USB无线网卡的wifi驱动移植

这是同学在用的板子,arm平台是三星2440Linux内核是2.6.24,威盛VNT6656USB无线网卡;开发平台是Fedora10,内核是2.6.27。遭遇的问题主要有如下几个:

一、驱动程序的版本不对

开始在网上找了个VNT6656Linux驱动程序,直接先在本地机器上编译。结果错误太多太多,改了一批还有一大批,主要问题是很多的“结构体”不对,而且开始还得把CFLAGS全部换成EXTRA_CFLAGS。最终才反应过来,可能下的驱动程序版本有问题。到www.viaarena.com下载最新的驱动:http://www.viaarena.com/Driver/VT6656_Linux_src_v1.19_12_x86.zip 。之前的驱动是1.13版本的。根本的问题在于,没有认真读驱动说明文档,开始的版本根本不支持fedora10

那么,到底两个驱动有什么不同呢?原因在于,在Linux2.6.24以后的内核中,网络部分有了改动,而且是网络部分很重要的结构体被改动了,第一个驱动肯定是基于2.6.24之前的内核。比如,struct sk_buff,在这里可以看到具体的不同点,文中提到的《Professional Linux Kernel Architecture》可以网上下一下,确实不错,内容包含2.6.24以后比较新的内容。

二、编译驱动模块

驱动程序是是要编译成模块的,直接make就是编译本地机器上的驱动,很顺利,生成的vntwusb.ko可以在本地机器上加载成功,使用正常,窃喜。接 下来把Makefie里面的CCLD等交叉编译工具变量设为arm-linux-gccarm-linux-ld。继续make,又出错了,具体错误 忘了。正确的方法是,make -C $(KERNEL_DIR) M=$(MODULE_DIR) ,-C指名内核所在文件夹,不写就按照默认的。默认的是本地机器上的内核,本人所在机器默认内核是/usr/src/kernels /2.6.27.5-117.fc10.i686,这样肯定不行。M指名要编译模块所在的路径。实际命令是

make -C /media/Study/temp/utu-Linux2.6.24_for_utu2440_2009-03-15 M=/media/Study/temp/VT6656_Linux_src_v1.19_12_x86/driver

继续编译,依然有错,因为Makefile还没改好。把Makefile里的KSRC变量直接赋值KSRC=/media/Study/temp /utu-Linux2.6.24_for_utu2440_2009-03-15,Makefile里面还有KSP等捣乱的变量,直接都删掉即可。 make 时候还要新增加一个选项,

KSRC=/media/Study/temp/utu-Linux2.6.24_for_utu2440_2009-03-15

,不加好像不行,郁闷。。。继续编译,会在ioctl.c line:298 出现段错误segmentation fault,把这一行注释掉

// pList->sBSSIDList[ii].wBeaconInterval = pBSS->wBeaconInterval;

这样就可以得到我们需要的vntwusb.ko。不解的是,在按照本地机器的内核编译就没有任何问题。

三、还要编译内核

有了驱动模块,在板子上加载时出现“Unknown symbol in module”的错误。原来板子预装的内核是不带wifi也即802.11模块的。回想下,在编译结束时也打印了一个警告信息,说是wireless send event 没注册之类的。。重新编译内核时可以直接找到板子默认配置文件,把里面wireless部分改一下,并改文件名为.config作为默认配置.make menuconfig当然也可以。改动如下:

#
# Wireless
#
CONFIG_CFG80211=y
CONFIG_NL80211=y
CONFIG_WIRELESS_EXT=y
CONFIG_IEEE80211=y
# CONFIG_IEEE80211_DEBUG is not set
CONFIG_IEEE80211_CRYPT_WEP=y
# CONFIG_IEEE80211_CRYPT_CCMP is not set
# CONFIG_IEEE80211_CRYPT_TKIP is not set
# CONFIG_RFKILL is not set

内核编译好了,下载到板子里去就好了。。

四、如何在板子上使用无线网卡呢?

前提,USB Host驱动需要已经安装好了。加载vntw6656.ko模块成功之后,要使用无线网卡还需把驱动程序包里的wetctl工具编译一下,修改 Makefile直接make就行,编译好了考到板子的/sbin/里。另外程序包里还有个脚本文件,使用时可以根据需要改动。 DESIRED_SSID=“TestAP”是新建的无线连接名字,BSSTYPEadhoc,建立点对点的adhoc网络,可以让其他网络寻找到。加入附件的网络,把
/sbin/wetctl $DEVICE join /
infra/   #BSSTYPE
类型
ChianNet / #想要连接的无线网络名称
11 /
channel
$PSMODE /
$AUTHTYPE

几个选项改掉就行。也可以直接用wetctl几个命令

wetctl eth1 scanlink list join等]

ifconfig 两个个命令

ifconfig eth1 192.168.1.110

ifconfig eth1 up

总结:Linux 移植真累。。。

 

 

 

 

 

 

 

 

 

 

 

 


移植wifi无线网卡到mini2440上全过程【转】

http://www.arm9home.com/bbs/read.php?tid-1305-fpage-2.html

正在实验,先转载,以避免丢失

 

前段时间移植了U-bootlinux2.6.27.9mini2440上,最近有点空,手头有一个usb接口的zd1211b芯片的wifi无线网卡(PSPNDSL玩家都知道的神卡),于是决定在内核中加入此无线网卡的驱动。我是在我移植的linux2.6.27.9内核上移植的。关于内核移植,请看我的这篇文章。http://blog.chinaunix.net/u2/75270/showart.php?id=1796658

新版的linux2.6.27.9已自带zd1211b的驱动。此驱动在rat-linux-2.6.27.9/drivers/net/wireless/zd1211rw/中。
要让此驱动生效,得修改内核配置。
选中
networking support-->wireless-->Generic IEEE 802.11 Networking Stack (mac80211)
选中
device drivers-->netword device support-->wirelss lan-->ZyDAS ZD1211/ZD1211B USB-wireless support
重新编译内核。下载到板子中,重启。加入无线网卡。出现
usb 1-1: USB disconnect, address 2
usb 1-1: new full speed USB device using s3c2410-ohci and address 3
usb 1-1: configuration #1 chosen from 1 choice
usb 1-1: reset full speed USB device using s3c2410-ohci and address 3
zd1211rw 1-1:1.0: phy1
表示无线网卡已被识别。使用cat /proc/net/wireless 命令,可以查看到系统中多了个wlan0网卡。此时,网卡还没工作。使用命
ifconfig wlan0 up则出现firmware:requesting zd1211,然后没反应了,这是因为没有firmware的原因,从这里
http://downloads.sourceforge.net/zd1211/zd1211-firmware-1.4.tar.bz2?modtime=1191498990&big_mirror=0
下载到zd1211 firmware 1.4后,根据firmware的说明,将其中的zd1211_*文件拷贝到根文件系统/lib/firmware/zd1211目录中。这
里再执行ifconfig wlan0 up命令,则出现
firmware: requesting zd1211/zd1211b_ub
firmware: requesting zd1211/zd1211b_uphr
zd1211rw 1-1:1.0: firmware version 4725
zd1211rw 1-1:1.0: zd1211b chip 0ace:1215 v4810 full 00-02-72 AL2230_RF pa0 g--N
网卡硬件开始正常工作了。其中,0ace:1215是网卡的ID,可以用主机linux系统命令lsusb查看到。
但此时,网卡还没被正确配置,还不能正常使用。
要正常使用无线网卡,还要正确配置。linux下的配置工具是wireless-tools,可以在这里下载到它的最新版。
http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html
下载后,将源代码解压。再修改其中的makefile文件,将其中的
CC = gcc
AR = ar
RANLIB = ranlib
改为
CC = arm-linux-gcc
AR = arm-linux-ar
RANLIB = arm-linux-ranlib
再执行make,编译完成后,将生成的iwconfigiwlist文件拷贝到rat-linux for mini2440的根文件系统中的/bin目录下,将
libiw.so.29
拷贝到/lib目录下。
启动mini2440开发板,进入linux命令行后,执行ifconfig wlan0 up,启动无线网卡。再执行iwlist scanning,此命令可以搜索到
可用的无线网络接入点。我的无线接入点是一台无线路由器,ESSID"rat-linux",执行此命令后就会下列输出
wlan0     Scan completed :
          Cell 01 - Address: 00:19:C6:53:B9:CE
                    ESSID:"rat-linux"
                    Mode:Master
                    Channel:2
                    Frequency:2.417 GHz (Channel 2)
                    Quality=11/100  Signal level:66/100
                    Encryption key:on
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
                              9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
                              48 Mb/s; 54 Mb/s
                    Extra:tsf=000000056306469f
                    Extra: Last beacon: 1065ms ago

其中可以看到我的无线接入点是需要密码的。假设密码是123456。使用如下的命令设置密码。
  iwconfig wlan0 key 123456
为了能接无线网,还要使用下面的命令设置ESSID
  iwconfig wlan0 essid "rat-linux"
其它的参数可以都采用默认的,不用再设了。可以使用下面的命令加入无线网了。
  
  iwconfig wlan0 ap auto
再执行iwconfig wlan0,就可以看到下面的信息。
wlan0     IEEE 802.11bg  ESSID:"rat-linux"
          Mode:Managed  Frequency:2.417 GHz  Access Point: 00:19:C6:53:B9:CE
          Bit Rate=1 Mb/s   Tx-Power=27 dBm
          Retry min limit:7   RTS thr:off   Fragment thr=2352 B
          Encryption key:1234-56   Security mode:open
          Power Management:off
          Link Quality=100/100  Signal level:66/100
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
这就表示已接入无线网。
最后,为无线网卡指定IP地址。命令如下
  ifconfig wlan0 192.168.1.30 netmask 255.255.255.0
我的开发主机和无线网卡处于同一网段,因此是可以相互PING通的。因此可以用从开发主机上PING无线网卡的IP地址的方法来确网
卡是否工作正常。从主机上执行ping 192.168.1.30,正常PING通。
至此,无线网卡安装全部完成。
最后,为了方便配置,可以将上述的配置命令写入linux脚本文件,以后,只要执行此脚本,即可完成上述步骤的配置。脚本文件内
容如下。
#! /bin/sh
ifconfig wlan0 up
iwconfig wlan0 key 123456
iwconfig wlan0 essid "rat-linux"
iwconfig wlan0 ap auto
ifconfig wlan0 192.168.1.30 netmask 255.255.255.0

 原文地址 http://www.arm9home.com/bbs/read.php?tid-1305-fpage-2.html

 

 

 

 

 

 

 

 

转贴:无线网卡驱动RT73的移植

2009-06-15 22:52

1.下载最新版的RT73无线网卡驱动:
# wget http://rt2x00.serialmonkey.com/rt73-cvs-daily.tar.gz
解压:# tar zxvf rt73-cvs-daily.tar.gz

2.在内核中创建新文件夹drivers/usb/net/rt73
# mkdir drivers/usb/net/rt73
将解压出来的文件夹Module下的文件拷贝到刚才新建的rt73文件夹中:
# cp rt73-(time)/Module/* /home/oem/trunk/cirrus-1-0-0-4/linux-2.6.8.1/drivers/usb/net/rt73

 

3.修改Qwerk板内核源代码,加入RT73驱动的配置信息,以使在make menuconfig 中能添加RT73驱动的选项。

?修改drivers/usb/net/Kconfig文件,加入RT73的驱动模块的配置项:
# gedit drivers/usb/net/Kconfig &
加入以下内容:
config RT73
tristate “support for rt73 wireless usb device”
depends on USB && NET && USB_USBNET

?修改drivers/usb/net/Makefile, 加入rt73的编译项:
# gedit drivers/usb/net/Makefile &
添加一下内容:
obj-$(CONFIG_RT73)+= rt73/

4.修改RT73Makefile,设置内核位置和编译选项:

?删除以前的modules选项,并将arm编译项改成modules,这样编译的时候才是for ARM版本的驱动模块;

?修改KERNDIRQwerk内核位置:
KERNDIR=/home/oem/trunk/cirrus-1-0-0-4/linux-2.6.8.1

5.配置内核:

?Qwerk默认配置拷贝到内核根目录下:
# cp ../edb9302/linux.config .config

?make menuconfig界面配置编译选项,选上RT73无线网卡编译选项:
USB devices à network à support for rt73 wireless usb device,按空格键选为M,将其编译成模块。

6.编译内核模块:
# make modules
成功编译后,会在drivers/usb/net/rt73目录下生成rt73.ko驱动文件,将其拷贝到FTP目录下,以便于下载到Qwerk板上:
# cp drivers/usb/net/rt73/rt73.ko /home/ftp/

7.下载rt73驱动到Qwerk上,并修改一些脚本文件使其开机加载驱动并启用网卡:
假设Qwerk板已经可以启动起来(烧写系统可以参考QwerkDevelopmentGuide),启动Qwerk板,从minicom命令行操作:
# cd /opt/driver/
# wget ftp://192.168.1.201/rt73.ko
编写开机加载rt73.ko驱动、启用网卡脚本,将其放入/opt/scripts/目录下:
# cd ../scripts/
# vi wifi-up
加入如下内容:
(去公司后Copy到这儿)
修改/opt/scripts/robot.init脚本文件,在最后添加wifi-up脚本:
# vi robot.init
加入:
/opt/scripts/wifi-up
保存推出。

8.至此为止,无线网卡驱动移植和配置工作已经完成,重启Qwerk,无线网卡就能工作了。

说明:

1.如果按照modules编译的rt73.ko不能工作的话,可以选用armdebug编译。

附一个老外的指导:

put the contents of the Module directory into my arm 2.6.15 kernel tree under drivers/usb/net/rt73, then did the following to make it part of the kernel build:
- I added to the /drivers/usb/net/Kconfig to add an option to enable the rt73 module,
- Then edited the Makefile in /drivers/usb/net to have it build the subdir rt73 when the option above is active.
Then I ran the kernel menuconfig to actually enable that option.

Finally I edited the Makefile for the rt73 driver itself:
- put the right paths in KERNEL_SOURCE and MODULE_ROOT
- removed the calls to /sbin/depmod since we're not on the target system
- deleted the module and debug rules
- renamed arm rule to module and armdebug rule to debug

At this point doing make modules && make modules_install from the kernel root did the trick.
I'm not sure if this will be enough on your system. It worked for me.

 

 

 

 

 

 

USB无线网卡驱动RT73的移植

 

来源: ChinaUnix博客  日期: 2009.03.26 14:52 (共有0条评论) 我要评论

 

1.RT73无线网卡驱动:
http://www.ralinktech.com.tw/data/drivers/2009_0206_RT73_Linux_STA_Drv1.1.0.2.tar.bz2

2.
解压
# tar -xvzf  
2009_0206_RT73_Linux_STA_Drv1.1.0.2.tar.bz2

# cd 2009_2006_RT73_Linux_STA_Drv_1.1.0.2/Module
# cp Makefile.6  ./Makefile
3.
编辑
Makefile
######################################################################
# Module Name: Makefile
# Abstract: Makefile for rt73 linux driver on kernel series 2.6
######################################################################
CC     :=arn-linux-gcc

LD     :=arm-linux-ld

#PLATFORM=PC
PLATFORM=CMPC

#Enable for wpa_supplicant's spcific driver "driver_ralink.c", default enabled.
HAS_RALINK_WPA_SUPPLICANT_SUPPORT=y
#Enable for wpa_supplicant's generic driver "driver_wext.c", used for NetworkManager
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n
#Support Block Net-If during TxSw queue full.
HAS_BLOCK_NET_IF=y
WFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs
ifeq ($(HAS_RALINK_WPA_SUPPLICANT_SUPPORT),y)
WFLAGS += -DRALINK_WPA_SUPPLICANT_SUPPORT
endif
ifeq ($(HAS_NATIVE_WPA_SUPPLICANT_SUPPORT),y)
WFLAGS += -DNATIVE_WPA_SUPPLICANT_SUPPORT
endif
ifeq ($(HAS_BLOCK_NET_IF),y)
WFLAGS += -DBLOCK_NET_IF
endif
## Comment/uncomment the following line to enable/disable debugging
#EXTRA_CFLAGS += -DDBG
EXTRA_CFLAGS += $(WFLAGS)
ifeq ($(PLATFORM),PC)
LINUX_SRC =/lib/modules/$(shell uname -r)/build
endif
ifeq ($(PLATFORM),CMPC)
#LINUX_SRC = /home/fonchi/vendor/kernel-default-2.6.21/linux-2.6.21
LINUX_SRC = /usr/work/linux-2.6.24

endif
EXTRA_CFLAGS += -I$(LINUX_SRC)/include
obj-m := rt73.o
rt73-objs := /
rtmp_main.o /
mlme.o /
connect.o /
rtusb_bulk.o /
rtusb_io.o /
sync.o /
assoc.o /
auth.o /
auth_rsp.o /
rtusb_data.o /
rtmp_init.o /
sanity.o /
rtmp_wep.o /
rtmp_info.o /
rtmp_tkip.o /
wpa.o md5.o
ifeq ($(HAS_NATIVE_WPA_SUPPLICANT_SUPPORT),y)
rt73-objs += rtmp_wext.o
endif
ifeq ($(HAS_BLOCK_NET_IF),y)
rt73-objs += netif_block.o
endif
## Configuration files on SuSE
#NDDIR=/etc/sysconfig/network
#MOD_CONF=/etc/modprobe.d/module-renames
## NDDIR/ifcfg-rausb0
ND_CONF=/etc/sysconfig/network-scripts/ifcfg-rausb0
ifdef NDDIR
NDDIR := $(NDDIR)
else
  NDDIR := /etc/sysconfig/network-scripts
endif
ifdef MOD_CONF
MOD_CONF := $(MOD_CONF)
else
MOD_CONF := /etc/modprobe.conf
endif
all:
make -C $(LINUX_SRC) SUBDIRS=$(shell pwd) modules
clean:
rm -rf *.o *~ .*.cmd *.ko *.mod.c .tmp_versions built-in.o
install:
make -C /lib/modules/$(shell uname -r)/build /
INSTALL_MOD_DIR=extra SUBDIRS=$(shell pwd) /
modules_install
@echo "Network device directory $(NDDIR)";
@echo "Module configuration file $(MOD_CONF)";
@if [ -d "$(NDDIR)" ] ; then /
  if [ ! -f "$(ND_CONF)" ]; then /
   echo "Create 'ifcfg-rausb0' in $(NDDIR)/"; /
   cp ifcfg-rausb0 $(NDDIR)/ ; /
  fi; /
  fi
@if ! grep -q 'rausb0' $(MOD_CONF) ; then /
  echo "append 'alias rausb0 rt73' to $(MOD_CONF)"; /
  echo "alias rausb0 rt73" >> $(MOD_CONF) ; /
  fi
/sbin/depmod -a
# auto copy *.bin to /etc/Wireless/RT73STA
# mkdir /etc/Wireless ;
# mkdir /etc/Wireless/RT73STA ;
# cp $(shell pwd)/*.bin /etc/Wireless/RT73STA ;
# cp $(shell pwd)/*.dat /etc/Wireless/RT73STA ;
# Copy file on Mandriva 2007.1
# cp $(shell pwd)/*.bin /lib/firmware/ ;
config:
@touch config.mk
@./Configure
4.
交叉编译

# make all
生成
rt73.ko
5.
在嵌入式linux

# mkdir /etc/Wireless
# mkdir /etc/Wireless/RT73STA
# cp rt73.bin /etc/Wireless/RT73STA/rt73.bin
# dos2unix rt73sta.dat
# cp rt73sta.dat  /etc/Wireless/RT73STA/rt73sta.dat
# /sbin/insmod rt73.ko
#/sbin/ifconfig rausb0 inet 192.168.2.9 up
#route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.2.1  dev rausb0
ping  192.168.2.1 -t


# ifconfig rausb0 up     
# iwconfig            
# iwlist rausb0 scanning     
# iwconfig rausb0 essid "your wireless net"      
# iwconfig rausb0 key "your key"                     
设置一下IP地址和DNS,就可以上网了!

可使用udhcpc自动获取ip地址

# udhcpc -i rausb0
ping
一下网关及外网地址