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


структура _URB_ISOCH_TRANSFER (usb.h)

Структура _URB_ISOCH_TRANSFER используется драйверами USB-клиента для отправки данных в или извлечения данных из изохронного канала передачи.

Синтаксис

struct _URB_ISOCH_TRANSFER {
  struct _URB_HEADER         Hdr;
  USBD_PIPE_HANDLE           PipeHandle;
  ULONG                      TransferFlags;
  ULONG                      TransferBufferLength;
  PVOID                      TransferBuffer;
  PMDL                       TransferBufferMDL;
  struct _URB                *UrbLink;
  struct _URB_HCD_AREA       hca;
  ULONG                      StartFrame;
  ULONG                      NumberOfPackets;
  ULONG                      ErrorCount;
  USBD_ISO_PACKET_DESCRIPTOR IsoPacket[1];
};

Члены

Hdr

Указатель на структуру _URB_HEADER, указывающую сведения о заголовке URB. функции Hdr.Function должны быть URB_FUNCTION_ISOCH_TRANSFER, а hdr.Length должен быть размером этой структуры данных переменной длины.

PipeHandle

Указывает непрозрачный дескриптор для изохронного канала. Драйвер контроллера узла возвращает этот дескриптор, когда драйвер клиента выбирает конфигурацию устройства с типом URB URB_FUNCTION_SELECT_CONFIGURATION или когда драйвер клиента изменяет параметры интерфейса с urB типа URB_FUNCTION_SELECT_INTERFACE.

TransferFlags

Указывает ноль, один или сочетание следующих флагов:

Ценность Значение
USBD_TRANSFER_DIRECTION_IN
Устанавливается для запроса данных с устройства. Чтобы передать данные на устройство, этот флаг должен быть снят.
USBD_SHORT_TRANSFER_OK
Устанавливается, чтобы контроллер узла не возвращал ошибку при получении пакета от устройства, которое меньше максимального размера пакета для конечной точки. Этот флаг не влияет на изохронный канал, так как драйвер шины не возвращает ошибку при получении коротких пакетов на изохронном канале.
USBD_START_ISO_TRANSFER_ASAP
Вызывает передачу на следующем кадре, если передача не была отправлена в канал с момента открытия или последнего сброса канала. В противном случае передача начинается на первом кадре, который следует всем текущим очередным запросам для канала. Фактический кадр, на который начинается передача, будет скорректирован для задержки шины драйвером контроллера узла.

TransferBufferLength

Указывает длину буфера, указанного в TransferBuffer или описанном в TransferBufferMDL. Драйвер контроллера узла возвращает количество байтов, отправленных в канал или считываемых из канала в этом элементе.

TransferBuffer

Указатель на буфер резидента для передачи null, если MDL предоставляется в TransferBufferMDL. Содержимое этого буфера зависит от значения TransferFlags. Если указана USBD_TRANSFER_DIRECTION_IN, этот буфер будет содержать данные, считываемые с устройства при возврате от драйвера контроллера узла. В противном случае этот буфер содержит данные, предоставленные драйвером для передачи на устройство.

TransferBufferMDL

Указатель на MDL, описывающий резидентный буфер, NULL, если буфер предоставляется в TransferBuffer. Содержимое буфера зависит от значения TransferFlags. Если указана USBD_TRANSFER_DIRECTION_IN, описанный буфер будет содержать данные, считываемые с устройства при возврате от драйвера контроллера узла. В противном случае буфер содержит предоставленные драйвером данные для передачи на устройство. Этот MDL-файл должен быть выделен из непагрегированного пула.

UrbLink

Скрытный. Не используйте.

hca

Скрытный. Не используйте.

StartFrame

Указывает номер кадра, на который должна начинаться передача. Эта переменная должна находиться в системном диапазоне текущего кадра. Диапазон определяется константой USBD_ISO_START_FRAME_RANGE.

Если START_ISO_TRANSFER_ASAP задан в TransferFlags, этот элемент содержит номер кадра, на который началась передача, когда запрос возвращается драйвером контроллера узла. В противном случае этот элемент должен содержать номер кадра, на который начинается передача.

NumberOfPackets

Указывает количество пакетов, описанных членом массива переменной длины IsoPacket.

ErrorCount

Содержит количество пакетов, завершенных с условием ошибки при возврате от драйвера контроллера узла.

IsoPacket[1]

Содержит массив USBD_ISO_PACKET_DESCRIPTOR структур переменной длины, описывающих пакеты передачи изохронных пакетов, передаваемых на USB-шине. Дополнительные сведения об этом члене см. в разделе "Примечания".

Замечания

Драйвер USB-шины всегда возвращает значение USBD_STATUS_SUCCESS в hdr.Status, если только каждый пакет в передаче не создал ошибку или запрос не был хорошо сформирован и не может быть выполнен вообще. В следующей таблице приведены возможные коды ошибок, возвращенные в hdr.Status.

