Итак, имеет место быть 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();
}
}
{
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?
Направьте пожалуйста, запутался.
Заранее спасибо!