最近想搞一个无线的网络收音机玩玩,有现成的at91sam9261ek板子,linux操作系统是2.6.20,mplayer前几天已经成功移植到该平台,使用网线连接播放电台已经ok。
去科技京城赛格4楼转了一圈询问商家usb类型的无限网卡,好象仅有的几个有usb无线网卡的商户卖的都是TL-WN321G或者是TL-WN322G类型的。呵呵其实我还不知道上海卖这些电脑周边配件的集散地在哪里?因为比较熟悉赛格。 网上找了一圈算是还有收获,TL-WN321G使用的是rt73芯片,还好有rt73的开源linux驱动。
1 .从 http://rt2x00.serialmonkey.com/wiki/index.php?title=Downloads 下载:rt73 (USB)代码。
2 . 解压到内核源代码的drivers/usb/net/rt73目录下。
3 .删除其Makefile文件。重新编写Makefile如下:
- CROSS-COMPILE = arm-linux-
- CC=$(CROSS-COMPILE)gcc
- obj-$(CONFIG_RT73) +=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
- KDIR := /home/at91sam9261ek/linux-2.6.20
- PWD := $(shell pwd)
- default:
- $(MAKE) -C $(KDIR) M=$(PWD) modules
- clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers test
- nstall:
- scp rt73.ko 192.168.2.46:/home/nfs/usr
4. 修改drivers/usb/net/Kconfig 加入下面的项:
- config RT73
- tristate "support rt73 wireless usb network device"
- depends on USB && NET && USB_USBNET
5. 修改drivers/usb/net/Makefile 加入下面的项:
- obj-$(CONFIG_RT73) += rt73/
6. 重新配置内核选中rt73设备。
- make menuconfig
7. 编译:
如果选中为M 使用 make modules 编译rt73.ko 运行时候手工加载。
如果选中为* 使用make uImage 直接把rt73设备编译到内核去。
8. 插入rt73
提示找不到rt73.bin ,应该是fireware加载有问题,可 是我一直没有处理掉,后来突然发现 http://www.ralinktech.com.tw/data/RT73_Linux_STA_Drv1.0.4.0.tar.gz 已经把rt73.bin文件转换为C语言数组存放在rtmp_init.c文件里,不需要使用hotplug事件去加载rt73.bin了。于是决定使用RT73_Linux_STA_Drv1.0.4.0.tar.gz 代码。
9. 下载RT73_Linux_STA_Drv1.0.4.0.tar.gz 。
10. 修改makefile 适合编译到arm linux2.6.20上。
代码原来的makefile没有考虑到arm上的移植不是很适合交叉编译的,我的makefile修改后如下:
- #####################################################################
- # Module Name: Makefile
- # Abstract: Makefile for rt73 linux driver on kernel series 2.6
- ######################################################################
- WFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs
- CFLAGS += $(WFLAGS)
- 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
- 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
- KDIR := /home/at91sam9261ek/linux-2.6.20
- all:
- # make -C $(KDIR) SUBDIRS=$(shell pwd) modules
- make -C $(KDIR) 'EXTRA_CFLAGS=-DRTMP_EMBEDDED -I.' 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
11. 重新编译RT73_Linux_STA_Drv1.0.4.0.tar.gz 。
由于在Makefile gcc编译选项里加入 DRTMP_EMBEDDED 造成一个编译错误,要修改rtmp_init.c中
VOID RTMPMoveMemory( OUT PVOID pDest, IN PVOID pSrc, IN ULONG Length)
函数,修改后如下:
- VOID RTMPMoveMemory(
- OUT PVOID pDest,
- IN PVOID pSrc,
- IN ULONG Length)
- {
- #ifdef RTMP_EMBEDDED
- if(Length <= 8){
- unsigned char *dest,*src;
- int i;
- dest = pDest;
- src = pSrc;
- for(i=0;i<Length;i++){
- *(dest++) = *(src++);
- }
- }
- else
- memcpy(pDest, pSrc, Length);
- #else
- memcpy(pDest, pSrc, Length);
- #endif
- }
12. 加载rt73.ko.
insmod rt73.ko
ifconfig rausb0 up
udhcpc -i rausb0
可以从无线AP获取到ip地址ping 一下网关,scp一个文件都成功了。
13.总结:
看来其实移植这个usb无线网卡并不麻烦,网上有人说1.0.3版本的很难,移植好的代码 要收费,现在看来1.0.4是很好移植的并不难。