PersCom — Компьютерная Энциклопедия Компьютерная Энциклопедия

Детальная информация Алматис купить у нас на сайте.

USB

Хабы USB

Специфические дескрипторы и запросы к хабам

Хабы USB относятся к стандартным устройствам с кодами класса 09 подкласса 00. Код протокола характеризует транслятор транзакций (для хабов 2.0), он зависит от типа, текущей скорости работы и структуры хаба:

  • 00 — хаб FS (без транслятора транзакций) или хаб HS, подключенный к на FSпорту;
  • 01 — HS-хаб с одним транслятором транзакций;
  • 02 — HS-хаб с несколькими трансляторами транзакций.

Эти коды классификации хаб сообщает в своих дескрипторах устройства и интерфейса.

Кроме стандартных дескрипторов хаб имеет специальный классовый дескриптор (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), используемые в основном в отладочных целях:

  • GetTTState — опрос состояния транслятора (для диагностики);
  • StopTT — останов транслятора (если трансляторов несколько, то для конкретного порта);
  • ResetTT — сброс транслятора в исходное состояние (если трансляторов несколько, то для конкретного порта);
  • ClearTTBuffer — очистка буфера непериодических транзакций. При запросе указывается адрес устройства и конечной точки, а также порта хаба (если транслятор один на все порты, то указывается порт 1).


Расщепление периодических транзакций

Периодические транзакции (изохронные и прерывания) критичны к времени выполнения, что накладывает отпечаток на их исполнение в расщепленном виде.

Изохронные транзакции на FS синхронизируются с кадрами (1 мс), в то время как на HS — с микрокадрами (125 мкс). Поскольку за время микрокадра на полной скорости может быть передано всего 187,5 байт данных, при расщеплении транзакций на стороне FS можно без ущерба равномерности уменьшить размер передаваемого пакета за один микрокадр (ради облегчения планирования загрузки микрокадров). Исходя из этого, одна транзакция FS, несущая до 1023 байт данных, фрагментируется — разбивается на 1–6 транзакций HS, несущих до 188 байт данных каждая.

Проще всего расщепляются транзакции изохронного вывода, поскольку здесь не требуется получения от устройства ответа или данных. Одна FS-транзакция изохронного вывода реализуется в виде цепочки из 1–6 HS-транзакций, в каждой из которых после маркера SS посылается маркер OUT, адресующийся к конечной точке целевого устройства, и пакет DATA0 с очередным фрагментом данных. Здесь (и только здесь) в маркере SS поля S (Start) и E (End) определяют местоположение пакета данных в полноскоростной транзакции: [S:E] = 10 — стартовый, [S:E] = 01 — последний, [S:E] = 00 — промежуточный, [S:E] = 11 — в пакете все данные транзакции.

Транслятор транзакций, успешно приняв стартовый пакет (с единичным битом S), может начинать транзакцию вывода, полагая, что последующие данные будут хостом доставлены своевременно. Отработав пакет с признаком последнего фрагмента, транслятор формирует нормальное окончание пакета (CRC код и EOP). Если промежуточные фрагменты приходят с ошибкой, транслятору придется «испортить» выводимый пакет, введя ошибку вставки бит. Таким образом, целевой приемник данные этой транзакции проигнорирует, как некорректные. Транслятор транзакций после приема фрагмента с ошибкой будет игнорировать все расщепленные транзакции, адресованные к данной конечной точке, у которых нет признака начального фрагмента. Последующую транзакцию со стартовым фрагментом транслятор будет отрабатывать как новую.

Транзакции изохронного ввода расщепляются несколько сложнее, поскольку требуют передачи к хосту данных, которые от целевого устройства будут получены с задержкой. Одна FS-транзакция изохронного ввода реализуется в виде цепочки, состоящей из транзакции запуска, содержащей маркер SS и маркер IN, и нескольких транзакций завершения, в каждой из которых за маркером CS следует тот же маркер IN и ожидается от хаба пакет с очередным фрагментом данных или пакет квитирования. Здесь также данные одной FS-транзакции разбиваются на 1–6 фрагментов (HS-транзакций). Данные всех фрагментов, кроме последнего, возвращаются пакетами MDATA, вынуждающими повторить транзакцию завершения в следующем микрокадре. Последний фрагмент приходит в пакете DATA0. Вместо пакета данных контроллер может ответить пакетом NYET, если к концу микрокадра он принял от целевого устройства менее трех байт данных. Хост в этом случае повторит транзакцию завершения в следующем микрокадре, если текущий микрокадр не является последним в кадре. Ответ NYET в последнем микрокадре кадра трактуется хостом как ошибка, по которой транзакцию следует завершить и сообщить об этом клиентскому драйверу. Если транслятор транзакций принимает от целевого устройства данные с ошибкой, он ответит пакетом ERR, что тоже вынудит хост прекратить транзакцию с сообщением об ошибке.

