Поделиться через


USB-драйвер

Драйвер образа в режиме ядра для USB-шин поддерживает одну конечную точку управления, а также несколько конечных точек прерывания, массового входа и массового выхода. Конечные точки управления и прерывания доступны с помощью кодов управления ввода-вывода и DeviceIoControl. Массовые конечные точки доступны с помощью ReadFile и WriteFile.

Перед вызовом DeviceIoControl, ReadFile или WriteFile необходимо вызвать CreateFile (описано в документации по Microsoft Windows SDK), чтобы получить дескриптор устройства. Для устройств, поддерживающих не более одного типа конечной точки (управление, прерывание, массовое вхоление, массовый выход), один вызов CreateFile открывает каналы передачи в каждую конечную точку.

Для устройств, поддерживающих несколько конечных точек прерываний или массовых операций, один вызов CreateFile открывает каналы передачи в конечную точку с наибольшим номером каждого типа. Если вы хотите использовать другую конечную точку, выполните следующие действия.

  1. Вызовите DeviceIoControl, указав код элемента управления вводом-выводом IOCTL_GET_PIPE_CONFIGURATION, чтобы определить номера индекса конечной точки порта (то есть индексы в возвращаемом массиве структуры USBSCAN_PIPE_INFORMATION ). Обратите внимание, что эти номера индексов не являются номерами конечных точек, описанными в спецификации универсальной серийной шины.

  2. Добавьте обратную косую черту и номер индекса конечной точки к имени порта, возвращаемого методом IStiDeviceControl::GetMyDevicePortName при вызове CreateFile.

Например, предположим, что устройство (с именем порта "usbscan0") имеет две конечные точки каждого типа (прерывание, массовое входное подключение, массовый выход) с номерами индексов следующим образом:

Индекс Тип Конечной точки#
0 Прервать 0x01
1 Массовое в 0x82
2 Массовое в 0x83
3 Массовый выход 0x04
4 Массовый выход 0x05
5 Прервать 0x06

При вызове CreateFile с именем порта usbscan0 функция открывает каналы передачи к конечным точкам со значениями индекса 2, 4 и 5, а также к конечной точке управления.

При вызове CreateFile с именем порта "usbscan0\1" функция открывает каналы передачи к конечным точкам со значениями индекса 1, 4 и 5, а также к конечной точке управления.

Для этого устройства, если вы хотите использовать конечную точку прерывания 0, конечную точку массового входа 1 и конечную точку массового выхода 3, вызовите CreateFile три раза, указав имена портов "usbscan0\0", "usbscan0\1" и "usbscan0\3". При этом создаются три дескриптора устройства. При каждом последующем вызове DeviceIoControl, ReadFile или WriteFile следует указать дескриптор устройства, связанный с нужным каналом.

Так как поддерживается только одна конечная точка элемента управления, указание любого кода элемента управления ввода-вывода, использующего канал управления, приводит к тому, что драйвер будет использовать соответствующую конечную точку независимо от того, какая конечная точка (если она есть) была указана для CreateFile.

Описание всех кодов элементов управления вводом-выводом см. в разделе Коды элементов управления вводом-выводом с изображениями USB.

Драйвер USB в режиме ядра не реализует пакет или протокол сообщений. Операции чтения не требуют определенного выравнивания пакетов, но можно добиться более высокой производительности, если запросы на чтение соответствуют ограничениям максимального размера пакета. Максимальный размер пакета можно получить с помощью кода элемента управления IOCTL_GET_CHANNEL_ALIGN_RQST ввода-вывода.