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).


Sitelinkx by eXtro-media.de
Яндекс.Метрика