基于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中的数据减少到满足设定的触发中断条件而引起中断,在输出移位寄存
- 风河全新Hypervisor助虚拟化开发更上层楼(09-12)
- 基于WinDriver的PCI总线设备驱动开发(08-04)
- 利用WinDriver实现链式DMA(07-13)
- 利用WinDriver开发PCI设备驱动程序(02-27)
- VxWorks实时操作系统下MPC8260ATM驱动的实现(11-11)
- Linux内核解读入门(11-09)