基于arm/Linux平台USB无线网卡的wifi驱动移植
这是同学在用的板子,arm平台是三星2440,Linux内核是2.6.24,威盛VNT6656的USB无线网卡;开发平台是Fedora10,内核是2.6.27。遭遇的问题主要有如下几个:
一、驱动程序的版本不对
开始在网上找了个VNT6656的Linux驱动程序,直接先在本地机器上编译。结果错误太多太多,改了一批还有一大批,主要问题是很多的“结构体”不对,而且开始还得把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里面的CC、LD等交叉编译工具变量设为arm-linux-gcc、arm-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”是新建的无线连接名字,BSSTYPE=adhoc,建立点对点的adhoc网络,可以让其他网络寻找到。加入附件的网络,把
/sbin/wetctl $DEVICE join /
infra/ #BSSTYPE类型
“ChianNet” / #想要连接的无线网络名称
11 / #channel
$PSMODE /
$AUTHTYPE
几个选项改掉就行。也可以直接用wetctl几个命令
wetctl eth1 [scan、link 、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-boot和linux2.6.27.9到mini2440上,最近有点空,手头有一个usb接口的zd1211b芯片的wifi无线网卡(PSP和NDSL玩家都知道的神卡),于是决定在内核中加入此无线网卡的驱动。我是在我移植的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,编译完成后,将生成的iwconfig,iwlist文件拷贝到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.修改RT73的Makefile,设置内核位置和编译选项: ?删除以前的modules选项,并将arm编译项改成modules,这样编译的时候才是for ARM版本的驱动模块; ?修改KERNDIR为Qwerk内核位置: 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一下网关及外网地址
|