linux下移植RT3070 驅動

RT3070驅動移植

無線網卡爲RT3070,驅動分爲STA驅動和SoftAP驅動兩種,STA驅動支持無線網卡工作在STA模式下,而SoftAP的驅動支持無線網卡工作在軟AP的模式下,可以作爲一個軟的接入點。STA驅動爲2010_0831_RT3070_Linux_STA_v2.3.0.0_DPO.bz2。SoftAP的驅動是:2010_0203_RT3070_SoftAP_v2.4.0.1_DPA.bz2。需要移植STA驅動和SoftAP驅動,兩款驅動的移植步驟差不多。下邊首先對STA驅動進行移植。

 

STA驅動的移植

 

#tar jxvf 2010_0831_RT3070_Linux_STA_v2.3.0.0_DPO.bz2

cd 2010_0831_RT3070_Linux_STA_v2.3.0.0_DPO

 

修改原有的Makefile文件如下(只給出需要修改的部分,“-”表示刪除的行,“+”表示添加的行):

+#Makefile for RT3070 on MBC-SAM9G45

+#2010_11_13 by liyi

RT28xx_MODE = STA

TARGET = LINUX

CHIPSET = 3070

-PLATFORM = PC

+PLATFORM = IXP

 

ifeq ($(PLATFORM),IXP)

-LINUX_SRC = /project

-CROSS_COMPILE = arm-linux-

+LINUX_SRC = /home/Embest_SAM9G45/linux-2.6.30

+CROSS_COMPILE = /usr/local/arm2007q1/bin/arm-none-linux-gnueabi-

endif

 

修改os/linux文件夾中的config.mk文件,需要修改的地方如下(只給出需要修改的部分):

# Support Wpa_Supplicant

- HAS_WPA_SUPPLICANT=n

+HAS_WPA_SUPPLICANT=y

# Support Native WpaSupplicant for Network Maganger

-HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n

+HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y

 

ifeq ($(PLATFORM),IXP)

- WFLAGS += -DRT_BIG_ENDIAN

+#WFLAGS += -DRT_BIG_ENDIAN

endif

 

ifeq ($(PLATFORM),IXP)

        EXTRA_CFLAGS := -v $(WFLAGS) -I$(RT28xx_DIR)/include

endif

 

ifeq ($(PLATFORM),IXP)

-         CFLAGS := -v -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale -malignment-traps -msoft-float $(WFLAGS)

-        EXTRA_CFLAGS := -v $(WFLAGS) -I$(RT28xx_DIR)/include

-         export CFLAGS       

-

+

endif

 

修改完成以後,通過以下命令編譯:

make ARCH=arm KBUILD_NOPEDANTIC=1

 

如果不加KBUILD_NOPEDANTIC=1將出現CFLAGS was changed in …. Fix it to use EXTRA_CFLAGS的錯誤,編譯不能通過。編譯完成後,會在os/linux文件夾中生成rt3070sta.ko的驅動模塊。此模塊通過下載工具可以下載到/mnt目錄。

在驅動目錄下新建一個文件夾Wireless/RT2870STA,將RT2870STA.dat複製進Wireless/RT2870STAm目錄下,同時將此文件夾拷貝進開發板。從超級終端進入開發板目錄/mnt使用以下命令將Wireless文件夾拷貝到/etc目錄下,將rt3070sta.ko拷貝進/home/root用戶目錄下:

#cp /mnt/Wireless /usr –r

#cp /mnt/rt3070sta.ko /home/root

 

打開root目錄,加載驅動模塊:

#cd /home/root

#insmod rt3070sta.ko

 

如果加載出現一下錯誤:

#insmod rt3070sta.ko

insmod: error inserting 'rt3070sta.ko': -1 Unknown symbol in module

#dmesg | grep rt3070

[ 2443.154486] rt2070ap: Unknown symbol usb_alloc_urb

