Как работает распознавание USB-устройства?

16

Мне интересно, как работает распознавание USB-устройств в Windows. Я представляю, что-то вроде этого:

  • Когда вы подключаете устройство, оно говорит Windows «вот мой идентификатор устройства, чтобы сказать вам, кто я»
  • Windows проверяет, установлены ли какие-либо драйверы, соответствующие этому идентификатору устройства. Драйвер, вероятно, сообщает Windows, как должно называться устройство - например, «BlackBerry Curve» или «Canon Printer».
  • Если так, то это как-то связывает это устройство с этим драйвером
  • В противном случае он ищет подходящий драйвер онлайн (если вы позволите)

Я прав? Если так, то это все еще оставляет некоторые вопросы.

  • Когда вы устанавливаете драйверы, куда они идут? Это файлы в папке или они добавлены в реестр?
  • Что делает Windows, когда она сначала распознает устройство, думает и, наконец, говорит: «Ваше новое устройство установлено и готово к использованию?»
  • Где Windows ищет отсутствующие драйверы? Это в их собственной базе данных? Производители устройств отправляют драйверы в Microsoft для включения туда?

Кто-нибудь может объяснить, как этот процесс действительно работает? Кроме того, другие ОС делают это по-другому?

Натан Лонг
источник

Ответы:

24

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

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

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

Все клавиатуры будут принадлежать к классу HID (Human Interface), как, например, мыши, планшеты и игровые контроллеры. Класс HID имеет несколько подклассов (клавиатуры, мыши и т. Д.), Поэтому каждый из них обрабатывается ожидаемым образом.

Большинство дискообразных устройств будут претендовать на класс Mass Storage, и системный драйвер также работает для них.

В дополнение к классу и подклассу дескрипторы также включают идентификатор поставщика (VID), идентификатор продукта (PID) и редакцию. Идентификаторы поставщиков назначаются комитетом по стандартам (в основном в порядке выдачи, но некоторые компании получают специальные запросы: например, intel - 0x8086). Идентификаторы продукта назначаются каждым поставщиком, и комбинация VID и PID должна быть уникальной для каждого выпущенного продукта.

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

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

Весь этот процесс задокументирован в MSDN , но подробности разбросаны по разным местам.

RBerteig
источник
Спасибо за методическое объяснение. Очень интересно!
Натан Лонг
3
Часы, которые я потратил на сбор этих деталей из документации и примеров, были неожиданной задачей, когда я написал свой первый драйвер устройства для Windows. Я рад поделиться результатами этого ...
RBerteig
7

Вопросов :

  • Каталоги: драйверы установлены в 2 каталогах. Рабочая часть (в большинстве случаев) устанавливается в% RootDir% \ system32, информационная часть устройства устанавливается в% RootDir% \ inf. В директории inf для установленного / зарегистрированного драйвера создается файл oem * .inf. (* это число). В Vista драйвер копируется в каталог% RootDir% \ system32 \ driverstore в качестве справки при установке еще не обнаруженных устройств.
  • Реестр: драйвер устанавливается как служба режима ядра. Для этого создаются определенные ключи реестра для службы драйверов. Под драйвером шины есть еще одно место, где соответствующие устройства получают индивидуальный ключ экземпляра устройства. В этом ключе устройство имеет ссылку на текущий используемый драйвер для этого устройства.
  • «Прибытие» устройства: когда драйвер шины находит новое устройство в своей шине, он создает реестр ключей под своим собственным ключом, который соответствует уникальному идентификатору экземпляра устройства, который может использоваться для уникальной идентификации устройства в системе. Если этот ключ уже существует, драйвер шины пытается загрузить устройство, на которое ссылается этот узел. Если этот узел не существует или драйвер не загружается, система пытается найти совместимый драйвер для устройства, сканируя зарегистрированные драйверы устройства в папке% RootDir% \ inf. Драйверы, которые соответствуют данному устройству, перечисляются и сортируются. Лучший драйвер затем выбирается и загружается для устройства.
  • Поиск драйверов : драйверы сначала ищутся в каталоге inf. Когда драйвер не найден, Windows спрашивает пользователя, может ли он предоставить драйверы или он должен смотреться на сервере Microsoft. Производители драйверов могут представить свои драйверы для включения на сервер драйверов устройств Microsoft.

У Лунатика есть первая часть ответа, как так называемый драйвер автобуса находит устройство.

Кристофер
источник
3

Я хотел бы порекомендовать хорошую книгу о USB:

  • USB Complete от Ян Аксельсон

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

Johan
источник