Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье приводятся рекомендации по тщательному управлению пропускной способностью USB. Каждый драйвер клиента USB должен минимизировать объем используемой им пропускной способности USB и как можно быстрее возвращать неиспользуемую пропускную способность в общий пул пропускной способности.
Почему USB-драйвер выдает ошибки пропускной способности?
Конкуренция за пропускную способность на USB-шине поступает из нескольких источников, как оборудования, так и программного обеспечения. Трудно спрогнозировать, сколько пропускной способности доступно для USB-драйвера клиента. Для работы контроллера USB-узла требуется определенная пропускная способность. Требуемое количество зависит от того, является ли контроллер высокоскоростным или нет. Она отличается от системы к системе. USB-концентраторы, работающие на высокой скорости, иногда должны преобразовывать транзакции между высокоскоростными портами и нижестоящими устройствами с низкой скоростью, и этот процесс перевода потребляет пропускную способность. Но требуется ли пропускная способность для перевода транзакций, зависит от типа подключенных устройств и топологии дерева устройств.
Наиболее серьезная нагрузка на ресурс пропускной способности обычно исходит от драйверов USB-клиента, которые монополизируют пропускную способность. Система выделяет пропускную способность на основе принципа «первый пришёл, первый обслужен». Если первый USB-драйвер запрашивает всю доступную пропускную способность, USB-драйвер, который загружается позже, не имеет пропускной способности для своего устройства. Система не может настроить устройство и не сможет перечислить его. Так как это не очевидно, почему перечисление завершилось ошибкой, пользователь имеет плохой опыт.
Иногда драйвер клиента исчерпывает доступную пропускную способность из-за высокоскоростного прерывающего переноса. Но наиболее распространенный случай заключается в том, что клиентский драйвер выделяет слишком много пропускной способности для изохронной передачи, а затем не освобождает ее своевременно. Система резервирует выделенную пропускную способность, пока драйвер, запросивший её, не закроет свою конечную точку, открыв другую, или пока устройство, для которого выделена пропускная способность, не будет удалено. Система не выделяет гарантированную пропускную способность для массовой передачи, поэтому массовые передачи никогда не являются причиной сбоев перечисления. Однако производительность устройств массовой передачи зависит от того, сколько пропускной способности выделяется для устройств, которые выполняют периодические передачи данных, такие как изохронные и прерывистые.
Спецификация USB 2.0 требует, чтобы изохронное устройство имело конечные точки нулевой пропускной способности на настройках интерфейса по умолчанию. Это гарантирует, что пропускная способность устройства не зарезервирована до тех пор, пока драйвер функции не откроет интерфейс, не используемый по умолчанию, что помогает предотвратить сбои перечисления, вызванные чрезмерными запросами пропускной способности во время настройки устройства. Это не позволяет драйверу клиента выделять слишком много пропускной способности после настройки устройства, тем самым предотвращая правильное функционирование других устройств.
Ключом к правильному управлению пропускной способностью является то, что каждое USB-устройство в системе, выполняющее изохронную передачу, должно предлагать несколько альтернативных параметров (ALT) для каждого интерфейса, содержащего изохронные конечные точки, и драйверы клиентов должны использовать эти параметры ALT. Клиентские драйверы должны начинаться с запроса параметра интерфейса с наибольшей пропускной способностью. Если запрос завершается ошибкой, драйвер клиента должен запрашивать параметры интерфейса с меньшей и меньшей пропускной способностью до тех пор, пока запрос не завершится успешно.
Например, предположим, что устройство с веб-камерой имеет следующие интерфейсы:
Интерфейс 0 (параметр интерфейса по умолчанию: нет конечных точек с ненулевой изохронной пропускной способностью в параметре по умолчанию)
Isochronous Endpoint 1: максимальный размер пакета = 0 байт
Isochronous Endpoint 2: максимальный размер пакета = 0 байт
Интерфейс 0 Альт настройка 1
Изохронная конечная точка 1: максимальный размер пакета = 256 байт
Isochronous Endpoint 2: максимальный размер пакета = 256 байт
Интерфейс 0 Альт установка 2
Изохронная конечная точка 1: максимальный размер пакета = 512 байт
Isochronous Endpoint 2: максимальный размер пакета = 512 байт
Драйвер веб-камеры настраивает веб-камеру для использования параметра интерфейса по умолчанию при инициализации. Параметр по умолчанию не имеет изохронной пропускной способности, поэтому использование параметра по умолчанию во время инициализации позволяет избежать опасности, которую веб-камера может не перечислить из-за неудачного запроса на изохронную пропускную способность.
Когда драйвер клиента готов к выполнению изохронной передачи, он должен попытаться использовать alt setting 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 |
|---|---|---|---|---|
| Контроль | 64K для SuperSpeed и High Speed (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) |
4K на стандартной конечной точке; 64K на нестандартных каналах управления (OHCI) |
| Interrupt | 4 МБ для SuperSpeed, высокой, полной и низкой скорости (xHCI, EHCI, UHCI, OHCI) | 4 МБ для высокой, полной и низкой скорости (EHCI, UHCI, OHCI) | Не ограничено | Undetermined(OHCI) |
| Оптовый | 32 МБ для SuperSpeed (xHCI) 4 МБ для высокой и полной скорости (xHCI) 4 МБ для высокой и полной скорости (EHCI и UHCI) 256K на полной скорости (OHCI) |
4 МБ для высокой и полной скорости (EHCI, UHCI) 256K для полной скорости (OHCI) |
3 МБ для высокоскоростного и полноскоростного режимов (EHCI) Неопределенный (UHCI) 256K для полной скорости (OHCI) |
Undetermined(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 в компоненте PipeFlags структуры USBD_PIPE_INFORMATION.
Сведения о выборе параметра интерфейса см. в разделе "Как выбрать конфигурацию для USB-устройства".
Максимальное ограничение размера пакета для буферов передачи чтения
Когда драйвер клиента выполняет запрос на чтение, буфер передачи должен быть кратным максимальным размером пакета. Даже если драйвер ожидает данные меньше максимального размера пакета, он должен по-прежнему запрашивать весь пакет. Когда устройство отправляет пакет меньше максимального размера (короткий пакет), это указывает, что передача завершена.
На старых контроллерах драйвер клиента может переопределить поведение. В элементе TransferFlags в URB передачи данных драйвер клиента должен задать флаг USBD_SHORT_TRANSFER_OK. Этот флаг позволяет устройству отправлять пакеты меньше , чем wMaxPacketSize.
На хост-контроллерах xHCI USBD_SHORT_TRANSFER_OK игнорируется для конечных точек передачи данных и прерываний. Передача коротких пакетов на контроллерах EHCI не приводит к возникновению ошибки.
На хост-контроллерах EHCI USBD_SHORT_TRANSFER_OK игнорируется для массовых и прерывистых конечных точек.
В контроллерах хоста UHCI и OHCI, если для пакетной или прерывистой передачи не установлено значение USBD_SHORT_TRANSFER_OK, короткая передача пакетов останавливает конечную точку, и для этой передачи возвращается код ошибки.
Разделение передачи записей с короткими пакетами
Драйвер стека USB-драйверов не накладывает те же ограничения на размер пакета при записи на устройство, что он накладывается при чтении с устройства. Некоторые клиентские драйверы должны выполнять частые передачи небольших объемов данных управления для управления их устройствами. Это непрактично ограничивать передачу данных пакетами единообразного размера в таких случаях. Поэтому стек драйверов не назначает особое значение пакетам размера меньше максимального размера конечной точки во время записи данных. Это позволяет драйверу клиента разбивать большую передачу данных на устройство на несколько URB любого размера, который меньше или равен максимальному.
Драйвер должен либо завершить передачу пакетом, размеры которого меньше максимального, либо обозначить завершение передачи пакетом нулевой длины. Передача не завершена, пока драйвер не отправит пакет меньше wMaxPacketSize. Если размер передачи равен точному крату максимума, драйвер должен отправить пакет с разделителями нулевой длины, чтобы явно завершить передачу.
Драйвер клиента отвечает за разграничение передачи данных с помощью пакетов нулевой длины, как указано в спецификации USB. Стек USB-драйверов не создает эти пакеты автоматически.
Ограничение передачи данных USB пакетами меньше, чем wMaxPacketSize
Совместимые драйверы USB 2.0 и USB 1.1 должны передавать пакеты максимального размера (wMaxPacketSize), а затем заканчивать передачу пакетом меньше максимального размера или разделять конец передачи с пакетом нулевой длины. Передача не завершена, пока драйвер не отправит пакет меньше wMaxPacketSize. Если размер передачи равен точному крату максимума, драйвер должен отправить пакет с разделителями нулевой длины, чтобы явно завершить передачу.
Драйвер устройства отвечает за ограничение передачи данных пакетами нулевой длины, как это требуется спецификацией USB. Стек USB системы не создает эти пакеты автоматически.