Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2132311
  • 博文数量: 288
  • 博客积分: 10594
  • 博客等级: 上将
  • 技术积分: 3469
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-27 19:27
文章分类

全部博文(288)

文章存档

2012年(4)

2011年(30)

2010年(40)

2009年(32)

2008年(71)

2007年(79)

2006年(32)

分类: LINUX

2009-12-30 21:35:31

    由于项目需要,要在ARM S3c2410上使用无线网卡,我使用的芯片是zd1211b。而要使用它,首先就得驱动,针对arm s3c2410开发板,针对linux内核进行驱动。

    先是准备驱动的源代码。在下载源代码。

    一直以前都是在使用博创公司开发板自带的linux 2.4内核及其根文件系统。已经用习惯了这个内核,而且主要问题是2.6内核需要很繁琐的重新编译。所以第一想法就是在Linux 2.4内核下能够驱动多好。但是上网查挺多资料,挺多人都说2.4内核不支持。我先是编译成功了2.6内核下的zd1211b无线网卡的驱动。

    1.2.6内核下驱动编译步骤如下。驱动的交叉编译修改非常简单,在其Makefile中修改交叉编译器,然后把相应的KERNEL_SOURCEMODPATHKDIR,均改成你目标板的内核目录,例如,我们的Makefile做的相关改动为:
                                CC=arm-linux-gcc
                                CPP=arm-linux-g++
                                LD=arm-linux-ld
                                MODPATH :=/weili/linux-2.6.14/
                                KERNEL_SOURCE=/weili/linux-2.6.14/
                                ZD1211REV_B=1
                                KDIR :=/weili/linux-2.6.14/

然后make,将生成的zd1211b.ko复制到开发板上insmod后就可以正确识别出我们的无线网卡了。

insmod时如果出现 Unknown symbol wireless_send_event错误,是因为内核中缺少对无线网络的支持,请在内核配置时加上 'CONFIG_NET_RADIO=y' and CONFIG_NET_WIRELESS=y'.或者,进入内核目录,运行make menuconfig,选择【device driver】→【Networking support】→【Wireless LAN】→【Wireless LAN drivers & Wireless Extensions】,重新编译内核即可。

【但是我make后会有一个错误,说src/zd1205.c中7799行param在wrp中未定义。wrp是struct iwreq 的定义。经过查找,struct iwreq 是在/内核/include/linux/wireless.h中定义的。找到struct iwreq 定义部分,看其中真没有对param的定义,于是加上了对它的定义:struct iw_param param;之后make成功生成zd1211b.ko。注:我使用的交叉编译器是arm-linux-gcc 3.4.1】

接下来是无线网络的配置。因为我们的项目要求两个目标板进行无线网络通讯,所以要把两个无线网卡配置成点对点访问模式。首先在两个开发板上配置两个无线网卡的模式,iwconfig wlan0 mode master和iwconfig wlan0 mode manager,master模式,它将建立一个无线访问点,用iwconfig查看时,会显示其access point为自己的MAC,然后配置ipessid.(ip要在一个网段上,essid配置成相同)
ifconfig wlan0 192.168.0.7 ,iwconfig wlan0 essid weili
此时它们将自动建立连接,并且可查看到已连接到无线访问点access point上的无线网卡mac

    2. 带着怀疑的态度又尝试着针对2.4内核的编译。

                                MODPATH :=/weili/kernel-2410s/
                                KERNEL_SOURCE=/weili/kernel-2410s/
                                ZD1211REV_B=1
                                KDIR :=/weili/kernel-2410s/

但是,make之后出现非常非常多的错误。不过仔细观察这些错误就发现,都是在 src/zd1205.c中,说是 IWEVCUSTOM 、 IW_MODE_MONITOR 等之类的未定义。经查找发现IWEVCUSTOM 、 IW_MODE_MONITOR之类的宏定义是在 /内核/include/linux/wireless.h   中进行的定义,而2.6内核下有IWEVCUSTOM 、 IW_MODE_MONITOR对其的定义,2.4内核下的wireless.h中却没有。于是对比着2.6内核的头定义,对2.4内核下的wireless.h进行修改。(我就是把没定义的从2.6内核下给粘过去的)#define IWEVCUSTOM      0x8C02          #define IW_MODE_MONITOR 6 ,等等,根据编译错误还有其它的一些未定义的也进行修改。并且也有2.6内核下编译出现的param错误,也做前边所说的修改。然后make,成功生成zd1211b.o。移植到2.4内核下的开发板上insmod出现错误Unknown symbol wireless_send_event,跟2.6内核一样,应该是内核中应该加入无线网卡支持,修改内核的menuconfig,重新烧写内核,结果错误变成:

Using zd1211b.o

insmod: error reading ELF section data: No such file or directory

insmod: Could not load the module: No such file or directory。也一直没找到解决的方法。

有可能是2.4内核根本就不支持zd1211b这款无线网卡吧。

/******************************若要转载,请注明出处***********************************/

阅读(2628) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~