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

 

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

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

Агуров П.В. Интерфейсы USB. Практика использования и программирования — СПб.: БХВ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interface2004.djvu
Предыдущая << 1 .. 119 120 121 122 123 124 < 125 > 126 127 128 129 130 131 .. 166 >> Следующая

^Листинг 13.45. Использование HidD_GetInputReport
-........................................................................................................................-----------................................... ............
// Только Windows XP! If Capabilities.InputReportByteLength > 0 then begin Il Инициализация буфера
FillChar(InputReport, SizeOf(InputReport), #0); II Получение данных
If HidD_GetInputReport(HidHandle, SlnputReport,
Capabilities.InputReportByteLength) then begin Il Отображение полученных данных S:= ";
For і:= 0 to Capabilities.InputReportByteLength-1 do begin
S:= S + ' ' + IntToHex(InputReport[i], 2); End;
lbLog.Items.AddC Прочитано:' + S); End else begin Il Ошибка lbLog. Items .Add (
' Ошибка Hidp_GetInputReport (*+SysErrorMessage(GetLastError) + ')'); End; End;
13.8. Устройство
с несколькими репортами
Как мы уже говорили, спецификация HID позволяет создавать устройства с несколькими репортами одновременно. В этом разделе мы покажем несколько связанных с этим тонкостей.
Итак, добавим в наше устройство (листинг 13.38) еще один репорт типа FEATURE. Получившийся дескриптор показан в листинге 13.46. Первый репорт будет иметь идентификатор 1 и содержать 7 байт, а второй — идентификатор 2 и содержать 4 байта.
398
Часть IV. Создание USB-устройств
«Ййнг 13.46. Дескриптор-с двумя FEATURE-penopTaiAnf ЧЗДйЧ?.:"/- 'J
п "и. ¦* ¦ * ч ....... \...'............:.
#define SIZE_OF_REPORT
47
code struct{
byte rep[SIZE-OF-RePORT];
J
HIDReport =
/* HID Report */
{
0x06, 0x00, Oxff, /* USAGE_PAGE (Generic Desktop) V
0x09, 0x01, /* USAGE (Vendor Usage 1) V
Oxal, 0x01, /* COLLECTION (Application) */
0x19, 0x01, /* USAGE_MINIMUM (Vendor Usage 1) V
0x29, 0x01, I* USAGE_MAXIMUM (vendor Usage 1) */
0x15, 0x00, /* LOGICAL_MINIMUM (0) V
0x26, Oxff, 0x00, /* LOGICAL_MAXIMUM (255) V
0x85, 0x01, /* REPORT-ID (1) V
0x75, 0x08, /* REPORT-SIZe (8)• */
0x95, 0x07, /* REPORT-COUNt(7) V
OxBl, 0x02, /* FEATURE (Data,Var,Abs) */
OxcO /* ENDJCOLLECTION V
0x09, 0x01, I* USAGE (Vendor Usage 1) V
Oxal, 0x01, I* COLLECTION (Application) */
0x19, 0x01, I* USAGEJMINIMUM (Vendor Usage 1) */
0x29, 0x01, I* USAGE-MAXIMUm (Vendor Usage 1) */
0x15, 0x00, I* LOGICALJMINIMUM (0) */
0x26, Oxff, 0x00, I* LOGICALJMAXIMUM (255) */
0x85, 0x02, I* REPORT-ID (2) */
0x75, 0x08, I* REPORT-SIZe (8) */
0x95, 0x04, I* REPORT-COuNT(4) */
OxBl, 0x02, I* FEATURE (Data,Var,Abs) V
OxcO /* END-COLLECTIOn */
};
При правильной передаче репорта нам нужно будет различать, какой именно репорт запросил хост. Для этого мы изменим функцию hid_get_report, как показано в листинге 13.47.
Глава 13. HID-устройство на основе Atmel АТ89С5131
399
void hid_get_report() {
data byte bReportType; data byte bReportID;
/* Если устройство еще не сконфигурировано — ответ STALL */ if (usb_configuration_nb —= 0){
STALLO і
return;
/* Индикатор чтения *J
РЗ.3-p_test; p_test=!p_test;
/* Считать идентификатор репорта */ bReportID = Usb_read_byte0;
/* Считать тип репорта */ bReportType = Usb_read_byte();
/* Переключение на передачу */ Dsb_clear_rx_setup(); Usb_set_DIR() ;
switch (bReportID) {
case 1:
(
/* Передача первого репорта */ Usb_write_byte(0x01); Usb_write_byte(0x02); Usb_write_byte(pointl_state); Usb_write_byte(0x04); Usb_write_byte(0x05) ; usb_write_byte(0x06) ; Usb_write_byte (0x07) ; break;
)
400
Часть IV. Создание USB-устройств
/* Передача второго репорта */ case 2: {
Usb_write_byte(0x11);
Usb_write_byte(0x12);
Usb_write_byte(pointl_state);
Usb write byte(0x14); і — —
break;
)
/* Такой репорт не поддерживается */ default: STALL (); return;
)
pointl_state++;
// Подтверждение и переключение на прием END ОК();
*¦ "¦J я J ff "в Tg I а.1 * д в і
Ob ?ptlon $ew HeTp
1=1 Jf HOME
S j Computer ? Disk drives
E Щ Display adapters E DVD/CD-ROM drives
t? Q Floppy disk controllers
W ..? Floppy disk drives
E iai Human Interface Devices
lfla HID-compliant device
iiSa USB Human Interface Device S Q IDE ATA/ATAPI controllers W -4> Keyboards
S *lj Mice and other pointing devices
Рис. 13.20. Обнаружено устройство с двумя репортами
Глава 13. НЮ-устройство на основе Atmel АТ89С5131
401
Подключив наше новое устройство к шине, мы увидим, что Windows обнаружил два HID-устройства (рис. 13.20), однако прочитать с них данные с помощью нашей программы не удается.
Для чтения репортов, имеющих идентификатор, необходимо передавать его в первом байте буфера репорта. Скажем сразу, что сделать это для INPUT-репортов можно только в Windows XP при использовании функции HidDGetinputReport, а для FEATU RE-репортов нужно использовать функцию HidD_GetFeature (листинг 13.48).
Листинг 13.48. Использование HidD_GetFeature для запроса репорта // Инициалиазация буфера
FillChar (InputReport, SizeOf (InputReport),. #0) ,* Il Определение номера репорта
If Capabilities.FeatureReportByteLength = 8 then InputReport[0]:= 1 Else InputReport[0]:= 2; Il Получение репорта
Предыдущая << 1 .. 119 120 121 122 123 124 < 125 > 126 127 128 129 130 131 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100