[ 2443.154628] rt2070ap: Unknown symbol usb_free_urb

[ 2443.155032] rt2070ap: Unknown symbol usb_register_driver

[ 2443.155324] rt2070ap: Unknown symbol usb_put_dev

[ 2443.155439] rt2070ap: Unknown symbol usb_get_dev

[ 2443.155652] rt2070ap: Unknown symbol usb_submit_urb

[ 2443.156164] rt2070ap: Unknown symbol usb_control_msg

[ 2443.156553] rt2070ap: Unknown symbol usb_deregister

[ 2443.157013] rt2070ap: Unknown symbol usb_kill_urb

[ 2443.157116] rt2070ap: Unknown symbol usb_buffer_free

[ 2443.157443] rt2070ap: Unknown symbol find_vpid

[ 2443.157675] rt2070ap: Unknown symbol usb_buffer_alloc

 

則需要在文件os/linux/usb_main_dev.c文件的開頭加上如下一行代碼:

MODULE_LICENSE(“GPL”);

 

然後重新編譯、重新加載,即可得到正確的結果。

用ifconfig  -a命令查看網絡,如果加載成功,不會有任何提示,同時可以查看到ra0設備的存在。

加載上模塊過後,可以用相關命令設置無線網卡。命令包括iwpriv、iwconfig、iwlist、ifconfig等。比如設置無線網卡地址爲192.168.1.5:

ifconfig ra0 192.168.1.5

 

設置無線網絡模式爲ad-hoc模式:

iwpriv ra0 set NetworkType=Adhoc

 

設置SSID名爲isn313:

iwconf ra0 essid isn313

 

查看無線網絡:

iwlist ra0 scanning

 

SoftAP驅動移植

解壓驅動2010_0203_RT3070_SoftAP_v2.4.0.1_DPA.bz2,然後進入目錄:

tar jxvf 2010_0203_RT3070_SoftAP_v2.4.0.1_DPA.bz2

cd 2010_0203_RT3070_SoftAP_v2.4.0.1_DPA

 

修改Makefile如下(“-”表示刪除的行,“+”表示添加的行):

+#Makefile for RT3070 on MBC-SAM9G45

+#2010_11_13 by liyi

RT28xx_MODE = AP

TARGET = LINUX

CHIPSET = 3070

-PLATFORM = PC

+PLATFORM = IXP

………

ifeq ($(PLATFORM),IXP)

-Linux_SRC = /project………..

-CROSS_COMPILE = arm-linux-

+LINUX_SRC = /home/Embest_SAM9G45/linux-2.6.30

+CROSS_COMPILE = /usr/local/arm2007q1/bin/arm-none-linux-gnueabi-

endif

 

注意,在2010_0203_RT3070_SoftAP_v2.4.0.1_DPA.bz2驅動中,有三個文件夾,分別爲MODULE、NETIF、UTIL,在這三個文件中均有Makefile,所有的Makefile都需要如上修改,同樣,三個文件夾中的config.mk文件也都需要修改。

修改config.mk配置文件。

ifeq ($(PLATFORM),IXP)

- WFLAGS += -DRT_BIG_ENDIAN

+#WFLAGS += -DRT_BIG_ENDIAN

endif

 

ifeq ($(PLATFORM),IXP)

#WFLAGS += -DRT_BIG_ENDIAN

endif

 

ifeq ($(PLATFORM),IXP)

CFLAGS := -v -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale -malignment-traps -msoft-float $(WFLAGS)

        EXTRA_CFLAGS := -v $(WFLAGS) -I$(RT28xx_DIR)/include

export CFLAGS       

endif

 

 

對不起,在修改驅動config.mk文件的時候,紅色修改部分沒有給全,應該是把CFLAGS和EXTRA_FLAGS中的-mbig-endian選項去掉,因爲在ARM中採用的小端模式!特此更正!

 

 

所有的config.mk都修改好以後,通過以下命令進行編譯:

