作者:钱华明;赵斌
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所示。
在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 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芯片的增强型网络驱动的具体实现方法。