Транзакции прерываний имеют небольшой размер пакета (до 8 байт данных на LS и до 64 на FS), поэтому для них не нужна фрагментация вывода, а их выполнение укладывается в 1–2 микрокадра.

Транзакция запуска вывода по прерыванию (Interrupt OUT) состоит из последовательности маркеров SS и OUT, за которыми следует пакет данных DATA0 или DATA1. Транзакция завершения состоит из последовательности маркеров CS и OUT, на которую транслятор отвечает пакетом подтверждения:

  • пакеты ACK, NAK и STALL — это обычные ответы целевой конечной точки;
  • NYET — признак незавершенности транзакции транслятором; при этом хост должен повторить транзакцию завершения в следующем микрокадре. Если этот ответ получен в седьмом (последнем) микрокадре, данная ситуация считается ошибкой и обрабатывается обычным образом;
  • ERR — сигнализация об ошибке фазы подтверждения на вторичной шине.

Транзакция запуска ввода по прерыванию (InterruptIN) состоит из последовательности маркеров SS и IN. Данные от устройства хост получит в пакетах 1–2 транзакций завершения. Транзакция завершения состоит из последовательности маркеров CS и IN, на которую транслятор отвечает пакетом данных или подтверждения (NAK, NYET, STALL или ERR с вышеописанными значениями). Если транслятор принял еще не все данные от целевого устройства, они придут в пакете MDATA (если принято менее трех байт, транслятор пошлет NYET), на что хост должен повторить транзакцию завершения в следующем микрокадре. Последняя порция данных придет в пакете DATA0 или DATA1.

Расщепление непериодических транзакций

Непериодические транзакции (управление и передача массивов) не критичны к времени выполнения; малый размер блока данных (до 64 байт) позволяет их расщеплять, используя по одной транзакции запуска и завершения.

Транзакции запуска вывода состоит из последовательности маркеров SS и OUT для массивов (Bulk OUT) или SS и SETUP для управления (Сontrol), за которыми следует пакет данных DATA0 или DATA1. Транслятор подтверждает запуск ответом ACK, после которого хост должен выполнить транзакцию завершения, или отвергает его пакетом NAK, после которого хост должен повторить запуск. Транзакция завершения состоит из маркеров CS и OUT, на что транслятор отвечает подтверждениями ACK, NAK, STALL (это обычные ответы целевой конечной точки) или NYET — транзакция еще не завершена, хосту следует позже повторить транзакцию завершения.

Транзакции запуска ввода состоит из последовательности маркеров SS и IN, транслятор своим ответом подтверждает (ACK) или отвергает (NAK) запуск. Транзакция завершения состоит из маркеров CS и IN, на что транслятор отвечает пакетом данных (DATA0 или DATA1) или подтверждениями NAK, STALL или NYET с вышеописанным значением.

Транслятор транзакций

Транслятор транзакций, входящий в хаб USB 2.0, служит для преобразования скоростей обмена по шине: высокой (HS) на стороне восходящего порта в полную или низкую (FS/LS) на стороне нисходящих портов, к которым подключены устройства USB 1.x. Транслятор выполняет расщепленные транзакции ввода/вывода и транслирует маркеры микрокадров в маркеры кадров, передаваемые в порты FS.

