rt73 USB無線網卡驅動在armlinux平台上的移植

admin @ 2014-03-25 , reply:0

       最近想搞一個無線的網路收音機玩玩,有現成的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
   install:
           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是很好移植的並不難。




[admin via 研發互助社區 ] rt73 USB無線網卡驅動在armlinux平台上的移植已經有2198次圍觀

http://cocdig.com/docs/show-post-42054.html