Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Агуров П.В. -> "Интерфейсы USB. Практика использования и программирования" -> 78

Интерфейсы USB. Практика использования и программирования - Агуров П.В.

Агуров П.В. Интерфейсы USB. Практика использования и программирования — СПб.: БХВ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interface2004.djvu
Предыдущая << 1 .. 72 73 74 75 76 77 < 78 > 79 80 81 82 83 84 .. 166 >> Следующая

10. Хост считывает конфигурацию устройства, включая заявленный потребляемый ток от шины. Хост посылает запрос get_descriptor по новому адресу. Дескриптор, посылаемый устройством, содержит максимальный
228
Часть III. Практика программирования
размер пакета для нулевой конечной точки, число поддерживаемых устройством конфигураций и другую информацию об устройстве.
11. Хост ищет и загружает драйвер устройства. После того как хост узнал всю информацию об устройстве, он ищет наиболее подходящий драйвер и загружает его. При поиске драйвера Windows проверяет поля Vendor, Product ID и Release Number в INF-файлах. Если такой INF-файл не найден, Windows пытается найти драйвер согласно классу, подклассу и типу протокола, полученным от устройства.
12. Драйвер выбирает конфигурацию. Драйвер посылает запрос set__configuration. Многие устройства имеют только одну возможную конфигурацию, но если устройство поддерживает несколько конфигураций, драйвер выберет либо первую, либо базовую, либо попросит пользователя выбрать нужную конфигурацию. Исходя из полученной информации, хост конфигурирует все имеющиеся конечные точки данного устройства, которое переводится в состояние Сконфигурировано (Configured). Теперь хаб позволяет устройству потреблять от шины полный ток, заявленный в конфигурации. Устройство готово.
Когда устройство отключается от шины, хаб уведомляет об этом хост и работа порта запрещается, а хост обновляет свою текущую топологическую информацию.
10.2.3. PnP-идентификаторы устройств USB
Каждое устройство, спроектированное по спецификации PnP, должно иметь идентификатор, который однозначно определяет модель данного устройства. Этот идентификатор должен быть предоставлен шинному аппаратному обеспечению (и, соответственно, шинному драйверу) по поступлении запроса. Секция описания модели (см. разд. 10.4.5) содержит поле hw id, играющее роль идентификатора модели.
Идентификатор устройства должен иметь строго определенный для данного класса устройств формат. Для устройств USB идентификатор имеет следующий формат:
USB\Vid_wwsPid_ddddsRev_rr
Здесь ww — идентификатор поставщика (поле idvendor дескриптора устройства, см. разд. 4.1.3), зарегистрированный в Комитете USB производителей; dddd — идентификатор, присвоенный производителем данный модели устройства (поле idProduct); гг — номер версии разработки. Все эти ПОЛЯ вводятся как шестнадцатеричные числа.
В INF-файле допустимо указывать усеченные варианты идентификаторов, например:
USB\Vid_wwsPid_dddd USB\Class_ccSSubClass_ss_Prot_pp
Гпава 10. Спецификация PnP для USB
229
USB\Class_ccsSubClass_ss USB\Class_cc
Здесь сс — код базового класса из полученного дескриптора устройства или дескриптора интерфейса данного USB-устройства; ss — код подкласса; pp — идентификатор протокола.
Примеры USB-идентификаторов:
? usb\vtd_040Aspid_0100 — цифровая USB-камера Kodak;
? usb\root_hub20 — USB-хаб;
? usb\vid_067Bspid_2303 — USB-мобильный телефон.
10.3. Получение списка USB-устройств
Для получения списка USB-устройств используются функции инсталляции (Setup API Function). Эти функции содержатся в динамической библиотеке SetupAPI.Dll. Объем нашей книги не позволяет привести описание всех функций (всего их около 600), поэтому мы опишем только необходимые для работы.
Если в С++ вызов функций Setup API проблем не вызывает, то в Delphi придется подключать функции библиотеки вручную (как показано в листинге 10.2) либо использовать готовые классы, например, setupApi.Pas из библиотеки JEDI (http://delphi-jedi.org).
Il имя динамической библиотеки const
SetupApiModuleName = 'SetupApi.dll'; // описание внешних функций function SetupDiGetClassDevs;
external SetupApiModuleName name 'SetupDiGetClassDevsA'; function SetupDiGetClassDevs;
external SetupApiModuleName name 'SetupDiGetClassDevsA'; function SetupDiEnumDevicelnfo;
external SetupApiModuleName name 'SetupDiEnumDevicelnfo'; function SetupDiGetDeviceRegistryProperty;
external SetupApiModuleName name 'SetupDiGetDeviceRegistryPropertyA'; function SetupDiDestroyDevicelnfoList;
external SetupApiModuleName name 'SetupDiDestroyDevicelnfoList';
230
Часть III. Практика программирования
Для получения списка устройств используется такая последовательность действий:
1. Получение дескриптора класса устройств (дескриптор либо корневого класса, либо класса с конкретным GUID) с помощью вызова функции SetupDiGetClassDevs.
2. Вызов функции SetupDiEnumDevicelhfo для получения описателя очередного устройства.
3. Вызов функции SetupDiGetDeviceRegistryProperty для получения информации об устройстве.
4. Повторение шагов 2—3 до тех пор, пока функция SetupDiEnumDevicelnfo
НЄ вернет False.
Для получения списка всех устройств функции SetupDiGetClassDevs вместо идентификатора класса передается nil, а в поле флагов записывается Dіgcf_allclasses, а для получения дескриптора конкретного класса в эту функцию передается идентификатор нужного класса (см. табл. 10.1).
Для примера мы создадим небольшую программу, позволяющую получить либо список всех устройств в системе, либо устройств одного из следующих классов:
Предыдущая << 1 .. 72 73 74 75 76 77 < 78 > 79 80 81 82 83 84 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100