Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Покритикуйте плиз HID report descriptor
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
Kitsok
Всем привет!

Имею намерение сотворить джойстик на максимальное количество осей и не менее максимальное количество кнопок. После долгих ломаний мозга выдумался вот такой репорт-дескриптор.
Код
char ReportDescriptor[70] = {
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x15, 0x00,                    // LOGICAL_MINIMUM (0)
    0x09, 0x04,                    // USAGE (Joystick)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x05, 0x01,                    //   USAGE_PAGE (Generic Desktop)
    0x09, 0x01,                    //   USAGE (Pointer)
    0xa1, 0x00,                    //   COLLECTION (Physical)
    0x09, 0x30,                    //     USAGE (X)
    0x09, 0x31,                    //     USAGE (Y)
    0x09, 0x32,                    //     USAGE (Z)
    0x09, 0x33,                    //     USAGE (Rx)
    0x09, 0x34,                    //     USAGE (Ry)
    0x09, 0x35,                    //     USAGE (Rz)
    0x09, 0x36,                    //     USAGE (Slider)
    0x09, 0x37,                    //     USAGE (Dial)
    0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
    0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
    0x75, 0x08,                    //     REPORT_SIZE (8)
    0x95, 0x08,                    //     REPORT_COUNT (8)
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)
    0xc0,                          //   END_COLLECTION
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x05, 0x09,                    //   USAGE_PAGE (Button)
    0x19, 0x01,                    //   USAGE_MINIMUM (Button 1)
    0x29, 0x3f,                    //   USAGE_MAXIMUM (Button 63)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x95, 0x3f,                    //   REPORT_COUNT (63)
    0x55, 0x00,                    //   UNIT_EXPONENT (0)
    0x65, 0x00,                    //   UNIT (None)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x81, 0x01,                    //   INPUT (Cnst,Ary,Abs)
    0xc0                           // END_COLLECTION
};


Покритикуйте, пожалуйста, что в нем не так. В целом устройство вроде как работает.
В дальнейшем планирую открыть еще один ендпоинт для передачи данных от хоста к девайсу.

Да, а вот еще вопрос на засыпку. А можно ли как-нибудь организовать джойстик с бОльшим количеством кнопок, чем 63? USAGE_MAXIMUM(Button63) и ... все... Как люди по 100 с лишним кнопок делают?

Спасибо!
Sirotinin
Я может чего недопонимаю, сам столько кнопок на джойстики не делал, но кто мешает поставить USAGE_MAXIMUM в 0x65 и выше... ведь целый байт дан. Допустим такой дескриптор для клавиатуры имеет в этом байте 101 клавишу и выше...
Kitsok
Цитата(Sirotinin @ Nov 16 2006, 05:10) *
Я может чего недопонимаю, сам столько кнопок на джойстики не делал, но кто мешает поставить USAGE_MAXIMUM в 0x65 и выше... ведь целый байт дан. Допустим такой дескриптор для клавиатуры имеет в этом байте 101 клавишу и выше...


Спасибо за ответ!

Дело в том, что я этот дескриптор ваял при помощи DT, а там максимум указан в 63 кнопки. Косность мышления не позволила попробовать вживую wink.gif Спасибо за идею!!
Kitsok
Цитата(Kitsok @ Nov 16 2006, 14:01) *
Цитата(Sirotinin @ Nov 16 2006, 05:10) *

Я может чего недопонимаю, сам столько кнопок на джойстики не делал, но кто мешает поставить USAGE_MAXIMUM в 0x65 и выше... ведь целый байт дан. Допустим такой дескриптор для клавиатуры имеет в этом байте 101 клавишу и выше...


Спасибо за ответ!

Дело в том, что я этот дескриптор ваял при помощи DT, а там максимум указан в 63 кнопки. Косность мышления не позволила попробовать вживую wink.gif Спасибо за идею!!


А вот не работает.

