Хабы USB относятся к стандартным устройствам с кодами класса 09 подкласса 00. Код протокола характеризует транслятор транзакций (для хабов 2.0), он зависит от типа, текущей скорости работы и структуры хаба:
Эти коды классификации хаб сообщает в своих дескрипторах устройства и интерфейса.
Кроме стандартных дескрипторов хаб имеет специальный классовый дескриптор (hub class descriptor), содержание которого раскрывает таблица ниже.
Смещение | Поле | Длина | Содержание |
0 | bDescLength | 1 | Длина дескриптора (зависит от числа портов, 9 для хабов с числом нисходящих портов 1–7) |
1 | bDescriptorType | 1 | Тип (29h — дескриптор хаба) |
2 | bNbrPorts | 1 | Число нисходящих портов |
3 | wHubCharacteristics | 2 | Характеристики хаба: Биты [1:0] — режим управления питанием портов: 00 — для всех портов одновременно (Ganged power switching), 01 — селективное, 1x — нет управления (для хабов 1.0); Бит 2 — признак комбинированного устройства: 1 — к некоторым портам хаба всегда подключены встроенные устройства; Биты [4:3] — Режим защиты от перегрузки по питанию: 00 — глобальная защита, 01 — индивидуальная защита портов, 1x — нет защиты (для хабов, питающихся от шины); Биты [6:5] — характеристика быстродействия транслятора транзакций (TT): 00 — TT делает межкадровый зазор на нисходящих портах до 8 FS bt, 01 — до 16, 10 — до 24, 11 — до 32; Бит 7 — наличие управляемых индикаторов состояния нисходящих портов; Биты [15:8] — резерв (0); в USB 1.x резервными были биты [15:5] |
5 | bPwrOn2PwrGood | 1 | Время установления нормального питания на нисходящих портах с момента команды включения (в 2 мс-интервалах) |
6 | bHubContrCurrent | 1 | Максимальный ток, потребляемый контроллером хаба (мА) |
7 | DeviceRemovable | ? | Признаки возможности отсоединения устройств от портов. Бит 0 не используются, биты 1…n соответствуют портам 1…n (0 — отсоединяемое устройство, 1 — нет). Длина поля (в байтах) зависит от числа портов, в «лишних» битах — нули |
? | PortPwrCtrlMask | ? | Маска управления питанием портов (в USB 1.x), единичное значение бита означает, что данный порт не подчиняется общей команде управления питания. В USB 2.0 все биты единичные. Связь битов с портами как и в предыдущем поле |
Хаб имеет всего один интерфейс, в котором используется (кроме нулевой) только одна конечная точка типа InterruptIN для опроса признаков изменения состояния портов (Status Change Endpoint) с максимально возможным периодом опроса (bInterval = FFh). С этой точки хост получает информацию в виде битовой карты, размер которой (в байтах) зависит от числа портов хаба. Самый младший бит карты (бит 0) несет признак смены состояния хаба (1 — есть смена), бит 1 — смены состояния порта-1, бит 2 — порта-2 и т. д. Обычно эти сообщения однобайтные, поскольку более 7 портов в хабе встречается редко. Если изменения состояния портов не произошло, то хаб на опрос отвечает NAK’ом (не передает данных). По получении признака изменения состояния хаба хост выполняет запрос чтения состояния хаба (GetHubStatus), по получении признака изменения состояния порта — запрос чтения состояния этого порта (GetPortStatus).
Хаб поддерживает все стандартные запросы к устройствам, кроме управления интерфейсом (он всего один) и установки метки времени (у хаба нет изохронных точек). Кроме того, он должен поддерживать классовые запросы, определенные для хабов.
Запрос | bmRequestType | bRequest |
ClearHubFeature | 00100000B | 1 |
ClearPortFeature | 00100011B | 1 |
ClearTTBuffer | 00100011B | 8 |
GetHubDescriptor | 10100000B | 6 |
GetHubStatus | 10100000B | 0 |
GetPortStatus | 10100011B | 0 |
ResetTT | 00100011B | 9 |
SetHubDescriptor | 00100000B | 7 |
SetHubFeature | 00100000B | 3 |
SetPortFeature | 00100011B | 3 |
GetTTState | 10100011B | 10 |
StopTT | 00100011B | 11 |
Для опроса состояния хаба и каждого его нисходящего порта имеются специальные (классовые) запросы GetHubStatus и GetPortStatus (wLength=4). Ответом на GetHubStatus будет слово состояния хаба wHubStatus, за которым следует слово изменения состояния wHubChange. В запросе GetPortStatus в поле wIndex указывается номер порта, ответом на него будет слово состояния порта wPortStatus, за которым следует слово изменения состояния порта wPortChange. Форматы этих слов приведены в следующей таблице.
Бит | Имя признака | Назначение |
Слово состояния хаба wHubStatus | ||
0 | Hub_Local_Power | Признак состояния локального источника питания хаба: 0 — локальное питание в норме, 1 — потеряно локальное питание. |
1 | Hub_Over_Current | Перегрузка по питанию (только для хабов с общей защитой для всех портов): 1 — сработала общая цепь защиты, 0 — нет |
[2:15] | Резерв | (0) |
Слово изменения состояния wHubChange | ||
0 | C_Hub_Local_Power | Признак смены состояния локального питания: 1 — была смена, 0 — нет |
1 | C_Hub_Over_Current | Признак смены состояния общей перегрузки: 1 — была смена, 0 — нет |
[2:15] | Резерв | (0) |
Слово состояния порта wPortStatus | ||
0 | Port_Connection | Текущее состояние подключения к порту: 1 — подключено устройство, 0 — нет |
1 | Port_Enable | Состояние разрешения порта: 0 — disabled, 1 — enabled. Устанавливается только программно хостом, сбрасывается программно и аппаратно по ошибке устройства |
2 | Port_Suspend | Состояние приостановки порта: 0 — не приостановлен, 1 — приостановлен или находится в процессе возобновления. Устанавливается только программно, сбрасывается программно или сигналом удаленного пробуждения от этого порта |
3 | Port_Over_Current | Перегрузка порта по питанию (только при селективной защите портов): 1 — защита сработала, 0 — нет |
4 | Port_Reset | Сброс порта: 1 — подается сигнал Reset, 0 — нет. Устанавливается программно, сбрасывается аппаратно хабом по окончании сигнализации |
[5:7] | Резерв | (0) |
8 | Port_Power | Состояние питания порта (отражает реальную ситуацию только при селективном управлении питанием): 0 — порт не запитан, 1 — порт не обесточен селективно |
9 | Port_Low_Speed | Признак низкой скорости: 1 — обнаружено подключение LS-устройства, 0 — подключенное устройство (если есть) либо FS, либо HS (смотря по биту 10) |
10 | Port_High_Speed | Признак высокой скорости: 1 — с устройством согласована высокая скорость, 0 — нет |
11 | Port_Test | Состояние тестирования порта: 1 — порт в режиме тестирования, 0 — нет (устанавливается программно) |
12 | Port_Indicator | Управление индикатором порта: 0 — индикатор управляется аппаратно, 1 — программно |
[13:15] | Резерв | (0) |
Слово изменения состояния порта wPortChange | ||
0 | C_Port_Connection | Изменение состояние подключения устройства: 1 — состояние сменилось, 1 — нет |
1 | C_Port_Enable | Изменение состояния разрешения порта, устанавливается в 1 при автоматическом запрещении работы порта из-за обнаруженной ошибки |
2 | C_Port_Suspend | Изменение состояния приостановки устройства, устанавливается в 1 при завершении возобновления работы устройства (Resume complete) |
3 | C_Port_Over_Current | Изменение состояния индивидуальной защиты порта: 1 — состояние изменилось, 0 — нет (или нет индивидуальной защиты) |
4 | C_Port_Reset | Изменение состояния сброса порта: 0 — нет изменений, 1 — сброс завершен |
[5:15] | Резерв | (0) |
Управление свойствами хаба (запросы SetHubFeature и ClearHubFeature) и каждого из нисходящих портов (запросы SetPortFeature и ClearPortFeature) обеспечивают функции, приведенные в таблице, которая расположена ниже.
Имя свойства | Номер(wValue) | Запрос установки | Запрос сброса |
Свойства хаба | SetHubFeature | ClearHubFeature | |
C_Hub_Local_Power | 0 | Установка (для диагностических целей) одноименного признака в слове изменения состояния хаба | Сброс одноименного признака в слове изменения состояния хаба подтверждение, что хост его воспринял) |
C_Hub_Over_Current | 1 | То же | То же |
Свойства порта | SetPortFeature | ClearPortFeature | |
Port_Connection | 0 | Запрос не используется, хаб не выполняет никаких операций | |
Port_Enable | 1 | Перевод запитанного порта в состояние Enabled | Перевод порта в состояние Disabled |
Port_Suspend | 2 | Приостановка порта | Генерация возобновления на приостановленном порте |
Port_Over_Current | 3 | Запрос не используется, хаб не выполняет никаких операций | |
Port_Reset | 4 | Сброс и перевод запитанного порта в состояние Enabled | Запрос не используется, хаб не выполняет никаких операций |
Port_Power | 8 | Подача питания на порт | Снятие питания с порта |
Port_Low_Speed | 9 | Запрос не используется, хаб не выполняет никаких операций | |
C_Port_Connection | 16 | Сброс одноименного признака в слове изменения состояния порта (подтверждение, что хост его воспринял) | |
C_Port_Enable | 17 | То же | |
C_Port_Suspend | 18 | То же | |
C_Port_Over_Current | 19 | То же | |
C_Port_Reset | 20 | То же | |
Port_Test | 21 | Перевод порта в тестовый режим (только для портов в состоянии Disabled, Disconnected или Suspended) | Нет, выход из теста только по сбросу хаба |
Port_Indicator | 22 | Программное управление индикатором порта | Отключение программного управления индикатором порта |
В запросе установки тестового режима в младшем байте поля wIndex задается номер порта, в старшем — селектор, определяющий выполняемый тест.
В запросе установки управления индикатором в младшем байте поля wIndex задается номер порта, в старшем — селектор, определяющий режим индикации: 0 — автоматическая работа индикатора, 1 — принудительно янтарный, 2 — принудительно зеленый, 3 — принудительно отключен, 4–FFh — резерв. Выбор нулевого селектора эквивалентен сбросу признака управления индикатором.
Для хабов с протоколами типа 1 и 2 имеются запросы управления транслятором транзакций (TT), используемые в основном в отладочных целях:
Хост является главным действующим лицом в организации конфигурирования и выполнения транзакций USB. У каждой шины USB должен быть один (и только один!) хост — компьютер с контроллером USB. Однако понятие компьютер отнюдь не означает лишь привычные варианты настольных, напольных, портативных компьютеров. Компьютер — это сочетание процессора, памяти и периферийных устройств; в таком понимании в большинстве современных устройств присутствуют встроенные компьютеры. Если «интеллекта» этого компьютера и его возможностей диалога с пользователем оказывается достаточно, то он может взять на себя роль хоста USB. Такой вариант хоста рассматривается в последнем параграфе данной главы.
«Классический» хост USB делится на три основных уровня:
В совокупности уровни хоста предоставляют следующие возможности:
Программная часть хоста в полном объеме реализуется операционной системой. До загрузки ОС может функционировать лишь усеченная часть ПО USB, поддерживающая только устройства, требующиеся для загрузки. Так, в BIOS современных системных плат имеется поддержка клавиатуры USB, реализующая функции сервиса Int 9h. После загрузки системы USB эта «дозагрузочная» поддержка игнорируется — система начинает работу с контроллером «с чистого листа», то есть со сброса и определения всех подключенных устройств. В спецификации PC’2001 выдвигается ряд требований к BIOS, в частности требование поддержки загрузки ОС с устройств USB.
Благодаря универсальности и способности эффективно передавать разнородный трафик шина USB применяется для подключения к PC самых разнообразных устройств. Она призвана заменить традиционные порты PC — COM и LPT, а также порты игрового адаптера и интерфейса MIDI. Спецификация USB 2.0 позволяет говорить и о подключении традиционных «клиентов» шин ATA и SCSI, а также захвате части ниши применения шины FireWire. Привлекательность USB придает возможность подключения/отключения устройств на ходу и возможность их использования практически сразу, без перезагрузки ОС. Удобна и возможность подключения большого количества (до 127) устройств к одной шине, правда, при наличии хабов. Хост-контроллер интегрирован во все современные системные платы. Выпускаются и карты расширения с контроллерами USB (обычно для шины PCI). Некоторое время повсеместное применение USB сдерживалось недостаточной активностью разработчиков ПО (производителей оборудования): просматривая перечни устройств, можно было видеть, что для всех указывается поддержка в Windows 98/SE/ME, а вот в графах Linux, MacOS, Unix и даже Windows 2000/NT часто стоят неприятные пометки N/A (Not Allowed — «не дозволено»). В настоящее время ситуация меняется (теперь возникают проблемы поиска драйверов для Windows 9x), но вопросы совместимости ПО иногда доставляют дополнительные хлопоты.
Для того чтобы система USB заработала, необходимо, чтобы были загружены драйверы хост-контроллера (или контроллеров, если их несколько). При подключении устройства к шине USB ОС Windows выдает сообщение «Обнаружено новое устройство» и, если устройство подключается впервые, предлагает загрузить для него драйверы. Многие модели устройств уже известны системе, и драйверы входят в дистрибутив ОС. Однако может потребоваться и драйвер изготовителя устройства, который должен входить в комплект поставки устройства, или его придется искать в Сети. К сожалению, не все драйверы работают корректно — «сырой» драйвер начальной версии, возможно, потребуется заменить более «правильным», чтобы устройство нормально опознавалось и хорошо работало. Но это общее горе пользователей любых устройств, а не только устройств для шины USB.
Перечислим основные области применения USB:
Конечно же, перечисленными классами устройств сфера применения шины USB не ограничивается.
На современных системных платах имеется встроенный хост-контроллер USB; для плат, выпускаемых с 2002–2003 годов, характерно наличие контроллера USB 2.0 (EHC) с несколькими контроллерами-компаньонами (чаще UHC). Типовое число портов — четыре и более (раньше минимумом было два). В случае поддержки USB 2.0 эти порты могут быть как равноправными (поддерживать подключение на любой скорости), так и выделенными (часть — только HS, часть — FS/LS). Часть портов выводится на внешние разъемы системного блока непосредственно, остальные выводятся на штырьковые разъемы, расположенные на системной плате. К этим промежуточным разъемам внешние разъемы подключаются через кабели«выкидыши». К сожалению, на многих корпусах системного блока отсутствует штатное место для разъемов USB с лицевой стороны, что делает подключение устройств неудобным. Эта проблема решается установкой разъемов на заглушки для 5” или 3,5”отсеков.
ВНИМАНИЕ!
Из-за ошибок при подключении кабеля-«выкидыша» на дополнительных внешних разъемах могут оказаться перепутанными цепи +5V и GND. Из-за такой ошибки подключаемое устройство, питающееся от шины (например, флэш-память), может выйти из строя (сгореть).
Хабы USB выпускаются как в виде отдельных устройств, так и встраиваются в периферийные устройства (клавиатуры, мониторы). Как правило, хабы питаются от сети переменного тока (они должны питать подключаемые устройства). Выпускают и хабы, устанавливаемые внутрь системного блока компьютера и питающиеся от его блока питания. Такие хабы дешевле внешних и не требуют дополнительной питающей розетки. Один из вариантов исполнения — установка хаба на скобку, монтируемую в окно для дополнительных разъемов. Доступ к их разъемам со «спины» системного блока не очень удобен для пользователей. Другой вариант — хаб, устанавливаемый в 3-дюймовый отсек. Его разъемы легко доступны, индикаторы состояния портов хорошо видны, но не всегда удобны кабели, выходящие с передней панели системного блока. С другой стороны, для подключения электронных ключей (если их приходится часто менять) или миниатюрных накопителей этот вариант — самый удобный.
Выпускаются вспомогательные устройства USB, увеличивающие дальность связи (distance extender). Простейший вариант — это обычный 5-метровый кабель USB, на одном конце которого обычная вилка «A», а на другом — миниатюрный однопортовый хаб с гнездом «B». При необходимости между устройством USB и корневым хабом можно использовать цепочку из 5 таких удлинителей, что дает дальность 25 м плюс длина кабеля устройства (до 5 м). Другой вариант — пара устройств, соединяемых между собой обычным кабелем «витая пара» категории 5 (или даже оптоволокном), включаемая между периферийным устройством и корневым хабом. Дальнее (от хоста) устройство этого удлинителя может быть и хабом на несколько портов. К сожалению, увеличение дистанции упирается в ограничения на время задержки сигнала, свойственные протоколу шины USB, и максимально достижимое расстояние составляет 200 футов (около 60 м). Уже с удлинителем на 50 м дополнительные хабы недопустимы — задержка сигнала в кабеле «съедает» лимиты, отпущенные хабам в спецификации USB. Но даже и эта длина позволяет расширить сферу применения USB, например, для удаленного видеонаблюдения. Утверждения изготовителей о достижимой дальности 100 м (а на оптике и до 500 м!) вызывают некоторое недоверие, поскольку ограничения дальности в спецификации USB жестко ограничено установками тайм-аутов ожидания ответа, а быстрее света сигналы в кабелях разогнать не удается.
Далее рассматриваются подробности реализации взаимодействия по шине USB с устройствами некоторых классов. Эти примеры позволяют осмыслить прикладные возможности USB, их можно использовать как отправные точки для разработки собственных устройств, в том числе и совершенно оригинальных по функциональному назначению. Последний раздел главы посвящен разрешению проблем, возникающих при подключении устройств, в том числе и устройств собственной
разработки.
Архитектура USB допускает четыре базовых типа передач данных между хостом и периферийными устройствами:
Аппаратная часть USB включает:
Программная часть USB включает:
Драйверы USBD и HCD составляют хост-часть ПО USB; спецификация USB очерчивает круг их задач, но не описывает интерфейс между ними. Физическое устройство USB должно иметь интерфейс USB, обеспечивающий полную поддержку протокола USB, выполнение стандартных операций (конфигурирование и сброс) и предоставление информации, описывающей устройство. Физические устройства USB могут быть комбинированными (compound devices): включать в себя несколько устройств-функций, подключенных к внутреннему хабу, а также предоставлять своим внутренним хабом дополнительные внешние точки подключения.
Работой всех устройств шины USB управляет хост-контроллер (host controller), являющийся программно-аппаратной подсистемой хост-компьютера. Хост-контроллер является интеллектуальным устройством шины PCI или составной частью «южного» хаба (моста) системной платы, интенсивно взаимодействующим с оперативной памятью.
Физическая топология шины USB — многоярусная звезда (см. рисунок, а). Ее вершиной является хост-контроллер, объединенный с корневым хабом (root hub). Хаб является устройством-разветвителем, он может служить и источником питания для подключенных к нему устройств. К каждому порту хаба может непосредственно подключаться периферийное устройство или промежуточный хаб; шина допускает до пяти уровней (ярусов) каскадирования хабов (не считая корневого). Поскольку комбинированные устройства содержат внутри себя хаб, их подключение к хабу пятого яруса уже недопустимо. Каждый промежуточный хаб имеет несколько нисходящих (downstream) портов для подключения периферийных устройств (или нижележащих хабов) и один восходящий (upstream) порт для подключения к корневому хабу или нисходящему порту вышестоящего хаба.
Логическая топология USB — звезда. Хабы (включая корневой) создают иллюзию непосредственного подключения каждого логического устройства к хост-контроллеру (см. рисунок ниже, б). В этой звезде устанавливаются сугубо подчиненные отношения по системе опроса-ответа: хост-контроллер по своей инициативе передает данные к выбранному устройству или принимает их. Устройство по своей инициативе передавать данные не может; непосредственные передачи данных между устройствами невозможны. Устройство по своей инициативе может лишь сигнализировать о «пробуждении» (wakeup), для чего используется специальная сигнализация, но не передача данных.
Физический интерфейс USB прост и изящен. Конструкция кабелей и коннекторов USB не дает возможности ошибиться при подключении устройств (см. рисунок ниже, а и б). Для распознавания разъема USB на корпусе устройства ставится стандартное символическое обозначение (см. рисунок ниже, в). Гнезда типа «A» устанавливаются только на нисходящих портах хабов, вилки типа «A» — на шнурах периферийных устройств или восходящих портов хабов. Гнезда и вилки типа «B» используются только для шнуров, отсоединяемых от периферийных устройств и восходящих портов хабов (от «мелких» устройств — мышей, клавиатур и т. п. кабели, как правило, не отсоединяются). Для малогабаритных устройств имеются разъемы mini-B, а для поддержки OTG (On-the-Go) имеются и вилки mini-A, и розетки miniAB. Хабы и устройства обеспечивают возможность «горячего» подключения и отключения с сигнализацией об этих событиях хосту.
При планировании соединений следует учитывать способ питания устройств: устройства, питающиеся от шины, как правило, подключают к хабам, питающимся от сети. К хабам, питающимся от шины, подключают лишь маломощные устройства — так, к клавиатуре USB, содержащей внутри себя хаб, подключают мышь USB и другие устройства-указатели (трекбол, планшет).
Логическое устройство USB представляет собой набор независимых конечных точек (Endpoint, EP), с которыми хост-контроллер (и клиентское ПО) обменивается информацией. Каждому логическому устройству USB (как функции, так и хабу) конфигурационная часть ПО хоста назначает свой адрес (1–127), уникальный на данной шине USB. Каждая конечная точка логического устройства идентифицируется своим номером (0–15) и направлением передачи (IN — передача к хосту, OUT — от хоста). Точки IN4 и OUT4, к примеру, представляют собой разные конечные точки, с которыми могут общаться даже модули клиентского ПО. Набор конечных точек зависит от устройства, но всякое устройство USB обязательно имеет двунаправленную конечную точку 0 (EP0), через которую осуществляется его общее управление. Для прикладных целей используются конечные точки с номерами 1–15 (1–2 для низкоскоростных устройств). Адрес устройства, номер и направление конечной точки однозначно идентифицируют приемник или источник информации при обмене хост-контроллера с устройствами USB. Каждая конечная точка имеет набор характеристик, описывающих поддерживаемый тип передачи данных (изохронные данные, массивы, прерывания, управляющие передачи), размер пакета, требования к частоте обслуживания.
Устройство может выполнять несколько различных функциональных задач: например, привод CD-ROM может обеспечивать проигрывание аудиодисков и работать как устройство хранения данных. Для решения каждой задачи в устройстве определяется интерфейс — набор конечных точек, предназначенных для выполнения данной задачи, и правила их использования. Таким образом, каждое устройство должно обеспечивать один или несколько интерфейсов. Наличие нескольких интерфейсов позволяет нескольким драйверам, каждый из которых обращается только к своему интерфейсу (представляющему часть устройства USB), работать с одним и тем же устройством USB. Каждый интерфейс может иметь один или несколько альтернативных вариантов (альтернативных установок — alternate settings), из которых в данный момент активным может быть только один. Варианты различаются наборами (возможно, и характеристиками) используемых конечных точек.
Набор одновременно поддерживаемых интерфейсов составляет конфигурацию устройства. Устройство может иметь одну или несколько возможных конфигураций, из которых на этапе конфигурирования хост выбирает одну, делая ее активной. От выбранной конфигурации зависит доступная функциональность, и зачастую — потребляемая мощность. Пока устройству не назначен номер выбранной конфигурации, оно не может функционировать в прикладном смысле и ток потребления от шины не должен превышать 100 мА. Хост выбирает конфигурацию исходя из доступности всех ресурсов, затребованных данной конфигурацией, включая и ток потребления от шины.
Все принимаемые пакеты проверяются на наличие ошибок, что позволяют принятые форматы пакета и некоторые соглашения:
Обнаружение любой из перечисленных ошибок в пакете заставляет приемник считать его недействительным. На пакеты, принятые с ошибкой, ни устройство, ни хост-контроллер никак не отвечают. При изохронной передаче данные недействительного пакета должны просто игнорироваться (они теряются); для остальных типов передач используются средства обеспечения надежной доставки.
Для обнаружения отсутствия ответа партнера на пакет каждое устройство имеет счетчик тайм-аута, который прерывает ожидание ответа по истечении некоторого времени. В USB имеется ограничение на время оборота по шине (roundtrip time): время от конца EOP сформированного пакета до получения начала ответного пакета. Для конечного устройства (и хост-контроллера) нормируется максимальная задержка ответа (response time) от конца увиденного EOP до введения им начала пакета. Для хабов нормируется задержка трансляции пакетов, для кабелей — задержка распространения сигналов. Счетчик тайм-аута должен учитывать максимальную задержку, возможную для допустимой конфигурации шины: до 5 промежуточных хабов, до 5 метров каждый кабель. Допустимое значение тайм-аута, выражаемое в битовых интервалах (bt), зависит от скорости:
У хост-контроллера с каждой конечной точкой всех устройств связан свой счетчик ошибок, обнуляемый при планировании каждой транзакции. Этот счетчик считает все протокольные ошибки (включая и ошибки по тайм-ауту), и если число ошибок превышает порог (3), то канал с данной конечной точкой останавливается, о чем уведомляется его владелец (драйвер устройства или USBD). До превышения порога хост отрабатывает ошибки для неизохронных передач попытками повтора транзакций, без уведомления клиентского ПО. Изохронные передачи не повторяются, об обнаружении ошибок хост сообщает сразу.