make ARCH=arm KBUILD_NOPEDANTIC=1

 

如果編譯不能通過,請檢查是否所有的文件夾中的Makefile和config.mk都已經修改。編譯通過後,將在三個文件夾中分別生成三個可加載模塊:rt3070ap.kortutil3070ap.kortnet3070ap.ko。通過USB接口將這三個模塊和rt2870ap.dat文件下載到開發板目錄下。並將文件移動到相應位置:

#mkdir /etc/Wireless/

#mkdir /etc/Wireless/RT2870AP/

#cp /mnt/rt2870ap.dat /etc/Wireless/RT2870AP/RT2870AP.dat

#cp /mnt/rt3070ap.ko /home/root

#cp /mnt/rtutil3070ap.ko /home/root

#cp /mnt/rtnet3070ap.ko /home/root

 

第三行中,在RT2870AP文件夾中的.dat文件名必須是大寫的,否則模塊將無法讀取。

移動好後,進入root目錄並加載模塊:

#cd /home/root

#insmod rtutil3070ap.ko

#insmod rt3070ap.ko

#insmod rtnet3070ap.ko

#ifconfig ra0 up

 

此處,加載模塊一定要按此順序加載,否則將出現以下錯誤(用dmesg函數可查看相關錯誤信息):

#insmod rt3070sta.ko

insmod: error inserting 'rt3070sta.ko': -1 Unknown symbol in module

#dmesg | grep rt3070

 

[ 1011.612979] rt3070ap: Unknown symbol rausb_buffer_free

[ 1011.613153] rt3070ap: Unknown symbol RtmpOSTaskNotifyToExit

[ 1011.613410] rt3070ap: Unknown symbol rausb_buffer_alloc

[ 1011.613536] rt3070ap: Unknown symbol RTMPFreeNdisPacket

[ 1011.613692] rt3070ap: Unknown symbol AdapterBlockAllocateMemory

[ 1011.613816] rt3070ap: Unknown symbol RTMP_IndicateMediaState

[ 1011.614106] rt3070ap: Unknown symbol RTMP_SetPeriodicTimer

[ 1011.614241] rt3070ap: Unknown symbol os_alloc_mem

[ 1011.614373] rt3070ap: Unknown symbol ClonePacket

[ 1011.614505] rt3070ap: Unknown symbol RTDebugLevel

[ 1011.614646] rt3070ap: Unknown symbol announce_802_3_packet

[ 1011.614780] rt3070ap: Unknown symbol Sniff2BytesFromNdisBuffer

 [ 1011.614916] rt3070ap: Unknown symbol RTMP_OS_Add_Timer

[ 1011.615043] rt3070ap: Unknown symbol rausb_submit_urb

[ 1011.615167] rt3070ap: Unknown symbol RTMP_AllocateFragPacketBuffer

[ 1011.615292] rt3070ap: Unknown symbol rausb_alloc_urb

[ 1011.615491] rt3070ap: Unknown symbol RtmpOSNetPktAlloc

[ 1011.615616] rt3070ap: Unknown symbol VLAN_8023_Header_Copy

[ 1011.615739] rt3070ap: Unknown symbol RTMP_OS_Mod_Timer

[ 1011.615863] rt3070ap: Unknown symbol os_free_mem

[ 1011.616005] rt3070ap: Unknown symbol rausb_control_msg

[ 1011.616079] rt3070ap: Unknown symbol duplicate_pkt_with_TKIP_MIC

[ 1011.616079] rt3070ap: Unknown symbol duplicate_pkt_with_VLAN

[ 1011.616079] rt3070ap: Unknown symbol DuplicatePacket

[ 1011.616079] rt3070ap: Unknown symbol RtmpOSTaskCustomize

[ 1011.616079] rt3070ap: Unknown symbol RTMP_OS_Del_Timer

[ 1011.616079] rt3070ap: Unknown symbol rausb_free_urb

