реклама на сайте
подробности

 
 
> hid-report, Alphаnumeric Display
_lukash_
сообщение Jan 2 2008, 15:14
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 1-09-07
Из: Винница
Пользователь №: 30 222



Всем привет!

Разбираюсь с USB HID (по usb.org и книге "Агуров Интерфейс USB Практика использования и программирования"), уже почти все понял, проблема ток с hid-report'ом...
Создаю Alphanumeric Display report (0х14), но не понимаю значение некоторых элементов репорта. В частности - объясните плз для чего нужны USAGE - и почему их так много в репорте? Т.е. я должен создать USAGE на каждую используемую функцию из спецификации HID Usage Tables?

Составляю дескриптор репорта с помощью HID descriptor Tool, там и пример для Alphanumeric Display есть, но ведь там USAGE не на все возможные функции прописаны:

Код
char ReportDescriptor[136] = {
    0x05, 0x14,                    // USAGE_PAGE (Alphnumeric Display)
    0x09, 0x01,                    // USAGE (Alphanumeric Display)
    0x15, 0x00,                    // LOGICAL_MINIMUM (0)
    0xa1, 0x02,                    // COLLECTION (Logical)
    0x09, 0x20,                    //   USAGE (Display Attributes Report)
    0xa1, 0x02,                    //   COLLECTION (Logical)
    0x09, 0x35,                    //     USAGE (Rows)
    0x09, 0x36,                    //     USAGE (Columns)
    0x09, 0x3d,                    //     USAGE (Character Width)
    0x09, 0x3e,                    //     USAGE (Character Height)
    0x85, 0x01,                    //     REPORT_ID (1)
    0x25, 0x1f,                    //     LOGICAL_MAXIMUM (31)
    0x75, 0x05,                    //     REPORT_SIZE (5)
    0x95, 0x04,                    //     REPORT_COUNT (4)
    0xb1, 0x03,                    //     FEATURE (Cnst,Var,Abs)
    0x75, 0x01,                    //     REPORT_SIZE (1)
    0x95, 0x03,                    //     REPORT_COUNT (3)
    0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)
    0x09, 0x21,                    //     USAGE (ASCII Character Set)
    0x09, 0x22,                    //     USAGE (Data Read Back)
    0x09, 0x29,                    //     USAGE (Vertical Scroll)
    0xb1, 0x03,                    //     FEATURE (Cnst,Var,Abs)
    0x95, 0x03,                    //     REPORT_COUNT (3)
    0xb1, 0x03,                    //     FEATURE (Cnst,Var,Abs)
    0xc0,                          //   END_COLLECTION
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x25, 0x02,                    //   LOGICAL_MAXIMUM (2)
    0x09, 0x2d,                    //   USAGE (Display Status)
    0xa1, 0x02,                    //   COLLECTION (Logical)
    0x09, 0x2e,                    //     USAGE (Stat Not Ready)
    0x09, 0x2f,                    //     USAGE (Stat Ready)
    0x09, 0x30,                    //     USAGE (Err Not a loadable character)
    0x81, 0x40,                    //     INPUT (Data,Ary,Abs,Null)
    0xc0,                          //   END_COLLECTION
    0x09, 0x32,                    //   USAGE (Cursor Position Report)
    0xa1, 0x02,                    //   COLLECTION (Logical)
    0x85, 0x02,                    //     REPORT_ID (2)
    0x75, 0x04,                    //     REPORT_SIZE (4)
    0x95, 0x01,                    //     REPORT_COUNT (1)
    0x25, 0x0f,                    //     LOGICAL_MAXIMUM (15)
    0x09, 0x34,                    //     USAGE (Column)
    0xb1, 0x22,                    //     FEATURE (Data,Var,Abs,NPrf)
    0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)
    0x09, 0x33,                    //     USAGE (Row)
    0xb1, 0x22,                    //     FEATURE (Data,Var,Abs,NPrf)
    0xc0,                          //   END_COLLECTION
    0x09, 0x2b,                    //   USAGE (Character Report)
    0xa1, 0x02,                    //   COLLECTION (Logical)
    0x85, 0x03,                    //     REPORT_ID (3)
    0x75, 0x08,                    //     REPORT_SIZE (8)
    0x95, 0x04,                    //     REPORT_COUNT (4)
    0x25, 0x7e,                    //     LOGICAL_MAXIMUM (126)
    0x09, 0x2c,                    //     USAGE (Display Data)
    0xb2, 0x02, 0x01,              //     FEATURE (Data,Var,Abs,Buf)
    0xc0,                          //   END_COLLECTION
    0x85, 0x04,                    //   REPORT_ID (4)
    0x09, 0x3b,                    //   USAGE (Font Report)
    0xa1, 0x02,                    //   COLLECTION (Logical)
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
    0x25, 0x7e,                    //     LOGICAL_MAXIMUM (126)
    0x75, 0x08,                    //     REPORT_SIZE (8)
    0x95, 0x01,                    //     REPORT_COUNT (1)
    0x09, 0x2c,                    //     USAGE (Display Data)
    0x91, 0x02,                    //     OUTPUT (Data,Var,Abs)
    0x95, 0x05,                    //     REPORT_COUNT (5)
    0x09, 0x3c,                    //     USAGE (Font Data)
    0x92, 0x02, 0x01,              //     OUTPUT (Data,Var,Abs,Buf)
    0xc0,                          //   END_COLLECTION
    0xc0                           // END_COLLECTION
};


