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

 

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

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

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

Например, строка "Тестовая плата" будет кодироваться следующим образом:
0000000000 0000000010 0000000020
FEFF 0422 0435 0441 044F 0020 043F 043В 000А
0442 043Е 0432 0430 Тестовая 0430 0442 0430 000D плата
Первые два байта (Oxfeff) и последние четыре (OxOOOD, ОхОООа) являются заголовком файла и символами перевода строки, и мы их отбрасываем, а остальные записываем в виде последовательности слов с обратным порядком байт.
!define USB_PRODUCT_name {0x2204, 0x3504, 0x4104, 0x4204, 0хЗЕ04, 0x3204, 0x3004, Ox4F04, 0x2000, 0x3F04, 0хЗВ04, 0x3004, 0x4204, 0x3004}
Запуск программы с новым дескриптором показывает, что мы старались не зря (рис. 13.17).
374
Часть IV. Создание USB-устроиств
Found New Hardware [X_
Тестовая плата
Рис. 13.17. Устройство с русским именем
13.5.3. Добавление конечных точек
Для добавления конечных точек необходимо добавить дескрипторы этих точек в дескриптор конфигурации, не забыв, кроме того, изменить поле
bNumEndpoints.
Листинг 13.31 показывает описание структуры дескриптора конечной точки, а листинг 13.32 — дескриптор конфигурации с двумя конечными точками.
struct usb_st_endpoint_descriptor {
byte bLength; byte bDescriptorType; byte bEndpolntAddress; byte bmAttributes; uintl6 wMaxPacketSize; byte blnterval;
);
iP1X^2. Де^рш^р кЬнфигураЦин'с двумяконечными точками - 2???*:
!define EP О ADDRESS
(О I CONTROL)
/* первая конечная точка */
!define EP_l_CONFIG (BULK|EP_CONFIG_IN) /* конфигурация */
¦define EP_1_ADDRESS (2|EP_DIRECT_IN) /* адрес */
¦define EP_1_ATTRIBUTES BULK /* атрибуты */
/* вторая конечная точка */
¦define EP_2_CONFIG (BULK|EP_CONFIG_OUT) /* конфигурация */
¦define EP_2_ADDRESS (2|EP_DIRECT_OUT) /* адрес */
Глава 13. HID-устройство на основе Atmel АТ89С5131
375
¦define EP_2_ATTRIBUTES BULK /* атрибуты
code struct
(
struct usb_st_configuratian_descriptor cfg; struct usb_sjt_interface_descriptor ifc;
struct usb_st_endpoint_descriptor epl;
struct usb_st_endpoint_descriptor ep2;
)
usb_configuration = (
/* CONFIGURATION */ ( 9,
Ь
/* INTERFACE 0 */ ( 9,
2,
/* конечные точки (кроме 0)
/* Дескриптор первой конечной точки */
<
7,
ENDPOINT, /*
EP_1_ADDRESS, /*
EP_1_ATTRIBUTES, /*
wSWAP(64), /*
0 /*
дескриптор ENDPOINT номер конечной точки атрибуты конечной точки максимальный размер пакета частота опроса
*/ */ */ */ */
Дескриптор второй конечной точки */
(
7,
ENDPOINT, EP_2_ADDRESS, EP_2_ATTRIBUTES, wSWAP(64), 0
/* дескриптор ENDPOINT /* номер конечной точки /* атрибуты конечной точки /* максимальный размер пакета */ /* частота опроса */
*/ */ */
376
Часть IV. Создание USB-устройств
Мы специально скрыли уже известные нам поля дескриптора, выделив только изменившиеся. Как мы описывали в разд. 4.1.3, главными полями дескриптора конечной точки являются поля номера и атрибутов. Для формирования значения этих полей используются константы, показанные в листинге 13.33.
Листинг 13.33. Константы для описания конечных точек
/*.Типы конечных точек */
tdefine CONTROL OxOO
tdefine ISOCHRONOUS 0x01
tdefine BULK 0x02
tdefine INTERRUPT 0x03
/* для вычисления номера конечной точки */
tdefine EP_DIRECT_OUT 0x00
tdefine EP_DIRECT_IN 0x80
/* для вычисления конфигурации точки */
tdefine EP_CONFIG_0UT 0x00
tdefine EP_CONFIG_IN 0x04
Такое несколько усложненное описание адреса конечной точки связано со структурой регистра uepconx, в котором для описания типа точки используются биты [1:0], а бит 2 используется для указания направления передачи, структурой поля bmAttributes, в котором для описания типа используются биты [1:0] и структурой номера конечной точки, в котором направление конечной точки задается битом 7. Так, для формирования описания конечной точки типа bulk с направлением передачи in мы используем следующие константы:
// Конфигурация -биты [1:0] и 2
tdefine EP_l_CONFIG . (BULK I EP_CONFIG_IN)
Jl Номер конечной точки - биты [3:0] и 7
tdefine EP_1_ADDRESS (2 | EP_DIRECT_IN)
// Атрибуты — биты [1:0]
tdefine EP_1_ATTRIBUTES BULK
Инициализация всех конечных точек, кроме нулевой, производится после получения запроса set_configuration (листинг 13.34).
// Обработка запроса SET_CONFlGURATION void usb_set_configuration()(
Глава 13. НЮ-устройство на основе Atmel АТ89С5131
377
usb_ep_init();
)
// Конфигурирование конечных точек, кроме нулевой
void usb_ep_init()
{
Il конфигурирование
usb_configure_endpoint(l, EP_1_C0NFIG | MSK-EPEN); // сброс
usb_reset_endpoint(1);
// разрешение прерываний от конечной точки Usb_enable_ep_int(1);
usb_con?igure_endpoint(2, EP_2_C0NFIG | MSK-EPEN); usb_reset_endpoint(2); Usb_enable_ep_int(2);
13.5.4. Создание HI Обустройства
Теперь, когда понятно, как передавать дескрипторы и конфигурировать конечные точки, мы готовы к созданию HID-устройства (см. главу 8). Для этого необходимо выполнить следующие действия (минимальные требования к HID-устройству мы приводили в разд. 8.1):
? создать дескриптор репорта (см. разд. 8.5) либо вручную, либо с помощью одной из утилит (см. разд. 8.7);
Предыдущая << 1 .. 113 114 115 116 117 118 < 119 > 120 121 122 123 124 125 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100