SPB 连接的外围设备的连接 ID
驱动程序必须先打开与设备的逻辑连接,然后驱动程序才能在 简单外围总线 (SPB) 向外围设备发送 I/O 请求。 通过此连接,驱动程序可以发送读取和写入请求,以将数据传输到设备或从设备传输数据。 此外,驱动程序可以将 I/O 控制 (IOCTL) 请求发送到设备以执行特定于 SPB 的操作。
在系统启动时,即插即用 (PnP) 管理器枚举 PnP 设备和非 PnP 设备。 对于与 SPB 有固定连接的非 PnP 外围设备,PnP 管理器会查询硬件平台的 ACPI 固件,以获取描述如何访问设备的一组连接参数。 这些连接参数标识设备连接到的总线的 SPB 控制器,并包含控制器与设备通信所需的其他信息,例如总线地址和总线时钟频率。
PnP 管理器将标识符(称为 连接 ID)分配给 SPB 连接的外围设备的连接参数。 PnP 管理器将此 ID 和连接参数一起存储在名为 资源中心的系统数据存储中。 (资源中心是一个内部数据存储,其中 PnP 管理器存储有关 SPB 连接的外围设备的配置信息。) 连接 ID 封装这些参数,以便驱动程序无需显式提供这些参数。
SPB 连接的外围设备的驱动程序接收设备的连接 ID,作为驱动程序分配的硬件资源的一部分。 当外围设备的驱动程序调用系统函数以打开与设备的连接时,驱动程序将提供连接 ID,该连接 ID 用于从资源中心检索设备的连接参数。
驱动程序开发人员可以使用 用户模式驱动程序框架 (UMDF) 或 内核模式驱动程序框架 (KMDF) 为 SPB 连接的外围设备生成驱动程序。 当框架调用驱动程序的 IPnpCallbackHardware2::OnPrepareHardware 方法时,UMDF 驱动程序接收其资源 (,其中包括连接 ID) 。 KMDF 驱动程序在 EvtDevicePrepareHardware 回调期间接收其硬件资源。
若要使 UMDF 外围驱动程序能够接收其资源列表中的连接 ID,安装驱动程序的 INF 文件必须在其特定于 WDF 的 DDInstall 节中包含以下指令:
UmdfDirectHardwareAccess = AllowDirectHardwareAccess 有关此指令的详细信息,请参阅 在 INF 文件中指定 WDF 指令。 有关用于生成使用此指令的相应 INF 文件) (INX 文件的示例,请参阅 SpbAccelerometer 驱动程序示例。
驱动程序作为资源接收的连接 ID 是 64 位整数,但驱动程序必须将此 ID 合并到可用于从资源中心检索连接参数的设备路径名称中。 若要创建设备路径名称,驱动程序会调用 RESOURCE_HUB_CREATE_PATH_FROM_ID 函数,该函数在 Reshub.h 头文件中声明。
若要打开与 SPB 连接的外围设备的逻辑连接,UMDF 驱动程序调用 IWDFRemoteTarget::OpenFileByName 方法,KMDF 驱动程序调用 WdfIoTargetOpen 方法。 任一方法都需要设备路径名称作为输入参数。
有关使用连接 ID 打开与 SPB 连接的外围设备的逻辑连接的 UMDF 和 KMDF 代码示例,请参阅以下主题:
用于User-Mode SPB 外围设备驱动程序的硬件资源 适用于Kernel-Mode SPB 外围驱动程序的硬件资源 用户模式应用程序无法打开与 SPB 连接的外围设备的逻辑连接,也无法直接向这些设备发送 I/O 请求。
一次只能有一个驱动程序与 SPB 连接的外围设备保持开放逻辑连接。 另一个驱动程序尝试打开与同一设备的第二个连接失败。