您的位置:首页 > 其它

如何创建用于WindowsNT PCI 设备驱动程序

2007-01-09 14:38 363 查看
概要
本文介绍如何创建用于 WindowsNT PCI 设备驱动程序。 设备驱动程序必须执行许多功能, 如创建设备对象等。 此外, 还有许多更功能驱动程序必须执行以支持 PCI 设备驱动程序初始化期间。 注意一些函数下面提到的是同时使用 PCI 非驱动程序中。
更多信息
下面是必需步骤以完成此任务:

1.
查找与 HalGetBusData PCI 设备:

扫描所有总线和插槽到 PCI 设备位置。 寻找匹配设备 PCI VendorId 和 DeviceId 由 HalGetBusData, 返回缓冲区中。

如果设备驱动程序要求 PCI 配置空间, 附加信息使用 HalGetBusData 或 HalGetBusDataByOffset。 PCI 配置空间中字段可设置与 HalSetBusData 或 HalSetBusDataByOffset。

要点: 不要在 PCI 配置空间设置基址寄存器 (BARs) 或中断信息。 还, 不希望 BARs 原始设置将那些程序将被用于设备。 由于 PCI 是动态配置, 操作系统保留权利移 BARs 看到它根据。

查找 PCI 设备带有 3 FOR 循环: 一个用于总线, 一个用于设备号, 和一个用于函数编号。 注意, PCI_SLOT_NUMBER 结构包含设备号和函数数字信息。
2.
索求设备资源与 HalAssignSlotResources:

一旦 PCI 设备位于, 传递到 HalAssignSlotResources 总线和插槽信息。 此 API 确保有是与配置空间中指定资源冲突的。 当进行调用 HalAssignSlotResources, HAL 可能移动设备的内存或端口范围, 因此不使用值直接从配置空间。 相反, 使用资源列表中返回值和转换它们在步骤 4 和 5 下面如下。 自行 HAL 不移动设备资源, 移动资源仅因 HalAssignSlotResources 调用。

调用以 HalAssignSlotResources 将有时 HAL 移动顶部有尚未被占用, 其他 PCI 设备 PCI 设备资源时导致问题。 通常可以通过向 Boot.ini 文件添加 PCILOCK 选项防止此。 有关 PCILOCK 选项, 请参阅下列 Microsoft 知识库文章:

148501 (http://support.microsoft.com/kb/148501/EN-US/) 防止 Intel 计算机上 PCI 资源冲突

PCI 设备资源如果添加 PCILOCK 选项不起作用, 应该被声明与 IoReportResourceUsage。

使用 IoReportResourceUsage 代替 HalAssignSlotResources:

偶尔, PCI 设备停止文章地址寄存器是 reprogrammed 或 PCI 设备只与特定资源分配工作时正常。 这些 PCI 设备, 上 HalAssignSlotResources 经常失败。 在这些情况下, 使用 IoReportResourceUsage 代替 HalAssignSlotResources。

要使用 IoReportResourceUsage, 通过读取通过 HalGetBusData / HalGetBusDataByOffset PCI 设备配置空间获取当前设备设置。 生成资源列表根据 PCI 配置空间中的信息并声明使用 IoReportResourceUsage 资源。 值得以确保正确到 PCIBus InterfaceType 资源列表。 还, PCI 中断始终认为敏感级别并共享, 因此确保都设置正确标记资源列表中。

选中生成驱动程序运行时从配置空间返回中断值可能外观超出范围。 这是因为将独占签 HAL - 或 (XOR) true 中断值与 0x2B。 使用由 HalGetBusData / HalGetBusDataByOffset unmodified 因为 HAL 会知道如何解释此值返回值。 使用此资源列表中返回值对于 IoReportResourceUsage 以及对于 BusInterruptLevel 和 BusInterruptVector 参数用于 HalGetInterruptVector 调用。
3.
分析设备资源资源列表:

HalAssignSlotResources 将声称 PCI 设备资源并返回 CM_RESOURCE_LIST 结构中所声明资源。 驱动程序将不得不分析此资源列表以获取中断, 内存范围和 I/O 区域信息。 注意, 单个 PCI 设备可拥有多内存和 I / O 范围。 对于以后转换驱动程序设备扩展中必要, 保存此信息。 不使用原始资源信息来访问 I / O 或内存空间。

此时, 如果驱动程序都要检查 PCI 配置空间, BARs 应与那些 CM_RESOURCE_LIST 结构中返回相同。 但是, 使用资源列表中返回信息。

如果 PCI 资源与 IoReportResourceUsage, 已占用分析驱动程序生成并存储在一个相应驱动程序位置信息资源列表。
4.
对每个内存区域占用, 调用 HalTranslateBusAddress 和 MmMapIoSpace:

HalTranslateBusAddress 将特定总线地址转换为相应系统的逻辑地址。 调用该 API, 之后检查四个参数。 在进入 API, 零表示内存空间。 驱动程序从 API, 退出上如果值为零, 仍原样对于内存转换, 正常情况必须也调用 MmMapIoSpace。

保存像设备扩展驱动程序访问区域中翻译内存区域信息。 使用翻译范围来访问内存空间。
5.
对于占用, 每个 I / O 范围调用 HalTranslateBusAddress, 并且如果需要, MmMapIoSpace:

与该映射是类似的内存空间。 然而, 在进入 HalTranslateBusAddress, 四个参数是一个, 表示 I/O 空间的。 退出, 上 API 可能改变此参数以零, 驱动程序在此情况下必须也调用 MmMapIoSpace。

保存像设备扩展驱动程序访问区域中翻译 I/O 区域信息。 使用翻译范围来访问 I/O 空间。

某些, RISC 系统上没有 I/O 空间不足: I/O 空间被映射到内存空间。 这时, 四个参数将更改以指示 I/O 空间, 已被映射到内存空间。 上一个 x 86 - 基于系统, 翻译 I/O 空间将使用 HalTranslateBusAddress, 但不 MmMapIoSpace。 某些, RISC 系统上可能称为 HalTranslateBusAddress 和 MmMapIoSpace。 值得到此 API 调用后检查 HalTranslateBusAddress 四个参数。

从 x 移植时这是一个常见问题 86 的计算机到 RISC 平台。 驱动程序编写有时假定它们如果它们是翻译 I/O 范围, 将从不需要调用 MmMapIoSpace。 这是正确假设。
6.
如果设备支持中断, 调用 HalGetInterruptVector 和 IoConnectInterrupt:

一旦已经调用 IoConnectInterrupt, 如果 PCI 设备是中断可能调用驱动程序中断服务例程 (ISR)。 由于这个原因, 最好是要转换所有设备注册后连接中断。 如果不发生以前转换或信息是无法 ISR ISR 将不能够检查 PCI 设备注册并清除中断 (如果, 例如, 翻译内存和 I / O 范围不保存在设备扩展),。 如果不清除中断, 将挂起系统。



回到顶端
参考
请有关概述了 WindowsNT 设备驱动程序参阅 WindowsNT 设备驱动程序工具包、 内核模式驱动程序、 设计指南。 是在 WindowsNT 设备驱动程序工具包, 内核模式驱动程序, 参考部分中详细解释上述 API 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息