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

 

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

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

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

If HidD_GetFeature(HidHandle, InputReport,
Capabilities.FeatureReportByteLength) then begin Il Отображение данных End else begin Il Ошибка
End;
Посмотрим на строку
If Capabilities.FeatureReportByteLength = 8 then InputReport[0]:= 1 else InputReport[0]:- 2;
Здесь находится первый подводный камень. Если до сих пор мы никак не были привязаны к характеристикам устройства, то здесь мы вынуждены воспользоваться знаниями о соответствии длины репорта и его номере. Собственно эта проверка и означает выбор одного из двух "устройств", обнаруженных Windows при использовании двойного репорта.
И еще одно замечание. Спецификация HID запрещает создание двух репортов с одинаковыми идентификаторами (даже разных типов). Устройства, имеющие некорректное описание репорта, работать не будут.
Глава 14
Создание USB-устройства на основе ATMEL АТ89С5131
Не HID-om единым жив человек.
Использование HID-устройств избавляет от написания драйвера, однако часто ограничения HID не позволяют воспользоваться этими удобствами. Значит, нужно писать свой драйвер.
14.1. He-HID-устройство
В предыдущей главе мы уже сделали USB-устройство, которое затем преобразовали согласно спецификации HID. Для нужд этой главы мы остановимся на обычном USB-устройстве. В листинге 14.1 приведены дескрипторы нашего устройства.
ІСТИНГ 14.1. Дескрипторы устройства
Ив
tdefine USB_SPECIFTCATION OxOlOO tdefine DEVICe-CLASS 0x00
tdefine DEVICe-SUB-CLASS 0x00
tdefine DEVICE-PROTOCOl 0x00
tdefine EP-CONTROL-LENGTh 8
tdefine VENDOR-ID ОхЕВОЗ /* Atmel vendor ID = 03EBh */
tdefine PRODUCT-ID 0x0358
tdefine RELEASE_NUMBER 0x0000
tdefine LANG-ID 0x00
tdefine MAN-INDEX 0x01
tdefine PRD-INDEX 0x02
tdefine SRN INDEX 0x03
Глава 14. Создание USB-устройства на основе ATMEL АТ89С5131
403
code struct usb—st—device—descriptor usb_device_descriptor -
sizeof(usb_device_descriptor),
DEVICE,
USBJSPECIFICATION,
DEVICE_CLASS,
DEVICE-SuB-CLASS,
DEVICE-PROTCCOl,
EP-CONTROL-LENGTh,
VENDOR-ID,
PRODUCT-ID,
RELEASE-NUMBEr,
MAN-INDEX,
PRD-INDEX,
SRN-INDEX,
1
=1 */
спецификация класс устройства
/* протокол USB */
/* размер пакета 0-й точки */
/* ID производителя и устройства */
/* версия устройства */
/* дескр. строки изготовителя */
/* дескр. строки продукта */
/* дескр. строки серийного ном. */
/* число конфигураций */
};
•define CONf-LENGTH ¦define CONF-NB ¦define CONF_ATTRIBUTES •define MAX POWER
wSHAP(25) 1
USB-CONFIG-BUSPOWEREd 50 I* - 100 mA */
/* INTERFACE 0 DESCRIPTOR */
•define INTERFACEO-CLASs 0x00
•define INTERFACEO-SUB-CLASs OxFF
•define INTERFACEO PROTOCOL OxFF
/* первая конечная точка */
•define EP-I-CONFIG (INTERRUPTIEP-CONFIg-IN) /* конфигурация */
•define EP-I-ADDRESS (1|EP_DIRECT_IN) Л адрес */
•define EP 1 ATTRIBUTES INTERRUPT /* атрибуты */
code struct {
struct usb_st_configuration^descriptor cfg; struct usb_st_interface_descriptor ifc;
struct usb_st_endpoint_descriptor epl;
)
404
Часть IV. Создание USB-устройств
usb_configuration = {
/* CONFIGURATION */ { 9,
CONFIGURATION, I* =2 */
CONF_LENGTH, I* длина всех дескрипторов */
1, I* число интерфейсов */
CONF-NB, /* номер конфигурации */
0, I* дескр. строки конфигур. */
CONF_ATTRIBUTES, /* атрибуты V
MAX POWER Л 100 шА V
Л =4 */
/* 0-й интерфейс
/* INTERFACE 0 */ { 9,
INTERFACE, 0, 0, 1,
INTERFACE0_CLASS, INTERFACEO-SUB-CLASs , INTERFACEO-PROTOCOl,
О /* дескр. строки интерфейса
),
/* Дескриптор первой конечной точки */
номер альтернативного инт. 1 конечная точка (кроме 0)
(
7,
ENDPOINT,
EP-I-ADDRESS,
EP-I-ATTRIBUTEs,
wSWAP(8),
1
/* дескриптор ENDPOINT */
/* номер конечной точки */
/* атрибуты конечной точки */ /* максимальный размер пакета */ /* частота опроса */
};
Как видно, устройство имеет один интерфейс и одну конечную точку (кроме нулевой) типа INTERRUPT с направлением передачи IN, т. е. от устройства к хосту. Размер пакета данных, передаваемых через эту точку, равен 8. Ради экономии места мы не привели строковые дескрипторы (они описаны в листинге 13.29).
Глава 14. Создание USB-устройства на основе ATMEL АТ89С5131
405
Данные, которые мы будем передавать, состоят из 8 байт, один из которых мы будем увеличивать при каждой передаче данных (листинг 14.2).
I Листинг 14.2. Структура передаваемых данных
if (!end_pointl_ready) /* предыдущий пакет отправлен */ {
Usb_select_ep(l); usb_write_byte(55);
Osb_write_byte(pointl_state); pointl_state++; Osb_write_byte(0x52); Osb_write_byte(0x54); Osb_write_byte(0x55); Osb_write_byte(0x56); Osb_write_byte(0x57); Osb_write_byte(0x58); Osb_set_tx_ready();
endjpointl_ready = TRUE;
}
Все это мы уже делали в главе 13, поэтому дополнительных комментариев давать не будем.
14.2. Создание драйвера с помощью Driver Studio
В разд. Р.5мы описали несколько инструментов, с помощью которых можно быстро создать драйвер USB-устройства. В этом разделе мы рассмотрим процесс создания драйвера с помощью NuMega Driver Studio.
Для работы нам потребуются установленные Microsoft Visual Studio 6.0 и Microsoft DDK (дальше мы будем пользоваться сокращениями VS и DDK соответственно).
Предыдущая << 1 .. 120 121 122 123 124 125 < 126 > 127 128 129 130 131 132 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100