PCI总线电机控制卡的WDM设备驱动程序设计
结合基于PCI总线的精密电机运动控制卡,介绍了PCI设备的WDM设备驱动程序的设计过程,PCI设备的获得,I/O端口的读写,内存的读写以及中断的处理,和设备驱动程序的安装。
1 引言
微型计算机界以INTEL公司为主推出了PCI总线规范。采用PCI总线设备所具有的配置空间以及PCI总线通过桥接电路与CPU相连的技术使PCI总线具有广泛的适应性,并且PCI总线采用宽字节和高达33Mb的时钟频率的猝发和主控方式传输能满足高速设备的要求。
在WINDOWS操作系统下,开发PCI设备的驱动程序最好的方案是WDM驱动程序。在一个系统中开发出WDM驱动程序,稍加修改即可在其他系统中编译运行。
2 WINDOWS驱动程序模型WDM
WDM(WINDOWS Driver Program Model)是一个模块化的、分层次类型的微型驱动程序结构,它是编写设备驱动程序的主要模型。设备驱动程序是提供连接到计算机的硬件的软件接口,它是操作系统的一部分,用户应用程序以一种规范的方式访问硬件,而不必考虑必须如何控制硬件。在WINDOWS中,驱动程序总是使设备看起来像是一个文件,可以打开设备的一个句柄,然后应用程序可以在设备句柄最后关闭之前向驱动程序发出读写请求。WDM是在Windows NT驱动程序体系的基础上发展而来的,修改或增加了即插即用、电源管理等功能,使之适应硬件和用户的要求。
PCI总线是一种高性能、与CPU无关的32/64位地址数据复用的总线,它支持突发传输、即插即用、电源管理等功能,不但能满足现在的应用需要,而且能够适应未来的需求。PCI总线支持硬件资源动态自动配置,以支持即插即用。在PCI设备插入PCI插槽或上电后,PCI总线配置机构自动根据PCI设备的要求实现配置。PCI总线支持内存读写、I/O端口读写、中断机制和DMA功能。由于这些硬件特点使PCI设备的WDM驱动程序的设计变得很复杂。在开发WDM驱动程序之前,还有必须掌握PCI设备的需要分配的资源等配置信息以及PCI设备的功能和操作方法。
在WDM中,采用了分层的驱动程序体系结构,总线驱动程序或类驱动程序在最底层直接与设备打交道,设备功能驱动程序在上层通过与低层驱动程序打交道,实现设备的功能,中间还可以有类过滤驱动程序或设备过滤驱动程序用于数据的过滤或转换。在PCI总线的驱动程序层中,其层次图如图1所示:
3 PCI设备资源的获得及内存、I/O读写
PCI设备的硬件资源是由PCI配置机构动态分配的,由PCI设备实现PCI配置寄存器,提出需要分配的硬件资源,由PCI配置机构分配资源。驱动程序需要取得这些资源,才能操作硬件。因此,PCI设备的硬件资源分配与管理是驱动程序中很重要的部分。硬件资源主要包括映射内存空间、I/O空间、中断。当系统的PNP管理器在取得设备的资源后会自动向驱动程序发出IRP_MN_START_DEVICE的IRP,在该IRP栈中包含了设备的资源信息。好的驱动程序都应该使用这种方法,每个支持PNP功能的驱动程序,都应实现IRP_MN_START_DEVICE处理。在该IRP处理中应先交给低层驱动程序处理后,再根据IRP栈内内容进行资源分配。
在PCI设备的驱动程序中,获得的设备内存是一段映射物理内存,这是无法使用的,需要将其映射成系统可以访问的非分页内存。函数MmMapIoSpace完成该功能。该函数的原型为:
4 中断的处理
在PCI总线中,很多设备共享一个中断,这就需要在中断处理函数要格外小心,处理不当,就会导致系统崩溃。驱动程序首先要在IRPMNSTARTDEVICE中获得中断资源,然后需要连接到中断处理函数中,使其当有中断请求时,进入中断服务例程。连接中断的函数为IoConnectInterrupt,具体用法见上段程序中的“中断资源”部分。十分需要注意的是在连接中断之前,一定要确定PCI设备不会产生中断请求,最好在PCI设备上电后,中断为屏蔽状态。在连接中断后,调用开启中断请求的函数需要同步处理,以防在函数的执行中,出现运行时间上的错误,而且在开启中断时,一定要在所有的硬件资源分配以后,否则如果有中断产生,系统就会立即调用中断处理例程,如果例程中使用了还没有分配的资源,就会出现意想不到的结果。
在中断服务例程中,相应的处理最好简洁快速,因为中断例程运行的级别很高,当有中断请求时,不但会打断应用程序的执行,而且会打断在硬件中断级以下的所有运行程序。在WDM中,提供了DPC(Deferred Procedure Call)例程,将在中断例程中耗时的但不需要立即处理的任务延时处理。比如,驱动程序接受应用程序的写PCI设备的数据,当写完后,硬件产生中断标志执行完毕,这时需要结束该IRP,就可以将结束IRP这个耗时的任务交给DPC完成。
在该实例中,由应用程序调用函数WriteFile,将数据传递给驱动程序,驱动程序的DispatchWrite例程负责处理该IRP,在该例程中,由于需要中断的配合,假定无法立即执行完毕,必须将IRP串行化,StartIo例程如果没有其他任务,就开始处理该IRP,处理完毕后立即返回,但不能结束IRP,当PCI设备完成操作后,就会产生中断,在中断服务例程中把IRP交给DPC,在DPC中处理完后结束该IRP。
5 驱动程序的安装与应用
Windows98和Windows2000是依靠INF文件来得到硬件设备驱动程序的安装信息的一个设备信息文件(INF)。只要将文件中双引号中的提示改为相应的内容即可生成我们自己的设备信息文件。
[Strings]
ProviderName=“your company name here”//公司名称
MfgName=“Name of HW manufacturer here”//硬件制造商名称
DeviceDesc=“Description of device here”//设备描述
DeviceClassName=“Description of device class here”//设备类的描述
当系统加电时,WINDOWS操作系统会自动检测所有外设,当第一次检测到我们的设备时系统会提示用户指定新硬件的驱动程序。根据提示指定了我们修改过的INF文件,以及编译后生成的.sys系统文件系统就自动安装好了新硬件的驱动程序。或者可以用控制面板中的添加新硬件来搜索新硬件。
驱动程序安装好以后,在应用程序中就可以像打开其他驱动程序(如虚拟设备驱动程序VxD)一样用CreateFile打开设备。
6 基于PCI总线的电机运动控制卡
图2为该系统硬件组成框图,该控制卡采用PCI总线实现主计算机与控制卡之间的信息传递。控制卡上有2个伺服控制专用芯片LM628,分别用于控制伺服电机;来自2个伺服电机的增量式码盘输入信号(A相、B相和Z脉冲),经电平变换后分别送入LM628经四倍频和计数后作为反馈信号,由LM628根据主计算机给定的位置、速度、加速度生成梯形轨迹速度曲线作为给定值,实现伺服电机的反馈控制。主计算机对该控制器发送命令,伺服控制器即按给定的运动形式输出相应的数字信号,本卡中LM628工作于8位工作方式,产生输出到功率放大器件。
7 结束语
WDM用一个相对独立的模块来处理设备数据的传输,驱动程序在这个模块中启动或停止设备,并实现中断或其他方式的输入输出操作。WDM使驱动程序的结构非常清晰、完整,也使中断I/O方式的设备驱动程序的设计和实现更加方便、快捷。应用WDM编制的设备驱动程序在本电机控制卡得到很好的应用。
8 参考文献
[1]CHRIS CANT著,孙义,马莉波译.Windows WDM设备驱动程序开发指南LM3[M].北京:机械工业出版社,2001
[2]ART BAKER著,科欣翻译组译.WindowsNT设备驱动程序设计指南[M].北京:机械工业出版社,1997
1 引言
微型计算机界以INTEL公司为主推出了PCI总线规范。采用PCI总线设备所具有的配置空间以及PCI总线通过桥接电路与CPU相连的技术使PCI总线具有广泛的适应性,并且PCI总线采用宽字节和高达33Mb的时钟频率的猝发和主控方式传输能满足高速设备的要求。
在WINDOWS操作系统下,开发PCI设备的驱动程序最好的方案是WDM驱动程序。在一个系统中开发出WDM驱动程序,稍加修改即可在其他系统中编译运行。
2 WINDOWS驱动程序模型WDM
WDM(WINDOWS Driver Program Model)是一个模块化的、分层次类型的微型驱动程序结构,它是编写设备驱动程序的主要模型。设备驱动程序是提供连接到计算机的硬件的软件接口,它是操作系统的一部分,用户应用程序以一种规范的方式访问硬件,而不必考虑必须如何控制硬件。在WINDOWS中,驱动程序总是使设备看起来像是一个文件,可以打开设备的一个句柄,然后应用程序可以在设备句柄最后关闭之前向驱动程序发出读写请求。WDM是在Windows NT驱动程序体系的基础上发展而来的,修改或增加了即插即用、电源管理等功能,使之适应硬件和用户的要求。
PCI总线是一种高性能、与CPU无关的32/64位地址数据复用的总线,它支持突发传输、即插即用、电源管理等功能,不但能满足现在的应用需要,而且能够适应未来的需求。PCI总线支持硬件资源动态自动配置,以支持即插即用。在PCI设备插入PCI插槽或上电后,PCI总线配置机构自动根据PCI设备的要求实现配置。PCI总线支持内存读写、I/O端口读写、中断机制和DMA功能。由于这些硬件特点使PCI设备的WDM驱动程序的设计变得很复杂。在开发WDM驱动程序之前,还有必须掌握PCI设备的需要分配的资源等配置信息以及PCI设备的功能和操作方法。
在WDM中,采用了分层的驱动程序体系结构,总线驱动程序或类驱动程序在最底层直接与设备打交道,设备功能驱动程序在上层通过与低层驱动程序打交道,实现设备的功能,中间还可以有类过滤驱动程序或设备过滤驱动程序用于数据的过滤或转换。在PCI总线的驱动程序层中,其层次图如图1所示:

