RT3070wifi+linux(TMS320DM368)移植

参考文章:

http://blog.sina.com.cn/s/blog_5d534d2201016t4j.html

http://bbs.csdn.net/topics/390152921


移植环境:

         主机操作系统:Ubuntu 10.04 LTS 32-bit

         目标机:T MS320DM368  Linux 2.6.32

         交叉编译环境:arm-none-linux-gnueabi-gcc

         无线模块:雷凌Ralink - rt3070


操作步骤:

1. 编译arm版本的内核源码

找到内核源码压缩包,对内核的无线模块进行配置。

make menuconfig

进入内核配置界面,内核配置中需要做的修改如下:

[*] Networkingsupport  --->

       [*]   Wireless  --->

              <*>   cfg80211-wireless configuration API

              [*]   Wirelessextensionssysfs files

              <*>   GenericIEEE802.11 Networking Stack(mac80211)

Device Drivers  --->

       [*]Networkdevicesupport  --->

              [*]   WirelessLAN  --->

                     <*>   IEEE802.11for Host AP (Prism2/2.5/3 andWEP/TKIP/CCMP)

                     [*]     Supportdownloadingfirmware images withHost AP driver

                     [*]       Supportfornon-volatile firmwaredownload

                     <M>   Ralinkdriversupport  --->

                            <M>   Ralinkrt27xx/rt28xx/rt30xx(USB) support(这个选项可能没有,但是也不妨碍)

然后make,编译通过后会在arch/arm/boot/目录下生成可烧写入开发板的zImage内核镜像。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2、编译rt3070模块的驱动

在雷凌的官网下载linux版本的rt3070驱动2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO.bz2,解压后的目录名称太长,所以可以对其做修改方便使用,然后进入到目录中

tar –jxvf 2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO.bz2

mv2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO rt3070

cd rt3070

目录中的README_STA_usb文件介绍了编译和加载驱动的一些信息。需要对os/linux/目录下的conf.mk文件进行修改,这里只贴出要修改的部分:

vim os/linux/config.mk

# Support Wpa_Supplicant

HAS_WPA_SUPPLICANT=y

# Support Native WpaSupplicant for NetworkMaganger

HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y

Makefile也要进行修改,芯片类型改为3070,默认的PLATFORM为PC,那么将后面的ifeq($(PLATFORM),PC)下的内核源码路径指定为上述的交叉编译过的内核源码目录,交叉编译工具指定为/opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-gcc当然之前应该把交叉工具链安装好,这里不再详述。

vim Makefile

ifeq ($(CHIPSET),)
CHIPSET = 3070
endif

……

ifeq ($(PLATFORM),PC)

# Linux 2.6

LINUX_SRC = /usr/src/kernels/linux-2.6.38(内核的路径)

# Linux 2.4 Change to your local setting

#LINUX_SRC = /usr/src/linux-2.4

LINUX_SRC_MODULE = /lib/modules/$(shelluname-r)/kernel/drivers/net/wireless/(无线模块路径)

CROSS_COMPILE =/opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-

endif

然后如果直接make,会报如下错误:

/home/cabbage/Desktop/rt3070/os/linux/../../chips/rtmp_chip.c:Infunction 'RtmpChipOpsHook':

/home/cabbage/Desktop/rt3070/os/linux/../../chips/rtmp_chip.c:470:error:implicit declaration of function 'RT33xx_Init'

make[2]:***[/home/cabbage/Desktop/rt3070/os/linux/../../chips/rtmp_chip.o] Error 1

make[1]:***[_module_/home/cabbage/Desktop/rt3070/os/linux] Error 2

