基于ARM9的VxWorks增强型网络驱动设计

发布时间:2010-4-7 21:46    发布者:我芯依旧
关键词: VxWorks , 驱动 , 设计 , 网络 , 增强型
VxWorks是美国风河公司(Wind River)推出的具备网络功能的实时嵌入式操作系统。VxWorks以其良好的可靠性和卓越的实时性被广泛应用于航海、军事、航窄、通信等高精尖技术及实时性要求极高的领域中。vxWorks在各种CPU平台上提供了统一的编程接口和一致的运行特性,尽可能屏蔽不同CPU之间的底层差异。所以,VxWorks可以方便地移植到不同的CPU平台上,如ARM、PowerPC、x86等。

增强犁网络驱动(Enhanced Network Driver,END)是一个使用MUX(多路复用)功能来与网络协议进行通信的数据链路层驱动。本文主要研究基于sumsang公司S3C2410A处理器的网络硬件环境下VxWorks嵌入式操作系统增强型网络驱动程序的构建和编写。

1 S3C2410A的网络硬件平台

S3C2410A微处理器是sumsang半导体公司为手持设备等相关应用设计的一款低功耗、高集成度的处理器,包含一个ARM920T芯片。S3C2419A内嵌的CS8900A作为主控芯片的以太网模块,是一款低成本的以太局域网控制器,包含片上RAM、10Base-T传输和接收滤波器,以及带24mA驱动的直接ISA总线接口,还集成了一个10Mbps的以太网收发器.以及所有用于和局域网通信的模拟及数字电路,通过一个电磁隔离器E2023直接和局域网相连。RJ45为网络接头,可连接10M/100M的网络集线器。CS8900A工作在全舣工模式下.支持包括用于流控的暂停操作的IEEE802.3MAC控制层协议。其硬件原理图如图1所示。

2 增强型网络驱动END

VxWorks支持两种模式的网络设备驱动程序,即BSD 4.3网络驱动程序和可裁剪的增强型网络设备驱动SENS。SENS(Sealable Enhanced Network Stack)是由BSD 4.3 TCP/IP网络协议栈发展而来的,并包含了许多原协议栈没有的协议。而且SENS在实现新的协议时增加了一些新特性,如在IP协议实现时增加了多播功能。为实现网络接口程序可替换,WindRiver专为SENS设计了一种增强的网络驱动程序END。SENS模型包含3个部分:协议驱动程序、多路复用接口(MUX)和增强的网络驱动(END)。在驱动程序和上层协议之间,SENS模型提供了协议驱动层。在协议驱动层和END驱动层之间,SENS模型提供了MUX层,使其直接与END驱动程序进行交互。它们之间的结构关系如图2所示。

1.gif
图1 CS8900A硬件原理图

2.gif
图2 网络协议栈结构图

在BSD 4.3模型下,VxWorks网络驱动程序与协议紧密结合,它们依赖于彼此的数据结构;而在基于MUX模型下,网络驱动程序和协议之间没有内部交换数据,它们只通过MUX间接相互作用。MUX接口的作用便是分解网络驱动程序和协议,使它们几乎独立。这种独立使得添加新的驱动程序和协议变得非常简单。

3 END网络驱动程序的装载和启动

在基于S3C2410A的VxWorks BSP设计中,configNet.h文件定义了一个END_TBL_ENTRY结构的数组endDevTbl[],该数组将网络设备驱动程序的装载函数cs8900EndLoad()入口点及相关参数添加到网络设备表endDevTbl[]中。endDevTbl[]数组描述了系统所有网络设备的装载入口点及其相关参数.其中的一个参数CS_LOAD_STRING进行资源字符串的初始化工作。资源字符串的描述和加载程序的处理有关,需要包含网卡基地址、中断向量号、中断号、偏移、配置值、MAC地址等。不同网卡的资源字符串有所不同,而且排列顺序也没有硬性的规定,只要提供的数据能满足endLoad()的需要即可。

