Что такое задержка перечисления usb

Обновлено: 03.07.2024

Когда размер EP0 (bMaxPacketSize0 в дескрипторе) равен 16 или 8 в Linux, существует задержка около 7 сек., прежде чем перечисление завершится сбоем, а в Windows 10 управление устройством сообщает, что дескриптор устройства недействителен.

Я тестирую пример cdcacm в папке stm32-h103 и аналогичную программу на устройстве stm32f105.

Текст был успешно обновлен, но возникли следующие ошибки:

FabianInostroza прокомментировал 20 сентября 2018 г.

У меня нет OSX для тестирования.

FabianInostroza прокомментировал 20 сентября 2018 г.

karlp прокомментировал 24 сентября 2018 г.

Я подтверждаю наличие проблемы. На моем хосте Linux с stm32l1 и ep0 из 16:

karlp прокомментировал 24 сентября 2018 г.

Я хотел бы диагностировать это дальше, я попросил друга посмотреть, что происходит с анализатором USB.

А пока "прекратите это делать" :) У вас есть какая-то конкретная причина использовать 16 или 8 байт для EP0? (Кроме "спецификация позволяет это")

karlp прокомментировал 24 сентября 2018 г.

То же самое происходит на устройстве F4 с dwc_otg.

Прокомментировал FabianInostroza 24 сентября 2018 г. •

У меня нет причин использовать размер EP меньше 32. Случайно я обнаружил проблему и попытался исправить ее для развлечения и обучения.
Я анализировал проблему и обнаружил, что после первой перезагрузки интерфейса хост запрашивает дескриптор устройства и после того, как устройство отправит первый пакет, хост начинает отправлять токены (этап состояния), но периферия отправляет NAK и драйвер не получает прерывание.
Затем время запроса на получение дескриптора истекает через 5 с, и кажется, что для linux первых байтов дескриптора достаточно для назначения адреса и продолжения перечисления, выдачи другого сброса и повторного запроса дескриптора, окна, похоже, не терпят этого (короткий дескриптор и время ожидания).

Я проанализировал процесс перечисления FT232RL, устройства FS с bMaxPacketSize0 = 8, и он подтверждает этап состояния, который драйвер в libopencm3 игнорирует/не получает.

FabianInostroza прокомментировал 24 сентября 2018 г.

Я отправил захват sigrok/pulseview во время перечисления в образец репозитория, есть некоторые ошибки из-за частоты выборки и/или тестов, но это показывает проблему.

FabianInostroza прокомментировал 24 сентября 2018 г.

Из спецификаций USB, 5.5.3 Ограничения размера пакета передачи управления

Чтобы определить максимальный размер пакета для канала управления по умолчанию, системное программное обеспечение USB
считывает дескриптор устройства. Хост прочитает первые восемь байтов дескриптора устройства. Устройство
всегда отвечает как минимум этими начальными байтами в одном пакете. После того, как хост прочитает начальную часть
дескриптора устройства, он гарантированно прочитает поле wMaxPacketSize этого канала по умолчанию (байт 7
дескриптора устройства).

karlp прокомментировал 24 сентября 2018 г.

да, я знаю, что это разрешено, и это определенно ошибка, мне просто было любопытно, есть ли для этого причина :)

zyp прокомментировал 25 сентября 2018 г.

Я немного разобрался в этом, и мне кажется, что это вызвано преднамеренным неуказанным поведением на хосте, предназначенным для работы с определенными устройствами, которые также не соответствуют спецификации.


Вот трассировка, которую я сделал прошлой ночью с MPS, установленным на 16:

Первый снимок сделан с помощью macos. Здесь мы видим, что хост сначала запрашивает первые 8 байтов, узнает от них MPS, а затем правильно читает весь дескриптор, разбитый на 16-байтовые фрагменты.

Второй захват с linux. Здесь мы видим, что linux отправляет пакет SETUP для чтения 64-байт, а устройство отвечает первым 16-байтовым фрагментом. Пока устройство ожидает отправки второго фрагмента, хост считает, что этап данных завершен, и пытается отправить пакет состояния OUT, поэтому ни один из них не принимается другой стороной, а время запроса управления истекает через пять секунд. Несмотря на то, что время запроса частично истекло, Linux, похоже, узнал от него MPS и впоследствии правильно перечислил устройство.

