使用 SPB I/O 请求接口

从 Windows 8 开始,SPB 框架扩展 (SpbCx) 是一个系统提供的组件,支持 SPB I/O 请求接口。 SPB 外围设备驱动程序使用该接口向连接到 I²C、SPI 和其他简单外围总线 (SPB) 的设备来发送 I/O 请求。 通过在各种总线类型中提供标准化的 I/O 请求接口,SpbCx 简化了为各种硬件平台和不同硬件供应商的 SPB 控制器的外围设备系列提供驱动程序支持的任务。

如果满足以下条件,SPB 连接外围设备的硬件供应商就可以开发一个可在多种总线类型中运行的设备驱动程序:

  • 外围设备的硬件必须与这些总线兼容。
  • 驱动程序可在所有这些总线类型中使用相同的设备控制协议。

通过消除外围驱动程序中的特定总线代码,SPB 框架扩展缩短了这些驱动程序的开发时间,并确保所支持总线类型的行为更加一致。

连接到 SPB 的外围设备没有内存映射,这些设备的驱动程序无法直接访问这些设备的硬件寄存器。 相反,SPB 外围设备驱动程序必须依靠 SPB 控制器来串行传输数据。 要请求这种传输,驱动程序必须向设备发送 I/O 请求。 此 I/O 请求会被发送到由 SpbCx 管理的队列中。

SpbCx 与 SPB 控制器驱动程序合作,处理来自驱动程序的 I/O 请求。 SPB 控制器的硬件供应商提供 SPB 控制器驱动程序,以执行控制器硬件的特定任务。

只有驱动程序才能向 SPB 控制器的 I/O 请求接口发送 I/O 请求。 应用程序无法直接向 SPB 控制器发送 I/O 请求。 相反,应用程序可以向 SPB 连接的外围设备的驱动程序发送 I/O 请求,然后依靠驱动程序向 SPB 控制器发送与设备之间传输数据所需的任何 I/O 请求。

在向 SPB 连接的外围设备发送 I/O 请求之前,驱动程序必须打开与设备的逻辑连接。 要打开此连接,驱动程序会使用从即插即用管理器作为硬件资源接收到的连接 ID。 有关详细信息,请参阅 SPB 外围设备的连接 ID

SpbCx 和 SPB 控制器驱动程序共同处理 SPB 连接外围设备的读写请求。 在响应 IRP_MJ_READ 请求时,SPB 控制器将指定数量的字节从外围设备传输到驱动程序提供的缓冲区。 在响应 IRP_MJ_WRITE 请求时,SPB 控制器将指定数量的字节从驱动程序提供的缓冲区传输到外围设备。

对于传输零字节的 IRP_MJ_READIRP_MJ_WRITE 请求,SpbCx 以 STATUS_SUCCESS 状态代码完成请求,但不执行任何操作。

SpbCx 和 SPB 控制器驱动程序还会处理这些 SPB 专用 I/O 控制代码 (IOCTL):

SPB 外围驱动器使用这些 IOCTL 来执行 I/O 传输序列。 I/O 传输序列是一组有序的总线传输(读写操作),作为单个原子总线操作来执行。 有关这些 IOCTL 的详细信息,请参阅 I/O 传输序列

特定 SPB 控制器的 SPB 控制器驱动程序可能支持执行硬件特定功能的自定义 IOCTL。 这些是 SpbCx 不会处理的 IOCTL,SPB 控制器的硬件供应商支持这些 IOCTL,以便 SPB 外围设备驱动程序执行特定于硬件的操作。 如果 SPB 外围设备驱动程序发送了 SpbCx 和 SPB 控制器驱动程序都无法识别的 IOCTL,则不会执行任何操作,I/O 请求将以 STATUS_NOT_SUPPORTED 错误状态值完成。

SPB 连接外围设备的驱动程序通常是用户模式驱动程序框架 (UMDF) 驱动程序或内核模式驱动程序框架 (KMDF) 驱动程序。 要向 SPB 连接的外围设备发送读取、写入或 IOCTL 请求,UMDF 驱动程序会调用 IWDFIoRequest::Send 等方法。 KMDF 驱动程序会调用 WdfIoTargetSendReadSynchronouslyWdfIoTargetSendWriteSynchronouslyWdfIoTargetSendIoctlSynchronously 等方法。

有关如何向 SPB 连接的外围设备发送 I/O 请求的代码示例,请参阅以下主题:

用户模式 SPB 外设驱动程序的硬件资源

内核模式 SPB 外设驱动程序的硬件资源