基于VxWorks的DM9000网卡驱动

时间:2022-07-25 02:18:41

摘 要:随着嵌入式操作系统VxWorks的广泛应用,如何让VxWorks支持各种硬件平台成了急需解决的问题。首先介绍大幅面扫描仪的发展趋势以及嵌入式操作系统VxWorks的优势。然后通过分析VxWorks的SENS协议栈;VxWorks下END网络驱动程序的结构;S3C2440A 板载DM9000网卡的硬件特性和操作特点,实现基于VxWorks的DM9000 END驱动程序。最后修改相应bsp,使S3C2440A可以跨平台通信。

关键词:S3C2440A;DM9000;VxWorks;EDN;网卡驱动程序

中图分类号:TP311.11 文献标识码:B

文章编号:1004-373X(2008)06-024-03

Driver of DM9000 Base on VxWorks

CHENG Rui LEI Zhiyong WANG Hao2,LI Jing ZHAO Xiongtao1

(1.Electronic Information Engineering College,Xi′an Technological University,Xi′an,710032,China;

[JZ]2.Department of Computer Science,Xidian University,Xi′an,710071,China)

Abstract:With the extensive application of VxWorks,how to make VxWorks support various hardware platforms is an urgent problem must to be solved.Firstly this article introduces the development direction of Large Format Scanner and the superiority of VxWorks.Then,analyzes the SENS protocol in VxWorks stressed;the frame of END driver base on VxWorks;the peculiarity of hardware and the trait of operate which DM9000 network card has,then the end driver of DM9000 based on VxWorks achieved.Finally,modified the bsp,ensure the S3C2440A can communicate between different operating system.

Keywords:S3C2440A;DM9000;VxWorks;END;network card driver

1 引 言

大幅面图像输入扫描仪是目前我军和我国地理信息系统、建筑、电子、水利、石油、市政、邮电、电力、航天、航空、管道线路布置等企事业单位迫切需要的设备。基于大幅面工程扫描仪强大的需求背景,对与扫描仪配合使用体积小、实时性高的嵌入式系统的需求也是相当紧迫。针对这一需求,所在项目组设计开发了“工程扫描仪嵌入式系统”,旨在实现扫描仪设备的图像能够实时、准确的通过嵌入式开发板(RSC S3C2440A开发板)传入上位机,从而由上位机对图像进行处理。

2 软件及硬件平台简介

2.1 VxWorks操作系统简介

VxWorks操作系统是美国风河公司(Wind-River-System 公司,WRS)推出的一款高性能、可裁减的嵌入式实时操作系统。他以良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中。随着Internet和嵌入式技术的飞速发展,需要接入网络的嵌入式设备越来越多,新版本的VxWorks也增加了更多的网络功能。然而,由于嵌入式设备硬件的多样性和操作系统厂商不可能对所有设备的联网提供支持。因此,开发自己的VxWorks下运行的网络驱动程序就显得越来越重要。本文将针对自己的硬件平台(RSC S3C2440A),进行相应的网卡驱动开发。

2.2 DM9000芯片介绍

DM9000芯片是一款高度集成、低功耗的10/100 Mb/s以太网芯片,拥有一个通用的处理器接口、一个E2PROM接口、和4 k-dword SRAM缓存数据区(3 kB Tx 先进先出缓冲;13 kb Rx 先进先出缓冲)。此款芯片是为低功耗的处理器设计的,支持3.3 V供电,I/O端口最高可接入5 V电压。DM9000芯片可以根据处理器情况提供8/16/32 b三种不同的连接方式,从而支持更多型号处理器。在RSC S3C2440A开发板上采用的是16 b的连接方法与三星S3C2440型ARM芯片相连,为开发板提供嵌入式的以太网接口。

3 DM9000 END网络驱动程序的实现

3.1 SENS协议栈

VxWorks支持可裁减的增强型网络堆栈(Scalable Enhanced Networks Stack,SENS),并且提供了可替换的网络设备驱动程序――增强的网络驱动程序(Enhanced Networks Driver,END)。SENS协议栈层次如图1所示:

