Перейти к содержанию

Перечисление USB (enumeration)

Когда вы втыкаете устройство в порт, компьютер сначала ничего о нём не знает: ни что это, ни какой нужен драйвер, ни сколько тока ему дать. Всё это он выясняет в процессе перечисления — короткого разговора через нулевую конечную точку.

Обновлено Редакция GAW

Перечисление (enumeration) — процедура, в которой хост USB знакомится с только что подключённым устройством: сбрасывает его, назначает адрес, читает описание и выбирает конфигурацию. Спецификация USB 2.0 описывает её в разделе 9.1.2 как последовательность изменения состояний устройства: Powered → Default → Address → Configured.

Шаги по спецификации USB 2.0

  1. Подключение. Хаб сообщает хосту о событии на своём порту. Устройство получило питание, но порт ещё выключен.
  2. Ожидание и сброс. Хост ждёт не меньше 100 мс, пока питание установится, затем включает порт и подаёт сброс. После сброса устройство в состоянии Default: отвечает по адресу 0 и берёт не больше 100 мА.
  3. Адрес. Хост запросом SET_ADDRESS назначает устройству уникальный адрес — одно из 127 значений; адрес 0 зарезервирован как адрес по умолчанию.
  4. Дескриптор устройства. Хост читает дескриптор устройства и узнаёт наибольший размер пакета нулевой конечной точки, а также идентификаторы VID и PID.
  5. Конфигурации. Хост читает дескрипторы конфигураций с интерфейсами и конечными точками.
  6. Выбор конфигурации. Запросом SET_CONFIGURATION хост включает одну из них. Устройство переходит в состояние Configured, его конечные точки начинают работать, и оно может брать ток, заявленный в дескрипторе.

Весь обмен идёт управляющими передачами через нулевую конечную точку — она есть у каждого устройства. Драйвер операционная система выбирает по идентификаторам и кодам класса: по USB-IF, коды класса служат именно для того, чтобы определить функцию устройства и загрузить драйвер.

Тайминги

После сброса спецификация даёт устройству 10 мс на восстановление, а на выполнение запроса SET_ADDRESS — до 50 мс. Прошивка, которая надолго задерживает ответы нулевой точки, рискует не пройти перечисление.

Не путать с перечислимым типом (enum) в языке C — это совсем другое понятие, хотя по-английски слова однокоренные.

Частые вопросы

Что значит «Устройство USB не опознано»?

Перечисление не завершилось: хост увидел подключение, но не смог прочитать дескриптор устройства или назначить адрес. Искать причину стоит по шагам перечисления: видит ли хост подключение (подтяжка на линии D+ или D−, не перепутаны ли линии), отвечает ли устройство на запросы нулевой точки по адресу 0 и успевает ли выполнить SET_ADDRESS. Типичные ошибки разобраны в статье об интерфейсе USB.

Сколько тока устройство может брать до перечисления?

После сброса, в состоянии Default, не больше 100 мА (одна единица нагрузки USB 2.0). Ток, заявленный в дескрипторе конфигурации, разрешён только после того, как хост выбрал эту конфигурацию.

Почему перечисление идёт через нулевую конечную точку?

Потому что только она есть у любого устройства с самого начала и доступна по адресу по умолчанию — нулю. Остальные конечные точки описаны в дескрипторах и начинают работать лишь после того, как хост выберет конфигурацию.

Источники

  1. USB-IF. Universal Serial Bus Specification, Revision 2.0 (пакет usb_20_20250603) — разд. 9.1.2 Bus Enumeration, шаги 1–8: хаб сообщает о подключении, порт выключен, устройство в состоянии Powered; хост ждёт не меньше 100 мс, включает и сбрасывает порт; после сброса — состояние Default, ток не больше 100 мА, адрес по умолчанию; хост назначает уникальный адрес (Address), читает дескриптор устройства и размер пакета нулевой точки, читает конфигурации, назначает конфигурацию (Configured) — устройство может брать ток по дескриптору; разд. 8.3.2: адрес 0 зарезервирован как адрес по умолчанию; разд. 9.2.6.2: 10 мс на восстановление после сброса; табл. 7-14: TDSETADDR — SetAddress() выполняется не дольше 50 мс; табл. 9-3 и 9-4: стандартные запросы GET_DESCRIPTOR, SET_ADDRESS, SET_CONFIGURATION; до 127 устройств
  2. USB-IF. Defined Class Codes — коды класса (Base Class, SubClass, Protocol) в дескрипторе устройства или интерфейса служат для определения функции устройства и загрузки драйвера

Нашли ошибку?