VxWorks驱动程序设计与实现

  • 格式:doc
  • 大小:99.50 KB
  • 文档页数:3

中国计算机学会

第十二届计算机工程与工艺学术年会

VxWorks驱动程序设计与实现

Realization and Design of the Driver Based on VxWorks

杨 康 吴家铸 刘衡竹

Yang kang Wu Jiazhu Liu Hengzhu

(国防科技大学计算机学院 长沙 410073)

(School of Computer Science, National University of Defense Technology)

摘 要:VxWorks自身已对硬件设备提供了非常广泛的支持,但是如果系统中采用了专用硬件设备则需要专门编写驱动程序。本文详细分析VxWorks环境下驱动程序开发与设计原理。针对驱动程序实现的困难,给出VxWorks下实现驱动程序的工作流程和基本框架。

关键词:VxWorks;驱动程序;BSP;设计实现

作者简介:杨康,男,硕士研究生,研究方向为嵌入式系统;吴家铸,男,副教授,研究方向嵌入式操作系统;刘衡竹,男,教授,博士生导师,研究方向为微处理器体系结构和嵌入式与SOC芯片设计技术。

通信地址:410073 湖南长沙国防科技大学计算机学院。 1引言

设备驱动是用于控制设备的程序集合,它将通用控制操作转换为设备能够识别的特定操作,是硬件设备的软件抽象。作为I/O系统和硬件设备之间的连接层,VxWorks驱动程序就是屏蔽硬件操作,为I/O系统提供服务。实现一个完整的驱动,必须了解VxWorks中I/O系统的三个基本元素:FILE、DRIVER和DEVICE。FILE是为用户提供访问设备的统一接口;DRIVER是实现具体的基本控制函数,也就是实现I/O系统所需要的接口;而DEVICE是一个抽象的硬件设备,是一系列的结构体、变量和宏定义对实际物理设备的定义。

2设备驱动程序的设计与实现

一般而言,实现一个驱动应该有三个基本的步骤:(1)用编程语言完成对实际物理设备的抽象;(2)完成系统所需要的各类接口及自身的特殊接口;(3)将驱动集成到操作系统中。它可确保电脑部件、附加卡及系统之间的运作可靠,并能完全兼容现有的多种扩充总线。

2.1 VxWorks驱动体系结构

与Linux相似,在VxWorks系统中,设备也是以文件方式管理的,也就是说,可以通过文件操作creat()、open()、close()、read()、write()和ioctl()等函数访问设备。硬件驱动程序统一由I/O子系统管理,向应用提供统一的标准。由于设备驱动程序与硬件、操作系统关系密切。因此,在编写设备驱动之前,必须了解相关知识。图2-1给出了VxWorks驱动与系统各部分的关系。其中与编写设备驱动关系最密切的是BSP即板级支持包(board support package)。

应用程序I/O系统TCP/IP文件系统MUXVxWorks库内核BSPSCSI驱动程序LAN驱动程序SCSI驱动程序SCSI驱动程序定时器SCC与硬件无关的软件与硬件相关的软件硬件 图2-1 VxWorks驱动体系

从图2-1可以看出:控制管理系统硬件的工作由BSP完成,BSP中的驱动程序管理特定目标环境中的设备,对其进行控制和初始化。BSP在硬件和操作系统之间提供了一个标准化的接口。虽然BSP提供了设备驱动接口,通过轮询方式允许内核和硬件资源(设备控制器、CPU、内存、总线等)之间进行通讯,但是BSP不能直接访问硬件资源。正是由于这些应用程序编程接口,使得VxWorks为应用程序编程提供了一个高深的体系结构和硬件无关特性,这正是VxWorks的优势。BSP由于采用模块化设计并且提供了一致的接口,使得应用程序和VxWorks具有很好的移植性。

在VxWorks中,BSP向VxWorks提供与硬件的接口,负责加电完成时硬件的初始化、将VxWorks中与硬件有关以及与硬件无关的软件进行集成、为VxWorks访问硬件驱动程序提供支持。在VxWorks中,硬件驱动程序被分为两类,即通用驱动程序和BSP专用驱动程序。通用驱动程序管理在不同的目标环境之间移动的设备;而BSP驱动程序管理专用于在某种目标环境之间移动的设备。在开发BSP时,不仅要对BSP专用的驱动程序提供完全的支持,还需要将通用的设备驱动程序集成在一起。

2.2VxWorks系统启动加载驱动程序流程分析

