要移植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,这个网上挺多,可以搜一下。