Кто-то на IRC-канале дал ссылку на эту статью, которая предполагает, что Windows делает примерно то же самое, и дает некоторое представление о том, почему. Сегодня вечером я попытаюсь отследить перечисление в Windows, чтобы понять, почему оно не работает.

Я подозреваю, что эта проблема могла быть усугублена недавними улучшениями управления потоком. До изменения я предполагаю, что пакет состояния OUT был бы принят, даже если это было неожиданно.

Я не знаю, что нам делать с этой проблемой. Если бы речь шла только о тайм-ауте, было бы достаточно справедливо сказать, что вам придется с этим смириться, когда вы настаиваете на использовании менее распространенного MPS, но поскольку это приводит к полному сбою перечисления в Windows, мы, вероятно, должны что-то сделать. .

Самое чистое решение с внешней точки зрения было бы просто принять статус OUT после первого фрагмента, но это то, что мы хотели бы сделать только для этого конкретного запроса, и это вводит кучу специального регистра в состояние управления. машина.

В бесплатной учебной библиотеке OSR содержится более 50 статей по широкому кругу тем, связанных с написанием и отладкой драйверов устройств и мини-фильтров. От начального уровня до продвинутого. Все статьи были недавно пересмотрены и обновлены, и они написаны с использованием ясного и определенного стиля, который вы привыкли ожидать от OSR на протяжении многих лет.

У меня проблема. Я разрабатываю USB-устройство на базе микроконтроллера AT91
. Проблема заключается в том, что время загрузки устройства относительно медленное,
поскольку устройство должно выполнять «длительные» операции, чтобы прочитать свой серийный номер.
Причина, по которой мне нужно прочитать серийный номер при загрузке MCU заключается в том, что я хочу
установить дескриптор серийного номера USB на реальный серийный номер устройства.
Но из-за «длительной» загрузки MCU инициализация стека USB задерживается. .
Но в качестве побочного эффекта я получаю сообщение "USB-устройство не распознано" XP.
Думаю, после того, как устройство представлено на шине USB, требуется "больше" по сравнению с
"обычными устройствами". " чтобы мое устройство отвечало на команды шины USB.

Есть ли какое-либо решение этой проблемы?
Или мне прочитать серийный номер как можно быстрее?
Спасибо,

Комментарии

Тибор Харсеги написал:

> Проблема заключается в том, что время загрузки устройства относительно
> медленное, потому что устройство должно выполнять "длительные" операции, чтобы
> считать свой серийный номер. Причина, по которой мне нужно считывать
> серийный номер при загрузке MCU, заключается в том, что я хочу установить серийный номер
> дескриптора USB на реальный серийный номер устройства.

Сколько энергии требуется вашему устройству для считывания серийного номера из его "внутренностей"? Я полагаю, вы могли бы украсть немного энергии из шины, фактически не перечисляя себя. Как только вы будете готовы поговорить в автобусе, вы можете явиться для подсчета голосов с серийным номером на руках.

Peter_Viscarola_(OSR)< бр />

Peter_Viscarola_(OSR) Сообщения администратора: 8875

Мне нравится идея Криса.

Еще одна мысль может состоять в том, чтобы наложить процесс получения серийного номера на "другие вещи", которые происходят. На самом деле вам *не нужен* серийный номер до ВТОРОГО запроса дескриптора устройства (ПЕРВЫЙ запрос никогда не возвращает его), верно? Таким образом, с момента подключения вашего устройства до момента получения второго запроса дескриптора устройства у вас есть НЕКОТОРОЕ время.

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

Думаю, это зависит от того, насколько "медленным" на самом деле является процесс,

Tim_Roberts

Член Tim_Roberts — Всего сообщений электронной почты: 14 234

[email protected] написал:
> У меня проблема. Я разрабатываю USB-устройство на базе микроконтроллера AT91
>. Проблема заключается в том, что время загрузки устройства относительно медленное,
> потому что устройство должно выполнять «длительные» операции, чтобы прочитать свой серийный номер.
> Причина, по которой мне нужно прочитать серийный номер при загрузке MCU заключается в том, что я хочу
> установить дескриптор серийного номера USB на реальный серийный номер устройства.
> Но из-за «длительной» загрузки MCU USB инициализация стека задерживается.
> Но в качестве побочного эффекта я получаю «USB-устройство не распознано» XP.
> Угадайте, что после того, как устройство представлено на шине USB, требуется «больше» по сравнению с< br />> «обычные устройства», чтобы мое устройство отвечало на команды шины USB.
>

