USB 驱动程序

USB 总线的内核模式静态映像驱动程序支持单个控制终结点,以及多个中断、批量 IN 和批量 OUT 终结点。 可以使用 I/O 控制代码和 DeviceIoControl 访问控制和中断终结点。 可以使用 ReadFileWriteFile 访问批量终结点。

在调用 DeviceIoControlReadFileWriteFile 之前,必须调用 CreateFile (Microsoft Windows SDK文档) 中所述的所有操作以获取设备句柄。 对于支持每个终结点类型中不超过一个的设备, (控制、中断、批量 IN、批量 OUT) ,对 CreateFile 的单个调用会打开到每个终结点的传输管道。

对于支持多个中断或批量终结点的设备,对 CreateFile 的单个调用会打开到每种类型编号最高的终结点的传输管道。 如果要使用不同的终结点,必须执行以下操作:

  1. 调用 DeviceIoControl,将 I/O 控制代码指定 为 IOCTL_GET_PIPE_CONFIGURATION,以确定端口的终结点索引号 (即返回 的USBSCAN_PIPE_INFORMATION 结构数组) 的索引。 请注意,这些索引号不是通用串行总线规范中描述的终结点编号。

  2. 调用 CreateFile 时,将反斜杠和终结点的索引号追加到 IStiDeviceControl::GetMyDevicePortName 返回的端口名称。

例如,假设端口名称为“usbscan0”的设备 () 有两个终结点,每种终结点 (中断类型:bulk IN、bulk OUT) ,索引号如下所示:

索引 类型 端点#
0 中断 0x01
1 批量 IN 0x82
2 批量 IN 0x83
3 批量输出 0x04
4 批量输出 0x05
5 中断 0x06

如果调用端口名称为“usbscan0”的 CreateFile ,则函数会打开指向索引值为 2、4 和 5 的终结点以及控制终结点的传输管道。

如果调用端口名称为“usbscan0\1”的 CreateFile ,该函数将打开指向索引值为 1、4 和 5 的终结点以及控制终结点的传输管道。

对于此设备,如果要使用中断终结点 0、批量 IN 终结点 1 和批量 OUT 终结点 3,请调用 CreateFile 三次,并指定端口名称“usbscan0\0”、“usbscan0\1”和“usbscan0\3”。 这会创建三个设备句柄。 每当对 DeviceIoControlReadFileWriteFile 进行后续调用时,都应指定与所需管道关联的设备句柄。

由于仅支持一个控制终结点,因此指定使用控制管道的任何 I/O 控制代码都会导致驱动程序使用正确的终结点,无论哪个终结点 (是否向 CreateFile 指定了任何) 。

有关所有 I/O 控制代码的说明,请参阅 USB 静止图像 I/O 控制代码

内核模式 USB 驱动程序不实现包或消息协议。 读取操作不需要任何特定的数据包对齐,但如果读取请求与最大数据包大小边界对齐,则可以获得更好的性能。 可以使用 IOCTL_GET_CHANNEL_ALIGN_RQST I/O 控制代码获取最大数据包大小。