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


структура _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 дескриптора конечной точки.
  • Член Interval является производным от значения 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]. Элемент offset используется для отслеживания объема данных для отправки или получения. Это делается путем задания смещения байтов от начала всего буфера передачи для запроса.

Например, существует пять микрофреймов, доступных для передачи пакетов размером 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]. Элемент Length обновляется контроллером узла, чтобы указать фактическое количество байтов, полученных от устройства для изохронной передачи 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