make[1]: Leavingdirectory`/usr/src/kernels/linux-2.6.38'

make: ***[LINUX] Error 2

在网上查到似乎是因为改变了CHIPSET所导致的错误。修改chips/目录下的rtmp_chip.c文件,定位到470行,修改后如下:

#ifdef RT30xx

        if(IS_RT30xx(pAd))

        {

                if(IS_RT3390(pAd))

                     ; //RT33xx_Init(pAd);

                else

                        RT30xx_Init(pAd);

        }

#endif /* RT30xx */

然后再make,编译通过后会在os/linux/下生成rt3070sta.ko,这就是模块的驱动。 但是这里我出现了一个问题,查看rt3070sta.ko这个文件的大小,居然达到了12m,这是不合理的,原因应该是包含了大量调试信息,用arm-linux-strip可将它的大小裁剪为750k左右。

#arm-linux-strip -S rt3070sta.ko

其中-S参数是必须的,否则在加载驱动的时候会报找不到版本信息的错误。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

3.烧写内核和加载驱动模块

         将之前编译好的内核zImage镜像烧写到dm368开发板中(将内核镜像拷贝到启动卡sd卡中),将rt3070sta.ko和驱动源码目录下的RT2870STA.dat两个文件通过tftp下载到目标板中(tftp –gl xxx 192.168.1.161),RT2870STA.dat放入/etc/Wireless/RT2870STA/目录下,rt3070sta.ko放入任意合适的目录,我放在了/usr/share/ti/dvsdk-demo/下。

mkdir –p /etc/Wireless/RT2870STA/

cp RT2870STA.dat / etc/Wireless/RT2870STA/

cp rt3070sta.ko /usr/share/ti/dvsdk-demo/

加载驱动模块

insmod /usr/rt3070sta.ko

rtusb init rt2870 --->

=== pAd = d1502000, size = 513400 ===

<-- RTMPAllocTxRxRingMemory,Status=0

<-- RTMPAllocAdapterBlock,Status=0

usbcore: registered new interfacedriverrt2870

然后可以通过ifconfig–a可以看到系统已经正确识别网卡,名称为ra0。

ifconfig –a

ra0       Linkencap:Ethernet  HWaddr00:00:00:00:00:00 

          BROADCASTMULTICAST  MTU:1500  Metric:1

          RXpackets:0 errors:0 dropped:0 overruns:0 frame:0

          TXpackets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0txqueuelen:1000

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

然后启动网卡,有如下信息输出,此时网卡已经可以正常工作了。

#ifconfig ra0 up

(Efuse for 3062/3562/3572)Size=0x2d[2d0-2fc]

RTMP_TimerListAdd: add timer objd1549ba8!

RTMP_TimerListAdd: add timer objd1549bd8!

RTMP_TimerListAdd: add timer objd1549c08!

RTMP_TimerListAdd: add timer objd1549b78!

RTMP_TimerListAdd: add timer objd1549ae8!

RTMP_TimerListAdd: add timer objd1549b18!

RTMP_TimerListAdd: add timer objd151471c!

RTMP_TimerListAdd: add timer objd1503edc!

RTMP_TimerListAdd: add timer objd1503f14!

RTMP_TimerListAdd: add timer objd15147c0!

RTMP_TimerListAdd: add timer objd15146bc!

RTMP_TimerListAdd: add timer objd151478c!

-->RTUSBVenderReset

<--RTUSBVenderReset

Key1Str is Invalid key length(0) orType(0)

Key2Str is Invalid key length(0) orType(0)

Key3Str is Invalid key length(0) orType(0)

Key4Str is Invalid key length(0) orType(0)

1. Phy Mode = 5

2. Phy Mode = 5

NVM is Efuse and its size=2d[2d0-2fc]

phy mode> Error! The chip doesnotsupport 5G band 5!

RTMPSetPhyMode: channel is out ofrange, usefirst channel=1

(Efuse for 3062/3562/3572)Size=0x2d[2d0-2fc]

3. Phy Mode = 9

AntCfgInit: primary/secondary ant 0/1

MCS Set = ff 00 00 00 01

<==== rt28xx_init, Status=0

0x1300 = 00064300

至此网卡驱动移植成功。但是如果需要让网卡连接入目前常见的WPA加密的网络,还需要移植wpa_supplicant工具。

另外还有一个名为wireless_tools的辅助工具,可以用它来检索在网卡所在的环境中存在的无线网络,如果对于要连接入的无线网络的ssid和相关信息已经清楚,可以不用移植,不过这个工具的移植很简单。

4、移植wireless_tools

源码下载地址:http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/wireless_tools.29.tar.gz

tar zxvf wireless_tools.29.tar.gz

cd wireless_tools.29

vim Makefile

PREFIX = /usr/local/wirelesstool     (生成文件的路径)

CC = /opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-gcc

AR = /opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-ar

RANLIB = /opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-ranlib

make

make install

在/usr/local/wirelesstool/lib目录下找到libiw.so.29,下载到开发板的/lib/目录下;/usr/local/wirelesstool/sbin目录下找到iwpriv、iwconfig、iwlist, iwevent, iwspy等命令,下载到开发板的/usr/sbin目录下。这时就应该可以使用这些命令通过网卡搜索到环境中的无线网络。

ifconfig ra0 up

iwlist ra0 scan

Cell 06 - Address: 38:83:45:E5:CB:3E

                    Protocol:802.11b/g/n

                    ESSID:"idart-wlan311"

                    Mode:Managed

                    Frequency:2.437GHz(Channel 6)

                    Quality=100/100  Signallevel=-43 dBm  Noise level=-92 dBm

                    Encryptionkey:on

                    BitRates:22.5 Mb/s

                    IE:WPA Version 1

                        GroupCipher : CCMP

                        PairwiseCiphers (1) :CCMP

                        AuthenticationSuites(1) : PSK

                    IE:IEEE 802.11i/WPA2Version 1

                        GroupCipher : CCMP

                        PairwiseCiphers (1) :CCMP

                        AuthenticationSuites(1) : PSK

                    IE:Unknown:DD0E0050F204104A0001101044000102

          Cell07 - Address: 58:66:BA:EE:DB:40

                    Protocol:802.11b/g/n

                    ESSID:"ChinaNet"

                    Mode:Managed

                    Frequency:2.437GHz(Channel 6)

                    Quality=42/100  Signallevel=-73 dBm  Noise level=-76 dBm

                    Encryptionkey:off

                    BitRates:54 Mb/s

          Cell08 - Address: 58:66:BA:EE:DB:41

                    Protocol:802.11b/g/n

                    ESSID:"SYSUWLAN"

                    Mode:Managed

                    Frequency:2.437GHz(Channel 6)

                    Quality=37/100  Signallevel=-75 dBm  Noise level=-78 dBm

                    Encryptionkey:off

                    BitRates:54 Mb/s

至此wireliss_tools移植成功。

5. openssl移植

openss版本:openssl-1.0.0d

openss为wpa_supplicant驱动移植做准备

openssl下载地址:

http://www.openssl.org/source/

ftp://ftp.openssl.org/source/old/0.9.x/ 

makefile修改 (-为去掉设置, +为新加的设置)

#vimakefile

INSTALLTOP=/usr/local/ssl

OPENSSLDIR=/usr/local/ssl

……

CC=  /opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-gcc

AR= /opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-ar $(ARFLAGS) r

RANLIB= /opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-ranlib

#make

#makeinstall

在/usr/local/ssl目录下安装了ssl库

拷贝下面文件驱动到目标系统/usr/lib/

libssl.so.1.0.0

libcrypto.so.1.0.0

openssl 移植完成,下面可以做wpa_supplicant驱动移植

 

6.移植wpa_supplicant

版本:wpa_supplicant-0.7.3

移植wpa_supplicant前确保Openssl已经移植好了。
源码下载地址:

http://hostap.epitest.fi/wpa_supplicant/

http://w1.fi/releases/

配置修改,编译

#cpdefconfig .config

#vi.config

增加这几行

CFLAGS+= -I/usr/local/ssl/include

LIBS +=-L/usr/local/ssl/lib

CC = /opt/arm-2009q1-203/bin/arm-none-linux-gnueabi-gcc

-L /usr/local/ssl/lib/


#make

需要先编译安装openssl库,确保两个编译都使用统一工具arm-linux-gcc

不一致会出现这样的问题:

/usr/bin/ld:skipping incompatible /usr/local/ssl/lib/libssl.so when searching for -lssl

/usr/bin/ld:skipping incompatible /usr/local/ssl/lib/libssl.a when searching for -lssl

/usr/bin/ld:cannot find -lssl

/usr/bin/ld:skipping incompatible /usr/local/ssl/lib/libcrypto.so when searching for-lcrypto

/usr/bin/ld:skipping incompatible /usr/local/ssl/lib/libcrypto.a when searching for-lcrypto

/usr/bin/ld:cannot find -lcrypto

collect2:ld returned 1 exit status

make:*** [wpa_supplicant] Error 1

这样只要把openssl和wpa_supplicant两个用同一个编译工具编译即可。

 

7.产品板使用

把wpa_supplicant.conf拷贝到/xxx目录下 (xxx目录自定,我是放在目录下/etc)

按加密方式分3种,以下3个配置文件均测试正常,然后把文件末尾提供的一些example全部删除,否则在使用wpa_supplicant时会报一些类型无法识别的错误。

# 无密码 wpa_supplicant.conf内容:

ctrl_interface=/var/run/wpa_supplicant

network={

ssid="XXXXXX"

key_mgmt=NONE

}


# WEP密码 wpa_supplicant.conf内容:

ctrl_interface=/var/run/wpa_supplicant

network={

ssid="XXXXXX"

key_mgmt=NONE

wep_key0="XXXXXX"

wep_tx_keyidx= 0

}


# WPA密码 wpa_supplicant.conf内容:

#WPA-PSK/TKIP

ctrl_interface=/var/run/wpa_supplicant

network={

        ssid="MMLABN16"

        key_mgmt=WPA-PSKWPA-EAP IEEE8021X NONE

        proto=WPARSN

        pairwise=TKIPCCMP

        group=TKIPCCMP WEP104 WEP40

        psk="MMLAB406"

}


最后进行测试,测试之前要关闭有线网卡eth0,原因是如果不关闭的话在之后添加默认路由时会被设置为有线网卡的默认路由,这个应该有别的解决方法,不过我没有仔细去查。

ifconfig eth0 down

ifconfig ra0 up 

ifconfig ra0 192.168.1.248netmask255.255.255.0

route add default gw 192.168.1.1

wpa_supplicant -B -ira0-c/etc/wpa_supplicant.conf –Dwext

===>rt_ioctl_giwscan. 28(28)BSSreturned, data->length = 3351

==>rt_ioctl_siwfreq::SIOCSIWFREQ(Channel=6)

RTMP_TimerListAdd: add timer objd15785c4!


ping 


以下是详细测试过程

wpa_supplicant拷贝到/xxx/目录下(我是放在根目录下/)

我的方法:wpa_supplicant-Dwext -iwlan0 -c/wpa_supplicant.conf

参考方法:

//无桥方式

wpa_supplicant-B -ira0 -c /etc/wpa_supplicant.conf -Dwext (xxx为前面wpa_supplicant.conf目录, 我是在/etc目录下)


//有桥接方式(bridge-utils)

wpa_supplicant-B -b br0 -ira0 -c /xxx/wpa_supplicant.conf -Dwext


如果运行时出现:

socket(PF_PACKET):Address family not supported by protocol


原因

内核不支持RAWsocket,编译内核时把CONFIG_PACKET选项打开,

CONFIG_PACKET= y


If weuse CONFIG_PACKET=m instead of CONFIG_PACKET=y we'd need to

includeaf_packet.ko into the initramfs for netboot installation.


手动加载af_packet.ko

#insmodaf_packet.ko

显示

NET:Registered protocol family 17

加载正常

 

运行#wpa_supplicant

#wpa_supplicant-B -ira0 -c /etc/wpa_supplicant.conf -Dwext

(Efusefor 3062/3562/3572) Size=0x2d [2d0-2fc]

RTMP_TimerListAdd:add timer obj d1b3c620!

RTMP_TimerListAdd:add timer obj d1b3c650!

RTMP_TimerListAdd:add timer obj d1b3c680!

RTMP_TimerListAdd:add timer obj d1b3c5f0!

RTMP_TimerListAdd:add timer obj d1b3c560!

RTMP_TimerListAdd:add timer obj d1b3c590!

RTMP_TimerListAdd:add timer obj d1b06b94!

RTMP_TimerListAdd:add timer obj d1af5f54!

RTMP_TimerListAdd:add timer obj d1af5f8c!

RTMP_TimerListAdd:add timer obj d1b06c38!

RTMP_TimerListAdd:add timer obj d1b06b34!

RTMP_TimerListAdd:add timer obj d1b06c04!

-->RTUSBVenderReset

<--RTUSBVenderReset

Key1Stris Invalid key length(0) or Type(0)

Key2Stris Invalid key length(0) or Type(0)

Key3Stris Invalid key length(0) or Type(0)

Key4Stris Invalid key length(0) or Type(0)

1. PhyMode = 5

2. PhyMode = 5

phymode> Error! The chip does not support 5G band 5!

RTMPSetPhyMode:channel is out of range, use first channel=1

(Efusefor 3062/3562/3572) Size=0x2d [2d0-2fc]

3. PhyMode = 9

MCS Set= ff 00 00 00 01

<====rt28xx_init, Status=0

0x1300 =00064300

运行正常


查看状态:

#iwconfig

lo       no wireless extensions.



eth0     no wireless extensions.



ra0      Ralink STA  ESSID:"MMLABN16" Nickname:"RT2870STA"

          Mode:Managed Frequency=2.437 GHz  Access Point: BC:AE:C5:C4:9A:5E

          BitRate=135 Mb/s

          RTSthr:off   Fragment thr:off

          Encryptionkey:40C3-43C1-AB81-351A-CD3A-226F-6CDD-8FC9   Security mode

:open

          LinkQuality=73/100  Signal level:-63 dBm  Noise level:-90 dBm

          Rxinvalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0

          Txexcessive retries:0  Invalid misc:0   Missed beacon:0

 

设置ip

#ifconfigra0 192.168.1.191 netmask 255.255.255.0

设置完一会,等网络连接好就可以了。

启动6410自带的无线,启动后关闭自带的无线。此时ra0无线就可以正常使用。

[root@FriendlyARM/]# ping 192.168.1.1

PING192.168.1.1 (192.168.1.1): 56 data bytes

64 bytesfrom 192.168.1.1: seq=0 ttl=64 time=1063.262 ms

64 bytesfrom 192.168.1.1: seq=1 ttl=64 time=468.672 ms

64 bytesfrom 192.168.1.1: seq=2 ttl=64 time=379.596 ms

64 bytesfrom 192.168.1.1: seq=3 ttl=64 time=361.608 ms

 

      

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值