SENS的基本层次结构和传统的TCP/IP网络协议栈相似,但从图1中可以看SENS最大的特点是在数据链路层和网络协议层之间多了MUX层。在SENS中,网络接口的驱动程序,即END网络驱动程序处于数据链路层。IP层和TCP/UDP层合称为网络协议层。在数据链路层和网络协议层之间有应用程序接口(API),这个接口在SENS中叫做MUX(Multiplexer)接口。MUX层直接与END驱动程序相交互,其应用程序提供了独立于网络协议的驱动程序接口,可以与多个独立的END驱动程序同时交互。

从图1可以看出,接口层MUX起到了隔离网络协议和网络驱动程序的作用。并且管理协议层和数据链路层之间的通信,使数据的发送和接受过程变的简单,而不需要通过挂接钩子函数来解决。

3.2 DM9000 的编程方法

DM9000通过两个端口实现对他的基本操作。这2个地址是:数据端口(DATA port)和地址端口(ADDRESS port)。外界只能通过这2个端口和DM9000进行交互。下面简单介绍DM9000进行数据收发的过程。

3.2.1 寄存器的读写

在访问DM9000数据之前,要设置地址寄存器,将指针指向要访问的数据空间。这时再访问数据端口就会得到相应寄存器中的数据。同样,地址端口被赋值后,对数据端口的操作就会完全映到相应的片内内存空间,这样当于对DM9000片内地址空间进行1次映射。

读写过程如图2所示。

3.2.2 数据包的接收

DM9000在接收数据时采用中断方式,即当数据到来时,并通过DM9000内部CRC校验后,会产生一个接收中断。中断发生时可以将DM9000所接收到的数据包读出并且交给上层协议进行处理。

接收到的数据在存放到接收缓冲内存中的结构如图3所示。

3.2.3 数据包的发送

数据包的发送主要是依靠DM9000中的发送数据缓存区。发送数据时要求驱动函数将发送数据写入DM9000的发送数据缓冲区,当DM9000检测到处理器发来的数据发送信号后,将写入缓冲区的数据包处理成Ethernet数据包形式进行发送,在发送的过程中还可以继续接受数据包的写入,所以有2组状态寄存器和控制寄存器实现发送的控制和状态检查。

3.3 DM9000 END 驱动程序

网络设备和系统之间的数据交换实际上是数据的发送和接受问题,数据的发送和接受一般有2种方式:中断和轮询。本文采用的是中断方式。

3.3.1 END驱动程序中的基本数据结构

END_OBJ:END_OBJ中定义所有网络相关的部分,提供一个独立于设备的数据结构。在定义驱动程序控制数据结构(如:DM9000END_DEVICE)时,要包含END_OBJ结构,并且必须将其放在结构体第一位。END_OBJ中有2个重要的数据结构,DEV_OBJ和NET_FUNCS。同时还包含接受过程的回调函数指针以及与协议相关的数据,这些数据都是为MUX层提供服务的。

DEV_OBJ:DEV_OBJ包括设备名、设备描述等信息,用户驱动程序使用该结构来控制设备。其中最重要的是他包含一个指向用户顶的驱动程序控制结构的指针――pDevice。

NET_FUNCS:NET_FUNCS包含了网络驱动程序各个函数的入口点。包括:开始和停止网络设备函数、发送网络数据包函数、网络设备控制函数、在轮询模式下发送和接受函数等。

3.3.2 END驱动程序的函数实现

在END驱动程序中,需要实现设备加载、设备卸载、设备控制、发送和接收、设备启动和停止设备、轮询发送和接受等功能函数。下面给出几个重要功能函数的实现。

加载网络设备:DM9000EndLoad()是DM9000驱动程序的初始化入口点,该函数的参数由tUserRoot任务在调用muxDevLoad()传入,muxDevLoad()进而使用该参数调用DM9000EndLoad()。DM9000EndLoad()中执行几个必要操作:初始化END_OBJ结构、初始化网络缓冲内存、初始化MIB、设置网络准备好标志。其函数格式:END_OBJ * DM9000EndLoad(char*initString)。其中initString由网络设备表(endDevTbl[])中的成员提供。设备的所有特殊参数都是通过initString参数进行传递的。他包含如下特殊参数:设备寄存器基地址、中断向量、中断级、共享缓冲区地址等。

