移植RT3070AP驱动程序
环境:
主机:ubuntu10.0.4
开发板:arm11---友善tiny6410
内核:linux2.6.38
1下载AP驱动,并解压到相应位置
2解压的文件中有三个文件夹,分别是MODULE、NETIF、UTIL,移植需要做的工作就是对这三个文件夹内的Makefile 和config.mk都进行相应修改,修改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 = /(linux内核所在的路径)
CROSS_COMPILE = arm-linux-(交叉编译器)
+LINUX_SRC = /home/Embest_SAM9G45/linux-2.6.30
+CROSS_COMPILE = /usr/local/arm2007q1/bin/arm-none-linux-gnueabi-
endif
修改config.mk
ifeq ($(PLATFORM),IXP)
- WFLAGS += -DRT_BIG_ENDIAN
+#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
(由于ARM是采用小端格式的,把CFLAGS和EXTRA_FLAGS中的-mbig-endian选项去掉)
还有就是要在AP驱动中找到usb_main_dev.c,在开头加上MODULE_LICENSE(“GPL”),将该模块声明为GPL
3进行编译:make ARCH=arm KBUILD_NOPEDANTIC=1
4 编译成功后,在三个文件夹中会生成rt3070ap.ko,rtutil3070ap.ko,rtnet3070ap.ko,将这三个文件和RT2870AP.dat下载到开发板中,并将其移到相应位置。
#mkdir /etc/Wireless/
#mkdir –p /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
5进入root目录中加载模块:顺序一定要对
#cd /home/root
#insmod rtutil3070ap.ko
#insmod rt3070ap.ko
#insmod rtnet3070ap.ko
6 开启WIFI
#ifconfig ra0 up
这样就能看到一个默认的ESSID为RT2860的网络就建立起来了
#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
注:移植过程中出现的问题汇总
1
这个致命的错误说明该模块中用的函数rcu_read_unlock是GPL的
解决方法:通过查询linux2.6.38的内核源码http://lxr.linux.no/#linux+v2.6.38/kernel/rcutiny_plugin.h#L532,找到rcu_read_unlock的出处,将所有的
EXPORT_SYMBOL_GPL(__rcu_read_lock);
EXPORT_SYMBOL_GPL(__rcu_read_unlock);
修改为:
EXPORT_SYMBOL(__rcu_read_lock);
EXPORT_SYMBOL(__rcu_read_unlock);
然后重新编译内核,再重新编译WIFI模块驱动,问题解决
2 出现usb_buffer_alloc和usb_buffer_free未声明的错误
原因:linux2.6.38的内核已经对这两个函数进行了修改,所以得替换函数名
解决方法:找出AP驱动中的rt_usb_util.c文件,将usb_buffer_alloc和usb_buffer_free分别改为usb_alloc_coherent 和 usb_free_coherent,问题解决。
3 第一次移植的时候出现
现在还不知道是什么原因,有网友说是因为没有在config.mk中将对齐方式改为小端格式造成的,本人还没测试过,假如哪位遇到这个问题解决好的请支告一声。。
参考的帖子:http://linfengdu.blog.163.com/blog/static/11771073201102093848182/
http://blog.sina.com.cn/s/blog_6e5e78bf0100rmbg.html