zynq移植RT2870AP模式wifi

来源:互联网 发布:淘宝网鹤岗二手床 编辑:程序博客网 时间:2024/05/17 03:00

在上一篇博客中,针对zynq移植了RT2870STA的wifi,这里将移植RT2870 SoftAP模式的wifi,作为一个连入点。其他的设备可以连在这个设备上,进行通信。
驱动下载:http://download.csdn.net/detail/chuhang_zhqr/9220295
1:下载源码解压后,进入目录:发现有三个文件夹 MOUDLE NETIFUTIL这三个文件夹里面都有makefile文件,在三个文件的对应的os/linux目录下有config.mk文件,驱动移植做主要的工作是修改这6个文件
下面是Makefile的修改的地方 +代表增添行 #代表删除行#PLATFORM = PC(注释掉)
PLATFORM =IXP(平台选择,网上说可以随便选,关键是和改动对应源码和交叉编译器相一致,我选的是IXP)
找到

ifeq($(PLATFORM),IXP)   LINUX_SRC =/home/cys/haisi_soft/Hi3511_VSSDK_V1.1.2.3/pub/kbuild-FULL_RELCROSS_COMPILE =/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/bin/arm-hismall-linux-endif

这里的linux_src与自己的开发板源码对应 一致cross_compile即为对应的交叉编译器
修改config.mk配置文件-这个修改步骤很简单,但是要很小心,这里体现出平台的差异
改动1.

ifeq ($(PLATFORM),IXP)#WFLAGS += -DRT_BIG_ENDIANendif

我做的改动是注释掉WFLAGS arm不支持大端模式
改动2.
原来的样子

ifeq ($(PLATFORM),IXP)    CFLAGS := -v -D__KERNEL__ -DMODULE-I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include-mbig-endian -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)     exportCFLAGS       endif

改为:

ifeq ($(PLATFORM),IXP)    EXTRA_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 -msoft-float $(WFLAGS)       EXTRA_CFLAGS := -v $(WFLAGS)     export CFLAGS       endif

-mbig-endian这边的修改还是大小端的问题
-malignment-traps这个比较特殊一点,网上有多种修改方法,会去掉不同的选项,但是到底兼容哪些不兼容哪些,依据平台,我个人的经验是在编译的时候会出错,根据错误可以判断出应该把哪个选项去掉,我这个平台是去掉这一项。
其他文件夹里面的两个文件的修改方法一样

所有的config.mk都修改好以后,通过以下命令进行编译:
make ARCH=arm KBUILD_NOPEDANTIC=1
这里我编译的时候出现了几个问题:
1):