Максимальная задержка перечисления определяется спецификацией USB.
Это не просто какой-то капризный тайм-аут, придуманный XP.

> Есть ли какое-то решение этой проблемы?
> Или мне прочитать серийный номер как можно быстрее?
>

Я столкнулся с точно такой же проблемой с чипом Cypress FX2 - загрузка
прошивки из EEPROM слишком долго задерживала перечисление. Более ранним хост-контроллерам USB
было все равно, но более поздним было все равно. FX2 имеет бит конфигурации, который указывает, должна ли его шина EEPROM I2C работать на частоте 100 кГц или 400 кГц. Я решил свою проблему, переключившись на более высокую скорость I2C.

Единственное решение — починить устройство.

--
Тим Робертс, [email protected]
Providenza & Boekelheide, Inc.

Тим Робертс, [email protected]
Providenza & Boekelheide, Inc.

Перечисление шины не начнется, пока устройство не подтвердит свое присутствие на
шине. Вы можете взять питание (максимум 100 мА) перед этим и загрузить устройство. Если
вы только после этого утвердите линии данных, хост увидит устройство и
запустит перечисление. Конечно, если вы жестко подключены к шине, вы, возможно,
не сможете отложить перечисление, но некоторые последние интерфейсы шины
программируются и поддерживают шину до тех пор, пока вы не решите утвердить. Спецификация USB 2.0
говорит, что вы должны активировать подключение в течение 100 мс после горячего подключения, но на практике это, вероятно, может занять больше времени, так как я не видел, чтобы концентратор отключал
питание в некоторых своего рода электронное раздражение при задержке (это может быть более вероятно
на хостах с низким энергопотреблением, таких как ноутбуки). Даже если вы не хотите этого делать, это
дает вам дополнительные 100 мс, что может дать вам время для получения необходимых
данных о серийном номере. М

[email protected] написал:
> У меня проблема. Я разрабатываю USB-устройство на базе микроконтроллера AT91
>. Проблема заключается в том, что время загрузки устройства относительно медленное,
> потому что устройство должно выполнять «длительные» операции, чтобы прочитать свой серийный
> номер.
> Причина, по которой Мне нужно прочитать серийный номер при загрузке MCU, потому что я хочу
> установить дескриптор серийного номера USB на реальный серийный номер
> устройства.
> Но из-за "длительная" загрузка MCU инициализация стека USB
> задерживается.
> Но как побочный эффект я получаю "USB-устройство не распознано" XP.
> Угадайте после устройства представлена ​​на шине USB, требуется «больше» по сравнению с
> для
> «обычных устройств», чтобы мое устройство отвечало на команды шины USB.
>

Если я правильно помню, устройство, которое не соответствует лимиту в 100 мс, не пройдет сертификацию USB-IF
. У нас была эта проблема в прошлом
и нам пришлось исправить прошивку, чтобы включить блокировку USB на более ранней стадии загрузки,
что занимало больше времени.

В любом случае, хорошая идея. Для чтения серийного номера может хватить дополнительных 100 мс.

Это сработает, но. Я боюсь, что есть хороший шанс вызвать некоторую
ошибку в стеке USB или загруженном функциональном драйвере и получить BSOD. Повторное перечисление
должно быть выполнено в течение относительно короткого промежутка времени (одна секунда?) после
подключаемого модуля (во избежание нежелательного взаимодействия с пользователем), а во время инициализации стека может произойти неожиданное
удаление. В принципе ничего плохого, но на практике
проблем напрашивается. Кроме того, пользователь, вероятно,
жалуется на исчезновение звука устройства.

Идентификация всех устройств, подключенных к системе, и инициализация необходимых процедур (драйверов), обеспечивающих их работу.

Что такое задержка перечисления USB?

Это параметр, описывающий количество времени, которое дается запоминающим устройствам, чтобы позволить им «успокоиться» перед использованием.

Что такое нумерация шин в USB?

