Выделение пропускной способности USB
В этой статье содержатся рекомендации по тщательному управлению пропускной способностью USB. Каждый драйвер USB-клиента обязан свести к минимуму используемую им пропускную способность USB и как можно быстрее вернуть неиспользуемую пропускную способность в пул свободной пропускной способности.
Почему у моего USB-драйвера возникают ошибки пропускной способности?
Конкуренция за пропускную способность на USB-шине исходит из нескольких источников, как оборудования, так и программного обеспечения. Трудно точно предсказать, какая пропускная способность доступна для драйвера USB-клиента. Контроллеру узла USB требуется определенная пропускная способность для своих операций. Требуемая сумма зависит от того, является ли контроллер высокой скоростью. Он зависит от системы к системе. USB-концентраторы, работающие на высокой скорости, иногда должны переводить транзакции между высокоскоростными портами вышестоящий и низкоскоростными устройствами ниже по течению, и этот процесс преобразования потребляет пропускную способность. Но требуется ли пропускная способность для преобразования транзакций, зависит от типа подключенных устройств и топологии дерева устройств.
Самая серьезная нагрузка на ресурс пропускной способности обычно возникает из-за драйверов USB-клиента, которые монополизируют пропускную способность. Система распределяет пропускную способность в порядке первой очереди. Если первый загруженный USB-драйвер запрашивает всю доступную пропускную способность, USB-драйвер, который загружается позже, не будет иметь никакой пропускной способности для своего устройства. Система не может настроить устройство и не может перечислить его. Так как неясно, почему перечисление завершилось сбоем, пользователь плохо работает.
Иногда драйвер клиента исчерпывает доступную пропускную способность с помощью высокоскоростной передачи прерываний. Но наиболее распространенным случаем, безусловно, является драйвер клиента, который выделяет слишком много пропускной способности для изохронной передачи, а затем не может освободить пропускную способность своевременно. Система резервирует выделенную пропускную способность до тех пор, пока драйвер, запрашивавший ее, не закроет свою конечную точку (путем открытия другой конечной точки) или не будет удалено устройство, для которого была выделена пропускная способность. Система не выделяет гарантированную пропускную способность для массовой передачи, поэтому массовая передача никогда не является причиной сбоев перечисления. Однако производительность устройств массовой передачи зависит от того, какая пропускная способность выделяется для устройств, которые выполняют периодическую (изохронную и прерывающую) передачу данных.
Спецификация USB 2.0 требует, чтобы изохронное устройство должно иметь конечные точки с нулевой пропускной способностью в параметре интерфейса по умолчанию. Это гарантирует, что для устройства не будет зарезервирована пропускная способность, пока драйвер функции не откроет интерфейс, отличный от интерфейса по умолчанию, что помогает предотвратить сбои перечисления, вызванные чрезмерной пропускной способностью запросов во время настройки устройства. Это не мешает драйверу клиента выделять слишком много пропускной способности после настройки устройства, тем самым препятствуя правильной работе других устройств.
Ключ к правильному управлению пропускной способностью заключается в том, что каждое USB-устройство в системе, которое выполняет изохронную передачу, должно предлагать несколько альтернативных параметров (ALT) для каждого интерфейса, содержащего изохронные конечные точки, а клиентские драйверы должны разумно использовать эти параметры Alt. Клиентские драйверы должны начать с запроса параметра интерфейса с максимальной пропускной способностью. Если запрос завершается сбоем, драйвер клиента должен запрашивать параметры интерфейса с меньшей и меньшей пропускной способностью, пока запрос не будет выполнен успешно.
Например, предположим, что устройство веб-камеры имеет следующие интерфейсы:
Интерфейс 0 (параметр интерфейса по умолчанию: нет конечных точек с ненулевой изохронной пропускной способностью в параметре по умолчанию)
Изохронная конечная точка 1: максимальный размер пакета = 0 байт
Изохронная конечная точка 2: максимальный размер пакета = 0 байт
Интерфейс 0 Alt, параметр 1
Изохронная конечная точка 1: максимальный размер пакета = 256 байт
Изохронная конечная точка 2: максимальный размер пакета = 256 байт
Интерфейс 0 Alt, параметр 2
Изохронная конечная точка 1: максимальный размер пакета = 512 байт
Изохронная конечная точка 2: максимальный размер пакета = 512 байт
Драйвер веб-камеры настраивает веб-камеру на использование параметра интерфейса по умолчанию при ее инициализации. Параметр по умолчанию не имеет изохронной пропускной способности, поэтому использование параметра по умолчанию во время инициализации позволяет избежать опасности, которую веб-камера может не перечислить из-за неудачного запроса на изохронную пропускную способность.
Когда драйвер клиента готов к выполнению изохронной передачи, он должен попытаться использовать параметр Alt 2, так как параметр Alt 2 имеет наибольший размер пакета. Если запрос завершается ошибкой, драйвер может выполнить вторую попытку, используя параметр Alt 1. Так как для параметра Alt 1 требуется меньшая пропускная способность, этот запрос может завершиться успешно, даже если первый запрос завершился ошибкой. Несколько параметров Alt позволяют драйверу выполнить несколько попыток, прежде чем сдаваться.
После того как веб-камера простаивает, она может вернуть выделенную пропускную способность в пул свободной пропускной способности, еще раз выбрав параметр по умолчанию.
Пользователи могут узнать, сколько пропускной способности выделяет USB-контроллер, проверив свойства контроллера в Windows диспетчер устройств. Выберите свойства контроллера и перейдите на вкладку Дополнительно. Это чтение не указывает, сколько пропускной способности USB-концентраторы выделены для преобразования транзакций.
Функция диспетчер устройств, которая сообщает об использовании пропускной способности USB-контроллера, неправильно работает в Windows XP.
Размеры пакетов и передачи по USB
В этой статье описываются размеры передачи USB, разрешенные в различных версиях операционной системы Windows.
- Максимальный размер передачи
- Максимальный размер пакета
- Ограничение максимального размера пакета для буферов передачи данных для чтения
- Разделение передачи данных записи короткими пакетами
Максимальный размер передачи
Максимальный размер передачи определяет жестко заданные ограничения в стеке usb-драйверов. Возможно, размер передачи ниже этих ограничений может завершиться ошибкой из-за ограничений системных ресурсов. Чтобы избежать таких сбоев и обеспечить совместимость во всех версиях Windows, не используйте большие размеры передачи для передачи по USB.
Примечание
Элемент MaximumTransferSize структуры USBD_PIPE_INFORMATION устарел. Стек usb-драйверов игнорирует значение Параметра MaximumTransferSize как для составных, так и для не составных устройств.
В Windows 2000 стек usb-драйверов инициализирует MaximumTransferSize для USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE. Драйвер клиента может задать меньшее значение при настройке устройства. Для составного устройства драйвер клиента для каждой функции может изменять только Параметр MaximumTransferSize для каналов в параметре интерфейса, отличном от используемого по умолчанию.
На размеры передачи по USB применяются следующие ограничения.
Канал передачи | Windows 8.1, Windows 8 | Windows 7, Windows Vista | Windows XP, Windows Server 2003 | Windows 2000 |
---|---|---|---|---|
Control | 64K для SuperSpeed и высокой скорости (xHCI) 4K для полной и низкой скорости (xHCI, EHCI, UHCI, OHCI) Для UHCI — 4K на конечной точке по умолчанию; 64K на канале управления, отличном от стандартных каналов управления |
64K для высокой скорости (EHCI) 4K для полной и низкой скорости (EHCI, UHCI, OHCI) Для UHCI — 4K на конечной точке по умолчанию; 64K для каналов управления, отличных от стандартных (UHCI) |
64K для высокой скорости (EHCI) 4K для полной и низкой скорости (EHCI, UHCI, OHCI) Для UHCI — 4K на конечной точке по умолчанию; 64K для каналов управления, отличных от стандартных (UHCI) |
4 КБ на конечной точке по умолчанию; 64K на трубах управления, отличных от стандартных (OHCI) |
Прервать | 4 МБ для SuperSpeed, высокой, полной и низкой скорости (xHCI, EHCI, UHCI, OHCI) | 4 МБ для высокой, полной и низкой скорости (EHCI, UHCI, OHCI) | Неограниченно | Не определено (OHCI) |
Массовость | 32 МБ для SuperSpeed (xHCI) 4 МБ для высокой и полной скорости (xHCI) 4 МБ для высокой и полной скорости (EHCI и UHCI) 256K full speed (OHCI) |
4 МБ для высокой и полной скорости (EHCI, UHCI) 256K для полной скорости (OHCI) |
3 МБ для высокой и полной скорости (EHCI) Не определено (UHCI) 256K для полной скорости (OHCI) |
Не определено (OHCI) |
Изохронный | 1024 * wBytesPerInterval для SuperSpeed (xHCI) (см . USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR) 1024 * MaximumPacketSize для высокой скорости (xHCI, EHCI) 256 * MaximumPacketSize для полной скорости (xHCI, EHCI) 64K для полной скорости (UHCI, OHCI) |
1024 * MaximumPacketSize для высокой скорости (EHCI) 256 * MaximumPacketSize для полной скорости (EHCI) 64K для полной скорости (UHCI, OHCI) |
1024 * MaximumPacketSize для высокоскоростных (EHCI) 256 * MaximumPacketSize для полной скорости (EHCI) 64K для полной скорости (UHCI, OHCI) |
64K для полной скорости (OHCI) |
Ограничение размера передачи с помощью MaximumTransferSize напрямую не влияет на пропускную способность, потребляемую устройством. Драйвер клиента должен либо изменить параметр интерфейса, либо ограничить максимальный размер пакета, заданный в элементе MaximumPacketSizeUSBD_PIPE_INFORMATION.
Максимальный размер пакета
Максимальный размер пакета определяется полем wMaxPacketSize дескриптора конечной точки. Драйвер клиента может регулировать размер ПАКЕТА USB в запросе интерфейса выбора к устройству. Изменение этого значения не приводит к изменению wMaxPacketSize на устройстве.
В URB для запроса используется структура USBD_PIPE_INFORMATION для канала. В этой структуре:
- Измените член MaximumPacketSizeструктуры USBD_PIPE_INFORMATION . Присвойте ему значение, меньшее или равное значению wMaxPacketSize , определенному в встроенном ПО устройства для текущего параметра интерфейса.
- Установите флаг USBD_PF_CHANGE_MAX_PACKET в структуре элемента PipeFlagsUSBD_PIPE_INFORMATION .
Сведения о выборе параметра интерфейса см. в разделе Выбор конфигурации для USB-устройства.
Ограничение максимального размера пакета для буферов передачи данных для чтения
Когда драйвер клиента выполняет запрос на чтение, буфер передачи должен быть кратным максимальному размеру пакета. Даже если драйвер ожидает данные меньше максимального размера пакета, он по-прежнему должен запрашивать весь пакет. Если устройство отправляет пакет меньше максимального размера (короткий пакет), это означает, что передача завершена.
На старых контроллерах драйвер клиента может переопределить поведение. В элементе TransferFlagsurb передачи данных драйвер клиента должен установить флаг USBD_SHORT_TRANSFER_OK. Этот флаг позволяет устройству отправлять пакеты меньше, чем wMaxPacketSize.
На контроллерах узла xHCI USBD_SHORT_TRANSFER_OK игнорируются для конечных точек массовых операций и прерываний. Передача коротких пакетов на контроллеры EHCI не приводит к возникновению ошибки.
На контроллерах узла EHCI USBD_SHORT_TRANSFER_OK игнорируется для конечных точек массовых операций и прерываний.
На контроллерах узлов UHCI и OHCI, если USBD_SHORT_TRANSFER_OK не задан для массовой передачи или передачи прерываний, короткая передача пакетов останавливает конечную точку и возвращается код ошибки для передачи.
Разделение передачи данных записи короткими пакетами
Драйвер стека USB-драйвера не накладывает те же ограничения на размер пакета при записи на устройство, которые он накладывает при чтении с устройства. Некоторые клиентские драйверы должны часто передавать небольшие объемы контрольных данных для управления своими устройствами. В таких случаях нецелесообразно ограничивать передачу данных пакетами одинакового размера. Поэтому стек драйверов не присваивает особого значения пакетам размером меньше, чем максимальный размер конечной точки во время записи данных. Это позволяет драйверу клиента разбить большой объем передачи на устройство на несколько urob любого размера, меньшего или равного максимальному.
Драйвер должен либо завершить передачу пакетом меньше максимального размера, либо разделять конец передачи пакетом нулевой длины. Передача не будет завершена, пока драйвер не отправит пакет меньше wMaxPacketSize. Если размер передачи точно кратен максимальному, драйвер должен отправить пакет с разделителями нулевой длины, чтобы явно завершить передачу.
Драйвер клиента отвечает за разделение передачи данных пакетами нулевой длины, как того требует спецификация USB. Стек драйверов USB не создает эти пакеты автоматически.
Разделение передачи данных по USB с помощью пакетов меньше, чем wMaxPacketSize
Совместимые драйверы USB 2.0 и USB 1.1 должны передавать пакеты максимального размера (wMaxPacketSize), а затем заканчивать передачу пакетом меньше максимального размера или разделять конец передачи пакетом нулевой длины. Передача не будет завершена, пока драйвер не отправит пакет меньше wMaxPacketSize. Если размер передачи точно кратен максимальному, драйвер должен отправить пакет с разделителями нулевой длины, чтобы явно завершить передачу.
Драйвер устройства отвечает за разделение передачи данных пакетами нулевой длины, как того требует спецификация USB. Системный USB-стек не создает эти пакеты автоматически.