VxWorks下网卡驱动程序的开发.doc_第1页
VxWorks下网卡驱动程序的开发.doc_第2页
VxWorks下网卡驱动程序的开发.doc_第3页
VxWorks下网卡驱动程序的开发.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VxWorks下网卡驱动程序的开发摘要:本文首先从整体上分析VxWorks 网卡驱动程序的原理和结构,然后深入地分析Rtl8139C网卡驱动程序的结构以及实现,本文对于VxWorks下的同类开发也有一定参考作用。关键词:网卡驱动程序;VxWorks;嵌入式系统;Tornado1引言 VxWorks是当前应用十分广泛的嵌入式实时操作系统,而网卡在基于VxWorks的开发中有着极其重要的作用。Tornado 是VxWorks的开发工具,它本身支持的网卡不多。本文涉及到的网卡是Realtek 公司的8139C PCI网卡,相关的硬件资料有:RTL8139C(L) data sheet 和 Rtl8139 Programming Guide 。需要实现的是RTL8139C END driver 。2 VxWorks简介 VxWorks是由WRS(Wind River System Inc.)公司开发的一套具有微内核、高性能、可伸缩的实时操作系统,支持广泛的网络通信协议,并能够根据用户的需求进行组合。其开放式的结构和对工业标准的支持使开发者只需做最少的工作即可设计出有效的适合于不同用户要求的系统。 VxWorks是一种功能强大而且比较复杂的操作系统,VxWorks只占用了很小的存储空间,并可高度裁减,保证了系统能以较高的效率运行。所以仅仅依靠人工编程调试,很难发挥它的功能并设计出可靠、高效的嵌入式系统,必须要有与之相适应的开发工具。TornadoII是为开发VxWorks应用系统提供的集成开发环境。 VxWorks的优秀特性为编写应用程序和设备驱动程序提供了极大的便利。在VxWorks下,设备驱动程序既可以嵌入到内核中随系统一起启动,也可以作为可加载模块在系统启动之后运行。网卡驱动程序一般采用前一种方式。3 VxWorks的网络模型 网卡在VxWorks开发中是极其重要的。在开发机-目标机模式中,通过网线进行下载调试是Tornado调试器最常用最方便的方式。VxWorks的优秀的实时性能使其在网络通信当中具有极广泛的应用,如网络交换机、路由器的软件系统等。 网卡驱动程序在整个VxWorks网络接口中的角色可以从下图中看出。 整个网络接口呈层次结构,用户网络应用程序通过socket接口调用TCP/IP协议层系列软件,网卡驱动程序则为协议软件提供对网卡的访问。VxWorks也为网卡驱动程序进行了分层,其中老式的BSD4.3驱动程序的功能,现在可以由协议层驱动、MUX层和END驱动实现。而且,工作于BSD的以太网网卡不支持系统级调试,而工作于END的网卡同时支持任务级调试和系统级调试。很显然,网卡驱动程序的层次结构使网卡驱动程序的实现和移植更加方便。而且,VxWorks 为编写网卡增强型驱动程序(Enhanced Network Drivers)提供了很好的接口和规范。4 Rtl8139C END驱动程序4.1 PCI局部总线 本文涉及到的网卡是Realtek 公司的8139C PCI网卡,作为一个PCI设备,在设备的初始化阶段,它和一般的PCI设备没有什么不同。 每一个PCI局部总线目标设备都由一个配置寄存器空间,它使目标设备的配置十分简便。配置空间是一个容量为256字节并具有特定记录结构或模型的地址空间。该空间有分为头标区和设备有关区两部分。设备在每个区中只实现必要的和与之相配的寄存器。一个设备的配置空间不仅在系统自举时可以访问,而且在其他时间内也是可以访问的。4.2数据包结构 VxWorks MUX层的数据包采用的是mBlkclBlk-cluster 结构,如图。发送时,网卡发送模块处理的是这样的结构;接收数据时,网卡还得将数据通过这样的结构传递给上层协议。不过,这一切Vxworks 都有相应的规范和函数。另外,mBlk和clBlk可以由netpool 结构管理,VxWorks 提供一系列接口函数。图2 网络数据包结构4.3驱动程序的结构以及流程1、网卡的探测以及入口 VxWorks BSP在syslib.c中探测并初始化系统中的PCI设备,检测设备的I/O映射地址,内存映射地址以及中断向量和级别,这些硬件参数对于主芯片的读写和连接中断起到至关重要的作用。因此,在这里加入8139C 网卡的探测模块。然后将探测到的参数传递给驱动程序入口函数。网卡的探测模块为sysRtl8139PciInit模块,利用的是RTL8139C的厂商标识和设备标识,在所有的PCI设备中判断有几块这样的网卡,得到它们的功能号,总线号和设备号,然后配置它的PCI配置空间,将网卡寄存器映射。最后得到网卡I/O映射基地址和Mem基地址以及中断向量和级别。2、入口函数 END driver与系统的接口是MUX层,BSP对于网卡设备的驱动是通过MuxDevLoad()对endDevTbl(configNet.h中)的处理来实现的。因此,可以将一个自定义的入口函数加到endDevTbl,这样就可以使驱动程序在合适的时间对设备进行初始化。 驱动程序的入口分为两个步骤,他们分别是sysRtl8139EndLoad模块和Rtl8139EndLoad模块。sysRtl8139EndLoad获得sysRtl8139PciInit 探测到网卡硬件参数,并且两次调用Rtl8139EndLoad模块。Rtl8139EndLoad模块第一次被调用时只是为了返回设备名称。 在Rtl8139EndLoad入口函数中,解析参数,为网卡的DMA工作方式分配一定大小的空间,写寄存器,准备工作。这之后,网卡的开始工作和停止,以及其他设置完全由MUX 层管理,驱程只需要将一系列模块的指针传递给它。这些模块按照MUX 层的要求是一个 NET_FUNCS 结构,如下所示。LOCAL NET_FUNCS rtlFuncTable = (FUNCPTR)rtl8139Start, /* start func. */(FUNCPTR)rtl8139Stop, /* stop func. */(FUNCPTR)rtl8139Unload, /* unload func. */(FUNCPTR)rtl8139Ioctl, /* ioctl func. */ (FUNCPTR)rtl8139Send, /* send func. */ (FUNCPTR)rtl8139MCastAddrAdd,/* multicast add func. */(FUNCPTR)rtl8139MCastAddrDel,/* multicast delete func. */ (FUNCPTR)rtl8139MCastAddrGet,/* multicast get fun. */ (FUNCPTR)rtl8139PollSend, /* polling send func. */ (FUNCPTR)rtl8139PollReceive, /* polling receive func. */ endEtherAddressForm, /* put address info into a NET_BUFFER */endEtherPacketDataGet, /* get pointer to data in NET_BUFFER */endEtherPacketAddrGet,/*Get packet addresses. */; Rtl8139EndLoad 模块是rtl8139.c中唯一的外部函数,当程序流程到达这里的时候,已经可以对网卡寄存器读写,程序完全是对寄存器进行设置。在这个模块中,首先判断函数参数,因为它被调用两次。当确定是第二次调用时,首先为驱动程序分配一个结构RTL8139END_DEVICE,用以存储共享参数。然后解析函数参数,依据这些参数配置RTL8139END_DEVICE。接着,调用rtl8139InitMem模块,为网卡分配所需要的内存,将这些参数写进RTL8139END_DEVICE。这样,网卡所需的资源齐全了。用上层协议提供的函数END_OBJ_INIT和END_MIB_INIT,将RTL8139END_DEVICE 和驱动程序模块传递给上层协议。需要为网卡分配的内存包括:接收区,发送区,cluster区,mBlk,clBlk和管理它们的netpool。这些都是在Rtl8139InitMem模块中完成。3、网卡的启动和关闭 网卡要开始工作,还得依赖MUX层调用rtl8139Start模块,该模块将中断向量和处理函数连接在一起。然后调用硬件初始化rtl8139HwStart模块,在这个模块中,设置接收地址寄存器,使其能管理接受区,写设置寄存器,设置网卡的工作方式,写中断屏蔽寄存器,确定处理哪些中断。最后,写命令寄存器,使接受和发送位有效。程序到此,就能产生中断,并进行处理。当系统要退出或者其他原因时,就得关闭网卡。系统是调用通过MUX层中的rtl8139Stop模块完成。4、中断处理程序 RTL8139C 有一个中断状态寄存器和一个中断屏蔽寄存器,它们对应位意义相同。中断状态寄存器反映了网卡能产生的几种中断。一旦有中断发生,中断处理函数首先屏蔽中断,再分析中断状态寄存器,调用相应的处理函数 只要中断发生,系统调用中断处理函数。中断处理函数的主要功能是分析中断状态寄存器,进行相应的处理。依据RTL8139 Programming Guide 中的说明,若是发送中断,无论成功与否,调用发送处理函数,若是接收中断,开辟新的接受任务,这么做是因为中断处理函数运行在系统级,而接收处理较复杂耗时,所以采用系统函数netJobAdd开辟新的任务。而简单的处理就直接在中断处理函数中完成,包括发送完后产生的中断。 由于,处理函数在执行的过程中,新的中断可能出现,而此时中断已屏蔽,但各自的状态位依然变化。因此,在中断处理函数中采用循环结构,直到中断状态寄存器表明在处理过程中没有新的中断发生。5、数据接收和发送 接收数据时,从相应的寄存器取出当前数据包的地址,首先分析数据包头部,包括数据包的接收状态和大小。如果是错误的状态,就使命令寄存器中的接收能位失效,再使其有效,这可看作接收重启,再重新设置与接收相关的寄存器。如果接收的数据包正常,接收处理函数就得按照数据包的大小将数据包拷贝到cluster 区(Rtl8139InitMem 模块中分配),用mBlk-clBlk-cluster结构传递给上层协议,并刷新寄存器使其指向下一个数据包。然后,读命令寄存器,判断是否接收完毕,否则循环。发送数据时,由于Rtl8139采用四个描述符寄存器和四个状态寄存器。所以在使用它们前首先判断是否有空闲的寄存器,如果没有,就得等待一段时间。在这段时间里,如果有寄存器空闲出来,就开始发送数据,否则退出。发送时,只要将上层协议传递过来的mBlk-clBlk-cluster中的cluster数据拷贝到发送区,写描述符寄存器就可。而记录每个描述符寄存器使用情况,就使用RTL8139END_DEVICE 结构中的一个数组。如果发送完毕,无论成功与否,都得让描述符空闲出来。5结束语 本文具体的分析了Rtl8139C网卡驱动程序在VxWorks操作系统下的实现。在分析过程中,更多侧重PCI网卡END驱动程序在VxWorks下实现的共性,包括必需的配置和步骤,比如PCI设备的相关工作以及VxWorks下MUX层的数据包结构

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论