mcuzone/wifi/rt3070sta/os/linux/../../common/cmm_mac_usb.c: In function 'NICInitRecv':/mcuzone/wifi/rt3070sta/os/linux/../../common/cmm_mac_usb.c:789:3: error: implicit declaration of function 'usb_buffer_alloc'/mcuzone/wifi/rt3070sta/os/linux/../../common/cmm_mac_usb.c:789:30: warning: assignment makes pointer from integer without a cast/mcuzone/wifi/rt3070sta/os/linux/../../common/cmm_mac_usb.c:818:4: error: implicit declaration of function 'usb_buffer_free'make[2]: *** [/mcuzone/wifi/rt3070sta/os/linux/../../common/cmm_mac_usb.o] Error 1make[1]: *** [_module_/mcuzone/wifi/rt3070sta/os/linux] Error 2make[1]: Leaving directory `/mcuzone/work/linux-2.6.39'make: *** [LINUX] Error 2   

因为内核该配置的我都配置了,不用的以防万一我也编译成模块了,所以排除内核。以前2.6.32版本并没有出现这样的问题,这次是2.3.39版本的,那么就可能是内核版本差异造成的,经过努力发现2.6.35 内核后, usb_buffer_alloc 和 usb_buffer_free 被替换成 usb_alloc_coherent 和 usb_free_coherent。所以编译才会报错。修改 include/os/rt_linux.h 文件。如下

#define RTUSB_URB_ALLOC_BUFFER(pUsb_Dev, BufSize, pDma_addr) usb_buffer_alloc(pUsb_Dev, BufSize, GFP_ATOMIC, pDma_addr)#define RTUSB_URB_FREE_BUFFER(pUsb_Dev, BufSize, pTransferBuf, Dma_addr) usb_buffer_free(pUsb_Dev, BufSize, pTransferBuf, Dma_addr)替换成:#define RTUSB_URB_ALLOC_BUFFER(pUsb_Dev, BufSize, pDma_addr) usb_alloc_coherent(pUsb_Dev, BufSize, GFP_ATOMIC, pDma_addr)#define RTUSB_URB_FREE_BUFFER(pUsb_Dev, BufSize, pTransferBuf, Dma_addr) usb_free_coherent(pUsb_Dev, BufSize, pTransferBuf, Dma_addr)

2):

继续报错: GPL-incompatible module rt3070ap.ko uses GPL-only symbol '__rcu_read_unlock'修改===/MODULE/common/Rtmp_init.cdiff: line 5242-MODULE_LICENSE("RALINK");+MODULE_LICENSE("GPL");

若继续出现错误,可以用以下命令进行查找:
#dmesg | grep rt3070
如果编译不能通过,请检查是否所有的文件夹中的Makefile和config.mk都已经修改。编译通过后,将在三个文件夹中分别生成三个可加载模块:rt3070ap.ko,rtutil3070ap.ko,rtnet3070ap.ko。通过USB接口将这三个模块和rt2870ap.dat文件下载到开发板目录下。

2:上电:

#mkdir -p /etc/Wireless/RT2870AP#cp RT2870AP.dat /etc/Wireless/RT2870AP/#insmod rtutil3070ap.ko#insmod rt3070ap.ko#insmod rtnet3070ap.ko 出现以下内容:rtusb init ---=== pAd = e0ac7000, size = 417992 === <-- RTMPAllocAdapterBlock, Status=0usbcore: registered new interface driver rt2870#ifconfig ra0 192.168.1.11 up显示以下内容:<-- RTMPAllocTxRxRingMemory, Status=0-->RTUSBVenderReset<--RTUSBVenderResetKey1Str 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 = 92. Phy Mode = 9NVM is Efuse and its size =2d[2d0-2fc]3. Phy Mode = 9MCS Set = ff 00 00 00 01SYNC - BBP R4 to 20MHz.lSYNC - BBP R4 to 20MHz.lSYNC - BBP R4 to 20MHz.lSYNC - BBP R4 to 20MHz.lSYNC - BBP R4 to 20MHz.lSYNC - BBP R4 to 20MHz.lSYNC - BBP R4 to 20MHz.lSYNC - BBP R4 to 20MHz.lMain bssid = 48:02:2a:48:a9:06<==== rt28xx_init, Status=00x1300 = 00064320

这个默认的名为:RT2860AP的网络就建立起来了。名字等许多参数都是可以修改。最后结束后 卸载模块先关闭ra0 网卡。

上面已经把默认网关设置为192.168.1.1所以当电脑设备连接这个ap点的时候,要先把wifi的默认网关修改为这个网关才能连接上。
用iwconfig命令可修改网络的相关参数。如:

#iwconfig ra0 set SSID=”RT_AP”#iwconfig ra0ra0RTWIFI SoftAPESSID:&quot;RT_AP&quot;Nickname:&quot;&quot;Mode:ManagedChannel=11Access Point: 00:0C:43:41:6F:A6Bit Rate=150 Mb/s

结束后,可以通过以下命令卸载模块:

#ifconfig ra0 down#rmmod rtnet3070ap.ko#rmmod rt3070ap.ko#rmmod rtutil3070ap.ko
0 0