Расщепление транзакций организуется хостом, который знает текущую топологию шины (к портам каких хабов USB 2.0 подключены устройства или хабы 1.x). Расщепленные транзакции выполняются в два-три этапа, в зависимости от типа и направления передачи:

  • между хостом и транслятором выполняется специальная транзакция Start Split (SS, расщепленный запуск). Она несет всю информацию, необходимую для запуска транзакции с целевым устройством. На этом этапе транслятор играет роль специфически адресуемого устройства USB;
  • между транслятором и целевым устройством (хабом) USB 1.0 выполняется обычная транзакция, в которой транслятор играет роль хост-контроллера;
  • между хостом и транслятором выполняется специальная транзакция Complete Split (CS, расщепленное завершение), которая доносит хосту результаты выполнения транзакции хаба с целевым устройством. Здесь транслятор также играет роль специфически адресуемого устройства USB. Для изохронного вывода этот этап отсутствует, поскольку никакого ответа от целевого устройства не предусмотрено.

Во всех этих транзакциях используется обычная «молчаливая» реакция на прием поврежденных пакетов и механизм тайм-аутов.

Каждый нулевой маркер микрокадра хаб транслирует в виде полноскоростного маркера кадра SOF. Расщепленные транзакции на стороне FS/LS выполняются внутри этих кадров. Старт расщепленных транзакций хост планирует на нулевой микрокадр, чтобы к концу последнего (седьмого) микрокадра расщепленная транзакция могла быть завершена и все данные оказались бы переданы (чтобы не накапливать переходящих остатков). Временные соотношения между транзакциями на обеих сторонах транслятора иллюстрирует рисунок, где в качестве примера рассмотрено расщепление транзакции ввода.

Общая структура транслятора транзакций приведена на следующем рисунке. HS-обработчик (HS Handler) помещает информацию расщепленных запусков в свои буферы, а по запросам завершений выбирает из буферов результаты и передает их в виде пакетов хосту. Этот обработчик отрабатывает все обычные функции протокола USB, включая генерацию и проверку CRC, посылку хосту подтверждений и т. п. F/LSобработчик (F/LS-Handler) по выбранным из буферов запросам запусков формирует обычные транзакции USB, начинающиеся с маркеров IN, OUT, SETUP (а для LSпортов и с преамбулы PRE). Результаты этих транзакций (данные и подтверждения) он помещает в буферы. Транслятор транзакций обладает буферами, в которых размещаются все необходимые данные о текущих выполняемых расщепленных транзакциях. По завершении транзакции (на обеих сторонах) буфер освобождается для обслуживания следующих расщепленных транзакций.

Периодические транзакции (изохронные и прерывания), критичные к времени выполнения, транслятором обрабатываются по конвейерной схеме. Данные запусков периодических транзакций помещаются в SS-буфер, из которого они выбираются F/LS-обработчиком (буфер реализует дисциплину FIFO) и запускаются в виде транзакций на вторичную шину. Результаты этих транзакций помещаются в CS-буфер (тоже FIFO), откуда их извлекает хост. За порядок наполнения и опустошения этих буферов отвечает хост — он планирует транзакции SS и CS. Транзакции запусков проходят без подтверждений со стороны транслятора; хост узнает о судьбе транзакции только в фазе завершения.

Непериодические транзакции (управление и передача массивов) обрабатываются иначе: у транслятора имеется два или более буфера B/C In/Out, каждый из которых обслуживает по одной транзакции, от начала и до конца. Здесь транзакции запусков подтверждаются транслятором: ответ NAK означает невозможность приема транзакции к исполнению (нет свободных буферов), то есть хосту следует повторить попытку запуска. Ответ ACK означает, что транзакция принята к исполнению и через некоторое время следует забрать результат, выполнив транзакцию завершения.

Спецификация предусматривает два варианта реализации транслятора; какой именно применяется, можно узнать из кода протокола интерфейса хаба:

  • по одному транслятору на каждый нисходящий порт (код протокола — 2); это самый производительный вариант для умножения пропускной способности шины для устройств FS/LS;
  • один транслятор на все порты (код протокола — 1); здесь возможности умножения пропускной способности зависят от объема буферов периодических транзакций и количества буферов для непериодических.