Т.е. устройство аттачится и определяется, но виндовый драйвер не может разобрать, че там приходит.
Кроме этого, в моем W2K при отключении происходит радостный BSOD smile.gif Так что, похоже винда больше 63 кнопок в одном репорте все-таки не может обработать.
Pyku_He_oTTyda
http://www.mindaugas.com/projects/MJoy/
посмотрите здесь

http://www.mindaugas.com/projects/MJoy/
посмотрите здесь
Kitsok
Цитата(Pyku_He_oTTyda @ Nov 20 2006, 07:37) *
http://www.mindaugas.com/projects/MJoy/
посмотрите здесь

http://www.mindaugas.com/projects/MJoy/
посмотрите здесь


wink.gif Смотрел wink.gif
Нужный мне репорт-дескриптор находится в MJoy-16 C1, а исходников сего чуда нету wink.gif
Т.е. в прошивке его я, конечно, подклядывал, но там три разных репорта с разными ID. Плюс у Миндога ограничение на макс. 8 байт в пакете, а у меня - 64. Но, видно, не получится в одном пакете больше 63 кнопок передать.
AndrV
а HID Descriptor Tool, Вам не пригодиться?

http://www.usb.org/developers/hidpage/dt2_4.zip
Kitsok
Цитата(AndrV @ Nov 21 2006, 01:18) *
а HID Descriptor Tool, Вам не пригодиться?


Спасибо за ссылку, но им я и делал свой репорт дескриптор wink.gif И именно в нем нету больше, чем Button63 smile.gif
Попытался искать что-нибудь схожее по функционалу, но не нашел.
Kitsok
Не знаю, может кому пригодится wink.gif
Код
const portCHAR pxReportDescriptor[] = {
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x15, 0x00,                    // LOGICAL_MINIMUM (0)
    0x09, 0x04,                    // USAGE (Joystick)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x05, 0x01,                    //   USAGE_PAGE (Generic Desktop)
    0x09, 0x01,                    //   USAGE (Pointer)
    0xa1, 0x00,                    //   COLLECTION (Physical)
    0x09, 0x30,                    //     USAGE (X)
    0x09, 0x31,                    //     USAGE (Y)
    0x09, 0x32,                    //     USAGE (Z)
    0x09, 0x33,                    //     USAGE (Rx)
    0x09, 0x34,                    //     USAGE (Ry)
    0x09, 0x35,                    //     USAGE (Rz)
    0x09, 0x36,                    //     USAGE (Slider)
    0x09, 0x37,                    //     USAGE (Dial)
    0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
    0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
    0x75, 0x08,                    //     REPORT_SIZE (8)
    0x95, 0x08,                    //     REPORT_COUNT (8)
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)
    0xc0,                          //   END_COLLECTION
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x05, 0x09,                    //   USAGE_PAGE (Button)
    0x19, 0x01,                    //   USAGE_MINIMUM (Button 1)
    0x29, 0x3F,                    //   USAGE_MAXIMUM (Button 63)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x95, 0x3F,                    //   REPORT_COUNT (63)
    0x55, 0x00,                    //   UNIT_EXPONENT (0)
    0x65, 0x00,                    //   UNIT (None)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x05, 0x09,                    //   USAGE_PAGE (Button)
    0x19, 0x40,                    //   USAGE_MINIMUM (Button 64)
    0x29, 0x7E,                    //   USAGE_MAXIMUM (Button 127)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x95, 0x3F,                    //   REPORT_COUNT (63)
    0x55, 0x00,                    //   UNIT_EXPONENT (0)
    0x65, 0x00,                    //   UNIT (None)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x95, 0x02,                    //   REPORT_COUNT(2)
    0x75, 0x01,                    //   REPORT_SIZE(1)
    0x81, 0x01,                    //   INPUT (Cnst,Arr,Abs)
    0xc0                           // END_COLLECTION
};


Итого - 126 кнопок.
При попытке сделать в одной хм... пачке больше 63 кнопок, происходит BSOD.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.