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

 

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

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

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

Устройства хранения данных (Mass Storage Device) usbstor.sys Флеш-диски
Принтеры (Printer) usbprint.sys Принтеры
Устройства коммуникации (Communication) mdismp.sys, usb8023.sys, другие Модемы, сетевые карты
Для работы с нестандартными устройствами можно также воспользоваться одним из системных драйверов. Чаще всего пользуются HID-драйвером, работу с которым мы рассмотрим в разд. 8.8. Если же стандартный драйвер не подходит, необходимо писать собственный драйвер поддержки. Структура драйверов обсуждается в главе 9, а пример написания драйвера приведен в главе 14.
146
Часть III. Практика программирования
7.2. Взаимодействие с USB-драйвером
Для обращения к драйверам используется функция DeviceloControl. В главе 9 мы будем более подробно обсуждать принцип ее работы, а сейчас посмотрим, как с ее помощью обращаться к драйверу USB.
Функция DeviceloControl должна принимать следующие параметры:
? дескриптор хоста, порта или устройства, полученный с помощью вызова
CreateFiie;
? код вызываемой функции;
? входной буфер и его размер;
? выходной буфер и его размер;
? указатель на переменную, в которую будет возвращено число реально переданных (или прочитанных) байтов.
Первый параметр — дескриптор объекта, к которому производится обращение. Листинг 7.2 показывает пример получения дескриптора хоста.
var sHost : String; iHost : Integer; hHost : THandle;
SA : SECURITY_ATTRIBUTES; begin
// Формирование структуры SA SA.nLength:= SizeOf(SECURITY_ATTRIBUTES); SA.IpSecurityDescriptor:= ml; SA.blnheritHandle:= False;
// Номер хоста ihost:= 0;
// Формирование имени хоста sHost:= Format('\\.\HCD%d\ [iHost]); 11 Получение дескриптора хоста hHost:= CreateFiie(PChar(OsHost[1]),
GENERIC_WRITE, FILE_SHARE_WRITE, @SA, OPEN_EXISTING, 0, 0
);
11 Хост открыт?
If (hHost O INVALID_HANDLE_VALUE) then begin Log(Format ('Хост-контроллер %d успешно открыт', [iHost]));
гпава 7. Поддержка USB в Windows
147
CloseHandle(hHost); End else begin
Log(Format ('Хост-контроллер <%s> не найден', [sHost])); End; End;
Для формирования кода функции используется макрос ctl_code, код которого показан в листингах 9.14 и 9.16. Все коды. стандартных запросов (см. разд. 4.1.2) отсчитываются от константы usb_ioctl_index. Код функции для формирования кода стандартного запроса показан в листинге 7.3.
'Листинг 7.3. Формирование кода стандартного запроса
Const
FILE_DEVICE_USB = $00000022; METHOD_BUFFERED = $00000000; FILE_ANY_ACCESS = $00000000; USB IOCTL INDEX = $00FF;
function GetUSBCtlCode(Code : Integer): Integer; begin
Result:=
(FILE_DEVICE_USB shl 16) or (FILE_ANY_ACCESS shl 14) or ((USB_IOCTL_INDEX + Code) shl 2) or METHOD_BU FFERE D;
end;
Для выполнения стандартного запроса используется структура TSetupPacket (см. листинг 4.1), дополненная необходимой для данного запроса информацией. Например, для получения дескрипторов устройства (стандартного дескриптора или дескриптора конфигурации) используется структура TDescriptorRequest, как показано в листинге 7.4.
// структура для запроса дескрипторов TDescriptorRequest = packed record
Connectionlndex : ULONG;
SetupPacket : TSetupPacket;
148
Часть III Практика программирования
Data : Array II. .2048] of Byte;
End,
// переменные для выполнения DeviceloConfrol Var
Success : LonqrBool;
Packet : TDescrrptorRequest;
BytesReturned : Cardinal;
11 Получение стандартного дескриптора устройства Begin
ZeroMemory(@Packet, SizeOf 'Packet));
Packet.Connectionlndex Packet. Setup Packet. binRequebt Packet.SetupPacket.bRequest Packet. bet upPacke1-. wValue [2] Packet.SetupPacket.wLength[2 ]
= iPort+1; = $80;
= USB_REQUEST_GET_DESCRIPTOR; = USB_DEVICE_DESCRIPTOR_TYPE; = 1; // использовать буфер 2 Кбайта
11 IOCTL_USB_GET_DESCRIPrOR_b ROM_NODE__CONNECTION Success:= DeviceloControl(hRoot, GetUSBCtlCode(5),
@Packet, sizeof (Packet),
SPacket, sizeof(Packet),
BytesReturned, nil ) ;
End;
Глава 8
HI D-устройства
Новая акция в нашем магазине купите у нас 1000 мегабайт оперативной памяти и 24 мегабайта вы получите абсолютно бесплатно'
Согласно спецификации, HID (Human Inteiface Device) - эго усі рои*, і во связи с пользователем:
? клавиатуры и указатели, например, мышь, трекбол, джойстик;
? устройства контроля, такие как кнопки управления, переключатели, задвижки;
П устройства контроля в телефонах, видеомагнитофонах и игровых приставках, например, рулевое управление, игровые педали;
? устройства, не требующие взаимодействия с человеком, но передающие данные в HID-формате, например, считыватели штрихкода, термометры, вольтметры.
Вообще говоря, HID позволяет написать низкоскоростной двухсторонний обмен с любым устройством, даже не попадающим под жесткое определение устройства ввода. Поскольку Windows 98/2000/ХР имеют встроенные HID-драйверы (см. табл. 7.1), то необходимость трудоемкой разработки драйвера отпадает. С точки зрения разработчика программы самого устройства, необходимо поддерживать ряд структур, описывающих HID-интерфейс (см. главу 13), а также обеспечивать обмен по каналу данных прерываний (см. разд. 3.3). Основным ограничением является скорость обмена. Максимально достигаемая скорость составляет 64 Кбит/с, что значительно меньше, чем полная скорость USB-шины — 12 Мбит/с, хотя для многих приложений, например, управления и индикации, вполне достаточно.
Предыдущая << 1 .. 47 48 49 50 51 52 < 53 > 54 55 56 57 58 59 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100