В расщепленных транзакциях фаза маркера, определяющая продолжение транзакции, состоит из двух пакетов-маркеров: специального маркера SPLIT, формат которого приведен в таблице, за которым следует маркер обычной транзакции (IN, OUT, SETUP). Пакет-преамбула PRE в расщепленных транзакциях не используется — скорость целевого устройства задается в маркере SPLIT, что позволяет хабу провести транзакцию на нужной скорости. Транслятор сам генерирует преамбулу, если вторичный порт, через который обращаются к LS-устройству, опознал FSподключение (это означает, что между хабом, транслирующим транзакцию, и целевым устройством есть хаб USB 1.x). Маркер SPLIT адресуется к порту хаба (номера в полях HubAddr и PortAddr), а следующий за ним обычный маркер адресует конечную точку целевого устройства. Маркеры SPLIT, используемые для запуска (SS) и завершения (CS) расщепленных транзакций, различаются полем SC: 0 — для SS, 1 — для CS. Поле ET описывает тип целевой конечной точки, с которой будет производиться транзакция (00 — Control, 01 — Isochronous, 10 — Bulk, 11 — Interrupt). Поля S и E трактуются по-разному. Для управляющих транзакций и прерываний поле S определяет скорость (0 — FS, 1 — LS), E = 0. Для остальных транзакций, кроме запуска изохронного вывода, поля S и E содержат нули. В транзакциях запуска изохронного вывода поля S и E трактуются как признаки начала и конца данных соответственно.

Таблица. Формат маркеров SPLIT

Поле Sync PID Check Hub Addr SC Port Addr S E ET SRC EOP
Длина, бит 32 4 74 7 1 7 1 1 2 5 8


Обнаружение и локализация неисправных устройств

Хаб обеспечивает живучесть шины USB, автоматически запрещая работу нисходящих портов, от которых исходит угроза для работоспособности шины. Неисправное устройство, подключенное к порту, может не вовремя «замолчать» (потерять активность) или, наоборот, что-то «бормотать» (babble). Эти ситуации отслеживает ближайший к устройству хаб и запрещает восходящие передачи от такого устройства не позже чем по границе микрокадра. Хаб следит за тем, чтобы восходящие пакеты не пересекали границу микрокадра. Для этого в хабе имеется счетчик, который определяет следующие моменты в микрокадрах:

  • EOF1 — после этого момента не имеет права начинаться пакет от устройства;
  • EOF2 — начиная с этой точки, хаб ждет начала пакета только с восходящего порта (ожидается SOF).

Во время восходящей трансляции пакета (пока повторитель ожидает EOP) возможны особые ситуации:

  • обнаружен признак начала пакета на другом разрешенном порте — это коллизия; реакция хаба на нее может быть двоякой. Первый вариант — «испортить» трансляцию передачей к хосту вместо тела пакета постоянного состояния K или J. Хост-контроллер поймет эту ситуацию, правда, ценой потери чужого пакета. Второй вариант — игнорировать этот признак, пока не завершится текущая трансляция пакета. При этом хост о данной проблеме не узнает;
  • признак конца пакета в текущей трансляции не обнаружен, а время в микрокадре уже подошло к EOF2 — эта «болтливость» считается ошибкой для нисходящего порта, с которого идет трансляция. По этой ошибке хаб автоматически запрещает данный порт и фиксирует это изменение состояния в своем регистре. Еще одной причиной автоматического запрещения разрешенного порта является его состояние, отличное от покоя, с момента EOF2 до конца микрокадра.

Если восходящее соединение устанавливается после EOF1, то повторитель вместо трансляции кадра передает признак FSEOP, чтобы вышестоящий хаб не запретил работу порта, к которому подключен данный хаб. Если с нисходящего порта, вызвавшего эту ситуацию, не придет EOP до EOF2, то этот порт будет автоматически запрещен.

При трансляции пакетов и сигналов для LS-портов повторитель выполняет инвертирование сигнала, поскольку представление состояний J и K для них иное. Кроме того, нисходящий трафик не транслируется на порты LS, пока не придет специальный пакет PRE. После пакета PRE «вниз» на LS-порт транслируется только один пакет. Вместо маркеров SOF на LS-порт передается признак LS-EOP, чтобы устройство не приостановилось.

