微 处 理 机
M I CROPROCESS ORS
L inux 下US B 无线网卡驱动程序移植的实现
任 厦,孟昭鹏,王晓华
(天津大学计算机系,天津300072)
摘 要:介绍了L inux 下US B 无线网卡驱动程序移植的实现原理。该设计根据L inux Open
Source 的原则,选择具有GP L 的自由驱动进行。通过对makefile 文件,交叉编译命令和菜单配置的改进,成功实现US B 无线网卡驱动程序在L inux 下的移植。本实现已应用于家庭智能网关的研发项目中。
关键词:US B 无线网卡;makefile 文件;交叉编译;菜单配置中图分类号:TP311 文献标识码:B 文章编号:1002-2279(2007)05-0074-03
R ea li za ti o n o f Po rti ng W ire l e s s LAN Adap te r
REN Sha,MENG Zhao -peng,WANG Xiao -hua
(D epart m ent of Co m puter Science and Technology,Tianjin U niversity,Tianjin 300072,China )
Abstract:This article intr oduces the p rinci p le of how t o port the wireless LAN adap ter ’s driver with the L inux operating syste m ,and p resents an realizati on .W e chose the free drivers with GP L,and observe the p rinci p les of L inux Open Source .By making change t o the “makefile ”file,the command of cr oss comp lile and the menu configuati on,we successfully realized porting wireless LAN adap ter driver over L inux .Now this realizati on has been app lied t o the other p r ogra mmes .
Key words:US B wireless LAN adap ter;Makefile;Cr oss comp ile;Menu configuati on
1 引 言
家庭网关是智能家庭网络上的一个重要部分,是将单个家庭网络与外部世界沟通起来的关键部件。本项目开发的无线网卡驱动的移植是智能家庭网关当中的一个子项目,在L inux 硬件驱动架构的基础上(如图1),融合多种设备连接方式,从物理通道上连通家庭生活中的三类设备,通过共同的nternet 接口与外部网络相连。由于家庭智能网关是基于嵌入式L inux 开发的,所有子项目都采用US B 接口,方便了设备的外延性和可操作性
。
图1 L inux 硬件驱动架构
2 网络驱动程序的结构
所有的L inux 网络驱动程序遵循通用的接口。设计时采用的是面向对象的方法。一个设备就是一个对象(device 结构),它内部有自己的数据和方法。每一个设备的方法被调用时的第一个参数都是这个设备对象本身,这样这个方法就可以存取自身的数据(类似面向对象程序设计时的this 引用)。一个网络设备最基本的方法有初始化、发送和接收,如图2所示
。
图2 L inux 网络设备驱动程序的结构
3 makefile 的改进
在大型的开发项目中,通常有几十到上百个的
作者简介:任厦(1980-),男,山西太原人,硕士研究生,主研方向:计算机网络。
收稿日期:2005-08-16
第5期
2007年10月
No .5Oct .,2007
任 厦等:L inux下US B无线网卡驱动程序移植的实现
源文件,如果每次均手工键入gcc命令进行编译的话,会非常不方便。因此,人们通常利用make工具来自动完成编译工作。makefile文件就是make工具用来完成并自动维护编译工作的。它需要按照某种语法进行编写,其中说明了如何编译各个源文件并连接生成可执行文件,并定义了源文件之间的依赖关系。当修改了其中某个源文件时,如果其他源文件依赖于该文件,则也要重新编译所有依赖该文件的源文件。
默认情况下,G NU make工具在当前工作目录中按如下顺序搜索makefile:
3G NUmakefile
3makefile
3Makefile
在UN I X系统中,习惯使用Makefile作为mak2 file文件。如果要使用其他文件作为makefile,则可利用类似下面的make命令选项指定makefile文件:$make-f Makefile.debug
3.1 makefile的基本结构
makefile中一般包含如下内容:
(1)需要由make工具创建的项目,通常是目标文件和可执行文件。通常使用“目标(target)”一词来表示要创建的项目;
(2)要创建的项目依赖于哪些文件;
(3)创建每个项目时需要运行的命令。
例如,假设现在有一个C++源文件test.C,该源文件包含有自定义的头文件test.h,则目标文件test.o明确依赖于两个源文件:test.C和test.h。另外,只希望利用g++命令来生成test.o目标文件。这时,就可以利用如下的makefile来定义test.o的创建规则:
test.o:test.C test.h
g++-c-g test.C
从上面的例子注意到,第一行指定test.o为目标,并且依赖于test.C和test.h文件。随后的行指定了如何从目标所依赖的文件建立目标。
当test.C或test.h文件在编译之后又被修改,则make工具可自动重新编译test.o,如果在前后两次编译之间,test.C和test.h均没有被修改,而且test.o还存在的话,就没有必要重新编译。这种依赖关系在多源文件的程序编译中尤其重要。通过这种依赖关系的定义,make工具可避免许多不必要的编译工作。当然,利用Shell脚本也可以达到自动编译的效果,但是,Shell脚本将全部编译任何源文件,包括那些不必要重新编译的源文件,而make工具则可根据目标上一次编译的时间和目标所依赖的源文件的更新时间而自动判断应当编译哪个源文件。
一个makefile文件中可定义多个目标,利用make target命令可指定要编译的目标,如果不指定目标,则使用第一个目标。通常,makefile中定义有clean目标,可用来清除编译过程中的中间文件,例如:
clean:
r m-f3.o
运行make clean时,将执行r m-f3.o命令,最终删除所有编译过程中产生的中间文件。
了解了Makefile,下一步就是修改它,使之运行后生成的二进制文件能够在目标板上运行。正规的无线网卡的驱动一般包括PC I接口和US B接口的情况,由于这里只对US B网卡进行移植,而且鉴于嵌入式开发的特点,需要剔除与PC I网卡相关的所有文件而只保留US B驱动的最小集。
成熟的驱动程序往往结构复杂,功能完善,每一层目录下都有一个Makefile,因此在修改之前需要清楚了解驱动程序的结构,以便将多个Makefile合成为一个,统一编译。另外需要注意的一点是原始驱动程序往往是以模块载入内核的,而嵌入式开发的特点决定了我们只能将裁减后的驱动打入内核中,为了避免编译错误,需要删掉Makefile中与module有关的部分。
3.2 makefile变量
G NU的make工具除提供有建立目标的基本功能之外,还有许多便于表达依赖关系以及建立目标命令的特色。其中之一就是变量或宏的定义能力。如果要以相同的编译选项同时编译十几个C源文件,而为每个目标的编译指定冗长的编译选项的话,将是非常乏味的。但利用简单的变量定义,可避免这种乏味的工作:
#Define macr os f or na me of comp iler
CC=gcc
#Define a macr o for the CC flags
CCF LAGS=-D_DEBUG-g-m486
#A rule f or building a object file
test.o:test.c test.h
$(CC)-c$(CCF LAGS)test.c
在上面的例子中,CC和CCF LAGS就是make 的变量。G NU make通常称之为变量,而其他UN I X 的make工具称之为宏,实际是同一个东西。在makefile中引用变量的值时,只需变量名之前添加$符号,如上面的$(CC)和$(CCF LAGS)。
?
5
7
?
5期
微 处 理 机接下来就需要修改Makefile 中的CC 变量了,
一般PC 机上的L inux 驱动程序使用上面提到的CC =gcc 语句定义编译器,在嵌入式开发中需要将它改为CC =a m33-linux -gnu -gcc 。其中a m33-linux -gnu -gcc 是AR M 硬件开发平台的交叉编译器名称,是交叉编译工具之一。
将多个层次多个级别的Makefile 揉和到一起并剔除一些无用的部分并不是一件容易的事,这里提供一种简单的方法,即使用:
make -n
它的作用是-只打印要执行的命令,但不执行这些命令。安装原驱动程序以后执行该命令可以看到实际上驱动使用了哪些.c 文件,生成了哪些.o 文件,使用的选项和命令是什么,针对列出的命令顺序改写Makefile,并调试编译通过。
4 交叉编译的改进
当Makefile 改写完毕且编译没有出现问题后,下一步工作就是将US B 驱动用到的相关源程序文件和头文件放到要打到目标板的内核中。
由于本项目开发的无线网卡品牌较多,因此在内核中另外建了一个目录wireless 。通过下列命令:
cp xx .c linux -2.4.18/drivers/usb /wireless cp xxx .h linux -2.4.18/drivers/usb /wireless 将US B 驱动需要的源程序文件和头文件拷贝到内核中,其中xx 和xxx 代表不同的文件名称。之后在内核根目录下编译生成zI m age 文件(二进制文件):
make zI m age
该文件是elf 格式的。linux 环境下不是所有的二进制文件都有相同的格式,linux 系统使用二进制文件的处理程序来实现对不同二进制格式文件的分别处理,而ELF 就是现在主流的linux 二进制文件格式。尽管如此,它和其他格式一样需要使用二进制处理程序,因此无法在PC 上执行。
使用下列命令
cp arch /mn10300/boot/zI m age /tft p /zI m age 将生成的二进制文件放到/tft p /目录下,该目录
是下载核心的目录,而boot 目录对应为linux 启动程序的目录,boot 目录的路径根据不同的硬件开发环境,不同的交叉编译环境有所不同。这样,目标板就可以从事先设定好的ft p 上下载zI m age 文件启动运行了。
5 菜单配置界面的改进
将驱动打入内核,就需要在菜单配置界面里安排选项,以便用户日后进行配置。使用下列命令:
vi m linux -2.4.18/drivers/usb /Makefile
进入菜单配置的Makefile 文件,在其中加入: subdir -$(CONF I G_ADD _WLAN )+=wireless
这样就在内核的drivers/usb /目录下生成了一个wireless 文件夹,驱动的相关文件就是放在这里。之后进入wireless 目录下,编辑相应的Makefile 文件,在其中加入:
obj -$(CONF I G_US B _W I RE LESS_ADAPTER )+=xxxx .o xxxxx .o xxx .o (xxx 代表驱动源程序生成的相应目标文件)
修改完毕,系统就会根据wireless 目录下的C 程序文件及头文件生成所需的目标文件,从而为设备提供所需的支持。
6 结束语
对L inux 下无线网卡驱动程序移植的实现方案进行了较详细的分析,并对其实现进行了较详细的讨论。运行情况表明,文中所作的改进设计稳定、可靠,现已应用于智能家庭网关的项目中。
参考文献:
[1] ALESS ANDRO RUB I N I &JONATHAN C ORBET .L inux
Device D river 2ed editi on [M ].Cambridge,MA,US A,O ’Reilly,2001.[2] 陈莉君.深入分析L inux 内核源代码[M ].北京:人民
邮电出版社,2002.[3] 毛德操,胡希明.L inux[M ].杭州:浙江大学出版社,
2001.[4] 李善平,刘文峰,李程远,等.L inux 内核2.4版源代码
分析大全[M ].北京:机械工业出版社,2002.[4] 赵炯.L inux 内核完全注释[M ].北京:机械工业出版
社,2004.
特约声明
本刊已入编《中国学术期刊网》(光盘版)、中国科学技术信息研究所《万方数据网》、科学技术部西南信
息中心《中文科技期刊数据库》和(台湾)华艺数位艺术股份有限公司《中文电子期刊服务》。其作者文章著
作权使用费与本刊稿费一次性付清。凡不同意入编的稿件,请作者在投稿时声明。
?67?2007年