3 PCI设备资源的获得及内存、I/O读写
PCI设备的硬件资源是由PCI配置机构动态分配的,由PCI设备实现PCI配置寄存器,提出需要分配的硬件资源,由PCI配置机构分配资源。驱动程序需要取得这些资源,才能操作硬件。因此,PCI设备的硬件资源分配与管理是驱动程序中很重要的部分。硬件资源主要包括映射内存空间、I/O空间、中断。当系统的PNP管理器在取得设备的资源后会自动向驱动程序发出IRP_MN_START_DEVICE的IRP,在该IRP栈中包含了设备的资源信息。好的驱动程序都应该使用这种方法,每个支持PNP功能的驱动程序,都应实现IRP_MN_START_DEVICE处理。在该IRP处理中应先交给低层驱动程序处理后,再根据IRP栈内内容进行资源分配。
在PCI设备的驱动程序中,获得的设备内存是一段映射物理内存,这是无法使用的,需要将其映射成系统可以访问的非分页内存。函数MmMapIoSpace完成该功能。该函数的原型为:


4 中断的处理
在PCI总线中,很多设备共享一个中断,这就需要在中断处理函数要格外小心,处理不当,就会导致系统崩溃。驱动程序首先要在IRPMNSTARTDEVICE中获得中断资源,然后需要连接到中断处理函数中,使其当有中断请求时,进入中断服务例程。连接中断的函数为IoConnectInterrupt,具体用法见上段程序中的“中断资源”部分。十分需要注意的是在连接中断之前,一定要确定PCI设备不会产生中断请求,最好在PCI设备上电后,中断为屏蔽状态。在连接中断后,调用开启中断请求的函数需要同步处理,以防在函数的执行中,出现运行时间上的错误,而且在开启中断时,一定要在所有的硬件资源分配以后,否则如果有中断产生,系统就会立即调用中断处理例程,如果例程中使用了还没有分配的资源,就会出现意想不到的结果。
在中断服务例程中,相应的处理最好简洁快速,因为中断例程运行的级别很高,当有中断请求时,不但会打断应用程序的执行,而且会打断在硬件中断级以下的所有运行程序。在WDM中,提供了DPC(Deferred Procedure Call)例程,将在中断例程中耗时的但不需要立即处理的任务延时处理。比如,驱动程序接受应用程序的写PCI设备的数据,当写完后,硬件产生中断标志执行完毕,这时需要结束该IRP,就可以将结束IRP这个耗时的任务交给DPC完成。
在该实例中,由应用程序调用函数WriteFile,将数据传递给驱动程序,驱动程序的DispatchWrite例程负责处理该IRP,在该例程中,由于需要中断的配合,假定无法立即执行完毕,必须将IRP串行化,StartIo例程如果没有其他任务,就开始处理该IRP,处理完毕后立即返回,但不能结束IRP,当PCI设备完成操作后,就会产生中断,在中断服务例程中把IRP交给DPC,在DPC中处理完后结束该IRP。
5 驱动程序的安装与应用
Windows98和Windows2000是依靠INF文件来得到硬件设备驱动程序的安装信息的一个设备信息文件(INF)。只要将文件中双引号中的提示改为相应的内容即可生成我们自己的设备信息文件。
[Strings]
ProviderName=“your company name here”//公司名称
MfgName=“Name of HW manufacturer here”//硬件制造商名称
DeviceDesc=“Description of device here”//设备描述
DeviceClassName=“Description of device class here”//设备类的描述
当系统加电时,WINDOWS操作系统会自动检测所有外设,当第一次检测到我们的设备时系统会提示用户指定新硬件的驱动程序。根据提示指定了我们修改过的INF文件,以及编译后生成的.sys系统文件系统就自动安装好了新硬件的驱动程序。或者可以用控制面板中的添加新硬件来搜索新硬件。
驱动程序安装好以后,在应用程序中就可以像打开其他驱动程序(如虚拟设备驱动程序VxD)一样用CreateFile打开设备。
6 基于PCI总线的电机运动控制卡
图2为该系统硬件组成框图,该控制卡采用PCI总线实现主计算机与控制卡之间的信息传递。控制卡上有2个伺服控制专用芯片LM628,分别用于控制伺服电机;来自2个伺服电机的增量式码盘输入信号(A相、B相和Z脉冲),经电平变换后分别送入LM628经四倍频和计数后作为反馈信号,由LM628根据主计算机给定的位置、速度、加速度生成梯形轨迹速度曲线作为给定值,实现伺服电机的反馈控制。主计算机对该控制器发送命令,伺服控制器即按给定的运动形式输出相应的数字信号,本卡中LM628工作于8位工作方式,产生输出到功率放大器件。

7 结束语
WDM用一个相对独立的模块来处理设备数据的传输,驱动程序在这个模块中启动或停止设备,并实现中断或其他方式的输入输出操作。WDM使驱动程序的结构非常清晰、完整,也使中断I/O方式的设备驱动程序的设计和实现更加方便、快捷。应用WDM编制的设备驱动程序在本电机控制卡得到很好的应用。
8 参考文献
[1]CHRIS CANT著,孙义,马莉波译.Windows WDM设备驱动程序开发指南LM3[M].北京:机械工业出版社,2001
[2]ART BAKER著,科欣翻译组译.WindowsNT设备驱动程序设计指南[M].北京:机械工业出版社,1997
本文来源:自动化技术与应用 作者:王磊
关于PCI总线 电机控制卡 WDM设备 驱动程序设计 的资讯
热点资讯(一周点击率)
最受工程师关注文章
热评博文
评一评已有 0 位网友对此文发表了看法。 我也来评一下
快乐大本营
无线时代来临,移动产业生态系统将发生一些根本变化。今日头条推荐“芯片是嵌入式4G技术的关键 产业生态系统将发生变化”。
想了解嵌入式开发工具的市场情况吗?先来体验下我们的在线调查吧!填写调查问卷。

