Zynq移植RT2870调试记录

最近在zynq上调试wifi,使用的是D_LINK的一款wifi,芯片是RT2870的。

在网上搜了些资料,参考了点击打开链接 这个博客,具体的内容我还是详细复制下吧。

无线网卡为RT3070,驱动分为STA驱动和SoftAP驱动两种,STA驱动支持无线网卡工作在STA模式下。我的这个是STA的驱动。

驱动下载地址: http://download.csdn.net/detail/chuhang_zhqr/9216633
zynq内核配置文件: http://download.csdn.net/detail/chuhang_zhqr/9216675
无线网卡为RT3070,驱动分为STA驱动和SoftAP驱动两种,STA驱动支持无线网卡工作在STA模式下。我的这个是STA的驱动。

1、编译驱动的预操作:编译zynq版本的内核源码。下载 https://github.com/Digilent/linux-digilent 内核源码,
make ARCH=arm make ARCH=arm digilent_zed_1_defconfig,这个配置文件可以在下载。
make ARCH=arm;在arch/arm/boot/中得到zImage文件,便是支持wifi的内核

2:在zedboard的设备树文件中,bootargs = “console=ttyPS0,115200 root=/dev/ram rw initrd=0x800000,8M coherent_pool=2M init=/init earlyprintk rootwait devtmpfs.mount=1”;这里的coherent_pool=2M一定要有,不然在添加驱动时会出现错误。

3:2:编译rt3070模块的驱动
解压tar -zxvf
2011_0107_RT3070_RT3370_Linux_STA_v2.5.0.1_DPO.tar.gz

修改原有的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 = /hisi/Hi3515_SDK_V1.0.8.0/source/os/linux-2.6.24
+CROSS_COMPILE =arm-hismall-linux-
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

ifeq ($(PLATFORM),IXP)
- WFLAGS += -DRT_BIG_ENDIAN
#加这个选项,模块运行时显示出错,CPU不能工作
endif

在修改驱动config.mk文件的时候,红色修改部分没有给全,应该是把CFLAGS和EXTRA_FLAGS中的-mbig-endian选项去掉,因为在ARM中采用的小端模式!修改完成以后,通过以下命令编译:
make ARCH=arm KBUILD_NOPEDANTIC=1
如果不加KBUILD_NOPEDANTIC=1将出现CFLAGS was changed in …. Fix it to use EXTRA_CFLAGS的错误,编译不能通过。编译完成后,会在os/linux文件夹中生成rt3070sta.ko的驱动模块。

4: 会报如下错误:
/home/cabbage/Desktop/rt3070/os/linux/../../chips/rtmp_chip.c:In function ‘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]: Leaving directory`/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 */

5:启动zynq加载驱动:
将之前编译好的zImage镜像进行启动zynq,将rt3070sta.ko和驱动源码目录下的RT2870STA.dat两个文件通过ssh或者sd卡下载到开发板中,RT2870STA.dat放入/etc/Wireless/RT2870STA/目录下,rt3070sta.ko放入任意合适的目录,我放在了/usr下。
mkdir –p /etc/Wireless/RT2870STA/
cp RT2870STA.dat / etc/Wireless/RT2870STA/
cp rt3070sta.ko /usr

加载驱动
insmod /usr/rt3070sta.ko
rtusb init rt2870 —>
=== pAd = d1502000, size = 513400 ===
<– RTMPAllocTxRxRingMemory, Status=0
<– RTMPAllocAdapterBlock, Status=0
usbcore: registered new interface driver rt2870

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

ifconfig –a
ra0
Link encap:EthernetHWaddr 00:00:00:00:00:00
BROADCAST MULTICASTMTU:1500Metric: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)

然后启动网卡,有如下信息输出,而后可以观察到模块的指示灯不停闪烁,此时网卡已经可以正常工作了。
#ifconfig ra0 up

(Efuse for 3062/3562/3572) Size=0x2d [2d0-2fc]
RTMP_TimerListAdd: add timer obj d1549ba8!
RTMP_TimerListAdd: add timer obj d1549bd8!
RTMP_TimerListAdd: add timer obj d1549c08!
RTMP_TimerListAdd: add timer obj d1549b78!
RTMP_TimerListAdd: add timer obj d1549ae8!
RTMP_TimerListAdd: add timer obj d1549b18!
RTMP_TimerListAdd: add timer obj d151471c!
RTMP_TimerListAdd: add timer obj d1503edc!
RTMP_TimerListAdd: add timer obj d1503f14!
RTMP_TimerListAdd: add timer obj d15147c0!
RTMP_TimerListAdd: add timer obj d15146bc!
RTMP_TimerListAdd: add timer obj d151478c!
–>RTUSBVenderReset
<–RTUSBVenderReset
Key1Str is Invalid key length(0) or Type(0)
Key2Str is Invalid key length(0) or Type(0)
Key3Str is Invalid key length(0) or Type(0)
Key4Str is Invalid key length(0) or Type(0)
1. Phy Mode = 5
2. Phy Mode = 5
NVM is Efuse and its size =2d[2d0-2fc]
phy mode> Error! The chip does not support 5G band 5!
RTMPSetPhyMode: channel is out of range, use first 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和相关信息已经清楚,可以不用移植,不过这个工具的移植很简单。
6: 4、移植wireless_tools

源码下载地址:http://download.csdn.net/detail/colwer/4515005#comment(这个地址里的资源跟描述不一致……)
tar zxvf wireless_tools.29.tar.gz
cd wireless_tools.29
vim Makefile
PREFIX = /usr/local/wirelesstool
CC =/usr/local/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc
AR =/usr/local/FriendlyARM/toolschain/4.5.1/bin/arm-linux-ar
RANLIB =/usr/local/FriendlyARM/toolschain/4.5.1/bin/arm-linux-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.437 GHz (Channel 6)
Quality=100/100Signal level=-43 dBmNoise level=-92 dBm
Encryption key:on
Bit Rates:22.5 Mb/s
IE: WPA Version 1
Group Cipher : CCMP
Pairwise Ciphers (1) : CCMP
Authentication Suites (1) : PSK
IE: IEEE 802.11i/WPA2 Version 1
Group Cipher : CCMP
Pairwise Ciphers (1) : CCMP
Authentication Suites (1) : PSK
IE: Unknown: DD0E0050F204104A0001101044000102

至此wireliss_tools移植成功。
设置ESSID 实验室的无线网络没有密码因此可以直接设置联网
# iwconfig ra0 ESSID Mywifi
此时已经可以ping同其他电脑了!!!!!!!!

文章转载自:chuhang_zhqr的博客