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

Итак, имеет место быть HID-джойстик. У него два ендпоинта - Control и Interrupt IN.
Енумерация, понятно, идет по Control. А вот что касается работы, то тот пример, который я использую в качестве базового (из FreeRTOS под SAM7S) при получении прерывания от контроллера USB, делает так:
Код
if( xQueueReceive( xUSBInterruptQueue, &pxMessage, usbSHORT_DELAY ) )
      {
       if( pxMessage->ulISR & AT91C_UDP_EPINT0 )
    {
     /* Process end point 0 interrupt. */
     prvProcessEndPoint0Interrupt( pxMessage );
    }

       if( pxMessage->ulISR & AT91C_UDP_ENDBUSRES )
    {
     /* Process an end of bus reset interrupt. */
     prvResetEndPoints();        
    }
      }
     else
      {
       /* The ISR did not post any data for us to process on the queue, so
      just generate and send some sample data. */
       if( eDriverState == eREADY_TO_SEND )
    {
     prvTransmitSampleValues();
    }
      }


Т.е. асинхронно, по мере возникновения времени на задачу и свободности контроллера, просто шлет репорт с данными через EP1.

Мне это кажется неправильным. По-моему, надо получить GET_REPORT, и в ответ слать уже данные репорта. (прав ли я?)

Но тут просто клинч какой-то. Если бы была только одна точка (EP0), то все понятно - по ней получили GET_REPORT, через нее и отправили. А в случае, если есть специально выделенная Interrupt IN, где GET_REPORT приходит? Или он вообще не приходит и просто Interrupt IN прилетает на EP1?
Направьте пожалуйста, запутался.

Заранее спасибо!
Kitsok
Цитата(Kitsok @ Dec 6 2006, 14:04) *
Направьте пожалуйста, запутался.


wink.gif С этим распутался. Теперь новая мулька.

Хочу иметь Input, Output и Feature репорты. Понятно, что Input и Output будут разбросаны по соответсвующим пайпам (Interrupt IN, Interrupt OUT), надеюсь, что Feature будет бегать по Control Pipe.

Соответственно, в репорт-дескрипторе вписываю Feature точно таким-же образом как и Output:
Код
    HID_LOCAL_USAGE+1,0xff,
    HID_GLOBAL_LOGICAL_MINIMUM+1, (unsigned char) -128,
    HID_GLOBAL_LOGICAL_MAXIMUM+1, (unsigned char) 127,
    HID_GLOBAL_REPORT_COUNT+1,0x40,
    HID_GLOBAL_REPORT_SIZE+1,0x08,
    HID_MAIN_OUTPUT+1,0x00,

    HID_LOCAL_USAGE+1,0xff,
    HID_GLOBAL_LOGICAL_MINIMUM+1, (unsigned char) -128,
    HID_GLOBAL_LOGICAL_MAXIMUM+1, (unsigned char) 127,
    HID_GLOBAL_REPORT_COUNT+1,0x08,
    HID_GLOBAL_REPORT_SIZE+1,0x08,
    HID_MAIN_FEATURE+1,0x00,


Винда устройство определяет, ошибок никаких не выдает, но и запросов на Interrupt IN на Interrupt IN endpoint не выдает.
Т.е. имеется в системе джойстик, но все оси у него в нейтрали, и все кнопки неактивны. При этом через WriteFile output-репорты проходят как и задумано.
Удаляем описание Feature-репорта - джойстиковая часть начинает работать.
Я поставил брейки на STALL, но STALL вызывается только один раз на SET_IDLE. В остальном обмен во время енумерации различается только размером передаваемого репорт-дескриптора, ну и самим дескриптором.

Чего этому виндовому драйверу не хватает для полного счастья? Да, винда - XP SP2.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.