基于WinDriver的PCI总线设备驱动开发
件而引起中断,在输出移位寄存器(TSR)中,由发送控制逻辑在待发送数据加上起始位、奇偶校验位和终止位,并按设定的时钟频率逐位移出数据。
3 开发实例
使用WinDriver用户模式开发的驱动程序,实则是为上层的应用程序提供一组访问设备的接口函数,实现应用程序对设备的初始化、读操作、写操作和设置等。
XR17D158的驱动程包含:UART接口打开函数XR17D158_Open()、UART接口读函数XR17D158_Read()、UART写函数XR17D158 Write()和UART接口关闭函数XR17D158 Close()。为了提高驱动效率,可以在内存中分别开辟一个接收缓冲区和一个发送缓冲区,XR17D158 Read()和XR17 D158 Write()不直接访问硬件设备,而是通过对内存缓沖区的读写,实现对XR17D158的读操作和写操作。本文提出的驱动程序架构如图2所示。
![](../img/eep/emb/emb-47367sza4fr1iwbj.jpg)
图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接口波特率的配置:
![](../img/eep/emb/emb-47368rywjgwq1eio.jpg)
UAR了接口数据的读取可以使用查询方式或者接口方式,但是查询方式要求处理器周期地对XR17D158的状态进行检测,处理器的效率较低。因此本文使用中断的方式完成UART接口数据的接收和发送。中断服务程序XR17D158 Handle()的工作过程过程如下:
![](../img/eep/emb/emb-47369zqe4lkdzudg.jpg)
![](../img/eep/emb/emb-4737050rc5th4vba.jpg)
XR17D158_Handle()实现UART接口和内存缓冲区之间的数据交换,从内存缓冲区中读取XR17D158_Write()写入的数据实现数据的发送,向内存缓冲区中写入UART接口接收的数据,再由XR17D158_Read()读取实现数据的接收。在XR17D158_Open()使用WDC_XR17D158_IntEnable()注册XR17D158_Handle()。
4 结果验证
使用外部设备向XR17D158子卡发送RS232数据,发送数据波特率为9600 bps,发送周期为1 Hz,通过示波器观察XR17D158的接收数据波形。
![](../img/eep/emb/emb-47371tdebe15erbs.jpg)
图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等。
WinDriver PCI总线 XR17D158 相关文章:
- 基于WinDriver的多路串行设备驱动开发(10-22)
- 风河全新Hypervisor助虚拟化开发更上层楼(09-12)
- 利用WinDriver实现链式DMA(07-13)
- 利用WinDriver开发PCI设备驱动程序(02-27)
- 用双端口RAM实现与PCI总线接口的数据通讯(05-06)
- 基于PCI总线和DSP芯片的图像处理平台的硬件设计(07-06)