在使用编写好的vxworks BSP引导操作系统时,系统将执行usrRoot()函数来实现以下功能:首先初始化网络任务的工作队列,然后调用tNetTask()任务来处理网络任务工作队列中的任务。tNetTask()通过调用muxDevLoad()来装载网络接口驱动,在tNetTask()中已经定义了网络驱动设备的endLoad()接入点,muxDevLoad()也要执行endLoad()。endLoad()执行设备初始化并返回一个名为END_OBJ的结构体。MUX在END_OBJ上加一个指针,指向能够将数据包向MUX上层发送的函数。然后MUX把返同的END_OBJ加入到END_OBJ结构链表中。当从muxDevLoad()返回后,网络设备就准备好可以使用了。设备装载完成后,muxDevload()调用muxDevStart()启动函数,该函数通过intConnect()和intEnable()实现中断服务的注册并打开中断宏。当有数据交换时,打开中断服务程序,调用排列网络任务处理函数netJobAdd(),指派网络系统任务tNeflask(),由tNetTask()数据接收和发送任务。其网络设备的驱动程序安装顺序如图3
所示。

3.gif
图3 END加载顺序图

在VxWorks中添加END网络驱动,需要在文件config.h中添加#define INCLUDEEE_NETWORK和#define INCLUDE_END。在configNet.h中添加END驱动的入口函数#define LOAD_FUNC_0 cs8900aLoad和一些相关的初始化字符串。这样就会在生成的BSP中包含END/MUX。

调试时,配置Tomado的目标服务器(Target Server),通过选择Tools->Target Server->Configure来启动目标服务器的配置程序.选择wbdrpc后台,选中Add description to menu,根据BSP中的配置填写IP地址。

4 END驱动程序相关函数的设计

END网络驱动程序相关处理函数的设计是网络驱动和管理的关键部分,它包括ioctl、收/发处理、中断处理函数和网络驱动程序函数。

(1) ioctl函数的编写

ioctl函数主要完成网卡的启动和停止,以及MAC地址的设置等,由文件cs8900aEnd.c中的es8900aloctl()函数实现。在函数中可以通过输入命令行参数分别对设置MAC地址请求、获取MAC地址请求、设置设备标志、获取设备标志、启动轮询操作、结束轮询操作、返网MIB信息、返同第一个最小的缓冲区和返同头的大小等进行参数设置。

(2)数据接收函数的编写

为了保证数据帧接收的实时性,在cs8900aRecv()函数中使用中断的方式处理数据帧的接收。中断中应尽可能做较少的处理,所以当网络设备产生中断时,用户中断服务程序最好包含任务级别的处理服务程序.可以通过调用netJobAdd()实现。它接收一个程序指针和多达5个附加自变量,可以将应用程序用来处理数据包的入口点设定为任务级别。然后把任务放入tNetTask队列,可以用tNetTask来处理任务级别的网路处理。只要tNetTask队列中有函数,它就会一直工作,直到队列为空,进入睡眠状态。

当有数据到达网络设备时,触发中断进入中断服务程序cs8900aEndInt。在中断服务程序里查看中断状态寄存器,如果ReceiveComplete位为高则进入cs8900aMacRxInt()。在cs8900aMacRxInt()中关闭中断.并调用BeOobAdd()将cs8900aEndHandleRcvInt()添加到tNetTask要处理的网络任务队列中。cs8900aEndHandleRevlnt()主要完成以下工作:

通过netClBtkGet()来预定一个clBlk结构;

通过netClBlkJoin()把clBlk结构链接到包含数据包的cluster;

通过netMblkGet()来预定一个mBlk结构;

通过netMblkClJoin()把mBlk连接到clBlk、cluster;

通过netClusterGel()重新预定一个cluster给收缓冲描述符供下次接收使用;

重新开启中断。

