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

 

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

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

Агуров П.В. Интерфейсы USB. Практика использования и программирования — СПб.: БХВ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interface2004.djvu
Предыдущая << 1 .. 49 50 51 52 53 54 < 55 > 56 57 58 59 60 61 .. 166 >> Следующая

8.3. Установка НЮ-устройства
Для установки устройства Менеджер Устройств операционной системы использует INF-файлы (см. главу 10.4) для решения о том, какой драйвер назначить найденному устройству. HID-устройство может использовать встроенный в ОС INF-файл (hiddev.inf для Windows 98 и input.inf для Windows 2000). Альтернативно программист может использовать свои собственные INF-файлы, в которых будет прописана информация о производителе устройства. Преимущество своего INF-файла состоит в отображении понятного названия устройства в окне Менеджера Устройств вместо общего термина "Стандартное устройство".
8.4. Идентификация НЮ-устройства
Устройство HID класса идентифицируется кодом класса 3 в дескрипторе интерфейса и имеет два специфических дескриптора: HID-дескриптор и дескриптор репорта (на самом деле существует еще физический дескриптор устройства (Physical Descriptor), но мы его рассматривать не будем). HID-дескриптор включается в список дескрипторов при запросе конфигурации. Обмен репортами с устройством возможен только после того, как драйвер определит тип данного устройства и какие интерфейсы оно поддерживает.
Гпава 8. HID-устройства
153
8.4.1. Идентификация загрузочных устройств
Идентификация ТИПа устройства ПРОИЗВОДИТСЯ ПО ПОЛЮ blnterfaceSubClass
в дескрипторе интерфейса:
? О — подкласс не указан (не загрузочный интерфейс);
? 1 — загрузочный интерфейс;
? 2—255 — зарезервировано.
Таким образом, устройство может иметь одновременно и загрузочный интерфейс, и обычный. Например, USB-клавиатура может работать при загрузке в стандартном режиме (данные обрабатывает BIOS), а при загрузке HID-драйвера добавлять специальные клавиши.
ЕСЛИ устройство определено как загрузочное, ТО Поле blnterfaceProtocol В
дескрипторе интерфейса обозначает поддерживаемый устройством стандартный протокол:
? О — протокол определяется пользовательским НШ-репортом;
? 1 — клавиатура;
? 2 — мышь;
? 3—255 — зарезервировано.
Для незагрузочНЫХ устройств ПОЛЄ blnterfaceProtocol ДОЛЖНО быть равно 0.
Примечание ^
Если устройство определено как клавиатура или мышь, Windows позволяет открывать устройство с помощью функции CreateFile, запрашивать дескрипторы устройства и конечных точек, но чтение данных с помощью функции ReadFile блокируется. Единственная возможность обмена данными с такими устройствами — функции Get_Feature и Set__Feature, конечно, при условии, что устройство поддерживает эти интерфейсы.
8.4.2. Дескриптор конфигурации HID-устройства
По запросу Get_Descriptor(Configuration) HID-устройство должно передавать хосту дескриптор конфигурации, все дескрипторы интерфейсов, все дескрипторы конечных точек и все HID-дескрипторы. Ни строковые дескрипторы (String descriptor), ни дескрипторы репортов (Report descriptor) не должны включаться в этот список. HID-дескриптор должен располагаться между дескриптором интерфейса и дескрипторами конечных точек: Configuration descriptor
Interface descriptor (specifying HID Class)
HID descriptor (associated with above Interface)
Endpoint descriptor (for HID Interrupt Endpoint:)
154
Часть III. Практика программирования
Дескрипторы HID И REPORT ВОЗВращаЮТСЯ ПО Запросу Get_Descriptor со
специальными кодами запроса (см. далее). Важно понимать, что дескриптор конфигурации относится к устройству, дескриптор интерфейса и HID — к интерфейсу, а дескриптор конечной точки — к конечной точке. Это довольно очевидное утверждение оказывается важным при обработке запросов на получение дескрипторов, т. к. поле bmRequestType имеет разное значение для каждого из типов. Именно по этой причине в списке объединенных кодов запросов (см. листинг 4.4) присутствуют три разных идентификатора запросов Get_Descriptor (см. разд. 4.1.1):
#define GET_DESCRIPTOR_DEVICE 0x8006 #define GET_DESCRIPTOR_INTERF 0x8106 ttdefine GET_DESCRIPTOR_ENDPNT 0x8206
Однако при обработке запроса эти коды удобно объединить и обрабатывать в одной процедуре:
switch (wRequest) {
case GET_DESCRIPTOR_DEVICE case GET_DESCRIPTOR_INTERF case GET_DESCRIPTOR_ENDPNT
usb_get_descriptor();
break;
}
8.4.3. НЮ-дескриптор
Формат HID-дескриптора показан в табл. 8.1, а его описание на языках С и Pascal — в листинге 8.1.
Таблица 8.1. Структура НЮ-дескриптора,
Смещение Поле Размер Описание
0 bLength 1 Размер дескриптора в байтах
1 bDescriptorType 1 Тип дескриптора ($21)
2 bcdHID 2 Версия HID
4 bCountryCode 1 Числовой код страны для локализированных устройств
5 bNumDescriptor 1 Число дескрипторов репортов
Гпава 8. HID-устройства 155
Таблица 8.1 (окончание)
Смещение Поле Размер Описание
6 bReportType 1 Номер дескриптора репорта, используемый при вызове Set Descriptor
7 wReportLength 2 Размер дескриптора репорта
9 bReportType 1 Номер дополнительного дескриптора
10 wRepoгtLength 2 Размер дополнительного дескриптора
Листинг 8.1 HI D-дескриптор
// Описание на языке С
typedef struct _USB_HID_DESCRIPTOR
{
UCHAR bLength; UCHAR bDescriptorType; USHORT bcdHID; UCHAR bCount гyCode; UCHAR bNumDescriptors;
Предыдущая << 1 .. 49 50 51 52 53 54 < 55 > 56 57 58 59 60 61 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100