),该软件包为驱动程序开发者提供了用于驱动程序开发的资源文件、编译连接程序、开发技术文档等。还有第三方提供的开发工具:NuMega公司的DriverStudio和Jungo公司的WinDriver,这些工具是在DDK的基础上为方便开发用户而进行开发的工具。在使用中,虽然利用DDK开发驱动程序难度较大,但是代码非常简洁,结构清晰,效率也高。利用第三方开发工具使用简单,开发速度较快,但对于驱动程序的理解和深入开发不如DDK。因此选择DDK开发PCI设备驱动程序,虽然开始会觉得非常复杂,但从执行效率和功能上会更有利。
5.2.2 PXI/PCI设备驱动程序的特点 在开发驱动程序之前对PCI总线和硬件设备进行了解是十分必要的,而且还要详细地掌握PCI设备的特性以及PCI设备驱动程序在设备程序栈的关系等,以便进行WDM驱动程序的设计。
PCI总线是一种高性能、与CPU无关的32/64位地址数据复用的总线,它支持突发传输、即插即用、电源管理等功能,不但能满足现在的应用需要,而且能够适应未来的需求。PCI总线支持硬件资源动态自动配置,以支持即插即用。在PCI设备插入PCI插槽或上电后,PCI总线配置机构自动根据PCI设备的要求实现配置。PCI总线支持内存读写、I/O端口读写、中断机制和DMA功能。由于这些硬件特点使PCI设备的WDM驱动程序的设计变得很复杂。在开发WDM驱动程序之前,还有必须掌握PCI设备的需要分配的资源等配置信息以及PCI设备的功能和操作方法。
图5-2 通用PCI总线的WDM驱动程序栈
在WDM中,采用了分层的驱动程序体系结构,总线驱动程序或类驱动程序在最底层直接与设备打交道,设备功能驱动程序在上层通过与低层驱动程序打交道,实现设备的功能,中间还可以有类过滤驱动程序或设备过滤驱动程序用于数据的过滤或转换。在PCI总线的驱动程序层中,其层次图如图5-2:
在实际开发中,一般无需分很多层次,只需要开发一个设备驱动程序即可。设备驱动程序直接与PCI总线驱动程序打交道,进行硬件操作,以实现PCI设备的功能。
5.2.3 WDM驱动程序的设计 在PCI设备的WDM驱动程序中,一般是编写功能驱动程序。PCI总线驱动程序由操作系统实现,过滤驱动程序一般在特殊的情况下需要编写。因此本文只讨论PCI设备功能驱动程序的设计。在PCI设备功能驱动程序中,需要处理PCI设备的内存、端口的读写、中断处理和DMA数据传输,实现PCI设备的功能,因此,PCI设备功能驱动程序是很标准的WDM设备驱动程序。
PCI设备驱动程序在框架上与其他类型的设备驱动程序基本相同,包括初始化、创建设备、卸载和删除设备、即插即用处理、分发例程处理、电源管理、WMI等部分,限于篇幅,在此只讨论PCI设备的特别之处。
(1)PCI设备资源的获得[36]
PCI设备的硬件资源是由PCI配置机构动态分配的,由PCI设备实现PCI配置寄存器,提出需要分配的硬件资源,由PCI配置机构分配资源。驱动程序需要取得这些资源,才能操作硬件。因此,PCI设备的硬件资源分配与管理是驱动程序中很重要的部分。硬件资源主要包括映射内存空间、I/O空间、中断。在WDM体系中,取得这些资源有四种方法:读写PCI配置寄存器、调用硬件抽象层(HAL)函数、向PCI总线驱动程序发送读写配置IRP和向PCI总线驱动程序传递开启设备IRP。第一种方法通过读写PCI总线配置I/O寄存器,来取得PCI设备的配置信息,其中包括资源的分配。这种方法需要将几乎所有的PCI设备枚举一遍,考虑到这种方法是对公共寄存器的读写,不利于系统的安全性,最好不使用这种方法,但是在调试PCI设备硬件时是个很好的方法。第二种方法通过调用函数HalGetBusData和HalGetBusDataByOffset来实现的,但是这种方法是为了能够与Windows NT的驱动程序兼容,而保留下来的方法,不推荐使用,其功能被第三种方法取代。在WDM体系中,总线驱动程序必须实现总线上设备的管理功能。PCI总线驱动程序实现了对PCI设备资源的枚举,设备驱动程序通过向PCI总线驱动程序传递设备配置IRP_MJ_PNP,经总线驱动程序的处理后,设备驱动程序得到PCI设备的资源信息。第四种方法是推荐的方法,当系统的P << 上一页 [11] [12] [13] [14] [15] [16] [17] 下一页 |