Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
27.06.2010, 00:51
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
USB HID report descriptor
В общем, не могу разобраться, как писать report descriptor'ы для устройств ввода. За основу взял статью с сайта http://www.helmpcb.com/Electronics/U...BJoystick.aspx
Сделал джойстик. Дескриптор делал в программе HID Descriptor Tool
Перенес в компилятор. Все заработало. Чужой дескриптор работает.
Пытался сделать свой. Простейший джойстик на двух осях, без кнопок и прочего. Ничего не выходит. Не понимаю принципа, как эти дескрипторы писать. Вроде 2х8 бит, кратно 8, условие выполняется. Что ему еще не нравится? Поясните принцип, кто в теме, пожалуйста.
Заранее благодарю за дельные советы.
Могу проект в протеусе приложить, кому интересно посмотреть на виртуальный джойстик.
|
|
|
|
27.06.2010, 02:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2003
Адрес: Москва
Сообщений: 2,529
Сказал спасибо: 737
Сказали Спасибо 1,927 раз(а) в 799 сообщении(ях)
|
Re: USB HID report descriptor
Вот мой дескриптор
Цитата:
|
0x05,0x01, // USAGE_PAGE (Generic Desktop)
0x15,0x00, // LOGICAL_MINIMUM (0)
0x09,0x04, // USAGE (Joystick)
0xa1,0x01, // COLLECTION (Application)
0x05,0x02, // USAGE_PAGE (Simulation Controls)
0x09,0xbb, // USAGE (Throttle)
0x15,0x81, // LOGICAL_MINIMUM (-127)
0x25,0x7f, // LOGICAL_MAXIMUM (127)
0x75,0x08, // REPORT_SIZE (
0x95,0x01, // REPORT_COUNT (1)
0x81,0x02, // INPUT (Data,Var,Abs)
0x05,0x01, // USAGE_PAGE (Generic Desktop)
0x09,0x01, // USAGE (Pointer)
0xa1,0x00, // COLLECTION (Physical)
0x09,0x30, // USAGE (X)
0x09,0x31, // USAGE (Y)
0x95,0x02, // REPORT_COUNT (2)
0x81,0x02, // INPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
0x05,0x09, // USAGE_PAGE (Button)
0x19,0x01, // USAGE_MINIMUM (Button 1)
0x29,0x04, // USAGE_MAXIMUM (Button 4)
0x15,0x00, // LOGICAL_MINIMUM (0)
0x25,0x01, // LOGICAL_MAXIMUM (1)
0x75,0x01, // REPORT_SIZE (1)
0x95,0x04, // REPORT_COUNT (4)
0x55,0x00, // UNIT_EXPONENT (0)
0x65,0x00, // UNIT (None)
0x81,0x02, // INPUT (Data,Var,Abs)
0x95,0x04, // REPORT_COUNT (4)
0x81,0x03, // INPUT (Cnst,Var,Abs)
0xc0, // END_COLLECTION
|
Два направления, скорость и 4 кнопки
Для твоего варианта... Вот как-то так
Цитата:
|
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)
0x95,0x02, // REPORT_COUNT (2)
0x81,0x02, // INPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
|
__________________
Опыт - это школа, в которой человек узнает, каким дураком он был раньше.
|
|
|
|
27.06.2010, 09:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: USB HID report descriptor
Сообщение от Easyrider83
|
проект в протеусе приложить
|
Выкладывайте, так проблему будет проще решить.
Особенно интересуют ReportDescriptor и дескриптор ендпоинта (насколько я помню, значение wMaxLength связано с данными, описанными в ReportDescriptor)
Последний раз редактировалось AJScorp; 27.06.2010 в 11:37.
|
|
|
Сказали "Спасибо" AJScorp
|
|
|
27.06.2010, 10:18
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: USB HID report descriptor
Дорогие господа, огромное спасибо за помощь. Хочу все таки понять принцип.
Цитата:
|
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)
0x95,0x02, ' REPORT_COUNT (2)
0x81,0x02, ' INPUT (Data,Var,Abs)
0xc0, ' END_COLLECTION
|
Не работает ((
Последний раз редактировалось Easyrider83; 27.06.2010 в 10:24.
|
|
|
|
27.06.2010, 11:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: USB HID report descriptor
Через пару часов проверю в железе
|
|
|
|
27.06.2010, 13:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: USB HID report descriptor
Сообщение от Easyrider83
|
Не работает ((
|
Не указан REPORT_SIZE - размер в битах для X и Y
Код:
|
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)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x02, // REPORT_COUNT (2)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
0xc0 // END_COLLECTION |
|
|
|
|
27.06.2010, 13:50
|
|
Прописка
Регистрация: 25.08.2007
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 57 раз(а) в 33 сообщении(ях)
|
Re: USB HID report descriptor
Сообщение от Easyrider83
|
Не работает ((
|
Уважаемый Easyrider83. У меня Ваша проект работает в Proteus 7.6 SP0. Скачал простейшую тестовую программу JoyTester2. Управление по каналам X, У и газ работает. Единственное, USB-устройство через некоторое время вываливается из системы, но, может быть, это проблема Proteus.
|
|
|
|
27.06.2010, 13:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: USB HID report descriptor
Дополнительно необходимо, чтобы количество данных передаваемых хосту точно соответствовало количеству, заявленному в ReportDescriptor, иначе устройство работать не будет.
Допустим, если взять дескриптор уважаемого DK:
Код:
|
0x05,0x01, // USAGE_PAGE (Generic Desktop)
0x15,0x00, // LOGICAL_MINIMUM (0)
0x09,0x04, // USAGE (Joystick)
0xa1,0x01, // COLLECTION (Application)
0x05,0x02, // USAGE_PAGE (Simulation Controls)
0x09,0xbb, // USAGE (Throttle)
0x15,0x81, // LOGICAL_MINIMUM (-127)
0x25,0x7f, // LOGICAL_MAXIMUM (127)
0x75,0x08, // REPORT_SIZE (8) -›Размер данных 8 бит
0x95,0x01, // REPORT_COUNT (1)
0x81,0x02, // INPUT (Data,Var,Abs) -›8 бит*1 = 1 байт
0x05,0x01, // USAGE_PAGE (Generic Desktop)
0x09,0x01, // USAGE (Pointer)
0xa1,0x00, // COLLECTION (Physical)
0x09,0x30, // USAGE (X)
0x09,0x31, // USAGE (Y)
0x95,0x02, // REPORT_COUNT (2)
0x81,0x02, // INPUT (Data,Var,Abs) -›8 бит*2 = 2 байта
0xc0, // END_COLLECTION
0x05,0x09, // USAGE_PAGE (Button)
0x19,0x01, // USAGE_MINIMUM (Button 1)
0x29,0x04, // USAGE_MAXIMUM (Button 4)
0x15,0x00, // LOGICAL_MINIMUM (0)
0x25,0x01, // LOGICAL_MAXIMUM (1)
0x75,0x01, // REPORT_SIZE (1) -›Размер данных 1 бит
0x95,0x04, // REPORT_COUNT (4)
0x55,0x00, // UNIT_EXPONENT (0)
0x65,0x00, // UNIT (None)
0x81,0x02, // INPUT (Data,Var,Abs) -›1 бит*4 = 0.5 байта
0x95,0x04, // REPORT_COUNT (4)
0x81,0x03, // INPUT (Cnst,Var,Abs) -›1 бит*4 = 0.5 байта
0xc0, // END_COLLECTION |
то выдать хосту мы должны ровно 4 байта
Цитата:
|
joystik.mbas:
while(HID_Write(@writebuff,4) = 0) wend
|
Последний раз редактировалось AJScorp; 27.06.2010 в 14:06.
|
|
|
|
27.06.2010, 14:37
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2003
Адрес: Москва
Сообщений: 2,529
Сказал спасибо: 737
Сказали Спасибо 1,927 раз(а) в 799 сообщении(ях)
|
Re: USB HID report descriptor
Сообщение от AJScorp
|
то выдать хосту мы должны ровно 4 байта
|
и в программе длину самого дескриптора точно посчитать надо.
У меня с дескриптором проблем не возникло... И протеусе все работало. А в реале - нет Спасибо Urry, помог с линкером справиться.
__________________
Опыт - это школа, в которой человек узнает, каким дураком он был раньше.
|
|
|
|
27.06.2010, 17:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: USB HID report descriptor
Сообщение от DK
|
и в программе длину самого дескриптора точно посчитать надо.
|
Согласен!
для MPLAB Cxx объявлял так
Код:
|
const char ReportDescriptor[] =
{
...
};
#define REPT_DESC_SIZE sizeof(ReportDescriptor) |
и проблем не было
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:54.
|
|