最近公司的一个嵌入式系统上需要无线网卡,断断续续弄个两个月才搞定。把过程写下来给大家分享一下。
选择无线网卡的接口模式: 在网上找了一下无线网卡,基本上有以下几种接口: PCMCIA,俗称PC卡接口。 PCI接口,这是很常见的接口,台式机的主板上有好几个PCI插槽。 miniPCI,笔记本上一般用这个接口。 USB,这个接口现在不管台式机还是本本,都有很多。
我这个平台有PCI,miniPCI,USB接口. PCI接口比较大,不太适合嵌入式平台; USB只有两个口,外面要接移动硬盘什么的,暂时不想占用,而且USB的无线网卡移植驱动也不容易,所以也没选它。 最后选了miniPCI接口。 miniPCI接口的网卡很多,比如Intel的,Broadcomd的,Realtek的等等。 我们用的2.6.15的内核,里面已经有Intel 2100和2200(2915)的驱动了,所以我选了一块Intel 2915的卡。这也是选miniPCI接口的一个原因。
编译内核,安装驱动
在嵌入式系统上应用设备,最好先在PC Linux上做一遍,然后再在嵌入式系统上使用,照个葫芦画瓢,就容易多了。这个可是我的血泪经验啊!!!
一开始我也是这样想的,就在本本上装了个Redhat9,然后下载2.6.15的内核,开始编译。 按着这个文档说的,一步步做,但是就是不行。 http://ipw2200.sourceforge.net/INSTALL。
中间经过很长时间的重做内核,一个个版本的实验,都没成功。后来在一个同事的提醒之下,终于直接在目标板上搞好了。下面捡重点的说一下:
首先最重要的就是确定你的miniPCI接口是好的。 PC上的接口可以通过在windows下面安装驱动来实验一下,能用就表明是好的,而且这样还验证了网卡本身也是好的。这一步不可以省略哦。 否则你在Linux上哼哧哼哧搞了N久还没通,最后才发现网卡是坏的,可千万别怪我没提醒你。 目标板上的接口,可以先用其他miniPCI接口的设备验证一下。如果你像我一样只有无线网卡这一个设备,而且还不知道这个设备能不能在Linux下面驱动起来,那就需要你好好检查接口的物理连线,管脚的顺利等等.http://www.interfacebus.com/MiniPCI_Pinout_124Pin.html 这个网站不错的,说的很详细,可以参考一下.
1.内核编译打开wireless tools,就是内核有iwconfig,iwgetid等配置无线连接的工具. 我的这个嵌入式系统用的内核,是别人打过补丁,修改过的,所以可以在menuconfig直接选择。
如果在PC机上用的话,一般内核都自带的;如果没有请自己去下载http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html. 2.在系统根目录建个sys的目录,如果有就不用建了。 修改/etc/fstab文件,增加这样一行 none /sys sysfs defaults 0 0 3.下载最新的hotplug,安装一下。 http://linux-hotplug.sourceforge.net/ 一般是make,然后make install安装。
这里多说几句,我前面没搞好,主要就是因为hotplug没搞好. 在PC机上,安装完hotplug以后,要运行以下hotplug命令,能看到这样的提示就说明好了: Usage: /etc/hotplug.d/default/default.hotplug AgentName [AgentArguments] AgentName values on this system: dasd firmware ieee1394 input net pci scsi tape usb
我一开始还想,即使hotplug在PC上行了,移植到目标板上也很困难啊,改编译环境,改代码,那得多麻烦啊。可是最后我发现hotplug其实是脚本文件,基本上跟平台无关。所以后来我把hotplug-2004_03_29.tar.gz里面/etc目录下的文件和/sbin下的文件复制到目标板平台的相应目录下,运行一下hotplug就好了。
但是在我的目标板上还是出现了点小小的问题。 第一:我开始编译的一个内核,没把hotplug编译到里面。所以我内核起来以后,用nfs mount到Linux host上,然后把hotplug的文件复制到相应的目录下面,运行hotplug命令,结果显示 什么/etc/hotplug.d/default/default.hotplug: not found.原来default.hotplug使用的shell是bash,但是我的目标板上没有bash,只有ash,所以我把default.hotplug第一行改成ash,运行hotplug就正常了。 第二:我把hotplug-2004_03_29.tar.gz里面/etc/hotplug.d/default/default.hotplug的文件直接放在目标板的同一目录下,重新编译了内核,但是我的目标板根本起不来,说是“超出了存储器的范围”。因为/etc/rc.d/init.d/hotplug在系统启动的时候会自动加载,而且这个hotplug跟/sbin/下的hotplug一模一样,所以我把/etc/rc.d/init.d/hotplug给删掉;再把default.hotplug放在/etc目录下(它也会自己运行),然后在启动脚本加上两句'mv /etc/default.hotplug /etc/hotplug.d/default/default.hotplug','/sbin/hotplug'.这样kernel初始化后期再运行hotplug就没问题了。
4.下载firmware,http://ipw2200.sourceforge.net/firmware.php 下载你需要的firmware解压到/usr/lib/hotplug/firmware或者/etc/hotplug/firmware下,具体是那个目录根据/etc/hotplug/firmware.agent这个文件的FIRMWARE_DIR变量来选择. 我下载的是ipw2200-fw-2.4.gz.
firmware固件是二进制文件,运行在无线网卡的模块里面的内存里,所以是跟平台无关的。也就是不管使用的的是windows,还是Linux,而且也不管是哪个版本的Linux,固件都不需要重新编译(也没法编译,这是Intel直接编译好的文件),下载下来直接使用就好了。
关于firmware的猜测: 在windows平台下,使用无线网卡没有关于firmware的说明,因为windows的驱动都是不开源的。 无线网卡是个模块,这个模块本身也需要软件。一般这样的嵌入式软件叫固件firmware.既然是软件,就需要存储在某种掉电可保存的存储器里面,一般是flash。为了降低成本,或者为了将来升级固件方便(试想,如果固件固化在网卡的rom里面,哪天发现这个固件有严重的bug,影响使用怎么办?难道全部召回,重新固化firmware?那成本太高了。所以采用固件外置的方式,只需要发布新的驱动程序和新的固件即可),Intel使用很小的flash,只在flash里面放上很小的一段loader程序,然后PC上的驱动程序驱动网卡的时候,通过这个loader程序把完整的软件,也就是固件读入内存运行。
5.编译内核 把下面这些都打开 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CONFIG_NET_RADIO 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Failure to enable CONFIG_NET_RADIO will result in Wireless Tools (iwconfig, iwlist, etc.) not functioning. In 2.6.x, this is enabled via menuconfig:
Device Drivers -> Networking support -> Network device support -> Wireless LAN (non-hamradio) -> Wireless LAN drivers (non-hamradio) & WE
~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CONFIG_FW_LOADER 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Intel PRO/Wireless 2915ABG Network Connection driver loads firmware via the Linux firmware hotplug capability (see later section on firmware loading). In 2.6.x, this is enabled via menuconfig:
Device Drivers -> Generic Driver Options -> Hotplug firmware loading support
~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CONFIG_CRYPTO 1 #define CONFIG_CRYPTO_ARC4(_MODULE) 1 #define CONFIG_CRC32(_MODULE) 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Intel PRO/Wireless 2915ABG Network Connection driver uses the WEP encryption and decryption algorithms provided by the Linux kernel. To use WEP you must enable the Crypto library support (CONFIG_CRYPTO) and the ARC4 cipher algorithm (CONFIG_CRYPTO_ARC4) as noted below:
Cryptographic options -> ARC4 cipher algorithm
You also need to enable the CRC32 (CONFIG_CRC32) algorithm as noted below:
Library routines -> CRC32 functions
~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CONFIG_CRYPTO_MICHAEL_MIC(_MODULE) 1 #define CONFIG_CRYPTO_AES_586(_MODULE) 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you wish to enable (optional) WPA support, you also need to enable the following crypto library modules (in addition to those required for WEP above):
Cryptographic options -> Michael MIC keyed digest algorithm AES cipher algorithms
下面这两个编译成模块 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CONFIG_IEEE80211 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ If ieee80211 subsystem support is built into your kernel (i.e. in kernel verison 2.6.14 and later), you must de-configure that capability and rebuild your kernel before upgrading ieee80211 subsystem and Intel PRO/Wireless 2915ABG Network:
Networking -> Networking support (NET [=y]) -> Generic IEEE 802.11 Networking Stack
Make ipw2200 enable or module ~~~~~~~~~~~~~~~~~~~~~~~~~~~ #define CONFIG_IPW2200 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ If Intel PRO/Wireless 2915ABG Network Connection driver is built into your kernel (i.e. in kernel version 2.6.14 and later), you must de-configure that capability and rebuild your kernel before upgrading ieee80211 subsystem and Intel PRO/Wireless 2915ABG Network Connection driver:
Device Drivers -> Network device support -> Network device support (NETDEVICES [=y]) -> Wireless LAN (non-hamradio) -> Intel PRO/Wireless 2200BG and 2915ABG...
编译完内核,然后就应该可以正常使用无线网卡了。 如果你还不行的话,那我也没办法了。
祝你好运! |