Значение ошибки Значение
USBD_STATUS_ISOCH_REQUEST_FAILED Указывает, что каждый пакет изохронного запроса был завершен с ошибками.
USBD_STATUS_BAD_START_FRAME Указывает, что запрошенный начальный кадр не находится в USBD_ISO_START_FRAME_RANGE текущего USB-кадра.
USBD_ISO_NOT_ACCESSED_LATE Указывает, что каждый пакет был отправлен слишком поздно для отправки пакета на основе запрошенного начального кадра.
USBD_STATUS_INVALID_PARAMETER Указывает, что один из параметров URB был неверным.
 

Прежде чем контроллер узла отправляет изохронный запрос на USB-устройство, требуется информация о конечной точке устройства, в которую он должен отправлять или получать данные. Эти сведения хранятся в дескрипторах конечной точки (USB_ENDPOINT_DESCRIPTOR), которые извлекаются из выбранного дескриптора конфигурации. После того как драйвер шины получает дескриптор конечной точки, он создает изохронный канал передачи данных для настройки передачи данных. Атрибуты канала хранятся в USBD_PIPE_INFORMATION структуре. Для изохронной передачи члены задаются следующим образом:

  • Элемент PipeType указывает тип передачи и имеет значение UsbdPipeTypeIsochronous.
  • Элемент MaximumPacketSize указывает объем данных в байтах, составляющий один пакет. Для изохронной передачи размер пакета фиксирован и может быть значением от 0 до 1024. Размер пакета равен или меньше значения wMaxPacketSize дескриптора конечной точки.
  • Элемент интервала является производным от значения bInterval дескриптора конечной точки. Это значение используется для вычисления периода опроса, указывающего частоту отправки данных на шине. Для устройств с полной скоростью период измеряется в единицах в 1 миллисекундах кадров; для устройств с высокой скоростью период измеряется в микрофреймах.
Контроллер узла также определяет объем данных, которые можно передать (в кадре или микрофрейме) в зависимости от типа устройства. Эта информация доступна в битах 12.. 11wMaxPacketSize в дескрипторе конечной точки.

Для устройств с полной скоростью можно передать только один пакет в кадре; биты 12.. 11 зарезервированы и заданы равным нулю.

Для устройств с высокой скоростью данные могут передаваться в одном пакете или охватывать несколько пакетов в микрофрейме. Если биты 12.. Для 11 задано значение n, можно передавать (n+1)*MaximumPacketSize байтов на микрофрейм. Биты 12.. Значение 11, равное нулю, указывает, что в микрофрейме может передаваться только один пакет. Если биты 12.. Для 11 задано значение 1, контроллер узла может передавать два пакета в микрофрейм.

Элемент IsoPacket_URB_ISOCH_TRANSFER представляет собой массив USBD_ISO_PACKET_DESCRIPTOR, описывающий макет буфера передачи. Каждый элемент в массиве коррелирует с данными, передаваемыми в одном микрофрейме. Если IsoPacket имеет элементы n, контроллер узла передает n кадров (для устройств с полной скоростью) или микрофреймов (для высокоскоростных устройств) для передачи данных. IsoPacket[i]. Смещение элемент используется для отслеживания объема данных для отправки или получения. Это делается путем задания смещения байтов с начала всего буфера передачи для запроса.

Например, существует пять микрофреймов, доступных для передачи 1024 байтовых пакетов.

Если биты 12.. Для 11 задано значение нуля (указывающее один пакет на передачу микрофрейма), IsoPacket содержит следующие записи:

Микрофрейм 1 IsoPacket.Element[0].Offset = 0 (начальный адрес)

Микрофрейм 2 IsoPacket.Element[1].Offset = 1024

Микрофрейм 3 IsoPacket.Element[2].Offset = 2048

Микрофрейм 4 IsoPacket.Element[3].Offset = 3072

Микрофрейм 5 IsoPacket.Element[4].Offset = 4096

Если биты 12.. Для 11 задано значение 1 (указывающее два пакета на микрофрейм), IsoPacket содержит следующие записи:

Микрофрейм 1 IsoPacket.Element[0].Offset = 0 (начальный адрес)

Микрофрейм 2 IsoPacket.Element[1].Offset = 2048

Микрофрейм 3 IsoPacket.Element[2].Offset = 4096

Микрофрейм 4 IsoPacket.Element[3].Offset = 6144

Микрофрейм 5 IsoPacket.Element[4].Offset = 8192

Примечание Для нескольких пакетов значение смещения указывает размеры всех пакетов в микрофрейме.

IsoPacket[i]. Длина члена обновляется контроллером узла, чтобы указать фактическое количество байтов, полученных от устройства для передачи изохронных операций IN. IsoPacket[i]. Длина не используется для передачи изохронных операций out.

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

Элементы TransferBuffer или TransferBufferMDL должны указывать практически непрерывный буфер.

Обработайте другие элементы, которые являются частью этой структуры, но не описаны здесь как непрозрачные. Они зарезервированы для использования системы.

Требования

Требование Ценность
заголовка usb.h (включая usb.h)

См. также

Как передавать данные в usb-точек изохронных конечных точек

URB

СТРУКТУРЫ USB

USBD_ISO_PACKET_DESCRIPTOR

USBD_IsochUrbAllocate

_URB_HEADER