VxWorks下字符设备的驱动开发 下载本文

内容发布更新时间 : 2024/11/17 2:51:57星期一 下面是文章的全部内容请认真阅读。

龙源期刊网 http://www.qikan.com.cn

VxWorks下字符设备的驱动开发

作者:郭德磊

来源:《电脑知识与技术》2011年第01期

摘要:随着VxWorks操作系统在嵌入式系统中的应用,VxWorks下产品的开发和应用也越来越广泛。开发嵌入式设备经常遇到的一个问题就是如何编写高效可靠的设备驱动程序。该文对VxWorks下设备驱动程序开发的几个主要方面以及如何配置 PCI总线设备等进行了详细介绍,为相关的开发人员提供了很好的参考。

关键词:VxWorks;字符设备;驱动开发;PCI设备;select功能

中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)01-0121-02 VxWorks Device Driver Development Under the Character GUO De-lei

(China Flight Test Establishment, Xi'an 710089, China)

Abstract: With the VxWorks operating system in embedded system, VxWorks under the product development and applications are increasingly widespread. Development of embedded devices is a problem often encountered in how to write efficient and reliable device drivers. In this paper,

VxWorks device driver development under the main aspects and how to configure the PCI bus devices are described in detail for the relevant developers a good reference.

Key words: VxWorks; character device; driver development; PCI device; select function VxWorks是一个基于抢占式的实时操作系统,它以其高度的可靠性、优秀的实时性、灵活的可裁性广泛应用到越来越多的嵌入式装置中。在这些嵌入式装置中,往往有一些自研的板卡设备,要使这些板卡支持VxWorks操作系统,就必须开发相应的设备驱动程序,而这些板卡设备绝大多数又都属于字符设备类。因此,本文针对这种情况,详细讨论了在VxWorks操作系统下字符设备的驱动程序开发问题。 1 相关概念

为了让读者对驱动程序开发有一个全面的了解,首先介绍一下设备驱动程序的相关概念。 设备驱动程序是指直接控制设备操作的那部分程序。通俗地说,就是对设备的I/O端口地址进行读写操作的那类程序。

龙源期刊网 http://www.qikan.com.cn

设备驱动程序按设备类型的不同可划分为字符设备、块设备和网络设备3大类,这其中的字符设备是指能够像字节流一样被访问的设备,你可以简单地把它当成一个文件来访问,绝大多数板卡设备都属于字符设备。

设备驱动程序通常应具有6个主要功能:设备初始化、打开设备、关闭设备、读设备、写设备以及对设备进行控制。 2 调用方式

设备驱动程序本身不能主动执行,它只能被操作系统或用户程序调用。嵌入式系统调用设备驱动程序的方式有3种:即应用程序直接调用、应用程序通过操作系统内核调用以及应用程序通过操作系统的扩展模块来调用。这里,我们以最符合开发规范的第2种方式来讲解,因为据此开发的应用程序具有良好的可移植性。

在这种方式下,应用程序访问板卡设备是通过VxWorks的I/O子系统进行的。I/O子系统提供了一套标准的与设备无关的I/O接口函数,对于字符设备来说,一共有7个函数:creat(),remove(),open(),close(),read(),write(),ioctl()。它们之间的关系见图1。 3 应用程序和设备驱动程序之间的联系

VxWorks的I/O子系统还提供了3张表:设备列表、文件描述符表和设备驱动程序描述表,正是通过它们实现了应用程序和设备驱动程序之间的联系。

设备列表是一个大小可变的动态双向链表,每添加一个新设备时,链表就增加一个环节。例如:添加两个相同的设备,虽然这两个设备的驱动程序相同,但链表仍旧会增加个两环节而不是一个。设备列表中的每一个节点被称为设备描述符,它的结构组成如下: Typedef struct xxDEV {

DEV_HDR devHdr;// 设备头 BOOL ReadyToRead;// 设备读就绪 BOOL ReadyToWrite;// 设备写就绪 …

SEL_WAKEUP_LIST selwakeuplist;//select功能 }xxDEV;

龙源期刊网 http://www.qikan.com.cn

此结构中的设备头部分是必需的,斜体部分是用户根据需要自己添加的。设备头结构的原型如下:

Typedef struct DEV_HDR {

DL_NODE node;// 设备列表的连接节点 short drvNum;// 设备的驱动程序索引号 char * name;// 设备名称 }DEV_HDR;

设备驱动程序描述表用于存储驱动程序的各个函数的入口地址,其结构如图2所示。 ■

图2 设备驱动程序描述表

通过图2可知,并非所有的I/O接口函数都要实现,甚至有些接口函数的实现是完全相同的。

文件描述符表的作用是将板卡设备与设备驱动程序关联起来。其结构如图3所示。 图3 文件描述符表

其中文件描述符就是xxDevCreat()或xxOpen()的返回值。 驱动程序索引号就是驱动程序安装函数iosDrvInstall()的返回值。

字符设备的设备驱动程序通常由下面几部分组成:设备驱动程序的注册函数(xxDrv)、设备创建函数(xxDevCreat)、设备卸载函数(xxDevRemove)、设备打开和关闭函数(xxOpen、xxClose)、设备读/写函数(xxRead、xxWrite)、设备控制函数(xxIoctl)和设备的中断服务函数(xxIntHdlr)。

在使用上述驱动函数之前,应先在设备驱动程序注册函数中的通过iosDrvInstall()函数将它们挂接到系统中,iosDrvInstall()函数会将驱动程序的各个函数的入口地址填入到设备驱动程序描述表中;再由设备创建函数中的iosDevAdd()函数将设备加入到设备列表中。 之后,当应用程序象下面这样打开一个设备时: