mini2440 移植usb wifi;DMA报错

来源:互联网 发布:c语言中数组的定义 编辑:程序博客网 时间:2024/05/17 23:41

要移植usb wifi到mini2440中,记录一下移植过程。

参数:

Linux内核版本:linux3.11.10

开发板型号:mini2440,256M

1.查看usb adapter的型号

将usb wifi插到PC的linux下,使用lsusb命令查看其信息。我的是:Bus 002 Device 004: ID 148f:3070 Ralink Technology, Corp.
这就表明该无线网卡使用的是Ralink的芯片,其ID号是148f,而型号是3070。顺便下载一下驱动:我的驱动型号就是RT3070,去http://code.google.com/p/arcon/downloads/detail?name=2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO.bz2&can=2&q=下2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO.bz2 驱动(我去官网下下来的驱动编译老出错,感觉没这个个好用)。

2.然后先去内核里面配置一下,让你的内核认识插入你的usb wifi

[*]Device Driver-->[*]Network device support--->[*]Wireless LAN---><M>Ralink driver support(先选中这个,不然里面没内容)---><M>Ralink rt27xx/rt28xx/rt30xx (USB) support

然后就是make了


3.编译驱动

这一步就是编译下载的RT8070 /RT3070 /RT3370 / RT3572 /RT5370 /RT5372/ RT5572驱动

3.1解压下载的驱动文件,解压出来的文件名字很长,可以重命名成一个稍微短的名字cd os/linux里面找config.mk,找到HAS_WPA_SUPPLICANT和HAS_NATIVE_WPA_SUPPLICANT_SUPPORT,将他们的值都设为”y”

3.2修改Makefile

vim Makefile

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

……

ifeq ($(PLATFORM),PC)

# Linux 2.6

LINUX_SRC = 内的内核目录,比如xx/linux-3.11.10

# 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 =arm-linux-

endif


修改chips/目录下的rtmp_chip.c文件

#ifdef RT30xx

if (IS_RT30xx(pAd))

{

//if (IS_RT3390(pAd))

//RT33xx_Init(pAd);

//else

RT30xx_Init(pAd);

}

#endif /* RT30xx */


然后make,可能汇报错cp: 无法创建普通文件"/tftpboot": 权限不够,这个不影响

4拷贝相关文件

拷贝的话就跟拷贝其他文件一样

4.1在文件系统里建立目录/etc/Wireless/RT2870STA/,将解压出来的rt3070驱动文件里的RT2870STA.da拷贝进去

mkdir -pWireless/RT2870STA/

4.2编译出来的驱动文件/os/linux/rt3070sta.ko,但是由于包含了调试信息会很大(我的有11M多),使用命令arm-linux-strip -S rt3070sta.ko裁剪(一定不要忘了加 -S,不然的话内核会“不认识”这个驱动),最终是800多k,将驱动文件拷贝到文件系统下的某个目录比如/usr下

5.加载驱动

insmod /usr/rt3070sta.ko

可能会报错,我遇到了关于DMA太小的错误:Error!!! RTMPAllocDMAMemory failed, Status[=0x00000003],原因是rt3070要使用DMA,在网上找了很多,主要解决方案是修改rt3070中rt_linux.h的BULKAGGRE_SIZE参数,让rt3070使用的DMA小一些,可是我问题还是没解决,于是我就根据错误提示修改了内核中分配的DMA默认大小,问题就解决了但是还没深入研究不知道会不会影响到其他的东西,感觉DMA参数还是不要乱改的好)

下面就把两种解决方法记录一下:

5.1修改rt3070修改rt3070中rt_linux.h的BULKAGGRE_SIZE参数

这是网上最多的解决方案,估计也能解决大部分问题

修改/include/os/rt_linux.h中的BULKAGGRE_SIZE参数,把100修改为60,或是更小,然后重新编译,再试,如果还是报DMA的错,那就再

5.2修改内核中的默认DMA大小

我的内核版本是3.11.10的,去arch/arm/mm/dma-mapping.c中将DEFAULT_DMA_COHERENT_POOL_SIZE改大,默认是256k的,我直接改成1M了,然后就不报错了,当然这里的参数可以再试试。还有我觉得rt3070的参数和内核的参数,改一个就好,以后找问题的话也好找

如果加载驱动成功的话,那么就可以开启无线网卡了,使用命令ifconfig ra0 up,有时候可能加载驱动没报错,但是在开启的时候汇报错,解决方法和上面的一样

6.移植wireless_tools

去网站下载wireless_tools.29.tar.gz  http://ishare.iask.sina.com.cn/f/12365251.html

#tar zxvf wireless_tools.29.tar.gz
#cd wireless_tools.29
#vim Makefile
 PREFIX = /usr/local/wirelesstool(这个路径自己可以根据自己的写)
 CC = arm-linux-gcc
 AR = arm-linux-ar
 RANLIB =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(如果这一步也报错误的话,可以参考5中的解决方法)

iwlist ra0 scan (列出wifi节点)

iwconfigra0 key 123456(你要连接的wifi的密码)

iwconfig wlan0 essid "rat-linux"(你要连接wifi的名字)

成功的话就可以试试ping别的ip,如果需要动态分配ip的话可以之一dhclient(http://blog.csdn.net/xiaominthere/article/details/17564525)

当然也可以移植wpa_supplicant,这个网上挺多,可以搜一下。



0 0
原创粉丝点击