Перечисление USB (enumeration)
Когда вы втыкаете устройство в порт, компьютер сначала ничего о нём не знает: ни что это, ни какой нужен драйвер, ни сколько тока ему дать. Всё это он выясняет в процессе перечисления — короткого разговора через нулевую конечную точку.
Обновлено Редакция GAW
Перечисление (enumeration) — процедура, в которой хост USB знакомится с только что подключённым устройством: сбрасывает его, назначает адрес, читает описание и выбирает конфигурацию. Спецификация USB 2.0 описывает её в разделе 9.1.2 как последовательность изменения состояний устройства: Powered → Default → Address → Configured.
Шаги по спецификации USB 2.0
- Подключение. Хаб сообщает хосту о событии на своём порту. Устройство получило питание, но порт ещё выключен.
- Ожидание и сброс. Хост ждёт не меньше 100 мс, пока питание установится, затем включает порт и подаёт сброс. После сброса устройство в состоянии Default: отвечает по адресу 0 и берёт не больше 100 мА.
- Адрес. Хост запросом SET_ADDRESS назначает устройству уникальный адрес — одно из 127 значений; адрес 0 зарезервирован как адрес по умолчанию.
- Дескриптор устройства. Хост читает дескриптор устройства и узнаёт наибольший размер пакета нулевой конечной точки, а также идентификаторы VID и PID.
- Конфигурации. Хост читает дескрипторы конфигураций с интерфейсами и конечными точками.
- Выбор конфигурации. Запросом SET_CONFIGURATION хост включает одну из них. Устройство переходит в состояние Configured, его конечные точки начинают работать, и оно может брать ток, заявленный в дескрипторе.
Весь обмен идёт управляющими передачами через нулевую конечную точку — она есть у каждого устройства. Драйвер операционная система выбирает по идентификаторам и кодам класса: по USB-IF, коды класса служат именно для того, чтобы определить функцию устройства и загрузить драйвер.
Тайминги
После сброса спецификация даёт устройству 10 мс на восстановление, а на выполнение запроса SET_ADDRESS — до 50 мс. Прошивка, которая надолго задерживает ответы нулевой точки, рискует не пройти перечисление.
Не путать с перечислимым типом (enum) в языке C — это совсем другое понятие, хотя по-английски слова однокоренные.
Частые вопросы
Что значит «Устройство USB не опознано»?
Перечисление не завершилось: хост увидел подключение, но не смог прочитать дескриптор устройства или назначить адрес. Искать причину стоит по шагам перечисления: видит ли хост подключение (подтяжка на линии D+ или D−, не перепутаны ли линии), отвечает ли устройство на запросы нулевой точки по адресу 0 и успевает ли выполнить SET_ADDRESS. Типичные ошибки разобраны в статье об интерфейсе USB.
Сколько тока устройство может брать до перечисления?
После сброса, в состоянии Default, не больше 100 мА (одна единица нагрузки USB 2.0). Ток, заявленный в дескрипторе конфигурации, разрешён только после того, как хост выбрал эту конфигурацию.
Почему перечисление идёт через нулевую конечную точку?
Потому что только она есть у любого устройства с самого начала и доступна по адресу по умолчанию — нулю. Остальные конечные точки описаны в дескрипторах и начинают работать лишь после того, как хост выберет конфигурацию.
Источники
- 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 устройств
- USB-IF. Defined Class Codes — коды класса (Base Class, SubClass, Protocol) в дескрипторе устройства или интерфейса служат для определения функции устройства и загрузки драйвера
Нашли ошибку?