VxWorks下多串口卡驱动程序设计

2012-08-13 05:57邓春梅董贵山王亚栋
通信技术 2012年1期
关键词:驱动程序寄存器调用

邓春梅, 董贵山, 王亚栋

(①四川卫士通信息安全平台技术有限公司,四川 成都610041;②中国电子科技集团公司第三十研究所十部, 四川 成都 610041)

0 引言

在嵌入式安全平台的研制项目中,需要解决好多通路并发的串行高速数据传输及安全处理问题。如果采用8位的基于8250的通用串口芯片,难以满足大批量,多通道串口数据的同步接收和发送,为此,需要采用高速串口芯片。本文以 OXFORD 半导体有限公司生产的 OX16PCI958高速串口芯片为对象,研究了在vxworks嵌入式实时系统下高速串行通信驱动的实现技术。OX16PCI958串口芯片,是由PCI接口扩展而出的,是一个带有32字节,可扩展八路串行通道FIFO的通用异步收发器,通过配置能适应 RS-232/RS-422协议规范应用的需要,能同时支持I/0和内存映射访问,每路通道最高速率可达115.2 kb/s。标准的VxWorks操作系统缺乏对此高速串口芯片的驱动支持,本文提出了专用的多通道高速串口驱动程序设计,解决了此问题。

1 VxWorks串口驱动程序的架构

1.1 基本框架

在VxWorks系统中,串行设备的驱动程序不是直接安装在I/O系统中,而是通过虚拟设备ttyDrv来使用。串行设备不但需要支持 I/O系统也需要支持目标机代理接口,同时它还必须支持在中断或者轮询2种方式下工作[1]。

如图1所示的串行设备驱动程序的工作方式。其中,与设备无关的部分已经在虚拟设备ttyDrv中实现,驱动程序开发人员只需要根据系统给出的接口,实现驱动程序并将其安装到ttyDrv。

图1 串行设备驱动程序的工作方式

虚拟设备ttyDrv负责管理真实驱动程序与 I/O系统之间的通信[2]。一方面,虚拟设备 ttyDrv将系统的I/O请求作必要处理后,传递给设备驱动程序,再通过设备驱动程序来实现实际的 I/O操作;另一方面,虚拟设备ttyDrv将自己的入口点函数挂接在I/O系统上,初始化设备描述符并将其添加到设备列表中。当I/O系统中有请求包到达时,I/O系统会调用ttyDrv提供的相应的函数响应请求。图2的ttyDrv数据流给出了该过程的数据流向。

1.2 驱动程序函数模块注册

[3],函数ttyDrv()调用函数iosDrv Install()将tyRead()、tyWrite()、ttyOpen()、ttyIoctl()等函数加入到驱动程序表中,以供I/O系统调用。

1.3 专用串口设备的创建

首先初始化设备描述符,然后调用函数tyDevInit()初始化select功能,初始化tyLib,创建信号量,创建输出输入缓冲区,最后调用函数iosDevAdd()将设备加到设备列表中并设置设备的工作模式为中断方式。

1.4 设备读、写操作实现

当应用程序调用函数write()执行写操作的时候,数据请求包首先会通过I/O系统传给ttyDrv,然后运行函数tyWrite(),将用户缓冲区的内容复制到输出环形缓冲区,并调用函数xxTxStartUp初始化发送循环,开启中断准备发送,最后通过调用中断服务程序xxIntTx发送字符并清除中断。I/O系统发送数据操作流程如图3。

当串口接收到数据时会调用接收中断服务程序xxRcvInt,将接收的字符写入指定的缓冲区。然后由回调函数tyIRd()将数据传给高层协议。当用户调用read()函数进行读操作时, I/O系统调用函数tyRead(),将输入环形队列中的内容读入用户缓冲区。I/O系统接收数据操作流程如图4。

1.5 其他功能函数扩展

当应用程序调用函数ioctl()的时候,tty Ioctl()函数直接将命令传到由用户编写的stl6c958ioctl()函数,如果所需要的功能在stl6c958ioctl()中未实现,则调用函数tyIoctl(),如果tyIoctl()调用也失败,ttyIoctl()才会返回失败。

2 VxWorks下多通道串口驱动程序设计

2.1 基本设计需求

基本设计需求如下:①基于 OX16PCI958串口芯片;②支持多任务并发访问每路串口通道;③支持中断共享方式,能正确区分是否有效中断,提高CPU利用率;④支持端口设置,如波特率配置从50BPS---115200BPS、8位有效数据位、奇偶校验、流控;⑤支持应用程序与芯片间数据的正确交互。

2.2 设计要点

(1)多任务并发访问设计

为保障驱动程序对多任务并发通信访问的支持,在驱动程序内部采用了任务锁(TaskLock)、中断锁(IntLock)来保证对临界资源的唯一修改权,同时确保了必须的连续寄存器操作指令不被打断。在具体的程序设计中每个通道都有一个独立的数据结构ST16C958_CHAN与之对应,使每个通道间互不干扰,可并发访问。

(2)中断共享设置

中断是CPU和外部设备进行通信的有效方法,它可以避免因反复查询外部设备的状态而浪费CPU时间,从而提高了 CPU的工作效率。首先在sysSerial.c文件的sysSerSerialHwInit()函数中调用函数pciConfigInByte(),参数设为PCI_CFG_DEV_INT_LINE,从寄存器中获取中断线,然后调用函数pciIntConnect()挂接中断回调函数 ST16C958Int(),最后调用函数sysIntEnablePIC()使能共享中断。在中断回调函数中必须正确处理共享于同一中断信号线上的其它设备所产生的中断。

