微波EDA网,见证研发工程师的成长!
首页 > 通信和网络 > 通信网络技术文库 > 基于嵌入式Linux的网络设备驱动设计与实现

基于嵌入式Linux的网络设备驱动设计与实现

时间:07-27 来源:互联网 点击:
3.2.2 设备的注销  

设备的注销过程与设备初始化的过程相反,释放网卡的地址空间及网卡驱动使用的其他相关资源,注销网络设备的Dev结构。  

3.2.3 中断处理  

网卡工作有轮循和中断两种模式。轮循模式会大量占用CPU资源,影响嵌入式系统性能,因此这里选择中断模式。有5种情况会触发中断,每种情况对应不同的中断寄存器,中断发生会将某一模式寄存器的相应位置位,并且把这种模式寄存器中的内容映射到中断状态寄存器。当有中断事件发生后,进入中断例程,首先读取中断状态寄存器的内容,然后根据其中的信息判断是哪种情况触发的中断,最后进入相应的分支进行处理。  

3.2.4 对5种中断状态的处理  

1) 接收帧  

当网卡接收到数据就会触发一次中断,在中断例程中调用接收包的函数cirrus_receive。首先读取接收的状态和长度,使用dev_alloc_skb分配一段足够大小的缓冲区,得到该包的网络协议ID号,在一个申请好的sK_buff的缓冲区中保留一块空间,这个空间一般是用做下一层协议的头空间;接着将网卡接收缓冲区中的数据读到skb缓冲区中,再使用netif_rx通知上层协定有新的封包传人。当一个封包传送完成后,必须将缓冲区释放。  

2) 发送帧  

当主机要发送数据时调用hard_start_xmit方法将数据放人外发队列,而此方法关联的函数就是cirrus_send_start。内核处理后的每个数据包位于一个套接字缓冲区(struct sK_buff)结构,核心处理的每个包包含在一个套接字缓冲区结构,输入输出缓冲区都是sk_buff结构的链表,传递给hard_start_xmit的套接字缓冲区含有物理包,它具有传输层的包头。接口不需要修改被发送的数据。实际的硬件接口是异步传输数据包的,硬件中有缓冲区以保存要外发的数据包,但是此缓冲空间非常有限。在此函数中首先通知上层表明硬件缓冲区已经用完不要再送封包下来,然后向网卡发命令表示要开始发送数据并且指明发送数据的长度,接着读BusST寄存器判断当前网卡状态,如果主机中的发送缓冲区可用,则将SKB中数据发到网卡的缓冲区中,最后释放SKB。如果网卡将数据发送成功,则会触发一次中断,在中断处理例程中将net_device_stats结构体中的tx_packets(表示发送的包的个数)元素递增并通知上层可继续送包下来。  

3) BufEvent  

Buffer事件当RxMiss置位表示由于数据从缓冲区中搬移到主机速度较慢而丢失了一些接收的帧,读寄存器获取丢失的包的数目。当TxUnderrun置位表示在帧结束前网卡运行已过时。改变网络状态结构体中对应元素的值,接着通知上层可往下发送包数据。  

4) TxCOL  

当传输出现冲突错误时,通过读寄存器值得到当前冲突的个数,加到统计结构体中的对应元素值上。  

5) RxMISS  

读寄存器获取丢失帧的个数。  

3.2.5 传输超时的处理  

驱动程序要处理硬件不能正确响应的情况,比如中断丢失或者接口工作异常等。网络系统使用大量定时器控制的多个状态机之间流转来检测传输超时,因此本驱动程序中无需自己检测超时间题而只是通过net_device结构的watchdog_timeo字段设置超时剧期为10 ms,对于一般的传输超时,此值能满足要求。当检测到系统时间超过设备传输开始的时间至少1个超时周期,网络层将调用cirrus_transmit_timeout方法,解决超时所要做的工作,主要是在统计信息中标记该错误,同时调用netif_wake_queue重新启动传输队列。  

3.2.6 测试结果  

网络设备驱动测试主要从底层硬件测试和上层网络测试两个方面进行。底层硬件测试使用如下方法:在内存中开辟两块区域M1、M2,并按照网络包的格式设置初始值,将M1中的数据通过网卡发送出去,但是以回环方式,最终还是由主机端接收到,存放到M2中,再将M2中的数据通过网卡发送出去,并接收回来。经过多次循环,比较最终的数据包和先前设置的数据包是否一致,经过此项测试表明在最底层数据发送和接收无误。上层网络测试使用如下方法:目标机和PC端通过网线相连,目标机端丌启pure-ftp服务,主机端使用FlashFXP软件,从主机分别传送不同大小(从0 MB到20 MB)文件到目标机,再从目标机传送到主机,执行多次比较传送文件是否有误,并计算网络传送速度。测试结果表明网卡驱动能较好地实现网络应用的功能,速度达到2 Mbit/s~5 Mbit/s。  

4 结束语  

本文提出了一种基于嵌入式Linux的网卡驱动实现方案,并介绍了Linux下网络设备驱动的一些特性。此方案已应用到基于Intel PXA255处理器的金融信息终端研发中,使用和测试表明此方案稳定可靠,也可为其他嵌人式系统的网络设备开发提供一定的参考。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top