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

 

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

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

Агуров П.В. Интерфейсы USB. Практика использования и программирования — СПб.: БХВ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interface2004.djvu
Предыдущая << 1 .. 111 112 113 114 115 116 < 117 > 118 119 120 121 122 123 .. 166 >> Следующая

byte bNumConfigurations;
);
Il Структура дескриптора конфигурации struct usb_st_configuration_descriptor {
byte bLength; byte bDescriptorType; uintl6 wTotalLength; byte bNumlnterfaces; byte bConfigurationValue;
Глава 13. НЮ-устройство на основе Atmel АТ89С5131
365
byte !Configuration; byte bmAttibutes; byte MaxPower;
);
Il Структура дескриптора интерфейса struct usb_st_interface_descriptor {
byte bLength; byte bDescriptorType; byte blnterfaceNumber; byte bAlternateSetting; byte bNumEndpoints; byte blnterfaceClass; byte blnterfaceSubClass; byte blnterfaceProtocol; byte ilnterface;
};
Сами дескрипторы мы будем хранить прямо в коде программы, описав переменные со спецификатором code (листинг 13.27).
Важно
При описании дескрипторов следует помнить, что двухбайтовые числа должны описыввться "наоборот", т. е. сначала младший байт, затем старший. Например, двухбайтовое поле длины дескриптора, размером 25 байт будет записано как 0x1900. Для удобства записи можно использовать специальный макрос
wswap:
#def ine wSWAP (x) ((((x) »8) uOxOOFF) I (((х) «8) uOxFFOO))
!^Листинг 13.27. Описание дескрипторов устройства и конфигурации
¦/* Типы дескрипторов */
¦define DEVICE 0x01
!define CONFIGURATION 0x02
!define STRING 0x03
¦define INTERFACE 0x04
!define ENDPOINT 0x05
/* Тиры питания устройства */
!define USB-CONFIG BUSPOWERED 0x80
366
Часть IV. Создание USB-устройств
¦define USB_CONFIG_SELFPOWERED 0x40 ^define USB_CONFIG_REMOTEWAKEUP 0x20
/* Константы, составляющие дескриптор устройства */
¦define USB_SPECIFICATION 0x1001
¦define USB_SPECIFICATION 0x1001
¦define DEVIC?_CLASS 0x02
¦define DEVICE_SUB_CLASS 0
¦define DEVICE-PROTOCOIi 0
¦define EP-CONTROl-LENGTH 32
¦define VENDOR-ID ОхЕВОЗ /* Atmel = 03EBh */
¦define PRODUCT-ID 0x0921
¦define RELEASe-NUMBER 0x0000
/* Дескриптор устройства */
code struct usb_st_device_descriptor usb_device_descriptor (
sizeof(usb_device_descriptor),
DEVICE,
USB-SPECIfICATION,
DEVICE_CLASS,
DEVICE-SUb-CLASS,
DEVICE-PROTOCOl,
EP-CONTROl-LENGTH,
VENDOR-ID,
PRODUCT-ID,
RELEASe-NUMBER,
0,
o, o,
1
/* тип дескриптора, =1 /* спецификация /* класс устройства
/* протокол USB
/* размер пакета 0-й точки
/* ID производителя и устройства
V V
V
/* версия устройства /* дескр. строки изготовителя /* дескр. строки продукта /* дескр. строки серийного номера*/ /* число конфигураций */
V V
/* Константы, составлявшие дескриптор конфигурации */ ¦define CONf-LENGTH wSWAP(18) /* 9+9= 18 байт */
¦define CONF-NB 1
¦define CONF-ATTRIBDtES USB-CONFIG-BUSPCWEREd
¦define MAX POWER 50 /* * 100 мА */
Глава 13. HID-устройство на основе Atmel АТ89С5131
367
I* Константы для дескриптора интерфейса */ tdefine INTERFACEO_CLASS OxFF
tdefine INTERFACEO_SUB_CLASS 0x00 tdefine INTERFACE0_FROTCCOL OxFF
/* Полный дескриптор конфигурации */
code struct
(
struct usb_st_configuration_descriptor cfg; struct usb_st_interface_^descriptor ifc;
)
usbjconfiguration = {
/* CONFIGORATION */ ( 9,
CONFIGURATION, /* -2 */
C0NF_LENGTH, /* длина всех дескрипторов */
1, /* число интерфейсов */
C0NF_NB, /* номер конфигурации */
0, /* дескр. строки конфигур. */
CONF-ATTRIBUTESf /* атрибуты */
MAX POWER /* максимальный ток .*/
}.
/* INTERFACE 0 */ { 9,
INTERFACE, /* -4 */
0, /* 0-й интерфейс */
0, /* номер альтернативного инт. */
0, /* только 0-я конечная точка */
INTERFACEOjCLASS,
INTERFACE0_SUB_CLASS,
INTERFACE 0_PROTOCOL,
0 /* дескр. строки интерфейса */
)
Как уже говорилось (см. разд. 4.1.3), по запросу дескриптора конфигурации возвращаются дескрипторы конфигурации интерфейсов и конечных точек. В нашем случае конечных точек (кроме нулевой) нет, поэтому мы будем
368
Часть IV. Создание USB-устройств
возвращать только два дескриптора. Следует обратить внимание, что поле wTotaiLength (константа conf_length) содержит длину всех дескрипторов, возвращаемых по запросу дескриптора конфигурации (в нашем случае возвращаются два дескриптора, общая длина которых 9 + 9 = 18 байт).
Теперь остается собрать весь код, откомпилировать (полный исходный код и полученный НЕХ-файл вы можете найти на компакт-диске) и загрузить в микропроцессор. После подачи сигнала сброса Windows должен обнаружить новое устройство (рис. 13.13) и начать поиск и установку драйверов (рис. 13.14).
Found New Hardware X ;
U5B Device
Рис. 13.13. Windows обнаружила новое устройство
Welcome to the Found New Hardware Wizard
This wizard helps you install software for: USB Device
, • J If jiouf hardware came with en installation CD -¦Ji^ Oi floppy disk, insert it now.
What do you want the wizard to do?
|nstall the software automatically [Recommendedj C Install from a list or specific location (Advanced)
Click Next to continue.
. <ВасГ | Next> ) Cancel |
Рис. 13.14. Windows производит поиск и установку драйверов
Глава 13. HID-устройство на основе Atmel АТ89С5131
369
13.5.2. Добавляем строковые дескрипторы
У нашего устройства есть один недостаток, от которого мы постараемся избавиться в этом разделе: при обнаружении нового устройства Windows может сообщить только общую информацию об устройстве и обобщенное название — USB Device. Конечно, нам хотелось бы, чтобы Windows сообщал, какое именно устройство найдено.
Предыдущая << 1 .. 111 112 113 114 115 116 < 117 > 118 119 120 121 122 123 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100