新闻中心

EEPW首页>嵌入式系统>设计应用> 嵌入式Linux网络驱动程序的开发及实现原理

嵌入式Linux网络驱动程序的开发及实现原理

作者: 时间:2009-12-29 来源:网络 收藏
2.3.4数据包的接收和中断处理
设备是异步地接收外来的数据包并且主动的“请求”将硬件获得的数据包压入内核。设备接收数据包是通过中断的。对于网络接口,接收到新数据包,发送完成或者报告错误信息及连接状态等都会触发中断,通常中断处理程序通过检测硬件状态寄存器判断是哪种情况。
当设备收到数据后会产生一个中断,由硬件通知有数据包到达。在中断处理程序中申请一块sk_buff(一般定义为skb)缓冲区,然后从硬件读出数据放到申请好的缓冲区里,接下来填充sk_buff中的部分信息:包括接收到数据的设备结构体指针填入skb->dev;收到数据帧的类型填入skb->protocol;把指针skb->mac.raw指向硬件数据并丢弃硬件针头(skb_pull);设置skb->pkt_type,标明链路层数据类型。最后调用协议接口层函数netif_rx() 把接收到的数据包传输到网络上层协议处理。这里,netif_rx()只是负责把数据放入工作队列就返回,真正的处理是在中断返回以后,这样可减少中断处理的时间。几乎每个中断处理程序的编写都要涉及底半部机制,这样可以保证中断的高效处理。
实例中数据接收函数cs8900_receive()由网络驱动的中断处理函数调用,主要完成如下工作:
a.通过从I/O口读取RxStatus和RxLength的值,确定接收数据帧的状态信息和长度;
b.判断接收数据帧的状态是否正常,若异常则记录相关错误信息,然后函数返回;
c.正常情况下,在内存中申请一块sk_buff缓存,并将数据从CS8900A的片内存储器传送到sk_buff缓存中;d.从数据帧中获取协议头并赋给skb->protocol;
e.通过调用netif_rx()函数将接收到的数据送往上层协议栈进行处理;
f.记录接收数据的时间并更新统计信息;
3将设备驱动模块编译进内核
设计好模块化的网络后,我们就可以编译这个内核模块,并将这个自定义的内核模块作为系统源码的一部分编译出新的系统。下面介绍的内容均在2.6.18内核上编译通过,可以在2.6.x版本内核中通用。如前所述,由于2.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网络驱动的基础上,按照模块设计较为固定的开发模式,结合具体物理设备的硬件手册,移植编写需要的模块化的网络驱动程序。

本文引用地址://m.amcfsurvey.com/article/152169.htm
linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