структура _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
Указывает ноль, один или сочетание следующих флагов:
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.. 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-точек изохронных конечных точек