VxWorks下网卡驱动程序的开发

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VxWorks下网卡驱动程序的开发

摘要:本文首先从整体上分析VxWorks 网卡驱动程序的原理和结构,然后深入地分析Rtl8139C网卡驱动程序的结构以及实现,本文对于VxWorks下的同类开发也有一定参考作用。

关键词:网卡驱动程序;VxWorks;嵌入式系统;Tornado

1引言

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层的数据包采用的是mBlk-clBlk-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模块完成。

相关文档
最新文档