[ 1011.616079] rt3070ap: Unknown symbol get_netdev_from_bssid

[ 1011.616079] rt3070ap: Unknown symbol hex_dump

[ 1011.616079] rt3070ap: Unknown symbol RtmpOSFileOpen

[ 1011.616079] rt3070ap: Unknown symbol RTMPFreeAdapter

[ 1011.616079] rt3070ap: Unknown symbol RtmpOSFSInfoChange

[ 1011.616079] rt3070ap: Unknown symbol wlan_802_11_to_802_3_packet

[ 1011.618201] rt3070ap: Unknown symbol RTMP_GetCurrentSystemTime

[ 1011.618341] rt3070ap: Unknown symbol RTMPAllocateNdisPacket

[ 1011.618498] rt3070ap: Unknown symbol RTMPSendWirelessEvent

[ 1011.618621] rt3070ap: Unknown symbol RTMPL2FrameTxAction

[ 1011.618747] rt3070ap: Unknown symbol rausb_kill_urb

[ 1011.618899] rt3070ap: Unknown symbol RTMP_OS_Init_Timer

[ 1011.619022] rt3070ap: Unknown symbol RTMPusecDelay

[ 1011.619147] rt3070ap: Unknown symbol update_os_packet_info

[ 1011.619312] rt3070ap: Unknown symbol RtmpOSFileRead

[ 1011.619517] rt3070ap: Unknown symbol RtmpOSFileClose

[ 1011.619641] rt3070ap: Unknown symbol RTMP_QueryPacketInfo

[ 1011.619764] rt3070ap: Unknown symbol RtmpOSFileWrite

 

在加載過程中若出現以下錯誤:

[421.461365] rt3070ap: module license 'RALINK' taints kernel.

[421.461723] Disabling lock debugging due to kernel taint

 

請修改UTIL/os/linux/usb_main_dev.c文件,在文件的開頭加上如下一行程序:

MODULE_LICENSE(“GPL”)

 

重新編譯:

#make clean

#make KBUILD_NOPEDANTIC=1

 

然後再重新下載,按順序加載模塊即可成功。

模塊加載成功後,用一下命令可查看相關信息:

#ifconfig –a

eth0      Link encap:Ethernet  HWaddr 3A:1F:34:08:54:54

          BROADCAST MULTICAST  MTU:1500  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:1000

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

          Interrupt:25 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:8 errors:0 dropped:0 overruns:0 frame:0

          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:576 (576.0 B)  TX bytes:576 (576.0 B)

 

ra0       Link encap:Ethernet  HWaddr 00:00:00:00:00:00

          BROADCAST MULTICAST  MTU:1500  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:1000

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

#iwconfig ra0

ra0       RTWIFI SoftAP  ESSID:"RT2860AP"  Nickname:""

          Mode:Managed  Channel=11  Access Point: 00:0C:43:41:6F:A6

          Bit Rate=150 Mb/s

 

用ifconfig命令設定ra0的IP地址:

#ifconfig ra0 192.168.1.1

ra0       Link encap:Ethernet  HWaddr 00:0C:43:41:6F:A6

          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  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:1000

          RX bytes:121922 (119.0 KiB)  TX bytes:9072 (8.8 KiB)

 

至此,一個默認的名爲RT2860AP的網絡就建立起來了。用iwconfig命令可修改網絡的相關參數。如:

#iwconfig ra0 set SSID=”RT_AP”

#iwconfig ra0

ra0       RTWIFI SoftAP  ESSID:"RT_AP"  Nickname:""

          Mode:Managed  Channel=11  Access Point: 00:0C:43:41:6F:A6

          Bit Rate=150 Mb/s

 

結束後,可以通過以下命令卸載模塊:

#ifconfig ra0 down

#rmmod rtnet3070ap.ko

#rmmod rt3070ap.ko

#rmmod rtutil3070ap.ko

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章