(3)数据发送函数的编写

数据帧的发送不采用中断模式,直接调用底层驱动发送函数cs8900aEndSend()。发送的步骤如下:1.用户凋用write()通过socket套接字访问网络;2.网络协议拷贝到网络缓冲区,并调用协议驱动的发送程序;3.协议驱动发送程序调用muxSend()启动发送;4.muxSend()通过调用send()回调函数,把缓冲区传递给END;5.数据发送程序cs8900aEndSend()调用netMblkToBufCopy()将数据拷贝到缓冲中,并立即发送出去。拷贝完成后,调用netMblkClChainFree()释放所有链中的mBlk缓冲并归还到内存池。

(4)修改cs8900a.h文件

由于S3C2410A芯片内部集成了MAC控制器,由芯片内部寄存器进行控制。因此不需要为网卡模块另外分配外设端口或映射寄存器地址。虽然S3C2410A芯片和物理层接口芯片在外部足两个部分,但是从开发的角度看它们是一个整体。在cs8900a.h文件中主要完成一些基本配置的设定:

#define CS_CHIP_FRAME_BUF_SIZE    (2048)
#define CS_PKTPG_DMA_NUM    (0x0024)
#define CS_INIT_DMA_NUM    (3)
#define CS_INIT_INT_NUM   (0)
#define CS_CHIP_MEM_BASE    (0x28100000)
#define CS_CHlP_IO_BASE   (0x28000000)
#define CS_CHIP_IO_0FFSET   (0x300)
#define CS_CHIP_MEM_OFFSET    (0)

(5)修改cs8900aEND.c文件

cs8900aEND.c  主要完成设备驱动程序函数的编写:
//从MIB获取硬件地址
#define END_HADDR(pEnd) ((pEnd)->mib2Tbl.ifPhysAddress.phyAddress)
#defitae END_HADDR_LEN(pEnd) ((pEnd)->mib2Tbl.ifPhysAddress.addrLength)
//配置设定
#define END_BUFSIZ  (ETHERMTU+SIZEOF_ETHERHEADER+6)
#define END_SPEED_10M    10000000    /*10Mbs*/
#define END_SPEED     END_SPEED_10M
//定义名称
#define  DRV_NAME    "cs"
......

然后添加驱动控制结构,其结构如下:

typedef struct end device
{
END_0BJ end    //继承的END_OBJ结构
int unit;     //设备单元数
int ivecBdmaTx;    //bdmaTx中断向量
int ivecBdmaRx;    //bdmaRx中断向量
......
UCHAR csAddr[6];    //以太网地址
CACHE_FUNS * cacheFuns;   //高速缓冲功能函数指针
......
}

该结构中的内容是根据网络设备和用户需要而设计的,其中END_OBJ结构必须包含。并放置在结构的第一项。

5 结束语

VxWorks下增强型网络驱动是一个链路层驱动程序,它通过MUX层函数与网络协议层进行通信,本文分析了基于samsung公司的S3C2410A处理器的VxWorks操作系统嵌入式网络硬件平台,阐述了VxWorks操作系统下增强型网络接口结构,并根据硬件的设计环境详尽描述并给出了适合该硬件系统的END型网卡驱动的编写及其在vxWorks系统中的加载,满足系统网络传输的要求。由于硬件环境不间,所以不同开发板上END的设计会在驱动的初始化、发送和接收函数的配置上有所不同,但根据相应的硬件用户手册稍加改动即可使用,对其他开发板的网络驱动开发具有一定的参考和借鉴价值。

本文作者创新点:本文阐述了vxworks操作系统下增强型网络驱动的构成原理,给出了基于S3C2410A芯片的增强型网络驱动的具体实现方法。


作者:钱华明,赵斌      来源:《微计算机信息》(嵌入式与SOC)2009年第4-2期
本文地址:https://www.eechina.com/thread-10233-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

相关在线工具

相关视频

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表