PCI设备的WDM驱动程序设计-9052
vc++60中开发驱动程序的配置方法
VC++6.0中开发驱动程序的配置方法注意:如果你的电脑中没有安装VC++6.0等软件的话,请先安装 VC++ 6.0 ,再安装DDK,最后安装DriverStudio。
安装顺序一定不要搞错哟。
一、首先创建一个你的驱动工程文件目录。
这个目录下用来放置你的各个驱动工程文件夹。
(比如我在D盘创建了一个D:\PCI9052DVP\PCI9052DRV文件夹作为我的驱动工程文件目录)。
二、然后添加1个用户环境变量,DDKROOT,他的值应该是你所安装DDK的根目录。
(比如在安装DDK时安装到了E:\WINDDK\3790.1830,那么 DDKROOT的值应该为E:\WINDDK\3790.1830)。
添加用户环境变量后电脑需要重启。
如果没有这个用户环境变量,将不会编译任何一个文件。
三、编写一个MakeDrvr.bat批处理文件,如下(可直接copy,不用修改)。
MakeDrvr.bat应该放在工程目录下面D:\PCI9052DVP\PCI9052DRV。
@echo offif "%1"=="" goto usageif "%3"=="" goto usageif not exist %1\bin\setenv.bat goto usagecall %1\bin\setenv %1 %4%2cd %3build -b -w %5 %6 %7 %8 %9goto exit:usageecho usage MakeDrvr DDK_dir Driver_Drive Driver_Dir free/checked [build_options]echo eg MakeDrvr %%DDKROOT%% F: %%WDMWorkshop%% free -cef:exit四、建立一个Makefile工程下面我将要建立一个PCI9052DRV的工程。
WDM驱动
Windows驱动开发模型WDM学习笔记绪言 (4)1.WDM驱动程序开发基础知识 (5)1.1WDM简介:Win32 Driver Model Win32驱动程序模型 (5)1.2 Win32 API (5)1.3 WDM特性 (5)1.4 WDM工作原理 (6)1.5 WDM与其它驱动程序的比较 (6)2.WDM驱动程序开发环境DDK设备驱动程序开发包 (6)2.1■安装DDK (6)2.1.1.Windows 98 DDK的安装 (7)2.1.2.Windows 95 DDK的安装 (7)2.1.3.NT DDK的安装 (8)2.2 ■构造环境:建立WDM驱动程序构造环境的方法 (8)2.2.1. 用SETENV.bat来安装驱动程序构造环境 (9)2.2.2. 手工运行SETENV.bat (9)2.2.3. 构造WDM驱动程序 (9)2.2.4.构造驱动程序 (9)2.2.5.检查Windows 98 DDK的安装 (9)3.WDM驱动程序的设计与开发 (10)3.1■WDM 驱动程序的运作流程 (10)3.2■驱动程序设计 (10)3.3■驱动程序开发 (11)3.3.l.编写驱动程序框架 (11)3.3.2.测试驱动程序 (11)4.WDM驱动程序编译运行:编译和安装设备驱动程序的方法 (12)4.1■编译设备驱动程序的方法 (12)4.1.1.举例分析 (12)4.1.2.编译的基本步骤 (13)4.2■设备驱动程序的安装和启动 (13)4.2.1.添加注册表中的键值 (13)4.2.2.控制驱动程序的装入次序 (14)4.2.3.驱动程序的Start值 (14)4.2.4.修改注册表的方法 (15)4.2.5.启动设备驱动程序 (15)4.2.6.调试工具 (16)5.wdm驱动开发基础-一些需要注意的问题汇总 (16)5.1注册表的角色 (16)5.2.如何命名注册表键 (16)5.3从用户模式中访问设备键 (17)5.4 函数原型“IN”关键字 (17)5.5 注册设备接口 (18)5.6 初始化设备扩展 (18)5.7 注意侧效 (19)5.8 try-finally中的控制流程 (20)5.9 生成异常 (22)5.10 __Leave语句 (23)5.11 简化页大小 (24)5.12 页故障关于分页 (24)5.13 alloc_text的使用 (25)5.14 关于段布置 (26)5.15 服务函数描述 (26)5.16 ExAllocatePoolWithTag (28)5.17 ExAllocatePool的其它形式 (29)5.18 单链表 (30)5.19 lookaside链表的服务函数 (31)5.20 打开注册表键 (31)5.21 删除子键或键值 (32)5.22 枚举子键或键值 (33)5.23 IRQL限定 (35)5.24 IRQL的明确控制 (35)5.25 自旋锁 (36)6. wdm驱动开发基础代码分析解析 (36)绪言在Windows的不同版本上开发的驱动程序“模型”(模型这个词语应该来源于单词“Mode”。
PCI接口扩展卡的快速开发方案【新版精品资料】
PCI接口扩展卡的快速开发方案摘要:介绍了PCI总线扩展卡的设计思路和方法,并结合一个多功能CAN通信I/O卡的设计实例,介绍了PCI总线扩展卡的软硬件设计流程,给出了一套快速可行的解决方案.关键词:PCI总线PLX9052 设备驱动程序Windriver随着计算机和控制技术的不断发展,很多工程人员都选用PC机作为控制系统的操作平台.为了能够和外部设备通信,PC机上提供了外置的USB、串口、并口及内置的ISA、PCI等接口。
PCI总线接口速度快,系统占用率低,有完备的即插即用(PnP)管理体制,是目前计算机插卡式外设总线的事实标准.笔者设计了一块PCI总线多功能CAN通信I/O卡,可以完成数字量I/O、CAN总线通信的功能.本文将根据笔者的实际经验,介绍PCI接口扩展卡的软硬件设计流程和一种快速开发方案.1 PCI总线简介PCI总线标准由PCISIG(PCI Special Interest Group)制定,该组织的成员有Intel、IBM、DEC 等公司.目前PC机中使用的PCI总线标准主要以PCI2。
0为主,其频率为33MHz,字宽为32bit,电源电压为5V。
新版的PCI标准向下兼容,并支持66MHz时钟,字宽为64bit,电压为3.3V。
PCI总线是一种时分复用的双向应答总线,传输发起方称为主设备,接收方称为从设备.主设备用RFAME信号指示,从设备拉低它的DEVSEL线来表示响应传输请求。
PCI总线的数据传输以帧为单位,每次传输由一个地址周期(Address Phase)和多个数据周期(Data Phase)组成,如图1所示。
AD0~AD31首先给出本次传输的首地址,后面紧跟一个或多个32位(4字节)宽的数据,多个数据的地址自动递增。
在地址周期,C/BE0~C/BE3这四根线的不同组合指示出在AD0~AD31上将要进行何种类型的操作,如C/BE0~C/BE3=0110表示存储器读,C/BE0~C/BE3=0011表示I/O写.在数据周期,C/BE0~BE3对应AD0~AD31上四个字节的使能。
PCI
PCI设备电源管理驱动程序开发作者:程海全,胡君,徐抒岩,谢爱平来源:《现代电子技术》2010年第14期摘要:为使PCI设备具有电源管理功能,需要操作系统和驱动程序的配合来控制设备的电源状态。
通过研究Windows操作系统下系统和设备的电源策略,提出WDM驱动程序中处理系统电源IRP控制设备电源状态的电源管理方案。
说明处理电源管理IRP的工作机制,在基于Windows XP的系统上证明基于这种方案的WDM驱动程序运行稳定。
关键词:电源管理; WDM; PCI; IRP中图分类号:TN302.7 文献标识码:A文章编号:1004-373X(2010)14-0196-03Driver Development of Power Management for PCI DeviceCHENG Hai---(1. Space Optics Research Department, Changchun Institute of Optics, Fine Mechanics and Physics, Chinese Academy of Sciences, Changchun 130033, China;2. Graduate School, Chinese Academy of Sciences, Beijing 100039, China;3. College of Communication Engineering, Jilin University, Changchun 130032, China)Abstract: The cooperation of operating system (OS) and driver is needed to control the power status of equipments for making PCI device to possess the function of power management. By the aid of the study on the power supply of systems and devices under Windows OS, a power management scheme is proposed to control the power status of equipments through processing system power IRP in WDM driver. WDM driver's mechanism of processing the power management IRP is elaborated. An experiment shows that WDM driver based on this scheme can work well with Windows XP.Keywords: power management; WDM; PCI; IRP0 引言随着计算机软硬件技术发展,要求设备能够从待机或睡眠中快速启动;要求在不使用时,移动设备能够保持待机或休眠以节省电能的情况越来越多,传统的冷启动或热启动(复位启动)已不能满足人们的要求。
利用接口芯片PCI9052制作PCI总线接口卡详解
LA[23:2]和 ISAA[1:O]共 同 组 成 ISA 的 地 址 总 线 ,对 于 8 位 数 据 总 线 ,ISAA[1:O]相 当 于 LA[1:O],它 们 一 起 进 行 地 址 译 码。而对于 16 位数据线,每次读写两个字节,这时 ISAA[O]不用, ISAA[1]和 LA[23:2]一起进行地址译码,ISAA[1]是地址最低位。 需 要 注 意 的 是 ,并 不 是 所 有 的 地 址 线 都 要 进 行 地 址 译 码 ,这 里 要 根据板卡上实际 I / O 口空间的大小选择译码地址线的数目。对于 我们的板卡,由于是 16 位的数据总线,I / O 空间大小为 16 个字 节,所以 LA[3:2]和 ISAA[1]地址译码是必需的(ISAA[1]为最低 位)。 当 然 ,所 有 的 地 址 线 都 参 加 地 址 译 码 也 是 可 以 的 ,有 利 于 将 来地址空间大小的扩充。这里我们只选择几根线就能够进行正确 的地址译码,这与后面要讲的 EEPROM 的配置有关联。
PCI9052 是 PLX 公司继 PCI9050 之后推出的、可用于低成 本适配器的的小型高性能 PCI 总线目标(从属)接口芯片。
图 1 所示是 PCI9052 的信号接口示意图。
位 ,可 以 实 现 模 入 模 出 ,无 中 断 功 能 。 现 在 ,我 们 利 用 PCI9052 芯片的 ISA 模式对原来的板卡进行升级改造。PCI9052 芯片有 三种工作模式,分别是 C 模式、J 模式和 ISA 模式。不同的模式 下,9052 的部分引脚功能有不同的功能定义。通过配置寄存器 设定,可将 PCI9052 设定为 ISA 接口模式。在此情形下,通过 8 位或 16 位内存或 I / O 映 射 , 可 直 接 使 PCI 总 线 和 ISA 总 线 相 连 , 实 现 ISA 总 线 到 PCI 总 线 的 平 滑 转 换 。PCI9052 采 用 了 160 芯 POFP 封装。当其工作在 ISA 接口模式时,主要引脚如图 2 所示。
PCI9052驱动配置方法
安装PCI9052接口卡Windows驱动和配置EEPROM注意的地方主要有这几个:1.TEST引脚要下拉,这是正常操作模式。
如果上拉则是进入芯片测试模式。
2.PCI金手指处的PRSNT1#和PRSNT2#引脚一定至少要有一个下拉,或者两个都下拉(具体可参照PCI协议V2.3),否则找不到卡。
3.模式选择引脚MODE0和MODE1如果都下拉,是C模式,即LOCAL端的地址线和数据线是分开的;如果MODE0上拉,MODE1下拉,则是J模式,即LOCAL端的地址线和数据线复用。
我采用的是C模式。
4.这是很关键的一点,即EEPROM的EEDI/EEDO引脚的配置。
有这样三种情况:A 当不安装EEPROM时,该引脚一定要下拉,用1k的下拉电阻即可。
此时启动后9054会按默认的值进行配置。
B 当安装空白的EEPROM时,该引脚需要上拉。
C当安装烧录好的EEPROM时,该引脚需要上拉。
这里解释一下:卡设计好后,如果没有配置好EEPROM的值,也可以测试卡的硬件,按A或B步骤,把卡插在PC的PCI插槽上,如果硬件设计没有问题,是可以找到卡的。
所以设计的时候应将此引脚设计成上下拉,根据需要装上拉或下拉电阻。
这可以避免只能等配置好EEPROM的值后才能测试卡的硬件设计正确与否。
5.EEPROM的设计问题,9054是应该搭配93C56的,即2k容量的EEPROM,9052是搭配93C46这种1k的EEPROM。
至于具体的厂商,可以选用ST的M93C56或者HOLTEK的HT93LC56,PLX公司的网站上有EEPROM的选型指导,可以下载来看。
据我的调查,市场上很容易买到ST的这种片子,其他品牌的不是太好买。
另外,如果你是有烧录机,打算将ROM烧录过后再安装在板子上,那么采用插件的芯片比较方便,如果采用贴片的,烧录机要有相应的烧录SOP-8的转接头才行。
如果你是打算在线烧录,可以采用贴片的S OP-8的封装的片子,直接把空白的片子焊接在板子上即可,关于在线烧录,以下会详细解释。
ISA总线板卡和PCI总线板卡的区别
ISA总线板卡和PCI总线板卡的区别pci(peripheral component interconnect)总线,即外围部件互连总线,是一种先进的高性能32/64位地址数据复用局部总线。
pci总线与处理器和时钟频率无关,可以提供高达132mb/s的数据传送速率;它具有严格的规范,只要符合pci规范的扩展卡插入任何pci系统就能可靠地工作。
但由于pci总线协议的复杂性,其接口的实现比vesa、isa和mca等总线要困难得多。
目前,开发pci接口设备有两种方法:一种方法是采用可编程逻辑芯片,它的最大好处是比较灵活,用户可以根据自己的需要开发出适合于特定功能的芯片,而不必实现pci的全部功能。
现在有许多生产可编程逻辑器件的厂商,如xilinx的logicore和altera的ampp都提供经过严格测试的pci接口功能模块,用户只要进行组合设计即可。
另一种常用的方法是使用专用接口器件,通过专用芯片可以实现完整的pci主控模块和目标模块的功能,将复杂的pci总线接口转换为相对简单的用户接口,用户只要设计转换后的总线接口即可。
专用接口芯片具有较低的成本和通用性,能够有效降低接口设计的难度,缩短开发时间。
现有的pci接口芯片主要有amcc公司的amccs59xx系列和plx公司的pci90xx系列。
在plx系列产品中,pci9052是一款常用的pci总线目标接口芯片,该芯片最大的特色是带有一个isa接口,通过它可以实现isa总线到pci总线的无缝连接,这为目前仍存在的isa插件移植到pci提供了极大的方便。
利用pci9052的isa模式进行pci的开发可以简化设备开发过程,但难度还是较大。
设计者不仅要理解掌握手册中的要点,还要学习硬件设计和软件设计的方法和过程。
为了让大家能够系统地了解利用pci9052的isa 模式进行pci板卡开发的过程和方法,本文从硬件设计、配置寄存器的编写、板卡调试和驱动程序的编写等方面介绍了pci9052的开发过程。
PLX9052芯片的配置及其驱动开发
第 1 卷 第 1期 9
20 0 6年 3 月
青 取甚 鸟 技术 学 晕 报
J u n lo n d o Vo ain l n c n c l l g o r a fQi g a c t a d Te h ia l e o a Co e
存器 全 部加 载 为 0 。串 行 时 钟 由 9 5 0 2芯 片 时 钟 3 2
分频 得 到 。E po 的选 择需 要 多 加 注 意 , I erm P X推 荐
P I0 2是 P X公 司继 P I0 0之后 推 出的低 C9 5 L C 95
了部 分 型号 的芯片 , 比较 常 用 的有 :
个 局部 地址 空 间和 4个局 部设备 片选 信号 , 局部 总线
( 意 : 须有 串行读 功 能 ) 注 必
Hotk S mi n u tr公 司 的 1 l e c d co e o HT9 L 4 K 3C6
与P I C 总线 时钟 相互 独立 运行 , 支持 I A 接 口模 式 。 S
摘要 : C 接 口作为 一种 高速 的 总线接 口 , 泛 应 用 于 P 机 、 种 智 能化 仪 器及 测 试 系统 中。 本 文介 绍 PI 广 C 各
了在 P I 口开发 中 , C接 如何 通过 设置 P X9 5 L O 2芯 片的 E po 地址 映射 、 置 寄存 嚣和 本 地 寄存 器 完成 P I e r m、 配 C
F i hl e cn u tr 司的 1 M9 C 4 ar i S mi d co 公 c d o K F 3 S6
成本 P I C 总线 接 口芯 片 , 它符 合 P I. C2 1规 范 , 可作 为P I C 总线 目标 设 备 实 现 基 本 的 传 送 要 求 ; 有 5 它
Windows XP下基于PLX9052的WDM驱动程序开发
20 0 8年 1 2月
四 川理 工 学 院学报 ( 自然科 学版 )
J OURNAL 0F I SCHUAN UNI VERSTY I OF
Vo .1No6 12 .
S IN E & E G N E I CE C N I E R NG( A U L S I N E E II N T RA C E C D TON、
进行 直 接操 作 。
输速率较低 , 误码率高, 很难能提供高速和可靠 的连接 。
为 了满 足 高速 率 传 输 的要 求 本 文采 用 了 P I 口 , 的 C接 它 时钟 频 率 为 0 3 M, 大传 输 数 据 率 为 13 S完 全 M~ 3 最 3M/, 能满 足 实 时传输 的要 求 。
t leSri 中 可 以找 到 硬 件 模 块 的 驱动 程 序 M 95 r St e c o \ ve y0 2
的相 关信 息 。
22 .. 2创建 设 备 例程 A d ei dD v e c
在驱 动 程序 初 始 化 之后 , N P P管 理 器 调用 驱 动 程序
2 P I 口驱 动 开发 C 接
则把 从 设备 传 来 的 数 据 放 在 该缓 冲 区里 ;n i 果是 Wre i , t
ቤተ መጻሕፍቲ ባይዱ
占据 了存 储 市 场 的 主导 地 位 。但 随 着 C U时 钟 频 率 和 P 内存 带 宽 的不 断提 升 ,这 些 接 口逐 渐 显 现 出不 足 来 : 传
则把 该 缓冲 区 的数据 传 给 设备 , 样 可 实现 对 内存 端 口 这
22 动 程序 关 键代 码 实 现 .驱 Di rtd r eS i 据 用 户 配 置 生 成 驱 动 程 序 框 架 后 , v u o根 还 需要 针对 具体 硬件 添 加 或修 改 程序 实 现 功能 要求 。 这 里就 根 据 图 1 硬件 的要 完成 的功 能 , 驱 动 程序 关 键代 对
905nm脉冲激光二极管驱动电路
905nm脉冲激光二极管驱动电路的设计905nm脉冲激光二极管在许多领域都有广泛的应用,如通信、激光雷达、光学传感等。
为了充分发挥其性能,一个优秀的驱动电路是必不可少的。
本文将详细介绍一种针对905nm脉冲激光二极管的驱动电路设计。
一、电路设计1. 电源供电驱动电路需要稳定的电源供电以提供所需的电压和电流。
我们选择一个开关电源,通过DC-DC转换器将输入电压转换为稳定的输出电压。
这种转换器具有高效率、低噪声和良好的负载响应特性。
2. 脉冲发生器为了产生脉冲激光,我们需要一个脉冲发生器。
我们选择一个基于TTL (Transistor-Transistor Logic)的脉冲发生器,它可以产生高速脉冲信号。
TTL脉冲发生器具有陡峭的前沿和后沿,能够确保激光二极管在脉冲期间正常工作。
3. 激光二极管驱动器激光二极管驱动器是核心部分,它需要能够提供足够的电流驱动激光二极管。
我们选择一个具有高带宽、低噪声和高驱动能力的驱动器。
该驱动器能够根据脉冲发生器的信号驱动激光二极管,使其在脉冲期间正常工作。
4. 反馈控制电路为了确保稳定的输出功率,我们设计了一个反馈控制电路。
该电路通过监测激光二极管的输出功率,调整驱动器的输出电流,从而保持输出功率稳定。
二、电路优化为了提高驱动电路的性能,我们采取了以下优化措施:1. 降低噪声:我们选择低噪声元件,并在电路中加入去耦电容,以降低电源噪声和电磁干扰。
2. 提高效率:我们优化电源电路的设计,降低功耗和热损耗,提高整个驱动电路的能效。
3. 保护二极管:我们设计了一个快速关断电路,能够在异常情况下快速关闭激光二极管,防止其损坏。
4. 温度补偿:我们加入了温度传感器和补偿电路,以补偿温度对激光二极管性能的影响。
三、总结本文介绍了一种针对905nm脉冲激光二极管的驱动电路设计。
该设计考虑了电源供电、脉冲发生器、二极管驱动器和反馈控制电路等多个方面,并进行了优化措施以提高性能。
这种驱动电路能够为905nm脉冲激光二极管提供稳定的、高效的驱动能力,使其在各种应用中发挥出色的性能。
安装PCI9052驱动并配置EEPROM
安装PCI9052接口卡Windows驱动和配置EEPROM
1.将接口卡插入计算机PCI插槽,启动计算机后,windows 提示找到新硬件:其他PCI 桥设备。
*注:红圈所圈名称是安装驱动并配置EEPROM后的名称,安装驱动前设备类型未知
2.安装驱动,在设备管理器中找到一个黄色问号的PCI设备,打开其属性页,如图操作:
点击“浏览”按钮选择PCI9052驱动所在文件夹该文件夹含有以下文件:
按“下一步”安装驱动。
中途会提示该设备没有数字签名,选择“仍然继续”,继续安装。
4.安装驱动后,使用PlxMon.exe配置EEPROM
点击图中所圈按钮,
从“Load File”载入文件s0_8reg.eep
点击“Write”按钮,然后关闭对话框
3.重启计算机,可能提示需要重新安装驱动,重新安装驱动即可。
基于WDM模型PCI总线驱动的设计及实现
基于WDM模型PCI总线驱动的设计及实现胡辉;詹玉广【摘要】介绍了在Windows XP下WDM驱动程序的开发模型,分析了DriverStudio开发工具的特点,重点讨论了WDM 设备驱动程序设计中的重要问题以及利用它开发设备驱动程序的方法、步骤和注意事项,实现了对可编程的扩展I/O芯片8155的读写以及中断处理.【期刊名称】《河南工程学院学报(自然科学版)》【年(卷),期】2009(021)004【总页数】4页(P40-43)【关键词】PCI总线;设备驱动程序;WDM;PCI9052【作者】胡辉;詹玉广【作者单位】华东交通大学,信息工程学院,江西,南昌,330013;华东交通大学,信息工程学院,江西,南昌,330013【正文语种】中文【中图分类】TP273PCI (Peripheral Component Interconnect) 总线是为满足外设间以及外设与主机间高速数据传输而提出的一种高性能局部总线[1].主要在数字图形、图像和语音处理以及高速实时数据采集与处理等对数据传输率要求较高的场合使用.PCI总线有32位和64位两种,目前常用的是32位PCI总线,其最大数据传输率为133MB/s,远远高于ISA总线,支持即插即用(PnP)和中断共享,与CPU及时钟频率无关,是ISA总线的替代品,成为各种计算机最普遍使用的外设总线.在Windows 2000/XP环境中,不支持用户层应用程序对系统硬件资源的直接访问.因此,提出了设备驱动程序的概念,驱动程序是应用程序和硬件设备之间的桥梁,应用程序与驱动程序之间有明确的接口,应用程序通过与驱动程序交换信息,达到控制外设的目的.为了实现对PCI设备的操作,需开发相应的PCI设备驱动程序.WDM(Windows Driver Model)驱动模型为当前主流操作系统Windows 2000/XP下的设备驱动程序提供了一个参考框架模型,它规定了标准化的驱动模块,其主要目标是为了实现能够跨平台使用、更安全、更灵活、编制更简单的Windows设备驱动程序.本文将结合WDM驱动程序开发工具DriverStudio,分析Windows XP下PCI设备驱动程序的开发过程.1 WDM驱动程序模型与以往的Windows 95/98操作系统不同,Windows 2000/XP操作系统包括许多功能相互独立的内核模式组件,图1是从内核驱动程序设计者的角度看到的Windows 2000/XP操作系统结构,它重点突出了驱动程序开发者所关心的特征[2].图1 Windows 2000/XP操作系统Fig.1 Windows 2000/XP operation system 当用户模式应用程序需要和硬件设备通信时,它就调用用户模式下的Win32子系统组件的API函数,Win32子系统模块则通过调用平台相关的系统服务接口实现该API,平台相关的系统服务将调用内核模式中的服务例程,而服务例程就是WDM驱动程序的一部分,为应用程序请求提供服务,并以某种方式与硬件设备进行交互.因此,用户模式的应用程序要想操作系统底层的硬件设备,必须借助驱动程序.当应用程序通过API函数向系统发出I/O请求时,I/O管理器为每一个用户请求打包成一个IRP(I/O Request Pack),并将其发送至驱动程序,通常IRP首先被送到最上层驱动程序,然后逐层地被送到下面的驱动程序,不同位置的驱动程序负责不同的工作,驱动程序处理完后,将会返回相应的处理结果信息.WDM驱动程序模型支持即插即用、电源管理和Windows管理诊断(WMI)控件技术.在WDM驱动程序模型中,每个硬件设备至少有两个驱动程序,其中一个为功能驱动程序,就是通常所说的硬件设备驱动程序.它了解使硬件工作的所有细节,负责初始化I/O操作,处理I/O操作完成时所带来的中断事件,为用户提供一种设备适合的控制方式.另一个为总线驱动程序,它负责管理硬件与计算机的连接.例如,本文中的PCI总线驱动程序就会检测插入到PCI槽上的设备并确定设备的资源使用情况,还能控制设备所在PCI槽的电流开关.WDM驱动程序采用分层的结构模型,如图2所示.WDM引入了物理设备对象PDO (Physical Device Object)与功能设备对象FDO(Functional Device Object)来描述硬件,一个PDO对应一个真实的硬件.一个硬件只允许有一个PDO,却可以拥有多个FDO,在驱动程序中直接操作的不是硬件而是相应的PDO和FDO.如图2所示,在有些驱动程序中还有位于设备驱动程序和总线驱动程序之间的过滤器驱动程序,用于监视和修改IRP流.在对硬件访问的过程中,设备驱动程序只需与下层的总线驱动程序打交道,具体控制硬件的工作则交给总线驱动程序去完成.在PCI设备的WDM驱动程序开发中,一般是编写功能驱动程序,总线驱动程序则由操作系统实现.图2 WDM设备对象和驱动程序的层次结构Fig.2 The hierarchical structure of WDM device object and driver2 WDM驱动程序开发工具的选择本文要进行的是Windows XP下PCI设备驱动程序的开发及设计,即WDM驱动程序的设计,对于Windows XP下WDM驱动的开发通常有以下三种开发平台:Windows DDK、WinDriver和DriverStudio.Windows XP DDK(Device Driver Kit)是Miscrosoft公司提供的Windows XP 下KMD (Kernel Mode Driver)和WDM驱动程序的开发工具,由于DDK基于汇编语言的编程方式和内核模式的调用,所以,采用DDK开发需要对操作系统和驱动程序的结构有很好地理解和把握,开发难度相对较大.WinDriver提供了可与操作系统核心层交互的内核Windrvr.sys,驱动程序使用WinDriver提供的函数库来与内核建立连接,进而实现与Windows底层的通信.WinDriver只能开发硬件相关的驱动,并且用其开发出的驱动程序效率和工作频率都不是很高.因此,主要用来作为硬件开发者快速测试新硬件的工具. DriverStudio是NuMega公司为简化Windows设备驱动程序和应用程序的开发而推出的一套开发、编译和调试的软件工具包,主要包括VToolsD、SoftICE和DriverWorks等.其中,DriverWorks以面向对象的方式,将WDM和NT下的驱动程序编写所需的与内核访问及对硬件的访问封装成类,加上设计的驱动程序代码生成向导Driver Wizard,它能够快速自动生成WDM驱动程序框架,简化了驱动程序开发的难度,减少了工作量.同时,DriverWorks可嵌入到VC++中,方便了开发.因此,我们选择DriverStudio做为我们的开发工具,本文以下部分将给出用Visual C++6.0和DriverStudio 3.1开发PCI设备WDM驱动程序的过程和注意事项.3 系统硬件结构我们开发了基于PCI9052的PCI开发板,如图3所示,该PCI开发板主要由PCI9052、EEPROM和8155以及预留的扩展总线接口构成.其中,PCI9052为PLX公司生产的支持PCI2.1协议的目标从模式I/O适配器[3];EEPROM为PCI9052的配置芯片,用于存放PCI9052的全部配置信息,这些配置信息规定了局部端到PCI总线的映射方式以及局部端的工作特性,在PCI9052加电或复位时加载到PCI9052的配置寄存器中;8155采用插卡式设计,它内部包括1个256字节8位的RAM、3个并行I/O口以及1个14位的定时/计数器.因此,可以用来作为开发板硬件调试和驱动程序开发的测试端.基于此平台可以开发出实现局部端I/O口和存储器的访问,以及定时中断等功能的驱动程序和应用程序.下面我们将详细介绍用DriverStudio 3.1开发的PCI开发板的驱动程序和应用程序编写的关键部分.图3 PCI 开发板系统结构框图Fig.3 The system diagram of PCI development board4 驱动程序和应用程序的编写4.1 PCI配置空间的访问Driverworks的KpciConfiguration类封装了访问PCI设备配置空间的所有操作,驱动程序通过该类访问PCI设备的配置空间,并可以对配置信息进行修改.在我们的设计中,主要是对PCI配置寄存器的内容进行更改,从而设定选择8155的RAM还是并行I/O口,以及设置中断操作.首先初始化这个类的实例:KPciConfiguration PciConfig(m_Lower.TopOfStack());/*m_Lower是KpnpLowerDeviee类的对象,提供访问PDO的模型.Lower.TopOfStack()返回当前设备堆栈顶部的设备对象.*/然后在驱动程序中通过m_MemoryRange0.inb()和m_MemoryRange0.outb()访问PCI配置寄存器的相应单元,从而设置局部端为8155的RAM空间还是I/O 口,以及设置中断操作.4.2 内存和I/O映射空间的访问DriverStudio中KMemoryRange和KIoRange类分别实现了对内存映射空间和I/O映射空间的访问.这两个类除了其中的构造函数有不同之处外,其他的成员函数完全相同.以内存映射空间的访问为例,对PCI设备首先需要在函数OnStartDevice中取得内存资源,然后初始化.如下:status = m_MemoryRange0.Initialize(pResListTranslated, //转换后的资源列表指针pResListRaw, //原始的资源列表指针PciConfig.BaseAddressIndexToOrdinal(0)//0代表分配的存储器资源在PCI基地址的序数);在处理资源的代码中必须进行运行错误处理,否则就会在驱动程序的运行中,引起系统崩溃.在其他例程中,就可以调用类KMemoryRange的成员函数inX/outX 对PCI设备内存映射空间的读/写访问,而对I/O映射空间的操作类似.4.3 中断处理DriverStudio中KInterrupt类实现了硬件中断的处理,其成员函数包括中断的初始化以及将一个中断服务例程连接到一个中断和解除其连接等.在OnStartDevice 函数中,调用KInterrupt的成员函数InitializeAndConnect初始化中断变量和调用宏LinkTo连接中断例程.status =m_Irq.InitializeAndConnect(pResListTranslated, //转换后的资源列表指针LinkTo(Isr_Irq), //连接中断服务例程this );在初始化和连接中断之前,最好将PCI设备的中断源进行屏蔽,PCI设备一般会有中断管理寄存器,屏蔽其中断许可位.当中断连接成功后,再将中断位打开.并且,一定要加运行错误处理,防止驱动程序将系统崩溃.在中断服务例程中,首先必须根据PCI设备的中断管理寄存器的内容来判断该中断是否是自己的设备发出的.若不是,返回FALSE;若是,进行必要的处理,请求一个DPC,然后返回TRUE.4.4 驱动程序与应用程序之间的通信在Windows中,应用程序与驱动程序的通信过程是:用CreateFile打开设备,有GUID接口方式和符号链接名方式;然后用DeviceIoControl和驱动通信,包括从驱动读数据和写数据给驱动两种情况,也可以使用ReadFile从驱动读数据和用WriteFile写数据给驱动,而调用DeviceIoControl函数有同步和异步方式;当应用程序退出时,用CloseHandle关闭设备[4].当WDM捕获到特定事件(如中断)时,就应当与应用程序进行通信.驱动程序与应用程序的通信有DeviceIoControl异步完成和Win32 事件通知两种方法.对于DeviceIoControl异步完成,当应用程序调用DeviceIoControl时,驱动程序首先将此IRP保存,然后调用I.MarkPending(),设法返回STATUS_PENDING.在一个事件发生后,驱动程序完成该IRP.由于IRP是未决的,所以必须将此IRP保存,当应用程序退出时,若IRP仍未发生,必须取消该IRP.对于Win32 事件,由应用程序创建一个事件后,直接将该事件句柄传递给驱动程序,然后等待驱动程序发送事件通知.驱动程序通过类Kevent获取这个事件的一个对象指针后,在IRQL≤DISPATCH_L EVEL级别的例程中设置事件信号状态来触发应用程序.4.5 驱动程序的安装在利用向导生成WDM驱动程序框架时,DriverWorks的Driverwizard已经在所建工程的sys目录下生成了一个设备信息INF文件.只要将文件中双引号中的内容改为我们需要的内容即可生成我们自己的设备信息文件.如:[Strings]ProviderName=“ECJTU GPS Institute”//公司名称MfgName=“ECJTU GPS Institute”//硬件制造商名称DeviceDese=“WDM Driver”//设备描述DeviceClassName=“PCI9052采集卡”//设备类名称在Windows系统重启时会自动检测所有外设,当第一次检测到我们的设备时系统会提示用户指定新硬件的驱动程序,根据提示安装我们最终的.INF文件和.sys系统文件,就可完成新硬件驱动程序的安装.也可以用控制面板中的添加新硬件来搜索新硬件,并安装新硬件的驱动程序.用DriverStudio自带的安装卸载工具进行驱动的安装和卸载将十分方便.在安装完驱动后,通过设备管理器中选择硬件属性,就可以看到为硬件添加的驱动.5 结束语利用DriverStudio开发WDM设备驱动程序可以降低驱动程序开发的难度,缩短开发周期.其中,SoftICE调试工具也为驱动程序的开发带来很多方便,采用这种方法开发的设备驱动程序具有较强的通用性和可移植性.基于上述方法,我们开发了PCI9052采集器的设备驱动程序,并用8155芯片进行了验证,工作稳定正常.现在,本采集卡已在基于PCI总线的GPS接收机系统中得到了应用,并取得了良好的效果.参考文献:【相关文献】[1] 李贵山.PCI 局部总线开发者指南[M].西安:西安电子科技大学出版社,1997. 1-56.[2] CANT C著,孙义,马莉波译.Windows WDM设备驱动程序开发指南[M].北京:机械工业出版社, 2000. 138-195.[3] PLX Technology,In C.PCI 9052 Data Book,Version 2.0[M].USA:PLX Technology InC,2001.1-172.[4] 武安河,邰铭,于洪涛.Windows2000/ XP WDM 设备驱动程序开发(第2版)[M]. 北京:电子工业出版社,2005.23-116.。
wdm驱动
wdm驱动
WDM驱动是指Windows Driver Model(Windows驱动模型)驱动,它是一种用于开发Windows操作系统设备驱动程序的软件框架。
WDM驱动是为Windows 98、Windows Me和Windows 2000引入的,它提供了一种标准化的方式来编写设备驱动程序。
相比于传统的驱动开发方式,WDM驱动具有更丰富的功能和更高的灵活性。
WDM驱动在设备驱动程序的开发中提供了许多优点,包括:
1. 简化了驱动程序的开发:WDM驱动使用一套统一的API,使得驱动程序的开发更加简单和一致。
2. 可移植性:WDM驱动可以在不同的Windows操作系统版本上运行,而无需进行大量的修改。
3. 兼容性:WDM驱动允许旧的驱动程序与新的设备完全兼容,而无需进行修改。
4. 性能:WDM驱动通过使用更高级的设备驱动模型和硬件访问机制,提高了设备驱动程序的性能。
总之,WDM驱动是一种用于开发Windows设备驱动程序的软件框架,它提供了许多优势和便利,使开发者能够更轻松地开发高性能和兼容性强的驱动程序。
PCI9030与PCI9052资料对比及热插拔功能
PCI9030与PCI9052资料对比及热插拔功能1、首先在功能方面:PCI9030比PCI9052多了三个功能:支持热插拔、电源管理和支持重要数据VPD配置;但比PCI9052少了一项功能:支持ISA接口。
2、在引脚方面:由于PCI9030与PCI9052在功能上有差别,因此具体表现在以下管脚上:3、由于CPCI卡与主板的连接不再是通过PCI金手指连接,而是通过插针槽连接,在连接器上除了基本的PCI信号外,为了支持多出的功能,相应增加了一些引脚:灰色背景功能引脚暂时用不到!4、由于在功能上PCI9030与PCI9052有了差别,表现在配置空间上也相应有所变化,具体统计如下:9030PCI配置寄存器9030本地配置寄存器EEPROM中需要存储内容EEPROM中主要内容说明本地地址空间0范围寄存器本地地址空间1~3及本地扩展ROM范围寄存器的说明与本地地址空间0范围寄存器的说明类似本地地址空间0的本地基地址(重映射)寄存器本地地址空间1~3及扩展ROM的本地基地址(重映射)寄存器的说明与本地地址空间0的本地基地址(重映射)寄存器类似本地地址空间0总线区域描述符寄存器本地地址空间1~3及扩展ROM总线区域描述符寄存器的说明与本地地址空间0总线区域描述符寄存器的说明类似片选0基地址寄存器片选1~3基地址寄存器的说明与片选0基地址寄存器的说明类似中断控制/状态寄存器PCI目标应答、串行EEPROM、初始化控制寄存器5、热插拔技术概要插拔有三个过程:物理连接过程,包括热插入(在系统运行中插入单板)和热拔出(在系统运行中拔出单板);硬件连接过程,即系统在硬件层上的连接与断开;软件连接过程,即系统在软件层上的连接与断开。
这些过程可以用一组状态进一步描述,这些状态虽属于系统的不同连接层但彼此关联,如图1所示。
例如,当物理连接层不存在时,硬件连接层就不能产生电气连接;当单板从运行中的系统拔出时,软件连接和硬件连接自动断开。
PCI9052驱动程序的开发
PCI9052驱动程序的开发一、引言本文结合实例简要介绍了编写PCI 驱动程序的一般过程和PCI驱动程序的特点,并详细介绍了在WIN98 环境下开发PCI9052驱动程序的方法。
二、 PCI 驱动程序开发的一般过程从广义上来说,设备驱动程序就是控制硬件设备的一组函数。
PCI 驱动程序的开发,就是取得PCI 板卡所占用的各种资源(内存、端口、中断和DMA 等),并提供给用户一条可以访问这些资源的途径。
对于所有的PCI 板卡,基本上都可以用下面的方法来开发驱动程序。
2.1 取得PCI 板卡所占用的资源无论是ISA 板卡还是PCI 板卡,用户要使用它,就必须能访问它所占用的各种资源。
对于ISA 板卡,它所占用的资源是定死的,可以直接访问;而PCI 板卡是即插即用的,它占用的所有资源都是由系统分配的,要想访问这些资源,就必须先取得这些资源。
2.2 建立起上层应用程序和底层驱动程序之间的映射关系因为在WIN98 /NT 等系统下,各种资源的访问对用户来讲是透明的,用户不能在上层应用程序里直接访问硬件资源,只能靠底层驱动程序来访问它。
因此用户要实现对板卡的控制,就必须在应用程序和底层驱动程序之间架起一座桥梁,来实现应用程序和驱动程序之间的联系。
通过这个桥梁,用户可以实现参数的传递和硬件资源的访问。
2.3 通过底层驱动程序实现对硬件资源的访问用户的最终目的是实现对硬件资源的直接访问,而在上层应用程序中根本就做不到这一点。
万幸的是,在开发驱动程序的环境中有可以直接访问各个资源的函数,用户可以在驱动程序中实现对所需资源的访问。
三、PCI驱动程序的特点在设计驱动程序之前,首先要对欲控制的硬件设备进行细致地分析,更需要详细了解硬件设备的特性。
硬件设备的特性会对驱动程序设计产生重大的影响。
需要了解的最主要的硬件特性包括。
(1)设备的总线结构。
设备采用什么总线结构非常关键,因为不同的总线类型(如ISA和PCI)在许多硬件工作机制上是不同的,所以驱动程序设计也不同。
PCI与设备驱动开发经典图书
PCI与设备驱动开发经典图书1.《PCI Express 系统体系结构标准教材》本书全面论述了适用于许多系统和外设的当前最流行的第三代外围组件互连技术——PCI Express。
内容涵盖设计、验证和测试所需的信息,以及编写底层BIOS和设备驱动程序必需的背景知识。
MindShare公司是领先的硬件技术培训公司之一,为几十家公司提供创造性的课程,包括IBM、HP、PLX、Sun和德州仪器等。
本书选自该公司的PC系统体系结构系列丛书。
【作者】(美)Pavi Budruk Don Anderson Tom Shanley【出版社】电子工业出版社【出版日期】2005年11月版次:【I S B N】712101794 页数:【开本】小16开印张:【原价】¥62.02.《PCI总线设备开发宝典》详细介绍开发PCI总线设备的过程中所涉及的实际问题,包括PCI总线设备的电源分配、元器件的选择、配置芯片代码的编写、原理图和PCB图的设计、驱动程序与应用程序的设计以及安装和调试等。
从实践的角度出发,循序渐进,深浅得当。
读者从本书中既能学习到PCI总线的基本知识,也能学习到PCI总线设备开发和调试等实践知识。
附带光盘包含PCI 总线设备的基本SCH图、PCI9052芯片的封装图、使用DDK开发PCI总线设备驱动程序的源代码、中间层DLL程序、PCI总线设备的上层应用程序的源代码以及驱动程序的INF源代码等。
本书可作为高等院校本科和研究生的计算机教材使用,也可作为从事PCI总线硬件、软件设计与安装和调试等工作的通信、控制、电子技术人员和工程师人员的参考书籍。
【作者】尹勇李宇[同作者作品]【出版社】北京航空航天大学出版社【书号】7-81077-540-5【开本】16开【页码】328【出版日期】2005-2-1【版次】1-13.《PCI局部总线及其应用》PCI(外设部件互连)是当今个人计算机的主流总线结构,是微型计算机中处理器/存储器与外围控制部件、扩展卡之间的互连接口。
基于Windows2000操作系统的PCI卡WDM驱动程序开发
基于Windows2000操作系统的PCI卡WDM驱动程序开
发
文臣
【期刊名称】《四川理工学院学报(自然科学版)》
【年(卷),期】2005(018)001
【摘要】介绍了Windows2000下驱动程序的基本原理及WDM驱动程序的模型,并且以PLX 公司的PCI接口芯片PCI9052为例,提出了利用Numega公司的DriverWorks开发Windows2000下PCI驱动程序的方法以及应用程序的接口.【总页数】5页(P52-56)
【作者】文臣
【作者单位】电子科技大学电子工程学院,四川,成都,610054
【正文语种】中文
【中图分类】TP316
【相关文献】
1.基于PCI总线的实时测频卡WDM驱动程序设计 [J], 曾磊;陈铖;郭虹
2.基于CPCI的ARINC429总线通信卡的WDM驱动程序开发 [J], 魏超;苗克坚;杨成果
3.一种PCI总线高速数据传输卡WDM驱动程序开发 [J], 胡修林;刘可
4.Windows2000下PCI数据采集卡WDM驱动程序设计 [J], 张广华;苏秀琴;李哲
5.Windows2000/XP下基于PLX9052的WDM驱动程序开发 [J], 雷青锋
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PCI设备的WDM驱动程序设计柳泉罗耀华柳华伟摘要:本文详细地讨论了利用DDK开发PCI设备的WDM驱动程序的设计原理、方法及在设计中注意事项,实现了以芯片PCI9052开发的PCI卡的具有内存和I/O读写及中断处理的WDM驱动程序。
关键字:PCI,WDM,驱动程序,DDK在Windows操作系统中,为了保证系统的安全性和可移植性,对应用程序对硬件的操作进行了限制,尤其Windows 2000和Windows XP,不支持直接对系统的硬件资源的操作。
因而在设计开发PCI设备时,需要开发相应的驱动程序来实现对PCI设备的操作,用户应用程序通过驱动程序来访问PCI设备。
由于计算机硬件设备都存在不同的特点,因此各种设备的驱动程序也都有自己的特点,比如PCI设备、USB设备等等。
尽管在整体框架中基本相同,但设备功能上不同,因此本文以PCI桥芯片PCI9052开发的PCI卡为硬件设备,来探讨PCI设备的驱动程序的开发。
1.驱动程序类型和开发工具的选择在WINDOWS操作系统下,支持PCI总线及其设备的驱动程序类型有支持Windows 98/95的VxD、支持Windows NT的NT式驱动程序和支持Windows 2000、Windows XP 和Windows 98的WDM(Windows Driver Model)。
前两种驱动程序类型由于其支持的操作系统的逐渐淘汰而淘汰。
现在主流的操作系统是Windows 2000和Windows XP,因此开发PCI设备的驱动程序最好的方案是WDM驱动程序。
在一个系统中开发出WDM 驱动程序,稍加修改即可在其他系统中编译运行。
WDM是在Windows NT驱动程序体系的基础上发展而来的,修改或增加了即插即用、电源管理等功能,使之适应硬件和用户的要求。
开发WDM驱动程序的主要工具是微软为各操作系统提供的开发软件包Device Driver Kits(DDK) ,该软件包为驱动程序开发者提供了用于驱动程序开发的资源文件、编译连接程序、开发技术文档等。
还有第三方提供的开发工具:NuMega公司的DriverStudio和Jungo公司的WinDriver,这些工具是在DDK的基础上为方便开发用户而进行开发的工具。
在使用中,虽然利用DDK开发驱动程序难度较大,但是代码非常简洁,结构清晰,效率也高。
利用第三方开发工具使用简单,开发速度较快,但对于驱动程序的理解和深入开发不如DDK。
因此选择DDK开发PCI设备驱动程序,虽然开始会觉得非常复杂,但从执行效率和功能上会更有利。
2.PCI设备驱动程序的特点在开发驱动程序之前对PCI总线和硬件设备进行了解是十分必要的,而且还要详细地掌握PCI设备的特性以及PCI设备驱动程序在设备程序栈的关系等,以便进行WDM 驱动程序的设计。
PCI总线是一种高性能、与CPU无关的32/64位地址数据复用的总线,它支持突发传输、即插即用、电源管理等功能,不但能满足现在的应用需要,而且能够适应未来的需求。
PCI总线支持硬件资源动态自动配置,以支持即插即用。
在PCI设备插入PCI插槽或上电后,PCI总线配置机构自动根据PCI设备的要求实现配置。
PCI总线支持内存读写、I/O端口读写、中断机制和DMA功能。
由于这些硬件特点使PCI设备的WDM 驱动程序的设计变得很复杂。
在开发WDM驱动程序之前,还有必须掌握PCI设备的需要分配的资源等配置信息以及PCI设备的功能和操作方法。
在WDM中,采用了分层的驱动程序体系结构,总线驱动程序或类驱动程序在最底层直接与设备打交道,设备功能驱动程序在上层通过与低层驱动程序打交道,实现设备的功能,中间还可以有类过滤驱动程序或设备过滤驱动程序用于数据的过滤或转换。
在PCI总线的驱动程序层中,其层次图如图4:图1 通用PCI总线的WDM驱动程序栈在实际开发中,一般无需分很多层次,只需要开发一个设备驱动程序即可。
设备驱动程序直接与PCI总线驱动程序打交道,进行硬件操作,以实现PCI设备的功能。
3.WDM驱动程序的设计在PCI设备的WDM驱动程序中,一般是编写功能驱动程序。
PCI总线驱动程序由操作系统实现,过滤驱动程序一般在特殊的情况下需要编写。
因此本文只讨论PCI设备功能驱动程序的设计。
在PCI设备功能驱动程序中,需要处理PCI设备的内存、端口的读写、中断处理和DMA数据传输,实现PCI设备的功能,因此,PCI设备功能驱动程序是很标准的WDM设备驱动程序。
PCI设备驱动程序在框架上与其他类型的设备驱动程序基本相同,包括初始化、创建设备、卸载和删除设备、即插即用处理、分发例程处理、电源管理、WMI等部分,限于篇幅,在此只讨论PCI设备的特别之处。
(1)PCI设备资源的获得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设备的资源信息。
第四种方法是推荐的方法,当系统的PNP管理器在取得设备的资源后会自动向驱动程序发出IRP_MN_START_DEVICE的IRP,在该IRP栈中包含了设备的资源信息。
好的驱动程序都应该使用这种方法,在此主要讨论该方法。
每个支持PNP功能的驱动程序,都应实现IRP_MN_START_DEVICE处理。
在该IRP处理中应先交给低层驱动程序处理后,再根据IRP栈内内容进行资源分配。
如下:NTSTATUS PnpStartDevice(IN PDEVICE_OBJECT fdo, IN PIRP pIrp ){NTSTATUS status;PIO_STACK_LOCATION stack;pIrp->IoStatus.Status = STATUS_SUCCESS;//先由低层驱动程序处理,并等待KeInitializeEvent(&event,NotificationEvent,FALSE);IoCopyCurrentIrpStackLocationToNext(pIrp);IoSetCompletionRoutine(pIrp,(PIO_COMPLETION_ROUTINE) OnRequestComplete,(PVOID) &event,TRUE,TRUE,TRUE);status=IoCallDriver(((DEVICE_EXTENSION *)fdo->DeviceExtension) -> pLowerDeviceObject ,pIrp);if (status == STATUS_PENDING){KeWaitForSingleObject((PVOID)&event,Executive,KernelMode,FALSE,NULL);}if (!NT_SUCCESS(status)){return CompleteRequest(pIrp, status);}stack = IoGetCurrentIrpStackLocation(pIrp);ResourceRaw = stack->Parameters.StartDevice.AllocatedResources ->List[0].PartialResourceList->PartialDescriptors;Resource = stack->Parameters.StartDevice.AllocatedResourcesTranslated ->List[0].PartialResourceList->PartialDescriptors;for (i = 0; i < ResourceListRaw->Count; ++i, ++Resource, ++ResourceRaw){switch (ResourceRaw->Type){case CmResourceTypeInterrupt: //中断资源IrqL = (KIRQL) Resource->u.Interrupt.Level;//中断IRQLvector = Resource->u.Interrupt.Vector;//中断向量 affinity = Resource->u.Interrupt.Affinity;//中断分发的处理器集 //判断中断触发的类型if (ResourceRaw->Flags == CM_RESOURCE_INTERRUPT_LATCHED)mode = Latched; //低电平触发elsemode = LevelSensitive; //下降沿出发//是否共享,PCI中断都是共享的irqshare = Resource->ShareDisposition == CmResourceShareShared;//连接中断status = IoConnectInterrupt(&pdx->pInterruptObject, (PKSERVICE_ROUTINE)OnInterrupt,(PVOID)pdx,NULL,vector,IrqL,IrqL, mode, irqshare,affinity,FALSE);case CmResourceTypePort: //端口资源pdx->PhysicalIOBase = ResourceRaw->u.Port.Start;//开始物理地址pdx->IOCount = ResourceRaw->u.Port.Length;//地址数量pdx->IOBase = (ULONG *)MmMapIoSpace(pdx->PhysicalIOBase,pdx->IOCount,MmNonCached);//映射端口break;case CmResourceTypeMemory: //内存资源pdx->PhysicalMemBase = ResourceRaw->u.Memory.Start;//开始地址pdx->MemCount = ResourceRaw->u.Memory.Length;//地址数量pdx->MemBase = (ULONG *)MmMapIoSpace(pdx->PhysicalMemBase,pdx->MemCount,MmNonCached);//映射内存if (pdx->MemBase == NULL)return STATUS_INSUFFICIENT_RESOURCES;//其他资源一般没有,可默认处理default:break;}}return STATUS_SUCCESS;}在以上的代码中,限于篇幅,没有增加错误处理代码,在实际中应用一定需要进行在调用系统函数之后,进行相应的处理,如果不符合要求,立即退出,否则在其他例程中会发生错误,使系统崩溃。