|
hid-report, Alphаnumeric Display |
|
|
|
Jan 2 2008, 15:14
|
Частый гость
 
Группа: Свой
Сообщений: 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 пытаюсь разобраться...
|
|
|
|
|
 |
Ответов
|
Jan 4 2008, 12:04
|
Частый гость
 
Группа: Свой
Сообщений: 126
Регистрация: 1-09-07
Из: Винница
Пользователь №: 30 222

|
Пока составил репорт только с одной INPUT и одной OUTPUT, чтоб попробовать получше разобраться: Код BYTE __flash ReportDescriptor_HID[] = { 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined Page 1) 0x09, 0x01, // Usage (Vendor Usage 1) 0xa1, 0x01, // Collection (Application) 0x15, 0x00, // Logical Minimum (0) 0x26, 0xFF, 0x00, // Logical Maximum (255) 0x75, 0x08, // Report Size (8) 0x95, 0x01, // Report Count (1) 0x09, 0x01, // Usage (Vendor Usage 1) 0x81, 0x02, // Input (Data, Variable, Absolute, Bit Field) 0x09, 0x02, // Usage (Vendor Usage 2) 0x91, 0x02, // Output (Data, Variable, Absolute, Bit Field) 0xc0 // End Collection }; Также сделал вот такой дескриптор конфигурации, использую конечную точку EP1: Код // Configuration descriptor USB_CONFIG_DATA __flash ConfigurationDescriptor_HID = { { // configuration descriptor sizeof(USB_CONFIGURATION_DESCRIPTOR), // bLength TYPE_CONFIGURATION_DESCRIPTOR, // bDescriptorType sizeof(USB_CONFIG_DATA), // wTotalLength 1, // bNumInterfaces 1, // bConfigurationValue 0, // iConfiguration String Index 0xA0, // bmAttributes Bus Powered, Remote Wakeup 0x32 // bMaxPower, 100mA }, { // interface descriptor sizeof(USB_INTERFACE_DESCRIPTOR), // bLength TYPE_INTERFACE_DESCRIPTOR, // bDescriptorType 0, // bInterface Number 0, // bAlternateSetting 2, // bNumEndpoints 3, // bInterfaceClass (HID class) 0, // bInterfaceSubClass(Boot subclass) 0, // bInterfaceProtocol 2 // iInterface String Index }, { // HID descriptor sizeof(USB_HID_DESCRIPTOR), // bLength TYPE_HID_DESCRIPTOR, // bDescriptorType 0x0100, // wHIDClassSpecComp 0, // bCountry 1, // bNumDescriptors 0x22, // b1stDescType (Report) sizeof(ReportDescriptor_HID) // w1stDescLength }, { // endpoint descriptor sizeof(USB_ENDPOINT_DESCRIPTOR), // bLength TYPE_ENDPOINT_DESCRIPTOR, // bDescriptorType 0x81, // bEndpoint Address EP1 IN 0x03, // bmAttributes - Interrupt 0x0008, // wMaxPacketSize 0x0A // bInterval (10 ms) }, { // endpoint descriptor sizeof(USB_ENDPOINT_DESCRIPTOR), // bLength TYPE_ENDPOINT_DESCRIPTOR, // bDescriptorType 0x01, // bEndpoint Address EP1 OUT 0x03, // bmAttributes - Interrupt 0x0008, // wMaxPacketSize 0x0A // bInterval (10 ms) } }; Вот эта часть кода находится в главном цикле: Код if (Irq & D11_INT_EP1_IN){ D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP1_IN, Buffer, 1); //debug('b'); } if (1) { // заполнить информационные данные Buffer[0] = temp; hid_bufsize = 1;
// отправить буфер D11WriteEndpoint(D11_ENDPOINT_EP1_IN, Buffer, hid_bufsize); }
if (Irq & D11_INT_EP1_OUT) { D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP1_OUT, Buffer, 1); if (1) { D11ReadEndpoint(D11_ENDPOINT_EP1_OUT, &Buffer[0]); temp = 2;//Buffer[0]; } debug('c'); debug('c'); } По идее, при вызове WriteFile с пользовательского приложения, должно генерироваться D11_INT_EP1_OUT, но этого не происходит (debug- отладка по UART). Сам исходник для отправки/приема данных взял с книги "Агуров Интерфейс USB Практика использования и программирования", исходник на Делфи, добавил туда WriteFile. При вызове WriteFile возвращается ошибка, при ReadFile все корректно читается с устройства. В чем может быть проблема при записи? Исходник прикрепил, посмотрите плз.
HID.rar ( 220.98 килобайт )
Кол-во скачиваний: 182
|
|
|
|
Сообщений в этой теме
_lukash_ hid-report Jan 2 2008, 15:14 _lukash_ Хех, разобрался вроде с записью.
Я не правильно бу... Jan 4 2008, 14:23 _lukash_ Разобрался как строится hid-report, и почему там т... Jan 10 2008, 21:01 arizona Цитата(_lukash_ @ Jan 11 2008, 00:01) Раз... Jan 16 2008, 10:38 _lukash_ arizona
Спасибо, понял. Переделал - теперь работае... Jan 16 2008, 21:12 galjoen Цитата(_lukash_ @ Jan 17 2008, 00:12) Вот... Jan 17 2008, 16:50 _lukash_ galjoen
Спасибо. Jan 17 2008, 21:54 _lukash_ Еще вопрос - есть ли какие-то программки для тести... Jan 20 2008, 11:09 galjoen Цитата(_lukash_ @ Jan 20 2008, 14:09) Еще... Jan 21 2008, 17:10 _lukash_ С usb.org испробовал все кроме той которая больше ... Jan 21 2008, 22:24 galjoen Цитата(_lukash_ @ Jan 22 2008, 01:24) С u... Jan 23 2008, 14:38 _lukash_ ОК, попробую где-то найти корректно работающее USB... Jan 24 2008, 13:08
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|