嵌入式Linux网络驱动程序的开发及实现原理 04
- UID
- 872238
|
嵌入式Linux网络驱动程序的开发及实现原理 04
实例中数据接收函数cs8900_receive()由网络驱动的中断处理函数调用,主要完成如下工作:
a.通过从I/O口读取RxStatus和RxLength的值,确定接收数据帧的状态信息和长度;
b.判断接收数据帧的状态是否正常,若异常则记录相关错误信息,然后函数返回;
c.正常情况下,在内存中申请一块sk_buff缓存,并将数据从CS8900A的片内存储器传送到sk_buff缓存中;d.从数据帧中获取协议头并赋给skb->protocol;
e.通过调用netif_rx()函数将接收到的数据送往上层协议栈进行处理;
f.记录接收数据的时间并更新统计信息;
3将设备驱动模块编译进内核
设计好模块化的网络驱动程序后,我们就可以编译这个内核模块,并将这个自定义的内核模块作为Linux系统源码的一部分编译出新的系统。下面介绍的内容均在Linux2.6.18内核上编译通过,可以在2.6.x版本内核中通用。如前所述,由于Linux2.6内核引入了kbuild的新机制,使得编译新的内核模块或者将自己编写的内核模块集成到内核源码中都变得非常简单了。
Linux2.6内核中,编译内核模块首先要在/usr/src下正确配置和构造内核源码树,即把需要版本的内核源码解压在/usr/src/,并在内核源码的主目录下(这里为/usr/src/linux-2.6.18.3),使用make menuconfig或者make gconfig命令配置内核,然后使用make all完整编译内核。
下面以作者开发的CS8900A网卡驱动为实例,介绍如何将网络设备驱动模块编译进内核。
a.在系统源码树drivers目录下创建新目录Cs8900;
b.将编写好的文件cs8900.c和cs8900.h拷贝到drivers/Cs8900目录下;
c.在drivers/Cs8900目录下,编写Makefile文件:
#Makefile for CS8900A Network Driver
obj -$(CONFIG_DRIVER_CS8900A) +=cs8900.o
d.在drivers/Cs8900目录下,编写Kconfig文件:
#Just for CS8900A Network InteRFace
menu "CS8900A Network Interface support"
config DRIVER_CS8900A
tristate "CS8900A support"
--------help--------
This is a network driver module for CS8900A.
endmenu
e.在driver目录下的Kconfig文件endmenu语句前,加入一行:
source "drivers/Cs8900/Kconfig"
这样在内核源码树的主目录下,通过make menuconfig或者make gconfig命令就可以在Device Drivers选项的下面找到CS8900A Network Interface support选项,并找到CS8900A support的选择菜单,它有三种状态:未选中(不编译)、选中(M)一编译为模块、选中(*)一编译为新系统一部分。
重新编译内核即可得到支持CS8900A网卡的内核,然后将内核下载到FS2410的开发板上,通过配置网络参数,就可以测试网卡驱动程序的行为了。
4 结束语
在这个信息爆炸的时代,人们对于网络的需求愈发强烈,越来越多的嵌入式设备都需要具有以太网的接入功能,因此开发网络驱动程序对于很多嵌入式产品的研发至关重要。具体开发嵌入式Linux网络驱动程序时,可以参照内核中已经支持的网络驱动源代码,在重点理解Linux网络驱动实现原理的基础上,按照模块设计较为固定的开发模式,结合具体物理设备的硬件手册,移植编写需要的模块化的网络驱动程序。 |
|
|
|
|
|