(3)端口设置

当用户使用 ioctl()函数访问虚拟设备 ttyDrv时, I/O系统调用ttyIoctl()函数, ttyIoctl()则接着访问函数ST16C958Ioctl(),ST16C958Ioctl ()函数中主要实现波特率的设置、查询,工作模式的设置及查询等。

(4)应用程序串口访问数据交互设计

1)初始化,首先操作系统要能够正确识别该接口芯片、建立虚拟设备节点、映射基地址及挂接中断,这就需要修改VxWorks系统config目录下与嵌入式平台的CPU相对应的文件夹中的sysSerial.c和sysSerail.h两个文件,在 sysSerialHwlnit()函数中对接口芯片进行初始化,获取基地址,设置读写及中断回调函数, 设置初始状态, 建立虚拟设备节点与驱动程序的关键数据结构ST16C958_ CHAN (如图5所示)的对应关系。芯片内的每个关键寄存器的正确设置,关系到是否能让芯片正确运转,如PCI设置寄存器,异步收发中断状态寄存器,异步收发时钟寄存器,EEPROM控制寄存器等。最后在syslib.c文件中的 sysHwInit()函数中调用 sysSerialHwInit()函数实现串口芯片的初始化,而这个过程是在Vxworks系统内核初始化之前完成的。

2)数据收发,当应用程序调用 write 函数发送数据时,IO请求包将会通过I/O系统传给ttyDrv,使tyWrite()开始运行。tyWrite开始执行后,将会把用户数据拷贝到 ttyDrv的环形缓冲区中,并调用ST16C958Startup()开始一个发送周期。每一次中断,设备都会通过中断服务程序发送一个或多个字节。ST16C958Startup()的任务包括初始化发送循环,开启中断准备发送。当硬中断回调函数ST16C958Int()发现有数据需要发送时,则调用ST16C958PTxChar ()从高层协议驱除字符并将其传送出去同时清除响应中断,如果此时高层协议不再传送数据,则重置传送中断,完成一个传送周期,等待ST16C958Startup()开启另一个传送循环。当有数据收中断产生时,ST16C958PRxChar()函数就从设备中接收数据并传送到高层协议。

typedef struct{ /* ST16C958_CHAN */

SIO_DRV_FUNCS * pDrvFuncs;/* 驱动程序所需的

函数 */

STATUS (*getTxChar) ();/* 传送函数指针 */

STATUS (*putRcvChar) ();/* 接收函数指针 */

void * getTxArg;

void * putRcvArg;

UINT16 int_vec;/* 中断向量 */

UINT16 channelMode; /* 模式中断或轮询 */

UCHAR (*inByte) (int); /* 从硬件读取一个字节

函数指针 */

void (*outByte)(int,char); /* 向硬件写入一个

字节函数指针 */

ULONG lcr; /* 在线控制寄存器 */

ULONG lst; /* 在线状态寄存器 */

ULONG mdc; /* MODEM控制寄存器*/

ULONG msr; /* MODEM状态寄存器 */

ULONG ier; /* 中断使能寄存器 */

ULONG iid; /* 中断状态寄存器*/

ULONG brdl; /* 波特率寄存器*/

ULONG brdh; /*波特率寄存器*/

ULONG data; /* 数据寄存器 */

ULONG options;

ULONG fcr; /* FIFO状态寄存器*/

ULONG spr;

} ST16C958_CHAN;

2.3 实验效果

通过测试,证明该驱动程序能够在50~115 200 b/s的速率下正确传送数据,且在多任务同时访问不同的串口虚拟通道时,每个串口通道都能够以 50~115 200 b/s的速率正确工作,且相互间互不干扰。

3 结语

本文针对基于vxworks的嵌入式安全平台缺乏对高速多通道串口芯片驱动支持的问题,提出了vxworks下基于0X16PCI958芯片的多串口的驱动程序设计,实现了八通道串口通信驱动能力,并通过任务锁、中断锁及数据结构的合理运用达到了较好的效果。进一步,通过对串口配置寄存器的设置进行优化,并通过驱动模块内部嵌入密码运算过程,可以实现稳定的数据传输,并可实现该安全平台的高速串行数据通信和加解密处理。本文的研究成果,对广泛采用vxworks系统的嵌入式安全平台的研制,有较高的实用价值。

参考文献

[1] Wind River Inc.Tornado BSP Developer's Kit for VxWorks User's Guide[EB/OL].(1999-02-11)[2011-10-01]. http://www.vxdev.com/html/42/756.htm.

[2] Wind River Inc. VxWorks BSP Reference[EB/OL].(2000-10-11)[2011-10-01].http://www-kryo.desy.d e/.../vxWorks/.../VxWorks_BSP.

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

猜你喜欢
驱动程序寄存器调用
STM32和51单片机寄存器映射原理异同分析
Lite寄存器模型的设计与实现
核电项目物项调用管理的应用研究
阻止Windows Update更新驱动程序
系统虚拟化环境下客户机系统调用信息捕获与分析①
计算机硬件设备驱动程序分析
移位寄存器及算术运算应用
利用RFC技术实现SAP系统接口通信
Lx5280模拟器移植设计及实施
妙用鼠标驱动