除了解VxWorks驱动体系以外,还要了解VxWorks启动过程,这样才能将驱动程序与硬件设备有机的结合起来,充分发挥系统的性能优势。VxWorks启动过程按照VxWorks的image种类来区分基本上有三种:(1)由BootRom引导通过网口或串口下载到RAM。(2)将Image直接烧入ROM,运行时将Image拷入RAM中运行。(3)将Image直接烧入ROM,VxWorks在ROM中运行,仅将数据段部分拷入RAM。下面以由BootRom引导通过网口或串口下载到RAM为例,说明VxWorks启动时加载驱动程序的流程,如下所示。bootLoad()--->sysInit()--->usrInit()--->sysHwinit()--->usrKernelinit()--->KernelInit()--->usrRoot()

首先,在系统加电后执行启动代码,加载VxWorks映像,然后跳转到VxWorks映像的加载地址的首地址开始执行sysInit()。之后转到usrInit()执行,完成内核启动之前的初始化。这二个子程序都加载在映像中。最后,激活VxWorks内核,生成多任务环境,并产生一个任务来安装驱动程序以及创建设备、初始化VxWorks库、调用应用程序启动程序。用来生成这个任务的子程序是usrRoot()。到了usrRoot()后用户就可以加载应用程序了,完成了系统的启动。

在VxWorks中,通用的设备驱动程序位于usrRoot()中,而BSP专用的设备驱动程序则位于sysHwinit()中。BSP本身提供了通用驱动程序,如SCSI设备驱动程序、串口驱动、内存驱动、定时器驱动等等。在实际应用过程中,用户有必要加入自己的驱动程序。VxWorks提供的驱动程序在\Tornado\target\h\drv和\Tornado\target\src\drv目录中,用户编写的驱动程序最好不要放在这两个目录中,这是因为不同的硬件使用的驱动程序是不完全相同的。用户编写的驱动程序最好放在用户新建的目录中。VxWorks支持用GNU C编写的驱动程序。要把用户编写的驱动程序融入到VxWorks BSP中,可以利用makefile文件。它包含构建VxWorks的最基本的信息。

2.3设备驱动程序启动硬件设备的流程分析

在VxWorks中,设备驱动程序工作流程如图2-2所示。 获取硬件接口参数

启动设备 实现接口函数 设置硬件寄存器

图2-2 设备驱动程序启动硬件设备

第一步,获取硬件接口参数,包括内存映射地址、I/O端口和系统中断控制器。第二步,设置硬件寄存器,一般来说,有两种访问方式:I/O和内存映射。第三步,实现接口函数。对于采用中断方式的硬件设备,在接口函数中必须实现中断服务程序。中断程序的编写必须遵循三条规则:不能有运行时间过长的代码;不能独占共享资源以避免死锁;程序结束后尽可能快速返回。

上述步骤完成后,就基本完成了设备驱动程序对硬件的启动。

2.4设备驱动程序的基本框架

下面以PCI设备为例,简单给出设备驱动程序的基本框架。具体内容可以参阅文献[6]。

(1)定义常量和全局变量

//关于硬件设备的常量参数

#define Model_VENDOR_ID 0x109e

#define ModelDEVICE_ID 0x0350

//定义硬件信息数据类型并初始化

Typedef struct Hardware_info

{

UNIT pciBus,pciDevice,pciFune;

Char irq;

};

Hardware_info mode_info={-1,-1,-1,-1};

(2) 获取硬件接口参数

Void sysModelInint(void)

{

… …

//根据供应商和设备标识确定设备总线号

pciFindDevice(… …)

//根据设备号,在系统中查找设备

pciConfigInLong(… …)

//配置设备的PCI基地址寄存器

… …

//设置映射到系统中的设备基地址

membaseCar&=… …

//获得设备的中断请求

pciConfigInByte(… …)

//将设备映射到内存中

sysMmuMapAdd(… …)

//配置设备的PCI控制字寄存器

… … }

(3)设置硬件寄存器

void setModelReg()

{

… …

}

(4)接口函数

//中断服务程序

void sysModelIntr(… …)

{

… …

}

(5)启动设备

void startDevice(… …)

{

… …

}

3. 结论

嵌入式系统VxWorks以其占用资源少、具有可移植性好、性能稳定等特点,得到了越来越广泛的应用。本文分析了VxWorks中设备驱动程序的开发和设计原理,以及编写设备驱动程序的基本方法,给出了VxWorks下为特定设备编写驱动程序的框架,为编写设备驱动程序提供一些方法。

参考文献

[1]tornado device driver workshop wind river

[2]VxWorks 5.4 Programmer's Guide wind river

[3]《嵌入式实时操作系统vxworks及其研发环境Tornado》

孔祥营 柏桂枝 编著 2002年第一版

[4] VxWorks Programmer’s Guide 5.4

[5]PCI Local Bus Specification Production Version Revision

2.2

[6] VxWorks驱动及分布式编程 孔祥营 张保山 俞烈彬

编著 2007年第一版

[7] VxWorks下驱动程序的设计 谢伟 周忠丽 王忠仁