启动网络设备:DM9000Start()函数实现设备停止校验操作、注册驱动程序的中断服务程序、打开设备中断、记录设备启动和启动设备。他调用bsp的函数连接中断和驱动程序设备,使设备工作在中断模式下。其函数格式:STATUS DM9000Start(DM9000END_DEVICE *pDrvCtrl)。启动设备成功时,返回OK。函数实现如下:

STATUS DM9000Start(DM9000END_DEVICE * pDrvCtrl)

{

/*驱动程序的中断服务程序和设备中断连接*/

SYS_INT_CONNECT(pDrvCtrl,DM9000Int,(int) pDrvCtrl,&result);

if( result == ERROR)return ERROR;

/*打开中断设备*/

SYS_INT_ENABLE(pDrvCtrl);

}

发送数据包:DM9000Send()实现如下功能:获得发送器的使用权、查询发送缓冲区、启动设备发送数据、统计MIB-Ⅱ错误数和释放已经发送的数据包。函数原形如下所示:STATUS DM9000Send(DM9000END_DEVICE *pDrvCtrl,M_BLK_ID pBuf)。该函数从发送数据缓冲区M_BLK_ID中取出数据包,因此在安装驱动程序的时候必须给出这个缓冲区的地址信息。然后通过semTake()获得发送权,发送成功后,释放已发送数据包的缓冲区。函数实现如下:

STATUS DM9000Send(DM9000END_DEVICE *pDrvCtrl,M_BLK_ID pBuf)

{

/*获得发送权*/

if(!(pDrvCtrl->flags&DM9000_POLLING))

END_TX_SEM_TAKE(&pDrvCtrl->end,WAIT_FOREVER);

/*释放缓冲区*/

if(freeNow)

netMblkClChainFree(pMblk);

return (OK);

}

4 加入DM9000驱动程序

首先在config.h文件中添加:

#defineINCLUDE_END

#defineINCLUDE_DM9000_END

然后在configNet.h文件中的endDecTbl[]表添加新的装载函数。如下:

END_TBL_ENTRY endDevTbl[] = {

#ifdef INCLUDE_DM9000_END

{0,DM9000EndLoad,DM9000LaodString,DM900BuffLoan,NULL,FALSE}

#endif

};

通过以上步骤,DM9000的驱动程序已经添加到bsp中,只要进行编译,就可以生成所需要的带有DM9000驱动的VxWorks镜像文件。实现RSC S3C2440A和主机的网络通信。

5 结 语

通过分析VxWorks嵌入式实时操作系统的网络协议栈以及END网络驱动程序模型,以网络控制器DM9000为实例,重点介绍DM9000驱动程序中加载网络设备、启动网络设备和发送数据包的函数实现。由于不同网卡控制器存在内部差异,因此在网卡驱动程序开发过程中,针对不同的网卡要注意一些细节的区别。

参考文献

[1]Wind River.VxWorks Network Programmer′s Guide 5.5[D].USA:Wind River System,Inc.2002.

[2]DM9000 Datasheet[D].2002.

[3]周启平.VxWorks下设备驱动程序及BSP开发指南[M].北京:中国电力出版社,2004.

[4]周启平.VxWorks开发指南与Tornado使用手册[M].北京:中国电力出版社,2004.

[5]高超,郝燕玲,吴润.VxWorks下网卡驱动程序的开发[J].微计算机信息,2004(9):10-11.

[6]王姗姗,秦开宇,谈秀娟.VxWorks下的交互式用户界面开发\[J\].现代电子技术,2007,30(4):58-60.

作者简介 成 锐 男,1983年出生,山东泰安人,在读硕士研究生。研究方向为控制理论和控制工程。

王 浩 男,1981年出生,宁夏吴忠人,硕士研究生。主要研究方向为嵌入式操作系统。

上一篇:基于ARM的汽车防盗报警系统设计 下一篇:基于RS 485的大气数据前端传输系统设计与实现