VxWorks下多串口卡驱动程序设计初探
摘 要 本文以OX16PCI958串口芯片的多串口卡驱动为例,研究和分析了VxWork串口驱动的工作原理,并在此基础上对SCC驱动和tty驱动工作原理进行简单阐述,同时介绍了PPC体系结构微处理器的串口驱动程序设计的方法和步骤,以期为VxWorks下多串口卡驱动程序设计提供有价值的参考。
关键词 VxWorks;多串口驱动程序设计
中图分类号:TP368 文献标识码:A 文章编号:1671-7597(2013)13-0156-01
嵌入式安全平台研制项目中,尤其应重视对多通路并发串行数据的传送和安全问题的处理。从当前市场发展状况看,传统的通用串口芯片在数据的接受和传送上已很难满足大数据传送的要求,所以,应考虑使用传送速度更高的串口芯片。同时针对标准的VxWorks驱动程序不能满足高速串口芯片的运行要求,本文重点对多通道高速串口驱动程序的设计进行简单的介绍。
1 VxWorks程序架构介绍
1.1 基本框架
VxWorks系统中I/O系统并不包含串行设备的驱动程序,其功能的实现主要凭借ttyDrv。串行设备的正常使用,一方面应保证其能够支持目标代理接口和I/O系统,另一方面其应在轮训两种方式或中断方式下正常工作。
对串行设备驱动程序而言,一般与设备无关的部分在虚拟设备ttyDrv实现,而主要程序需要程序员进行编写,然后利用系统提供的接口将其安装到ttyDrv中。虚拟设备ttyDrv重点负责I/O系统和驱动程序间的信息通讯。当系统中有对I/O操作的请求时,虚拟设备ttyDrv首先对请求进行处理,同时将请求涉及的命令交给设备驱动程序,在该驱动程序的操控下,实现对I/O系统的实际操作,同时在ttyDrv操作控制下将入口函数挂接在I/O系统中,然后对设备的相关描述进行初始化操作,处理完毕后系统会自动将其添加到设备列表中。一旦I/O系统发现有请求的命令时,就会触发挂接在I/O系统入口函数,从而响应有关请求。虚拟设备ttyDrv挂接函数时首先会利用ttyDrv()函数调用iosDrvinstall()函数,然后将ttyIoctl()、ttyOpen()、tyWtite()、tyRead()等一些函数挂接在驱动程序中供响应请求用。
1.2 创建专用串口设备
专用串口设备创建时系统会进行初始化处理。首先,初始化设备的描述符,并通过函数tyDevInit()初始化tyLib以及select的功能。其次,创建信号量以及用于输入、输出的缓冲区。最后,通过调用iosDevAdd()函数完成两项工作:1)将设备添加到设备的列表中;2)设置设备的工作模式为中断。
1.3 设备的读、写操作
应用程序为了响应读写操作会首先调用write()函数,接着I/O系统将数据请求传递ttyDrv执行函数tyWtite(),并通过复制的方式将存在于用户缓冲区的内容加载到环形缓冲区中,并初始化处理发送的循环,这里调用的函数是xxTxStartUp,将原来设置为中断的工作模式打开为发送工作做好准备,系统通过调用xxIntTx中断服务程序完成字符的发送工作,最后将中断清除。
当串口发现相关数据后,会立刻调用xxRcvInt中断服务程序在制定的缓冲区位置进行写操作,与此同时还需要将数据传送给高层协议,该传送过程需要使用tyIRd()进行操作。用户利用函数read()进行读操作的同时,I/O系统会使用函数tyRead(),将环形队列的内容读入到用户缓冲区中。
2 VxWorks下多通道串口驱动程序设计
2.1 基本设计要求
多通道串口驱动程序设计时应满足以下几点要求:首先,设计工作的开展应以OX16PCI958串口芯片为基础,同时还应保证每路串口通道满足多任务并发访问的要求,并且能够对中断是否有效进行准确的判断,以此进一步提高CPU的利用率。其次,在实现端口设置的同时,能够保证芯片和应用程序之间进行正确的通讯。
2.2 设计应注意的问题
2.2.1 多任务并发设计
为了满足驱动程序能够正确处理并发需求的要求,驱动程序内部采用中断所和任务锁界定对临界资源的修改权限,并保证了连续寄存器操作指令能够不断被打断。驱动程序实际的设计时每个通道会对应一个独立的ST16C_CHAN,从而当访问某个通道时不会对其他通道造成影响,以此实现并发访问。
2.2.2 中断共享设置
为了提高CPU的工作效率,外部设备与CPU之间的通讯机制为中断,以此防止频繁查看外部设备,增加CPU的运算时间。中断运行的原理是:系统会利用存在于sysSerial.c文件中的函数sysSerSerialHwInit()实现对pciConfigInByte()函数的调用,同时将参数设置为PCI_CFG_DEV_INT_LINE,并从寄存器中获得中断线,并使用pciIntConnect()函数将函数ST16C958Int()进行挂接,最后为了对中断进行共享还需要调用sysIntEnablePIC()函数。另外,在处理中断时还应注意其他共享同一信号设备的中断。
2.2.3 端口设置
用户访问虚拟设备ttyDrv时会首先调用ioctl()函数,与此同时I/O系统也会调用ttyIoctl()函数,该函数会访问ST16C958Ioctl()函数然后实现查询、设置工作模式、设置波特率等功能。另外,驱动程序设计时还应注重把握应用程序和串口访问数据之间的交互设计。
3 总结
在VxWorks下以OX16PCI958芯片为基础进行多串口驱动程序设计,综合数据结构等方面的知识,实现了多通道串口通信驱动的要求,同时对今后VxWorks下多串口卡驱动程序的设计具有较高的借鉴价值。
参考文献
[1]欧峰,吴成富,段晓军,陈怀民.基于VxWorks的多串口卡驱动程序设计[J].测控技术,2008(10).
[2]李洪,吴宁.基于VxWorks的虚拟机串口通信的实现[J].信息系统工程,2009(05).