基于WinDriver的多路串行设备驱动开发
扫描二维码
随时随地手机看文章
摘要:工业控制计算机中广泛使用串行接口UART与外围设备进行通信,同时,Windows操作系统以其友好的UI界面被广泛采用。文中阐述了UART设备的工作原理,并利用Jungo公司的WinDriver软件实现了Windows操作系统下一种PCI转多路UART设备的驱动开发。
0 引言
XR17D158是在工业控制计算机中被广泛使用的一种PCI转8路UART接口芯片。本文首先介绍Window操作系统驱动程序和开发工具Win Driv er软件,并通过该软件完成XR17D158在Windows系统下驱动程序的开发。并以此为基础,提出了一种利用WinDrive工具开发PCI总线设备驱动程序的软件架构。
1 Windows操作系统驱动开发
Windows操作系统以其友好的用户图形界面和强大的功能在工业控制计算机领域广泛使用。但是Windows对系统底层操作进行了屏蔽,限制应用程序直接访问硬件资源,应用程序需要调用设备的驱动程序访问硬件资源,而开发Windows环境下的驱动程序,需要对操作系统内核的运行机制有深入的了解。
美国Jungo公司的WinDriver驱动程序工具包使程序设计人员不需要掌握Windows操作系统内核的相关内容,只需要调用WinDriver提供的接口函数就可以直接访问系统硬件资源,减轻了设计人员的开发难度。WinDriver同时支持PCI/CardBus/ISA/ISAPnP/EISA/CompactPCI和USB等多种总线结构。
WinDriver驱动程序的体系结构如图1所示。
利用WinDriver开发驱动,可以使用内核插入模式和用户模式。内核插入模式效率高,但编写复杂,需要编写者对操作系统内核和微软提供的DDK(Device Driver Kits)都有深入的了解。用户模式下,开发人员通过WinDriver Wizard图形化界面的引导:首先,生成所要开发设备的.inf文件,其次,生成设备驱动程序源代码模板。该模板由三部分组成:1)WinDriver提供给用户的设备访问库函数WDC Lib;2)Win Driv er所产生的设备操作例程,用以检查设备的硬件功能是否正常;3)用户开发环境,包括:Visual Studio、Delphi等。
2 XR17D158工作原理
2.1 XR17D158简介
XR17D158是EXAR公司生产的一款PCI总线UART芯片,符合PCI2,3规范。XR17D158拥有8路独立的UART接口,每路UART接口兼容16C550的配置寄存器和64字节的发送/接收FIFO。XR17D158每路UART接口的数据传输速率可进行设置,最高速率可达921.6kbps。
XR17D158内部的寄存器用来实现PCI设备的配置、芯片自身的状态监控和串行数据的接收和发送。X86体系结构下,系统上电后,BIOS将读取XR17D158的PCI信息,根据系统的硬件架构为XR17D158分配存储地址、端口地址和中断号等信息。并将信息写入PCI配置寄存器中,例如系统会将XR17D158的UART配置寄存器基地址写入BAR0(10H)中。
2.2 XR17D158芯片配置
2.2.1 波特率设置
XR17D158的8路UART接口可以配置不同的波特率,波特率计算公式为:
式(1)中,MCR[7]代表域分频系数,分频系数由每路UART接口的DLM和DLL寄存器控制,对一路UART接口的波特率配置步骤如下:
(1)LCR[7]置1,使能DLM、DLL寄存器;
(2)EFR[4]置1,使能MCR[7:5];
(3)设置MCR[7],MCR[7]=0,预分频系数为1,MCR[7]=1,预分频系数为4;
(4)设定分频系数,根据所要设定的波特率,利用式(1)计算分频系数,并将分频系数写入DLM、DLL寄存器中;
(5)EFR[4]清0,锁存MCR[7]。
2.2.2 UART接口数据接收
UART接口的数据接收部分由接收移位寄存器(RSR)和接收保持寄存器(RHR)组成,RSR检测接收到的每一位数据的有效性,当检测到停止位时,表明一个字符接收完毕,RSR将数据装入RHR中。数据准备好中断(ISR[2]=1)会在数据装入RHR,或者在接收FIFO使能并且接收数据达到设定的FIFO触发条件时产生。处理器可以利用查询方式和中断方式读取XR17D158接收FIFO的数据。两种方式实现的步骤为:
(1)查询方式:1)设置UART通道的波特率;2)中断使能寄存器[IER]清0,禁止所有中断;3)读取线路状态寄存器(LSR);4)如果LSR[0]=0,表示RHR或者接收FIFO中没有数据,等待一定时间后,重复第3)步;5)如果LSR[0]=1,表示RHR或者接收FIFO中已经保存有接收到的数据,此时读取RHR中的数据,并重复第3)步。
(2)中断方式:1)设置UART通道的波特率;2)IER[0]置1,使能RHR中断;3)当PCI总线上产生中断时,读取INT0寄存器,确定产生中断的通道号;4)读取INT1、INT2、INT3寄存器,确定产生中断的UART接口序号和中断源;5)读取RHR中的数据。
2.2.3 UART通道数据发送
发送数据过程,有效数据由主机写入UART接口中的发送FIFO寄存器,当发送保持寄存器(THR)清空标志位ISR[1]=1,表示发送FIFO中的数据减少到满足设定的触发中断条件而引起中断,在输出移位寄存器(TSR)中,由发送控制逻辑在待发送数据加上起始位、奇偶校验位和终止位,并按设定的时钟频率逐位移出数据。
3 开发实例
使用WinDriver用户模式开发的驱动程序,实则是为上层的应用程序提供一组访问设备的接口函数,实现应用程序对设备的初始化、读操作、写操作和设置等。
XR17D158的驱动程包含:UART接口打开函数XR17D158_Open()、UART接口读函数XR17D158_Read()、UART写函数XR17D158 Write()和UART接口关闭函数XR17D158 Close()。为了提高驱动效率,可以在内存中分别开辟一个接收缓冲区和一个发送缓冲区,XR17D158 Read()和XR17 D158 Write()不直接访问硬件设备,而是通过对内存缓沖区的读写,实现对XR17D158的读操作和写操作。本文提出的驱动程序架构如图2所示。
图2中,XR17D158 Open()中注册的中断服务程序XR17D158 Handle()完成XR17158的数据接收与发送;XR17D158 Read()和XR17D158 Write()为应用层提供读/写接口,通过内存缓沖区接收XR17D158_Handle()的数据或向XR17D158_Handle()发送数据。
XR17D158_Open()使用WDC_PciReadCfg()和WDC_PciWriteCfg()实现对XR17D158PCI配置空间的访问,使用WDC_ReadAddr8()和WDC_Write Addr80实现对XR17D158中设备配置寄存器和UART配置寄存器的操作,如UART接口波特率的配置:
UAR了接口数据的读取可以使用查询方式或者接口方式,但是查询方式要求处理器周期地对XR17D158的状态进行检测,处理器的效率较低。因此本文使用中断的方式完成UART接口数据的接收和发送。中断服务程序XR17D158 Handle()的工作过程过程如下:
XR17D158_Handle()实现UART接口和内存缓冲区之间的数据交换,从内存缓冲区中读取XR17D158_Write()写入的数据实现数据的发送,向内存缓冲区中写入UART接口接收的数据,再由XR17D158_Read()读取实现数据的接收。在XR17D158_Open()使用WDC_XR17D158_IntEnable()注册XR17D158_Handle()。
4 结果验证
使用外部设备向XR17D158子卡发送RS232数据,发送数据波特率为9600 bps,发送周期为1 Hz,通过示波器观察XR17D158的接收数据波形。
图3(a)为XR17D158接收到RS232数据的波形,图3(b)为XR17D158所产生的中断信号波形,中断信号为低电平时,驱动程序处理XR17D158所接收到的数据。试验中,RS232数据为周期发送,每帧数据为90字节,图3中可以看出驱动程序处理每帧数据的时间约为0.1ms,如果8路UART接口同时接收数据,且波特率为921.6kbps,此时驱动程序处理数据的时间约为100ms,不会出现丢数现象。
5 结束语
文中简单地介绍了WinDriver软件工具的特点和驱动产生的过程,并针对一种PCI转UART设备XR17D158,提出了使用WinDriver开发PCI设备驱动的软件架构。此时Windows驱动设备的开发更像是Windows应用程序的开发,仅在一个驱动函数中使用WinDriVer提供的接口函数,而无需触及Windows内核。此外该驱动架构不仅适用于XR17D158设备,还可应用于其它PCⅡ设备,如PCI9056等。