Для HSпортов повторитель устроен функционально сложнее — здесь требуется ресинхронизация (re-clocking). Помехи в линии и по питанию влияют на момент переключения состояния выхода приемника во время нарастания и спада входного сигнала — это приводит к дрожанию фазы (jitter). На невысоких (LS, FS) скоростях дрожание несущественно, поскольку время нарастания/спада сигнала существенно меньше длительности битового интервала. На скорости 480 Мбит/с это соотношение иное, и накопление дрожания в цепочке повторителей (хабов) привело бы к потере битовой синхронизации. Ресинхронизация выполняется с помощью эластичного буфера — небольшой FIFO-памяти, хранящей последовательность бит транслируемого сигнала. Информация в буфер — биты, извлеченные из NRZI-сигнала, — поступает от приемника порта на частоте входного сигнала (частота подстраивается по полю Sync). Из буфера информация поступает на передатчик(и), но синхронизируясь уже от внутреннего генератора хаба. Поскольку частоты входного сигнала и внутреннего генератора абсолютно точно совпадать не могут, темп заполнения буфера отличается от темпа его опустошения. Для компенсации этих расхождений в начале приема пакета его трансляция задерживается до тех пор, пока буфер не наполнится до половины; за время передачи пакета наполненность буфера может измениться. Эластичный буфер вносит свою лепту в задержку, вносимую хабом. Глубина буфера определяется исходя из допустимого отклонения скоростей: по спецификации частота синхронизации должна выдерживаться с точностью ± 0,05%, так что максимальное расхождение частот приема и передачи может достигать ± 0,1%. При этом на пакете максимальной длины (9644 бит) может «набегать» расхождение до 9644×0,1% ≈ 10 бит; с небольшим запасом половинную длину буфера определили в 12 бит. Аналогичная технология применяется в высокоскоростных локальных сетях (Fast Ethernet, FDDI).

HS-пакет, проходя через повторитель хаба, может не только потерять до 4 бит начала синхропоследовательности, но и «обрасти» дополнительным «хвостом» после признака EOP, также до 4 бит длиной (dribble bits). Это «обрастание», как и начальная потеря, обусловлено задержкой, вносимой детектором амплитуды сигнала HS-приемника. При прохождении через 5 хабов число лишних бит может достигать 20, но это не страшно — приемник информации все равно верно определит конец пакета по признаку EOP. Вышеуказанная максимальная длина пакета 9644 бит включает в себя эти лишние биты.



Контроллер хаба. Повторитель

Контроллер хаба является программно-видимым устройством USB, взаимодействуя с которым хост управляет конфигурированием устройств и соединениями на шине. Как и всякое устройство USB, контроллер хаба имеет набор дескрипторов, его описывающих. Для хабов определен специальный класс устройств (класс 09, подкласс 00). Интерфейс хаба (кроме обязательной нулевой контрольной точки) содержит конечную точку типа Interrupt-IN для информирования хоста о смене состояния. Управление хабом в целом и его портами выполняется с помощью специальных запросов к точке EP0. Их описание в табл.

Повторитель хаба обеспечивает динамические соединения между портами для трансляции пакетов и сигналов возобновления. В состоянии покоя повторителя все порты работают на прием и ожидают признака начала кадра или сигнала возобновления. По этим событиям устанавливается то или иное соединение портов (см. рисунок ниже).

В трансляции пакетов участвуют только разрешенные порты (восходящий разрешен всегда). Если какой-либо разрешенный порт обнаружил начало пакета, то устанавливается соединение в соответствии с рисунком б или в, и повторитель транслирует пакет, дожидаясь его конца (признака EOP). По концу пакета повторитель опять переходит в состояние покоя. Из рисунков видно, что нисходящий трафик транслируется широковещательно. Восходящий трафик транслируется сугубо направленно, так, что его «видят» только хабы, расположенные в цепочке от устройства к хосту, но не другие устройства.

Сигнал возобновления (resume) транслируется несколько иначе. С восходящего порта сигнал resume транслируется во все нисходящие порты, кроме запрещенных и селективно приостановленных. Сигнал resume, обнаруженный на нисходящем разрешенном порте, подхватывается хабом и транслируется в восходящий порт и во все нисходящие порты (включая и порт-источник сигнала), кроме запрещенных и селективно приостановленных. С селективно приостановленного порта сигнал возобновления подхватывается и транслируется обратно только в этот же порт, после чего хаб завершает сигнализацию возобновления (LS-EOP) и переводит порт в разрешенное состояние.