您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 27-VxWorks网络驱动程序编写实验
实验27VxWorks网络驱动程序编写实验一实验原理1MUX网络设备驱动程序简介VxWorks的网络协议栈有个特征,就是在数据链接和网络协议层之间使用公共接口(API)来进行数据交互,这种接口被称为MUX网络接口。在BSD4.3模型下,VxWorks网络骆动程序和协议紧密结合,它们彼此紧密依赖于对方的数据结构。而在基于MUX的模式下,网络驱动程序与协议之间没有内部交换数据,它们只通过MUX间接相互作用。例如,接收到数据包后,网络接口驱动程序并不直接访问协议中的任何结构。而当驱动程序准备给协议传递数据时,驱动程序会调用MUX辅助程序,然后此程序用于处理给协议传递数据时的具体细节。MUX接口的目的是分解协议和网络驱动程序,从而使它们几乎独立于彼此。这种独立使添加新的驱动程序和协议变得简单。例如,若想添加一新的END,所有现有基于MUX的协议均可使用新的驱动程序。同样地,若想添加一新的基于MUX的协议,任何现有的END均可MUX来访问新的协议。图1VxWorks网络协议栈IP+ICMPStream用户协议MUX接口以太网SLIP其他图2VxWorks网络协议与MUX接口图3VxWorksMUX驱动与网络协议图1、2、3显示了协议栈、MUX和一个网络接口驱动程序之间的API接口调用关系。可以看出协议层会执行以下接口:stackShutdownRm()stackError()stackRcvRm()stackTxRestartRm()stackShutdownRtn()stackRcvRtm()stackError()stackTxRestartRtn()muxBind()muxUnbind()muxDevLoad()muxDevUnload()muxReceive()muxError()muxSend()muxTxRestartRtn()muxMCastAddrGet()muxMCastAddrDel()muxMCastAddrAdd()muxPollSend()muxPollReceive()muxIoctl()endLoad()endUnload()endSend()endTxRestartRtn()endMCastAddrGet()endMCastAddrDel()endMCastAddrAdd()endPollSend()endPollReceive()endIoctl()endStart()endStop()图4VxWorksMUX驱动调用关系MUX会执行入口点muxBind()、muxUnbind()、muxDevLoad()等。MUX使用这些入口点与网络接口驱动程序相互作用,如图4。当编写或加载网络接口驱动程序以使用MUX时,用户必须实现上面的所有接口点。当启动系统时,VxWorks执行任务tUsrRoot来完成驱动程序的安装,步骤如下:网络任务的工作队列初始化;产生tNetTask来处理网络任务工作队列中的条目;调用muxDevLoad()加载网络驱动程序;调用muxDevStart()启动驱动程序。使用tUsrRoot调用muxDevLoad()加载用户网络驱动程序。作为调用的输入,tUsrRoot规定了用户驱动程序endLoad()的入口点。这个endLoad()入口点类似于xxattach()入口点。endLoad()程序用于处理任何特殊设备的初始化并且返回一个END_OBJ结构。用户的网络设备描述结构必须包含该结构,而且还包括一个指向NET_FUNCS结构的指针。在从endLoad()返回控制值到muxDevLoad()之后,MUX完成了END_OBJ结构的填写(通过给程序赋予一指针,用户的驱动程序可以传递数据包到MUX中)。MUX然后把返回的END_OBJ添加到END_OBJ结构的链表中,此链表列出了当前系统所运行的所有网络设备的信息。在muxDevLoad()返回控制信息后,用户的驱动程序装载完毕以备用。当网络设备产生中断时,VxWorks调用用户驱动程序先前注册的中断服务程序,中断服务程序应做尽可能少的工作以完成将信息包从本地硬件送出/取出。中断服务程序应尽量减小中断阻塞时间,中断服务程序只应该处理那些只需要最小执行时间的任务,如差错和状态变换,而不应包含所有任务级的耗时处理工作。为了将一些数据包的处理工作放置在任务级别,用户中断服务程序必须调用netJobAdd()将相应的处理程序作为输入来生成一个任务级的数据处理任务,netJobAdd()接收一个程序指针和最多5个附加参数,这些参数将由添加的程序引用。下面是netJobAdd()的函数原型:程序清单1netJobAdd函数原型STATUSnetJobAdd{FUNCPTRrountine,/*处理函数的指针*/intparaml,/*可选参数1*/intparam2,/*可选参数2*/intparam3,/*可选参数3*/intparam4,/*可选参数4*/intparam5/*可选参数5*/}在用户调用netJobAdd()时,应把驱动程序用来处理数据包的入口点规定为任务级别。然后netJobAdd()程序把程序调用(和自变量)放入tNetTask的工作队列。VxWorks使用tNetTask来处理任务级别的网络处理。使用netJobAdd()有两个事情要明确:用户可以使用netJobAdd()来生成任务而不处理接收到的数据包;netJobAdd()为一个同时被网络堆栈所使用的有限资源。若其溢出将会造成通用网络堆栈的瘫痪。2RTL8019网络芯片简介在进行驱动程序编写之前,首先看看JX2410教学系统中的网络芯片的操作方法。JX2410使用的网络芯片是由台湾Realtek公司生产的RTL8019AS,它是一个高集成的以太网控制器芯片,不仅集成了介质访问控制子层(MAC)和物理层的性能,而且还可以方便地设计基于ISA总线的系统,简单的与通用处理器进行接口。另外,它还具有与NE2000兼容、软件移植性好,以及低廉的价格等优点,在市场上的10Mbps网卡中占有相当的比例。(1)主要性能适应于EthernetII、IEEE802.3协议、10Base5、10Base2、10BaseT;支持8位、16位数据总线,8个中断申请线以及16个I/O基地址选择;全双工,收发可同时达到10Mbps的速率,具有休眠模式,以降低功耗;内置16KB的SRAM,用于收发缓冲,降低对主处理器的速度要求;可连接同轴电缆和双绞线,并可自动检测所连接的媒介类型;支持闪存读写;允许四个诊断LED引脚可编程输出;100脚的TQFP封装,缩小主机板尺寸。(2)工作原理按数据链路的不同,可以将以太网络控制器内部划分为远程DMA(remoteDMA)信道和本地DMA(localDMA)信道两个部分。本地DMA完成控制器与网络线的数据交换,处理器(Host)收发数据只需对远程DMA操作。当主处理器要向以太网络发送数据时,先将一帧(frame)数据经过远程DMA信道,送到以太网络控制器中的发送缓存内存(RingBuffer),然后发出传送命令。以太网络控制器在送出前一帧的数据后,继而完成此帧的发送。以太网络控制器接收到的数据通过MAC比较、CRC校验后,由FIFO存到接收缓冲区,收满一帧后,以中断或缓存器标志的方式通知处理器。接收逻辑在接收时脉的控制下,将串行数据组成字节送到FIFO和CRC;发送逻辑将FIFO送来的字节在发送时脉的控制下逐步按位移出,并送到CRC;CRC逻辑在接收时对输入的数据进行CRC校验,将结果与帧尾的CRC比较,如不同,该帧数据将被拒收,在发送时CRC对帧数据产生CRC,并附加在数据尾传送;地址识别逻辑对接收帧的目的地址与预先设置的本地实体地址进行比较,如不同且不满足广播地址(broadcastaddress)的设定要求,该帧数据将被拒收;FIFO逻辑对收发的数据作16个字节的缓冲,以减少对本地DMA请求的频率。RTL8019是针对PC总线设计的,将其应用在嵌入式设备中,需要考虑其硬件和软件设计上的特殊性。嵌入式设备的主处理器可利用内存映像方法,将以太网络控制器内16个I/O地址上的缓存器映像到嵌入式操作系统来,这样就可以用程序来操控以太网络控制器。RTL8019的缓存器地址如下图所列。图5RTL8019芯片寄存器映射图(3)软件设计对于8019AS的软件设计,包括芯片初始化、发送、接收三部分。芯片初始化首先要对网卡进行复位:18H-1FH共8个地址,为复位端口。对该端口地址的读或者写入任何数,都会引起网卡的复位,代码如下:。程序清单2RTL8019复位操作voidrtl8019_Reset(void){unsignedinti;unsignedchartemp;for(i=0;i250;i++);/*简单的延时*/temp=inportb(RTL8019_BASE+0x1f);/*读网卡的复位端口*/outportbb(RTL8019_BASE+0x1f,temp);/*写网卡的复位端口*/}说明:RTL8019_BASE是RTL8019的基地址,其全部的寄存器地址都是由它得出来的,在初始化时必须赋予它正确的基准地址值。我们在此所使用的值为0x18000300。网卡复位完成之后,要对网卡的工作参数进行设置,使网卡开始工作。对网卡的参数设置主要是对命令寄存器CR进行设置,CR主要是用于选择寄存器页、启动或停止远程DMA操作以及执行命令。网卡初始化的软件编程如下:程序清单3RTL8019初始化voidrtl8019_init(){outportb(RTL8019_BASE+0x00,0x21);/*选择页0寄存器,网卡停止运行*/outportb(RTL8019_BASE+0x01,0x4c);/*接收缓冲区范围*/outportb(RTL8019_BASE+0x02,0x80);/*PSTOP,构造缓冲环:0x4c-0x80*/outportb(RTL8019_BASE+0x03,0x4c);/*BNRY,设置指针*/outportb(RTL8019_BASE+0x04,0x40);/*发送缓冲区范围*/outportb(RTL8019_BASE+0x0d,0x4c);outportb(RTL8019_BASE+0x0e,0xc8);/*设置数据配置寄存器使用FIFO缓存*//*普通模式,8位数据DMA*/outportb(RTL8019_BASE+0x0f,0xff);/*清除所有中断标志位*/outportb(RTL8019_BASE+0x0f,0x00);/*设置中断屏蔽寄存器屏蔽所有中断*//*page(1);选择页1寄存器;*/outportb(RTL8019_BASE+0x07,0x4d);/*初始化当前页寄存器,*//*指向当前正在写的页的下一页;*/outportb(RTL8019_BASE+0x08,0x00);/*设置多址寄存器MAR0-5,均设为0*/outportb(RTL8019_BASE+0x09,0x00);outportb(RTL8019_BASE+0x0a,0x00);outportb(RTL8019_BASE+0x0b,0x00);outportb(RTL8019_BASE+0x0c,0x00);outportb(RTL8019_BASE+0x0d,0x00);outportb(RTL8019_BASE+0x0e,0x00);outportb(RTL8019_BASE+0x0f,0x00);outportb(RTL8019_BASE+0x00,0x21);/*选择页0寄存器,网卡执行命令*/}设置网卡的MAC地址初始化完网卡后,需要对网卡的物理地址进行设置,才能正确的接收数据包。对于使用93c46的网卡来说,上电复位时从93c46读入的网卡地址不会自动写入到这里,而是存放在rtl8019的内存地址0x0000,0x0002,0x0004,0x0006,0x0008,0x000A,0x000C里。所以我们先要从这6个内
本文标题:27-VxWorks网络驱动程序编写实验
链接地址:https://www.777doc.com/doc-5343890 .html