在 IEEE 1394 总线上发送异步 I/O 请求数据包

驱动程序使用REQUEST_ASYNC_READ、REQUEST_ASYNC_WRITE和REQUEST_ASYNC_LOCK将异步读取、写入和锁定操作发送到 IEEE 1394 总线上的设备。 对于REQUEST_ASYNC_READ和REQUEST_ASYNC_WRITE,IRB 的操作特定参数存储在 IRB 的 u.AsyncReadu.AsyncWrite 成员中。

寻址类型

发出异步 I/O 请求的驱动程序必须在 IRB 的 DestinationAddress 成员中指定类型为 IO_ADDRESS 的目标地址。 目标地址由两个值组成:节点地址和地址偏移量。 总线驱动程序为这两个值提供的解释取决于启动请求的驱动程序使用的寻址模式。

有三种寻址模式可用于发送异步 1394 数据包: 正常原始虚拟

在正常模式下,启动请求的驱动程序会提供地址偏移,但不指定目标设备的节点地址。 总线驱动程序使用枚举设备时存储在设备的 PDO 中的信息填充节点地址。

在原始模式寻址中,启动请求的驱动程序必须同时提供节点地址和地址偏移量。 此外,驱动程序必须将请求发送到主机控制器的 PDO,而不是将请求发送到目标设备的 PDO。 这会通知总线驱动程序,它不应覆盖数据包中的节点地址信息。

在虚拟模式寻址中,启动请求的驱动程序必须显式指示数据包中目标设备的节点地址,就像在原始模式寻址中一样。 但是,虚拟设备在 1394 总线上没有真正的节点地址。 虚拟设备的节点地址只是一个按约定建立的值,该约定允许虚拟设备的驱动程序标识其数据包。 正常运行时,虚拟设备驱动程序应接收在总线上广播的所有数据包,并筛选这些数据包,以搜索包含其设备“节点地址”的预先建立值的数据包。

启动虚拟设备请求的驱动程序不需要采取任何特殊步骤来防止总线驱动程序覆盖数据包中记录的节点地址。 当总线驱动程序首次枚举虚拟设备时,它会在设备的 PDO 的设备扩展中设置一个标志,指示该设备是虚拟的。 在收到对此设备的请求时,总线驱动程序能够验证它是虚拟设备,并且不会覆盖数据包中的节点地址。

I/O 请求的缓冲

启动异步 I/O 请求的驱动程序必须提供指向指定 I/O 缓冲区的 MDL 的指针。 它将此指针置于 IRB 的 Mdl 成员中。 总线驱动程序使用此缓冲区复制它从设备读取的数据,或作为写入设备的数据的源。

驱动程序在 u.AsyncXXXnNumberOfBytesToReadnNumberOfBytesToWrite 成员中指定数据缓冲区的大小,以及 nBlockSize 成员中的块大小。 当事务实际发生时,总线驱动程序会将数据分解为 nBlockSize 中指定的大小的数据包。 默认情况下,总线驱动程序连续读取或写入数据:从设备地址空间中的连续位置读取或写入每个块。

下图演示了连续数据块。

说明连续数据块的示意图。

(可选)驱动程序可以为请求指定ASYNC_FLAGS_NONINCREMENTING标志;然后,总线驱动程序将为每个块使用相同的地址集。

下图演示了异步非递增数据块。

说明异步非递增数据块的示意图。

警告 总线驱动程序强制实施设备与计算机之间当前连接速度的最大异步数据包大小,以及设备在其配置 ROM 的MAX_REC字段中报告的最大速度。 如果 nBlockSize 大于其中任一值,则总线驱动程序对块大小使用强制值。 如果驱动程序设置ASYNC_FLAGS_NONINCREMENTING标志,则不太可能提供所需的行为。 如果驱动程序设置了此标志,则应在提交请求之前检查块大小小于强制限制。

发送锁定请求

IEEE 1394 总线协议提供异步锁请求,允许原子、测试和设置类型操作。 除了在 u.AsyncLock.DestinationAddress) 中指定目标地址 (外,驱动程序还指定 u.AsyncLock.fulTransactionType) 中的事务类型 (。 有关在 u.AsyncLock.DataValues 和 u.AsyncLock.Arguments 中传递) 的详细信息,请参阅 IEEE 1394 规范 (操作的数据值和 参数值。

总线重置生成

使用异步 I/O 的设备驱动程序会跟踪总线重置的生成。 在每个异步请求中,设备驱动程序在 IRB 的 u.AsyncXxx.ulGeneration 成员中报告该请求的值。 总线驱动程序将该值与实际生成计数进行比较,如果它们无法匹配,则会使请求失败,状态值为 STATUS_INVALID_GENERATION。 如果请求以这种方式失败,驱动程序应使用 REQUEST_GET_GENERATION_COUNT 总线请求查询正确的生成。 但是,在驱动程序在其总线重置通知回调中检索新一代之前,驱动程序不应重新发出任何具有此状态失败的请求。 这可确保设备仍存在于总线上。 请注意,客户端驱动程序不应依赖于IRP_MN_BUS_RESET收到总线重置通知。 IRP_MN_BUS_RESET在 Windows XP 及更高版本的操作系统中已过时。