VxWorks下网卡驱动程序的开发

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

VxWorks下网卡驱动程序的开发摘要:本文首先从整体上分析VxWorks网卡驱动程序的原理和结构,然后深入地分析Rtl8139C网卡驱动程序的结构以及实现,本文对于VxWorks下的同类开发也有一定参考作用。关键词:网卡驱动程序;VxWorks;嵌入式系统;Tornado1引言VxWorks是当前应用十分广泛的嵌入式实时操作系统,而网卡在基于VxWorks的开发中有着极其重要的作用。Tornado是VxWorks的开发工具,它本身支持的网卡不多。本文涉及到的网卡是Realtek公司的8139CPCI网卡,相关的硬件资料有:RTL8139C(L)datasheet和Rtl8139ProgrammingGuide。需要实现的是RTL8139CENDdriver。2VxWorks简介VxWorks是由WRS(WindRiverSystemInc.)公司开发的一套具有微内核、高性能、可伸缩的实时操作系统,支持广泛的网络通信协议,并能够根据用户的需求进行组合。其开放式的结构和对工业标准的支持使开发者只需做最少的工作即可设计出有效的适合于不同用户要求的系统。VxWorks是一种功能强大而且比较复杂的操作系统,VxWorks只占用了很小的存储空间,并可高度裁减,保证了系统能以较高的效率运行。所以仅仅依靠人工编程调试,很难发挥它的功能并设计出可靠、高效的嵌入式系统,必须要有与之相适应的开发工具。TornadoII是为开发VxWorks应用系统提供的集成开发环境。VxWorks的优秀特性为编写应用程序和设备驱动程序提供了极大的便利。在VxWorks下,设备驱动程序既可以嵌入到内核中随系统一起启动,也可以作为可加载模块在系统启动之后运行。网卡驱动程序一般采用前一种方式。3VxWorks的网络模型网卡在VxWorks开发中是极其重要的。在开发机-目标机模式中,通过网线进行下载调试是Tornado调试器最常用最方便的方式。VxWorks的优秀的实时性能使其在网络通信当中具有极广泛的应用,如网络交换机、路由器的软件系统等。网卡驱动程序在整个VxWorks网络接口中的角色可以从下图中看出。整个网络接口呈层次结构,用户网络应用程序通过socket接口调用TCP/IP协议层系列软件,网卡驱动程序则为协议软件提供对网卡的访问。VxWorks也为网卡驱动程序进行了分层,其中老式的BSD4.3驱动程序的功能,现在可以由协议层驱动、MUX层和END驱动实现。而且,工作于BSD的以太网网卡不支持系统级调试,而工作于END的网卡同时支持任务级调试和系统级调试。很显然,网卡驱动程序的层次结构使网卡驱动程序的实现和移植更加方便。而且,VxWorks为编写网卡增强型驱动程序(EnhancedNetworkDrivers)提供了很好的接口和规范。4Rtl8139CEND驱动程序4.1PCI局部总线本文涉及到的网卡是Realtek公司的8139CPCI网卡,作为一个PCI设备,在设备的初始化阶段,它和一般的PCI设备没有什么不同。每一个PCI局部总线目标设备都由一个配置寄存器空间,它使目标设备的配置十分简便。配置空间是一个容量为256字节并具有特定记录结构或模型的地址空间。该空间有分为头标区和设备有关区两部分。设备在每个区中只实现必要的和与之相配的寄存器。一个设备的配置空间不仅在系统自举时可以访问,而且在其他时间内也是可以访问的。4.2数据包结构VxWorksMUX层的数据包采用的是mBlk-clBlk-cluster结构,如图。发送时,网卡发送模块处理的是这样的结构;接收数据时,网卡还得将数据通过这样的结构传递给上层协议。不过,这一切Vxworks都有相应的规范和函数。另外,mBlk和clBlk可以由netpool结构管理,VxWorks提供一系列接口函数。图2网络数据包结构4.3驱动程序的结构以及流程1、网卡的探测以及入口VxWorksBSP在syslib.c中探测并初始化系统中的PCI设备,检测设备的I/O映射地址,内存映射地址以及中断向量和级别,这些硬件参数对于主芯片的读写和连接中断起到至关重要的作用。因此,在这里加入8139C网卡的探测模块。然后将探测到的参数传递给驱动程序入口函数。网卡的探测模块为sysRtl8139PciInit模块,利用的是RTL8139C的厂商标识和设备标识,在所有的PCI设备中判断有几块这样的网卡,得到它们的功能号,总线号和设备号,然后配置它的PCI配置空间,将网卡寄存器映射。最后得到网卡I/O映射基地址和Mem基地址以及中断向量和级别。2、入口函数ENDdriver与系统的接口是MUX层,BSP对于网卡设备的驱动是通过MuxDevLoad()对endDevTbl[](configNet.h中)的处理来实现的。因此,可以将一个自定义的入口函数加到endDevTbl[],这样就可以使驱动程序在合适的时间对设备进行初始化。驱动程序的入口分为两个步骤,他们分别是sysRtl8139EndLoad模块和Rtl8139EndLoad模块。sysRtl8139EndLoad获得sysRtl8139PciInit探测到网卡硬件参数,并且两次调用Rtl8139EndLoad模块。Rtl8139EndLoad模块第一次被调用时只是为了返回设备名称。在Rtl8139EndLoad入口函数中,解析参数,为网卡的DMA工作方式分配一定大小的空间,写寄存器,准备工作。这之后,网卡的开始工作和停止,以及其他设置完全由MUX层管理,驱程只需要将一系列模块的指针传递给它。这些模块按照MUX层的要求是一个NET_FUNCS结构,如下所示。LOCALNET_FUNCSrtlFuncTable={(FUNCPTR)rtl8139Start,/*startfunc.*/(FUNCPTR)rtl8139Stop,/*stopfunc.*/(FUNCPTR)rtl8139Unload,/*unloadfunc.*/(FUNCPTR)rtl8139Ioctl,/*ioctlfunc.*/(FUNCPTR)rtl8139Send,/*sendfunc.*/(FUNCPTR)rtl8139MCastAddrAdd,/*multicastaddfunc.*/(FUNCPTR)rtl8139MCastAddrDel,/*multicastdeletefunc.*/(FUNCPTR)rtl8139MCastAddrGet,/*multicastgetfun.*/(FUNCPTR)rtl8139PollSend,/*pollingsendfunc.*/(FUNCPTR)rtl8139PollReceive,/*pollingreceivefunc.*/endEtherAddressForm,/*putaddressinfointoaNET_BUFFER*/endEtherPacketDataGet,/*getpointertodatainNET_BUFFER*/endEtherPacketAddrGet,/*Getpacketaddresses.*/};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有一个中断状态寄存器和一个中断屏蔽寄存器,它们对应位意义相同。中断状态寄存器反映了网卡能产生的几种中断。一旦有中断发生,中断处理函数首先屏蔽中断,再分析中断状态寄存器,调用相应的处理函数只要中断发生,系统调用中断处理函数。中断处理函数的主要功能是分析中断状态寄存器,进行相应的处理。依据RTL8139ProgrammingGuide中的说明,若是发送中断,无论成功与否,调用发送处理函数,若是接收中断,开辟新的接受任务,这么做是因为中断处理函数运行在系统级,而接收处理较复杂耗时,所以采用系统函数netJobAdd开辟新的任务。而简单的处理就直接在中断处理函数中完成,包括发送完后产生的中断。由于,处理函数在执行的过程中,新的中断可能出现,而此时中断已屏蔽,但各自的状态位依然变化。因此,在中断处理函数中采用循环结构,直到中断状态寄存器表明在处理过程中没有新的中断发生。5、数据接收和发送接收数据时,从相应的寄存器取出当前数据包的地址,首先分析数据包头部,包括数据包的接收状态和大小。如果是错误的状态,就使命令寄存器中的接收能位失效,再使其有效,这可看作接收重启,再重新设置与接收相关的寄存器。如果接收的数据包正常,接收处理函数就得按照数据包的大小将数据包拷贝到cluster区(Rtl8139InitMem模块中分配),用mBlk-clBlk-cluster结构传递给上层协议,并刷新寄存器使其指向下一个数据包。然后,读命令寄存器,判断是否接收完毕,否则循环。发送数据时,由于Rtl8139采用四个描述符寄存器和四个状态寄存器。所以在使用它们前首先判断是否有空闲的寄存器,如果没有,就得等待一段时间。在这段时间里,如果有寄存器空闲出来,就开始发送数据,否则退出。发送时,只要将上层协议传递过来的mBlk-clBlk-cluster中的cluster数据拷贝到发送区,写描述符寄存器就可。而记录每个描述符寄存器使用情况,就使用RTL8139END_DEVICE结构中的一个数组。如果发送完毕,无论成功与否,都得让描述符空闲出来。5结束语本文具体的分析了Rtl8139C网卡驱动程序在VxWorks操作系统下的实现。在分析过程中,更多侧重PCI网卡END驱动程序在VxWorks下实现的共性,包括必需的配置和步骤,比如PCI设备的相关工作以及VxWorks下MUX层的数据包结构。由于网卡主控制器的内部差异,其他网卡在初始化、接收数据以及发送数据方面会有不同,但是在其他方面,PCI网卡END驱动程序都可以参考Rtl8139C网卡驱动程序的实现。参考文献:[1]TornadoBSPTrainingWorkshop.Version1.0.2.WindRiverSystems,Inc.April1998[2]TornadoDeviceDriverWorkshop.[3]李贵山,陈金鹏.PCI局部总线及其应用[M].西安:西安电子科技大学出版社,2003.

1 / 4
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功