И почему я не могу просто прописать в репорте одну INPUT, и одну OUTPUT (ессно с остальными обязательными элементами)? А в проге для компа просто записывать нужные команды?

Где еще можно почитать про составление hid-report, кроме как на usb.org , книге Агурова, USB masters? Поиск по форуму дает в основном эти ссылки, по ним я и разбирался с HID, сейчас опять по спецификациям из usb.org пытаюсь разобраться...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_lukash_
сообщение Jan 16 2008, 21:12
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 1-09-07
Из: Винница
Пользователь №: 30 222



arizona
Спасибо, понял. Переделал - теперь работает.

Вот что еще интересует - в спецификации HID Usage Tables не сказано какие типы передачи (FEATURE или через прерывания) нужно применять для определенных репортов. Я сделал все на FEATURE, вроде работает корректно, но правильно ли это?

По идее в примере использовались Interrupt посылки только потому, что передавался большой объем данных (в FEATURE посылках максимальный размер поля данных для низкоскоростного устройства (у меня низкоскоростное) не должен превышать 8 байт), но мне не нужно передавать больше 8 байт в одной посылке.

Т.е. я сам выбираю какие типы передачи использовать?
Go to the top of the page
 
+Quote Post
galjoen
сообщение Jan 17 2008, 16:50
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(_lukash_ @ Jan 17 2008, 00:12) *
Вот что еще интересует - в спецификации HID Usage Tables не сказано какие типы передачи (FEATURE или через прерывания) нужно применять для определенных репортов. Я сделал все на FEATURE, вроде работает корректно, но правильно ли это?

Делайте как удобнее. Я использую и то и другое в одном устройстве. FEATURE пользоваться сложнее. И со стороны компьютера, и со стороны устройства. Но этот метод более продвинутый.
FEATURE:
1. Обмен всегда начинается по инициативе компьютера.
2. FEATURE репортов м.б. 254 штуки (Interrupt-ов токо 2, по 1 в каждую сторону). Устойство, получив пакет SETUP, по Report ID (есть в SETUP-ном пакете) уже знает, что будет посылать (принимать).
3. Длина ограничена только размером буфера USB (у USB буфер на контрольный канал вроде-бы 4 кбайта). 8 байт у LowSpeed это размер пакета за кадр USB (1 мсек). А пакетов м.б. несколько. Токо не забывайте про DATA1/DATA0. (Как раз наоборот - у Interrupt токо 1 пакет м.б.).
Interrupt:
1. Interrupt In начинается по инициативе устройства. Interrupt Out - компьютера.
2. Буфера на несколько посылок (кол-во можно изменять) встроены в HID драйвер. Из-за этого данные не теряются даже если задача не активна. Но и проблема с синхронизацией ввода и вывода возникает. Если вам это надо конечно.
3. На компьютере простой readfile (+overlap чтоб не ждать).

По описанию FEATURE c 1 пакетом данных должен выполнятся за 3 мсек. SETUP=1мсек + DATA=1мсек + подтв. чтение/запись=1мсек. А если устойство пошлёт NAK, то след-й пакет от хоста д.б. через 1 мсек. Тоесть max скорость менее 64 кбайт в сек (1 пакет 64 байта в мсек на FullSpeed). Реально всё зависит от южного моста. Заметил, что интеловские чипсеты - соответствуют. А те, которые с АМД процессорами (в часности VIA) - нет. С VIA мой HID - 600 кбайт в секунду качает (Full Speed)! Почти как MassStorage (1000). Жаль только, что рассчитывать на это нельзя. Неизвестно, что у пользователя будет.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.02603 секунд с 7
ELECTRONIX ©2004-2016