Когда USB-устройство подключается к USB-устройству или отсоединяется от него, хост использует процесс, известный как перечисление шины, для идентификации и управления необходимыми изменениями состояния устройства. Концентратор, к которому теперь подключено USB-устройство, информирует хост о событии через ответ в канале изменения состояния (см. Раздел 11.12.

Как определяется USB-устройство?

Хост или концентратор USB распознает наличие этого резистора и инициирует перечисление при его появлении. USB использует опрос для перечисления и обнаружения потери устройства. Если ведомое USB-устройство не отвечает в течение определенного промежутка времени, USB-соединение теряется, даже если устройство не отключено от сети.

Какое правильное определение перечисления?

1: действие или процесс составления или составления списка вещей один за другим эффективное перечисление народных недовольств лидером повстанцев также: сам список Ресторан создает поразительный ассортимент консервированных продуктов…

Как пронумеровать USB-накопитель?

Чтобы завершить перечисление USB, необходимо выполнить следующие пять шагов:

  1. Хост считывает дескриптор устройства с USB-устройства.
  2. Хост назначает адрес для USB-устройства.
  3. Хост считывает дескриптор конфигурации с USB-устройства.
  4. Хост считывает дескриптор интерфейса с USB-устройства.

Что такое перечисление устройств в Linux?

Каждый раз, когда USB-устройство подключается к шине, оно будет нумероваться подсистемой USB, т. е. присваивается уникальный номер устройства (1–127), а затем считывается дескриптор устройства. Дескриптор — это структура данных, которая содержит информацию об устройстве и его свойствах.

Какое использование процесса перечисления в USB?

Процесс перечисления гарантирует, что каждое подключенное USB-устройство распознается хостом для обеспечения надлежащей передачи данных.Без перечисления хост не может определить тип устройства и используемый тип передачи данных, интервал отправки данных или даже скорость связи.

Что такое дескриптор USB?

Дескриптор содержит такую ​​информацию, как тип устройства, идентификатор поставщика, совместимая версия USB, количество поддерживаемых устройством конфигураций, количество конечных точек и т. д. Периферийное устройство USB должно отвечать дескрипторами по запросу хоста.

Почему мой компьютер не может прочитать мой USB?

Причины, по которым ваш компьютер не распознает ваше USB-устройство, включают: Проблема с драйвером USB. USB-накопитель неправильно отформатирован. USB-накопитель не работает.

Что такое пример перечисления?

Перечисление определяется как перечисление вещей по одному или уточнение количества вещей. Пример перечисления — когда вы перечисляете все работы автора одну за другой. Пресс-секретарь перечислил требования забастовщиков.

Перечисление: как хост узнает об устройствах

Одной из обязанностей концентратора является обнаружение подключения и удаления устройств на портах, обращенных к нисходящему каналу. Каждый концентратор имеет конечную точку прерывания IN для сообщения об этих событиях хосту. При загрузке системы концентраторы сообщают хосту, подключены ли какие-либо устройства, включая дополнительные нижестоящие концентраторы и любые устройства, подключенные к этим концентраторам. После загрузки хост продолжает периодически опрашивать (USB 2.0) или получать ERDY TP (Enhanced SuperSpeed), которые запрашивают связь, чтобы узнать о любых новых подключенных или удаленных устройствах.

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

С точки зрения пользователя перечисление невидимо и выполняется автоматически, но может отображать сообщение о новом устройстве и об успешной его настройке. Иногда при первом использовании пользователю требуется помощь в выборе драйвера или указание хосту, где искать файлы драйвера. В Windows после завершения перечисления новое устройство появляется в диспетчере устройств. (Щелкните правой кнопкой мыши «Компьютер», выберите «Управление» и на панели «Управление компьютером» выберите «Диспетчер устройств».) При отсоединении устройство исчезает из диспетчера устройств. В типичном устройстве прошивка декодирует и отвечает на полученные запросы информации. Некоторые контроллеры могут полностью аппаратно управлять нумерацией, за исключением, возможно, значений, предоставляемых поставщиком, в EEPROM или другой памяти. На стороне хоста перечислением занимается операционная система.

Переход к настроенному состоянию

Спецификация USB 2.0 определяет шесть состояний устройства. Во время перечисления устройство проходит через состояния Powered, Default, Address и Configured. (Другие определенные состояния — «Подключено» и «Приостановлено».) В каждом состоянии устройство имеет определенные возможности и поведение.

Типичная последовательность USB 2.0

Приведенные ниже шаги представляют собой типичную последовательность событий, происходящих при перечислении устройства USB 2.0 в Windows. Микропрограмма устройства не должна предполагать, что запросы перечисления и события будут происходить в определенном порядке. В разных ОС и разных выпусках ОС может использоваться разная последовательность. Для успешной работы устройство должно обнаруживать и реагировать на любой запрос управления или другое событие шины в любое время, как того требуют спецификации USB. На рис. 4-1 показаны полученные запросы и другие события во время перечисления устройств.

<р>1. В системе появилось новое устройство. Пользователь подключает устройство к порту USB, или система включается с подключенным устройством. Порт может находиться на корневом концентраторе на хосте или на концентраторе, который подключается в нисходящем направлении от хоста. Концентратор подает питание на порт, а устройство находится в состоянии Powered. Устройство находится в состоянии «Подключено» и может потреблять от шины до 100 мА.

<р>2. Хаб обнаруживает устройство. Концентратор отслеживает напряжения на сигнальных линиях (D+ и D-) на каждом из своих портов. Концентратор имеет подтягивающий резистор 14,25–24,8 кВт на каждой линии. Устройство имеет подтягивающий резистор 900–1575 Вт на D+ для полноскоростного устройства или на D- для низкоскоростного устройства. Высокоскоростные устройства подключаются на полной скорости. При подключении к порту устройство подключается к шине путем поднятия соответствующей подтягивающей линии на высокий уровень, чтобы концентратор мог обнаружить, что устройство подключено. За исключением некоторых устройств со слабыми или разряженными батареями, устройство должно подключиться в течение 1 с после обнаружения того, что VBUS составляет не менее 0,8 В. Устройство может продолжать потреблять 100 мА тока шины в течение 1 с после подключения независимо от того, находится ли восходящий сегмент шины. приостановлено.При обнаружении устройства концентратор продолжает подавать питание, но еще не передает USB-трафик на устройство. В главе 16 подробнее о том, как концентраторы обнаруживают устройства.

<р>3. Хост узнает о новом устройстве. Каждый концентратор использует свою конечную точку прерывания для сообщения о событиях в концентраторе. В отчете указывается только, произошло ли событие на концентраторе или порте (и если да, то на каком порту). Узнав о событии, хост отправляет концентратору запрос на получение статуса порта, чтобы узнать больше. Получить статус порта и другие запросы класса концентратора, используемые во время перечисления, являются стандартными запросами, которые поддерживаются всеми концентраторами. Возвращаемая информация сообщает хосту о новом подключении устройства.

<р>4. Концентратор определяет, работает ли устройство на низкой или полной скорости. Непосредственно перед сбросом устройства концентратор определяет, работает ли устройство на низкой или полной скорости, определяя, какая сигнальная линия имеет более высокое напряжение в режиме ожидания. Концентратор отправляет информацию хосту в ответ на следующий запрос Get Port Status. Вместо этого концентратор USB 1.1 может определить скорость устройства сразу после сброса шины. USB 2.0 требует определения скорости перед сбросом, чтобы концентратор знал, следует ли проверять устройство с поддержкой высокой скорости во время сброса, как описано ниже.

<р>5. Хаб перезагружает устройство. Когда хост узнает о новом устройстве, он отправляет концентратору запрос Set Port Feature, который просит концентратор сбросить порт. Концентратор переводит линии передачи данных USB устройства в состояние Reset не менее чем на 10 мс. Сброс — это особое состояние, при котором и D+, и D- имеют низкий логический уровень. (Обычно линии имеют противоположные логические состояния.) Концентратор отправляет сброс только новому устройству. Другие концентраторы и устройства на шине сброса не видят.

<р>6. Хост узнает, поддерживает ли полноскоростное устройство высокую скорость. Для определения того, поддерживает ли устройство высокую скорость, используются два специальных состояния сигнала. В состоянии Chirp J возбуждается только линия D+, а в состоянии Chirp K возбуждается только линия D-.
Во время сброса устройство, поддерживающее высокую скорость, отправляет Chirp K. Высокоскоростной концентратор обнаруживает Chirp K и отвечает серией чередующихся Chirp K и Chirp J. При обнаружении шаблона KJKJKJ, устройство убирает свою полноскоростную подтяжку и осуществляет все дальнейшие коммуникации на высокой скорости. Если концентратор не отвечает на Chirp K устройства, устройство знает, что оно должно продолжать обмениваться данными на полной скорости. Все высокоскоростные устройства должны быть способны отвечать на запросы передачи управления на полной скорости.

<р>7. Концентратор устанавливает путь прохождения сигнала между устройством и шиной. Хост проверяет, что устройство вышло из состояния сброса, отправляя запрос на получение состояния порта. Бит в возвращенных данных указывает, находится ли устройство все еще в состоянии сброса. При необходимости хост повторяет запрос до тех пор, пока устройство не выйдет из состояния сброса.

Когда концентратор удаляет сброс, устройство находится в состоянии по умолчанию. Регистры USB устройства находятся в состоянии сброса, и устройство готово отвечать на передачу управления в нулевой конечной точке. Устройство взаимодействует с хостом, используя адрес по умолчанию 0x00.

<р>8. Хост отправляет запрос Get Descriptor, чтобы узнать максимальный размер пакета канала по умолчанию. Хост отправляет запрос на адрес устройства 0x00, конечная точка ноль. Поскольку хост одновременно перечисляет только одно устройство, только одно устройство будет отвечать на сообщения, адресованные устройству с адресом 0x00, даже если несколько устройств подключены одновременно.

Восьмой байт дескриптора устройства содержит максимальный размер пакета, поддерживаемый нулевой конечной точкой. Хост может запросить 64 байта, но после получения всего одного пакета (независимо от того, содержит он 64 байта или нет) может начать этап передачи состояния.

По завершении этапа «Состояние» Windows может запросить у концентратора сброс настроек устройства, как на шаге 5 выше. Спецификация USB 2.0 здесь не требует сброса. Сброс — это мера предосторожности, которая гарантирует, что устройство будет в известном состоянии, когда сброс завершится. Windows 8 и более поздние версии пропускают второй сброс для высокоскоростных устройств, поскольку эти устройства обычно не требуют второго сброса. Если перечисление завершается ошибкой без второго сброса, Windows включает сброс при следующей попытке перечисления.

<р>9. Хост назначает адрес. После завершения сброса хост-контроллер назначает устройству уникальный адрес, отправляя запрос Set Address. Устройство завершает стадию статуса запроса, используя адрес по умолчанию, а затем реализует новый адрес. Теперь устройство находится в состоянии адреса. Все коммуникации с этого момента используют новый адрес. Адрес действителен до тех пор, пока устройство не будет отключено, хаб не сбросит порт или система не перезагрузится. При следующем перечислении хост может назначить устройству другой адрес.

<р>10. Ведущий узнает о возможностях устройства. Хост отправляет запрос Get Descriptor на новый адрес, чтобы прочитать дескриптор устройства. На этот раз хост получает весь дескриптор.Дескриптор содержит максимальный размер пакета для нулевой конечной точки, количество поддерживаемых устройством конфигураций и другую информацию об устройстве.

Хост продолжает узнавать об устройстве, запрашивая дескрипторы конфигурации, указанные в дескрипторе устройства. Запрос дескриптора конфигурации на самом деле является запросом дескриптора конфигурации, за которым следуют все его подчиненные дескрипторы до запрошенного количества байтов.

Если хост запрашивает 255 байт, устройство отвечает, отправляя дескриптор конфигурации, за которым следуют все подчиненные дескрипторы конфигурации, включая дескрипторы интерфейса, причем за каждым дескриптором интерфейса следуют любые дескрипторы конечной точки для интерфейса. Некоторые конфигурации также имеют дескрипторы, относящиеся к классу или поставщику.

Одним из полей дескриптора конфигурации является общая длина дескриптора конфигурации и подчиненных ему дескрипторов. Если значение больше 255, устройство возвращает 255 байт. Затем Windows снова запрашивает дескриптор конфигурации, на этот раз запрашивая количество байтов в общей длине, указанной в дескрипторе конфигурации.

Предыдущие версии Windows начинали с запроса только девяти байтов дескриптора конфигурации для получения значения общей длины, а затем запрашивали полный набор дескрипторов.

<р>11. Хост запрашивает дополнительную информацию с устройства. Затем хост может запросить у устройства дополнительные дескрипторы. В любом случае устройство, которое не поддерживает запрошенный дескриптор, должно возвращать STALL.

Когда дескриптор устройства сообщает, что это устройство USB 2.1 или выше, хост запрашивает дескриптор BOS. Если устройство возвращает дескриптор BOS, хост использует значение общей длины дескриптора для запроса дескриптора BOS, за которым следуют его подчиненные дескрипторы.

Хост запрашивает нулевой дескриптор строки, который содержит один или несколько кодов, указывающих, какие языки используются в дополнительных строках.

Если дескриптор устройства сообщает, что устройство содержит строковый дескриптор серийного номера, хост запрашивает этот дескриптор.

Если дескриптор устройства указывает, что устройство содержит дескриптор строки продукта, хост запрашивает этот дескриптор.
Для устройств USB 2.0 и более поздних версий, если Windows не имеет записи о предварительном получении строкового дескриптора MS OS, специфичного для Microsoft, ОС может запросить этот дескриптор.

Если дескриптор BOS или строковый дескриптор ОС Microsoft указывает на поддержку дополнительных дескрипторов, определенных Microsoft, хост может запросить эти дескрипторы.

Для устройств USB 2.0 или выше, работающих на полной скорости с восходящим концентратором USB 1.1, хост запрашивает дескриптор квалификатора устройства. Устройство, которое возвращает этот дескриптор, способно работать на высокой скорости, если все исходящие порты — USB 2.0 или выше.

<р>12. Хост назначает и загружает драйвер устройства (кроме составных устройств). Узнав об устройстве из его дескрипторов, хост ищет наилучшее соответствие в драйвере для управления связью с устройством. Хосты Windows используют файлы INF для определения наилучшего соответствия. Файл INF может быть системным файлом для класса USB или файлом, предоставленным поставщиком, который содержит идентификатор поставщика и идентификатор продукта устройства. В главе 9 подробнее о файлах INF и выборе драйвера.

Для устройств, которые были перечислены ранее, Windows может использовать сохраненную информацию вместо поиска в INF-файлах. После того, как операционная система назначит и загрузит драйвер, драйвер может запросить у устройства повторную отправку дескрипторов или отправку других дескрипторов, относящихся к классу.

Исключением из этой последовательности являются составные устройства, которым могут быть назначены разные драйверы для нескольких интерфейсов в конфигурации. Хост может назначить эти драйверы только после включения интерфейсов, поэтому хост должен сначала настроить устройство, как описано ниже.

<р>13. Драйвер устройства хоста выбирает конфигурацию. Узнав об устройстве из дескрипторов, драйвер устройства запрашивает конфигурацию, отправляя запрос Set Configuration с желаемым номером конфигурации. Многие устройства поддерживают только одну конфигурацию. Когда устройство поддерживает несколько конфигураций, многие драйверы просто выбирают первую конфигурацию, но драйвер может принять решение на основе имеющейся у него информации о том, как будет использоваться устройство, или драйвер может спросить пользователя, что делать. При получении запроса устройство реализует запрошенную конфигурацию. Теперь устройство находится в состоянии «Настроено», а его интерфейсы включены.

Для составных устройств хост теперь может назначать драйверы. Как и в случае с другими устройствами, хост использует информацию, полученную от устройства, чтобы найти драйвер для каждого активного интерфейса в конфигурации. Устройство готово к использованию.

Концентраторы также являются USB-устройствами, и хост перечисляет вновь подключенный концентратор так же, как и другие устройства.Если к концентратору подключены устройства, хост перечисляет их после того, как концентратор информирует хост об их наличии.

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

Приостановить состояние. Устройство переходит в состояние Suspend после обнаружения отсутствия активности на шине, включая маркеры SOF, в течение не менее 3 мс. В состоянии Suspend устройство должно ограничивать использование мощности шины. И настроенные, и ненастроенные устройства должны поддерживать это состояние. В главе 17 подробнее о состоянии «Приостановить».

Расширенные отличия SuperSpeed

[Примечание: Enhanced SuperSpeed — это термин спецификации USB 3.1 для SuperSpeed ​​и SuperSpeedPlus.]

Перечисление устройств Enhanced SuperSpeed ​​имеет некоторые отличия от USB 2.0:

При обнаружении нисходящего завершения Enhanced SuperSpeed ​​на порту концентратор инициализирует и обучает канал порта. Затем перечисление продолжается на SuperSpeed ​​или SuperSpeedPlus без необходимости дальнейшего определения скорости.

От хоста не требуется сбрасывать порт после получения информации о новом устройстве.

Пределы тока шины составляют 150 мА до настройки и 900 мА после настройки.

Хост отправляет запрос Set Isochronous Delay, чтобы сообщить устройству о задержке шины для изохронных пакетов.

Хост отправляет запрос Set SEL, чтобы сообщить устройству о задержке выхода из системы (время, необходимое для выхода из состояния пониженного энергопотребления).

Протоколы входа в состояние ожидания и выхода из него различаются.

Для концентраторов хост отправляет запрос Set Hub Depth, чтобы установить значение глубины концентратора.

Удаление устройства

Когда пользователь удаляет устройство из шины, концентратор отключает порт устройства. Хост знает, что удаление произошло после того, как концентратор уведомляет хост о том, что произошло событие, и хост отправляет запрос на получение статуса порта, чтобы узнать, что это было за событие. Устройство исчезнет из Диспетчера устройств, и адрес устройства станет доступен другому вновь подключенному устройству.

Советы по успешному перечислению

Без успешного перечисления устройство и хост не могут выполнять другие операции связи. Большинство производителей чипов предоставляют пример кода перечисления, который может служить моделью, даже если ваше приложение не совсем соответствует примеру приложения. Если ваш контроллер взаимодействует с внешним процессором, возможно, вам придется адаптировать код, написанный для другого чипа.

Как правило, устройство не должно ничего делать с предположениями о том, какие запросы или события будут инициированы хостом, и должно сосредоточиться на реагировании на запросы и события по мере их возникновения. Следующие советы помогут избежать проблем.

Не думайте, что запросы или события будут происходить в определенном порядке. Некоторые запросы, такие как Set Configuration, требуют, чтобы устройство находилось в состоянии Address или Configured, поэтому запрос действителен только после того, как устройство приняло запрос Set Address. Но у хоста есть некоторая гибкость в том, какие запросы выдавать и в каком порядке при перечислении. Хост также может сбросить или приостановить работу шины в любое время, и устройство, которое было подключено не менее 1 с, должно обнаружить событие и отреагировать соответствующим образом.

Будьте готовы отказаться от передачи управления или завершить ее досрочно. При получении нового установочного пакета устройство должно прекратить любую текущую передачу и начать новую. При получении пакета маркера OUT (USB 2.0) или STATUS TP (Enhanced SuperSpeed) устройство должно исходить из того, что хост начинает этап статуса передачи, даже если устройство не отправило все запрошенные данные на этапе данных. .

Не пытайтесь отправить больше данных, чем запрашивает хост. На этапе данных передачи управления чтением устройство должно отправлять не больше, чем объем данных, запрошенный хостом. Если хост запрашивает девять байтов, устройство должно отправить не более девяти байтов.

При необходимости отправить пакет данных нулевой длины. В некоторых случаях устройство возвращает меньше запрошенного объема данных, а объем данных точно кратен максимальному размеру пакета конечной точки. При получении запроса на дополнительные данные устройство должно указать, что у него больше нет данных, возвращая ZLP (USB 2.0) или полезную нагрузку данных нулевой длины (Enhanced SuperSpeed).

Приостанавливать неподдерживаемые запросы. Устройство не должно предполагать, что оно знает каждый запрос, который может отправить хост. Устройство должно возвращать STALL в ответ на любой запрос, который устройство не поддерживает.

Не устанавливайте адрес слишком рано. В запросе на установку адреса устройство должно установить свой новый адрес только после того, как этап статуса запроса будет завершен.

Будьте готовы войти в состояние приостановки. Хост может приостановить шину, когда устройство находится в любом включенном состоянии.За исключением периода, не превышающего 1 секунду после подключения устройства, оно должно сократить потребление энергии шиной, когда шина находится в состоянии ожидания.

Протестируйте на разных типах хост-контроллеров. Устройства должны иметь возможность работать с любым хост-контроллером, соответствующим спецификациям. Например, некоторые полноскоростные хост-контроллеры планируют несколько этапов передачи управления в одном кадре, а другие — нет. Устройства должны работать в любом случае.

Читайте также: